求高手用C语言设计一个简单的计算器进行加减乘除,可带括号,不限定运算式的输入长度,多加些注释,不要太难
解决方案
80
#include "stdio.h"
int n,i; /* 请注意这里的n与i设置为全局变量的用意 */
float val[100]; /* 这个数组用来收集字符流中的数 */
char c[1000],fu[100]; /* c数组是字符流,而fu数组用来收集计算符号+-* /和{、}*/
float digui()
{
float he=0,ji=0; /* he代表加减运算结果,ji代表乘除运算结果 */
char hefu="+"; /* 每次进入递归是,都要把标示符he设置为0,hefu设置为+。但那个标示符ji可以不用设置 */
for( ;fu[i]!="}"&&fu[i]!="=";i++)
{
switch(fu[i])
{
case "{":
i++;
digui(); // 假如遇到圆括号,则优先计算圆括号里面的内容
break;
case "+":
if(hefu=="+") {val[n] = he + val[n];he = val[n];}
else {val[n] = he - val[n],he = val[n];} // 假如+、-后面的符号依然是加减,则可以进行计算
hefu = "+";
n++;
break;
case "-":
if(hefu=="+") {val[n] = he + val[n];he = val[n];}
else {val[n] = he - val[n];he = val[n];} // 同上
hefu = "-";
n++;
break;
case "*": // 假如遇到优先级高一级的乘符号【或除符号】,则进入循环,直至遇到非乘除符号时推出
{
ji=val[n]; // ji在这里被设置
while(1)
{
if(fu[i] == "*")
{
if(fu[i+1] == "{") // 假如在乘除循环里遇到圆括号,则递归调用自身,就是优先计算圆括号里面的内容
{
i+=2;n++;
ji = ji * digui();
}
else
{
ji = ji*val[n+1];
i++;n++;
}
}
else if(fu[i] == "/")
{
if(fu[i+1] == "{")
{
i+=2;n++;
ji = ji / digui();
}
else
{
ji = ji/val[n+1];
i++;n++;
}
}
else break; // 遇到非乘除符号,退出
}
val[n] = ji; // 乘除循环结束,把n现在指向的数设置成循环计算的结果数,以便它以后可以与he计算,最后得出前面全部数的运算结果
if(fu[i]=="+"||fu[i]=="-")
i--;
break;
}
case "/": //这个与上面那个case里面的作用一样
{
ji = val[n];
while(1)
{
if(fu[i] == "*")
{
if(fu[i+1] == "{")
{
i+=2;n++;
ji = ji * digui();
}
else
{
ji = ji*val[n+1];
i++;n++;
}
}
if(fu[i] == "/")
{
if(fu[i+1] == "{")
{
i+=2;n++;
ji = ji / digui();
}
else
{
ji = ji/val[n+1];
i++;n++;
}
}
else break;
}
}
val[n] = ji;
if(fu[i]=="+"||fu[i]=="-")
i--;
break;
}
}
if(hefu == "+") val[n] = he + val[n]; // 到这里就是到了一个递归的结束,然后根据hefu的状态决定进行+运算或-运算
else val[n] = he - val[n];
return val[n]; // 最后我们需要返回这个值
}
void main()
{
int a=0,j=0;float b=0,d=0,g=10;;
gets(c);
for(i=0;c[i]!=0&&i<1000;i++)
{
if(c[i]>="0"&&c[i]<="9")
{
while(c[i]>="0"&&c[i]<="9")
{
b=(c[i]-"0")+b*10;
i++;
}
if(c[i]==".")
{
i++;
while(c[i]>="0"&&c[i]<="9")
{
d=d+(c[i]-"0")/g;
g*=10;
i++;
}
} // 以上是手机输入流中的数
val[n]=b+d;
n++;
}
b=0;d=0;g=10;
}
for(i=0;c[i]!=0;i++)
{
if(c[i] "9")
fu[j++]=c[i];
} // 这个则是收集输入流中的运算符
j=n;
i=0;
n=0; // 这里的清零是必须的
printf(":::::%f\n", digui());
}
5
引用:
单纯的加减乘除能解决,而加了括号就不对了,如下:
本该结果是16,却是11。
最近有点事,没顾上上论坛给分,解决完这个问题就马上给分,谢高手了
全角括号()和半角括号()不是一回事!