C Programm für Parabel



  • Was ich aber noch gerne wissen würde ist, warum steht bei

    for (x = 0; x <= 10; ++x)
    {
       y = x * x; // Funktionswert für y berechnen
       x = x - c;
       plot[y][x] = '*'; // im Koordinatensystem markieren
    }
    

    dass immer soweit links auf der Konsole?



  • #define ANZ_X 79
    #define ANZ_Y 25
    // und überall wo 79 steht schreibst du ab hier ANZ_X und bei 25 ANZ_Y
    ...
    char plot[ANZ_Y][ANZ_X+1];
    ...
    for (y=0;y<ANZ_Y;y++)
    { for(x=0;x<ANZ_X;x++)  
      {
        plot[y][x] = ' '; // Leerzeichen einstellen
      }
      plot[y][ANZ_X] = '\0'; // Damit es ein String wird
    }
    

    Das xi = (x-x_min) * ANZ_X /(x_max-x_min); musst du für jedes x natürlich neu berechnen (yi auch).

    // koordinatensystem
    for(x=x_min;x<x_max;x+=0.5) {
      y = 0;
      xi = (x-x_min) * ANZ_X /(x_max-x_min);
      yi = (y-y_min) * ANZ_Y /(y_max-y_min);
    
      if(xi >= 0 && xi < ANZ_X && yi >= 0 && yi < ANZ_Y) 
        plot[yi][xi] = '-';
    }
    for(y=y_min;y<y_max;y+=0.5) {
      x = 0;
      xi = (x-x_min) * ANZ_X /(x_max-x_min);
      yi = (y-y_min) * ANZ_Y /(y_max-y_min);
    
      if(xi >= 0 && xi < ANZ_X && yi >= 0 && yi < ANZ_Y) 
        plot[yi][xi] = '|';
    }
    // alle Funktionswerte von y für x von x_min bis x_max zeichnen
    for(x=x_min;x<x_max;x+=0.5) {
      y = a*x*x + b*x + c;
      xi = (x-x_min) * ANZ_X /(x_max-x_min);
      yi = (y-y_min) * ANZ_Y /(y_max-y_min);
    
      if(xi >= 0 && xi < ANZ_X && yi >= 0 && yi < ANZ_Y) 
        plot[yi][xi] = '*';
    }
    

    Ich hoffe es funktioniert.



  • Naja, nicht ganz.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
    
    #define ANZ_X 79
    #define ANZ_Y 25 
    double x_min = -10.0;
    double x_max = +10.0;
    double x;
    double xi;
    
    double y_min = -10.0;
    double y_max = +10.0;
    double y;
    double yi;
    
    char plot[ANZ_Y][ANZ_X+1]
    int p, f;
    double a, b, c;
    
    for (y=0;y<ANZ_Y;y++)
    { for(x=0;x<ANZ_X;x++)
      {
        plot[y][x] = ' '; // Leerzeichen einstellen
      }
      plot[y][ANZ_X] = '\0'; // Damit es ein String wird
    }
    
    // koordinatensystem
    for(x=x_min;x<x_max;x+=0.5) {
      y = 0;
      xi = (x-x_min) * ANZ_X /(x_max-x_min);
      yi = (y-y_min) * ANZ_Y /(y_max-y_min);
    
      if(xi >= 0 && xi < ANZ_X && yi >= 0 && yi < ANZ_Y)
        plot[yi][xi] = '-';
    }
    for(y=y_min;y<y_max;y+=0.5) {
      x = 0;
      xi = (x-x_min) * ANZ_X /(x_max-x_min);
      yi = (y-y_min) * ANZ_Y /(y_max-y_min);
    
      if(xi >= 0 && xi < ANZ_X && yi >= 0 && yi < ANZ_Y)
        plot[yi][xi] = '|';
    }
    // alle Funktionswerte von y für x von x_min bis x_max zeichnen
    for(x=x_min;x<x_max;x+=0.5) {
      y = a*x*x + b*x + c;
      xi = (x-x_min) * ANZ_X /(x_max-x_min);
      yi = (y-y_min) * ANZ_Y /(y_max-y_min);
    
      if(xi >= 0 && xi < ANZ_X && yi >= 0 && yi < ANZ_Y)
        plot[yi][xi] = '*';
    } 
    
    for (y=0;y<25;y++){
      puts(plot[y]);}
    
    getchar();
    return(EXIT_SUCCESS);
    }
    

    http://codepad.org/q4Mit2G3



  • Zeile 20 Syntaxfehler 🙄 ich bin so doof, dennoch
    kommen diese Kompilierfehler:

    graphi.c:30: error: array subscript is not an integer
    graphi.c:32: error: array subscript is not an integer
    graphi.c:44: error: array subscript is not an integer
    graphi.c:52: error: array subscript is not an integer
    graphi.c:61: error: array subscript is not an integer
    graphi.c:99: error: array subscript is not an integer



  • In function 'main':
    Line 27: error: array subscript is not an integer
    Line 29: error: array subscript is not an integer
    Line 40: error: array subscript is not an integer
    Line 48: error: array subscript is not an integer
    Line 57: error: array subscript is not an integer
    Line 61: error: array subscript is not an integer

    Das sind die richtigen Zeilen sorry.



  • Nimm mal xi und yi als index für plot. Das müssen int sein. 🙄

    int xi;
    int yi;
    ...
    
    for (yi=0;y<ANZ_Y;yi++)
    { for(xi=0;x<ANZ_X;xi++)
      {
        plot[yi][xi] = ' '; // Leerzeichen einstellen
      }
      plot[y][ANZ_X] = '\0'; // Damit es ein String wird
    }
    .....
    
    for (yi=0;yi<25;yi++){
      puts(plot[yi]);}
    


  • Auf meinem Rechner psiert nichts, außer eine sehr lange Ladezeit.
    Und so sieht es hier aus: http://codepad.org/jYBVA3m7



  • Was mich noch wundert ist: Wie man Das Ergebniss von 2 Double-Werten in einem Integer Speichern kann.

    xi = (x-x_min) * ANZ_X /(x_max-x_min);



  • Hier mal ein funktionierendes Beispiel. Du solltest aber unbedingt vergleichen, was du anders machst.

    http://codepad.org/xYs1uxB0



  • Meine x_skaliert Funktion ist offensichtlich fehlerhaft. Der Rest sollte aber wie die Ausgabe passen.



  • Ein Fehler ist beim befüllen:

    //for (yi=0;y<ANZ_Y;yi++) FEHLER da steht y< statt yi kleiner
      for (yi=0;yi<ANZ_Y;yi++) 
    { 
    //for(xi=0;x<ANZ_X;xi++)  dito
      for(xi=0;xi<ANZ_X;xi++)
      {
        plot[yi][xi] = ' '; // Leerzeichen einstellen
      }
      plot[yi][ANZ_X] = '\0'; // Damit es ein String wird
    }
    

    Hab ich auch nicht gleich gesehen



  • Also bei Pauls programm kommt ein "STATUS_ACCESS_VIOLATION" Fehler

    @Dirk.B das ist ja jetzt das Koordinatensystem oder?
    An welcher Stelle hast du denn geplant wo der Teil mit der Parabel hinkommen soll?



  • Der Quellcode von euren Programmen sehen mir ziemlich "Profimäßig" aus.

    Wenn es dir hilft @Paul, es wird jedenfalls bei mir einfach nur ein "Stackdump" erstellt
    und anschließend das Programm beendet, und das liegt an der funktion x_skaliert?



  • Nein, das ist der Teil der die Leerzeichen einsetzt. (Bei dir Zeile 26 - 31)

    Für die Parabel musst du noch a, b und c mit werten besetzen.
    Z.B.: a = 1.0; b = 0.0; c = -8.0;

    Die Parabel wird in den Zeilen 54 - 61 berechnet



  • Das Problem ist schon längst gefixt.

    int x_skaliert(int x, int min, int max)
    {
      int offset = min < 0 ? min : 0;	/* Offset verschiebt den Ursprung */
      x -= offset;				/* Betrag von offset addieren */ 
      min -= offset;
      max -= offset;
      x = (x - min) * (X_MAX-1) / (max - min);
      return x;
    }
    


  • 1. Dasselbe auch bei y_skaliert?
    2. Wow, danke für eure tolle Hilfe / Unterstützung und Arbeit 🙂 👍



  • Ich hab nun noch etwas dazugeschrieben für die Eingabe von a, b und c

    printf("\nGeben Sie a ein: ");
    scanf("%d\0", &a);
    printf("\nGeben Sie b ein: ");
    scanf("%d\0", &b);
    printf("\nGeben Sie c ein: ");
    scanf("%d\0", &c);
    


  • Nein y_skaliert ist so in Ordnung. Da wird kein Offset berechnet, weil mit der gegebenen Funktion kein negativer Funktionswert raus kommen kann.
    Allgemein ist mein Programm auf x² spezialisiert. Für eine Verallgemeinerung müsstest du die min- und max-Parameter für y_skaliert vorher richtig ermitteln und auch die Offset-Funktionalität von x_skaliert mit übernehmen. Momentan vereinfache ich die Wertwahl durch mein Wissen, dass keine negativen Werte raus kommen können und die größten Funktionswerte bei x_min und x_max liegen müssen.
    Bis auf die Parameter für die Y-Skalierung ist es aber flexibel gestaltet und sollte auch mit anderen Funktionen funktionieren.



  • Danke für die Infos und die Unterstützung von euch.



  • Codepad findet doch noch Fehler ^^

    Line 16: error: unterminated comment
    In function 'main':
    Line 43: error: expected declaration or statement at end of input
    Line 43: error: expected declaration or statement at end of input


Anmelden zum Antworten