张旭第二次作业
软件工程第二次作业
GIT地址 | https://github.com/shisan9527 |
---|---|
GIT用户名 | shisan9527 |
学号后五位 | 24123 |
博客地址 | https://www.cnblogs.com/shisan9527/ |
作业链接 | https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/homework/7582 |
一、环境配置 | |
环境配置是使用的visual studio2017,Gitbash这两个个必要的软件配置,还有Windows10的系统环境。具体安装过程没有截图,因为当时只想快点把调试环境配置好,没有考虑写博客的内容,所以就截了软件安装好的图片。 | |
其中遇到的问题有以下几个: | |
1.visual studio2017在下载之前有几个选项,第一次我选择了学生版,下载给的描述为免费的代码调试之类的语言,然后下载时好像忘了选组件,导致我安装好后准备开始操作了发现没有可以创建的项目,然后又打开安装器重新勾选,为了避免出现各种程序无法完成的情况出现,这次我就勾选了基本所有的组件,然后成功完成项目的创建。 | |
2.GitHub的账号注册界面是全英文的,对于我这种英语弱智来说只能靠摸索,还有一些平时打游戏积累的英语水平,pass word啊Email啊什么的,也是花了很多时间才注册完成,而且在第一次注册时我误以为我没有注册成功,又重新注册了一次,然后我就拥有了两个账号,一个就是我做作业所用的,用户名shisan9527,另一个用户名为luroufan9527。 | |
3.在我作准备工作时,有同学告诉我还有一个东西要下载,于是我又下载了一个GithubDesktop,但是后来好像并没有使用。所有这个软件我也没有具体去看,不过感觉应该是GitHub社区的一个桌面版本吧。 | |
二、代码设计思路 | |
刚开始我在设计这个代码时,完全没有思路,因为自己C#确实学的不太好,然后晚上的时候我就在网上找教程,想先把C#的语言逻辑等等先梳理一遍(百度“菜鸟教程”),晚上看到一点左右,第二天想了下,总结了以下几个方面具体思路。 | |
1.先储存一个数组,里面包含四则运算符号嘛,因为这四个符号不是随机就能生成的 | |
2.然后是随机数字,根据头一天晚上查询的结果,应该使用Random这个关键词 | |
3.之后就是生成算式了,用循环,先自己设置一个键入的数值,以这个数值为终止数值,我采用的是for循环语句,因为我个人觉得这个循环很好用而且方便 | |
4.再一个就是要保证运算符前后都是数字而不会出现两个运算符同时出现的情况,就在写代码时我采用了a + list1[0] + b + list1[1] + c + "=" + final这样的形式 | |
5.关于随机生成数值都为整数的方法是用类型转换方法,将生成的包含小数的随机数转化为整数 | |
然后自己也在网上搜了很多代码来借鉴,最有意思的一个我觉得是他们在写代码时会设置一个文本格式的文件(txt),然后他们在运行之后,不会在调试结果中看到算式,而是直接输入到了文本文档里。于是我请教了软件工程的朋友,在他的帮助下,我也完成了这个代码。虽然说找了外援,但是确实自己花了很多心思在上面,最重要的还是自己C#语言确实不够熟练,所有我觉得这个代码不能算我自己独立完成的,如果要扣我分的话,我也无怨无悔,只希望,嗯,酌情扣分吧。。。下面是源代码 |
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
namespace Calculator
{
class Program
{
static void Main(string[] args)
{
StreamWriter sw = new StreamWriter(@"D:\软工作业\AchaoCalculator\shisan9527\zx.txt");//定义文档储存位置//
int NumOfSymbol;
DataTable dataTable = new DataTable();
Console.WriteLine("输入一个整数确定四则运算个数,请输入:");
int count = Convert.ToInt32(Console.ReadLine());//将生成数值转为32位整数类型//
String[] symbol = { "+", "-", "*", "/" };
Random r = new Random();//储存四则运算符号到数组里以及生成随机数值//
Console.SetOut(sw);
for (int j = 1; j <= count; j++)
{
int num = r.Next(1, 101);//规定整数大小不超过100//
if (num > 50)
{
NumOfSymbol = 2;
int tmp = 0;
List<string> list1 = new List<string>();
while (true)
{
int NumOfArr = r.Next(0, 4);
string result = symbol[NumOfArr];
list1.Add(result);
tmp++;
if (tmp == NumOfSymbol)
{
string a = Convert.ToString(r.Next(1, 101));
string b = Convert.ToString(r.Next(1, 101));
string c = Convert.ToString(r.Next(1, 101));//同样的,随机生成三个数然后限制范围在100以内//
string formula = String.Concat(a, list1[0], b, list1[1], c);
object test = dataTable.Compute(formula, "");
decimal final = Convert.ToDecimal(test);
int finalNum = Convert.ToInt32(final);
if (final == finalNum && final > 0)
{
if (list1[0].Equals("/") || list1[1].Equals("/"))
{
if (Convert.ToInt32(a) < Convert.ToInt32(b) && Convert.ToInt32(b) < Convert.ToInt32(c))
{
tmp = 0;
list1.Clear();
}
}
else
{
Console.WriteLine(a + list1[0] + b + list1[1] + c + "=" + final);
break;
}
}
else
{
tmp = 0;
list1.Clear();
}
}
}
}
else
{
NumOfSymbol = 3;
int tmp = 0;
List<string> list2 = new List<string>();
while (true)
{
int NumOfArr = r.Next(0, 4);
string result = symbol[NumOfArr];
list2.Add(result);
tmp++;
if (tmp == NumOfSymbol)
{
string a = Convert.ToString(r.Next(1, 101));
string b = Convert.ToString(r.Next(1, 101));
string c = Convert.ToString(r.Next(1, 101));
string d = Convert.ToString(r.Next(1, 101));
string formula = String.Concat(a, list2[0], b, list2[1], c, list2[2], d);
object test = dataTable.Compute(formula, "");
decimal final = Convert.ToDecimal(test);
int finalNum = Convert.ToInt32(final);
if (final == finalNum && final > 0)
{
if (list2[0].Equals("/") || list2[1].Equals("/") || list2[2].Equals("/"))
{
if (Convert.ToInt32(a) < Convert.ToInt32(b) || Convert.ToInt32(b) < Convert.ToInt32(c) || Convert.ToInt32(c) < Convert.ToInt32(d))
{
tmp = 0;
list2.Clear();
}
}
else
{
Console.WriteLine(a + list2[0] + b + list2[1] + c + list2[2] + d + "=" + final);
break;
}
}
else
{
tmp = 0;
list2.Clear();
}
}
}
}
}
sw.Flush();
sw.Close();//这个循环有点大,因为要求比较多,这部分很大程度是朋友帮助下完成的,自己主要就提供自己的思路等等//
}
}
}
还有一个要求是关于小数的,这个问题我也一直没有解决,还是靠软工的朋友给我解决的,他在我的代码后面加了一段用以检测的代码,原则是靠算式的结果,如果结果包含小数,那这个算式就作废。这也是我这个软件调试后的一个bug吧,就是必须要有结果,本来是出算式,最后却把结果一起输出,再一个应该就是大家共有的一个bug,因为不能包含小数,从随机的概率来说,整除的概率肯定是远远小于不能整除的情况的,所有这个代码调试的结果当中除法会很少。
下面是代码运行的结果
三、github克隆项目以及提交代码的整个过程
这个过程其实没有遇到什么问题,在我写代码之前其实我就已经把这个操作流程走了两三遍,在使用gitbash的时候有一个输入账号密码的操作,我在正式上传作业之前就已经完成了。正式上传的时候又找了一个已经完成了作业的同学来指导我,所有没有什么太大的困难,主要是在点击fork时,同学说我第一次fork错了,要到助教的那个库里,我点到自己的库里去了,然后就造成前面走流程的情况。
1.点击此处进入库
2.在此处点击fork
3.复制这个网址
4.打开gitbash,输入 git clone加上刚刚复制的网址按回车可以在当前位置创建一个文件夹
5.配置git账户用户名和邮箱地址,但是我是在正式操作之前就已经完成了这个步骤,所以这里就没有截图了。。。
6.新建一个与账户同名的文件夹
7.在这个文件夹位置里写入代码,然后从该文件夹进入gitbash并进行add和commit操作
因为我之前已经完成过该操作了,所以出现了这样的状况。
8.然后来看看我的上传是否成功
四、单元测试及回归测试
单元测试写了很久都没写出来,刚开始找了很久怎么写单元测试,但总是有各种问题,自己也确实一直没有解决,后来助教在群里发了单元测试的教程,于是自己便一步一步按照教程走。
在写这个单元测试时,对照群里的文件,我大致摸出单元测试的写法,把自己代码的类带入进去,用多个赋值来进行多次测试,但是有几点是我一直无法解决最后也导致我单元测试没有成功进行的。
1.在群文件里有一步,using 后面加的应该是解决方案的名称,但我输入解决方案名称显示是有错误的
2.在引用自己class的类时,我自己的类名为 program,但是引用时显示无法引用静态类
3.在后面的测试中应该是添加自己的变量,但我添加变量进去却显示是无法引用的。
总结上面的几个点,我能大概了解单元测试的写法,但是不清楚自己到底是在那一步出了错,始终无法正确输入。也去咨询了软工的同学,但是他也说自己单元测试没做出来。最后单元测试也就没有完成。
五、总结
这次作业真的让我认识到自己编程能力有多不足,也学到了一些东西,敲代码这个东西我感觉真的还是要时常做才会有感觉,大一刚学C++的时候几乎每天都在写,那段时间写得是最顺手的,后来我们就几乎再也没碰过编程这个东西了,因为专业课确实也很多没要求,就开始鼓捣专业软件,现在再看看专业的要求其实对编程还是有需求的。上课老师也说过一个软件开发出来要有市场才是合格的,市场的需求才是检验的一个最高标准,虽说不一定完全正确,但确实是一个滤网。希望自己以后能把编程语言掌握得更好吧。哎。