如何用c语言设计一个算术表达式的程序?

箭头指向的那个1是必须要的吗?为什么要有那个1呢?是不是我在输入一个算入表达式时在输入符号时会把后面输入的数字一并作为字符输入,造成scanf函数缺少参数

img

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7480303
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:细节:使用scanf函数输入数据时的注意事项,若使用不当会导致程序进入死循环。
  • 除此之外, 这篇博客: c语言中的输入输出函数之scanf函数中的 格式字符串中存在普通字符 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 普通字符说白了就是在两个格式指令间输入一些键盘中的其他字符。
    正常而言,当输入两个甚至以上数据的时候,我们都是输入完一个,按一次回车,再输下一个,且代码如下:

    scanf("%d%d",&a,&b);
    

    两个%d间没有任何东西,所以回车输入下一个数据。但近几次我发现,它还可以这么用:
    当输入多个数据时,两个格式指令间可以加一些符号,只不过,你加了什么符号,到时候从键盘输入的时候也需要加同样符号。(有点懵懵的,对吧,不怕,接下来,我举举例子就都清晰了)
    eg:

    scanf("%d;%d",&a,&b);
    //两者之间有个分号,所以输入的时候,输入完第一个数据后,输入一个分号,然后输入第二个数据,再回车。
    //假设:此时键盘输入为8;7(一定不要忘记那个分号)
    scanf("%d %d",&a,&b);
    //此时从键盘输入为8 7
    

    所以你前面格式指令间用到什么符号,则后续从键盘输入的时候也需要输入相关符号,这样才可以和后面地址对应起来!!!!

  • 您还可以看一下 张景平老师的C语言零基础入门(计算机二级考试)课程中的 06-16 scanf函数特殊用法小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    回答:

    C语言可以通过设计一个简单的算术表达式计算器,实现用户输入一个算术表达式,程序能够自动计算出该表达式的结果。

    设计该程序的步骤如下:

    1.定义存储表达式的字符数组和操作数栈,以及栈顶指针。

    2.初始化操作数栈和栈顶指针。

    3.输入算术表达式。

    4.遍历表达式的每个字符,对于数字字符,将其转换为数字并入栈,对于运算符,从栈中弹出两个操作数进行运算,将结果入栈。

    5.最终栈顶元素即为表达式的计算结果。

    代码实现如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    #define MAX_EXPR_LEN 100
    
    int op_stack[MAX_EXPR_LEN]; // 操作数栈
    int top = -1; // 栈顶指针
    
    int is_operator(char c) {
      return c == '+' || c == '-' || c == '*' || c == '/';
    }
    
    int pop() {
      if (top < 0) { // 栈空
        printf("Error: stack underflow\n");
        exit(1);
      }
      return op_stack[top--];
    }
    
    void push(int x) {
      if (top >= MAX_EXPR_LEN - 1) { // 栈满
        printf("Error: stack overflow\n");
        exit(1);
      }
      op_stack[++top] = x;
    }
    
    int main() {
      char expr[MAX_EXPR_LEN];
      printf("请输入算术表达式:\n");
      scanf("%s", expr);
      for (int i = 0; expr[i]; i++) {
        if (isdigit(expr[i])) {
          int num = 0;
          while (isdigit(expr[i])) {
            num = num * 10 + (expr[i] - '0');
            i++;
          }
          i--; // 因为后面还要对 i 进行自增,所以这里需要先减一
          push(num);
        } else if (is_operator(expr[i])) {
          int a = pop();
          int b = pop();
          switch (expr[i]) {
            case '+':
              push(b + a);
              break;
            case '-':
              push(b - a);
              break;
            case '*':
              push(b * a);
              break;
            case '/':
              push(b / a);
              break;
          }
        } else {
          printf("Error: illegal character '%c'\n", expr[i]);
          exit(1);
        }
      }
      if (top != 0) { // 操作数栈中除了栈顶元素外还有其它元素
        printf("Error: illegal expression\n");
        exit(1);
      }
      printf("表达式的计算结果为:%d\n", op_stack[top]);
      return 0;
    }
    

    对于第二个问题,不需要在输入表达式时输入箭头指向的那个数字1,因为箭头只是表示当前输入的位置,不是表达式的一部分。在输入算术表达式时,如果输入了符号,不会造成scanf函数参数不足的问题,因为scanf会自动跳过空白字符(包括空格、制表符和换行符),只读入有效数据。

    至于第三个问题,可以使用上述代码中的错误处理机制来避免scanf函数的错误。如果scanf返回的值不等于应该读入的数据项数,说明输入的数据项数和格式有误,程序需要继续等待用户重新输入数据并清除输入缓冲区。可以使用while循环反复进行读入和判断,直到用户输入正确为止。示例如下:

    double x, y;
    int ret;
    do {
      printf("请输入两个数,以空格或换行符分隔:");
      ret = scanf("%lf%lf", &x, &y);
      while (getchar() != '\n'); // 清除输入缓冲区
    } while (ret != 2); // 重复读入,直到成功读入两个数
    printf("您输入的两个数分别为 %.2f 和 %.2f\n", x, y);