请用C语言编写代码实现该问题并逐句给出解析:1、简单计算器。 请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。要求: ③从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。 ④输入表达式中的数值均为大于等于零的整数。中间的计算过程如果出现小数也只取整。 例如,输入:4+2*5= 输出:14 输入:(4+2)*(2-10)= 输出:-48
时间: 2024-02-03 14:11:50 浏览: 162
以下是使用C语言编写的简单计算器代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
int main() {
char input[100];
int numStack[50], opStack[50];
int i, inputLen, numTop = -1, opTop = -1;
// 读入表达式
printf("请输入一个完整的表达式:\n");
fgets(input, 100, stdin);
inputLen = strlen(input);
// 处理表达式
for (i = 0; i < inputLen; i++) {
if (isdigit(input[i])) { // 数字直接入栈
int num = 0, j;
for (j = i; j < inputLen && isdigit(input[j]); j++) {
num = num * 10 + input[j] - '0';
}
i = j - 1;
numStack[++numTop] = num;
} else if (input[i] == '(') { // 左括号直接入栈
opStack[++opTop] = '(';
} else if (input[i] == ')') { // 右括号出栈计算直到遇到左括号
while (opStack[opTop] != '(') {
int num2 = numStack[numTop--];
int num1 = numStack[numTop--];
int op = opStack[opTop--];
switch (op) {
case '+': numStack[++numTop] = num1 + num2; break;
case '-': numStack[++numTop] = num1 - num2; break;
case '*': numStack[++numTop] = num1 * num2; break;
case '/': numStack[++numTop] = num1 / num2; break;
case '^': numStack[++numTop] = pow(num1, num2); break;
}
}
opTop--; // 左括号出栈
} else if (input[i] == '+' || input[i] == '-') { // 加减法出栈计算直到遇到左括号或栈空
while (opTop >= 0 && opStack[opTop] != '(') {
int num2 = numStack[numTop--];
int num1 = numStack[numTop--];
int op = opStack[opTop--];
switch (op) {
case '+': numStack[++numTop] = num1 + num2; break;
case '-': numStack[++numTop] = num1 - num2; break;
case '*': numStack[++numTop] = num1 * num2; break;
case '/': numStack[++numTop] = num1 / num2; break;
case '^': numStack[++numTop] = pow(num1, num2); break;
}
}
opStack[++opTop] = input[i];
} else if (input[i] == '*' || input[i] == '/') { // 乘除法出栈计算直到遇到加减法、左括号或栈空
while (opTop >= 0 && (opStack[opTop] == '*' || opStack[opTop] == '/' || opStack[opTop] == '^')) {
int num2 = numStack[numTop--];
int num1 = numStack[numTop--];
int op = opStack[opTop--];
switch (op) {
case '+': numStack[++numTop] = num1 + num2; break;
case '-': numStack[++numTop] = num1 - num2; break;
case '*': numStack[++numTop] = num1 * num2; break;
case '/': numStack[++numTop] = num1 / num2; break;
case '^': numStack[++numTop] = pow(num1, num2); break;
}
}
opStack[++opTop] = input[i];
} else if (input[i] == '^') { // 幂运算出栈计算直到遇到乘除法、加减法、左括号或栈空
while (opTop >= 0 && (opStack[opTop] == '^')) {
int num2 = numStack[numTop--];
int num1 = numStack[numTop--];
int op = opStack[opTop--];
switch (op) {
case '+': numStack[++numTop] = num1 + num2; break;
case '-': numStack[++numTop] = num1 - num2; break;
case '*': numStack[++numTop] = num1 * num2; break;
case '/': numStack[++numTop] = num1 / num2; break;
case '^': numStack[++numTop] = pow(num1, num2); break;
}
}
opStack[++opTop] = input[i];
}
}
// 处理剩余的运算符
while (opTop >= 0) {
int num2 = numStack[numTop--];
int num1 = numStack[numTop--];
int op = opStack[opTop--];
switch (op) {
case '+': numStack[++numTop] = num1 + num2; break;
case '-': numStack[++numTop] = num1 - num2; break;
case '*': numStack[++numTop] = num1 * num2; break;
case '/': numStack[++numTop] = num1 / num2; break;
case '^': numStack[++numTop] = pow(num1, num2); break;
}
}
// 输出结果
printf("结果为:%d\n", numStack[numTop]);
return 0;
}
```
代码解析:
1. 首先定义了一个字符数组 `input` 存储输入的表达式,以及两个整型数组 `numStack` 和 `opStack` 分别作为数字栈和运算符栈。还定义了一些辅助变量,包括 `inputLen` 表示输入表达式的长度,`numTop` 和 `opTop` 分别表示数字栈和运算符栈的栈顶指针。
2. 从键盘输入一个完整的表达式,并使用 `fgets()` 函数读入字符串。`fgets()` 函数可以读入一行字符串,最多读入 `n-1` 个字符(其中 `n` 是缓冲区的大小),并在末尾添加一个空字符 '\0'。
3. 遍历字符串中的每个字符,根据字符的类型进行相应的处理:
* 如果是数字,则将其转换为整数并入数字栈。
* 如果是左括号,则直接入运算符栈。
* 如果是右括号,则从运算符栈中依次取出运算符和数字进行运算,直到遇到左括号为止。左括号出栈,不参与运算。
* 如果是加减法,则从运算符栈中依次取出运算符和数字进行运算,直到遇到左括号或栈空为止。加减法入运算符栈。
* 如果是乘除法,则从运算符栈中依次取出运算符和数字进行运算,直到遇到加减法、左括号或栈空为止。乘除法入运算符栈。
* 如果是幂运算,则从运算符栈中依次取出运算符和数字进行运算,直到遇到乘除法、加减法、左括号或栈空为止。幂运算入运算符栈。
4. 处理完所有的字符后,将剩余的运算符从栈中取出并计算。最终数字栈中只剩下一个数,即为表达式的计算结果。
5. 输出计算结果。
阅读全文