如何解决使用 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
或在打印输出上使用铅笔。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。