2017寒假作业三

共同部分

合作者

朱文婧 031602148 博客主页

翟丹丹 031602539 博客主页

编码规范

  1. 变量与函数的命名要有理有据,尽量做到见名知意,少使用a,b,c之类的作为变量名,以免造成混乱;
  2. 注意代码的排版,尽量做到层次分明,内容直观,整体美观,比如循环和条件结构处大括号的使用,按层次缩进之类的;
  3. 勤加注释,特别是在关键的地方。其中,对于某一函数主要功能的解释应单独占一行,标注在函数的开头,便于与普通注释区分;

设计思路

因为这次的题目要求是分工合作,所以我们的第一个想法就是这个代码应该由多个函数构成,这样便于分工,两人只要各编写自己的一部分就好了。又因为想到“题型”这个概念,就想在主函数里利用一个随机数,通过switch结构来调用已经编写好的输出固定题型的函数,从而做到题型随机。
因为这个程序将会由多个函数构成,为避免混乱,我们尽量减少了每个函数之间的联系,按照题目要求将这个程序分成了四个大部分:主函数部分,输出含0个括号的式子部分,输出含1个括号的式子部分,真分数的计算部分。其中,我负责的是主函数部分和真分数的计算部分。

首先先介绍一下贯穿整个代码的几个较为重要的变量:
language:用于进行语言切换,其值通过用户输入来决定,1为中文,2为英文。
style:提供题型选择。
rig:取right前三个字母,用于统计正确题数;
wro:取wrong前三个字母,用于统计错误题数;
flag:用来控制所出题目的难度。初始时赋值为0,若得到的随机式子的结果为负或真分数函数外得到的随机式子结果不为整数,则不输出该式子且将flag赋值为1,在主函数的循环结构里若flag为1,则不对循环变量i做变动,否则i自增1,代表输出了一道题目。循环的最后会将flag重新赋值为0,为下一次的判断做准备。
test0:用于检测除数是否为0。初值为0,若出现除数为0的情况,则赋值为1,和flag的使用类似,因为是后来添加的,所以没有将这二者合并。
end:用来判断程序是否应该停止。初值设为0。分函数里,把接受答案的变量input的初值设为一个负数,若输入的内容为字符,则input的值不做改变,之后对input的值进行判断,若为负数,则说明用户输入的为字符(输出题目的答案不为负),end值变为1,主函数里对end的值进行判断,若end为1,停止循环,输出结果。
temp:设为float型,用来储存随机出的题目的结果。
test:int型,在计算出temp的值之后会有一条“test=temp”的语句对test的赋值,之后则对test和temp的值是否相等进行判断,若不等,则说明正确答案不为整数,将其放弃不予输出,反之则输出。

主函数部分

主函数部分主要是输出程序的基本信息,让用户选择语言和题型,输出统计结果,利用循环结构,多次使用switch结构来随机调用分函数输出随机式子。在输出结果的地方,我们开了一个脑洞,考虑用户是小学生,所以在输出结果的时候会根据用户的成绩输出些不同的评语。

真分数的计算部分

这部分的代码完全是按过程来的,真分数的运算必然要先得到两个真分数,所以在随机数字的时候首先要求做到作为分母的数字大于作为分母的数字,其次我希望得到的分数都为最简的真分数,考虑到模块的功能尽量单一,并且约分在之后的计算中同样需要,于是另外编写了一段求最大公约数的代码单独作为一个函数,进而对分子分母进行约分。在计算真分数的加减时首先要做到分母相同,于是写了一个求最小公倍数的函数来实现这一步骤,进而将分子分母扩大相同被倍数进行加减计算。乘除法的计算只要将分子分母按规则相乘即可。因为值相同的分数形式很多,所以我将标准答案确立为最简的形式,对计算结果调用约分函数进行约分,得到最终的答案。

0个括号的函数

