20180925-6 四则运算试题生成

作业链接:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2148

git地址:https://git.coding.net/Cool_Ary/f4.git

具体实现功能如下:

功能1:支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答。(+10

功能2:在功能1的基础上,支持括号。(+15

功能3:限定题目数量,精美打印输出,且要避免重复,最好能输出到.txt文件中。且对输入题目数进行限定,题目数量必须是正整数。(+10

功能4:支持分数出题和运算。(不完成此题不倒扣分数)

功能5:可把程序改成GUI/web/移植为androidios版。

这篇博客主要由如下几个方面讲述:

1.每个功能的重点,难点。

2.如何解决重点难点以及收获

3.运行截图

4.结对编程体会。

5.合作过程。

6.版本控制。

一,每个功能的重点,难点

      1)功能一的重点难点

          重点难点1如何产生随机数和随机字符。 

重点难点3:如何将中缀表达式转换成后缀表达式。
         重点难点3:将输入的结果与正确结果比较,然后按照要求输出。
     2)功能二的重点难点 
         功能二的要求:在功能一要求的基础上加上有括号的运算。
         重点难点:加上有括号的运算,我们当初分析的时候是用括号匹配的方法,括号优先级最高,优先算括号里面的算式。
     3)功能三的重点难点 
        功能三的要求:输入题目道数,然后输出四则运算算式以及结果到.txt文件中,注意输出结果右对齐,与算式有一定的距离。
       重点难点:将输出结果放到.txt文件中。

生成四个随机数和三个随机运算符。

int num1 = rand.Next(1, 100);

int num2 = rand.Next(1, 100);

int num3 = rand.Next(1, 100);

int num4 = rand.Next(1, 100);

string[] opera = new string[] { "+", "-", "*", "/" };

string op1 = opera[rand.Next(4)];

string op2 = opera[rand.Next(4)];

string op3 = opera[rand.Next(4)];

将题目输出到文件。

StreamWriter sw = File.AppendText("F:\\研一\\f4\\f4\\answer.txt");

sw.WriteLine("{0,-30}{1}", str, sum);

sw.Flush();//清空缓冲区

sw.Close();//关闭流

判断题目数量是否为正整数。

System.Text.RegularExpressions.Regex reg1 = new System.Text.RegularExpressions.Regex(@"^[0-9]\d*$");

return reg1.IsMatch(str);

中缀表达式转后缀表达式并计算。

for (int i = 0; i < sp.Length; i++)
{
  if (sp[i] != "+" && sp[i] != "-" && sp[i] != "*" && sp[i] != "/" && sp[i] != "(" && sp[i] != ")")
  {
    st1.Push(sp[i]);
  }
  else
  {
    if (st.Count == 0 || IsPriority(sp[i], st.Peek().ToString()) == 1 || sp[i] == "(")
    {
      st.Push(sp[i]);
    }
    else
    {
      while (st.Count != 0)
      {
        if (st.Peek().ToString() != "(")
        {
          res = calc(Convert.ToInt32(st1.Pop().ToString()), Convert.ToInt32(st1.Pop().ToString()), st.Pop().ToString());
          st1.Push(res);
        }
        else if (sp[i] != ")")
        {
          break;
        }
        else if (sp[i] == ")")
        {
          if (st.Peek().ToString() == "(")
          {
            st.Pop();
            break;
          }
          else
          {
            res = calc(Convert.ToInt32(st1.Pop().ToString()), Convert.ToInt32(st1.Pop().ToString()), st.Pop().ToString());
            st1.Push(res);
                 }
              }
          }
      if (sp[i] != ")")
      {
        st.Push(sp[i]);
      }
    }
  }
}

判断题目是否重复。

public static bool IsNotSame(string str, string[] set)
{
  for (int i = 0; i < set.Length; i++)
  {
    if (str == set[i])
    {
      return false;
    }
  }
  return true;
}

运行截图:

 

要求1 

(1) 给出每个功能的重点、难点、编程收获。

功能1:
重点和难点在于表达式的生成和计算表达式的运算结果。
编程收获:String字符串和int整型的互相转换、rand的使用、入栈操作、出栈操作、中缀表达式转后缀表达式、后缀表达式的计算。
功能2:
重点和难点在于括号优先级的判断。主要是在功能1上进行改进。
功能3:
重点和难点在于题目的文件输出。

(2) 给出结对编程的体会

 

两个人一起编程有默契,有争论,也有遇到困难时共同解决的喜悦。和自己一个人编程的感觉很不一样,很喜欢结对编程。

 

(3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。 (10分)

 

a.代码规范时两个人编程习惯的不同,造成制定规范时的争论。
b.编码过程中在计算表达式的值的问题上,两个人都认为自己的想法更好。
c.复审时遇到BUG两人认为出现问题的位置不相同。
d.单元测试时测试用例的定制上出现争论。
e.在如何判断运算符优先级的问题上讨论出多种方案,花费时间比较长。

 

要求2 

给出照片1张,包括结对的2位同学、工作地点、计算机,可选项包括其他能表达结对编程工作经历的物品或场景。 (5分)

 

 

git地址:
posted @ 2018-10-08 12:16  王硕Ary  阅读(160)  评论(0编辑  收藏  举报