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

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


评论 4 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

相思比梦长

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值