C 如何计算算术表达式,如:';10+;2-4/2';
我的程序有点小问题。我需要对算术表达式求和,例如:10+2+1/2,仅使用递归 我写了这样的东西:C 如何计算算术表达式,如:';10+;2-4/2';,c,C,我的程序有点小问题。我需要对算术表达式求和,例如:10+2+1/2,仅使用递归 我写了这样的东西: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> int calculate(const char* expr, float *result); int calculate_rec(const char* expr, float *result
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int calculate(const char* expr, float *result);
int calculate_rec(const char* expr, float *result, int i, char sg, int number);
int main(void){
char expression[201]={0};
char *expr=expression;
float result;
float *res=&result;
printf("enter operation: ");
fgets(expr, 201, stdin);
fflush(stdin);
calculate(expr, res);
printf("%.2f", result);
return 0;
}
int calculate(const char* expr, float *result){
if(expr==NULL) return 0;
calculate_rec(expr, result, 0, 0, 0);
return 1;
}
int calculate_rec(const char* expr, float *result, int i, char sg, int number){
if(isdigit(*(expr+i))) number=number*10+*(expr+i)-'0';
else{
switch(sg){
case '+': *result += number;
break;
case '-': *result -= number;
break;
case '*': *result *= number;
break;
case '/': if(number==0) return 0;
*result /= number;
break;
}
number = 0;
sg = *(expr + i);
}
if (*(expr + i)=='\0') return 1;
return calculate_rec(expr, result, i + 1, sg, number);
}
#包括
#包括
#包括
#包括
int计算(常量字符*表达式,浮点*结果);
int calculate_rec(常量字符*expr,浮点*result,int i,字符sg,int number);
内部主(空){
字符表达式[201]={0};
char*expr=表达式;
浮动结果;
float*res=&result;
printf(“输入操作:”);
fgets(expr,201,stdin);
fflush(stdin);
计算(expr,res);
printf(“%.2f”,结果);
返回0;
}
int计算(常量字符*表达式,浮点*结果){
if(expr==NULL)返回0;
计算_rec(expr,result,0,0,0);
返回1;
}
int calculate_rec(常量字符*expr,浮点*result,int i,字符sg,int number){
如果(isdigit(*(expr+i)))编号=编号*10+*(expr+i)-'0';
否则{
开关(sg){
案例“+”:*结果+=数字;
打破
案例“-”:*结果-=编号;
打破
案例“*”:*结果*=编号;
打破
大小写“/”:如果(number==0)返回0;
*结果/=数字;
打破
}
数字=0;
sg=*(expr+i);
}
如果(*(expr+i)='\0'),则返回1;
返回计算记录(表达式、结果、i+1、sg、数字);
}
该程序工作正常,但跳过给定字符串中的第一个数字,从字符串:10+1+2/2,结果是1.5,应该是6.5。递归遍历列表并执行乘法和除法运算,
并将左侧值替换为零,将运算符替换为加号,将右侧值替换为该值。然后递归地再次遍历列表并执行加法和减法运算。
fflush(stdin)
在标准C中是未定义的行为。*(expr+i)
可以更简单、更习惯地写成expr[i]
*result+=number代码>-未初始化时使用结果。解析第一个数字时,只需设置*result=number
。跳过它,立即转到+2
执行*result+=number代码>。感觉您可以将另一个,bool result\u initialized
变量传递给您的函数,然后在切换之前执行if(result\u initialized==false){result\u initialized=true;*result=number}else开关(sq){..
注意,在仅输入流上调用fflush
(如stdin)
在C规范中被明确提到为未定义的行为。有一个实现将其添加为不可移植的扩展,因此请不要使用它。使用-Wall-Wextra-Werror
(或编译器输出警告的任何选项)如果你自己去发现其中一些错误,你可能会发现很难看到这个答案的有用性,因为你所描述的可能正是他们试图做的。你可能会通过解释更多,可能会添加一些代码来让有用的部分更加明显。或者强调OP编码与你所描述的不同之处。i忘了加上操作的优先级不重要,一个接一个地做