While Schleife funktioniert nicht richtig (C)

yxy

Lieutenant
Registriert
Juli 2014
Beiträge
556
Hi,
ich habe folgendes Programm geschrieben. Beim ersten Durchlauf funktioniert alles. Doch mein Problem ist, dass ich am Ende des 1. Durchlaufes fragen will, ob das Programm beendet werden soll.
----------
printf("Um Programm zu beenden druecken Sie e, falls nicht irgend eine beliebige Taste\n");
scanf("%c", &Ende);
------------
Doch ich kann beim simulieren garkeine Auswahl treffen. Das Programm springt automatisch wieder zum Anfang.
Zudem kann ich dann auch nicht mehr auswählen, was ich berechnen will (Geschwindigkeit, Weg oder Zeit).

Könnte mir jemand weiterhelfen?

-----------------------------------------------------------
#include<stdio.h>

int main() {

char Ende='a';
while (Ende!='e') {

int a, ok;
char enter;

printf("Was moechten sie berechnen?\n1...Weg\n2...Geschwindigkeit\n3...Zeit\n");

ok=scanf("%d%c", &a, &enter);

//Test richtige Eingabe

if(ok==2 && enter=='\n' && (a==1||a==2||a==3)) {


//Berechnung
float Weg, Gesch, Zeit;


switch (a) {

case 1:
printf("Sie haben die Berechnung von dem Weg gewaehlt.\n");
printf("Geschwindigkeit (km/h) -> ");
scanf("%f", &Gesch);
printf("Zeit (min) -> ");
scanf("%f", &Zeit);

Weg=Gesch*(Zeit/60);
printf("Bei einer Geschwindigkeit von %.2f km/h und einer Zeit von %.2f Minuten kommen sie %.2f km.\n\n", Gesch, Zeit, Weg);
break;

case 2:
printf("Sie haben die Berechnung von der Geschwindigkeit gewaehlt.\n");
printf("Weg (km) -> ");
scanf("%f", &Weg);
printf("Zeit (min) -> ");
scanf("%f", &Zeit);

if (Zeit==0) { printf("Fehler, Division durch 0 nicht moeglich!");
return 0; }

Gesch=Weg/(Zeit/60);
printf("Bei einem zurueckgelegten Weg von %.2f km und einer benoetigten Zeit von %.2f Minuten fuhren Sie im Durchschnitt %.2f km/h.\n\n", Weg, Zeit, Gesch);
break;

case 3:
printf("Sie haben die Berechnung von der Zeit gewaehlt.\n");
printf("Geschwindigkeit (km/h) -> ");
scanf("%f", &Gesch);
printf("Weg (km) -> ");
scanf("%f", &Weg);

if (Gesch==0) { printf("Fehler, Division durch 0 nicht moeglich!");
return 0; }

Zeit=60*Weg/Gesch;
printf("Bei einer Geschwindigkeit von %.2f km/h brauchen Sie fuer %.2f km %.2f Minuten.\n\n", Gesch, Weg, Zeit);
break;


}



}

else {
printf("Falsche Eingabe");
}


//Wiederholung

printf("Um Programm zu beenden druecken Sie e, falls nicht irgend eine beliebige Taste\n");
scanf("%c", &Ende);
}

return 0;
}
 
Pack das mal in

HTML:
[CODE][/CODE]

Klammern, dann kann man es besser lesen.
 
Code:
#include<stdio.h>

int main()  {

    char Ende='a';
    while (Ende!='e')   {

        int a, ok;
        char enter;

        printf("Was moechten sie berechnen?\n1...Weg\n2...Geschwindigkeit\n3...Zeit\n");

        ok=scanf("%d%c", &a, &enter);

        //Test richtige Eingabe

        if(ok==2 && enter=='\n' && (a==1||a==2||a==3))  {


                //Berechnung
                float Weg, Gesch, Zeit;


                switch (a)  {

                    case 1:
                        printf("Sie haben die Berechnung von dem Weg gewaehlt.\n");
                        printf("Geschwindigkeit (km/h) -> ");
                        scanf("%f", &Gesch);
                        printf("Zeit (min) -> ");
                        scanf("%f", &Zeit);

                        Weg=Gesch*(Zeit/60);
                        printf("Bei einer Geschwindigkeit von %.2f km/h und einer Zeit von %.2f Minuten kommen sie %.2f km.\n\n", Gesch, Zeit, Weg);
                        break;

                    case 2:
                        printf("Sie haben die Berechnung von der Geschwindigkeit gewaehlt.\n");
                        printf("Weg (km) -> ");
                        scanf("%f", &Weg);
                        printf("Zeit (min) -> ");
                        scanf("%f", &Zeit);

                        if (Zeit==0)    {   printf("Fehler, Division durch 0 nicht moeglich!");
                                            return 0;           }

                        Gesch=Weg/(Zeit/60);
                        printf("Bei einem zurueckgelegten Weg von %.2f km und einer benoetigten Zeit von %.2f Minuten fuhren Sie im Durchschnitt %.2f km/h.\n\n", Weg, Zeit, Gesch);
                        break;

                    case 3:
                        printf("Sie haben die Berechnung von der Zeit gewaehlt.\n");
                        printf("Geschwindigkeit (km/h) -> ");
                        scanf("%f", &Gesch);
                        printf("Weg (km) -> ");
                        scanf("%f", &Weg);

                        if (Gesch==0)    {   printf("Fehler, Division durch 0 nicht moeglich!");
                                            return 0;           }

                        Zeit=60*Weg/Gesch;
                        printf("Bei einer Geschwindigkeit von %.2f km/h brauchen Sie fuer %.2f km %.2f Minuten.\n\n", Gesch, Weg, Zeit);
                        break;


                }



         }

        else    {
            printf("Falsche Eingabe");
        }


        //Wiederholung

        printf("Um Programm zu beenden druecken Sie e, falls nicht irgend eine beliebige Taste\n");
        scanf("%c", &Ende);
    }

return 0;
}
 
