小学生算数产生器的改进

一、程序设计题目要求和设计思想

1、题目

    (1)、题目避免重复;    

    (2)、可定制(数量/打印方式);    

    (3)、可以控制下列参数: 是否有乘除法、是否有括号、 数值范围、加减有无负数、除法有无余数、

              否支持分数 (真分数, 假分数, …)、是否支持小数 (精确到多少位)、打印中每行的间隔可调整;

2、设计思想

  (1)、将随机生成的算式保存起来,方便后续生成的算式进行比对,后续产生的算式与之前所有算式

      比对,当结果一致说明算是重复,应当排除。

  (2)、产生算式的函数进行循环操作,引进控制参数,操作数与行数以及间隔由用户决定。

  (3)、一系列参数通过一组型参变量传递给产生式函数,产生符合要求的算式。

3、程序源代码(本程序由C/C++编程语言编写,编辑器为VC++6.0):

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#include <iomanip>

void Rand_Cal_one(int digits[],char characters[],int range)  //随机产生运算数(包含乘除)
{
	for(int i=0;i<6;i++){
		
		if(i<3){
			digits[i]=rand()%range;//生成四则运算的计算随机数
			continue;
		}
		
		else if(i<5){
			digits[i]=rand()%4;//随机产生标志判断计算符号
			continue;
		}
		
		else{
			digits[i]=rand()%2;//随机产生标志数判断括号位置
		}
	}
}

void Rand_Cal_two(int digits[],char characters[],int range)  //随机产生运算数(不含乘除)
{
	for(int i=0;i<6;i++){
		if(i<3){
			digits[i]=rand()%range;//生成四则运算的计算随机数
			continue;
		}
		else if(i<5){
			digits[i]=rand()%2;//随机产生标志判断计算符号
			continue;
		}
		else{
			digits[i]=rand()%2;//随机产生标志数判断括号位置
		}
	}
}

