Code Bye

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

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

5

引用:

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

本该结果是16,却是11。
最近有点事,没顾上上论坛给分,解决完这个问题就马上给分,谢高手了

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


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求用C语言设计一个简单的计算器进行加减乘除,可带括号,不限定运算式的输入长度,多加些注释,不要太难