利用栈求表达式的值,可供小学生作业,并能给出分数

设计一个系统,能够计算用户输入的代数表达式(混合四则运算),并能接收用户自己输入的运算结果同时给出用户计算正确与否的判断,具体要求如下:
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();
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值