Quadratische Gleichung in einer Zeile einlesen

Schnelle objektorientierte, kompilierende Programmiersprache.
Tulpchen
Beiträge: 4
Registriert: Mi Jan 07, 2009 2:16 pm

Quadratische Gleichung in einer Zeile einlesen

Beitrag von Tulpchen » Mi Jan 07, 2009 2:25 pm

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

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Quadratische Gleichung in einer Zeile einlesen

Beitrag von cloidnerux » Mi Jan 07, 2009 2:31 pm

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:

Code: Alles auswählen

scanf("%c %d %c",a,b,c);
Und wilkommen im Forum!
Redundanz macht wiederholen unnötig.
quod erat expectandum

Tulpchen
Beiträge: 4
Registriert: Mi Jan 07, 2009 2:16 pm

Re: Quadratische Gleichung in einer Zeile einlesen

Beitrag von Tulpchen » Mi Jan 07, 2009 2:48 pm

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 :)

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Quadratische Gleichung in einer Zeile einlesen

Beitrag von fat-lobyte » Mi Jan 07, 2009 2:49 pm

Tulpchen hat geschrieben:Hallo Leute,
Tach, und willkommen im Forum!

Tulpchen hat geschrieben:Mein Problem ist aber nun, dass ich die Quadratische Gleichung in der Konsole innerhalb einer einzigen Zeile einlesen lassen will.
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:

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); 
Bitte sieh dir die scanf() funktion genauer an, damit du weißt worum es geht: http://www.cplusplus.com/reference/clib ... scanf.html
Weiters beachte bitte die Fehlerbehandlung, falls jemand etwas falsch eingibt, gibt es nämlich undefiniertes verhalten. Bitte lies die FAQ, Frage 2
Tulpchen hat geschrieben:Könntet ihr mir vielleicht behilflich sein? Ich danke euch bereits jetzt im Voraus.
Wir könnten dir besser helfen wenn du deinen Code und deine Fehler posten würdest.

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.

Benutzeravatar
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

Beitrag von Xin » Mi Jan 07, 2009 3:20 pm

Tulpchen hat geschrieben:Hallo Leute,
Moin Tulpchen, willkommen im Forum, ich freue mich auf Deine Uservorstellung, wenn Du masgst.
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
Bitte vergiss scanf(), streiche es komplett aus Deinem Gedächtnis, scanf() ist keine ungefährliche Funktion.

Gib die Funktion doch als Programmparameter über:

Code: Alles auswählen

$ meinprogramm "4*x^2+3*x-4=2"
so erhältst Du sie in argv bei

Code: Alles auswählen

int main( int argc, argv )
Aaaber... Du musst einen Parser dafür schreiben, was aufwendiger wäre, als die Gleichung zu lösen. Daher würde ich es so lösen:

Code: Alles auswählen

$ meinprogramm -a 4 -b 3 -c -4 -r 2
So hast Du vor jedem Koeffizienten die Angabe wozu er gehört.

Ansonsten gibst Du die Reihenfolge eben vor:

Code: Alles auswählen

$ meinprogramm 4 3 -4 2
Tulpchen hat geschrieben:Könntet ihr mir vielleicht behilflich sein? Ich danke euch bereits jetzt im Voraus.
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.
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.

Tulpchen
Beiträge: 4
Registriert: Mi Jan 07, 2009 2:16 pm

Re: Quadratische Gleichung in einer Zeile einlesen

Beitrag von Tulpchen » Mi Jan 07, 2009 3:54 pm

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.

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;
}
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?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Quadratische Gleichung in einer Zeile einlesen

Beitrag von cloidnerux » Mi Jan 07, 2009 4:13 pm

Hab in einem Uraten C Buch folgendes gefunden:

Code: Alles auswählen

#include <stdio.h>

getchar();
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:

Code: Alles auswählen

char *gleichung;
while(gleichung!='\n')
{
gleichung++;
*gleichung=getchar();
}
...
Weiß jezt gerade nicht in wie fern das so gehen sollte...
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Quadratische Gleichung in einer Zeile einlesen

Beitrag von fat-lobyte » Mi Jan 07, 2009 4:45 pm

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.
Das weil du das Wesentliche vergessen hast: das Löschen des Eingabepuffers:

Code: Alles auswählen

void clear_stdin()
{
    int ch; /* Wichtig! Muss int, und nicht char sein. */   
    while( (c = getchar()) != '\n' && c != EOF )
        /* Nichts tun */;
}
Vielleicht gehts so ein bisschen besser.
mfg, fat-lobyte
Haters gonna hate, potatoes gonna potate.

Tulpchen
Beiträge: 4
Registriert: Mi Jan 07, 2009 2:16 pm

Re: Quadratische Gleichung in einer Zeile einlesen

Beitrag von Tulpchen » Mi Jan 07, 2009 5:02 pm

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. :)

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Quadratische Gleichung in einer Zeile einlesen

Beitrag von fat-lobyte » Mi Jan 07, 2009 6:04 pm

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?
Ja, stimmt, danke, hab ich ausgebessert im Wiki. Sollte eigentlich sowieso nur eine kleine Anregung sein.
Tulpchen hat geschrieben:Ich denke, ich werde einfach die Zahlen nacheinander abrufen müssen. *seufzt* Dennoch danke für Eure Hilfe. :)
Ich denke so ist es am besten. Anders wäre es doch sehr kompliziert.
Haters gonna hate, potatoes gonna potate.

Antworten