《系统分析与设计》个人第二次作业
标准开头
Items | Answers |
---|---|
GIT地址 | GIT |
GIT用户名 | homlex |
学号后5位 | 62618 |
博客地址 | 博客主页 |
作业地址 | 作业地址 |
一、从其他用户克隆仓库到本地
过程 | 操作记录 |
---|---|
一、 fork | |
二、克隆 | |
三、配置安装 | |
四、完成启动 |
二、创建项目并编码。
① 创建项目:
创建一个C#.NET 项目,ConsoleApp, 改名为Calculator。
② 设计思路:
1、设计一个
MyRandom
类, 用于产生随即运算符和随机操作数。(为了方便计算,将这里的数字和符号统统设为string
型。)2、设计一个
Formular
类,用于组合这些随机数和随机符号和随机数,并得到其结果,包含一个核心方法:得到完整算式的一个集合,如:{"5+6×3-1 = 22", "3+2-5×0=5", "8×2-6÷2=13"}3、设计
WriteFile
类,一个save(string, List<string>)
方法来将表达式存为txt为文件。4、设计
Executioner
类,配合栈结构,根据具体操作符来返回对应的结果。5、设计计算加减乘除的4个类,返回对应结果。其他细节不做过多介绍。
完整代码在GitHub上。
接下来是编码时间。
③ 一番"Code And Fix"之后的初代成品:
代码在末尾~ ---> 前往
④ 运行结果:
三、单元测试
① 右键-->创建单元测试--> OK
先对Executioner类进行测试。
② 运行结果:可以看到对Executioner的Calc方法测试结果全部通过
接着对Formular类的GetFullExpressions方法测试:
③ 断点调试(在Formular的GetResult方法中设置断点,然后启动调试)
程序在断点处停住。单步执行几下后可以在下方观察局部变量的变化等等等其他调试信息。
④ 性能查看.
先将要产生的四则运算个数以硬编码的形式改为100万,再
ALT+F2
,勾选CPU Usage
, 下方点击开始。1分13秒后生成了测试报告。
可以看到Formular对CPU的占用率最大,主要是因为这个类既要产生表达式还要获得结果,因此可以看出在此程序运行过程中其占比几乎达到100%。而其他的方法偏低。 GetRandomNum比GetRandomOpt多大概10%,这是符合预期的,因为每一次产生数据,前者都要比后者多调用一次。
生成详细报告:点击这里:
他会生成一个
vspx
文件,我们可以看看程序运行的一些细节情况。从整体看来,对CPU的消耗情况比较稳定。随机选取了三个时间点:可以看到使用率基本上平衡在12%.
之后点进占用率最大的GetFullExpressions方法之后可以看到它的一些细节情况。
四、回归测试
回归测试即是对重构之后的代码再次测试,可以防止代码更改后出现新的bug的情况。此次依然是对Executioner
类进行测试,结果如下
五、克隆以及上传
① 克隆:
上面已经演示过了,
这里就只记录了代码上传的过程。② 上传:
来到目录下,右键 打开gitbash
③ 输入git指令
主要执行的
git
命令如下:$ git config --global user.email "xxxxxxx@qq.com" $ git config --global user.name "homlex" $ git init #此次没有用到 $ git add . $ git commit -m "Generate random formulas" $ git remote add origin git@github.com:homlex/AchaoCalculator.git $ git push -u origin master
④ 上传成功
六、遇到的问题&解决
① 安装于配置问题 :
由于之前安装配置过一次,所以这次的配置比较熟悉,一切顺利,没有问题。
② 代码问题:
1、在同一次的运行中,产生的随机数全部都一样
初始化随机种子,将
Random random = new Random();
改为
Random random = new Random(Guid.NewGuid().GetHashCode());
2、计算结果问题。
在计算过程进行到特定阶段时,将用到的数据加以处理。(我这里是将栈逆转)
③ 测试问题:
1、没有遇到特别的问题,就是最开始不知道怎么写这个单元测试,不过后来通过百度解决了。
④ git 问题:
1、运行
git add
时报错如下:error: open(".vs/Calculator/v15/Server/sqlite3/db.lock"): Permission denied error: unable to index file '.vs/Calculator/v15/Server/sqlite3/db.lock' fatal: adding files failed
原因:db.lock文件拒绝访问
在当前目录下创建
.gitignore
文件,用记事本编辑:/.vs
保存,再次
git add
. 原理:既然拒绝访问那就不要add它了吧~2、其他关于git命令问题我参考了这篇文章:git的初次使用。
七、总结
- 以上就是本次作业的全过程,通过本次实操,我熟悉了git的使用,掌握了单元测试的方法,了解了如何查看程序性能,从性能查看结果分析出了后期对代码的优化方向。
- 熟悉硬知识很重要。在求值的时候使用了dijstra双栈的办法,但是由于对数据结构的知识记忆不是很牢,所以在求值这里花了很多时间。
Visual Studio
用起来很舒服,在测试程序的时候将测试结果变得可视化,更加方便了Coder对代码的管控和了解,对代码的优化也起了不小的帮助。- PS:GitHub网站是真的慢。git命令使用起来很方便也很快捷。?
附:主要代码
// Program.cs
using System;
using System.IO;namespace Calculator
{class Program{static void Main(string[] args){int lines = 0;try{lines = int.Parse(args[0]);//lines = 100;if (lines <=0){Console.WriteLine("\n 仅支持 `$ Calculator <一个正整数>` 的形式!"); return;}string path = Directory.GetCurrentDirectory() + "\\subject.txt";WriteFile.save(path, new Formular(1, 8).GetFullExpressions(lines));System.Console.WriteLine("\n 已保存至 " + Directory.GetCurrentDirectory() + "\\subject.txt");}catch (Exception){Console.WriteLine("\n 仅支持 `$ Calculator <一个正整数>` 的形式!"); return;}return;}}
}
// Formulary.cs
using System;
using System.Collections.Generic;namespace Calculator
{public class Formular{private int min, max;//操作数范围public Formular(int min, int max){this.min = min;this.max = max;}//表达式private string[] expression;/// <summary>/// 初始化,生成一个数学表达式/// </summary>/// <param name="min">操作数最小值</param>/// <param name="max">操作数最大值</param>private void Init(int min, int max){int operCount = new Random(Guid.NewGuid().GetHashCode()).Next(2, 4);expression = new string[operCount * 2 + 1];for (int i = 0; i < expression.Length; i++){expression[i] = (i % 2 == 0) ? MyRandom.GetRandomNum(min, max) : MyRandom.GetRandomOpt();}}/// <summary>/// 得到多个完整算式,去除负数结果/// </summary>/// <returns></returns>public List<string> GetFullExpressions(int lines){List<string> list = new List<string>();for (int i = 0; i < lines; i++){Init(this.min, this.max);string temp = "";foreach (var item in this.expression){temp += item;}string res = GetResult();if (int.Parse(res) < 0){i--;}else{list.Add(temp + "=" + GetResult());}}return list;}/// <summary>/// 计算表达式结果/// </summary>/// <returns></returns>private string GetResult(){Stack<string> vals = new Stack<string>();Stack<string> opts = new Stack<string>();for(int i = 0; i < expression.Length; i++){if ("+-".Contains(expression[i])){opts.Push(expression[i]);}else if("×÷".Contains(expression[i])){vals.Push(new Executioner(expression[i]).Calc(vals.Pop(), expression[i + 1]));i++;}else{vals.Push(expression[i]);}}//栈内只剩下加减法,为避免连续减法出错,于是将两者逆序便于依次计算vals = vals.Count == 0 ? vals : Reverse(vals);opts = opts.Count == 0 ? opts : Reverse(opts);while (0 != opts.Count){vals.Push(new Executioner(opts.Pop()).Calc(vals.Pop(), vals.Pop()));}return vals.Pop();}/// <summary>/// 反转栈/// </summary>/// <param name="param"></param>/// <returns></returns>private Stack<string> Reverse(Stack<string> param){Stack<string> result = new Stack<string>();while (param.Count>0){result.Push(param.Pop());}return result;}}
}
// Executioner.cs
namespace Calculator
{public class Executioner : Evaluate{private Evaluate evaluate;public Executioner(string opt){switch (opt){case "+": this.evaluate = new Add(); break;case "-": this.evaluate = new Sub(); break;case "×": this.evaluate = new Mul(); break;case "÷": this.evaluate = new Div(); break;}}public string Calc(string num1, string num2){return this.evaluate.Calc(num1, num2);}}
}
转载于:https://www.cnblogs.com/mashiro-e/p/git_study.html
《系统分析与设计》个人第二次作业相关推荐
- 《系统分析与设计》团队第一次作业
标准开头 Items Answers 所属课程 <构建之法> 作业要求 转到要求 团队名称 猿族崛起 作业目标 做一个实用的软件 团队简介 队名:猿族崛起 原本是一部电影的名称,猿族指大猩 ...
- 系统分析与设计第四次作业
1.简答题 用例的概念 答:用例是在不展现一个系统或子系统内部结构的情况下,对系统或子系统的某个连贯的功能单元的定义和描述. 用例和场景的关系?什么是主场景或 happy path? 答:场景是act ...
- 系统分析与设计作业(五):业务建模与活动图图绘制
系统分析与设计作业(五):业务建模与活动图图绘制 题目 题目 1. 根据订旅馆建模文档,Asg-RH.pdf: 绘制用例图模型(到子用例) 给出 make reservation 用例的活动图 2.根 ...
- 实时控制软件第二周作业 停车场门禁控制系统的状态机设计
实时控制软件第二周作业 停车场门禁控制系统的状态机设计 信号: 灯的信号(红绿): 起落杆的信号: 传感器的信号(外部输入): 状态机信号: 车辆进入 车辆出去 #include <iostre ...
- 软件系统分析与设计作业1
软件系统分析与设计作业1 简答题 软件工程的定义 在软件的开发.操作和维护工程中系统的.有纪律的.可量化的方法.即将工程应用于软件.(强调一种方法) 如1中所述的方法进行研究.(强调一种行为) 解释导 ...
- 信息系统分析与设计杨选辉_信息系统分析与设计
spContent=本课程按照传统的结构化开发方法由浅入深.完整地介绍了信息系统的设计与开发的全过程:还着重介绍了当前最为流行的面向对象的信息系统分析与设计方法. 课程精选了开发过程中最基本.最实用的 ...
- 20189317 《网络攻防技术》 第二周作业
一.黑客信息 (1)国外黑客 1971年,卡普尔从耶鲁大学毕业.在校期间,他专修心理学.语言学以及计算机学科.也就是在这时他开始对计算机萌生兴趣.他继续到研究生院深造.20世纪60年代,退学是许多人的 ...
- mysql 三阶多项式拟合_2014年9月份考试机械CAD_CAM第二次作业
2014年9月份考试机械CAD/CAM第二次作业 一.单项选择题(本大题共40分,共 20 小题,每小题 2 分) 1. 在CAD作业中,采用数据文件形式来处理工程数表.线图数据,其目的是() A. ...
- 2020年人工神经网络第二次作业
第二次作业TEASOFT-DOP文档所在云端目录 ➤01 第一题 1.题目描述 建立起一个竞争网络,有输入层和竞争层组组成,如下图所示,初始权向量为已经归一化为: 训练集合有五个样本向量 xn,n=1 ...
- 面向对象课程第二单元作业总结
面向对象课程第二单元作业总结 前言 电梯系列作业分为三个阶段,逐步深入实现越来越复杂的电梯运行状态模拟. 第一阶段实现单部多线程傻瓜调度(FAFS)电梯的模拟: 第二阶段实现单部多线程可捎带调度(AL ...
最新文章
- 如何提高PyTorch“炼丹”速度?这位小哥总结了17种方法,可直接上手更改的那种...
- python实战-pdf文件转txt
- mysql bitmap redis_Redis中bitmap的妙用
- 【libcudnn】ImportError: libcudnn.so.7: cannot open shared object file: No such file or directory
- java 堆转储快照_捕获Java堆转储的7个选项
- 在ASP.NET中使用Session常见问题集锦
- 对复杂字典DictionaryT1,T2排序问题
- cocos2d-x 音乐/音效设置
- 域名抢注流程是什么?
- 推荐一些本科生理工科书籍
- Oracle LiveLabs实验:Application Continuity Fundamentals
- 正则表达式——(2) 匹配、切割、替换、获取
- android tv keep,Keep电视版
- win10热点 ip配置失败
- 无人值守系统安装--自己的系统实用篇
- 云计算技术基础期末复习
- 最新代千元机!Redmi Note 9正式发布:性能提升100% 1299元起售!
- 计算机网络基础技术:数据通信技术基本概念
- Status of node rabbit@xxxxx... Error: unable to perform an operation on node ‘rabbit@xxxx
- 计算机英语词典 txt,英汉词典TXT格式英汉词典TXT格式.doc