小学生算数产生器的改进

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

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

时间: 2024-08-04 06:35:26

小学生算数产生器的改进的相关文章

实现“小学生算术题出题器”(第一次作业)

本次作业要求:(1)出题器可以随机出四则运算.(2)真分数的运算.以下为程序运行截图: 根据使用说明来输入整数题目的数量,以及分数题目的数量,这里分别以5道题为例. 如果回答正确就会提示“回答正确”,回答错误则会提示“回答错误”.所有题目全部回答完毕将会给出得分情况. 为了便于打印,将所有的算术题存到了文本中. 以上为该程序的内容和使用详情,以下为程序源代码: #include <stdio.h>#include <stdlib.h>#include <time.h>

小学生算数题大全

#include<stdio.h>#include<time.h>#include<stdlib.h>void main(){int a,b,i,d;for(i=1;i<300;i++){ d=rand()%4;a=rand()%100;b=rand()%100;switch(d){case 1:printf("%d+%d=\n",a,b);case 2:printf("%d-%d=\n",a,b);case 3:print

小学生算数测试系统

/* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:隋宗涛 *完成日期:2016年5月8日 *版 本 号:v1.0 * *问题描述:提供10道加.减.乘.除四种基本算术运算的题目,且操作数不超过2位数的正整数,程序自动判断输入的答案是否正确并显示出相应的信息,最后显示做对了几道题. *输入描述:无. *程序输出:10道题. */ #include <iostream> #include<c

算法篇——小学生算数

来源:<算法导论入门经典>例题5.2.1 原题:很多学生在学习加法时,发现”进位“特别容易出错.你的任务是计算两个整数在相加时需要多少次进位.你编制的程序应当可以连续处理多组数据,直到读到两个0(这是输入结束标记).假设输入的整数都不超过9位. 样例输入:123 456 样例输出:0 样例输入:555 545 样例输出:3 样例输入:991 11 样例输出:2 分析:注意int的上限约是2000000000,可以保存所有9位整数,因此可以用整型int来保存输入.每次把a和b分别模10就能获取它

【SpringMVC笔记】第五课 改进Handler处理器和视图解析器

第四课 已经对注解的映射器和适配器进行了改进. 接下来需要对Handler处理器和视图解析器进行改进. <!-- 配置handler处理器 --> <bean class="com.king.controller.UserController"></bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourc

Python 函数装饰器和闭包

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 25.0px Helvetica } 装饰器基础知识 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象. p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica } 假如有个名为 decorate 的装饰器: @decorate def targ

【原创】自己动手写工具----签到器(升级版)

一.前面的话 上一篇中基本实现了简单的签到任务,但是不够灵活.在上一篇自己动手写工具----签到器的结尾中,我设想了几个新增功能来提高工具的灵活程度,下面把新增功能点列出来看看: (1)新增其他的进程任务: (2)任务按照进程进行分类:用IE就是执行IE的任务,与其他(如资源管理器等)无关: (3)每执行完一个任务关闭任务窗口: (4)对签到性质的任务进行”已签到“过滤: (5)实现执行的任务列表自定义: (6)另外实现任务的可视化: 还是先来看看效果图: 二.签到器的改进 在上一个版本中,(自

CFS调度器

一.前言 随着内核版本的演进,其源代码的膨胀速度也在递增,这让Linux的学习曲线变得越来越陡峭了.这对初识内核的同学而言当然不是什么好事情,满腔热情很容易被当头浇灭.我有一个循序渐进的方法,那就是先不要看最新的内核,首先找到一个古老版本的内核(一般都会比较简单),将其吃透,然后一点点的迭代,理解每个版本变更背后的缘由和目的,最终推进到最新内核版本. 本文就是从2.4时代的任务调度器开始,详细描述其实现并慢慢向前递进.当然,为了更好的理解Linux调度器设计和实现,我们在第二章给出了一些通用的概

Python装饰器完全解读

1 引言 装饰器(Decorators)可能是Python中最难掌握的概念之一了,也是最具Pythonic特色的技巧,深入理解并应用装饰器,你会更加感慨——人生苦短,我用Python. 2 初步理解装饰器 2.1 什么是装饰器 在解释什么是装饰器之前,我们有必要回顾一下Python中的一些思想和概念.我们都知道,Python是一门面向对象的语言,Python基本思想就是一些皆对象,数据类型是对象.类是对象.类实例也是对象……对于接下来我们要说的装饰器而言,最重要的是,函数也是对象! 你没看错,函