20180925-6 四则运算试题生成

 此作业要求参考: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

posted @ 2018-10-07 23:13  吴奕瑶  Views(169)  Comments(0Edit  收藏  举报