Task2 四则运算2
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的更多相关文章
- 介绍一款原创的四则运算算式生成器:CalculateIt2
家里小朋友读一年级了,最近每天都有一些10以内的加减法口算练习,作为程序员爸爸,自然也是想办法能够偷懒,让电脑出题,给小朋友做些练习.于是,自己在业余时间开发了一个四则运算算式生成器,名为:Calcu ...
- 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序
1. 编写一个能自动生成小学四则运算题目的程序.(10分) 基本要求: 除了整数以外,还能支持真分数的四则运算. 对实现的功能进行描述,并且对实现结果要求截图. 本题发一篇随笔,内容包括: 题 ...
- 四则运算appNABCD模型
团队: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松:http://www.cnb ...
- 第一章-第一题(小学生四则运算)--By郭青云
1.项目需求 a) 除了整数以外,还要支持真分数的四则运算. (例如: 1/6 + 1/8 = 7/24) b) 让程序能接受用户输入答案,并判定对错. 最后给出总共 对/错 的数量. c) 逐步扩 ...
- 一个简易的四则运算单元...(15.12.15 BUG更新)
网上找的, 没有作者信息, 只能在这里感谢一下了, 支持标准写法的四则运算 --2015-12-15 修改了一个内存泄漏的BUG - Pop方法没有释放申请的内存 unit Base.Calculat ...
- 利用ANTLR4实现一个简单的四则运算计算器
利用ANTLR4实现一个简单的四则运算计算器 ANTLR4介绍 ANTLR能够自动地帮助你完成词法分析和语法分析的工作, 免去了手写去写词法分析器和语法分析器的麻烦 它是基于LL(k)的, 以递归下降 ...
- 【实践】js实现简易的四则运算计算器
最近看了一个大神推荐的某公司面试程序员的js 面试题,题目是用js 做一个计算器于是跟着大神的思想自己做了一下 ps:功能还没有完善好毕竟自己还是一只菜鸟还在不断学习中. 闲话不多说先上css代码 & ...
- HDU 5938 Four Operations(四则运算)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- C语言实现四则运算
学生:宋丹丹 张潇裕 #include<iostream>#include<ctime>using namespace std;void main(){ int x1,x2,a ...
随机推荐
- Linux Shell常用技巧(五)
十一. awk编程: 1. 变量: 在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可以是数字.字符串.根据使用的不同,未初始化变量的值为0或空白字符串&quo ...
- 解决安装macports更新失败问题
安装 macports 先是卡在开始,xcode的路径指定错误,重新指定一下,然后再sudo port selfupdate,就卡再ports.tar那里不动了.经过google和百度查到参考网 ...
- CATransform3D 使用
struct CATransform3D { CGFloat m11(x轴缩放), m12(y轴切变), m13, m14(x轴拉伸); CGFloat m21(x轴切变), m22(y轴缩编), m ...
- log4j.properties配置文件详解
Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...
- CF 1107 E. Vasya and Binary String
E. Vasya and Binary String 链接 分析: 对于长度为x的一段序列,我们可以dp出消除的过程的最优方案,背包即可. 然后区间dp,可以先合并完所有的点,即没相同的一段区间合并为 ...
- Codeforces Round #452 (Div. 2)
第一次打..(太弱(+99积分是几个意思 A 题意:一堆数,只有1和2,问最多凑出多少个3. 分情况即可 #include<cstdio> int main(){ int a=0,b=0, ...
- How to create a custom action type with a custom control (BarCheckItem), associated with it
https://www.devexpress.com/Support/Center/Example/Details/E1977/how-to-create-a-custom-action-type-w ...
- hdu1546Idiomatic Phrases Game(floyd+map)
传送门 成语接龙,找每个单词都需要一点时间,问最少的时间 把字符串用map处理成数字编号,之后用floyd #include<bits/stdc++.h> using namespace ...
- python simple factory mode example
Two python simple factory mode examples shown in this section. One is for base operation and another ...
- Unity中使用C#实现UDP广播
没有系统的学习过网络,想做联机游戏还真是费劲,想做在局域网内实现自动搜索服务器的功能,然后就想到了使用UDP进行广播,把服务器的信息广播给每一个玩家. Socket udpSocket = new S ...