设计一个C语言程序实现计算器功能包括加减乘除、小数、括号、取余
时间: 2023-12-01 17:03:57 浏览: 31
以下是一个简单的C语言程序实现计算器功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_EXPR_LEN 100
// 定义运算符栈结构体
typedef struct {
char data[MAX_EXPR_LEN];
int top;
} OperatorStack;
// 定义操作数栈结构体
typedef struct {
double data[MAX_EXPR_LEN];
int top;
} OperandStack;
// 初始化运算符栈
void initOperatorStack(OperatorStack *stack) {
stack->top = -1;
}
// 初始化操作数栈
void initOperandStack(OperandStack *stack) {
stack->top = -1;
}
// 判断是否为数字
int isNumber(char c) {
return isdigit(c) || c == '.';
}
// 判断是否为运算符
int isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/' || c == '%' || c == '(' || c == ')';
}
// 获取运算符优先级
int getPriority(char c) {
switch (c) {
case '+':
case '-':
return 1;
case '*':
case '/':
case '%':
return 2;
default:
return 0;
}
}
// 将中缀表达式转换为后缀表达式
void infixToPostfix(char *infixExpr, char *postfixExpr) {
OperatorStack operatorStack;
initOperatorStack(&operatorStack);
int i = 0, j = 0;
while (infixExpr[i]) {
if (isNumber(infixExpr[i])) {
while (isNumber(infixExpr[i])) {
postfixExpr[j++] = infixExpr[i++];
}
postfixExpr[j++] = ' ';
} else if (isOperator(infixExpr[i])) {
if (infixExpr[i] == '(') {
operatorStack.data[++operatorStack.top] = infixExpr[i++];
} else if (infixExpr[i] == ')') {
while (operatorStack.data[operatorStack.top] != '(') {
postfixExpr[j++] = operatorStack.data[operatorStack.top--];
postfixExpr[j++] = ' ';
}
operatorStack.top--;
i++;
} else {
while (operatorStack.top != -1 && operatorStack.data[operatorStack.top] != '('
&& getPriority(operatorStack.data[operatorStack.top]) >= getPriority(infixExpr[i])) {
postfixExpr[j++] = operatorStack.data[operatorStack.top--];
postfixExpr[j++] = ' ';
}
operatorStack.data[++operatorStack.top] = infixExpr[i++];
}
} else {
printf("Invalid character: %c\n", infixExpr[i]);
exit(1);
}
}
while (operatorStack.top != -1) {
postfixExpr[j++] = operatorStack.data[operatorStack.top--];
postfixExpr[j++] = ' ';
}
postfixExpr[j] = '\0';
}
// 计算后缀表达式
double calculatePostfix(char *postfixExpr) {
OperandStack operandStack;
initOperandStack(&operandStack);
int i = 0;
while (postfixExpr[i]) {
if (isNumber(postfixExpr[i])) {
char *start = postfixExpr + i;
while (isNumber(postfixExpr[i])) {
i++;
}
double num = atof(start);
operandStack.data[++operandStack.top] = num;
} else if (isOperator(postfixExpr[i])) {
double b = operandStack.data[operandStack.top--];
double a = operandStack.data[operandStack.top--];
switch (postfixExpr[i]) {
case '+':
operandStack.data[++operandStack.top] = a + b;
break;
case '-':
operandStack.data[++operandStack.top] = a - b;
break;
case '*':
operandStack.data[++operandStack.top] = a * b;
break;
case '/':
operandStack.data[++operandStack.top] = a / b;
break;
case '%':
operandStack.data[++operandStack.top] = (int)a % (int)b;
break;
}
i++;
} else {
printf("Invalid character: %c\n", postfixExpr[i]);
exit(1);
}
}
return operandStack.data[operandStack.top];
}
int main() {
char infixExpr[MAX_EXPR_LEN], postfixExpr[MAX_EXPR_LEN];
printf("Enter the infix expression: ");
fgets(infixExpr, MAX_EXPR_LEN, stdin);
infixToPostfix(infixExpr, postfixExpr);
printf("The postfix expression is: %s\n", postfixExpr);
printf("The result is: %lf\n", calculatePostfix(postfixExpr));
return 0;
}
```
使用方法:在终端中运行程序,输入中缀表达式,程序将自动计算并输出结果。例如,输入`(2.5+3)*4-5%2`,程序将输出:
```
Enter the infix expression: (2.5+3)*4-5%2
The postfix expression is: 2.5 3 + 4 * 5 2 % -
The result is: 16.000000
```