Quadratische Gleichung in einer Zeile einlesen
Quadratische Gleichung in einer Zeile einlesen
Hallo Leute,
Ich sitze gerade daran, ein Programm zu schreiben, mit dem man eine Quadratische Gleichung a*x^2+b*x+c=d mit Hilfe von C nach x auflösen kann. Die Auflösung der Gleichung, die Fallunterscheidungen, etc. sind kein Problem. Wenn ich mein Programm mit fest definierten Variablen a=4 usw. starte, funktioniert alles fabelhaft. Mein Problem ist aber nun, dass ich die Quadratische Gleichung in der Konsole innerhalb einer einzigen Zeile einlesen lassen will. Folgendermaßen würde das dann in der Konsole aussehen:
Bitte geben Sie die Gleichung im Folgenden ein:
4*x^2+3*x-4=2
Ich habe versucht, dies innerhalb einer Zeile mittels scanf und printf zu ermöglichen, jedoch funktioniert das nicht, da man ja die in scanf eingegebene Zahl per Enter bestätigen lassen muss usw. Zudem erzeugt solch ein Versuch etliche Systemfehler. Ein Freund von mir meinte, dass man es vielleicht mit einer While-Schleife ermöglichen könnte, jedoch ist mir nicht ganz klar, wie man das anstellen soll in C.
Könntet ihr mir vielleicht behilflich sein? Ich danke euch bereits jetzt im Voraus.
Liebe Grüße
Ich sitze gerade daran, ein Programm zu schreiben, mit dem man eine Quadratische Gleichung a*x^2+b*x+c=d mit Hilfe von C nach x auflösen kann. Die Auflösung der Gleichung, die Fallunterscheidungen, etc. sind kein Problem. Wenn ich mein Programm mit fest definierten Variablen a=4 usw. starte, funktioniert alles fabelhaft. Mein Problem ist aber nun, dass ich die Quadratische Gleichung in der Konsole innerhalb einer einzigen Zeile einlesen lassen will. Folgendermaßen würde das dann in der Konsole aussehen:
Bitte geben Sie die Gleichung im Folgenden ein:
4*x^2+3*x-4=2
Ich habe versucht, dies innerhalb einer Zeile mittels scanf und printf zu ermöglichen, jedoch funktioniert das nicht, da man ja die in scanf eingegebene Zahl per Enter bestätigen lassen muss usw. Zudem erzeugt solch ein Versuch etliche Systemfehler. Ein Freund von mir meinte, dass man es vielleicht mit einer While-Schleife ermöglichen könnte, jedoch ist mir nicht ganz klar, wie man das anstellen soll in C.
Könntet ihr mir vielleicht behilflich sein? Ich danke euch bereits jetzt im Voraus.
Liebe Grüße
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Quadratische Gleichung in einer Zeile einlesen
Abhängig von der PLatform(System) du das Programm programmierst hast du verschiedene möglichkeiten,
Unter Windows könntest du getch() nehmen, das ist aber seeeeeeeeeehr schlechter Programmierstil.
Hast du aber versucht, mehrere elemente mit Scanf einzulesen?
Ich meine folgendermaßen:
Und wilkommen im Forum!
Unter Windows könntest du getch() nehmen, das ist aber seeeeeeeeeehr schlechter Programmierstil.
Hast du aber versucht, mehrere elemente mit Scanf einzulesen?
Ich meine folgendermaßen:
Code: Alles auswählen
scanf("%c %d %c",a,b,c);
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
Re: Quadratische Gleichung in einer Zeile einlesen
Huhu,
Also ich programmiere auf Windows Vista mit Microsoft Visual Studio .NET 2003. An getch() hatte ich auch gedacht, aber es eben wegen diesem ungewöhnlichen und nicht so schönen Programmierstil sein lassen. Das Problem bei scanf ist folgendes:
printf("Bitte quadratische Gleichung eingeben:\n");
scanf("%+f * x^2 %+f * x %+f = %+f", fa, fb, fc, fd);
Wenn ich das hier so ohne Zuweisungsoperatoren vor fa, fb, fc, fd eingebe, dann erhalte ich immer eine Runtime-Fehlermeldung und das Programm wird sofort abgebrochen. Selbst mit Zuweisungsoperatoren oder anderen Datentypen, kann ich nur eine einzige Variable einlesen. Denn um die erste Variable eingeben zu können, muss ich Enter drücken. Das bewirkt schon einen Zeilenvorschub und das Programm wird aus mir unerfindlichen Gründen beendet. Ich möchte ja einfach nur diese eine Zeile ausgeben, und innerhalb dieser Zeile auch gleichzeitig die Variablen einlesen. Sollte ich vielleicht mit einem Array arbeiten oder String? Etwas schwierig zu erklären, sry ...
Ich hätte noch die Möglichkeit mit der folgenden Schleife zu arbeiten (jedenfalls laut einem anderem Forum):
while (iEingabe != 4)
{ iEingabe = scanf("%f*x^2%f*x%f=%f", &fa,&fb,&fc,&fd);}
Jedoch wüsste ich jetzt im Moment nicht, wie ich das in mein Programm einbinden müsste. Wenn ich einfach iEingabe deklariere habe ich das Problem, dass ich erneut Runtime-Fehlermeldungen erhalte. Wenn ich iEingabe = 0 setze, stürzt mein Programm ab.
Ich bin, was diese Sache angeht, ziemlich verzweifelt. Aber es müsste doch wirklich eine Möglichkeit geben, in der man innerhalb der Konsole nur in einer einzigen Zeile verschiedene Variablen eingeben kann (a, b, c, d) und wo sich zwischen den Variablen Zeichen befinden, die ich nicht einzugeben brauche (x^2, x, =). :/
Und danke für die Begrüßung und die schnelle Hilfe
Also ich programmiere auf Windows Vista mit Microsoft Visual Studio .NET 2003. An getch() hatte ich auch gedacht, aber es eben wegen diesem ungewöhnlichen und nicht so schönen Programmierstil sein lassen. Das Problem bei scanf ist folgendes:
printf("Bitte quadratische Gleichung eingeben:\n");
scanf("%+f * x^2 %+f * x %+f = %+f", fa, fb, fc, fd);
Wenn ich das hier so ohne Zuweisungsoperatoren vor fa, fb, fc, fd eingebe, dann erhalte ich immer eine Runtime-Fehlermeldung und das Programm wird sofort abgebrochen. Selbst mit Zuweisungsoperatoren oder anderen Datentypen, kann ich nur eine einzige Variable einlesen. Denn um die erste Variable eingeben zu können, muss ich Enter drücken. Das bewirkt schon einen Zeilenvorschub und das Programm wird aus mir unerfindlichen Gründen beendet. Ich möchte ja einfach nur diese eine Zeile ausgeben, und innerhalb dieser Zeile auch gleichzeitig die Variablen einlesen. Sollte ich vielleicht mit einem Array arbeiten oder String? Etwas schwierig zu erklären, sry ...
Ich hätte noch die Möglichkeit mit der folgenden Schleife zu arbeiten (jedenfalls laut einem anderem Forum):
while (iEingabe != 4)
{ iEingabe = scanf("%f*x^2%f*x%f=%f", &fa,&fb,&fc,&fd);}
Jedoch wüsste ich jetzt im Moment nicht, wie ich das in mein Programm einbinden müsste. Wenn ich einfach iEingabe deklariere habe ich das Problem, dass ich erneut Runtime-Fehlermeldungen erhalte. Wenn ich iEingabe = 0 setze, stürzt mein Programm ab.
Ich bin, was diese Sache angeht, ziemlich verzweifelt. Aber es müsste doch wirklich eine Möglichkeit geben, in der man innerhalb der Konsole nur in einer einzigen Zeile verschiedene Variablen eingeben kann (a, b, c, d) und wo sich zwischen den Variablen Zeichen befinden, die ich nicht einzugeben brauche (x^2, x, =). :/
Und danke für die Begrüßung und die schnelle Hilfe
- fat-lobyte
- Beiträge: 1398
- Registriert: Sa Jul 05, 2008 12:23 pm
- Wohnort: ::1
- Kontaktdaten:
Re: Quadratische Gleichung in einer Zeile einlesen
Tach, und willkommen im Forum!Tulpchen hat geschrieben:Hallo Leute,
Du kannst leider nicht in der gleichen Zeile schreiben wie du liest. Du musst zuerst das Format angeben, und dann hoffen, dass der Benutzer alles richtig eingibt. Das sieht in etwa so aus:Tulpchen hat geschrieben:Mein Problem ist aber nun, dass ich die Quadratische Gleichung in der Konsole innerhalb einer einzigen Zeile einlesen lassen will.
Code: Alles auswählen
float a, b, c;
printf("Bitte geben sie eine Quadratische Gleichung in der Form ax^2 + bx +c = 0 ein: \n ");
scanf("%fx^2 + %fx + %f", &a, &b, &c);
Weiters beachte bitte die Fehlerbehandlung, falls jemand etwas falsch eingibt, gibt es nämlich undefiniertes verhalten. Bitte lies die FAQ, Frage 2
Wir könnten dir besser helfen wenn du deinen Code und deine Fehler posten würdest.Tulpchen hat geschrieben:Könntet ihr mir vielleicht behilflich sein? Ich danke euch bereits jetzt im Voraus.
Falls es dich interessiert, ich habe genau das gleiche Programm geschrieben, vor ein paar Jahren. Falls du lösungsvorschläge brauchst, kannst du ja mal reinschauen: http://www.forum.proggen.org/viewtopic.php?f=37&t=381
mfg, fat-lobyte
Haters gonna hate, potatoes gonna potate.
- Xin
- nur zu Besuch hier
- Beiträge: 8859
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Quadratische Gleichung in einer Zeile einlesen
Moin Tulpchen, willkommen im Forum, ich freue mich auf Deine Uservorstellung, wenn Du masgst.Tulpchen hat geschrieben:Hallo Leute,
Bitte vergiss scanf(), streiche es komplett aus Deinem Gedächtnis, scanf() ist keine ungefährliche Funktion.Tulpchen hat geschrieben:Ich sitze gerade daran, ein Programm zu schreiben, mit dem man eine Quadratische Gleichung a*x^2+b*x+c=d mit Hilfe von C nach x auflösen kann. Mein Problem ist aber nun, dass ich die Quadratische Gleichung in der Konsole innerhalb einer einzigen Zeile einlesen lassen will. Folgendermaßen würde das dann in der Konsole aussehen:
Bitte geben Sie die Gleichung im Folgenden ein:
4*x^2+3*x-4=2
Ich habe versucht, dies innerhalb einer Zeile mittels scanf und printf zu ermöglichen
Gib die Funktion doch als Programmparameter über:
Code: Alles auswählen
$ meinprogramm "4*x^2+3*x-4=2"
Code: Alles auswählen
int main( int argc, argv )
Code: Alles auswählen
$ meinprogramm -a 4 -b 3 -c -4 -r 2
Ansonsten gibst Du die Reihenfolge eben vor:
Code: Alles auswählen
$ meinprogramm 4 3 -4 2
Parser zu schreiben ist nicht schwer - aber aufwendig. Also würde ich das für ein Beispielprogram eher vermeiden - außer, Du möchtest einen Parser programmieren.Tulpchen hat geschrieben:Könntet ihr mir vielleicht behilflich sein? Ich danke euch bereits jetzt im Voraus.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Quadratische Gleichung in einer Zeile einlesen
Huhu
Erstmal möchte ich euch allen wirklich danken. Hätte nicht gedacht, dass mir so viele Personen so schnell antworten. Also --> *Thumbs up*
Im Folgenden findet ihr meinen bisherigen Code, um die Quadratische Gleichung zu lösen. Es ist nicht sehr kompliziert denke ich, vermutlich auch zu unausgereift, aber es reicht. Zumindestens wenn ich die Werte von vornherein definiere.
Nur stört mich halt ganz oben, dass ich die Werte nicht eingeben kann. Ich könnte natürlich die Version von fat-lobyte verwenden und sagen, dass ich alle einzelnen Werte extra im Wechsel per Scanf & Printf aufrufe, aber ich hatte die Vision, dass ich das alles in einer Zeile machen könnte. Ich habe zwar auch in der FAQ die Frage 2 durchgelesen, aber so richtig mag das bei mir auch nicht klappen. Ich habe mir gedacht, ich lasse es soweit mit scanf, da ich bislang noch nie mit Parsern oder entsprechenden extra Programmparametern gearbeitet habe, und versuche es so, wie es in der Frage 2 beschrieben wurde. Jedoch nicht für einen (num_read != 1) sondern für (iEingabe < 4), da ja 4 Eingaben erfolgen sollen. Jedoch kann ich mein Problem mit dem Zeilenvorschub nicht umgehen und vor allem wird es merkwürdigerweise eine Endlosschleife, da iEingabe nicht pro Eingabe zunimmt.
Was würdet ihr mir in diesem Fall empfehlen? Was könnte ich umändern, damit es doch klappt?
Erstmal möchte ich euch allen wirklich danken. Hätte nicht gedacht, dass mir so viele Personen so schnell antworten. Also --> *Thumbs up*
Im Folgenden findet ihr meinen bisherigen Code, um die Quadratische Gleichung zu lösen. Es ist nicht sehr kompliziert denke ich, vermutlich auch zu unausgereift, aber es reicht. Zumindestens wenn ich die Werte von vornherein definiere.
Code: Alles auswählen
#include <stdio.h>
#include <math.h>
int main()
{
float fFaktorA, fFaktorB, fFaktorC, fFaktorD, fWurzel, fErgebnis1, fErgebnis2;
int iEingabe;
do
{
printf("Bitte quadratische Gleichung eingeben:\n");
iEingabe = scanf(" %f * x^2 %f * x %f = %f", &fFaktorA,&fFaktorB,&fFaktorC,&fFaktorD);
}
while (iEingabe < 4);
fFaktorC = fFaktorC-fFaktorD;
if (fFaktorA == 0)
{
fErgebnis1 = -fFaktorC/fFaktorB;
printf("Die eingegebene Gleichung hat den Faktor 0 vor dem x^2.\n");
printf("Die L\224sung der linearen Gleichung ist x = %+f\n", fErgebnis1);
}
else
{
fFaktorB = fFaktorB/fFaktorA;
fFaktorC = fFaktorC/fFaktorA;
fFaktorA = 1;
fWurzel = (((fFaktorB*fFaktorB)/4) - fFaktorC);
if (fWurzel > 0)
{
fErgebnis1 = ((-fFaktorB)/2) + sqrt(fWurzel);
fErgebnis2 = ((-fFaktorB)/2) - sqrt(fWurzel);
printf("Die eingegebene Gleichung hat 2 L\224sungen:\n");
printf("x_1 = %+f\n", fErgebnis1);
printf("x_2 = %+f\n", fErgebnis2);
}
else
{
if (fWurzel == 0)
{
fErgebnis1 = (-fFaktorB)/2;
printf("Die eingegebene Gleichung hat eine L\224sung:\n");
printf("x_1 = x_2 = %+f\n",fErgebnis1);
}
else
{
fErgebnis1 = sqrt(-fWurzel);
fErgebnis2 = sqrt(-fWurzel);
printf("Die eingegebene, komplexe Gleichung hat eine imagin\204re L\224sung:\n");
printf("x_1 = %+f + i*%f\n", (-fFaktorB/2), fErgebnis1);
printf("x_2 = %+f - i*%f\n", (-fFaktorB/2), fErgebnis2);
}
}
}
return 0;
}
Was würdet ihr mir in diesem Fall empfehlen? Was könnte ich umändern, damit es doch klappt?
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Quadratische Gleichung in einer Zeile einlesen
Hab in einem Uraten C Buch folgendes gefunden:
Diese funktion ähnelt der getch(); funktion,
sollte aber?? auch unter Linux laufen, da sie im standart Header drinn ist.
Damit solltest du weniger Probleme ahben, musst aber einen entsprechenden Parser bauen.
Ein ANsatz wäre folgender:
Weiß jezt gerade nicht in wie fern das so gehen sollte...
Code: Alles auswählen
#include <stdio.h>
getchar();
sollte aber?? auch unter Linux laufen, da sie im standart Header drinn ist.
Damit solltest du weniger Probleme ahben, musst aber einen entsprechenden Parser bauen.
Ein ANsatz wäre folgender:
Code: Alles auswählen
char *gleichung;
while(gleichung!='\n')
{
gleichung++;
*gleichung=getchar();
}
...
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
- fat-lobyte
- Beiträge: 1398
- Registriert: Sa Jul 05, 2008 12:23 pm
- Wohnort: ::1
- Kontaktdaten:
Re: Quadratische Gleichung in einer Zeile einlesen
Das weil du das Wesentliche vergessen hast: das Löschen des Eingabepuffers:cloidnerux hat geschrieben:Hab in einem Uraten C Buch folgendes gefunden:Code: Alles auswählen
#include <stdio.h> getchar();
Nein. Finger weg von getchar(). Das ist eine Uralte DOS Funktion, die in keinem Standard enthalten ist.
Tulpchen hat geschrieben:Ich habe zwar auch in der FAQ die Frage 2 durchgelesen, aber so richtig mag das bei mir auch nicht klappen. Ich habe mir gedacht, ich lasse es soweit mit scanf, da ich bislang noch nie mit Parsern oder entsprechenden extra Programmparametern gearbeitet habe, und versuche es so, wie es in der Frage 2 beschrieben wurde. Jedoch nicht für einen (num_read != 1) sondern für (iEingabe < 4), da ja 4 Eingaben erfolgen sollen. Jedoch kann ich mein Problem mit dem Zeilenvorschub nicht umgehen und vor allem wird es merkwürdigerweise eine Endlosschleife, da iEingabe nicht pro Eingabe zunimmt.
Code: Alles auswählen
void clear_stdin()
{
int ch; /* Wichtig! Muss int, und nicht char sein. */
while( (c = getchar()) != '\n' && c != EOF )
/* Nichts tun */;
}
mfg, fat-lobyte
Haters gonna hate, potatoes gonna potate.
Re: Quadratische Gleichung in einer Zeile einlesen
Auch das klappt leider nicht. Das Löschen des Eingabepuffers ändert leider nichts dadran, dass nach 2 Zeilen erneut die Aussage mit printf ausgegeben wird usw. Btw. müsste es nicht bei dem Code (int c;) statt (int ch;) heißen? Ansonsten ist das c in der While-Schleife nicht deklariert. Ich nehme mal, dass es ein Tippfehler ist, oder?
Ich denke, ich werde einfach die Zahlen nacheinander abrufen müssen. *seufzt* Dennoch danke für Eure Hilfe.
Ich denke, ich werde einfach die Zahlen nacheinander abrufen müssen. *seufzt* Dennoch danke für Eure Hilfe.
- fat-lobyte
- Beiträge: 1398
- Registriert: Sa Jul 05, 2008 12:23 pm
- Wohnort: ::1
- Kontaktdaten:
Re: Quadratische Gleichung in einer Zeile einlesen
Ja, stimmt, danke, hab ich ausgebessert im Wiki. Sollte eigentlich sowieso nur eine kleine Anregung sein.Tulpchen hat geschrieben:Auch das klappt leider nicht. Das Löschen des Eingabepuffers ändert leider nichts dadran, dass nach 2 Zeilen erneut die Aussage mit printf ausgegeben wird usw. Btw. müsste es nicht bei dem Code (int c;) statt (int ch;) heißen? Ansonsten ist das c in der While-Schleife nicht deklariert. Ich nehme mal, dass es ein Tippfehler ist, oder?
Ich denke so ist es am besten. Anders wäre es doch sehr kompliziert.Tulpchen hat geschrieben:Ich denke, ich werde einfach die Zahlen nacheinander abrufen müssen. *seufzt* Dennoch danke für Eure Hilfe.
Haters gonna hate, potatoes gonna potate.