Code:
-----------------------------------------------------------
#include<stdio.h>

int main() 
{
	char Ende='a';
	while (Ende!='e') 
	{
		int a, ok;
		char enter;
		printf("Was moechten sie berechnen?\n1...Weg\n2...Geschwindigkeit\n3...Zeit\n");
		ok=scanf("%d%c", &a, &enter);
		//Test richtige Eingabe
		if(ok==2 && enter=='\n' && (a==1||a==2||a==3)) {
		//Berechnung
		float Weg, Gesch, Zeit;
		switch (a) 
		{
			case 1:
			printf("Sie haben die Berechnung von dem Weg gewaehlt.\n");
			printf("Geschwindigkeit (km/h) -> ");
			scanf("%f", &Gesch);
			printf("Zeit (min) -> ");
			scanf("%f", &Zeit);
			Weg=Gesch*(Zeit/60);
			printf("Bei einer Geschwindigkeit von %.2f km/h und einer Zeit von %.2f Minuten kommen sie %.2f km.\n\n", Gesch, Zeit, Weg);
			break;

			case 2:
			printf("Sie haben die Berechnung von der Geschwindigkeit gewaehlt.\n");
			printf("Weg (km) -> ");
			scanf("%f", &Weg);
			printf("Zeit (min) -> ");
			scanf("%f", &Zeit);

			if (Zeit==0) 
			{ 
				printf("Fehler, Division durch 0 nicht moeglich!");
				return 0; 
			}

			Gesch=Weg/(Zeit/60);
			printf("Bei einem zurueckgelegten Weg von %.2f km und einer benoetigten Zeit von %.2f Minuten fuhren Sie im Durchschnitt %.2f km/h.\n\n", Weg, Zeit, Gesch);
			break;

			case 3:
			printf("Sie haben die Berechnung von der Zeit gewaehlt.\n");
			printf("Geschwindigkeit (km/h) -> ");
			scanf("%f", &Gesch);
			printf("Weg (km) -> ");
			scanf("%f", &Weg);

			if (Gesch==0) 
			{ 
				printf("Fehler, Division durch 0 nicht moeglich!");
			        return 0; 
			}

			Zeit=60*Weg/Gesch;
			printf("Bei einer Geschwindigkeit von %.2f km/h brauchen Sie fuer %.2f km %.2f Minuten.\n\n", Gesch, Weg, Zeit);
			break;
		}
	// } DIESE schließende Klammer ist eine zu viel IMO
		else 
		{
			printf("Falsche Eingabe");
		}

		//Wiederholung
		printf("Um Programm zu beenden druecken Sie e, falls nicht irgend eine beliebige Taste\n");
		scanf("%c", &Ende);
	}

	return 0;
}

Ich habe den Quelltext mal so eingerückt, dass man die Abschnitte ( { ... } ) erkennt (das sollte man immer so machen). Meiner Ansicht nach ist eine schließende Klammer zu viel, daher funktioniert es nicht wie es vorgesehen war. .
 
Zuletzt bearbeitet:
Die gehört aber zur if-Bedingung, oder?

Danach kommt dann der else Teil.
 
edit: passt
 
Zuletzt bearbeitet von einem Moderator:
lass die Klammern mal wie sie sind und mach aus dem
scanf("%c", &Ende);

mal
scanf("%s", &Ende);

Dann werd ich auch immer brav gefragt.
Auswahl usw. funktioniert bei mir soweit auch.
Getestet mit Dev-C++
 
Zuletzt bearbeitet:
Okay stimmt, oben (if- Teil) habe ich eine öffnende Klammer übersehen. ;)
Aber dennoch predige ich immer, die Klammern im Quellcode auch optisch so zu positionieren, dass man deren Gültigkeit und die resultierende Blockform auf den ersten Blick erkennt. Das macht denn Quelltext und dessen Strukturen viel einfacher lesbar und erleichtert die Fehlersuche ebenfalls.
 
Ok, jetzt funktioniert es auch bei mir.
Aber warum mussich das c durch ein s ersetzen?
%c wird doch für char verwendet und "Ende" ist doch ein char?

@Schiller: Ich werde deinen Rat berücksichtigen. Ist heute erst mein 2. Tag, an dem ich mich mit C auseinandersetze. ;)
 
Ich habe die Vermutung, dass durch die vorherige Eingabe noch das \n im stdin Stream ist.
das
scanf("%c", &Ende);
ließt eben den nächsten character im Stream aus und so kommst du automatisch wieder an den Anfang der Schleife.

C ist bei mir auch schon Ewigkeiten her, aber ich bin mir auch relativ sicher, dass ungefiltert Benutzereingaben in eine 1 Byte große char Variabel einzulesen nicht so ganz sauber ist ;)
 
Also mit diesem Befehl?

fseek(stdin,0,SEEK_END);

Das was in der Klammer steht muss ich so stehen lassen, oder muss ich noch irgend etwas abändern?

Ein Problem habe ich aber noch. Wenn ich zu Beginn bei der Auswahl "e" eintippe und dann bestätige, dann kommt zwar "Falsche Eingabe
Um Programm zu beenden....Taste."
Gleichzeitig beendet sich das Program aber von selbst.
 
Zuletzt bearbeitet:
Zurück
Oben