Taschenrechner mit umgekehrter polnischer Notation



  • Als Ausgabe bekomme ich leider nur eine Endlosschleife. Kann mir jemand sagen, wo ich den Fehler reingebaut habe und vor Allem wie es richtig lauten muss?
    Die "stack.h" verweist auf eine Standardfunktion push() und pop() die ich mir geschrieben habe um einen LIFO-Stack zu simulieren. Diese funktionieren einwandfrei, da kann der Fehler also nicht liegen.

    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include "stack.h"
    
    int main() {
    
    char calc[100], ein[100];
    int i;
    int pos;
    int erg = 0;
    int temp;
    
     printf("Bitte geben Sie eine Rechenaufgabe ein in umgekehrter polnischer Notation \nein (z.B. '1 2 - 4 5 + *')\n");
     fgets(calc, 100, stdin);
    
    printf("\nIch komme bis zur Eingabe\n");
    while (calc[0] != '\0')
       { //solange der String nicht leer ist, tue:
    printf("\nIch komme bis zur 1.FOR");
      	for (i = 0;calc[i] != '\0'; i++)
         {
       	  if (calc[i] == ' ')//Wenn Zahl oder Rechenzeichen "aus"
           {
     	    pos = i - 1;
      	  	break;
           } //End if
         }//End for
    
    printf("calc= %s\n",&calc);
    printf("\nIch komme bis zur 2.FOR");
    
       for (i = 0; i <= pos; i++)
         {
         ein[i] = calc[i]; //Zwischenspeichern des Argumentes
         }
        ein[pos+1]='\0';
    
    printf(" ein= %s\n",&ein);
    printf("\nIch komme bis zur 3.FOR\n");
    
        for (i = 0; calc[i] != '\0'; i++)
         {
         calc[i] = calc[i + pos + 1];
         }
    
        calc[i + 1] = '\0';
    
    printf(" calc= %s\n",&calc);
    printf("\nIch komme bis zur Berechnung \n");
        //Berechnungsteil:
        switch (ein[0])
         {
          case '+': erg = pop() + pop();
          push(erg);
           break;
          case '-': erg = pop() - pop();
          push(erg);
           break;
          case '*': erg = pop() * pop();
          push(erg);
           break;
          case '/': erg = pop() / pop();
          push(erg);
           break;
          default: temp = atoi(ein);
          push(temp); //Zurückschreiben
         }
    
     }//End while
     // CLS
      printf("\n Ergebnis = %d", erg);
    
    system("PAUSE");
    return (0);
      }
    

    Dankeschhön im voraus für eure Hilfe!



  • Arrgh schrieb:

    Als Ausgabe bekomme ich leider nur eine Endlosschleife. Kann mir jemand sagen, wo ich den Fehler reingebaut habe und vor Allem, wie es richtig lauten muss?

    Am Einfachsten ist es wohl, dass Du meine Variante mit Deinem Programm vergleichst. (An sich hab ich nichts großartig verändert, lediglich bei der Rechnung mit den Indizes hat offenbar dies und das nicht gestimmt.)

    Achtung: Es kommt bei Deiner derzeitigen Lösung s e h r auf das korrekte Eingabeformat an: Die Zahlen bzw. Operatoren müssen jeweils durch ein space getrennt sein, und auch am Schluss m u s s ein space stehen. ⚠ (Is Dein Algorithmus, ich hab das nicht verbrochen... 😉

    Daher mein Vorschlag: Stell das sicher, bevor Du den Eingabestring weiter verarbeitest. Im Wesentlichen müssen nur aufeinander folgende <Spaces> durch genau eines ersetzt, und am Schluss gegebenenfalls eins angehängt werden.

    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    
    int pop(void)  // Nur für Test!!!
    {
    	return 3;
    }
    
    void push(int wert)  // Nur für Test!!!
    {
    	printf("push: [%i]\n", wert);
    }
    
    int main(void)
    {
    	char calc[100], ein[100];
    	int i;
    	int pos;
    	int erg = 0;
    	int temp;
    
    	printf("Bitte geben Sie eine Rechenaufgabe in umgekehrter polnischer Notation \n(z.B. '1 2 - 4 5 + * ') ein: ");
    	fgets(calc, 100, stdin);
    
    	calc[strlen(calc)-1] = '\0';   // um das '\n' zu überschreibeb
    
    	/* Hier muss noch was rein, so dass immer
    	 *
    	 * <datum/op><space><datum/op><space><datum/op><space>
    	 *
    	 * gewährleistet ist.
    	 */
    
    	printf("\nIch komme bis zur Eingabe\n");
    	while (calc[0] != '\0')   // solange der String nicht leer ist, tue:
    	{
    		printf("\nIch komme bis zur 1. FOR\n");
    
    		for (i = 0; calc[i] != '\0'; i++)
    		{
    			if (calc[i] == ' ')   // Wenn Zahl oder Rechenzeichen "aus"
    			{
    				pos = i;
    				break;
    			}
    		}
    		printf("calc = [%s]\n", calc);
    
    		printf("\nIch komme bis zur 2. FOR\n");
    
    		for (i = 0; i < pos; i++)
    		{
    			ein[i] = calc[i]; //Zwischenspeichern des Argumentes
    		}
    		ein[pos] = '\0';
    		printf("ein = [%s]\n", ein);
    
    		printf("\nIch komme bis zur 3. FOR\n");
    
    		int j = 0;
    		for (i = pos + 1; calc[i] != '\0'; i++)
    		{
    			calc[j] = calc[i];
    			j++;
    		}
    		calc[j] = '\0';
    		printf("calc = [%s]\n", calc);
    
    		printf("\nIch komme bis zur Berechnung\n");
    
    		//Berechnungsteil:
    		switch (ein[0])
    		{
    			case '+':
    				erg = pop() + pop();
    				push(erg);
    				break;
    			case '-':
    				erg = pop() - pop();
    				push(erg);
    				break;
    			case '*':
    				erg = pop() * pop();
    				push(erg);
    				break;
    			case '/':
    				erg = pop() / pop();
    				push(erg);
    				break;
    			default:
    				temp = atoi(ein);
    				push(temp); //Auf den Stack
    		}
    	} //End while
    
    	// CLS
    
    	printf("\nErgebnis = %d\n\n", erg);
    
    	system("PAUSE");
    	return 0;
    }
    

    P.S. Die Division durch 0 solltest Du auch verhindern/abfangen! ⚠



  • Danke dir für deine Hilfe! Jetzt hauts hin! Bin gestern schon verzweifelt.
    Das mit der Eingabe war so verlangt. Den Algorithmus war auch gewollt! 🙂


Anmelden zum Antworten