第二次作业——熟悉使用工具
1. 工作环境的配置
GIT地址 | https://github.com/zhibihuayue |
GIT用户名 | 执笔画月 |
学号后五位 | 01227 |
博客地址 | https://home.cnblogs.com/zhibihuayue/ |
作业链接 | https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/homework/7582 |
1.1 登录github箱已被占用。打开邮箱翻找邮件发现之前注册过github,然后找回密码顺利登录√
1.2 卸载并安装git
出于便利性的考虑,我将电脑上原来安装的Git for Windows卸载,下载安装了图形化的GitHub for Windows。
1.3 打开Vs2019新建项目
打开Vs2019,确认激活还没有过期并更新软件后,按作业要求顺利创建C#环境的Calculator项目。
顺便体验了一下Vs更新的仓库克隆功能。
2. 代码设计
2.1 题目背景
阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:程序接收一个命令行参数 n,然后随机产生 n 道加减乘除(分别使用符号+-/来表示)练习题,每个数字在 0和 100 之间,运算符在 2 个 到 3 个之间。由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现 3÷5+2=2.6 这样的算式。练习题生成好后,将生成的 n 道练习题及其对应的正确答案输出到一个文件 subject.txt 中。当程序接收的参数为4时,以下为一个输出文件示例。
13+17-1=29
1115-5=160
3+10+4-16=1
15÷5+3-2=4
2.2 代码设计
设计思路,我将整个程序分为三个大模块:主函数,题目生成,文件生成
- 主函数部分创建生成器页面,接收生成需求数量n,按n值进行循环调用函数创建题目、计算题目、输出题目、录入文件
- 题目生成模块分成两个板块,一、用随机数定义数字单元和符号单元 二、将符号单元和数字单元串联组合列式,并进行计算
- 文件生成模块分为两个板块,一、文件标题概况生成 二、题目录入衔接
主体函数模块
1 1 public static void Main(string[] args) 2 2 { 3 3 string Run; 4 4 Console.Write("阿超的四则运算题目生成器\n生成练习题数量:"); 5 5 int n = int.Parse(Console.ReadLine()); 6 6 Writetitle(n); 7 7 for (int i = 0; i < n; i++) 8 8 { 9 9 string Star = Define(); 10 10 Run = Count(Star); 11 11 Console.WriteLine("\n第{0,1}题", (i + 1)); 12 12 Console.WriteLine(Run); 13 13 System.Threading.Thread.Sleep(100); 14 14 Write(Run, i); 15 15 } 16 16 Console.Write("\n\n阿超的四则运算练习题生成完毕,共{0,1}道\n生成题目文件:D:\\于丁软件工程实践\\第二次作业\\阿超的四则运算\\AchaoCalculator\\subject.txt", n); 17 17 Console.Read(); 18 18 }
题目生成模块
1 1 public static string Define() 2 2 { 3 3 Random Problem = new Random(); 4 4 string Start = ""; 5 5 int Sign; 6 6 int Do = 0; 7 7 int Number = Problem.Next(2, 4); 8 8 for (int i = 0; i < (2 * Number) + 1; i++) 9 9 { 10 10 if (i % 2 == 0) 11 11 { 12 12 Sign = Problem.Next(0, 101); 13 13 Start += Sign; 14 14 } 15 15 else 16 16 { 17 17 Do = Problem.Next(0, 4); 18 18 Start += Makesign(Do); 19 19 } 20 20 } 21 21 return Start; 22 22 } 23 23 24 24 25 25 public static string Makesign(int number) 26 26 { 27 27 string sign = ""; 28 28 switch (number) 29 29 { 30 30 case 0: 31 31 sign = "+"; 32 32 break; 33 33 case 1: 34 34 sign = "-"; 35 35 break; 36 36 case 2: 37 37 sign = "*"; 38 38 break; 39 39 case 3: 40 40 sign = "/"; 41 41 break; 42 42 } 43 43 return sign; 44 44 } 45 45 46 46 47 47 public static string Count(string String) 48 48 { 49 49 50 50 DataTable dt = new DataTable(); 51 51 object obj = dt.Compute(String, ""); 52 52 while (obj.ToString().Contains("-") || obj.ToString().Contains(".") || String.Contains("/0")) 53 53 { 54 54 String = Define(); 55 55 obj = dt.Compute(String, ""); 56 56 } 57 57 String = String + "=" + obj.ToString(); 58 58 return String; 59 59 60 60 }
文件生成模块
1 1 public static void Writetitle(int n) 2 2 { 3 3 StreamWriter sw = File.AppendText(@"D:\于丁软件工程实践\第二次作业\阿超的四则运算\AchaoCalculator\subject.txt"); 4 4 sw.WriteLine("阿超的四则运算练习题\n(共{0,1}道题)", n); 5 5 sw.Flush(); 6 6 sw.Close(); 7 7 } 8 8 9 9 10 10 public static void Write(string result, int i) 11 11 { 12 12 StreamWriter sw = File.AppendText(@"D:\于丁软件工程实践\第二次作业\阿超的四则运算\AchaoCalculator\subject.txt"); 13 13 sw.WriteLine("\n第{0,1}题", (i + 1)); 14 14 sw.WriteLine(result); 15 15 sw.Flush(); 16 16 sw.Close(); 17 17 } 18 18 19 19 }
项目整体代码
1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using System.IO; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 namespace ACC 10 { 11 class Program 12 { 13 public static void Main(string[] args) 14 { 15 string Run; 16 Console.Write("阿超的四则运算题目生成器\n生成练习题数量:"); 17 int n = int.Parse(Console.ReadLine()); 18 Writetitle(n); 19 for (int i = 0; i < n; i++) 20 { 21 string Star = Define(); 22 Run = Count(Star); 23 Console.WriteLine("\n第{0,1}题", (i + 1)); 24 Console.WriteLine(Run); 25 System.Threading.Thread.Sleep(100); 26 Write(Run, i); 27 } 28 Console.Write("\n\n阿超的四则运算练习题生成完毕,共{0,1}道\n生成题目文件:D:\\于丁软件工程实践\\第二次作业\\阿超的四则运算\\AchaoCalculator\\subject.txt", n); 29 Console.Read(); 30 } 31 32 33 public static string Define() 34 { 35 Random Problem = new Random(); 36 string Start = ""; 37 int Sign; 38 int Do = 0; 39 int Number = Problem.Next(2, 4); 40 for (int i = 0; i < (2 * Number) + 1; i++) 41 { 42 if (i % 2 == 0) 43 { 44 Sign = Problem.Next(0, 101); 45 Start += Sign; 46 } 47 else 48 { 49 Do = Problem.Next(0, 4); 50 Start += Makesign(Do); 51 } 52 } 53 return Start; 54 } 55 56 57 public static string Makesign(int number) 58 { 59 string sign = ""; 60 switch (number) 61 { 62 case 0: 63 sign = "+"; 64 break; 65 case 1: 66 sign = "-"; 67 break; 68 case 2: 69 sign = "*"; 70 break; 71 case 3: 72 sign = "/"; 73 break; 74 } 75 return sign; 76 } 77 78 79 public static string Count(string String) 80 { 81 82 DataTable dt = new DataTable(); 83 object obj = dt.Compute(String, ""); 84 while (obj.ToString().Contains("-") || obj.ToString().Contains(".") || String.Contains("/0")) 85 { 86 String = Define(); 87 obj = dt.Compute(String, ""); 88 } 89 String = String + "=" + obj.ToString(); 90 return String; 91 92 } 93 94 95 public static void Writetitle(int n) 96 { 97 StreamWriter sw = File.AppendText(@"D:\于丁软件工程实践\第二次作业\阿超的四则运算\AchaoCalculator\subject.txt"); 98 sw.WriteLine("阿超的四则运算练习题\n(共{0,1}道题)", n); 99 sw.Flush(); 100 sw.Close(); 101 } 102 103 104 public static void Write(string result, int i) 105 { 106 StreamWriter sw = File.AppendText(@"D:\于丁软件工程实践\第二次作业\阿超的四则运算\AchaoCalculator\subject.txt"); 107 sw.WriteLine("\n第{0,1}题", (i + 1)); 108 sw.WriteLine(result); 109 sw.Flush(); 110 sw.Close(); 111 } 112 113 } 114 }
最终结果
3. 克隆项目以及提交代码
3.1克隆项目到自己的仓库中
到仓库https://github.com/Cherish599/AchaoCalculator后,点击右上角的“Fork”即可。
3.2 使用git将项目保存到本地
使用git桌面版克隆仓库到本地。
3.3 代码的提交
项目完成并测试保存后,检查仓库状态,在git桌面端进行同步。然后点击自己仓库界面的“New Pull Request”,进行pr。
最后在Cherish599的仓库中查看自己提交的状态。
4. 单元测试
4.1 单元测试创建
在项目解决方案中,新建一个测试单元项目
对测试项目进行引用
引用失败
研究了一会发现是测试单元类型创建错误,重新创建。
再次添加引用,成功√
4.2 关键局部单元测试
使用Vs2019,尝试各种引用,各种设置依赖项均失败。
最后只能采用对关键函数进行单元测试的办法进行。
我对我程序中的Count的计算部分进行单元测试。
测试结果1(正确性)
测试结果2(错误性测试)
5. 基本操作及效能工具
5.1 设置断点
5.2 单步运行
5.3 条件断点
5.4 回归测试
5.5 效能工具
1 public static void Main(string[] args) 2 { 3 string Run; 4 Console.Write("阿超的四则运算题目生成器\n生成练习题数量:"); 5 int n = 100000; 6 Writetitle(n); 7 for (int i = 0; i < n; i++) 8 { 9 string Star = Define(); 10 Run = Count(Star); 11 Console.WriteLine("\n第{0,1}题", (i + 1)); 12 Console.WriteLine(Run); 13 System.Threading.Thread.Sleep(100); 14 Write(Run, i); 15 } 16 Console.Write("\n\n阿超的四则运算练习题生成完毕,共{0,1}道\n生成题目文件:D:\\于丁软件工程实践\\第二次作业\\阿超的四则运算\\AchaoCalculator\\subject.txt", n); 17 Console.Read(); 18 }
CPU使用率测试
6. 感想
环境配置上因为计算机上有过去的软件基础,没有造成太大的困难。
软件的整体架构和和代码设计上,因成果需求明确简单,且逻辑不复杂,所以弹性空间很大,设计和编写上十分自由,而且篇幅不大,也没有造成太大的问题。
单元测试上,因为整个程序逻辑简单,核心构架很少(就一个),所以测试过程也为造成太大难度。
总体而言,整个项目作业操作不复杂,内容较简单,数量也不大,但软件版本更迭和软件教程的落后造成了比较大的影响。
比如我使用的是Vs2019,作业教程为Vs2015的指导,软件版本不同带来的,界面和功能的删改集合等原因,致使在Vs2019的操作上与作业指导中其实六、七成极不相同(Vs2019中删除了附加依赖项、属性配置等模块,如若按作业手册上操作无法进行);
比如我是用的是github桌面版。与作业指导中github控制台版操作同样完全不同,显而易见的桌面版实际操作只有三到四步,而作业指导中的控制台版需要数十步,着实烦琐同时对不上号。
总时间有10分的话,需求明确和软件设计占到2分,博客编辑与撰写占到2分,软件版本带来的磨合占到6分。
综上所述,感觉整个作业流程对软件和操作的熟悉很有帮助,但是作业指导中软件的版本有些过老。(比如使用Vs中的团队资源管理器和git源代码管理器,就可以做到github仓库的克隆、上传同步和版本控制,而且是中文环境,可以减少作业指导中70%左右的非代码部分的操作量)