c语言字符串数组长度计算器,求用C语言设计一个简单的计算器进行加减乘除,可带括号,不限定运算式的输入长度,多加些注释,不要太难...

求高手用C语言设计一个简单的计算器进行加减乘除,可带括号,不限定运算式的输入长度,多加些注释,不要太难

3fb0d309e409828ed8276871481c3d8d.gif

解决方案

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

引用:

单纯的加减乘除能解决,而加了括号就不对了,如下:

96f3309ba67424b596209013a4264ddb.png

本该结果是16,却是11。

最近有点事,没顾上上论坛给分,解决完这个问题就马上给分,谢高手了

全角括号()和半角括号()不是一回事!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值