C Programm für Parabel
-
#include <stdio.h> int main() { int i = 5; printf("i = %d\n", i); }
-
Dieselbe schreibweise für das ploten? Also wenn ich das so eingebe:
plot[p][6] = ("%d", s); //Koordinatenzahlen
Kommt nur Datenmüll dabei raus, sowas wie
oder
...
-
Nein, schau dir an, was X und was Y ist. Schau es dir länger als nur ein paar Sekunden an, der Zusammenhang sollte offensichtlich sein. Hast du auch mal den codepad-Link angesehen?
Auf deinem Papier schreibst du doch auch nicht die Zahlen an eine Stelle im Koordinatensystem, sondern markierst die Punkte.plot
ist dein Koordinatensystem auf dem Papier. Die zwei eckigen Klammern geben dabei die Zeile und die Spalte auf dem Karo-Muster an.
-
ja, kla natürlich. Aber ich muss ja mit dem Plot nicht nur 2 Punkte machen, sondern die ganze Parabel.
-
Bei den Koordinatenzahlen solltest du aufpassen. "10" braucht schon mal 2 Felder, also kannst du nicht jede Zahl drucken. Außerdem willst du die Parabel ja nicht von 0 bis 24 zeichnen sondern von 0 bis + 100.0 (oder so).
Zum Umwandeln von Zahlen in Strings kannst du sprintf nehmen. sprintf erwartet als erstes Argument eine Adresse auf ein char.
char tmpstr[80]; sprintf(tmpstr,"%d",s); // String mit Zahl erzeugen memcpy(&plot[p][6],tmpstr,strlen(tmpstr)); // memcpy, damit die '\0' aus tempstr nicht mitgenommen wird
Du musst aufpassen, das du nicht über das Stringende schreibst
-
plot[y][x] = '*';
y ist der Funktionswert von x, oder anders ausgedrückt y=f(x)=ax²+bx+c
Ich weiß nicht wie ich das noch deutlicher formulieren soll? P.S. Der Stern ist einfach nur eine Markierung des Funtkionswertes im Koordinatensystem. So wie du auf dem Blatt ein Kreuz oder einen Punkt einzeichnest.
-
Ich würde schon lieber weiter zeichnen können als 24, nur leider ist das
Konsolenfenster nicht groß genug und man kann es auch nicht breiter ziehen.
-
Daran ist die Windows-Konsole schuld. Es gibt aber auch Ersatz-Konsolen wie Console2, die sind wesentlich flexibler. Falls du dein Programm aber mit dem Debugger aufrufst, könnte die Verwendung einer alternativen Konsole recht kompliziert werden.
-
Dann musst du skalieren (die Koordinaten umrechnen / Maßstab ändern).
#define ANZ_X 79 char plot[25][ANZ_X+1]; double x_min = -10.0; double x_max = +10.0; double x; int xi; xi = (x-x_min) * ANZ_X /(x_max-x_min);
Für y genauso.
ANZ_X gibt die Breite deines Plotfeldes an. Für Y wäre das dann 25.
Pass auf, das deine xi nicht größer als ANZ_X und kleiner als 0 werden.
-
Gott, ich stell mich blöd. Ich hab so das Gefühl als wäre das letzte mal
richtige Parabelnrechnen schon Jahre her. Also rein theorethisch y = (f(x) = y) ?
-
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.