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

纽伦堡记忆 2014-12-07 03:57:09
求大神用C语言设计一个简单的计算器进行加减乘除,可带括号,不限定运算式的输入长度,多加些注释,不要太难
...全文
20478 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这个代码有问题,当输入的第一个数为负数时,程序会当成正数计算。。。。。。
  • 打赏
  • 举报
回复
= =请问 Bug解决了吗,我老师也让我弄这个,唉,,不太会
baidu_34156535 2016-03-03
  • 打赏
  • 举报
回复
请问整个程序里面for循环那个句子是不是有点问题,为什么我打出来,却说哪里有语法错误呢?
qq_27626945 2015-04-22
  • 打赏
  • 举报
回复
虽然看着不是很懂,但还是有bug.


引用 18 楼 wenpinglaoyao 的回复:
[quote=引用 17 楼 flexman09 的回复:]
经调试最后指出个小错误:
代码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]
赵4老师 2014-12-29
  • 打赏
  • 举报
回复
引用 12 楼 wenpinglaoyao 的回复:
里面的【{ 和 }】你换成圆括号就好了,因为我的键盘打不出来圆括号【字母区上方的“9”键坏了】
Windows下,试试 按住Alt键不放,按小键盘上的4、0,松开Alt键输入'(' 按住Alt键不放,按小键盘上的4、1,松开Alt键输入')'
赵4老师 2014-12-29
  • 打赏
  • 举报
回复
引用 19 楼 qq_24298805 的回复:
单纯的加减乘除能解决,而加了括号就不对了,如下: 本该结果是16,却是11。。。 最近有点事,没顾上上论坛给分,解决完这个问题就马上给分,谢大神了
全角括号()和半角括号()不是一回事!
赵4老师 2014-12-29
  • 打赏
  • 举报
回复
引用 24 楼 wenpinglaoyao 的回复:
[quote=引用 22 楼 zhao4zhong1 的回复:] [quote=引用 12 楼 wenpinglaoyao 的回复:] 里面的【{ 和 }】你换成圆括号就好了,因为我的键盘打不出来圆括号【字母区上方的“9”键坏了】
Windows下,试试 按住Alt键不放,按小键盘上的4、0,松开Alt键输入'(' 按住Alt键不放,按小键盘上的4、1,松开Alt键输入')'[/quote] 我去! 大神你为何总是这么吊!!! 彻底跪了。。。以后再也不用专门去复制圆括号了。。。[/quote]
纹枰老妖 2014-12-29
  • 打赏
  • 举报
回复
引用 22 楼 zhao4zhong1 的回复:
[quote=引用 12 楼 wenpinglaoyao 的回复:] 里面的【{ 和 }】你换成圆括号就好了,因为我的键盘打不出来圆括号【字母区上方的“9”键坏了】
Windows下,试试 按住Alt键不放,按小键盘上的4、0,松开Alt键输入'(' 按住Alt键不放,按小键盘上的4、1,松开Alt键输入')'[/quote] 我去! 大神你为何总是这么吊!!! 彻底跪了。。。以后再也不用专门去复制圆括号了。。。
纽伦堡记忆 2014-12-29
  • 打赏
  • 举报
回复
嗯,这就对了,就是全角和半角的原因,感谢
纽伦堡记忆 2014-12-28
  • 打赏
  • 举报
回复
这是程序应该没错误啊,欢迎指错,,谢了 #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"); }
纽伦堡记忆 2014-12-28
  • 打赏
  • 举报
回复
单纯的加减乘除能解决,而加了括号就不对了,如下: 本该结果是16,却是11。。。 最近有点事,没顾上上论坛给分,解决完这个问题就马上给分,谢大神了
纹枰老妖 2014-12-16
  • 打赏
  • 举报
回复
引用 17 楼 flexman09 的回复:
经调试最后指出个小错误: 代码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,谢谢这位细心的大神!
flexman09 2014-12-15
  • 打赏
  • 举报
回复
经调试最后指出个小错误: 代码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());
}
纹枰老妖 2014-12-15
  • 打赏
  • 举报
回复
还有什么不懂的吗朋友,欢迎提问。
纹枰老妖 2014-12-14
  • 打赏
  • 举报
回复
引用 13 楼 qq_24298805 的回复:
你看这个算的不对,并且点任意键就闪退出了,是不是没有弄返回啊?求大神修改啊
因为最后没有加【=】号
纽伦堡记忆 2014-12-14
  • 打赏
  • 举报
回复

还有这括号完全没用啊
case '(':
i++;
digui(); // 如果遇到圆括号,则优先计算圆括号里面的内容
break;
我这改了啊
纽伦堡记忆 2014-12-14
  • 打赏
  • 举报
回复



你看这个算的不对,并且点任意键就闪退出了,是不是没有弄返回啊?求大神修改啊
纹枰老妖 2014-12-13
  • 打赏
  • 举报
回复
里面的【{ 和 }】你换成圆括号就好了,因为我的键盘打不出来圆括号【字母区上方的“9”键坏了】
纹枰老妖 2014-12-13
  • 打赏
  • 举报
回复
纹枰老妖 2014-12-13
  • 打赏
  • 举报
回复
#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());
}
加载更多回复(9)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