void Demo(int digits[],char characters[],char * Arithmetic_arr[],int m,int n) //产生符合要求的运算式
{
	char character1,character2;
	
	int character3,character4,range;
	
	cout<<"请输入数字范围(最大值):"<<endl;
	
	cin>>range;
	
	cout<<"请选择是否带括号: Y表示带括号,N表示不带括号"<<endl;
	
	cin>>character1;
	
	cout<<"请选择是否有乘除: Y表示有乘除,N表示无乘除"<<endl;
	
	cin>>character2;
	
	cout<<"请选择每行容纳算是数量: 1 or 2"<<endl;
	
	cin>>character3;
	
	if(character3!=1){
		
		cout<<"请选择行间距(tab): 1 or 2 or 3"<<endl;
		
		cin>>character4;
	}
	
	cout<<"-------------------"<<m<<"道算式题如下-------------------------"<<endl;
	
	for(int k=0; k<m; k++){
		
		int flag=k;
P:
		if (character2=='Y'){
			Rand_Cal_one(digits,characters,range);
		}
		
		else{
			Rand_Cal_two(digits,characters,range);
		}
		
		Arithmetic_arr[k]=new char[n];	
		
		if(k!=0){
			
			for(int i=0;i<k;i++){
				
				if( digits[0]==Arithmetic_arr[i][0]					//避免重复
					&& characters[digits[3]]==Arithmetic_arr[i][1]
					&& digits[1]==Arithmetic_arr[i][2]
					&& characters[digits[4]]==Arithmetic_arr[i][3]
					&& digits[2]==Arithmetic_arr[i][2])
					
					goto P;
			}
		}
		
		Arithmetic_arr[k][0]=digits[0];
		
		Arithmetic_arr[k][1]=characters[digits[3]];
		
		Arithmetic_arr[k][2]=digits[1];
		
		Arithmetic_arr[k][3]=characters[digits[4]];
		
		Arithmetic_arr[k][4]=digits[2];
		
		if (character1=='Y'){
			
			switch(digits[5]){
				
			case 0:
				if((characters[digits[3]]=='+'||characters[digits[3]]=='-')
					&&(characters[digits[4]]=='*'||characters[digits[4]]=='/'))
				{
					if (character1=='Y'){
						cout<<"(";
						if((int)Arithmetic_arr[k][0]<0)
						{
							cout<<"("<<(int)Arithmetic_arr[k][0]<<")";
						}
						else
							cout<<(int)Arithmetic_arr[k][0];
						cout<<Arithmetic_arr[k][1];
						if((int)Arithmetic_arr[k][2]<0)
						{
							cout<<"("<<(int)Arithmetic_arr[k][2]<<")";
						}
						else
							cout<<(int)Arithmetic_arr[k][2];
						cout<<")"<<Arithmetic_arr[k][3];
						if((int)Arithmetic_arr[k][4]<0)
						{
							cout<<"("<<(int)Arithmetic_arr[k][4]<<")";
						}
						else
							cout<<(int)Arithmetic_arr[k][4];
						cout<<"=";
					}
					
					switch(character4){
					case 1:cout<<"	";break;
					case 2:cout<<"		";break;
					case 3:cout<<"			";break;
					default:cout<<"	";break;
					}
					
					if(character3==1){
						cout<<endl;
					}
					
					else{
						if(flag%2==1)cout<<endl;
					}
					break;
				}
				else goto P;
				
			case 1:
				if(characters[digits[3]]=='*'||characters[digits[3]]=='/'
					||(characters[digits[3]]=='+'||characters[digits[3]]=='-')
					&&(characters[digits[4]]=='+'||characters[digits[4]]=='-'))
				{
					
					if((int)Arithmetic_arr[k][0]<0)
					{
						cout<<"("<<(int)Arithmetic_arr[k][0]<<")";
					}
					else
						cout<<(int)Arithmetic_arr[k][0];
					cout<<Arithmetic_arr[k][1];
					cout<<"(";
					if((int)Arithmetic_arr[k][2]<0)
					{
						cout<<"("<<(int)Arithmetic_arr[k][2]<<")";
					}
					else
						cout<<(int)Arithmetic_arr[k][2];
					cout<<Arithmetic_arr[k][3];
					if((int)Arithmetic_arr[k][4]<0)
					{
						cout<<"("<<(int)Arithmetic_arr[k][4]<<")";
					}
					else
						cout<<(int)Arithmetic_arr[k][4];
					cout<<")"<<"=";
					
					switch(character4){
					case 1:cout<<"	";break;
					case 2:cout<<"		";break;
					case 3:cout<<"			";break;
					default:cout<<"	";break;
					}
					
					if(character3==1){
						cout<<endl;
					}
					
					else{
						if(flag%2==1)cout<<endl;
					}
					break;
				}
				
				else goto P;	
			}	
		}
		
		else{
			
			if((int)Arithmetic_arr[k][0]<0)
			{
				cout<<"("<<(int)Arithmetic_arr[k][0]<<")";
			}
			else
				cout<<(int)Arithmetic_arr[k][0];
			cout<<Arithmetic_arr[k][1];
			if((int)Arithmetic_arr[k][2]<0)
			{
				cout<<"("<<(int)Arithmetic_arr[k][2]<<")";
			}
			else
				cout<<(int)Arithmetic_arr[k][2];
			cout<<Arithmetic_arr[k][3];
			if((int)Arithmetic_arr[k][4]<0)
			{
				cout<<"("<<(int)Arithmetic_arr[k][4]<<")";
			}
			else
				cout<<(int)Arithmetic_arr[k][4];
			cout<<"=";
			
			switch(character4){
			case 1:cout<<"	";break;
			case 2:cout<<"		";break;
			case 3:cout<<"			";break;
			default:cout<<"	";break;
			}
			
			if(character3==1){	
				cout<<endl;
			}
			
			else{
				if(flag%2==1)cout<<endl;
			}
		}
	}
}

int main()
{
	
	while(1)
	{
		cout<<"------------------小学生四则运算产生器-------------------"<<endl;
		
		srand((unsigned)time(NULL));	//为rand()函数生成不同的随机种子
		
		int num1,num2=5;
		
		cout<<"请输入定制数目(输入零结束):"<<endl;	  //题目数
		
		cin>>num1;
		
		if(num1==0){
			cout<<"---------------------谢谢使用!!!----------------------"<<endl;;
			exit(0);
		}
		
		char ** Arithmetic_arr=new char*[num1];  //存放运算式动态数组
		
		int digits[6];					//存放计算的随机数字的数组,前三个为随机运算数字,第四第
		//五为随机产生运算符号标志数,第六为判断括号位置标志数。
		char characters[6]={'+','-','*','/','(',')'};	//存放加减乘除及括号等字符数组
		
		Demo(digits,characters,Arithmetic_arr,num1,num2);  //是否带括号
		
		delete [] Arithmetic_arr;  //释放动态数组空间
		
		cout<<"------------------请输入任意键继续!---------------------"<<endl;
		
		getch();
		
		system("CLS");
	}
	return 0;
}

4、 程序运行结果(截图):

5、程序结果分析:

  1.程序产生的算式对数学要素要求不够严格,没有设定除数不能为零,需要改进;

  2.程序行间距设定会出现问题,不能够左对齐;

  3.程序目前只能产生三个数的算式。

  4.题目要求3未能全部实现。

posted on 2015-03-15 11:57  海阔天空丶  阅读(191)  评论(0编辑  收藏  举报

导航