用c语言实现四则运算 需要带括号和小数运算和报错提示
时间: 2024-03-10 13:46:02 浏览: 78
以下是一个简单的 C 语言程序,实现了带括号和小数运算的四则运算,并能够报错提示输入不合法的表达式。
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_STACK 100
// 定义运算符栈
char op_stack[MAX_STACK];
int op_top = -1;
// 定义操作数栈
double num_stack[MAX_STACK];
int num_top = -1;
// 运算符的优先级
int priority(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
case ')':
return 0;
default:
return -1;
}
}
// 将中缀表达式转换为后缀表达式
int infix_to_postfix(char *infix, char *postfix) {
int i = 0, j = 0;
while (infix[i]) {
if (isdigit(infix[i]) || infix[i] == '.') {
// 如果是数字,直接添加到后缀表达式中
postfix[j++] = infix[i++];
while (isdigit(infix[i]) || infix[i] == '.') {
postfix[j++] = infix[i++];
}
postfix[j++] = ' ';
} else if (infix[i] == '(') {
// 如果是左括号,压入运算符栈中
op_stack[++op_top] = infix[i++];
} else if (infix[i] == ')') {
// 如果是右括号,弹出运算符栈中的元素,直到遇到左括号为止
while (op_top >= 0 && op_stack[op_top] != '(') {
postfix[j++] = op_stack[op_top--];
postfix[j++] = ' ';
}
if (op_top < 0) {
return 0; // 括号不匹配,返回错误
}
op_top--; // 弹出左括号
i++;
} else if (infix[i] == '+' || infix[i] == '-' || infix[i] == '*' || infix[i] == '/') {
// 如果是运算符,弹出运算符栈中优先级大于等于该运算符的元素,添加到后缀表达式中
while (op_top >= 0 && priority(op_stack[op_top]) >= priority(infix[i])) {
postfix[j++] = op_stack[op_top--];
postfix[j++] = ' ';
}
op_stack[++op_top] = infix[i++];
} else {
return 0; // 表达式中包含非法字符,返回错误
}
}
while (op_top >= 0) {
if (op_stack[op_top] == '(') {
return 0; // 括号不匹配,返回错误
}
postfix[j++] = op_stack[op_top--];
postfix[j++] = ' ';
}
postfix[j] = '\0';
return 1; // 转换成功
}
// 计算后缀表达式的值
double evaluate_postfix(char *postfix) {
int i = 0;
double num1, num2;
char *endptr;
while (postfix[i]) {
if (isdigit(postfix[i]) || postfix[i] == '.') {
// 如果是数字,将其压入操作数栈中
num_stack[++num_top] = strtod(&postfix[i], &endptr);
i = endptr - postfix;
} else if (postfix[i] == ' ') {
// 如果是空格,跳过
i++;
} else {
// 如果是运算符,弹出操作数栈中的两个元素进行计算,并将结果压入操作数栈中
if (num_top < 1) {
return 0; // 操作数不足,返回错误
}
num2 = num_stack[num_top--];
num1 = num_stack[num_top--];
switch (postfix[i]) {
case '+':
num_stack[++num_top] = num1 + num2;
break;
case '-':
num_stack[++num_top] = num1 - num2;
break;
case '*':
num_stack[++num_top] = num1 * num2;
break;
case '/':
if (num2 == 0) {
return 0; // 除数为零,返回错误
}
num_stack[++num_top] = num1 / num2;
break;
default:
return 0; // 非法运算符,返回错误
}
i++;
}
}
if (num_top != 0) {
return 0; // 操作数不匹配,返回错误
}
return num_stack[0];
}
int main() {
char infix[MAX_STACK], postfix[MAX_STACK];
printf("请输入四则运算表达式(带括号和小数):");
fgets(infix, MAX_STACK, stdin);
if (infix_to_postfix(infix, postfix)) {
printf("后缀表达式为:%s\n", postfix);
printf("计算结果为:%.2f\n", evaluate_postfix(postfix));
} else {
printf("表达式不合法!\n");
}
return 0;
}
```
在程序中,我们首先定义了一个运算符栈和一个操作数栈,用于中间过程的存储。然后定义了一个 `priority` 函数,用于计算运算符的优先级。接着,我们实现了一个 `infix_to_postfix` 函数,将中缀表达式转换为后缀表达式,并返回转换是否成功的标志。如果转换成功,我们输出后缀表达式,并计算表达式的值。如果转换失败,我们输出错误信息。最后,我们在 `main` 函数中读取用户输入的表达式,调用 `infix_to_postfix` 函数和 `evaluate_postfix` 函数,输出结果或错误信息。
阅读全文