一,题目要求.
本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换,这里会布置两个题目,请各组成员根据自己的爱好任选一题。
这次我们选的是题目一,我在此次作业担当驾驶员,付昌雨担当导航员。
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
- 能够自动生成四则运算练习题
- 可以定制题目数量
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
- 用户选择是否有括号、是否有小数
- 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
二,问题分析.
自动生成四则运算练习题首先问题就是怎么随机生成随机数,通过上网查询得到了在用c语言编程可以用函数rand,通过这个函数可以随机得到一个数,例如:通过 m=rand()%100,可以得到0到99范围内的随机一个数。百度百科解释为系统在调用rand()之前都会自动调用srand(),如果用户在rand()之前曾调用过srand()给参数seed指定了一个值,那么 rand()就会将seed的值作为产生伪随机数的初始值;而如果用户在rand()前没有调用过srand(),那么系统默认将1作为伪随机数的初始 值。如果给了一个定值,那么每次rand()产生的随机数序列都是一样的。所以为了避免上述情况的发生我们通常用srand((unsigned)time(0))或者srand((unsigned)time(NULL))来 产生种子。如果仍然觉得时间间隔太小,可以在(unsigned)time(0)或(unsigned)time(NULL)后面乘上某个合适的整数。例如,srand((unsigned)time(NULL)*10)。
详细的可以参考rand函数。
设置一个运算符函数,用switch语句和rand函数来得到随机运算符。在第三种混合运算中,随机加括号遇到问题,如果是出现乘或除法运算符在现实习题中是不会存在括号加在参与乘除运算的随机数二边。我用了二个判断语句解决了这个问题。然后就是精度问题,x = (double)rand() / RAND_MAX * max + 1.0;//(double)rand()/RAND_MAX产生1到max之间的随机浮点数。通过运算得到
结果在代码中保留二位小数(四舍五入),在输出时为:cout << fixed <<setprecision(2).<< a << fuhao1 << b << fuhao2 << c <<"=
" << endl;//保留二位小数(四舍五入)。用法setprecision(2).
三,结果展示.
- 当用户需要加减法运算时:.
- 当需要乘除法时:.
- 混合运算:.
作业的要求基本实现。
四,总结.
这次作业一开始没有头绪,在和领航员付昌雨一起网上查找资料,先是解决随机数的问题,然后是各个函数之间如何调用,使得代码更加便于阅读和理解。在这次作业中用到了很多新函数,需要添加额外的头文件,例如rand()和setprecision(2)都需要不同的头文件。当然还有很多问题没有解决,这次作业代码只能运算3个随机数,没有设置界面和文件输出。这次对于驾驶员的我来说,学到了很多新的知识,之前很多东西忘的差不多了,在这次动手编程把很多以前丢的东西了找回来。在审查的过程中,导航员给了我很大帮助,如何实现在选择混合运算时怎么随机选择运算符,以前一个人编程序经常就走神,或者效率比较低,不能长时间的投入,但是这次的结队编程,两个人之间相互监督,使得效率很高,也很容易帮对方发现一些比较常见的基础的错误。很感谢有这样的机会一起完成作业。