判断随机生成的四则运算结果

功能:1.随机生成一个四则运算

         2.用户输入式子结果后判断是否正确(结果取整)

输出结果:

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stack>
using namespace std;
int n,t,n1;
struct ZX
{
	char a;
	bool b;//if b=0 括号 if b=1 数字 
} ;
stack<ZX>s1;
void atersz(ZX number[100]);
void afterfh(ZX number[100]);
void passkh(ZX number[100]);
int convert(ZX number[100])
{
	stack<ZX>s2;
	for(int i=0;i<t;i++)
	{
		if(number[i].b==1)//操作数 
		s2.push(number[i]);
		else
		{
		    if(number[i].a==')')
			{  
				while(s1.top().a!='(')
				{
					s2.push(s1.top());
					s1.pop();
				}
				s1.pop();
			}
			else if(s1.empty()||s1.top().a=='('||number[i].a=='(')
			s1.push(number[i]); 
			else
			{
				if(number[i].b==0&&(number[i].a=='*'||number[i].a=='/')&&(s1.top().a=='+'||s1.top().a=='-'))
				s1.push(number[i]);
				else
				{
					s2.push(s1.top());
					s1.pop();
					i--;
				}
			}
		}	
	}
	while(!s1.empty())
	{
		s2.push(s1.top());
		s1.pop();
	}
	while(!s2.empty())
	{
		ZX s=s2.top();
		s2.pop();
		s1.push(s);
	}
	ZX c1;
	int c2,c3,c4;
	stack<int>s3;
    while(!s1.empty())
    {
    	c1=s1.top();
    	s1.pop();
    	if(c1.b==1)
    	s3.push(c1.a);
    	else
    	{
    		c2=s3.top();
    		s3.pop();
    		c3=s3.top();
    		s3.pop();
    		switch(c1.a)
    		{
    			case '+':c4=c3+c2;break;
    			case '-':c4=c3-c2;break;
    			case '*':c4=c3*c2;break;
    			case '/':c4=c3/c2;break;
			}
			s3.push(c4);
		}	
	}
	return s3.top();
}
int main()
{
	/*随机生成一个四则运算(100以内)
	  第一位 左括号(0-2) 数字(3-9) 
	  数字后面是+-/*(0-2) 什么都没有(3-6) 右括号(7-9)
	  右括号后面  +-/*(0-2) 什么都没有(3-6) 右括号(7-9)
	   +-/*后面 左括号(0-2) 数字(3-9)
	   左括号后面 左括号(0-2) 数字(3-9)
	*/	
	while(1)
	{
    	n1=0,n=0;
    	ZX number[100];
	    t=0;
	    afterfh(number);
	    while(n>0)
	    {	    	
			number[t].a=')';
		    number[t++].b=0;	
			n--;		
    	}  
    	while(number[0].a=='('&&number[0].b==0&&number[t-1].b==0&&number[t-1].a==')')
	    passkh(number); 
	    while(number[t-3].a=='('&&number[t-3].b==0)
	    {
	    		number[t-3].a=number[t-2].a;
	    		number[t-3].b=number[t-2].b;
	    		t-=2;
		}
    	for(int i=0;i<t;i++)
    	{
	    	if(number[i].b==0)
	        printf("%c",number[i].a);
	        else
	        printf("%d",number[i].a);
        }
        printf("=\n");
        int p,q=convert(number);
		scanf("%d",&p);
        if(p==q)
        printf("正确\n\n");
        else
        printf("错误 正确结果为:%d\n\n",q);
        
    }
	return 0;
}
void passkh(ZX number[100])
{
	for(int i=1;i<t-1;i++)
	{
		number[i-1].a=number[i].a;
		number[i-1].b=number[i].b;
	}
	t-=2;
}
void aftersz(ZX number[100])
{
	int i=rand()%10;
	if(i<=2)
	{
		int j=rand()%4;
		switch(j)
		{
			case 0:number[t].a='+';break;
			case 1:number[t].a='-';break;
			case 2:number[t].a='*';break;
			case 3:number[t].a='/';break;
		}
		number[t].b=0;
		t++;
		afterfh(number);
	}
	else if(i>=3&&i<=6)
	{
	    if(n1==1)
	    {
	    	aftersz(number);
		}
		else
	    return ;
    }
	else//右括号 
    {
        if(n>0&&number[t-2].a!='('&&number[t-2].b!=0)
        {
            number[t].b=0;
            number[t].a=')';
            n--; 
            t++;
            aftersz(number);
        }
        else
        aftersz(number);
	}	
}
void afterfh(ZX number[100])
{
		int p=rand()%10;
		if(p>=3)//数字 
		{
			number[t].b=1;
			number[t].a=rand()%100;	
		    t++;
		    n1++;
			aftersz(number);
		}
		else//左括号 
		{
			number[t].b=0;
			number[t].a='(';
			n++;
			t++;
			afterfh(number);
		}
}

  

posted @ 2016-09-05 23:10  王森123  阅读(464)  评论(1编辑  收藏  举报