1. 程式人生 > >利用棧求表示式的值,可供小學生作業,並能給出分數

利用棧求表示式的值,可供小學生作業,並能給出分數

設計一個系統,能夠計算使用者輸入的代數表示式(混合四則運算),並能接收使用者自己輸入的運算結果同時給出使用者計算正確與否的判斷,具體要求如下:
1.使用者迴圈輸入不通的算術表示式(每個表示式以“#”結束),程式利用棧求解各個表示式的值;
2.程式每計算完一個表示式,就要求使用者輸入自己的答案,並與程式運算結果比較,同時統計總題數和使用者計算正確的題數;
3.使用者輸入“$”表示整個運算結束,此時要求程式給出使用者的得分(用百分制表示,為使用者計算正確的題數佔總題數的百分比)。

【下了一個DEV C++,檔案——>新建——>原始碼——>F9

#include "stdio.h"
#include "stdlib.h"
char s[50];
int tops;
float d[100];
int topd;
char number[10];
int num;
char c;
float ans[50];
float yours[50];
int count=0;
int right=0;
int token[7][7]={{1,1,-1,-1,-1,1,1},
                 {1,1,-1,-1,-1,1,1},
                 {1,1,1,1,-1,1,1},
                 {1,1,1,1,-1,1,1},
                 {-1,-1,-1,-1,-1,0,2}, 
                 {1,1,1,1,2,1,1},
                 {-1,-1,-1,-1,-1,2,0}};
                 
int change(char x)
{
    switch(x)
    {
       case '+': return 0;
       case '-': return 1;
       case '*': return 2;
       case '/': return 3;
       case '(': return 4;
       case ')': return 5;
       case '#': return 6;
    }
}
void calculate()
{
     float a,b;
     b=d[--topd];
     a=d[--topd];
     switch(s[--tops])
     {
        case '+': d[topd++]=a+b;return;
        case '-': d[topd++]=a-b;return;
        case '*': d[topd++]=a*b;return;
        case '/': d[topd++]=a/b;return;
     }
}
int expression()
{
    int i,j;
    tops=0;
    s[tops++]='#';
    topd=0;  
    //c=getchar();
    while(c!='#'||s[tops-1]!='#')
    {
       num=0;
       if(c>='0'&&c<='9')
       {
          do
          {
             number[num++]=c;
             c=getchar();
          }while(c>='0'&&c<='9');
          number[num]='\0';
          d[topd++]=atof(number);
       }
       else
       {
           j=change(c);
           i=change(s[tops-1]);
           switch(token[i][j])
           {
              case -1: s[tops++]=c;
                       c=getchar();
                       break;
              case  0: tops--;
                       c=getchar();
                       break;
              case  1: calculate();
                       break;
           }
       }
    }
    ans[count]=d[topd-1];
    printf("請輸入您計算的結果:");
        scanf("%f",&yours[count++]); 
    if(ans[count-1]==yours[count-1]) right++;
    //printf("%d",d[topd-1]);
    getchar();
}
int main()
{
    int i;
    printf("   ------計算表示式------\n使用說明:\n"); 
    printf(" 1.請輸入要計算的表示式,以#結尾,例如1+2#\n");
    printf(" 2.結束計算請輸入符號$\n");
    printf(" 3.在表示式中可以運算括號,中括號[]和大括號{}統一使用小括號代替()!\n"); 
    printf(" 4.程式輸入格式錯誤時,將會自動結束程式,請注意格式正確!\n");
    printf("請輸入要計算的表示式,以#結尾。結束程式輸入$。\n");
    c=getchar();
    while(c!='$')
      {
        
        expression(); 
        printf("-------------------------------------------\n"); 
        printf("請輸入下一個表示式,以#結尾。結束程式輸入$。\n");    
        c=getchar();       
      }
    printf("\n\n      ******您的成績單*******\n");
    printf("----------------------------------------\n");
    printf(" 序 號     正確答案    您的答案   結 論\n");
    for(i=0;i<count;i++)
    printf("表示式%d     %.2f        %.2f      %s\n",
              i+1,ans[i],yours[i],ans[i]==yours[i]?"正確!":"錯誤!");
    printf("----------------------------------------\n");
    printf("解答題目總共為%d道,其中\n",count);
    printf("正確解答%d道題,錯誤解答%d道題。\n      *****最後得分為%d分!*****\n",
           right,count-right,right*100/count); 
    printf("----------------------------------------\n");
    getchar();
    getchar();
}