递归实现的计算器,有大佬指导。虽然还有比较隐秘的BUG。
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int func_num(int num);
double dfs(int l,int r);
char str[1000+100];
const int inf=0x3f3f3f3f;
bool flagg;
bool flag;
inline void menu()
{
printf("********************************************\n");
printf("* 郑重说明以下ABS()和SQR()均用A()和S()代替 *\n");
printf("* 欢迎使用计算器 *\n");
printf("* 1.继续使用 *\n");
printf("* 2.退出 *\n");
printf("********************************************\n");
return ;
}
int main()
{
int choice;
while(1)
{
menu();
scanf("%d", &choice);
switch(choice)
{
case 1:
printf("请输入一个字符串\n");
break;
case 2:
return 0;
break;
}
getchar();
gets(str);
flagg = 0;
flag=0;
int len = strlen(str);
if(len == 1 && str[0] == '0') break;
double ans = dfs(0,len);
for(int i=0; i<len; i++)
if(str[i] == '.') flagg = 1;
if(flag==1)
printf("输入有误请重新输入\n");
else
printf("%.02f\n",ans);
}
return 0;
}
double dfs(int l,int r)
{
/*for(int i=l; i<r; i++)
printf("%c",str[i]);
printf("\n");*/
if(flag==1)
return 0;
int num = 0, i = l;
for(i=l; i<r; i++)
{
if(str[i] == '(') num += 1;
if(str[i] == ')') num -= 1;
if(!num && i != l)
if(str[i] == '-' || str[i] == '+')
return dfs(l,i) + dfs(i,r);
}
for(i=l; i<r; i++)
{
if(str[i] == '(') num += 1;
if(str[i] == ')') num -= 1;
if(!num && i != l)
if(str[i] == '*' || str[i] == '/')
return dfs(l,i) * dfs(i,r);
}
for(i=l; i<r; i++)
{
if(str[i] == '(') num += 1;
if(str[i] == ')') num -= 1;
if(!num && i != l)
if(str[i] == 'A'||str[i]=='S')
return dfs(l,i) + dfs(i,r);
}
if(str[l] == '(')
{
l += 1 , r -= 1;
return dfs(l ,r);
}
if(str[l] == '-')
return -dfs(l+1,r);
if(str[l] == '+')
return dfs(l+1,r);
if(str[l] == '*')
return dfs(l+1 , r);
if(str[l] == '/')
{
int s=dfs(l+1, r);
if(s==0)
{
flag=1;
return 0;
}
return 1/s;
}
if(str[l]=='A')
return fabs(dfs(l+1, r));
if(str[l]=='S')
return sqrt(dfs(l+1, r));
double sum = 0;
for(i=l; i<r; i++)
{
if(str[i] != ' ')
sum = sum*10 + str[i] - '0';
}
return sum;
}