Brauche hilfe bei Programmierung in C (Nullstellenberechnung)!

Evilman64

Well-known member
ID: 185632
L
24 April 2006
228
10
Habe folgenden Code, aber es wird mir immer eine Fehlermeldung angezeigt.
Das Programm soll Nullstellen berechnen können.
Was nache ich falsch?
Danke schonmal...

#include<stdio.h>
#include<math.h>

int main()
{
int i,y,y1,y2,y0,x1,x2,x3,x4,x0,x,a,b,c;

printf("Programm zur Nullstellenbestimmung von Funktionen der Form ax^2+bx+c\n\n");
printf("Bitte a, b und c eingeben.\n");
printf("a=");
scanf("%d",&a);
printf("b=");
scanf("%d",&b);
printf("c=");
scanf("%d",&c);

if (c>0) {
y=c;
x=0;
while(y>0);
{
y=(a*(x*x)+b*x+c);
x++;
}
x2=--x;
x1=--x;
printf("(x1|y1) => (%d|%d)\n",x1,y=(a*x1*x1+b*x1+c));
printf("(x2|y2) => (%d|%d)\n\n\n",x2,(y=a*x2*x2+b*x2+c));


y=c;
x=0;
while(y>0);
{
y=(a*(x*x)+b*x+c);
x--;
}
x4=++x;
x3=++x;
printf("(x3|y3) => (%d|%d)\n",x3,y=(a*x3*x3+b*x3+c));
printf("(x4|y4) => (%d|%d)\n\n\n",x4,(y=a*x4*x4+b*x4+c));
}
getch();
return 0;
}
 
Dein Programm berechnet nicht, es probiert aus ;)

while (y>0) {..} ist insofern saugefährlich weil zB jede positive Parabel mit positivem "c" (probiere simpelst: x²+x+1, Variablen alle auf 1) gar keine nullstellen hat - und du in einer Endlosschleife landest.

um auszuprobieren ob abseits von den oben genannten Ansätzen der Code richtig ist, empfehle ich dir folgende Standardwerte: a=1, b=0, c=-1. Damit solltest du auf (-1|0) und (1|0) deine Nullstellen bekommen. Allerdings solltest du dafür die Zeile "if (c > 0) {...}" überdenken - damit schließt du nämlich zur Zeit quasi alle Möglichkeiten aus um einfache Funktionen mit Nullstellen eingeben zu können.

Dein Ansatz mit x1 und x2 funktioniert, schaut aber umständlich aus. y hattest du ja eh schon zugewiesen, damit könntest du das Ganze auch extrem vereinfachen:
PHP:
x=-1;  
while(y>0) {
   y_old=(a*(x*x)+b*x+c); //vorherigen Wert merken, y1=y geht nicht weil anfangs nicht initialisiert
   x++;
   y=(a*(x*x)+b*x+c); //neuen Wert ausrechnen
   if (y == 0) { //ausgeben
      printf("(x1|y1) => (%d|%d)\n", x-1, y_old);
      printf("(x2|y2) => (%d|%d)\n\n",x,y);
   }
}
entsprechend den unteren Teil für die negative Nullstelle, dann musst du dich nur noch um die Endlosschleife kümmern - und lass das Semikolon hinter der while-Anweisung weg, sonst funzts nämlich schonmal gar nicht weil der den Block nicht zuordnet :mrgreen:

Tipp wenn du es etwas strukturierter angehen willst:
such dir erst raus wieviele Nullstellen deine Parabel grad überhaupt hat (https://de.wikipedia.org/wiki/Quadratische_Gleichung):
Diskriminante D = b² - 4ac
:arrow: (D < 0) --> 2 Nullstellen
:arrow: (D = 0) --> 1 Nullstelle, x-Achse ist Tangente
:arrow: (D > 0) --> keine Nullstelle, brauchst gar net weitermachen.

Bis jetzt wars nur Grundsätzliches, mich hätte ja mal die Fehlermeldung interessiert die du bekommst, weil ich leider etwas außer Übung bin was das Hellsehen angeht ;)

Ich hab mich btw gefragt wozu du die Integer i, x0 und y0 gebrauchst, die sind nämlich bei dir im Code zwar definiert aber tauchen danach nie wieder auf.

Grüße
Hairman.

[edit] Asche auf mein Haupt, hab deinen Code falsch verstanden gehabt[/edit]
 
Zuletzt bearbeitet: