user-0 提问: 求大神用C语言设计一个简单的计算器进行加减乘除，可带括号，不限定运算式的输入长度，多加些注释，不要太难

回复:
user: user-1
content: 这个代码有问题，当输入的第一个数为负数时，程序会当成正数计算。。。。。。

user: user-1
content: = =请问 Bug解决了吗，我老师也让我弄这个，唉，，不太会

user: user-2
content: 请问整个程序里面for循环那个句子是不是有点问题，为什么我打出来，却说哪里有语法错误呢？

user: user-3
content: 虽然看着不是很懂，但还是有bug.   引用 18 楼 wenpinglaoyao 的回复:[quote=引用 17 楼 user-6 的回复:] 经调试最后指出个小错误： 代码72行应改为 if(fu[i]=='+'||fu[i]=='-'||fu[i]=='=') fu[i]为=时也该i--[quote=引用 10 楼 wenpinglaoyao 的回复:] #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] < '0' || c[i] > '9')     		fu[j++]=c[i];     	}  // 这个则是收集输入流中的运算符         j=n;          i=0;     n=0;  // 这里的清零是必须的               printf(":::::%f\n", digui()); }[/quote]  我按原版试了一下，果然藏着这个可恶的bug，谢谢这位细心的大神！[/quote]

user: user-4
content: 引用 12 楼 wenpinglaoyao 的回复:里面的【{  和  }】你换成圆括号就好了，因为我的键盘打不出来圆括号【字母区上方的“9”键坏了】 Windows下，试试 按住Alt键不放，按小键盘上的4、0，松开Alt键输入'(' 按住Alt键不放，按小键盘上的4、1，松开Alt键输入')'

user: user-4
content: 引用 19 楼 qq_24298805 的回复:单纯的加减乘除能解决，而加了括号就不对了，如下：    本该结果是16，却是11。。。 最近有点事，没顾上上论坛给分，解决完这个问题就马上给分，谢大神了 全角括号（）和半角括号()不是一回事！

user: user-4
content: 引用 24 楼 wenpinglaoyao 的回复:[quote=引用 22 楼 zhao4zhong1 的回复:] [quote=引用 12 楼 wenpinglaoyao 的回复:] 里面的【{  和  }】你换成圆括号就好了，因为我的键盘打不出来圆括号【字母区上方的“9”键坏了】 Windows下，试试 按住Alt键不放，按小键盘上的4、0，松开Alt键输入'(' 按住Alt键不放，按小键盘上的4、1，松开Alt键输入')'[/quote]  我去！ 大神你为何总是这么吊！！！ 彻底跪了。。。以后再也不用专门去复制圆括号了。。。[/quote]

user: user-5
content: 引用 22 楼 zhao4zhong1 的回复:[quote=引用 12 楼 wenpinglaoyao 的回复:] 里面的【{  和  }】你换成圆括号就好了，因为我的键盘打不出来圆括号【字母区上方的“9”键坏了】 Windows下，试试 按住Alt键不放，按小键盘上的4、0，松开Alt键输入'(' 按住Alt键不放，按小键盘上的4、1，松开Alt键输入')'[/quote]  我去！ 大神你为何总是这么吊！！！ 彻底跪了。。。以后再也不用专门去复制圆括号了。。。

user: user-0
content: 嗯，这就对了，就是全角和半角的原因，感谢

user: user-0
content: 这是程序应该没错误啊，欢迎指错，，谢了   #include<stdio.h> #include<stdlib.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]=='-'||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++;                               }                          }                          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;                 if(fu[i]=='+'||fu[i]=='-'||fu[i]=='=')                 i--;                 break;                }       }        if(hefu == '+') val[n] = he + val[n];  // 到这里就是到了一个递归的结束，然后根据hefu的状态决定进行+运算或-运算       else val[n] = he - val[n];            return val[n];  // 最后我们需要返回这个值}   }        int 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] < '0' || c[i] > '9')                  fu[j++]=c[i];            }  // 这个则是收集输入流中的运算符            j=n;             i=0;        n=0;  // 这里的清零是必须的                  printf("=%f\n", digui());    system("pause");    }

user: user-0
content: 单纯的加减乘除能解决，而加了括号就不对了，如下：    本该结果是16，却是11。。。 最近有点事，没顾上上论坛给分，解决完这个问题就马上给分，谢大神了

user: user-5
content: 引用 17 楼 user-6 的回复:经调试最后指出个小错误： 代码72行应改为 if(fu[i]=='+'||fu[i]=='-'||fu[i]=='=') fu[i]为=时也该i--[quote=引用 10 楼 wenpinglaoyao 的回复:] #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] < '0' || c[i] > '9')     		fu[j++]=c[i];     	}  // 这个则是收集输入流中的运算符         j=n;          i=0;     n=0;  // 这里的清零是必须的               printf(":::::%f\n", digui()); }[/quote]  我按原版试了一下，果然藏着这个可恶的bug，谢谢这位细心的大神！

user: user-6
content: 经调试最后指出个小错误： 代码72行应改为 if(fu[i]=='+'||fu[i]=='-'||fu[i]=='=') fu[i]为=时也该i--引用 10 楼 wenpinglaoyao 的回复:#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] < '0' || c[i] > '9')     		fu[j++]=c[i];     	}  // 这个则是收集输入流中的运算符         j=n;          i=0;     n=0;  // 这里的清零是必须的               printf(":::::%f\n", digui()); }

user: user-5
content: 还有什么不懂的吗朋友，欢迎提问。

user: user-5
content: 引用 13 楼 qq_24298805 的回复:   你看这个算的不对，并且点任意键就闪退出了，是不是没有弄返回啊？求大神修改啊  因为最后没有加【=】号

user: user-0
content: 还有这括号完全没用啊 case '(':                i++;                digui();  // 如果遇到圆括号，则优先计算圆括号里面的内容                break;     我这改了啊

user: user-0
content: 你看这个算的不对，并且点任意键就闪退出了，是不是没有弄返回啊？求大神修改啊

user: user-5
content: 里面的【{  和  }】你换成圆括号就好了，因为我的键盘打不出来圆括号【字母区上方的“9”键坏了】

user: user-5

user: user-5
content: #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] < '0' || c[i] > '9')     		fu[j++]=c[i];     	}  // 这个则是收集输入流中的运算符         j=n;          i=0;     n=0;  // 这里的清零是必须的               printf(":::::%f\n", digui()); }