带 C 的多运算符计算器

Multi-operator Calculator With 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。一种方法是 return 扫描的数字,但 scanf 可以读取多个输入,因此它选择 return 一个告诉您扫描是否成功的值。所以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 格式说明符和数据之间的类型不匹配或不匹配。

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