鱼C论坛

 找回密码
 立即注册
查看: 1949|回复: 1

表达式求值问题

[复制链接]
发表于 2022-5-11 13:43:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
想请教一下各位大佬,下面的代码是只能处理操作数是一位的情况,要怎样修改代码才能处理操作数是小数的情况?

  1. #include <stdio.h>
  2. #include <string.h>
  3. int Compute(char *str);                  /*函数声明,计算表达式str的值*/
  4. int Comp(char str1, char str2);             /*函数声明,比较str1的str2优先级*/
  5. /*此程序只能处理操作数是一位的情况*/
  6. int main()
  7. {
  8.     char str[100];                /*定义尽可能大的字符数组以接收键盘的输入*/
  9.     int result;
  10.     printf("请输入一个表达式:");
  11.     scanf("%s", str); strcat(str, "#");         /*接收键盘输入并加上定界符*/
  12.     result = Compute(str);                 /* result保存计算结果*/
  13.     printf("表达式的值是:%d\n", result);
  14.     getchar(); getchar();
  15.     return 0;
  16. }

  17. int Compute(char *str)
  18. {
  19.     char OPND[100], OPTR[100];             /*定义两个顺序栈*/
  20.     OPTR[0] = '#';                          /*栈OPTR初始化为定界符*/
  21.     int top1 = -1, top2 = 0;             /*初始化栈OPND和OPTR的栈顶指针*/
  22.     int i, k, x, y, z, op;
  23.     for (i = 0; str[i] != '\0'; )                   /*依次扫描每一个字符*/
  24.     {
  25.         if (str[i] >= 48 && str[i] <= 57)          /*数字0的ASCII码是48*/
  26.             OPND[++top1] = str[i++] - 48;          /*将字符转换为数字压栈*/
  27.         else if (str[i] == '(' && str[i+1] == '-')
  28.         {
  29.             OPTR[++top2] = '(';
  30.             OPND[++top1]= 0;
  31.             i++;
  32.         }
  33.         else
  34.         {
  35.             k = Comp(str[i], OPTR[top2]);
  36.             if (k == 1)
  37.                 OPTR[++top2] = str[i++];            /*str[i]的优先级高*/
  38.             else if (k == -1)
  39.             {                     /*str[i]的优先级低*/
  40.                 y = OPND[top1--];              /*从运算对象栈出栈两个元素*/
  41.                 x = OPND[top1--];
  42.                 op = OPTR[top2--];             /*从运算符栈出栈一个元素*/
  43.                 switch (op)                    /*op为字符型,进行相应运算*/
  44.                 {
  45.                     case '+': z = x + y; break;
  46.                     case '-': z = x - y; break;
  47.                     case '*': z = x * y; break;
  48.                     case '/': z = x / y; break;
  49.                     default: break;
  50.                 }
  51.                 OPND[++top1] = z;             /*运算结果入运算对象栈*/
  52.             }
  53.             else
  54.             {                 /*str[i]与运算符栈的栈顶元素优先级相同*/
  55.                 top2--; i++;                    /*匹配str[i],扫描下一个字符*/
  56.             }
  57.         }
  58.     }
  59.     return OPND[top1];               /*运算对象栈的栈顶元素即为运算结果*/
  60. }
复制代码





小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-5-12 10:49:19 | 显示全部楼层
本帖最后由 豆嘉木 于 2022-5-12 10:51 编辑

兄弟注释得太到位了!
我处理小数应该是要重新写一个算小数的函数和一个判断输入的类型的函数
具体咋做我不太清楚,但c应该只能分开做,你要不去csdn问问看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-16 23:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表