You are not logged in.

  • Login

1

Saturday, June 9th 2007, 2:17pm

wo is der fehler? :)

hey ho, ich weiß, dass das programm eher trivial ist, aber es macht nich das was ich will und ich weiß nich warum...
also aufgabe ist erstmal zwei zahlen einzugeben, die dann durch auswahl in einem menü addiert, dividiert,.. werden sollen und es dann so zu erweitern, dass immer wieder neue zahlen eingeben werden können bis zum abbruch.
bei mir ist es jetz so, dass ich die zahlen eingeben kann und dann auch den entsprechnenden buchstaben, er aber nichts rechnet/ausgibt/... sondern einfach wieder nach 2 zahlen fragt. wenn ich in der if-bedingung ein "=" wegnehme addiert er immer, egal welcher buchstabe eingegeben wird, ich kann daraus aber nicht auf das problem schließen... sry is vll echt trivial für euch, aber ich bin mit char noch nicht vertraut.
ich kopier euch mal meinen quelltext rein:

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <math.h>
 
int main()
{
char c;
float ergebnis,x,y;
while(1)
{
printf("Geben Sie die erste Zahl ein: ");scanf("%f",&x);
printf("Geben Sie die zweite Zahl ein: ");scanf("%f",&y);
printf("Waehlen Sie a fuer Addition, m fuer Multiplikation, d fuer Division, s fuer Subraktion oder q um das Programm zu beenden: ");
scanf("%c",&c);
getchar ();
 
if (c=='a')
   {
   printf("Addition beider Zahlen\n");
   ergebnis=x+y;
   printf("%f + %f = %f\n",x,y,ergebnis);
   continue;        
   }
if (c=='m')
   {
   printf("Multiplikation beider Zahlen\n");
   ergebnis=x*y;
   printf("%f * %f = %f\n",x,y,ergebnis);
   continue;        
   }
if (c=='d')
   {
   printf("Division beider Zahlen\n");
   ergebnis=x/y;
   printf("%f / %f = %f\n",x,y,ergebnis);
   continue;        
   }   
if (c=='s')
   {
   printf("Subtraktion beider Zahlen\n");
   ergebnis=x-y;
   printf("%f - %f = %f\n",x,y,ergebnis);
   continue;        
   }   
if (c=='q')
   break;
}
printf("Programm beendet!");
return 0;
}



vll könnte man das generell eleganter machen, aber bei der aufgabe gehts um die break und continue anweisung, da die jetz eingeführt worden.
wär lieb wenn mal jemand drüber schauen könnte. danke.

//EDIT: highlighted by d0nut

2

Saturday, June 9th 2007, 2:36pm

der Fehler liegt bei getchar()

printf("Geben Sie die erste Zahl ein: ");scanf("%f",&x);
printf("Geben Sie die zweite Zahl ein: ");scanf("%f",&y);
printf("Waehlen Sie a fuer Addition, m fuer Multiplikation, d fuer Division, s fuer Subraktion oder q um das Programm zu beenden: ");
scanf("%c",&c);
getchar (); <- Das hat hier nix verloren

3

Saturday, June 9th 2007, 2:37pm

Im übrigen würde ich Dir empfehlen, switch ist nicht nur übersichtlicher sondern auch schneller, der zugriff auf die einzelnen cases ist konstant.

4

Saturday, June 9th 2007, 2:39pm

Ich würde Dir empfehlen switches zu benutzen, oh man deutsch ist manchmal schon ne hürde;)

5

Saturday, June 9th 2007, 2:39pm

Willkommen im Forum könntest du des nächste mal bitte mit highlight ner machen dann sieht mans besser

so was hast du vergessen das

fflush(stdin); sollte nach jedem scanf stehen(außer in manchen fällen)
da sich sonst noch was von der vorherigen eingabe drauf befindet
also das was in y bzw x steht also kann es nie a,s,d,m oder q sein außerdem ne struktur sollte man auch lernen

MFG Donasa

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdio.h>
#include <math.h>
 
