C语言实现数学表达式运算
概述
C语言提供了一系列函数库,可以实现数学表达式的运算。本篇攻略将介绍如何使用C语言实现数学表达式的运算的方法。
函数库
在C语言中实现数学表达式计算,可以使用数学函数库<math.h>
和字符串处理函数库<string.h>
。
<math.h>
函数库
该函数库中包括了常见的数学函数,例如四则运算、幂函数、三角函数等等。
<string.h>
函数库
该函数库中包括了对字符串的处理函数,例如字符串的初始化、复制、连接等等。
思路
实现数学表达式计算,需要考虑以下的几个因素:
- 表达式的输入和存储:使用字符数组存储输入的表达式。
- 表达式的解析:将输入的字符串解析成数字和运算符,可以用数字栈和符号栈实现。
- 表达式的计算:根据前缀、中缀或后缀表达式计算表达式的值。
示例
下面是使用C语言计算数学表达式的两个示例。
示例一:计算中缀表达式的值
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#define MAX_EXPR_SIZE 100
typedef struct {
int top;
char data[MAX_EXPR_SIZE];
} Stack;
int is_empty(Stack* stack) {
return (stack->top == -1);
}
int is_full(Stack* stack) {
return (stack->top == MAX_EXPR_SIZE - 1);
}
char pop(Stack* stack) {
if (is_empty(stack)) {
printf("Stack is empty.\n");
exit(1);
} else {
return stack->data[stack->top--];
}
}
void push(Stack* stack, char c) {
if (is_full(stack)) {
printf("Stack is full.\n");
exit(1);
} else {
stack->data[++(stack->top)] = c;
}
}
char peek(Stack* stack) {
if (is_empty(stack)) {
printf("Stack is empty.\n");
exit(1);
} else {
return stack->data[stack->top];
}
}
int is_operator(char c) {
return ((c == '+') || (c == '-') || (c == '*') || (c == '/') || (c == '^'));
}
int precedence(char op) {
if ((op == '+') || (op == '-'))
return 1;
else if ((op == '*') || (op == '/'))
return 2;
else if (op == '^')
return 3;
else
return 0;
}
double calculate(double opnd1, char optr, double opnd2) {
switch (optr) {
case '+': return opnd1 + opnd2;
case '-': return opnd1 - opnd2;
case '*': return opnd1 * opnd2;
case '/': return opnd1 / opnd2;
case '^': return pow(opnd1, opnd2);
default : return 0.0;
}
}
double evaluate(char* exp) {
Stack opnd; // 操作数栈
Stack optr; // 运算符栈
opnd.top = -1;
optr.top = -1;
int i = 0;
char c;
while ((c = exp[i++]) != '\0') {
if (isdigit(c)) { // 如果是数字
double d = atof(&c);
while (isdigit(exp[i]) || (exp[i] == '.')) {
strncat(&c, &exp[i++], 1); // 将连续的数字字符拼接成浮点数
}
push(&opnd, d);
} else if (is_operator(c)) { // 如果是运算符
while ((!is_empty(&optr)) && (precedence(c) <= precedence(peek(&optr)))) {
double opnd2 = pop(&opnd);
double opnd1 = pop(&opnd);
push(&opnd, calculate(opnd1, pop(&optr), opnd2));
}
push(&optr, c);
} else if (c == '(') { // 如果是左括号
push(&optr, c);
} else if (c == ')') { // 如果是右括号
while (peek(&optr) != '(') {
double opnd2 = pop(&opnd);
double opnd1 = pop(&opnd);
push(&opnd, calculate(opnd1, pop(&optr), opnd2));
}
pop(&optr);
} else { // 如果是空格或其他非法字符,忽略
continue;
}
}
while (!is_empty(&optr)) {
double opnd2 = pop(&opnd);
double opnd1 = pop(&opnd);
push(&opnd, calculate(opnd1, pop(&optr), opnd2));
}
return pop(&opnd);
}
int main() {
char expression[MAX_EXPR_SIZE];
printf("Please enter an infix expression: ");
fgets(expression, MAX_EXPR_SIZE, stdin);
double result = evaluate(expression);
printf("The result of the expression is: %lf\n", result);
return 0;
}
示例二:计算后缀表达式的值
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#define MAX_EXPR_SIZE 100
typedef struct {
int top;
double data[MAX_EXPR_SIZE];
} Stack;
int is_empty(Stack* stack) {
return (stack->top == -1);
}
int is_full(Stack* stack) {
return (stack->top == MAX_EXPR_SIZE - 1);
}
double pop(Stack* stack) {
if (is_empty(stack)) {
printf("Stack is empty.\n");
exit(1);
} else {
return stack->data[stack->top--];
}
}
void push(Stack* stack, double d) {
if (is_full(stack)) {
printf("Stack is full.\n");
exit(1);
} else {
stack->data[++(stack->top)] = d;
}
}
double evaluate(char* exp) {
Stack stack; // 操作数栈
stack.top = -1;
int i = 0;
char c;
while ((c = exp[i++]) != '\0') {
if (isdigit(c)) { // 如果是数字
double d = atof(&c);
while (isdigit(exp[i]) || (exp[i] == '.')) {
strncat(&c, &exp[i++], 1); // 将连续的数字字符拼接成浮点数
}
push(&stack, d);
} else if (c == ' ') { // 如果是空格,忽略
continue;
} else { // 如果是运算符
double opnd2 = pop(&stack);
double opnd1 = pop(&stack);
switch (c) {
case '+': push(&stack, opnd1 + opnd2); break;
case '-': push(&stack, opnd1 - opnd2); break;
case '*': push(&stack, opnd1 * opnd2); break;
case '/': push(&stack, opnd1 / opnd2); break;
case '^': push(&stack, pow(opnd1, opnd2)); break;
default : printf("Unknown operator: %c\n", c); exit(1);
}
}
}
return pop(&stack);
}
int main() {
char expression[MAX_EXPR_SIZE];
printf("Please enter a postfix expression: ");
fgets(expression, MAX_EXPR_SIZE, stdin);
double result = evaluate(expression);
printf("The result of the expression is: %lf\n", result);
return 0;
}
结论
以上就是使用C语言实现数学表达式的运算的完整攻略。涵盖了表达式的输入和存储、解析以及计算,同时提供了两个示例:中缀表达式和后缀表达式的计算。对于实现数学表达式的计算功能的使用者来说,只需根据自己的需求使用不同的表达式,就可以获得自己想要的计算结果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现数学表达式运算 - Python技术站