用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-*/(),编写源程序中的 double deal_exp (char *exp) 函数,对这个算术表达式求值,返回结果,不使用递归或者栈
时间: 2023-11-16 19:05:33 浏览: 84
好的,我明白了。对于这个问题,可以使用双指针来遍历表达式并计算其值。具体实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
double deal_exp(char *exp) {
char *p = exp, *q = exp; // 双指针初始化
double num = 0, res = 0; // num存储当前数字,res存储最终结果
int sign = 1, flag = 0; // sign表示当前数字的符号,flag表示是否有小数点
while (*q != '\0') {
if (*q == ' ') { // 如果遇到空格,跳过
q++;
continue;
}
else if (*q == '+' || *q == '-' || *q == '*' || *q == '/') { // 如果遇到运算符,进行计算
switch (*q) {
case '+':
res += sign * num;
sign = 1;
num = 0;
flag = 0;
break;
case '-':
res += sign * num;
sign = -1;
num = 0;
flag = 0;
break;
case '*':
q++;
while (*q == ' ') q++; // 跳过空格
if (*q == '-') { // 处理负数
sign = -1;
q++;
}
else {
sign = 1;
}
num *= sign * (double)(*q - '0');
sign = 1;
flag = 0;
break;
case '/':
q++;
while (*q == ' ') q++; // 跳过空格
if (*q == '-') { // 处理负数
sign = -1;
q++;
}
else {
sign = 1;
}
num /= sign * (double)(*q - '0');
sign = 1;
flag = 0;
break;
}
}
else if (*q == '(') { // 如果遇到左括号,递归计算括号内的表达式
int cnt = 1;
char *t = q + 1;
while (cnt != 0) {
if (*t == '(') cnt++;
else if (*t == ')') cnt--;
t++;
}
num = deal_exp(q + 1);
q = t;
flag = 0;
}
else if (*q == ')') { // 如果遇到右括号,返回结果
res += sign * num;
return res;
}
else if (isdigit(*q)) { // 如果遇到数字,将其转化为double类型
num = num * 10 + (*q - '0');
if (flag) num /= 10;
q++;
}
else if (*q == '.') { // 如果遇到小数点,将flag置为1
flag = 1;
q++;
}
else { // 如果遇到非法字符,返回错误
printf("Invalid character!\n");
exit(1);
}
}
res += sign * num;
return res;
}
int main() {
char exp[100];
printf("Please input the expression: ");
fgets(exp, 100, stdin); // 从标准输入读入表达式
double res = deal_exp(exp); // 计算表达式的值
printf("The result is: %lf\n", res);
return 0;
}
```
这个程序可以处理包含括号、加减乘除、负数、小数点的算术表达式,并返回其值。注意,这个程序并没有进行错误处理,如果输入的表达式包含非法字符,程序会直接退出。
阅读全文