带 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
格式说明符和数据之间的类型不匹配或不匹配。
然后尝试通过逐步执行代码来识别算法问题 – 在调试器中,使用额外的 printf
s 或用铅笔在打印输出上。
我想制作一个需要 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
格式说明符和数据之间的类型不匹配或不匹配。
然后尝试通过逐步执行代码来识别算法问题 – 在调试器中,使用额外的 printf
s 或用铅笔在打印输出上。