豆子第一次代码作业:第二次作业

GIT地址

https://github.com/viocing/AchaoCalculator

GIT用户名

https://github.com/viocing

学号后5位

62306

博客地址

https://www.cnblogs.com/voicing/

作业链接

https://edu.cnblogs.com/campus/ xnsy/2019autumnsystemanalysisanddesign/homework/7584

Part 1 开发环境准备

本次实验采用Visual Studio 2017版本进行开发,安装过程如下:

1.百度网盘链接:pan.baidu.com/s/1_HycbxXqRfptMYEaho02bg
提取码:srpx

2.将下载好的安装包解压到当前文件夹:

3.打开安装包文件夹:

4.右键点击以管理员的身份运行

5.点击继续

6.由于VS内存占用较大,最好修改存储位置,将其安装在非系统盘目录。

7.选择要下载的组件,本次作业运用的是C#语言,所以这里勾上了C#的组件:

8.耐心等一段时间

9.点击以后再说

10.可以更改颜色主题,这里豆子改成了深色主题,然后就可以启动啦~

Part 1遇到的问题

在安装VS2017的时候刚开始把安装路径放在了C盘,导致在安装的时候报出需要释放C盘空间才能继续安装(幸好报了,不然C盘就炸了,呼~)

Part 2 克隆项目

1.首先下载Git 下载地址:

https://git-scm.com/downloads

选择Windows下载

2.选择与电脑位数相同的安装包下载

3.进行安装:

3.按照步骤依次进行安装,安装完成后在桌面会有Git Bash以及Git GUI的快捷方式,右键桌面空白处会发现如图:

4.在桌面空白处右键点击进入Git Bash Here,出现如图所示的窗口:

配置用户名:git config --global uesr.name "github注册时的用户名"

配置用户邮箱:git config --global user.email "github注册时的邮箱"

注:在Git Bash上是无法进行ctrl+v进行复制的,豆子请教了一下度娘,可以采用insert键进行复制。

也可以通过下面两个命令来检查是否配置成功:

git config user.name

git config user.email

5.输入阿超仓库的网址https://www.cnblogs.com/harry240/p/11515697.html
点击右上角的Fork,将其拷贝到自己的同名仓库中,如图:

6.克隆到对应的文件夹,复制仓库的HTTP地址:

进入到相应的文件夹,输入git clone +仓库的HTTP:

再来看看文件夹,很愉快地成功了~:

新建一个文件夹,重命名为自己地仓库名:

7.创建项目。由于本次作业要求用C#编写程序,所以这里选择C#控制台应用程序,位置放在刚刚新建的文件夹所在的路径,解决方案名称可以为Calculator:

8.接下来接连使用git add. 和git commit -m "分支名称"可以用来保存更改:

Part 2遇到的问题

在安装Github的时候基本没有什么大问题,在进行仓库克隆的时候刚开始没有按照助教给的步骤进行,而是直接采用在终端输入代码来进行仓库的直接克隆,饶了一大转,最后删除了原来克隆好的分支,再按照助教给的,先克隆到自己的仓库,然后再克隆自己的仓库。最后可以在本机的文件夹中找到项目了。使用git的终端命令行的时候还不太熟练需要多多尝试一下接下来的上传仓库。

Part 3 编码阶段

题目:

阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:

  • 程序接收一个命令行参数 n,然后随机产生 n 道加减乘除(分别使用符号+-*/来表示)练习题,每个数字在 0 和 100 之间,运算符在 2 个 到 3 个之间。
  • 由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现 3÷5+2=2.6 这样的算式。
  • 练习题生成好后,将生成的 n 道练习题及其对应的正确答案输出到一个文件 subject.txt 中。

总体思路:本次编码采取C#语言;

