年假太閒寫寫程式打發時間,這個題目有點難,大概像以下的程式,執行時輸入運算式
PHP 語法:
#include<stdio.h>
float Execute(char *expression);
void main(){
float res;
char expression[32];
scanf("%s", expression);
res = Execute(expression); //執行運算式
printf("%f", res);
}
float Execute(char *expression){
int flag = 0, cnt = 0;
int optr = 0;
int index = 0;
char *exp, subexp[32];
float num = 0, Result;
exp = expression;
while(*exp){
while(*exp == ' ') exp++; //清除運算式中的空白
switch(flag){
case 0: //第一個運算子或有加()的優先子運算式的運算
if(*exp == '('){ //()的優先運算式
cnt = 0;
exp++;
while((*exp != ')') || (cnt != 0)){
if(*exp == '(') cnt++;
if(*exp == ')') cnt--;
subexp[index] = *exp;
index++;
exp++;
}
subexp[index] = '\0';
num = Execute(subexp);
}else if(*exp >= '0' && *exp <= '9'){ //取出運算子
while(*exp >= '0' && *exp <= '9'){
num *= 10;
num += (*exp & 0xf);
exp++;
}
exp--;
}
flag++; //運算子後應該加運算元
break;
case 1: //運算元
if(*exp == '+')
optr = 1;
else if(*exp == '-')
optr = 2;
else if(*exp == '*')
optr = 3;
else if(*exp == '/')
optr = 4;
flag--; //運算元後應該加運算子
}
exp++; //exp指標指著運算元調整至下一個字元
if(optr == 0) //第一個運算子放入結果
Result = num;
else{
while(*exp == ' ') exp++; //清除運算式中的空白
//初始化
index = 0;
flag = 0;
cnt = 0;
while(*exp && !flag){ //取出運算元後的運算子或有加()的優先子運算式或有*/的優先子運算式的運算
if(*exp == '(') cnt++;
if(*exp == ')') cnt--;
if((*exp == '+' || *exp == '-') && (cnt == 0)) //如果為+或-時且括號左右配對完代表運算子或子運算式已取出
flag = 1;
else{
subexp[index] = *exp;
index++;
exp++;
}
}
subexp[index] = '\0';
if(optr == 1)
Result += Execute(subexp);
else if(optr == 2)
Result -= Execute(subexp);
else if(optr == 3)
Result *= Execute(subexp);
else if(optr == 4)
Result /= Execute(subexp);
flag = 1;
}
}
return Result;
}
如有發現問題歡迎指教