码迷,mamicode.com
首页 > 其他好文 > 详细

二柱子问题扩充:1、题目避免重复; 2、可定制(数量/打印方式); 3、可以控制下列参数: 是否有乘除法、是否有括号、 数值范围、加减有无负数、除法有无余数、否支持分数 (真分数, 假分数, …)、是否支持小数 (精确到多少位)、打印中每行的间隔可调整;

时间:2015-03-15 13:46:35      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

程序设计思想

     程序的主要设计思想为用字符串数组保存生成的运算题,将操作数采用单独算法处理,然后进行类型转换和操作符一起存入数组中,鉴于字符串的特性,可以对字符串的长度进行随意添加而不必考虑长度问题,最后进行字符串数组的输出产生客户要求的运算题;

源代码

#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<iostream>
#include<string>
#include<cstring>
#include<iomanip>
using namespace std;
bool IfRepeated(int CurLocation,string a[])//是否重复
{
	for(int p=0;p<CurLocation;p++)
	{
		for(int q=0;a[p][q]!=‘\0‘ && a[CurLocation][q]!=‘\0‘;q++)
		{	
			if(a[p][q]!=a[CurLocation][q])
				p++;
			if(a[p][q]==‘\0‘&&a[CurLocation][q]==‘\0‘)
					return true;
		}
	}
	return false;
}
void Digit(int i,int j,string a[],int Location,int IfDecimal,int Random)//数字转变为字符
{
	if(IfDecimal==1)
	{
		if(Random==1)
		{
			a[Location]+=‘0‘;
			a[Location]+=‘.‘;
			a[Location]+=(char)(j%10+48);
			if(j%100/10!=0)
			a[Location]+=(char)(j%100/10+48);
			if(j/100!=0)
			a[Location]+=(char)(j/100+48);
		}
		else
		{
			if(i/100!=0)
			{
				a[Location]+=(char)(i/100+48);
			}
			if(i%100/10!=0)
			{
				a[Location]+=(char)(i%100/10+48);
			}
			a[Location]+=(char)(i%10+48);
		}
	}
	else
	{
		if(i/100!=0)
		{
			a[Location]+=(char)(i/100+48);
		}
		if(i%100/10!=0)
		{
			a[Location]+=(char)(i%100/10+48);
		}
		a[Location]+=(char)(i%10+48);
	}
}
void DealDigit(string a[],int p,int range,int IfNegative,int IfFraction,int x,int IfDecimal,int DecDig)
{
	int RandomNum1=(int)rand()%100/50;//是否产生负数的随机数
	int RandomNum2=(int)rand()%100/50;//是否产生分数的随机数
	int RandomNum3=(int)rand()%DecDig;//小数的随机数
	int RandomNum4=(int)rand()%100/50;//是否产生小数
	x=(int)rand()%range;//分子
	int z=(int)rand()%range;//分母
	if(IfNegative==1)//随机生成数字
	{
		if(RandomNum1==1&&RandomNum2==1)//随机生成负分数
		{
			a[p]+=‘(‘;
			a[p]+=‘-‘;
			Digit(x,0,a,p,0,0);
			a[p]+=‘/‘;
			Digit(z,0,a,p,0,0);
			a[p]+=‘)‘;
		}
		else if(RandomNum1==1&&RandomNum2!=1)//负数
		{
			a[p]+=‘(‘;
			a[p]+=‘-‘;
			Digit(x,RandomNum3,a,p,IfDecimal,RandomNum4);
			a[p]+=‘)‘;
		}
		else//数字默认为正数
		{
			Digit(x,RandomNum3,a,p,IfDecimal,RandomNum4);
		}
	}
	else//正数
	{
		if(IfFraction==1)//随机生成正分数
		{
			if(RandomNum2==1)
			{
				a[p]+=‘(‘;
				Digit(x,0,a,p,0,0);
				a[p]+=‘/‘;
				Digit(z,0,a,p,0,0);
				a[p]+=‘)‘;
			}
		}
		else//默认为正数
		{
			Digit(x,RandomNum3,a,p,IfDecimal,RandomNum4);
		}
	}
}
/*IfIncMD是否有乘除,range数值范围,IfIncBrackets是否有括号,IfNeg加减是否允许有负数,IfRem除法是否允许有余数
  IfFraction是否支持分数,IfDec是否支持小数,DecDig设置小数范围*/
