查看單個文章
舊 2007-02-23, 11:45 AM   #23 (permalink)
wenneng
註冊會員
榮譽勳章
UID - 257587
在線等級: 級別:9 | 在線時長:124小時 | 升級還需:16小時級別:9 | 在線時長:124小時 | 升級還需:16小時級別:9 | 在線時長:124小時 | 升級還需:16小時級別:9 | 在線時長:124小時 | 升級還需:16小時
註冊日期: 2006-11-20
文章: 26
精華: 0
現金: 16 金幣
資產: 16 金幣
預設

年假太閒寫寫程式打發時間,這個題目有點難,大概像以下的程式,執行時輸入運算式

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 0cnt 0;
int optr 0;
int index 0;
char *expsubexp[32];
float num 0Result;
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;

如有發現問題歡迎指教
wenneng 目前離線  
送花文章: 2, 收花文章: 7 篇, 收花: 8 次
回覆時引用此帖
有 2 位會員向 wenneng 送花:
snoopy (2007-02-23),飛鳥 (2007-02-24)
感謝您發表一篇好文章