2015-10-14 68 views
1

被問到的問題是評估RPN表達式,並將=作爲序列的終止字符,以便程序運行RPN並計算給出的表達式。所以我遇到一些麻煩是理解我應該如何將字符轉換爲整數,如指令特別指出的那樣使用scanf(「%c」,& ch),它將輸入作爲字符而不是整數。如何將我的角色轉換爲整數,以便我可以將它們推送到數組並相應地對它們執行操作?逆向波蘭語表示法疑難解答C

// 
// input: 1 2 3 * + = 
// output: 7 
// 

#include <stdio.h> 
#include <stdlib.h> 
int collection[100]; 
int top; 

void push(double v){ 
    if (top>99) 
    { 
     printf ("Stack Overflow\n"); 
     exit(0); 
    } 
    collection[++top]=v; 
} 
double pop(){ 
    double v; 
    if(top < 0) 
    { 
     printf("stack underflow\n"); 
     exit(0); 
    } 
    v=collection[--top]; 
    return v; 

} 

int main(void){ 
    char ch; 
    double a,b,c,sum; 
    int i; 
    top=-1; 

    printf("Enter an RPN expression: "); 
    while(ch!='='){ 
     scanf("%c", &ch); 
     i=0; 
     c=1; 
     push(ch); 
     if(collection[i]=='+'){ 
      a=pop(); 
      b=pop(); 
      c=b+a; 
      push(c); 
     } 
     else if(collection[i]=='-'){ 
      a=pop(); 
      b=pop(); 
      c=b-a; 
      push(c); 
     } 
     else if(collection[i]=='*'){ 
      a=pop(); 
      b=pop(); 
      c=b*a; 
      push(c); 
     } 
     else if(collection[i]=='/'){ 
      a=pop(); 
      b=pop(); 
      c=b/a; 
      push(c); 
     } 
     else{ 
      while(collection[i]!=0){ 
       i++; 
      } 
      i=i-1; 
      sum=0; 
      while(i>=0){ 
       sum=sum+((collection[i]-48)*c); 
       c=c*10; 
       i--; 
      } 
      push(sum); 
     } 
    } 
    printf("%lf\n",c); 
} 
+1

標題和代碼都與問題無關。如果您需要幫助將字符轉換爲整數,請在標題中說明。順便說它是波蘭語,而不是「極地」。 –

+0

當您推入堆棧(或附加到數組)時,首先訪問數組,然後遞增:'arr [n ++]'。當你彈出堆棧時,你減少fisrt,然後訪問數組。 'ARR [ - n]的'。這是因爲'n'是數組之外的索引。你有前錯誤的。 –

+0

請注意''printf(「%lf \ n」,c);''其中'c'屬於'char'類型會導致不快樂; '%lf'轉換規範需要一個'double'參數,而不是'int'(這是'char'值將被提升到的類型)。 –

回答

0

如果滿意unsigned int類型的數字:

char ch; 
scanf("%c", &ch); 
ch -= '0'; 

然後你就可以撰寫數字中的數字乘以10並添加下一位數字。

0
使用

double atof(const char *nptr);

atof()的函數轉換字符串的初始部分指出 由nptrdouble。儘管你的計算機命令編程結構很糟糕。使用單獨的功能爲每個任務的算法,以避免併發症

這裏是(一些)我RPN計算器:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include "cal.h" 
#define MAXOP 100 

int main(){ 

    int type; 
    double op2,op3; 
    char s[MAXOP]; 

    while((type = getop(s)) != EOF){ 
     switch(type){ 
     case NUMBER: 
      push(atof(s)); 
      break; 
     case 'x': 
      op2 = pop(); 
      op3 = pop(); 
      push(op2); 
      push(op3); 
      break; 
     case 'o': 
      clear(); 
      break; 
     case 's': 
      push(sin(pop())); 
      break; 
     case '+': 
      push(pop() + pop()); 
      break; 
     case '*': 
      push(pop() * pop()); 
      break; 
     case '-': 
      op2 = pop(); 
      push(pop() - op2); 
      break; 
     case '/': 
      op2 = pop(); 
      push(pop()/op2); 
      break; 
     case '%': 
      op2 = pop(); 
      push((int)pop() % (int)op2); 
      break; 
     case '\n': 
      printf("\t%.4g\n",showtop()); 
      break; 
     default: 
      printf("What was that?\n"); 
      break; 
     } 
    } 

    return 0; 
} 
+0

大聲笑「我的一些」反正真的dat!謝謝@Jonathan Leffler – 2015-10-14 06:40:08