一开始的想法简单粗暴但无效,只想着用一个随机数与if结构来依次对相邻两数进行四则运算,但是这样的依次计算就无法做到四则运算规则中的“乘除优先于加减”,于是在乘除的if分之下补充了新的if分支,如果在乘除符号之前的运算符为加减(将第一个运算符前的符号设置为乘或除),就改变这种依次运算的模式,按照运算规律写了一行计算代码,用来实现正确的运算顺序。但是这段代码计算不出“1+2*3/3”这种类型的题目,于是就把它并到了输出含1个括号的式子部分里的“1+(2/3/4)”分支。

输出含1个括号的式子部分

水平有限,想不出太高端的输出含括号的随机式子的方法,于是就在一个括号函数里继续用了switch结构来随机调用写好固定形式的五个分函数。
含有一个括号的式子形式有:

  1. (1+2)+3+4=
  2. 1+(2+3)+4=
  3. 1+2+(3+4)=
  4. (1+2+3)+4=
  5. 1+(2+3+4)=
    因为括号里的部分要先计算,所以五种形式的计算顺序各有不同,但是将一二三形式括号里两数的计算结果看成一个“大数”的话,五种形式就会有一个共同点,都需要进行三数之间的四则运算,所以单独编写了一段随机产生和计算三个数的四则运算的函数。这样输出一二三形式的分函数就有共同点了,先用存好随机数的数组里第一二个数字得出“大数”,再将“大数”与数组第三四两个数字以不同的顺序传递给计算的函数,最后在输出时改变下数组里数字的排列顺序就可以了,这样所得到的式子与计算结果就分别对应于以上的前三种形式。后面两种形式只要先调用计算函数,再进行两数的运算就可以得到式子和结果了。
    总之,我们两个水平有限,选择了C,不会高端操作,靠着循环和条件写完了这个程序。写出来的程序长且粗糙,有挺多不足的地方,比如输出题目的效率很低,曾经试过,输出一道符合要求的题目之前会闪出满屏的题目。如果操作过快,就会输出相同的题目,并且会导致统计结果出错,这些是需要改进的地方。

程序实现和结果测试的截图

github的提交链接和提交日志截图

一开始进行得都很顺利,但是在我们准备提交最终结果的时候,就出了问题,至今还是不知道怎么解决,可能是操作的问题,或者是最后改动太大?

因此在团队一起合作的地方文件是还没成功的版本:半成品
这个是最终成果:完成体
提交日志

分工和协作的证据截图

差异部分

合作过程

首先,我们先一致同意了用C。接下来因为我们把程序分成了四个部分,并且四个部分之间没有什么太大的关联,所以我们的合作方式是把先自己负责的部分写成一个小程序,确定可以运行之后就把它做点改动拼接到一起。因此在商讨完大致思路,确立了几个关键变量之后,我们就各自去编写自己的代码了,在各自编码的过程中遇到问题,有什么想法就互相交流讨论,这一点给了我很大帮助,在此先感谢一下我的队友!原本的打算是我负责编写主函数部分的,所以在提交时,由我先将主函数提交到git上,接着我们再将自己负责的部分做一些修改之后拼上,最后由我来对整个程序进行一些细节上的完善补充。但是现实和想象中不一样,拼接的过程顺利进行了,但在我完善了整个程序之后,却无法提交,我们一起折腾了很久,不得不在截止时间前留了个空窗,但是现在还是弄不明白,最后我们决定以这种方式完成了这次作业。

合作体会

合作写程序和自己一个人写的差异挺大的。首先合作的两个人各有各的生活,空闲的时间不一致,找到一个两个人都有空的时间挺难的,所以我们选择了将一个程序拆成几部分各自进行的方式来完成这次作业。其次,两个人在思路,编码习惯上也会有不同的地方,但是我们两个人特别合得来,再加上制定好的编码规范,合作过程中我们并未有过太大的分歧,整个合作过程顺风顺水。合作还是挺有意思的一件事,不仅能够将自己的想法和别人分享,还能够了解到别人的思路和看法。两个人也可以互相帮助,不用一个人崩溃挣扎,感谢我的队友翟丹丹!一回校我们就面对面在解决问题,互相鼓励加油,总之是一次难忘的经历吧。

posted @ 2017-02-18 21:53  enliven  阅读(221)  评论(0编辑  收藏  举报