• 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

  • 相关阅读:
    Grunt jshint Warning: Path must be a string . Received null Use
    bootstrap滚动监视原理实现
    Bootstrap模态框原理分析及问题解决
    LeetCode54. 螺旋矩阵
    LeetCode53. 最大子序和
    mysql servers实现层拼写SQL
    easyUI 分页 获取页面
    excel导入功能
    easyUI遮罩
    uuid生成
  • 原文地址:https://www.cnblogs.com/wuyiyao694/p/9750987.html
Copyright © 2020-2023  润新知