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

    结对编程伙伴 栾骄阳及我

  • 相关阅读:
    写360搜索网页总结
    display和position以及其余标签的使用
    MySQL中的 show index命令
    MySQL中查看索引使用情况
    分布式存储容错原理
    MySQL中通过trace分析优化器跟踪SQL
    MySQL中的 show profile 分析sql
    MySQL 中的 dual表
    Every derived table must have its own alias(sql语句错误解决方法)
    MySQL 中的 explain 语句各字段解释
  • 原文地址:https://www.cnblogs.com/wangsen123/p/5868646.html
Copyright © 2011-2022 走看看