【问题标题】:Multi-operator Calculator With C [closed]带 C 的多运算符计算器 [关闭]
【发布时间】:2021-01-29 11:56:47
【问题描述】:

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

我的意思是正确的结果,例如 3+4/1*8 = 56

【问题讨论】:

  • 您希望number_inoperator_in 的类型为intchar,而不是int *char *:它们是数字,而不是指针。 (但是当你scanf你的输入时,你用&指向它们,这样scanf可以通过它们给这些数字赋值。)
  • 你真的应该在编译时打开警告。例如,您的 ops[x] 是整数,但您将它们与字符串进行比较。用单引号替换双引号 -- 在 C 中,单引号包含字符。您可能还应该在实际计算循环中修改您的索引。
  • @MOehm 当我从 number_in 和 operator_in 中删除指针 * 并从它们的“scanf”中删除 & 时,代码搞砸了 :( 它不起作用
  • @MOehm 修复双引号谢谢
  • 好吧,你应该试着理解这些运算符的作用。在编译器关闭之前随机添加和删除*s 和&s 通常不是一个好的编程策略。此外,“它不起作用”也不能很好地描述错误。什么没有奏效?编译器抱怨了吗?程序崩溃了吗?它给出了错误的结果吗?

标签: c if-statement switch-statement calculator


【解决方案1】:

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

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

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 表示“未读取” ot 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 或在打印输出上使用铅笔。

【讨论】:

    猜你喜欢
    • 2014-12-30
    • 2015-09-28
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2020-04-14
    • 2012-09-24
    • 2011-03-26
    • 1970-01-01
    相关资源
    最近更新 更多