1.任务要求:对之前的自动出题系统提出了新的要求:(1)、题目避免重复;(2)、可定制(数量/打印方式);(3)可以控制下列参数:是否有乘除法、数值范围、加减有无负数、除法有无余数、是否支持分数...

2.设计思路:(1)主函数中有一个大循环,其中主框架是一个switch语句构成的,可以在四中运算中设置不同的要求并加以           实现。并使程序可以循环运行,即用户可以循环使用;

(2)避免重复:可以使用srand函数确保产生的随机数不相同;

(3)定制数量/打印方式:每一次循环会出n道题目,每行有num道题目,添加变量N,num,其数值由用户确定;

(4)乘除法选择:有无乘除法,加一个变量mul,设置其值并在switch语句中使用,若有乘除法则执行rand()%4,产生               四种运算符号,反之产生加减两种运算;

(5)数值范围:两个运算数为可以随便设置范围,其中用判断语句确保除法中除数不等于0;减法中被减数大于减数;

(6)除法是否有余数/是否支持分数:添加函数,利用判断语句设定,当题目是除法时如果不能除尽则重新生成题目,直到余              数为零,在主函数合适位置处调用添加函数,使用户可以进行选择题目中是否包含分数的运算数,如果包括可以重新设置                两个运算数变量的格式改为分数,反之不用做处理,并对此函数进行调用。

3.源程序代码:

//四则运算2. 2015/3/13 刘子晗

#include <iostream>
#include<stdlib.h>
#include <time.h>
#include<iomanip>
using namespace std; void main()
{
cout << "欢迎进入四则运算出题系统!" << endl;
cout << "*****************************************" << endl;
char g='Y',mod;
while (g == 'Y')
{
cout << "此系统分为两个模块,请进行选择:(A.整数 or B.分数)";
cin >> mod;
if (mod == 'A')
{
int N,max,min,num,j;
char mul,neg,rem;
srand((unsigned)time(NULL));
cout << "请输入要生成的题目数量N:";
cin >> N;
cout << "打印参数num(每一行有num道题目):";
cin >> num;
cout << "运算数的范围上限max:";
cin >> max;
cout << "运算数的范围下限min:";
cin >> min;
cout << "您是否希望题目中出现乘除运算?(Y(是)or N(否)):";
cin >> mul;
cout << "您是否希望减法题目中出现负数?(Y(是)or N(否)):";
cin >> neg;
cout << "您是否希望除法题目中出现余数?(Y(是)or N(否)):";
cin >> rem; for (int k=;k<N;k++)
{
int a = rand()%(max-min+) + min ;
int b = rand()%(max-min+) + min ;
if (mul == 'Y')
{
j = rand()% + ;
}
if (mul == 'N')
{
j = rand()% + ;
}
switch(j)
{
case :
cout << setw() << a << "+" << setw() << b << "=" ;
break;
case :
if (neg == 'N')
{
while (a <= b)
{
a = rand()%(max-min+) + min ;
b = rand()%(max-min+) + min ;
}
cout << setw() << a << "-" << setw() << b << "=" ;break;
}
else
{
cout << setw() << a << "-" << setw() << b << "=" ;break;
} case :
cout << setw() << a << "*" << setw() << b << "=" ;
break;
case :
while (b == )
{
b = rand()%(max-min+) + min ;
}
if (rem == 'N')
{
while((a % b)!= )
{
a = rand()%(max-min+) + min ;
b = rand()%(max-min+) + min ;
}
cout << setw() << a << "/" << setw() << b << "=" ;break;
} else
{
cout << setw() << a << "/" << setw() << b << "=" ;break;
} }
if ( (k+) % num == )
{
cout << endl;
}
else
{
cout << " ";
} }
}
else
{
int N,max,min,num,j;
char mul,neg;
srand((unsigned)time(NULL));
cout << "请输入要生成的题目数量N:";
cin >> N;
cout << "打印参数num(每一行有num道题目):";
cin >> num;
cout << "运算数的分子和分母的范围上限max:";
cin >> max;
cout << "运算数的分子和分母的范围下限min:";
cin >> min;
cout << "您是否希望题目中出现乘除运算?(Y(是)or N(否)):";
cin >> mul;
cout << "您是否希望减法题目中出现负数?(Y(是)or N(否)):";
cin >> neg; for (int k=;k<N;k++)
{
int a1 = rand()%(max-min+) + min ;
int a2 = rand()%(max-min+) + min ;
int b1 = rand()%(max-min+) + min ;
int b2 = rand()%(max-min+) + min ;
while(a2== || b2==)
{
a2 = rand()%(max-min+) + min ;
b2 = rand()%(max-min+) + min ;
}
if (mul == 'Y')
{
j = rand()% + ;
}
if (mul == 'N')
{
j = rand()% + ;
}
switch(j)
{
case :
cout << "(" << setw() << a1 << "/" << setw() << a2 << ")" << "+" << "(" << setw() << b1 << "/" << setw() << b2 << ")" << "=";
break;
case :
cout << "(" << setw() << a1 << "/" << setw() << a2 << ")" << "-" << "(" << setw() << b1 << "/" << setw() << b2 << ")" << "=";
break;
case :
cout << "(" << setw() << a1 << "/" << setw() << a2 << ")" << "*" << "(" << setw() << b1 << "/" << setw() << b2 << ")" << "=";
break;
case :
while (b1 == )
{
b1 = rand()%(max-min+) + min ;
}
cout << "(" << setw() << a1 << "/" << setw() << a2 << ")" << "*" << "(" << setw() << b1 << "/" << setw() << b2 << ")" << "=";
break;
}
if ( (k+) % num == )
{
cout << endl;
}
else
{
cout << " ";
} }
}
cout << "您是否要继续答题?请输入:(Y(是)or N(否))";
cin >> g;
cout << "*****************************************" << endl;
} cout << "感谢您的使用,再见!";
}

