// 一个四则运算的小小计算器
// 陆陆续续解决了 小数 空格 括号 的问题
// 之后准备添加错误检测
// 还准备把三个函数合起来
// 再添加其他运算符
// 基本思路是嵌套
// 注释很乱,所以我暂时删掉了,见谅
// 想要注释的小伙伴可以找我
// 有bug的话请务必告诉我

#include <stdio.h>
#define MAX_STR 10000
char *highofstr(char *low)
{
while(*low!='\0')
low++;
return low-1;
}
double trans(char *low, char *high)
{
double num=0;
int cnt_point=-1;
while(low<=high)
{
if( *low=='.' || cnt_point>-1 )
cnt_point++;
if( *low!='.' )
num= 10*num+((*low)-'0');
low++;
}
for( ; cnt_point>0; cnt_point--)
num /=10;
return num;
}
int flagch(char ch)
{
if('0'<=ch && ch<='9')return 9;
if(ch=='.')return 9;
if(ch=='+' || ch=='-')return 1;
if(ch=='*' || ch=='/')return 2;
if(ch=='(' || ch==')')return 9;
return -1;
}
double deal_1(char *low, char *high)
{
double deal_2(char *low, char *high);
int cnt_kh=0;
char *p=high;
while( (flagch(*p)!=1 && p>low) || (cnt_kh!=0) )
{
if(*p=='(')cnt_kh++;
if(*p==')')cnt_kh--;
p--;
}
if(p<=low)
return deal_2(low, high);
else if(*p=='+')
return deal_1(low, p-1)+deal_2(p+1, high);
else if(*p=='-')
return deal_1(low, p-1)-deal_2(p+1, high);
}
double deal_2(char *low, char *high)
{
double deal_9(char *low, char *high);
int cnt_kh=0;
char *p=high;
while( (flagch(*p)!=2 && p>low) || (cnt_kh!=0) )
{
if(*p=='(')cnt_kh++;
if(*p==')')cnt_kh--;
p--;
}
if(p<=low)
return deal_9(low, high);
else if(*p=='*')
return deal_2(low, p-1)*deal_9(p+1, high);
else if(*p=='/')
return deal_2(low, p-1)/deal_9(p+1, high);
}
double deal_9(char *low, char *high)
{
double deal_1(char *low, char *high);
if( *low!='(' )
return trans(low, high);
else
return deal_1(low+1, high-1);
}
int true_cnt_point(double num)
{
if( num-(int)num==0 )return 0;
return 1+true_cnt_point(num*10);
}
void Enterstr(char *str)
{
for(int i=0; i<MAX_STR; i++)
{
scanf("%c", str);
if(*str=='\n')break;
if(*str!=' ')str++;
}
*str='\0';
}
int main()
{
char str[MAX_STR+1];
while(1)
{
Enterstr(str);
printf("%.10f\n", deal_1(str, highofstr(str)));
}
return 0;
}