此作业要求参考:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2148
四则运算试题生成:
功能1. 四则运算:支持出题4个数的四则运算题目
功能2. 支持括号
功能3. 限定题目数量,打印输出,避免重复
功能4. 支持分数出题和运算(女神的青睐放弃之。。)
要求一:(1) 给出每个功能的重点、难点、编程收获。(2)给出结对编程的体会。 (3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。
(一)对每个功能进行分析
1. 功能一:
- 重点:实现随机生成四则运算试题,并计算出正确答案。我们对此进行分析,要解决这个问题大致分成几个步骤:随机生成数字和运算符组合成中缀表达式,为计算正确值将中缀表达式转换成后缀表达式(根据题目中的提示决定使用),对后缀表达式进行计算得到正确答案。
- 难点:为了实现生成随机试题并判断正误的功能,我们认为难点在于中缀表达式到后缀表达式的转换,借助两个栈和四则运算符号之间的优先级实现。
- 重要代码部分展示:
1 for (i = 0; i < strlen - 1; i++) 2 { 3 switch (strOld[i]) 4 { 5 case '+': 6 case '-': 7 case '*': 8 case '/': 9 //判断优先级,进行压栈出栈操作 10 while (this.priority(ope.Peek()) >= this.priority(strOld[i])) 11 { 12 num.Push(ope.Peek()); 13 strNew += " "; 14 strNew += ope.Peek(); 15 ope.Pop(); 16 } 17 ope.Push(strOld[i]); 18 flag = 1; 19 break; 20 case '(': 21 ope.Push(strOld[i]); 22 break; 23 case ')': 24 while (ope.Peek() != '(') 25 { 26 num.Push(ope.Peek()); 27 strNew += " "; 28 strNew += ope.Peek(); 29 ope.Pop(); 30 } 31 ope.Pop(); 32 break; 33 default: 34 num.Push(strOld[i]); 35 if ((flag == 1) && (i != 0)) 36 { 37 strNew += " "; 38 flag = 0; 39 } 40 strNew += strOld[i]; 41 break; 42 } 43 }
2. 功能二:
- 重点:功能二要求生成加入括号的随机试题,并能计算正确的值。重点除了在转换逆波兰式时添加更高级别的括号,还在于如何在生成的试题中添加括号。
- 难点:难点在于如何在生成的试题字符串中随机添加括号。最后我们采用了枚举的方法,将能够随机生成带有括号的形式列举出来,随机选择一个。
3. 功能三:
- 重点:根据输入的指令,对试题进行批量生成。这里面需要注意的地方是对输入指令的格式正确性进行判断。
- 实现后进行了简单的检验:
- 部分代码展示:
1 if (args.Length != 2) 2 { 3 Console.WriteLine("输入指令有误!"); 4 } 5 else 6 { 7 if (args[0] != "-c") 8 { 9 Console.WriteLine("输入指令有误!"); 10 } 11 else if(!int.TryParse(args[1],out tmp)) 12 { 13 Console.WriteLine("题目数量必须是 正整数。"); 14 } 15 else if (Convert.ToDecimal(args[1]) <= 0 || args[1].Contains(".")) 16 { 17 Console.WriteLine("题目数量必须是 正整数。"); 18 } 19 else 20 { 21 sum = Convert.ToInt32(args[1]); 22 function3(sum); 23 } 24 }
(二)结对编程的体会
这次作业是与小伙伴一起完成的,因为上一次作业没有提前计划好写作业时候很痛苦,这次我们更多注意在事前的讨论和计划上。两个人一起完成,可以有更多讨论和互补,就觉得没有上一次的焦头烂额,完成作业的过程相对顺利和愉快。两个人的能力虽然有限,但是却能够做到两个人都认真参与到这件事中,并且真的学会怎么实现几个功能,以及怎么做单元测试。在力所能及的范围内做到了能做到了。
(三)花费时间较长的事件
(1)学习如何进行单元测试,以及编写测试用例:用visual studio进行Unit test是第一次,所以在网上找了一些博客,包括安装插件、编写测试用例以及运行。
(2)分析功能实现的过程:为了避免在编写程序的过程中因为出现一些对功能的新的理解,使得代码不便于更改甚至需要推翻重写。在实现之前我们用更多的时间讨论可能会遇到的问题。
(3)逆波兰式的转化出现错误,找错花费了一些时间:中缀表达式转化成逆波兰式时,为了便于区分不同的数字,在处理中缀表达式时,每遇到一个运算符时都会添加一个空格。但是在运行测试用例时,得到的结果与预期的字符串都不一样,为了找到这个错,花了一些时间debug。
(4)讨论如何添加括号:一开始也尝试找到一个方法随机插入括号,但是考虑到括号成对等问题,又考虑到一共是四个数之间的运算,所以最后偷懒的采用枚举法了。
(5)实现功能三批量生成试题写入文件的方法:因为还要生成一个可以打印的文档,所以又花了一些时间完成这方面的编码。
要求二:给出照片1张,包括结对的2位同学、工作地点、计算机,可选项包括其他能表达结对编程工作经历的物品或场景。
工作地点:星华公寓 b116
使用乔静玉同学的电脑进行编程
照片:
要求三:使用coding.net做版本控制。
代码地址:https://git.coding.net/qiaojingyu/f4.git