四则运算(第二版)

结对编程伙伴:栾骄阳

功能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

结对编程伙伴 栾骄阳及我

原文地址:https://www.cnblogs.com/wangsen123/p/5868646.html