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 的概要设计
时间: 2024-02-17 11:00:42 浏览: 21
概要设计:
1. 读取文件中的每一行表达式。
2. 对于每个表达式,判断其是否为一个数字,如果是,直接返回该数字。
3. 如果不是数字,则递归计算表达式中的每个子表达式的值,并根据运算符进行相应的计算,最后返回计算结果。
4. 判断表达式是否合法,如果不合法抛出异常或者返回错误码。
5. 实现辅助函数isNumber和TurnToInteger用于判断字符是否为数字和将字符转换为整数。
伪代码实现:
```
int Evaluate(FILE * CharFile) {
char expression[MAX_LENGTH];
fgets(expression, MAX_LENGTH, CharFile); // 从文件中读取一行表达式
int len = strlen(expression);
if (len == 1 && isNumber(expression[0])) { // 如果表达式只有一个数字,则直接返回该数字
return TurnToInteger(expression[0]);
} else { // 否则递归计算表达式的值
char op = expression[1]; // 运算符
int left = 3; // 左子表达式的起始位置
int right = len - 2; // 右子表达式的结束位置
int mid = findMid(expression, left, right); // 查找左右子表达式的分界点
int leftValue = Evaluate(getSubExpression(expression, left, mid)); // 递归计算左子表达式的值
int rightValue = Evaluate(getSubExpression(expression, mid + 1, right)); // 递归计算右子表达式的值
switch (op) { // 根据运算符进行相应的计算
case '+':
return leftValue + rightValue;
case '-':
return leftValue - rightValue;
case '*':
return leftValue * rightValue;
case '/':
return leftValue / rightValue;
default:
throw "Invalid expression!";
}
}
}
bool isNumber(char ReadInChar) {
return ReadInChar >= '0' && ReadInChar <= '9';
}
int TurnToInteger(char IntChar) {
return IntChar - '0';
}
char* getSubExpression(char* expression, int start, int end) {
char* subExpression = (char*)malloc(sizeof(char) * (end - start + 2));
int index = 0;
for (int i = start; i <= end; i++) {
subExpression[index++] = expression[i];
}
subExpression[index] = '\0';
return subExpression;
}
int findMid(char* expression, int left, int right) {
int count = 0;
for (int i = left; i <= right; i++) {
if (expression[i] == '(') {
count++;
} else if (expression[i] == ')') {
count--;
} else if (count == 0 && (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/')) {
return i;
}
}
return -1;
}
```