C Programm für Parabel
-
Ich kann nicht so richtig nachvollziehen, dass dir das Schwierigkeiten bereitet. Wie der C-Code aussieht weißt du ja jetzt. Wie man eine Formel richtig in C umsetzt hat man dir auch gezeigt. Der Rest ist genau das selbe, was du sonst auch auf dem Papier machen würdest. Du hast doch schon mal selber Graphen in ein Koordinatensystem eingetragen?
Vielleicht hapert es aber auch nur am Verständnis für C-Strings oder Felder im Allgemeinen? Wenn ich mir deine Zeile 21 ansehe, scheinst du den Zusammenhang wirklich nicht verstanden zu haben. Schau dir noch mal den Post (15:17:35 18.01.2011) von DirkB genauer an. Besonders die Dimensionen des Arrays, bzw. deines Koordinatensystems. Vielleicht führst du den Code auch einfach mal aus, wenn du es dir nicht vorstellen kannst.
-
Ja schon, aber dennoch weiß ich nicht wie man einen Inhalt von einem Integer ploten lässt. muss man dabei 's' schreiben oder '%d', s;
Habe ja danach auch schon gegoogelt, aber dabei rausgekommen ist nur Müll.
-
Muss ich 'x' dann eigentlich auch deklarieren?, weil das Programm kann
ja 'x' nicht auflösen.
-
#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