C Aufgabe
-
Hi,
ich soll für die Schule ein Programm schreiben das nach der eingabe von den Koefizienten abcd, f(x)=a * x3 + b * x2 + c * x + d ausserdem die erste und zweite Ableitung berechnet und in einem 2d Array als Koordinatenkreuz ausgibt.
So weit bin ich erstmal gekommen:#include<stdio.h> #define xWidth 22 #define yWidth 76 void koor_erstellung() { int q,w; char bild[xWidth][yWidth]; for ( w=0; w<yWidth; ++w ) { for ( q=0; q<xWidth; ++q ) { bild[w][q] = ' '; } } } int main(){ koor_erstellung(); //____________________________________________________EINGABE__________________ int t,z=3; double koeff[4],a,b,c,d; for(t=0;t<4;t++) { printf("Koeffizienten für x^%d eingeben:",t); scanf("%lf",&koeff[t]); z=z-1; } a=koeff[0]; b=koeff[1]; c=koeff[2]; d=koeff[3]; //-------------------------------------------------------------------------------- int x,u,fx,fx1,fx2; for(x=0;x<76;x++) { fx=a*x*x*x+b*x*x+c*x+d; fx1=(3*a)*x*x+(2*b)*x+c; fx2=(6*a)*x+(2*b); bild[x][fx]='*'; bild[x][fx1]='+'; bild[x][fx2]='#'; } //______________________________________Ausgabe_____________________ for(t=21;t>=0;t--) { for(u=0;u<76;u++) { printf("%c",bild[t][u]); } } //------------------------------------------------------------------- return 0; }
Der Compiler zeigt bei bild[x][fx]='*'; einen Fehler an (bild undeclared).
Ausserdem muss ich die Achsen beschrifften was ich bisher nicht hinbekommen habemfg
-
bild[][] ist bisher nur lokal in der Fkt. koor_erstellung() deklariert und in main() nicht bekannt (Das will dir der Compiler damit sagen). Was du machen musst ist
- bild[][] global anlegen, dann kann main() sowie alle Fkt. darauf zugreifen, oder
- schöner wäre es wenn du bild[][] in main() deklarierst und allen Funktionen einen Zeiger auf bild[][] übergibst. Dazu gibt's hier aktuell (iirc) ein paar Beiträge.
PS: Es gibt extra
Tags. Die machen den Code schöner und das Lesen einfacher.
PPS: Deine #define solltest du auch konsequent anwenden, sonst bringen die nix.
-
und bemueh dich bitte um eine saubere einrueckung. genau durch dieses unformatierte hinkrakeln kommen schachtelungsfehler und was nicht alles ins programm.
-
bild[][] ist bisher nur lokal in der Fkt. koor_erstellung() deklariert und in main() nicht bekannt (Das will dir der Compiler damit sagen).
Ist es nicht so das ein Array gleichzeitig ein Pointer ist?
Das hatte ich angenommen.- schöner wäre es wenn du bild[][] in main() deklarierst und allen Funktionen einen Zeiger auf bild[][] übergibst. Dazu gibt's hier aktuell (iirc) ein paar Beiträge.
(iirc) ?
PPS: Deine #define solltest du auch konsequent anwenden, sonst bringen die nix.
Bin noch nicht so weit wollte das Programm erstmal zum laufen bringen
-
für die axenbeschriftung könntest du einfach "bild[x][y] = '|'" und "bild[x][y] = '-'" verwenden (am anfang einbinden), für die enden '^' und '>' verwenden
-
blizzarac schrieb:
bild[][] ist bisher nur lokal in der Fkt. koor_erstellung() deklariert und in main() nicht bekannt (Das will dir der Compiler damit sagen).
Ist es nicht so das ein Array gleichzeitig ein Pointer ist?
Das hatte ich angenommen.Das stimmt zwar (in etwa), ist aber hier egal, weil bild[][] trotzdem nur in der Funktion koor_erstellung() deklariert ist, und somit eben auch nur innerhalb dieser Funktion gültig ist.
iirc heisst: if i recall correctly, auf deutsch: wenn ich mich recht erinnere.
Zu arrays und pointern: http://www.eskimo.com/~scs/C-faq/s6.html
-
- schöner wäre es wenn du bild[][] in main() deklarierst und allen Funktionen einen Zeiger auf bild[][] übergibst.
Ich kriege es einfach nicht hin könntest du mir zeigen wie man es macht
-
Wie wäre es, wenn du erstmal die einfachere Variante mit dem globalen Array probierst und deine anderen Fehler (ich hatte z.B. einen schönen Segfault) rausmachst? Das fände ich sinnvoller.
-
Drei kleine Punkte, die mir beim ersten Überfliegen aufgefallen sind:
* die Schleife "for(x=0;x<76;x++){...;bild[x][fx]='*';...}" schreibt deutlich über die Array-Grenze hinaus.
* nochmal zur selben Schleife: hier solltest du auch abfangen, ob deine Funktionswerte im Intervall [0,yWidth[ liegen.
-
Ja stimmt hab ich geändert
* die Schleife "for(x=0;x<76;x++){...;bild[x][fx]='*';...}" schreibt deutlich über die Array-Grenze hinaus.
Ist das ein Syntax fehler? Wenn nicht macht das nichts da ich nur den Bereich
21/75 ausgeben muss, was garüber ist wäre egal* nochmal zur selben Schleife: hier solltest du auch abfangen, ob deine Funktionswerte im Intervall [0,yWidth[ liegen.
Versteh ich nicht ganz, wieso sollte ich das abfangen?
Mein koordinatenkreuz soll von [0;0] bis [75;21] gehen
-
blizzarac schrieb:
* die Schleife "for(x=0;x<76;x++){...;bild[x][fx]='*';...}" schreibt deutlich über die Array-Grenze hinaus.
Ist das ein Syntax fehler? Wenn nicht macht das nichts da ich nur den Bereich
21/75 ausgeben muss, was garüber ist wäre egalSyntax-Fehler nicht unbedingt (sonst würde sich dein Compiler schon beschweren), aber logischer Fehler - der Pointer (z.B.) bild[76][76] zeigt in einen Bereich, der nicht unbedingt zu deinem Array gehört - d.h. für den Compiler/Prozessor galt dieser Bereich als "frei" und er hat dort möglicherweise andere Daten untergebracht. Wenn du jetzt dort etwas hinschreibst, erwischst du im mit viel Glück tatsächlich unbelegten Speicher (dann passiert gar nichts), aber wahrscheinlicher ist es, daß du damit Daten überschreibst, die woanders noch benötigt wurden.
-
Und wie fange ich das ab?
-
In x-Richtung, indem du als Obergrenze deiner for()-Schleife das vordefinierte xWidth verwendest.
In y-Richtung durch einen Bereichstest:if(fx>=0&&fx<=yWidth) bild[x][fx]='*';
(analog für die Ableitungswerte)