文件in.txt(测试数据) 共1行,是一个算式算式包含字符: “(”、“)”、“0-9”、“+”、“-”、“*”、“/”、“^”。(“/”用整数除法,算式长度<=50,其中所有数据在2^31-1的范围内)。写一段C语言包程序读取这个文件中的算式并算出结果,并生成测试用例进行测试
时间: 2023-11-05 21:05:13 浏览: 64
以下是一个简单的C语言程序,可以读取in.txt中的算式并计算结果:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#define MAX_LEN 50
int calculate(char *expr);
int main() {
FILE *fp;
char expr[MAX_LEN + 1];
int result;
fp = fopen("in.txt", "r");
if (fp == NULL) {
printf("Failed to open file: in.txt\n");
exit(1);
}
fscanf(fp, "%s", expr);
result = calculate(expr);
printf("%d\n", result);
fclose(fp);
return 0;
}
int calculate(char *expr) {
int len = strlen(expr);
int stack[MAX_LEN], top = -1;
int i, num1, num2, result;
for (i = 0; i < len; i++) {
if (isdigit(expr[i])) {
int num = expr[i] - '0';
while (i + 1 < len && isdigit(expr[i + 1])) {
num = num * 10 + (expr[i + 1] - '0');
i++;
}
stack[++top] = num;
} else if (expr[i] == '(') {
stack[++top] = -1; // 标记左括号
} else if (expr[i] == ')') {
num1 = stack[top--];
while (top >= 0 && stack[top] != -1) {
num2 = stack[top--];
if (stack[top] == '+') {
num1 += num2;
} else if (stack[top] == '-') {
num1 -= num2;
} else if (stack[top] == '*') {
num1 *= num2;
} else if (stack[top] == '/') {
num1 /= num2;
} else if (stack[top] == '^') {
num1 = (int) pow(num1, num2);
}
}
top--; // 弹出左括号
stack[++top] = num1;
} else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' ||
expr[i] == '/' || expr[i] == '^') {
stack[++top] = expr[i];
}
}
result = stack[0];
for (i = 1; i <= top; i += 2) {
num2 = stack[i + 1];
if (stack[i] == '+') {
result += num2;
} else if (stack[i] == '-') {
result -= num2;
} else if (stack[i] == '*') {
result *= num2;
} else if (stack[i] == '/') {
result /= num2;
} else if (stack[i] == '^') {
result = (int) pow(result, num2);
}
}
return result;
}
```
该程序使用栈来计算算式的值。首先读入算式到一个字符数组中,然后遍历数组,遇到数字则将其转换为整数并压入栈中,遇到运算符则将其压入栈中。当遇到右括号时,从栈顶开始弹出元素,直到遇到左括号为止。在弹出元素的过程中,执行相应的运算并将结果压入栈中。最后从栈顶开始弹出元素,执行剩余的运算直到栈为空。
为了方便起见,我们将左括号压入栈中时用-1来表示。在遇到右括号时,弹出元素时遇到-1则说明左括号已经弹出,可以停止弹出元素了。
阅读全文