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); }
-
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 integerDas 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.
-
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?