【发布时间】:2021-01-31 10:14:43
【问题描述】:
我正在用 C 语言创建一个计算器程序,它最多需要 5 个数字和 4 个运算,然后计算答案以更好地学习语言。我几乎所有东西都可以正常工作,只是它还没有遵循操作顺序。我能想到的唯一方法是通过将乘法和除法语句移到数组的前面,将加法和减法语句移到后面,以某种方式同时对运算和数字进行排序.但是,我完全不知道该怎么做,我认为这是一个非常安全的假设,即有更好、更有效的方法来完成这项任务。有谁在 C 方面有更多经验的人知道如何解决这个问题吗?
这是我目前的代码:
/* A calculator that accepts up to 5 numbers and performs
multiple mathematical operations on the given numbers. */
#include <stdio.h>
#include <stdlib.h>
/* Creating functions for each of
the basic mathematical operators */
double add(double x, double y) {
/* Add variables x and y */
return x + y;
}
double subtract(double x, double y) {
/* Subtract variables x and y */
return x - y;
}
double multiply(double x, double y) {
/* Multiply variables x and y */
return x * y;
}
double divide(double x, double y) {
/* Divide variables x and y */
return x / y;
}
/* "operation" typedef to point
to the above operator functions */
typedef double (*operation)(double, double);
int main() {
double nums[5];
char operator;
operation operators[5]; // operator functions pointer array
double result;
int i = 0; // index variable to be used for iteration
printf("\n ################################\n");
printf(" ########## Calculator ##########\n");
printf(" ################################\n\n");
printf(" You may enter up to 5 numbers in you calculation.\n");
printf(" If you wish to enter fewer than 5 numbers, type an \"=\" as the operator after your final number.\n\n");
while (i < 5) {
// Getting the user's input
printf(" Enter a number: ");
scanf("%lf", &nums[i]);
if (i == 4) {
operators[i] = NULL; // Sets the final operator to NULL
} else {
printf(" Enter an operator (+, -, *, /, or =): ");
scanf(" %c", &operator);
/* Switch statement to decide which function to run on
the given numbers on each iteration through the loop */
switch(operator) {
case '+' :
operators[i] = add;
break;
case '-' :
operators[i] = subtract;
break;
case '*' :
operators[i] = multiply;
break;
case '/' :
operators[i] = divide;
break;
default :
operators[i] = NULL;
break;
}
}
if (!operators[i]) break; // Breaks out of the loop if the current operator is NULL
i++; // Increments the index variable up by 1
}
result = nums[0];
for (i = 1; i < 5; i++) {
if (operators[i - 1]) {
result = operators[i - 1](result, nums[i]);
} else {
break;
}
}
// Printing out the answer rounded to 2 decimal points
printf("Result: %.2f\n", result);
return 0;
}
如您所见,我在顶部有每个操作的函数,还有一个 while 循环,它接受一个数字和一个运算符,并使用 switch 语句将适当的函数插入到数组中。之后,我有一个for 循环,它遍历数组并按照输入的顺序执行操作。这就是导致答案在技术上不正确的原因,因为它对最后一次通过 for 循环产生的答案执行每个操作。这就是为什么我希望对数组中的操作进行排序。如果我可以在所有计算发生之前将所有操作和数字按正确的顺序排列,那么它将按照操作顺序并给出正确的答案。
这是我当前程序的输出示例:
################################
########## Calculator ##########
################################
You may enter up to 5 numbers in you calculation.
If you wish to enter fewer than 5 numbers, type an "=" as the operator after your final number.
Enter a number: 3
Enter an operator (+, -, *, /, or =): +
Enter a number: 6
Enter an operator (+, -, *, /, or =): -
Enter a number: 7
Enter an operator (+, -, *, /, or =): *
Enter a number: 3
Enter an operator (+, -, *, /, or =): /
Enter a number: 2
Result: 3.00
[Finished in 21.57s]
以下是我希望它提出的示例:
################################
########## Calculator ##########
################################
You may enter up to 5 numbers in you calculation.
If you wish to enter fewer than 5 numbers, type an "=" as the operator after your final number.
Enter a number: 3
Enter an operator (+, -, *, /, or =): +
Enter a number: 6
Enter an operator (+, -, *, /, or =): -
Enter a number: 7
Enter an operator (+, -, *, /, or =): *
Enter a number: 3
Enter an operator (+, -, *, /, or =): /
Enter a number: 2
Result: -1.50
[Finished in 21.57s]
有没有人能想到的方法来完成这个?
【问题讨论】:
-
您可以考虑使用堆栈将中缀表示法转换为反向抛光。
-
你能举个例子来说明我会怎么做吗?我对 C 语言还是很陌生,我还不知道它是如何工作的。
-
它可能超出了您的问题的范围,因为它比较复杂,但是 YouTube 视频和文章可以解释这种实现计算器的特殊方法。
-
如果您不支持括号,请迭代并计算所有高优先级操作,然后进行第二次遍历并计算所有低优先级操作。如果涉及到parens,也许可以尝试调车场算法。或者只是将
bc作为子进程运行;-)
标签: arrays c sorting operator-precedence