a - b - c Formel in C, Probleme beim einlesen und berechnen von a
-
Hallo,
ich versuche momentan die a - b - c Formel in C zu programmieren.
So lange ich nur Werte für b und c einlese gibt es keine Probleme und die Ergebnisse die heraus kommen sind richtig (überall wo hätte a stehen sollen stand einfach nur eine 2). Wenn ich nun aber zusätzlich noch a einlese bekomme ich als Ergebnis für die Berechnungen nur -inf heraus. Dieses Problem scheint dann aufzutreten, wenn durch a geteilt wird, da wenn ich in diesen Zeilen a wieder durch eine 2 ersetze, funktioniert es wieder.Hier mein Code dazu:
#include <conio.h> #include <stdio.h> #include <math.h> double main(void) { float X1; float X2; float W; float M; float Z; float a; float b; float c; printf("Loesen der Mitternachtsformel \n"); printf("a + x ^ 2 + b + x + c = 0 \n \n"); printf("Geben sie eien einstelligen Wert fuer a ein: "); // einlesen von a scanf("%f", &a); printf("\nGeben sie eien einstelligen Wert fuer b ein: "); // einlesen von b scanf("%f", &b); printf("\nGeben sie einen einstelligen Wert fuer c ein: "); // einlesen von c scanf("%f", &c); if (a = 0) // prüfen ob Nenner = 0 ist { printf("Es gibt keine Loesung, da der Nenner 0 ist."); } else { W = (b*b) - 4 * 1 * c; // Klammer berechnen if (W <= 0) // Überprüfung der Wurzel { if (W < 0) // Wurzel ist negativ { printf("Es gibt keine Loesung, da die Wurzel negativ ist."); getch(); return 0; } else // Wurzel ist 0 { printf("Es gibt eine Loesung: \n"); Z = -b / a; printf("Diese Loesung ist: %f", Z); getch(); return 0; } } else // Wurzel ok { printf("Es gibt zwei Loesungen\n\n"); X1 = (-b + sqrt(W)) / a; X2 = (-b - sqrt(W)) / a; } } printf("X1 ist: %f\n", X1); // Ausgabe X1 printf("X2 ist: %f", X2); // Ausgabe X2 getch(); return 0; }
Hoffentlich könnt ihr mir mit meinem Problem helfen und, dass der Fehler nicht all zu dumm ist
.
Schon mal im Voraus Danke,
Fantoka
-
Sieh' dir mal Zeile 32 an.
-
Techel schrieb:
Sieh' dir mal Zeile 32 an.
31
Ist es richtig, dass dann noch X1 und X2 ausgegeben werden?
Und der Text in Zeile 20 ist auch falsch.
-
Ich habe die entsprechenden Zeilen nun verbessert und jetzt rechnet er auch etwas, allerdings sind die Ergebnisse, wenn es zwei Lösungen gibt immer falsch, bei nur einem Ergebnis ist es richtig.
Hier der verbesserte Code:
#include <conio.h> #include <stdio.h> #include <math.h> float main(void) { float X1; float X2; float W; float M; float Z; float a; float b; float c; printf("Loesen der Mitternachtsformel \n"); printf("a * x ^ 2 + b * x + c = 0\n \n"); printf("Geben sie einen Wert fuer a ein: "); // einlesen von a scanf("%f", &a); printf("\nGeben sie einen Wert fuer b ein: "); // einlesen von b scanf("%f", &b); printf("\nGeben sie einen Wert fuer c ein: "); // einlesen von c scanf("%f", &c); if (a == 0) // prüfen ob Nenner = 0 ist { printf("\n\nEs gibt keine Loesung, da der Nenner 0 ist."); getch(); return 0; } else { W = (b*b) - 4 * a * c; // Klammer berechnen if (W <= 0) // Überprüfung der Wurzel { if (W < 0) // Wurzel ist negativ { printf("\n\nEs gibt keine Loesung, da die Wurzel negativ ist."); getch(); return 0; } else // Wurzel ist 0 { printf("\n\nEs gibt eine Loesung: \n\n"); Z = -b / 2 * a; // Berechnung von nur einer Loesung printf("Diese Loesung ist: %f", Z); getch(); return 0; } } else // Wurzel ok { printf("\n\nEs gibt zwei Loesungen:\n\n"); X1 = (-b + sqrt(W)) / 2 * a; // Berechnung X1 X2 = (-b - sqrt(W)) / 2 * a; // Berechnung X2 } } printf("X1 ist: %f\n", X1); // Ausgabe X1 printf("X2 ist: %f", X2); // Ausgabe X2 getch(); return 0; }
Schon mal Danke für eure Hilfe.
Fantoka
-
Du hast min. 2 Fehler im Code:
Fehler 1:
if (a == 0) // prüfen ob Nenner = 0 ist { printf("\n\nEs gibt keine Loesung, da der Nenner 0 ist.");
Das ist falsch - welcher Nenner? Mit a = 0 hast du eine ganz normale Gerade. Diese hat, sofern b != 0, genau eine Nullstelle. Mit b = 0 hat sie entweder 0 (bei c != 0) oder unendlich viele Nullstellen (bei c = 0).
Fehler 2:
X1 = (-b + sqrt(W)) / 2 * a; // Berechnung X1 X2 = (-b - sqrt(W)) / 2 * a; // Berechnung X2
Geteilt und Mal haben dieselbe Priorität. D.h. du teilst nicht durch 2*a, sondern du teilst nur durch 2 und multiplizierst dann mit a. D.h. setzte 2*a in Klammern.
Außerdem berechnest du sqrt(W) doppelt. Ich würde die Variable W Radikant nennen und dann W=sqrt(Radikant) rechnen, dann muss man die Wurzel nur einmal ziehen.
-
Radikand
-
oha, peinlich... Hat ja fast schon Standart-Dimension
-
Hast Glück gehabt, daß es nicht auch von der Forensoftware zensiert wurde
-
Ok Danke jetzt geht alles wie es soll, bin noch ziemlich am Anfang mit C, deshalb bin ich sehr dankbar für eure schnelle und gute Hilfe :D.