zoukankan      html  css  js  c++  java
  • 小学生算数产生器的改进

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

    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未能全部实现。

  • 相关阅读:
    Script:Generate A DDL Script For A Table
    如何在windows vista/2008/7中 安装Oracle OMS 即Grid Control
    Sqlserver2005迁移至Oracle系列之五:角色、用户、及权限
    Mysql:命令选项、配置选项、(全局、会话)系统变量、状态变量:SQL模式
    Mysql:命令选项、配置选项、(全局、会话)系统变量、状态变量:如何使用系统变量?
    Mysql:临时表、表变量
    Sqlserver2005迁移至Oracle系列之四:在Oracle中创建位或运算函数bitor
    flex 图片旋转
    基于模板和XML在BS结构应用中生成word文件
    操作图片文件写入word
  • 原文地址:https://www.cnblogs.com/bill927/p/CKbill.html
Copyright © 2011-2022 走看看