Taschenrechner in C



  • Hallo,

    ich wollte einen Taschenrechner programmieren wo man einen kompletten string angeben kann und dieser dann ausgrechnet wird.

    #include <stdio.h>
    #include <string.h>
    
    main() {
    
    	double a = 0.00, b = 0.00;
    	char string1[20], string2[20], eingabe[20], operator;
    	int i=0, j=0, u=0;
    
    	printf_s("---Taschenrechner---\n");
    	printf_s("\nGeben Sie einen Term an: ");
    	gets(eingabe);
    
    	while (eingabe[i] != '+' && eingabe[i] != '-' && eingabe[i] != '*' && eingabe[i] != '/') {
    
    		string1[u] = eingabe[i];
    		i++;
    		u++;
    	}
    
    	operator=eingabe[i];
    
    	while (eingabe[i] > 0) {
    
    		if (eingabe[i] != '+'){
    		string2[j] = eingabe[i];
    		i++;
    		j++;
    	}
    		else{
    			i++;
    		}
    	}
    
    	string1[u] = '\0';
    	string2[j] = '\0';
    
    	a = atof(string1);
    	b = atof(string2);
    
    	switch (operator) {
    
    	case '+':
    
    		printf_s("\nDas Ergebniss lautet: %.2f\n", a + b);
    		break;
    
    	case '-':
    
    		printf_s("\nDas Ergebniss lautet: %.2f\n", a - b);
    		break;
    
    	case '*':
    
    		printf_s("\nDas Ergebniss lautet: %.2f\n", a * b);
    		break;
    
    	case '/':
    
    		printf_s("\nDas Ergebniss lautet: %.2f\n", a / b);
    		break;
    
    	default : 
    
    		printf_s("\nFehler\n");
    		break;
    
    	}
    	system("PAUSE");
    
    	return(0);
    }
    

    Das Problem ist aber, dass a und b nicht die gewünschten Werte erhalten sondern immer noch gleich 0 sind.

    Ich bedanke mich schon im Voraus für die Hilfe. 🙂



  • Dann laß dir doch mal string1 und string2 sowie a und b ausgeben.

    PS: gets solltest du ganz schnell aus deinem Programm verbannen (Stichwort: buffer overflow)! Nutze stattdessen entweder fgets oder aber scanf.



  • string1 und string2 besitzen beide die richtigen Werte. a und b bleiben aber 0.


  • Global Moderator

    Schuss ins Blaue: Du hast so etwas wie "1,2 + 4,5" eingegeben.

    Die Zeilen 15-42 kannst du praktisch komplett und besser durch ein einfaches

    scanf("%lf %c %lf", &a, &operator, &b);
    

    ersetzen.



  • Die Zeilen 15-42 kannst du praktisch komplett und besser durch ein einfaches

    scanf("%lf %c %lf", &a, &operator, &b);
    

    ersetzen.[/quote]

    Wenn ich die Zeile einsetzte bekomme ich nachdem ich den string eingegeben habe die Nachricht "Taschenrechner.exe hat einen Haltepunkt ausgelöst." und es verweist mich in stdio.h zur Zeile "return __stdio_common_vfscanf(".


  • Global Moderator

    Zeig doch mal bitte den Code (Copy&Paste) und deine Eingabe, die zum besagten Ergebnis führt (ebenfalls Copy&Paste).



  • Und schreib uns, welche Eingabenstring du benutzt (so wie SeppJ schon geschrieben hat, darfst du bei Zahlen kein Komma sondern mußt das US-englische Äquivalent '.' angeben - außerdem dürfen bei atof auch keine Leerzeichen da drin enthalten sein).

    Ein Taschenrechner wird zwar häufig als Einstiegsbeispiel genommen, aber gerade bei der Auswertung der Eingabe hat C so seine Tücken - die man erstemal lernen muß ;-).


  • Global Moderator

    Th69 schrieb:

    Ein Taschenrechner wird zwar häufig als Einstiegsbeispiel genommen, aber gerade bei der Auswertung der Eingabe hat C so seine Tücken - die man erstemal lernen muß ;-).

    Der von mir gezeigt scanf sollte eigentlich narrensicher sein, deshalb bin ich gerade schwer verwirrt, was David B da falsch gemacht haben könnte. Meinen Formatstring würde ich auch nicht gerade tückisch nennen.

    Wenn man es natürlich so versucht, wie David B es zuerst selber versucht hat, das ist außerordentlich tückisch.



  • SeppJ schrieb:

    Zeig doch mal bitte den Code (Copy&Paste) und deine Eingabe, die zum besagten Ergebnis führt (ebenfalls Copy&Paste).

    Hier ist nochmal der neue Code:

    #include <stdio.h>
    #include <string.h>
    
    main() {
    
    	double a = 0.00, b = 0.00;
    	char string1[20], string2[20], eingabe[20], operator;
    	int i=0, j=0, u=0;
    
    	printf_s("---Taschenrechner---\n");
    	printf_s("\nGeben Sie einen Term an: ");
    
    	scanf_s("%lf %c %lf", &a, &operator, &b);
    
    	switch (operator) {
    
    	case '+':
    
    		printf_s("\nDas Ergebniss lautet: %.2f\n", a + b);
    		break;
    
    	case '-':
    
    		printf_s("\nDas Ergebniss lautet: %.2f\n", a - b);
    		break;
    
    	case '*':
    
    		printf_s("\nDas Ergebniss lautet: %.2f\n", a * b);
    		break;
    
    	case '/':
    
    		printf_s("\nDas Ergebniss lautet: %.2f\n", a / b);
    		break;
    
    	default : 
    
    		printf_s("\nFehler\n");
    		break;
    
    	}
    	system("PAUSE");
    
    	return(0);
    }
    

    Als string habe ich "12+13" benutzt.



  • Das kommt davon, wenn man das unsägliche scanf_s statt des vernünftigen scanf benutzt.