int main()
{
	char c;
	float ergebnis,x,y;
	while(1)
	{
		printf("Geben Sie die erste Zahl ein: ");
		scanf("%f",&x);
		fflush(stdin);
		printf("Geben Sie die zweite Zahl ein: ");
		scanf("%f",&y);
		fflush(stdin);
		printf("Waehlen Sie a fuer Addition, m fuer Multiplikation, d fuer Division, s fuer Subtraktion oder q um das Programm zu beenden:");
		scanf("%c",&c);
		fflush(stdin);
		if(c=='a')
		{
			printf("Addition beider Zahlen\n");
			ergebnis=x+y;
			printf("%f + %f = %f\n",x,y,ergebnis);
			continue;
		}
		if(c=='m')
		{
			printf("Multiplikation beider Zahlen\n");
			ergebnis=x*y;
			printf("%f * %f = %f\n",x,y,ergebnis);
			continue;
		}
		if(c=='d')
		{
			printf("Division beider Zahlen\n");
			ergebnis=x/y;
			printf("%f / %f = %f\n",x,y,ergebnis);
			continue;
		}
		if(c=='s')
		{
			printf("Subtraktion beider Zahlen\n");
			ergebnis=x-y;
			printf("%f - %f = %f\n",x,y,ergebnis);
			continue;
		}
		else
			break;
	}
	printf("Programm beendet!");
	return 0;
}

6

Saturday, June 9th 2007, 2:42pm

aja ich hab das if(c=='q') mit else ersetzt das heißt das man z.b.: auch f zum beenden drücken kann und warum wenn du bei
if(c='a') immer addiert hast ist auch klar da

=....Zuweisung da die funktoniert in der klammer auch eine wahre aussage
==..Vergleich das musst du benutzen wenn du schon magst ob was gleich ist


MFG Donasa

7

Saturday, June 9th 2007, 3:43pm

aja du solltest unbedingt noch bei der div. checklen ob y == 0 ist weil wenn das der Fall ist gibts nen error oder du machst es meiner meinung nach eleganter mit try....catch

8

Saturday, June 9th 2007, 4:24pm

hey ho, habt ganz lieben dank für die superschnellen antworten!
ok also ohne das getchar() funzt es, was mir jetz ein kleines rätsel ist, weil meine dozentin das explizit mit reingenommen hat mit der begründung, dass sonst die eingabetaste auch als zeichen ausgewertet werden würde und das von getchar unterbunden wird... aber da es ohne funktioniert, glaub ich einfach mal, dass ihr recht habt :)
und zur switch anweisung... die hatten wir noch nich, also ich hab mir das schon durchgelesen, aber ich denke die aufgabe hat sie jetz wirklich gestellt, damit wir den unterschied zw continue und break sehen - ich bemerke hier mal am rande, dass ich nur den kurs "einführung in die programmierung" belege und ich somit erst ein paar wochen lulli C mache *g.
so das mit dem highlight tut mir leid, ich hab mich vorhin erst angemeldet und bin jetz noch nich vertraut mit dem forum... und jaaaaa, die struktur is da bei mir, is nur durchs kopieren nich so schön geworden, ich fands jetz auch nich so komplex, das ich das hätte nochmal ändern wollen.
für den fall dass y=0 is, mach ich noch, wollt nur erstmal zwischentesten und da da ja schon nix ging, hab ich das erstmal hinten angestellt... aber von try catch hab ich wirklich noch nichts gehört...

also habt ganz vielen dank für eure hilfe!!!

9

Saturday, June 9th 2007, 4:25pm

aso: fflush(stdin) hatten wir auch noch nich *g

10

Saturday, June 9th 2007, 4:43pm

aja
die ausgabe von Programm beendet ist unnötig sieht man eh nicht :D

außer du setzt ein Sleep(ms) [windows.h includen] damit kannst du timen wie lange er einfrieeren soll das setzt nach der ausgabe vor dem return

oder mit anderen möglichkeiten...

EDIT: Das mit dem Highlightning ist dir verziehen :D

11

Saturday, June 9th 2007, 8:40pm

Quoted from ""Donasa""

aja du solltest unbedingt noch bei der div. checklen ob y == 0 ist weil wenn das der Fall ist gibts nen error oder du machst es meiner meinung nach eleganter mit try....catch


Division durch 0 gibt doch keine C++ - Exception ... da kannst du dann nichts mit catch() machen ...

Wenn ich diese IEEE75? richtig verstanden habe dürfte das ergebniss einer Division durch 0 NaN sein ... möglicherweise gibts dann beim printf() einen Laufzeitfehler

12

Saturday, June 9th 2007, 8:43pm

aber du kannst mit try... catch auch ne allgemeine Ausnahme machen und wenn du sie nur bei der div hast is es ja so ziemlich des gleiche oder ;)

13

Saturday, June 9th 2007, 8:56pm

Du kannst ja eigene Fehlerklassen erzeugen und deren Objekte werfen.

14

Saturday, June 9th 2007, 9:07pm

ok jetzt versteh ich was ihr meint.

Ein bischen overengineering vielleicht aber eine saubere Lösung :D

Social bookmarks