1.首先,确定需求。自己要先输入生成的题目数,所以决定采用int.Parse(Console.ReadLine())来确定题目数字
2.接下来通过循环产生相应的题目数
3.那么现在的重点就是如何产生算式并计算出结果
4.进入到产生算数的函数,要求产生的数字在0和100之间、运算符的个数在2到3个。由此知道要采用随机函数来生成对应的运算数和运算符的个数。
5.生成运算数和运算符数过后,还要随机生成运算符的类型,所以用了一个 public string Sybx(int num)函数来判断生成的符号类型,1代表“+”,2代表“-”,3代表“*”,4代表“/”。
6.式子的各个部分准备好后就是怎么连接起来了,决定采用循环连接,由于生成的均为字符串类型所以直接用“+”进行连接即可。
7.最后的等号左边的式子用一个字符串变量存起来(豆子这里用的变量为s)再用计算函数public string result(string s)(C#有一个自带的方法可以计算四则运算)这样就可以返回计算结果啦
8.得到相应的式子以及计算结果后,再来判断式子不能出现分母为0的情况,最后的结果不能出现小数。
9.如果不满足8中的两个条件就不进行输出操作,并且将循环的i减1用以保证最后产生的算式的个数为用户输入的个数。

代码:

生成算式函数:

 //生成一个具体的等式int symbolnum;//符号个数public string setequal(){      string s = null;//用以记录最后生成算术题int figure;//随机生成的数字string symbol;//随机生成的符号int n;//用以判断生成的符号int i;//采用Random类Random rd = new Random(Guid.NewGuid().GetHashCode());//使用Guid的哈希码作为种子值symbolnum = rd.Next(2, 4);//随机生成符号个数在2个到3个之间figure = rd.Next(0, 101);//产生的一个数s = s + figure.ToString();//先接上第一个数字for (i=0;i< symbolnum;i++){n =rd.Next(1, 5);//随机产生符号编号symbol = Sybx(n);//翻译成符号s = s + symbol;figure= rd.Next(0, 101);s = s + figure.ToString();}return s;}

判断生成符号类型函数

//判断符号类型public string Sybx(int num){if(num==1){return "+";}if(num==2){return "-";}if(num==3){return "*";}if(num==4){return "/";}else{return "";}}

计算结果函数:

 //计算函数public string result(string s){DataTable dt = new DataTable();return dt.Compute(s, "false").ToString();}

拼接算式和结果函数:

    public class fun{public string cv(string equation){jisuan x = new jisuan();int u;//判断是否分母为0int nm;int weizhi = 0;string last = null;//最终产生的结果string rt = null;//计算结果字符串u = equation.IndexOf("\0");//不能出现分母为0的情况if (u == -1){rt = x.result(equation);weizhi = rt.IndexOf(".");//不能出现结果为小数的情况if (weizhi == -1){last = equation + "=" + rt;return last;  }else{return " ";}}else{return " ";}}}

主函数将最后的结果写入文件

class Program{static void Main(string[] args){string bg = null ;string h = null;string equation = null;//产生的式子int nm = int.Parse(Console.ReadLine());//输入生成的算式的个数fun f = new fun();                           //Console.WriteLine(nm.ToString());for (int i = 0; i < nm; i++){jisuan x = new jisuan();equation = x.setequal();bg = f.cv(equation);if(bg!=" "){h = h + bg + "\r\n";}else{i--;continue;}}Console.WriteLine(h);System.IO.File.WriteAllText("E:/subject.txt",h, Encoding.Default);Console.ReadKey();}}

总程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace Calculator
{class jisuan{int symbolnum;//符号个数//生成一个具体的等式public string setequal(){string s = null;//用以记录最后生成算术题int figure;//随机生成的数字string symbol;//随机生成的符号int n;//用以判断生成的符号int i;//采用Random类Random rd = new Random(Guid.NewGuid().GetHashCode());//使用Guid的哈希码作为种子值symbolnum = rd.Next(2, 4);//随机生成符号个数在2个到3个之间figure = rd.Next(0, 101);//产生的一个数s = s + figure.ToString();//先接上第一个数字for (i = 0; i < symbolnum; i++){n = rd.Next(1, 5);//随机产生符号编号symbol = Sybx(n);//翻译成符号s = s + symbol;figure = rd.Next(0, 101);s = s + figure.ToString();}return s;}public string Sybx(int num)//判断符号{if (num == 1){return "+";}if (num == 2){return "-";}if (num == 3){return "*";}if (num == 4){return "/";}else{return "";}}//计算函数public string result(string s){DataTable dt = new DataTable();return dt.Compute(s, "false").ToString();}}class fun{public string cv(string equation){jisuan x = new jisuan();int u;//判断是否分母为0int nm;int weizhi = 0;string last = null;//最终产生的结果string rt = null;//计算结果字符串u = equation.IndexOf("\0");//不能出现分母为0的情况if (u == -1){rt = x.result(equation);weizhi = rt.IndexOf(".");//不能出现结果为小数的情况if (weizhi == -1){last = equation + "=" + rt;return last;  }else{return " ";}}else{return " ";}}}class Program{static void Main(string[] args){string bg = null ;string h = null;string equation = null;//产生的式子int nm = int.Parse(Console.ReadLine());//输入生成的算式的个数fun f = new fun();                           //Console.WriteLine(nm.ToString());for (int i = 0; i < nm; i++){jisuan x = new jisuan();equation = x.setequal();bg = f.cv(equation);if(bg!=" "){h = h + bg + "\r\n";}else{i--;continue;}}Console.WriteLine(h);System.IO.File.WriteAllText("E:/subject.txt",h, Encoding.Default);Console.ReadKey();}}
}

Part 3遇到的问题

1.一开始不知道C#自带有一个可以计算四则运算的方法,刚开始是打算用栈的办法来做,然后考虑优先级,写了很久发现 不是一点点的复杂。所以决定试试有没有可以直接计算四则运算的函数,没想到一查就查到了,最后决定采用这个方法来计算四则运算。其实自己还想了一个思路就是把“*”和“/”分成A类,把“+”和“-”分成B类,这样A和B的位置也最多只有8种,一种一种情况来写按照逻辑来说还是行得通。如图:

2.随机生成对应的式子的时候,如果想要生成5个式子,前面两个是不一样的,后面的式子就都和第二个式子一样,于是我想是不是随机种子的问题,于是问了问度娘,发现可以Random产生随机数不重复只能用以数字区间不大的情况,于是决定采用计时周期作为时间种子这样就可以避免产生重复的数字。但是以时间线作为种子进行伪随机运算,当计算运行速度过快时,导致所有的随机种子都是一个值,经过了一系列的周折后,终于找到了一种解决方式使用Guid的哈希码作为种子值,就不会重复了。

3.在写入txt文件的时候,比如我想输入5个等式就会发现最后的txt文件并不会接连存入而是会刷掉现存的然后再存入当前循环的,于是我决定将循环的所有结果都存在一个字符串里面,最后再存入到txt文件当中,这样就可以得到最后的结果啦。

Part 4 单元测试

1.将所有的类都改为公有的。

如果不将类改为公有的就会出现下列情况:

2.选中要测试的函数或者类名右键单击选择创建单元测试。

3.写好测试代码再进行测试:

出现测试错误,继续修改测试代码:

对test函数进行测试,测试成功:

再对Sybx函数进行测试,测试成功:

对cv函数进行测试,测试成功:

Part 4遇到的问题

1.刚开始没有把类改为公有的导致不能生成单元测试,将类改为公有的过后就可以创建单元测试了。
2.由于最先的代码不便于单元测试,所以更改了很多,把每个不一样功能的函数尽量分隔开来,单元测试的代码就好写了很多。

Part 5 基本操作

1.断点,设置断点非常简单,在要设置断点的行号旁用鼠标单击一下就行了(注意要点到与右侧编辑器颜色明显不同的区域)

2.单步运行,点击调试->开始调试

逐语句调试

在下面的窗口还可以直接看到变量随着调试值的变化

3.监视,可以自己操作去监视一些变量。

在下方的界面就会只显示监视变量的值进行实时的观察。

4.条件断点:某些断点在某些条件下成立

满足条件断点生效:

Part 5遇到的问题

1.在设置断点的时候刚开始的时候设置在了必须要手动输入的那一行就导致整个调试程序不能运行,于是选择自己赋值然后执行下面的步骤。
2.在进行监视变量设置的时候没有在调试阶段,导致无法设置监视变量,设置监视变量的时候一定要处于调试阶段才行。

Part 6 回归测试

修改完所有的Bug之后,运行一遍之前所有的单元测试样例。看看是否所有的测试都可以通过:

可以看到所有的测试均通过,回归测试很好的完成了。

Part 6遇到的问题

回归测试对于最后验证测试代码以及代码的正确性具有很重要的作用。最后的测试案例全部通过。

Part 7 效能分析

VS当中内置有效能工具,名叫性能探查器。

为了查看程序的执行效率,选择测试CPU使用率->开始:

等待分析一段时间后,停止收集,最后就会产生一份效能分析报告:

上图可以看出Main函数占用的CPU达到了30%多,如果想要查看更加详细的分析报告,点击创建详细报告:

这样就会打开一个.vspx文件

点进Main函数:

这样就可以看到每行代码占用的CPU时间:

Part 7遇到的问题

学会了如何进行效能分析,更加清楚地了解到了某个函数占用的CPU时间,以及对每个函数内每行代码占用比例有了一定的认识,对于改进代码的运行效率有很大的帮助。

Part 8 提交代码

1.进入到文件夹->右键Git Bash

2.输入git add .以及git commit -m "分支名称"

3.为了确保都已经进行了git add和gt commit操作,可以使用git status来进行验证:

4.出现nothing commit就可以进行push操作了,最后出现如图的成功提示:

5.完成push操作后,向源仓库发起Pull Request(简称 PR ,指发起请求给仓库贡献代码)。打开你 Fork 后的项目主页,点击New pull request

6.点击后会出现如下界面:

7.正确命名:

8.成功提交:

Part 8遇到的问题

1.由于之前用过一次git,所以在最后push的时候没有弹出登录页面直接就push成功了。
2.还要注意一些命名问题,在commit的时候可以进行。

Part 9 小感想

经过这次的博客作业,学会了怎么去安装vs以及git。还编了程序,很愉快的一次体验。在git方面还是不太懂一些操作,这一次完整地进行了克隆还有上传,对git也学习到了很多。在代码方面也遇到了很多瓶颈,比如太多的功能都放在主函数导致最后测试的时候很难写测试代码,所以以后在写代码的时候要尽量把每个部分的功能分开来进行操作。

转载于:https://www.cnblogs.com/voicing/p/11556612.html

熟悉使用工具---第二次作业相关推荐

  1. 第二次作业熟悉使用工具

    第二次作业熟悉使用工具 GIT 地址 https://github.com/15565048308 GIT用户名 15565048308 学号后五位 24221 博客地址 https://www.cn ...

  2. 20189317 《网络攻防技术》 第二周作业

    一.黑客信息 (1)国外黑客 1971年,卡普尔从耶鲁大学毕业.在校期间,他专修心理学.语言学以及计算机学科.也就是在这时他开始对计算机萌生兴趣.他继续到研究生院深造.20世纪60年代,退学是许多人的 ...

  3. 2017软件工程实践第二次作业(数独)

    我的Github项目地址,使用工具VS2017社区版 / DevC++5.11,开发语言为C语言 基础题要求如下,附加题不会做就不贴出来了...: 项目需求 利用程序随机构造出 N 个已解答的数独棋盘 ...

  4. 计算机文化基础第二次作业-简答题,中传2018年秋计算机文化基础第二次作业-简答题...

    <中传2018年秋计算机文化基础第二次作业-简答题>由会员分享,可在线阅读,更多相关<中传2018年秋计算机文化基础第二次作业-简答题(7页珍藏版)>请在人人文库网上搜索. 1 ...

  5. 软件质量与测试--第二周作业 WordCount

    软件质量与测试--第二周作业 WordCount Github地址: https://github.com/RicardoDZX/WordCount PSP: PSP2.1 PSP 阶段 预估耗时 ( ...

  6. BUAA OO第二单元作业总结

    一.作业设计策略 (一)第一次作业设计方案 模型:生产者消费者模型 两个线程:输入线程(生产者).电梯线程(消费者) 共享对象:请求队列 退出模式:输入线程读到null,退出run,并将null传入请 ...

  7. 构建之法——团队第二次作业

    团队第二次作业 一.简介 这个作业属于哪个课程 课程地址 这个作业要求在哪里 作业要求 团队名称 RunningMan 这个作业的目标 对我们选择的题目"校园跑腿"进行需求分析,分 ...

  8. mysql 三阶多项式拟合_2014年9月份考试机械CAD_CAM第二次作业

    2014年9月份考试机械CAD/CAM第二次作业 一.单项选择题(本大题共40分,共 20 小题,每小题 2 分) 1. 在CAD作业中,采用数据文件形式来处理工程数表.线图数据,其目的是() A. ...

  9. 面向对象课程第二单元作业总结

    面向对象课程第二单元作业总结 前言 电梯系列作业分为三个阶段,逐步深入实现越来越复杂的电梯运行状态模拟. 第一阶段实现单部多线程傻瓜调度(FAFS)电梯的模拟: 第二阶段实现单部多线程可捎带调度(AL ...

最新文章

  1. 【怎样写代码】函数式编程 -- Lambda表达式(三):LINQ初步
  2. 干货丨数据科学、机器学习、人工智能,究竟有什么区别?
  3. 2011年计算机等级考试二级java笔试练习题(10)_2010年3月计算机等级考试二级Java笔试题及答案...
  4. [网络安全自学篇] 三十三.文件上传之绕狗一句话原理和绕过安全狗(六)
  5. 关于Spring容器管理Bean的过程以及加载模式
  6. jvm什么是本地方法
  7. 使用GZIP和Zip压缩Java数据流
  8. 基于java的数据结构学习——数组实现的栈以及简单应用
  9. 华为发布《大交通时代》:开启未来数字交通宏图
  10. TranslateAnimation类:位置变化动画类
  11. 更改shape文件字段名,提示Failed to alter the name of the field
  12. Git提交空文件夹的技巧
  13. 深入理解Solaris内核中互斥锁(mutex)与条件变量(condvar)之协同工作原理
  14. cad无法修复图形文件_CAD应用技巧:DWG图形的“瘦身”
  15. PPT——背景图格式(排版)和字体排版
  16. iOS国际化(多语言)App名称国际化
  17. 年薪和月薪有什么区别
  18. Dynamics 365——设置视图可编辑
  19. IGRP和EIGRP的无缝结合
  20. IDEA 2021 将分支代码合并到另一分支上

热门文章

  1. TRIZ创新方法——现代TRIZ理论
  2. JS 批量删除(所有页面)
  3. 若g(x,u,w)为凸,则p(u,w)=inf{x} g(x,u,w)为凸
  4. HDU-1728---逃离迷宫(BFS)
  5. 免费的微软认证考试券又双叒叕来了 Microsoft Build 2022
  6. 基于51单片机的水质水位PH值溶解率电导率水温浊度检测proteus仿真原理图PCB
  7. camunda入门教程及实现原理
  8. 【趣味“五子棋”---html页面实现(附源代码)】
  9. 基于单片机的篮球计分器设计
  10. 局域网共享的四个因素