2016-08-05 15 views
0

Ich versuche ein C-Programm zur Auswertung von Postfix-Ausdrücken zu erstellen und dabei wird ein unerwünschtes Symbol auf dem Bildschirm für den Eingang 45+ gedruckt. P.S. Bitte sagen Sie mir den Fehler (außer dass gets() ich jetzt studiere, wie fgets verwenden())Unerwünschtes Symbolergebnis bei der Auswertung von Postfix-Ausdruck

// to Evaluate a postfix expression 
#include<stdio.h> 
#include<conio.h> 
int is_operator(char); 
void answer(); 
char stack[100]; 
int top =-1; 
void push(char); 
char pop(); 
void main() 
{ 
char postfix[100],item; 
int i=0; 
clrscr(); 
printf("Enter Postfix Expression"); 
gets(postfix); 
while(postfix[i]!='\0') 
    { 
    item=postfix[i]; 
    if(is_operator(item)==2) 
     { 
     push(item); 
     } 
    if(is_operator(item)==1) 
     { 
     char op; 
     int n1,n2,n3; 
     op=item; 
     n1=pop(); 
     n2=pop(); 
     switch(op) 
     { 
      case '+': 
      n3=n1+n2; 
      case '-': 
      n3=n1-n2; 
      case '*': 
      n3=n1*n2; 
      case '/': 
      n3=n1/n2; 
     } 
     push(n3); 
     } 
    i++; 
    }//end while 
answer(); 
getch(); 
} 
void push(char c) 
{ 
top++; 
stack[top]=c; 
} 
char pop() 
{ 
char c; 
c=stack[top]; 
top--; 
return(c); 
} 
int is_operator(char i) 
{ 
char ch=i; 
if(ch=='+'||ch=='-'||ch=='*'||ch=='/') 
    { 
    return(1); 
    } 
else 
    { 
    return(2); 
    } 
} 
void answer() 
{ 
char ans; 
ans=stack[top]; 
printf("Answere is %c",ans); 
} 
+0

Könnten Sie hiermit auch die aktuelle Ausgabe und erwarteten Ausgang anschließen? (durch Bearbeiten Ihrer Frage) –

+1

Wenn Sie noch nie einen Debugger benutzt haben, ist jetzt der richtige Zeitpunkt. Mit einem Debugger können Sie Zeile für Zeile durch den Code gehen und gleichzeitig Variablen und deren Werte und deren Änderung verfolgen. Auf diese Weise sollten Sie leicht herausfinden können, wo es passiert und hoffentlich auch warum. –

+0

Current Output ist unerwünschtes Symbol wie ein Smileysgesicht Und Wanted Output ist 9 @JonnyHenly – user6547375

Antwort

0

Die Probleme, die ich mit Ihrem Code zu sehen sind: Ihre switch()break Aussagen über die einzelnen case fehlt Klauseln (und ein default Fall könnte auch nett sein); Wenn Sie Ihre Nicht-Operatoren (auch single digits) auf den Stapel schieben, drücken Sie sie als Zeichencodes und wandeln sie dann in Zahlen um, so dass die Mathematik keinen Sinn ergibt. Sie behandeln die Reihenfolge der nicht-kommunikativen Operationen wie Subtraktion und Division nicht richtig (verwenden Sie den Befehl Unix dc als Vergleichswerkzeug); schließlich, erfinden Sie Booleans nicht neu. Nachfolgend finden Sie eine Nachbesserung des Codes mit den oben genannten Änderungen und einigen Stil Anpassungen:

// Evaluate a postfix expression 

#include <ctype.h> 
#include <stdio.h> 
#include <stdbool.h> 

char stack[100]; 
int top = -1; 

void push(char); 
char pop(void); 
bool is_operator(char); 
void answer(void); 

void push(char c) 
{ 
    stack[++top] = c; 
} 

char pop() 
{ 
    return stack[top--]; 
} 

bool is_operator(char op) 
{ 
    return (op == '+' || op == '-' || op == '*' || op == '/'); 
} 

void answer() 
{ 
    printf("Answer is %d\n", stack[top]); 
} 

