zoukankan      html  css  js  c++  java
  • 四则运算(第二版)

    结对编程伙伴:栾骄阳

    功能1. 四则运算

    支持出题4个数的四则运算题目

    #include<stdio.h>
    #include<stack>
    #include<stdlib.h>
    #include<string>
    #include<math.h>
    using namespace std;
    struct Number
    {
    	double a;
    	bool b;//0数字 1字符 
    };
    stack<Number>s3;
    void houzhuibds(char str[100])//后缀表达式 
    {
    	
    	stack<char>s1;
    	stack<Number>s2;
    	int i=0,j=0;
    	for(i=0;str[i]!='';i++)
    	{
    		if(str[i]>='0'&&str[i]<='9')
    		{
    			Number num;
    			num.a=0;
    			num.b=0;
    			while(str[i]<='9'&&str[i]>='0')
    			num.a=(str[i++]-'0')+num.a*10;
    			s2.push(num);	
    			i--;
    		}
    		else
    		{
    			if(str[i]==')')
    			{
    				while(s1.top()!='(')
    				{
    					Number num;
    					num.b=1;
    					num.a=s1.top();
    					s2.push(num);
    					s1.pop();
    				}
    				s1.pop();
    			}
    			else if(s1.empty()||s1.top()=='('||str[i]=='(')
    			{
    				s1.push(str[i]);
    			}
    			else
    			{
    				if((str[i]=='*'||str[i]=='/')&&(s1.top()=='+'||s1.top()=='-'))
    				s1.push(str[i]);
    				else
    				{
    					Number num;
    					num.b=1;
    					num.a=s1.top();
    					s2.push(num);
    					s1.pop();
    					i--;
    				}
    			}			
    		}
    	}
    	while(!s1.empty())
    	{
    		Number num;
    		num.b=1;
    		num.a=s1.top();
    		s2.push(num);
    		s1.pop();
    	}
    	while(!s2.empty())
    	{
    		s3.push(s2.top());
    		s2.pop();
    	}
        /*
    	while(!s3.empty())
    	{
    		Number num=s3.top();
    		s3.pop();
    		if(num.b==0)
    		printf("%d",num.a);
    		else
    		printf("%c",num.a);
    		
    	}
    	printf("
    ");
    	*/
    }
    double qiuzhi()
    {
    	stack<double>s4;
    	while(!s3.empty())
    	{
    		Number c1=s3.top();
    		s3.pop();
    		if(c1.b==0)
    		s4.push(c1.a);
    		else
    		{
    			double c2=s4.top();
    			s4.pop();
    			double c3=s4.top();
    			s4.pop();
    			double c4;
    			switch((int)c1.a)
    			{
    				case '+':c4=c3+c2;break;
        			case '-':c4=c3-c2;break;
        			case '*':c4=c3*c2;break;
        			case '/':c4=c3/c2;break;
    			}
    			s4.push(c4);
    		}
    	}
    	return s4.top();
    }
    void afterfh(char str[100],int t,int n);//+-*/之后 
    void aftersz(char str[100],int t,int n);
    int main()
    {
    	char str[100];
    	int s=0;
    	for(int i=0;i<20;i++)
    	{
    		int t=0;
    		int n=0;
    		afterfh(str,t,n);
    		//gets(str);//4个数3个符号 
    		houzhuibds(str);
    		double ans=qiuzhi();
    		for(int i=0;str[i]!='';i++)
    		printf("%c",str[i]);
    		printf("=
    ?");
    		double s;
    		scanf("%lf",&s);
    		if(abs(s-ans)<0.01)
    		{
    			s++;
    		    printf("答对了,你真是天才
    ");
    	    }
    		else
    		printf("再想想吧,答案似乎是%.2lf喔!
    ",ans);
        }
        printf("你一共答对%d道题,共20道题。
    ",s);
    	return 0;
    }
    void aftersz(char str[100],int t,int n)
    {
    	int num=rand()%4;
    	switch(num)
    	{
    		case 0:str[t]='+';break;
    		case 1:str[t]='-';break;
    		case 2:str[t]='*';break;
    		case 3:str[t]='/';break;
    	}
    	afterfh(str,++t,n);
    }
    void afterfh(char str[100],int t,int n)//+-*/之后 
    {
    	int num=rand()%100;
    	if(num>=10)
    	{
    		int a=num%10;
    		str[t++]=num/10+'0';
    		str[t]=a+'0';
    	}
    	else
    	str[t]='0'+num;
    	n++;
    	if(n==4)
    	{
    		str[++t]='';
    		return ;	
    	}
    	t++;
    	aftersz(str,t,n);
    }
    

    功能2:支持括号

    代码:

    #include<stdio.h>
    #include<stack>
    #include<stdlib.h>
    #include<string>
    #include<string.h>
    #include<math.h>
    using namespace std;
    int y=0;
    struct Number
    {
    	double a;
    	bool b;//0数字 1字符 
    };
    stack<Number>s3;
    void houzhuibds(char str[100])//后缀表达式 
    {
    	
    	stack<char>s1;
    	stack<Number>s2;
    	int i=0,j=0;
    	for(i=0;str[i]!='';i++)
    	{
    		if(str[i]>='0'&&str[i]<='9')
    		{
    			Number num;
    			num.a=0;
    			num.b=0;
    			while(str[i]<='9'&&str[i]>='0')
    			num.a=(str[i++]-'0')+num.a*10;
    			s2.push(num);	
    			i--;
    		}
    		else
    		{
    			if(str[i]==')')
    			{
    				while(s1.top()!='(')
    				{
    					Number num;
    					num.b=1;
    					num.a=s1.top();
    					s2.push(num);
    					s1.pop();
    				}
    				s1.pop();
    			}
    			else if(s1.empty()||s1.top()=='('||str[i]=='(')
    			{
    				s1.push(str[i]);
    			}
    			else
    			{
    				if((str[i]=='*'||str[i]=='/')&&(s1.top()=='+'||s1.top()=='-'))
    				s1.push(str[i]);
    				else
    				{
    					Number num;
    					num.b=1;
    					num.a=s1.top();
    					s2.push(num);
    					s1.pop();
    					i--;
    				}
    			}			
    		}
    	}
    	while(!s1.empty())
    	{
    		Number num;
    		num.b=1;
    		num.a=s1.top();
    		s2.push(num);
    		s1.pop();
    	}
    	while(!s2.empty())
    	{
    		s3.push(s2.top());
    		s2.pop();
    	}
    }
    double qiuzhi()
    {
    	stack<double>s4;
    	while(!s3.empty())
    	{
    		Number c1=s3.top();
    		s3.pop();
    		if(c1.b==0)
    		s4.push(c1.a);
    		else
    		{
    			double c2=s4.top();
    			s4.pop();
    			double c3=s4.top();
    			s4.pop();
    			double c4;
    			switch((int)c1.a)
    			{
    				case '+':c4=c3+c2;break;
        			case '-':c4=c3-c2;break;
        			case '*':c4=c3*c2;break;
        			case '/':c4=c3/c2;break;
    			}
    			s4.push(c4);
    		}
    	}
    	return s4.top();
    }
    void afterfh(char str[100],int t,int n);//+-*/之后 
    void aftersz(char str[100],int t,int n);
    int main()
    {
    	char str[100];
    	int s=0;
    	for(int i=0;i<20;i++)
    	{
    		int t=0;
    		int n=0;
    		afterfh(str,t,n); 
    		int len=strlen(str);
    		while(y)
    		{
    			if(str[len-2]=='(')
    			{
    				str[len-2]=str[len-1];
    				len--;
    			}
    			else if(str[len-3]=='(')
    			{
    				str[len-3]=str[len-2];
    				str[len-2]=str[len-1];
    				len--;
    			}
    			else
    			str[len++]=')';    
    		    y--;
    		}
    		str[len]='';
    		houzhuibds(str);
    		double ans=qiuzhi();
    		for(int i=0;str[i]!='';i++)
    		printf("%c",str[i]);
    		printf("=
    ?");
    		double s;
    		scanf("%lf",&s);
    		if(abs(s-ans)<0.01)
    		{
    			s++;
    		    printf("答对了,你真是天才
    ");
    	    }
    		else
    		printf("再想想吧,答案似乎是%.2lf喔!
    ",ans);
        }
        printf("你一共答对%d道题,共20道题。
    ",s);
    	return 0;
    }
    void aftersz(char str[100],int t,int n)//数字后面是+-/*(0-4)  右括号(5-9)
    {
    	int i=rand()%10;
    	if(i<=4)
    	{
    		int j=rand()%4;
    		switch(j)
    		{
    			case 0:str[t]='+';break;
    			case 1:str[t]='-';break;
    			case 2:str[t]='*';break;
    			case 3:str[t]='/';break;
    		}
    		afterfh(str,++t,n);
    	}
    	else//右括号 
        {
            if(y>0&&(str[t-2]!='('||str[t-3]!='('&&(str[t-2]<='0'&&str[t-2]>='9')))
            {
                str[t]=')';
                y--;
                aftersz(str,++t,n);
            }
            else
            aftersz(str,t,n);   
    	}	
    	
    }
    void afterfh(char str[100],int t,int n)//+-*/之后 
    {
    		int p=rand()%10;
    		if(p>=3)//数字 
    		{
    			int num=rand()%100;
    			if(num>=10)
    			{
    				int a=num%10;
    				str[t++]=num/10+'0';
    				str[t]=a+'0';
    			}
    			else
    			str[t]='0'+num;
    			n++;
    			if(n==4)
    			{
    				str[++t]='';
    				return ;	
    			}
    			aftersz(str,++t,n);
    		}
    		else//左括号 
    		{
    			str[t]='(';
    			y++;
    			afterfh(str,++t,n);
    		}
    }
    功能3:限定题目数量,"精美"打印输出
    输入:
    打印结果:
    代码:
    #include<stdio.h>
    #include<stack>
    #include<stdlib.h>
    #include<string>
    #include<string.h>
    #include<math.h>
    using namespace std;
    int y=0;
    struct Number
    {
    	double a;
    	bool b;//0数字 1字符 
    };
    stack<Number>s3;
    void houzhuibds(char str[100])//后缀表达式 
    {
    	
    	stack<char>s1;
    	stack<Number>s2;
    	int i=0,j=0;
    	for(i=0;str[i]!='';i++)
    	{
    		if(str[i]>='0'&&str[i]<='9')
    		{
    			Number num;
    			num.a=0;
    			num.b=0;
    			while(str[i]<='9'&&str[i]>='0')
    			num.a=(str[i++]-'0')+num.a*10;
    			s2.push(num);	
    			i--;
    		}
    		else
    		{
    			if(str[i]==')')
    			{
    				while(s1.top()!='(')
    				{
    					Number num;
    					num.b=1;
    					num.a=s1.top();
    					s2.push(num);
    					s1.pop();
    				}
    				s1.pop();
    			}
    			else if(s1.empty()||s1.top()=='('||str[i]=='(')
    			{
    				s1.push(str[i]);
    			}
    			else
    			{
    				if((str[i]=='*'||str[i]=='/')&&(s1.top()=='+'||s1.top()=='-'))
    				s1.push(str[i]);
    				else
    				{
    					Number num;
    					num.b=1;
    					num.a=s1.top();
    					s2.push(num);
    					s1.pop();
    					i--;
    				}
    			}			
    		}
    	}
    	while(!s1.empty())
    	{
    		Number num;
    		num.b=1;
    		num.a=s1.top();
    		s2.push(num);
    		s1.pop();
    	}
    	while(!s2.empty())
    	{
    		s3.push(s2.top());
    		s2.pop();
    	}
    }
    double qiuzhi()
    {
    	stack<double>s4;
    	while(!s3.empty())
    	{
    		Number c1=s3.top();
    		s3.pop();
    		if(c1.b==0)
    		s4.push(c1.a);
    		else
    		{
    			double c2=s4.top();
    			s4.pop();
    			double c3=s4.top();
    			s4.pop();
    			double c4;
    			switch((int)c1.a)
    			{
    				case '+':c4=c3+c2;break;
        			case '-':c4=c3-c2;break;
        			case '*':c4=c3*c2;break;
        			case '/':c4=c3/c2;break;
    			}
    			s4.push(c4);
    		}
    	}
    	return s4.top();
    }
    void afterfh(char str[100],int t,int n);//+-*/之后 
    void aftersz(char str[100],int t,int n);
    int main()
    {
    	FILE *fp;
        fp=fopen("D:\2.txt","w");
    	char str[100];
    	char s[100];
    	int z=0;
    	while(1)
    	{
    		int k=0,flag=0;
    		scanf("%s",&s);
    		while(s[k]!='')
    		{
    			if(s[k]>='0'&&s[k]<='9')
    			z=z*10+s[k]-'0';
    			else
    			{
    				flag=1;
    				break;
    			}
    			k++;
    		}
    		if(flag==1)
    		printf("题目数量必须是 正整数。
    ");
    		else
    		break;
    	}
    	getchar();
    	for(int i=0;i<z;i++)
    	{
    		int t=0;
    		int n=0;
    		afterfh(str,t,n); 
    		int len=strlen(str);
    		while(y)
    		{
    			if(str[len-2]=='(')
    			{
    				str[len-2]=str[len-1];
    				len--;
    			}
    			else if(str[len-3]=='(')
    			{
    				str[len-3]=str[len-2];
    				str[len-2]=str[len-1];
    				len--;
    			}
    			else
    			str[len++]=')';    
    		    y--;
    		}
    		str[len]='';
    		houzhuibds(str);
    		double ans=qiuzhi();
    		fprintf(fp,"%25s",str);
    		fprintf(fp,"=                   %.2lf
    ",ans);
        }
    	return 0;
    }
    void aftersz(char str[100],int t,int n)//数字后面是+-/*(0-4)  右括号(5-9)
    {
    	int i=rand()%10;
    	if(i<=4)
    	{
    		int j=rand()%4;
    		switch(j)
    		{
    			case 0:str[t]='+';break;
    			case 1:str[t]='-';break;
    			case 2:str[t]='*';break;
    			case 3:str[t]='/';break;
    		}
    		afterfh(str,++t,n);
    	}
    	else//右括号 
        {
            if(y>0&&(str[t-2]!='('||str[t-3]!='('&&(str[t-2]<='0'&&str[t-2]>='9')))
            {
                str[t]=')';
                y--;
                aftersz(str,++t,n);
            }
            else
            aftersz(str,t,n);   
    	}	
    	
    }
    void afterfh(char str[100],int t,int n)//+-*/之后 
    {
    		int p=rand()%10;
    		if(p>=3)//数字 
    		{
    			int num=rand()%100;
    			if(num>=10)
    			{
    				int a=num%10;
    				str[t++]=num/10+'0';
    				str[t]=a+'0';
    			}
    			else
    			str[t]='0'+num;
    			n++;
    			if(n==4)
    			{
    				str[++t]='';
    				return ;	
    			}
    			aftersz(str,++t,n);
    		}
    		else//左括号 
    		{
    			str[t]='(';
    			y++;
    			afterfh(str,++t,n);
    		}
    }
    

      

    功能4:未完成

    conding.net         git@git.coding.net:w547240561/myboke.git

             https://git.coding.net/w547240561/myboke.git

    结对编程伙伴 栾骄阳及我

  • 相关阅读:
    HDU 5528 Count a * b 欧拉函数
    HDU 5534 Partial Tree 完全背包
    HDU 5536 Chip Factory Trie
    HDU 5510 Bazinga KMP
    HDU 4821 String 字符串哈希
    HDU 4814 Golden Radio Base 模拟
    LA 6538 Dinner Coming Soon DP
    HDU 4781 Assignment For Princess 构造
    LA 7056 Colorful Toy Polya定理
    LA 6540 Fibonacci Tree
  • 原文地址:https://www.cnblogs.com/wangsen123/p/5868646.html
Copyright © 2011-2022 走看看