C Programm für Parabel



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

    Steht hier dann nicht theorethisch:

    xi = (1+10.0) * 1 / (+10.0+10.0) ?



  • Wenn du y = f(x) = ax2+bx+c hast dann schreibst du eine Schleife über x von -5 bis +5 und berechnest das y.

    double x,y,a,b,c;
    
    a=1;b=0;c=0; // Normalparabel
    
    for(x=x_min;x<x_max;x+=0.1) {
      y = a*x*x + b*x + c;
      cplot(x,y,'*'); // Zeichne an die Stelle x,y ein *
    }
    

    cplot() musst du selber schreiben.



  • Nicht nur theoretisch, sondern praktisch auch. Aber was willst du damit? Du willst doch den Wert von Y haben. Und der ist bei einer Parabel Y=X*X.
    Also um das ganz einfach auf dein Problem anzuwenden.

    // alle Funktionswerte von y für x von 0 bis 10 zeichnen
    for (x = 0; x <= 10; ++x)
    {
       y = x * x; // Funktionswert für y berechnen
       plot[y][x] = '*'; // im Koordinatensystem markieren
    }
    

    Aufpassen musst du hier, dass y und x nicht außerhalb der Dimensionen des Feldes liegen. In dem Fall musst du skalieren. Für negative Werte bietet es sich übrigens an das Koordinatensystem zu verschieben. So das der kleinste Wert wieder im Ursprung liegt.



  • Was ist denn cplot() ?
    Bei mir gibt die Funktion ein "Unable to resolve identifier..." aus.



  • ender schrieb:

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

    Steht hier dann nicht theorethisch:

    xi = (1+10.0) * 1 / (+10.0+10.0) ?

    ANZ_X ist aber 79. Darum

    xi = (1+10.0) * 79/ (+10.0+10.0) -> 11 * 79 / 20 = 43,45 -> 43

    Das -x_min verschiebt den Nullpunkt.
    Das ANZ_X /(x_max-x_min) skaliert das Ganze auf die 79 Zeichen in einer Zeile.

    cplot musst du selber schreiben (steht doch da)

    // Zeichne an die Stelle x,y das Zeichen c
    int cplot(double x, double y, char c)
    { int xi,yi;
    
      xi = siehe oben
      yi = wie bei xi
    
      Schauen ob xi und yi im gültigen Bereich sind
      - Ja: plot[yi][xi] = c; return 0;
      - Nein: return -1;
    }
    

    Dann machst du x_min, x_max, ... und plot[] erstmal global.



  • Du erwartest etwas viel von mir.
    So gut bin ich in C auchnicht das ich mich da so leicht reindenken kann.
    Bzw. in der Logik sogut.



  • Der Code ist grad ziemlich durcheinandergeraten. http://codepad.org/UemsQVjA



  • Das hat nichts mit C zu tun, dass sind einfach nur die mathematischen Zusammenhänge angewendet. Die solltest du vorher verstanden haben, bevor du dich an eine Lösung setzt. Deswegen rate ich dir, nimm dir ein Blatt Papier und zeichne den Graphen von Hand. Aus den Schritten kannst du dir dann einen Algorithmus selber ableiten. Um das ganze praxisgerecht zu gestalten, solltest du mit Werten arbeiten, die du skalieren musst. Es kann aber hilfreich sein erstmal ohne Skalierung zu arbeiten.



  • 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?


Anmelden zum Antworten