int main() 
{ 
    char item, postfix[100]; 
    int i = 0; 

    printf("Enter Postfix Expression: "); 

    gets(postfix); 

    while ((item = postfix[i++]) != '\0') 
    { 
     if (is_operator(item)) 
     { 
      char n1 = pop(); 
      char n2 = pop(); 
      char n3 = 0; 

      switch (item) 
      { 
       case '+': 
        n3 = n1 + n2; 
        break; 
       case '-': 
        n3 = n2 - n1; 
        break; 
       case '*': 
        n3 = n1 * n2; 
        break; 
       case '/': 
        n3 = n2/n1; 
        break; 
      } 

      push(n3); 
     } else if (isdigit(item)) { 
      push(item - '0'); 
     } 
    } // end while 
    answer(); 

    return 0; 
} 

Beispiel (beachten Sie nur diese Auswerter auf einstellige Zahlen arbeitet):

> ./a.out 
Enter Postfix Expression: 6 4 - 7 * 1 + 
Answer is 15 
> dc 
6 4 - 7 * 1 + p 
15 
+0

Warum gibt man in der Funktion is_operator einen Operator (op) zurück, während der Rückgabetyp int ist In der Antwortfunktion haben Sie% d verwendet, da das Stack-Array vom Typ Zeichen ist. – user6547375

+0

@ user6547375, 'is_operator()' gibt keinen Operator zurück, es gibt * true * oder * false * zurück, wie wir es von einer Funktion erwarten würden, die mit 'is_' beginnt, d. H. Eine Frage stellt. Um dies deutlicher zu machen, habe ich die stdbool-Bibliothek hinzugefügt und den Rückgabetyp in 'bool' geändert. Das Stack-Array besteht aus Zahlen, sie sind zufällig signierte 8-Bit-Nummern, die als "char" deklariert sind. Beim Drucken des Ergebnisses auf dem Stapel wollen wir die Zahl, die sich aus der Berechnung ergibt, '% d', nicht das ASCII-Zeichen '% c', das diesem Ergebnis entspricht. – cdlane

1

viele Fehler gibt es in Ihr Code. Versuchen Sie, den Cast korrekt zu tippen.

Gehen Sie durch Kommentare, um die Fehler zu verstehen.

Gehen Sie durch this für das Verständnis von Zeichenzeiger und Arrays.

// ein Postfix Ausdruck

#include<stdio.h> 



int is_operator(char); 
void answer(); 
int stack[100];//Use integer array since operands are integer 
int top =-1; 
void push(int);//Arguments changed to integer type since the stack is integer 
int pop(); //Return type to integer 
void main() 
{ 
char* postfix;//Use character pointer for iterating through loop smoothly 
int item; 
int i=0; 

printf("Enter Postfix Expression"); 
gets(postfix); 
char c; 

while(*postfix!='\0') 
    { 
    c=*postfix; 
    if(is_operator(c)==2) 
     { 
     push((c-'0')); //Converting char to int before pushing it into the stack 
     } 
    if(is_operator(c)==1) 
     { 


     char op; 
     int n1,n2,n3; 
     op=*postfix; 
     n1=pop(); 
     n2=pop(); 
     switch(op) 
     { 
      case '+': 
      n3=n1+n2; 
      break; 
      case '-': 
      n3=n1-n2; 
      break; 
      case '*': 
      n3=n1*n2; 
      break; 
      case '/': 
      n3=n1/n2; 
      break; 
     } 
     push(n3); 
     } 
    postfix++; 
    }//end while 
answer(); 

} 
void push(int c) 
{ 
top++; 
stack[top]=c; 
} 
int pop() 
{ 
int c; 
c=stack[top]; 
top--; 
return(c); 
} 
int is_operator(char i) 
{ 
char ch=i; 
if(ch=='+'||ch=='-'||ch=='*'||ch=='/') 
    { 
    return(1); 
    } 
else 
    { 
    return(2); 
    } 
} 
void answer() 
{ 
char ans; 
ans=stack[top]; 
printf("Answere is %d",ans); 
} 

ich es hilfreich ist, hoffe zu Bewerten ....