使用 C 的多运算符计算器

问题描述

我想做一个需要 3+4/4*6 输入的计算器,我需要用 C 编程来编写它。我将数字和操作与用户分开,然后将数字和运算符放在单独的数组中。然后我想分别循环遍历数组来执行操作 - 我知道不考虑运算符优先级 - 但它根本没有给我正确的结果。为了确定运算符,我首先使用 switch case 然后尝试了 If 语句,但它们都给出了错误的结果。我要分享他们两个。我如何重新排列此代码以获得正确的结果?

正确的结果是指例如 3+4/1*8 = 56

解决方法

你的程序有很多问题。当您启用警告时,您可以了解其中的一些。

扫描输入:您的数据输入如下所示:

int *number_in;

scanf("%d",&number_in);

这是不对的。您的输入是一个整数,一个 int,而不是一个指向 int 的指针。

int number_in;

读取输入时,扫描函数必须能够修改number_in。一种方法是返回扫描的数字,但 scanf 可以读取多个输入,因此它选择返回一个值来告诉您扫描是否成功。所以 scanf 必须通过其他方式存储扫描的数据:必须传递一个指向要扫描的数据的指针。运算符 &number_in 创建这样一个指针:

scanf("%d",&number_in);      // like above,but now on a correct number_in

您还应该检查结果,“1 项已读”为 1,“未读”为 0,“输入结束”为 EOF,例如当用户按下 Ctrl-D 或Ctrl-Z。 “Nothing read”表示有输入,但不能转换为数字,例如“四”。在这种情况下,next scanf 在无法识别的输入之前开始,这可能会导致语法错误。

字符串与字符:C 区分单引号和双引号。双引号将字符串括起来,即指向字符数组第一个字符的指针。您不会在您的程序中使用它们。

相反,您使用字符。符号 '+' 表示加号的字符代码。在 ASCII 中是 43。

计算:计算结果的方式也存在问题。您有两个独立的数组,一个用于数字,一个用于运算符。很明显,索引 2 * loop 可能会越界。索引 2*loop -1 将超出第一个数字的范围。这很糟糕。

另一个问题是你总是对两个相邻的数字进行操作,但这不是你想要的。例如,如果您的输入是 2*3+1,您首先计算 2 × 3,这是可以的,然后您计算 3 + 1,这是不行的:您要在这里计算 6 + 1。

例如:

    8 * 3 / 4 + 5
       24 / 4 + 5
            6 + 5
               11 == result!

你的循环应该是这样的:

result = numbers[0];
        
for(loop = 1; loop < number_entry;loop++){
    switch (ops[loop -1]) {
    case '+':   result = result + numbers[loop]; break;
    case '-':   result = result - numbers[loop]; break;
    case '*':   result = result * numbers[loop]; break;
    case '/':   if (numbers[loop] == 0) {
                    puts("Division by zero!");
                    exit(1);
                }            
                result = result / numbers[loop]; break;
    default:    printf("Bad operator '%d'.\n",ops[loop -1]);
    }        
}

所以,请打开警告。他们会告诉您一些简单的错误,例如 scanf/printf 格式说明符与数据之间的类型不匹配或不匹配。

然后尝试通过逐步执行代码来识别算法问题 - 在调试器中,使用额外的 printf 或在打印输出上使用铅笔。