#include
#include
#include
#include
#define N 26 /*根据自己的需要,可以定义要进行运算的数字的最大个数*/
int main(void)
{
int i,j,k;
double num[N];
char sym[N],str[12];
loop1:
printf("Input a calculation method like 1+2^3-4*5/10=↙\nPlease:"); /*可以进行加、减、乘、除、乘方的运算*/
for(i=0;i<N;i++)
{
scanf("%lf%c",&num[i],&sym[i]); /*num[N]用来存储运算数字,sym[N]用来存储运算符号*/
if(sym[i]=='=') break; /*当出现等号时,表示计算式结束*/
}
for(j=0;j<=i;j++)
if(sym[j]=='^') /*判断优先级中的乘方,它是首先要处理的*/
{
if(num[j]==0&&num[j+1]==0) {printf("Input error!\n");goto loop2;} /*指数为零时,底数不为零。
否则,进入标记位置*/
else num[j]=pow(num[j],num[j+1]); /*将本次出现的乘方运算结果,放在前一项中*/
for(k=j;k<i;k++)
{
sym[k]=sym[k+1]; /*依次将后面的符号替换到前面,因为符号中有"=",所以要多替换1次*/
if(k!=i-1) num[k+1]=num[k+2]; /*依次将后面的数字替换到前面*/
}
j--,i--; /*"j--"表示下一次从本次的位置开始继续判断是否为优先级中的乘方,因为本次位置替换后的符号仍然可能是"^",
"i--"表示下次处理的数字将减少1个*/
}
for(j=0;j<=i;j++)
{
if(sym[j]=='*') /*当计算式中没有"^"时,将开始判断优先级中的"*",它是其次要处理的*/
{
num[j]=num[j]*num[j+1]; /*将本次出现的乘法运算结果,放在前一项中*/
for(k=j;k<i;k++)
{
sym[k]=sym[k+1]; /*依次将后面的符号替换到前面,因为符号中有"=",所以要多替换1次*/
if(k!=i-1) num[k+1]=num[k+2]; /*依次将后面的数字替换到前面*/
}
j--,i--; /*"j--"表示下一次从本次的位置开始继续判断是否为优先级中的乘法,因为本次位置替换后的符号仍然可能是"*",
"i--"表示下次处理的数字将减少1个*/
}
if(sym[j]=='/') /*当计算式中没有"^"时,将开始判断优先级中的"/",它也是其次要处理的*/
{
if(num[j+1]==0) {printf("Input error!\n");goto loop2;} /*分母不为零。
否则,进入标记位置*/
else num[j]=num[j]/num[j+1]; /*将本次出现的除法运算结果,放在前一项中*/
for(k=j;k<i;k++)
{
sym[k]=sym[k+1]; /*依次将后面的符号替换到前面,因为符号中有"=",所以要多替换1次*/
if(k!=i-1) num[k+1]=num[k+2]; /*依次将后面的数字替换到前面*/
}
j--,i--; /*"j--"表示下一次从本次的位置开始继续判断是否为优先级中的除法,因为本次位置替换后的符号仍然可能是"/",
"i--"表示下次处理的数字将减少1个*/
}
}
for(j=0;j<=i;j++)
switch(sym[j]) /*最后只剩"+"和"-"了,将每次运算的结果放在后一项中*/
{
case '+':num[j+1]=num[j]+num[j+1];break;
case '-':num[j+1]=num[j]-num[j+1];break;
case '=':break;
}
gcvt(num[i],12,str); /*将浮点数转换成字符串*/
for(j=0;j<12;j++)
if(str[j]=='。
'&&!str[j+1]) str[j]=str[j+1]; /*当小数点后紧接字符串结束标志时,原本应该输出如"5。
",处理后为"5"*/
printf("Result=%s\n",str); /*计算式的结果,最终存放在最后一项的字符串中*/
loop2:
printf("Continue(y/n)?"); /*是否继续,y表示继续,n表示退出*/
switch(getch())
{
case 'y':{system("cls");goto loop1;} /*点击y,清空屏幕,返回标记位置*/
case 'n':exit(0); /*点击n,退出程序*/
default :exit(0); /*点击其它键,也退出程序*/
}
getch();
return 0;
}
说明:必须将扩展名设置为c,若是cpp,将无法通过系统的编译。