void Deal(int QstNum,string a[],int IfIncMD,int range,int IfIncBrackets,int IfNegative,int IfRemainder,int IfFraction,int IfDecimal,int DecDig)
{
	for(int p=0;p<QstNum;p++)
	{
		int count=0;
		int FirstNum=0,SecNum=0;//生成的相邻的两个操作数
		int RandomNum1,RandomNum2,RandomNum3,RandomNum4;
		int OperandNum=(int)rand()%10/5+2;//操作数的个数,属于二元或三元运算
		int Brackets=(int)rand()%100/50;//随机生成括号
		int z;//分母
		if(Brackets==1&&count==0&&OperandNum>2&&IfIncBrackets==1)//判断是否生成括号
		{
			a[p]+="(";
			count++;
		}
		DealDigit(a,p,range,IfNegative,IfFraction,FirstNum,IfDecimal,DecDig);//生成第一个数		
		for(int q=1;q<OperandNum;q++)
		{
			int Operator=(int)rand()%100/25;//操作符的范围
			if(IfIncMD==0)
				Operator/=2;//操作符范围设置只有"+-";
			switch(Operator)
			{
			case 0:
				a[p]+=‘+‘;
				DealDigit(a,p,range,IfNegative,IfFraction,SecNum,IfDecimal,DecDig);
				break;
			case 1:
				a[p]+=‘-‘;
				DealDigit(a,p,range,IfNegative,IfFraction,SecNum,IfDecimal,DecDig);
				break;
			case 2:
				a[p]+=‘*‘;
				DealDigit(a,p,range,IfNegative,IfFraction,SecNum,IfDecimal,DecDig);
				break;
			case 3:
				a[p]+=‘/‘;
				RandomNum1=(int)rand()%100/50;//是否产生负数的随机数
				RandomNum2=(int)rand()%100/50;//是否产生分数的随机数
				RandomNum4=(int)rand()%100/50;//是否产生小数的随机数
				RandomNum3=(int)rand()%DecDig;//小数的随机数
				SecNum=(int)rand()%range;//分子
				z=(int)rand()%range;
				if(IfNegative==1)//随机生成数字
				{
					if(RandomNum1==1&&RandomNum2==1)//随机生成负分数
					{
						a[p]+=‘(‘;
						a[p]+=‘-‘;
						Digit(SecNum,0,a,p,0,0);
						a[p]+=‘/‘;
						Digit(z,0,a,p,0,0);
						a[p]+=‘)‘;
					}
					else if(RandomNum1==1&&RandomNum2!=1)//负数
					{
						a[p]+=‘(‘;
						a[p]+=‘-‘;
						Digit(SecNum,RandomNum4,a,p,IfDecimal,RandomNum3);
						a[p]+=‘)‘;
					}
					else//数字默认为正数
					{
						Digit(SecNum,DecDig,a,p,0,0);
						if(IfRemainder==0)
						{
							if(IfIncBrackets==0)//当不生成括号时
							{
								if(FirstNum%SecNum!=0)//除法有余数
								{
									Digit(SecNum,RandomNum4,a,p,IfDecimal,RandomNum3);
								}
							}
						}
					}
				}
				else//正数
				{
					if(IfFraction==1)//随机生成正分数
					{
						if(RandomNum2==1)
						{
							a[p]+=‘(‘;
							Digit(SecNum,0,a,p,0,0);
							a[p]+=‘/‘;
							Digit(z,0,a,p,0,0);
							a[p]+=‘)‘;
						}
					}
					else//默认为正数
					{
						Digit(SecNum,DecDig,a,p,IfDecimal,RandomNum3);
						if(IfRemainder==0)
						{
							if(IfIncBrackets==0)//当不生成括号时
							{
								if(FirstNum%SecNum!=0)//除法有余数
								{
									Digit(SecNum,RandomNum4,a,p,IfDecimal,RandomNum3);
								}
							}
						}
					}
				}
				break;
			}
			if(Brackets==1&&count==1&&q==1)
			{
				a[p]+=")";
			}
			FirstNum=SecNum;//将运算符左侧数置为FirstNum
		}
		a[p]+=‘=‘;
		a[p]+=‘\0‘;
		//判断是否重复,重复则重新生成
		if(IfRepeated(p,a))
		{
			p--;
		}
	}
}
//输出字符串数组
void Display(int QstNum,string a[],int ColumnNum,int HSpace)
{
	int count1=0;
	int p;
	for(p=0;p<QstNum;p++)
	{
		cout<<setw(HSpace)<<a[p];
		count1++;
		if(count1%ColumnNum==0)
			cout<<endl;
		else
			cout<<‘\t‘;
	}
}
void main()
{
	srand((unsigned)time(NULL));
	int p;
	do
	{
		system("mode con: cols=100 lines=40");
		system("cls");
		int QstNum,ColumnNum,IfIncMD,IfIncBrackets,range,HSpace,IfNeg,IfRem,IfFraction,IfDec,DecDig=0;
		string a[1000];//保存字符串的数组
		cout<<"请输入生成的四则运算题个数(1-1000):";
		cin>>QstNum;
		while(QstNum<0&&QstNum>1000)
		{
			cout<<"请重新输入生成的四则运算题个数(1-1000):";
			cin>>QstNum;
		}
		cout<<"请输入生成的列数:(1-10)";
		cin>>ColumnNum;
		while(ColumnNum<1||ColumnNum>10)
		{
			cout<<"请重新输入生成的列数:(1-10列)";
			cin>>ColumnNum;
		}
		//是否有乘除法
		cout<<"是否有乘除法:(1/0)";
		cin>>IfIncMD;
		while(IfIncMD>1||IfIncMD<0)
		{
			cin>>IfIncMD;
		}
		//是否允许支持小数
		cout<<"是否允许支持小数(输入1则支持,0则不支持)";
		cin>>IfDec;
		while(IfDec!=1&&IfDec!=0)
		{
			cout<<"请输入1或0(输入1则允许否则不允许)"<<endl;
			cin>>IfDec;
		}
		if(IfDec==1)
		{
			cout<<"小数数值范围:(精确到千分位,百分位,十分位,输入1000,100或10)";
			cin>>DecDig;
			while(DecDig!=10&&DecDig!=100&&DecDig!=1000)
			{
				cout<<"请输入10,100,或1000:";
				cin>>DecDig;
			}
		}
		//整数数值范围
		cout<<"整数数值范围:(1000以内,100以内,10以内)";
		cin>>range;
		while(range!=10&&range!=100&&range!=1000)
		{
			cout<<"请输入10,100,或1000:";
			cin>>range;
		}
		//是否支持括号
		cout<<"是否随机生成括号:";
		cin>>IfIncBrackets;
		while(IfIncBrackets!=1&&IfIncBrackets!=0)
		{
			cout<<"请输入1或0:(1随机生成括号,0不随机生成括号)";
			cin>>IfIncBrackets;
		}
		//设置运算题间距
		cout<<"每行运算题的间距:(1-15)";
		cin>>HSpace;
		while(HSpace<1||HSpace>15)
		{
			cout<<"请输入数值在1-15范围内:";
			cin>>HSpace;
		}
		//加减是否支持负数的存在
		cout<<"加减是否允许有负数的存在(输入1则允许,0则不允许)";
		cin>>IfNeg;
		while(IfNeg!=1&&IfNeg!=0)
		{
			cout<<"请输入1或0(输入1则允许否则不允许)"<<endl;
			cin>>IfNeg;
		}
		//除法是否允许有余数的存在
		cout<<"除法是否允许有余数的存在(输入1则允许,0则不允许)";
		cin>>IfRem;
		while(IfRem!=1&&IfRem!=0)
		{
			cout<<"请输入1或0(输入1则允许否则不允许)"<<endl;
			cin>>IfRem;
		}
		//整数除法是否允许有分数的存在
		cout<<"整数除法是否允许有分数的存在(输入1则允许,0则不允许)";
		cin>>IfFraction;
		while(IfFraction!=1&&IfFraction!=0)
		{
			cout<<"请输入1或0(输入1则允许否则不允许)"<<endl;
			cin>>IfFraction;
		}
		/*IfIncMD是否有乘除,range数值范围,IfIncBrackets是否有括号,IfNeg加减是否允许有负数,IfRem除法是否允许有余数
		   IfFraction是否支持分数,IfDec是否支持小数,DecDig设置小数范围*/
		Deal(QstNum,a,IfIncMD,range,IfIncBrackets,IfNeg,IfRem,IfFraction,IfDec,DecDig);
		Display(QstNum,a,ColumnNum,HSpace);
		cout<<endl;
		cout<<"是否继续生成运算题(输入1则生成否则不生成)";
		cin>>p;
		while(p!=1&&p!=0)
		{
			cout<<"请输入1或0(输入1则生成否则不生成)"<<endl;
			cin>>p;
		}
	}while(1==p);
}

  

程序截图

技术分享

实验总结

      程序越到后期越难以更改,往往牵一发而动全身,由此对程序维护有了深刻的认识;编写中间到没有遇到特别的困难,但堆加功能任务令人头疼,耗时将近12个小时;此次程序还有很多不足之处,在此也希望大家能提出宝贵意见

 

二柱子问题扩充:1、题目避免重复; 2、可定制(数量/打印方式); 3、可以控制下列参数: 是否有乘除法、是否有括号、 数值范围、加减有无负数、除法有无余数、否支持分数 (真分数, 假分数, …)、是否支持小数 (精确到多少位)、打印中每行的间隔可调整;

标签:

原文地址:http://www.cnblogs.com/tianma-0/p/4339588.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!