1)问题描述: 设计一个简单的 LISP 算术表达式计算器。 简单 LISP 算术表达式(以下简称表达式)定义如下: (1) 一个 0..9 的整数;或者 (2) (运算符 表达式 表达式) 例如,6,(+45),(+(+25)8) 都是表达式,其值分别为 6,9 和 15。 2)基本要求: 实现 LISP 加法表达式的求值。 3)测试数据: 6,(+45),(+(+25)8),(+2(+58)),(+(+(+12)(+34))(+(+56)(+78))) 4)实现提示: 写一个递归函数: int Evaluate(FILE * CharFile) 字符文件 CharFile 的每行是一个如上定义的表达式。每读入 CharFile 的一行,求出并返回表达式的值。 可以设计以下辅助函数 status isNumber(char ReadInChar); //视 ReadInchar 是否是数字而返回 TRUE 或 FALSE 。 int TurnToInteger(char IntChar); // 将字符’0’..’9’ 转换为整数 0..9
时间: 2023-07-16 16:16:25 浏览: 195
以下是一个简单的LISP算术表达式计算器的实现,主要思路是利用递归函数来求解表达式的值:
```c++
#include <stdio.h>
#include <stdlib.h>
int isNumber(char c) {
return (c >= '0' && c <= '9');
}
int turnToInteger(char c) {
return (int)(c - '0');
}
int evaluate(FILE *charFile) {
int result = 0;
char c = fgetc(charFile);
if (c == '(') {
char op = fgetc(charFile);
int arg1 = evaluate(charFile);
int arg2 = evaluate(charFile);
fgetc(charFile); // consume the closing parenthesis
switch (op) {
case '+':
result = arg1 + arg2;
break;
case '-':
result = arg1 - arg2;
break;
case '*':
result = arg1 * arg2;
break;
case '/':
result = arg1 / arg2;
break;
default:
printf("Invalid operator: %c\n", op);
exit(1);
break;
}
} else if (isNumber(c)) {
result = turnToInteger(c);
} else {
printf("Invalid character: %c\n", c);
exit(1);
}
return result;
}
int main() {
FILE *charFile = fopen("expressions.txt", "r");
if (!charFile) {
printf("Failed to open file!\n");
return 1;
}
char line[100];
while (fgets(line, sizeof(line), charFile)) {
int result = evaluate(charFile);
printf("%d\n", result);
}
fclose(charFile);
return 0;
}
```
以上代码中,`isNumber`函数用于判断一个字符是否是数字,`turnToInteger`函数用于将字符转换为对应的整数。`evaluate`函数是递归函数,用于求解一个表达式的值。在函数中,首先读入一个字符,如果是左括号,就读入操作符和两个表达式的值,并根据操作符计算结果。如果是数字,就直接返回对应的整数。如果既不是左括号也不是数字,就表示表达式有误,直接退出程序。在主函数中,读入文件中的每一行表达式,调用`evaluate`函数计算结果,并输出到屏幕上。
阅读全文