Anfängerproblem



  • Hi,
    Ich bin neu in der C Programmierwelt und bis jetzt gefällt es mir sehr gut 🙂
    Doch leider habe ich ein Problem das ich nicht lösen kann. Ich wollte ein Programm schreiben, das Gleichungen 2. grades lösen kann.

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main(int argc, char *argv[])
    {
    
      float a;
      float b;
      float c;
    
      printf("Programm zur Berechnung einer Gleichung 2. grades\nin der form 'ax^2 + bx + c = 0'\n");
      printf("Geben Sie die Zahlen bei a, b und c ein\n");
      printf("Die Zahl a: ");
      scanf("&f",&a);
      printf("Jetzt b: ");
      fflush(stdin);
      scanf("%f",&b);
      printf("Und c: ");
      fflush(stdin);
      scanf("%f",&c);
    
      double w;
      double x1;
      double x2;
      double z = ((b*b) - (4*a*c));
      w = sqrt(z);
      x1 = ((-b + w)/(2*a));
      x2 = ((-b - w)/(2*a));
    
      printf("Die loesungen sind: %lf\n", x1);
      printf("Und %lf\n", x2);
    
      system("PAUSE");	
      return 0;
    }
    

    Ich habe die Formel aufgeteilt: zuerst der Teil der unter die Wurzel kommt und dann der Rest.
    Wenn ich das Programm ausführe, kommt beim Resultat immer -1.#INDOO, egal was ich eingebe.
    Ich verstehe einfach nicht, was ich falsch gemacht habe.
    Vielen Dank für eure Antworten.



  • scanf("&f",&a);
    

    Vertippt, oder? 😉

    Ich habe den Teil mit der Eingabe so umgeschrieben, dass ich die Zahlen in einem Zug eingebe:

    printf("Die Zahlen a b und c: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    

    Und bei mir scheint alles korrekt zu laufen. Kann es sein, dass du einfach mit Parabeln ohne Nullstellen getestet hast?



  • fflush(stdin) ist undefiniertes Verhalten und somit Schrott.
    Wo holt ihr Anfänger bloß immer so einen Müll her.



  • Vor allem hats bei mir überhaupt nicht das bewirkt, wofür es (wahrscheinlich) gedacht war...



  • D-U-D-E schrieb:

    scanf("&f",&a);
    

    Vertippt, oder? 😉

    Ich habe den Teil mit der Eingabe so umgeschrieben, dass ich die Zahlen in einem Zug eingebe:

    printf("Die Zahlen a b und c: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    

    Und bei mir scheint alles korrekt zu laufen. Kann es sein, dass du einfach mit Parabeln ohne Nullstellen getestet hast?

    Vielen Dank, hab das "%f" bei scanf korrigiert und jetzt gehts 😃
    Und dieses fflush(stdin) hab ich in so 'nem Tutorial gelesen, es soll scanf zurücksetzen sodass es keine probleme gibt oder so...
    Für was braucht man denn fflush(stdin)?



  • Wenn du auf Fehlersuche gehst, dann ist es erstmal das einfachste, du druckst dir die Werte aus. Z.B.:
    a, b, c nach der Eingabe
    z nach der Berechnung, vor der Wurzel.
    und w.

    Verzichte auf float, nimm double.*

    Bei scanf heißt das dann "%lf"
    Bei printf jedoch "%f" da auch die float in double umgecastet werden.
    Genaugenommen ist "%lf" bei printf undefiniert.

    *float braucht weniger Speicherplatz, das war früher wichtig wenn man große Felder hatte. Heute spielt es keine Rolle mehr.



  • Lstendardo schrieb:

    Für was braucht man denn fflush(stdin)?

    Ich glaub meistens wirds benutzt, um bei mehreren scanf hintereinander das Eingabezeichen aus stdin wegzubekommen, weil sonst das darauffolgende scanf "übersprungen" wird.
    Ist aber nicht standardkonform, Verhalten vollkommen undefiniert, kann auf 2 verschiedenen Compilern ganz unterschiedliche Sachen bewirken also lieber bleiben lassen 😉



  • Dein Überlauf resultiert wohl aus der Wahl deiner Eingabewerte, komplexe Zahlen habt ihr wohl noch nicht gehabt?

    http://ideone.com/P9el8


Anmelden zum Antworten