作业链接: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版/移植为android,ios版。
这篇博客主要由如下几个方面讲述:
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地址: