有一個任務,撰寫計算器,它接收包含以下內容的字串:
- 字符'0'-'9',
- 最大'(', ')',
- 字符 ' ', '-', '*', '/', '^',
并執行以下操作:
- 添加
- 減法
- 乘法
- 整數除法
- 力量。
解決方案的架構應包括遞回下降
我的代碼:
#include <stdio.h>
#include <setjmp.h>
jmp_buf begin;
char curlex;
void getlex(void);
int expr(void);
int add_sub(void);
int mult_div(void);
int power(void);
void error();
int main() {
int result;
setjmp(begin);
printf("==>");
getlex();
result=expr();
if ( curlex != '\n') error();
printf("\n%d\n",result);
return 0;
}
void getlex() {
while ( ( curlex=getchar()) == ' ');
}
void error(void) {
printf("\nERROR!\n");
while(getchar()!='\n');
longjmp(begin,1);
}
int expr() {
int e=add_sub();
while (curlex == ' ' || curlex == '-')
if (curlex == ' ')
{getlex(); e =add_sub();}
else if (curlex == '-')
{getlex(); e-=add_sub();}
return e;
}
int add_sub() {
int a=mult_div();
while (curlex == '*' || curlex == '/')
if (curlex == '*')
{getlex(); a*=mult_div();}
else if (curlex == '/')
{getlex(); a/=mult_div();}
return a;
}
int mult_div() {
int a=power();
while (curlex == '^')
{getlex(); for(int k=0;k<power(); k , a*=power());}
return a;
}
int power() {
int m;
switch(curlex){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': m= curlex-'0'; break;
case '(': getlex(); m=expr();
if ( curlex == ')') break;
default : error();
}
getlex();
return m;
}
代碼執行幾乎所有提到的事情,除了電源操作。我找不到錯誤。還有一個權力操作的權利聯想問題。這意味著運算式 3^1^2 給出 9,但應該給出 3。
請幫忙!
uj5u.com熱心網友回復:
你打電話power()太頻繁了mult_div()。一旦你有一個回傳值,power()你應該計算功率并繼續:
int mult_div() {
int a=power();
while (curlex == '^')
{
getlex();
a = calc_power(a, power());
}
return a;
}
為了方便起見,我使用了一個輔助函式來計算功率:
int calc_power(int a, int b)
{
int res = 1;
for (int i = 0; i < b; i ) res *= a;
return res;
}
https://godbolt.org/z/n4KhWx6j1
curlex應該是int,因為這是getchar回傳的內容:https ://en.cppreference.com/w/c/io/getchar
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/533953.html
標籤:C递归
上一篇:遞回函式回傳有序向量