4.运行结果:

5.总结:(1)每一次真正编程序的时候会和自己的预想有很多偏差,主要有以下几点:思路设计的时候想把主函数设计得很简单,然后通过函数调用实现其他功能,但在实现的时候发现把功能实现都涵盖在主函数中也很简单,而且这样思路会变得很清晰;对避免重复题目这一点上,本来想通过三个字符的比较,可是觉得这种方法不够简便,于是采用了srand函数来实现这一功能;再就是在分数的选择上,如果添加函数实现的话,编写测试了好几次都没有成功,于是就在开始的地方设置了一个选择模块使整数和分数的运算区分开来以实现最终的结果。

(2)错误记录:出现的错误有很多,主要有a.由于程序是分块完成的,中间调试的时候出现了错误,if语句中把“==”写成了“= ;

b.在switch语句中,减法和除法的地方由于有判断语句,其中if循环中第一个输出的地方没有加break,虽然没有bug,但是最终运行时总是不对,发现是在条件不满足时就会没有显示该次循环输出结果,加上之后就对了;”;

c.开始实现打印输出设置一行题目数量时用了一个for循环,总是不对,又改成用if判断实现;之后意识到是因为上面的错误造成的而不是这个循环出错了,两种方法皆可;

d.由于数是随机产生的,一位数两位数或三位数都有可能,所以不能保证每一列都是齐的,之后查阅相关资料利用setw()加以纠正即可。

(3)感受:a.之前编写程序的时候我会习惯把相似的一个作为模版去改,从而实现自己所要实现的功能,但是现在突然觉得那是很不明智的,在自己给程序构想出大致框架后一点一点填东西似乎更容易达到预期;

b.编程实现某个功能的时候某种方法行不通时,有必要尽快跳出来,利用查资料或是别的途径看是否有别的简单易行的办法,否则会很耽误时间;在每一次编程中没准都会学到以前没有用过的一些知识点;

c.调试的时候出现的bug要仔细的分析一下,不能太盲目地认为提示行就是错误所在,因为有时候不是;

d.没有错误运行结果却跟自己预期不同或明显有错的时候,要看是哪个错,然后观察相应的程序块加以改正,否则全面找的话会很难找到。

(4)时间表:

