请用C语言按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。要求: ③ 从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。 ④ 输入表达式中的数值均为大于等于零的整数。中间的计算过程如果出现小数也只取整。
时间: 2024-02-01 12:14:52 浏览: 87
以下是一个基本的四则运算计算器程序的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#define MAX_EXPR_LEN 100
int stack[MAX_EXPR_LEN];
char op_stack[MAX_EXPR_LEN];
int stack_top = -1;
int op_stack_top = -1;
// 将数字字符转换为整数
int char_to_int(char c) {
return c - '0';
}
// 计算两个整数的幂
int power(int base, int exponent) {
int result = 1;
for (int i = 0; i < exponent; i++) {
result *= base;
}
return result;
}
// 计算表达式
int calculate() {
int num1, num2, result;
char op;
while (op_stack_top >= 0) {
op = op_stack[op_stack_top--];
num2 = stack[stack_top--];
num1 = stack[stack_top--];
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
case '^':
result = power(num1, num2);
break;
}
stack[++stack_top] = result;
}
return stack[0];
}
int main() {
char expr[MAX_EXPR_LEN];
int num = 0;
int is_num = 0;
printf("请输入一个表达式:");
fgets(expr, MAX_EXPR_LEN, stdin);
for (int i = 0; expr[i] != '\0'; i++) {
if (isdigit(expr[i])) {
num = num * 10 + char_to_int(expr[i]);
is_num = 1;
} else {
if (is_num) {
stack[++stack_top] = num;
num = 0;
is_num = 0;
}
if (expr[i] == '(') {
op_stack[++op_stack_top] = expr[i];
} else if (expr[i] == ')') {
while (op_stack[op_stack_top] != '(') {
char op = op_stack[op_stack_top--];
int num2 = stack[stack_top--];
int num1 = stack[stack_top--];
int result;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
case '^':
result = power(num1, num2);
break;
}
stack[++stack_top] = result;
}
op_stack_top--;
} else if (expr[i] == '+' || expr[i] == '-') {
while (op_stack_top >= 0 && op_stack[op_stack_top] != '(') {
char op = op_stack[op_stack_top--];
int num2 = stack[stack_top--];
int num1 = stack[stack_top--];
int result;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
case '^':
result = power(num1, num2);
break;
}
stack[++stack_top] = result;
}
op_stack[++op_stack_top] = expr[i];
} else if (expr[i] == '*' || expr[i] == '/') {
while (op_stack_top >= 0 && (op_stack[op_stack_top] == '*' || op_stack[op_stack_top] == '/' || op_stack[op_stack_top] == '^')) {
char op = op_stack[op_stack_top--];
int num2 = stack[stack_top--];
int num1 = stack[stack_top--];
int result;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
case '^':
result = power(num1, num2);
break;
}
stack[++stack_top] = result;
}
op_stack[++op_stack_top] = expr[i];
} else if (expr[i] == '^') {
op_stack[++op_stack_top] = expr[i];
}
}
}
if (is_num) {
stack[++stack_top] = num;
}
while (op_stack_top >= 0) {
char op = op_stack[op_stack_top--];
int num2 = stack[stack_top--];
int num1 = stack[stack_top--];
int result;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
case '^':
result = power(num1, num2);
break;
}
stack[++stack_top] = result;
}
printf("计算结果为:%d\n", calculate());
return 0;
}
```
这个程序使用两个栈来实现表达式求值。一个栈用于存储数字,另一个栈用于存储运算符。在读取输入的表达式时,程序会依次处理每个字符,并按照运算符的优先级和惯例将数字和运算符压入栈中。如果遇到右括号,则反复从运算符栈中弹出运算符并从数字栈中弹出相应的数字,直到遇到左括号为止。最后,当运算符栈中没有运算符时,数字栈中剩下的一个数字就是计算结果。
注意,这个程序只处理了整数的四则运算和幂运算,如果需要支持浮点数的运算,需要进行相应的修改。
阅读全文