Task2 四则运算2的更多相关文章

  1. 介绍一款原创的四则运算算式生成器:CalculateIt2

    家里小朋友读一年级了,最近每天都有一些10以内的加减法口算练习,作为程序员爸爸,自然也是想办法能够偷懒,让电脑出题,给小朋友做些练习.于是,自己在业余时间开发了一个四则运算算式生成器,名为:Calcu ...

  2. 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序

    1. 编写一个能自动生成小学四则运算题目的程序.(10分)   基本要求: 除了整数以外,还能支持真分数的四则运算. 对实现的功能进行描述,并且对实现结果要求截图.   本题发一篇随笔,内容包括: 题 ...

  3. 四则运算appNABCD模型

    团队: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松:http://www.cnb ...

  4. 第一章-第一题(小学生四则运算)--By郭青云

    1.项目需求 a) 除了整数以外,还要支持真分数的四则运算. (例如:  1/6 + 1/8 = 7/24) b) 让程序能接受用户输入答案,并判定对错. 最后给出总共 对/错 的数量. c) 逐步扩 ...

  5. 一个简易的四则运算单元...(15.12.15 BUG更新)

    网上找的, 没有作者信息, 只能在这里感谢一下了, 支持标准写法的四则运算 --2015-12-15 修改了一个内存泄漏的BUG - Pop方法没有释放申请的内存 unit Base.Calculat ...

  6. 利用ANTLR4实现一个简单的四则运算计算器

    利用ANTLR4实现一个简单的四则运算计算器 ANTLR4介绍 ANTLR能够自动地帮助你完成词法分析和语法分析的工作, 免去了手写去写词法分析器和语法分析器的麻烦 它是基于LL(k)的, 以递归下降 ...

  7. 【实践】js实现简易的四则运算计算器

    最近看了一个大神推荐的某公司面试程序员的js 面试题,题目是用js 做一个计算器于是跟着大神的思想自己做了一下 ps:功能还没有完善好毕竟自己还是一只菜鸟还在不断学习中. 闲话不多说先上css代码 & ...

  8. HDU 5938 Four Operations(四则运算)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  9. C语言实现四则运算

    学生:宋丹丹 张潇裕 #include<iostream>#include<ctime>using namespace std;void main(){ int x1,x2,a ...

随机推荐

  1. springboot集成elk实现分布式日志管理

    1.安装elk https://www.cnblogs.com/xuaa/p/10769759.html 2.idea创建springboot项目 File -> New -> Proje ...

  2. #leetcode刷题之路33-搜索旋转排序数组

    假设按照升序排序的数组在预先未知的某个点上进行了旋转.( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ).搜索一个给定的目标值,如果数组中存在这个目标值,则返 ...

  3. 旧贴-在 win7 / win8 下安装苹果系统 (懒人版)

    前言 该文转载自远景论坛,发布时间2012年,仅供学习参考 这篇安装教程的素材在国庆就准备好了,但那时学习任务比较重,没有时间发帖,一直拖到现在.趁这个周末有空,赶紧写完它,希望能帮助一些景友. 论坛 ...

  4. Rust 智能指针(一)

    Rust 智能指针(一) 1.Box<T> Box<T>是指向堆中的指针. fn main() { let box = Box::new(3); println!(" ...

  5. react fake double , bind click and dblclick on the same element

    smartClick:function(id,name,waiter,e){ var desk = $$(e.currentTarget).data('raw'); if(this.lastClick ...

  6. inux下进程的最大线程数、进程最大数、进程打开的文件数

    inux下进程的最大线程数.进程最大数.进程打开的文件数 2008-12-07 23:48 =========================    如下转载自这里. linux 系统中单个进程的最大 ...

  7. JavaEE笔记(二)

    查询load()和get()的区别 # 以下查询都是根据id查询 // Load和Get都会在第一次查询的是创建一个一级缓存查询语句 // 下一次查询的时候从缓存中查询是否有缓存的语句 // 如果有只 ...

  8. MySQL下查看和赋予权限

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页     回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackgao@gmail. ...

  9. AngularJS中Directive指令系列 - bindToController属性的使用

    默认false.这个属性用来绑定scope的属性直接赋给controller.可以为true或者和scope相同格式的对象. 此外使用此属性,要设置controller的别名,通常通过"co ...

  10. 用docsify快速构建文档,并用GitHub Pages展示

    什么是docsify 无需构建,写完 markdown 直接发布成文档,写说明文档的极佳选择. 快速上手 安装 npm i docsify-cli -g docsify init docs 创建项目 ...