GIT地址 | link |
---|---|
GIT用户名 | sllierz |
学号后五位 | 24236 |
博客地址 | 个人博客 |
作业链接 | 作业链接 |
一、配置环境
1、VS2017的安装与配置
vs是上个学期就已经安装好的,在配置过程中没有遇到什么问题。
二、克隆项目
1、登录到我的GITHUB的主页
2、 进入阿超仓库的网址,点击右上角的 Fork ,将阿超的四则运算库拷贝到自己的同名仓库中
3、将项目克隆到电脑硬盘中(E:\zb 软件工程作业)
三、代码设计
1、打开VS2017,新建项目
2、在网上经过查阅找到的代码,经过自己的修改,并且完全理解。主要思想:随机产生的数字和字符用数组存储,将一道完整的运算题目用字符串储存,用c#中的datatable的compute方法计算字符串的值,判断运算结果中是否含有小数,如果符合要求则将产生的n道题写入ArrayList中,写入文件。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Data;
using System.IO;
namespace ConsoleApp2
{
public class Program
{
public static ArrayList arrayList = new ArrayList();
static void Main(string[] args)
{
Create();
}
//产生随机运算式
public static void Create()
{
Console.WriteLine("输出的题目个数:");
int n = int.Parse(Console.ReadLine());
Random random = new Random();//产生随机数
for (int i = 0; i < n; i++)
{
char[] Operators = new char[] { '+', '-', '*', '/' };
int num = random.Next(2, 5);//产生运算数的个数
int[] numbers = new int[num];
char[] Operator = new char[num];
for (int j = 0; j < num; j++)
{
int number = random.Next(1, 100);
numbers[j] = number;//运算数的值
}
for (int j = 0; j < num; j++)
{
int op = random.Next(4);
Operator[j] = Operators[op];//操作符
}
string arr = "";
for (int t = 0; t < numbers.Length; t++)
{
arr += numbers[t].ToString() + Operator[t].ToString();
}
Chu(Operator, numbers);
arr = arr.Substring(0, arr.Length - 1);
float result = CalcByDataTable(arr);//计算的值
arr = arr + "=" + result.ToString();
if (arr.Contains('.'))
{
i--;
}
else arrayList.Add(arr);
Write(arrayList);//写入文件
}
}
//判断除号的个数,保证可以除尽
public static int[] Chu(char[] Operator, int[] numbers)
{
int j = 0;
for (int i = 0; i < Operator.Length - 1; i++)
{
if (Operator[i] == '/')
j++;
}
switch (j)
{
case 0:
break;
case 1:
for (int m = 0; m < Operator.Length; m++)
{
if (Operator[m] == '/' && m < Operator.Length - 1)
{
numbers[m + 1] = Judge(numbers[m], numbers[m + 1]);
}
}
break;
default:
break;
}
return numbers;
}
//检验是否含有分数,若有则改变除数
public static int Judge(int a, int b)
{
if (a % b != 0 && a == 1)
{
b = 1;
}
if (a % b != 0 && a != 1)
{
for (int x = 2; x <= a; x++)
if (a % x == 0)
{
b = x;
}
}
return b;
}
//利用datatable计算字符串的值
public static float CalcByDataTable(string expression)
{
object result = new DataTable().Compute(expression, "");
return float.Parse(result + "");
}
//写入文件
public static void Write(ArrayList a)
{
FileStream fs = File.Open(@"E:\输出的计算题.txt", FileMode.Create);
StreamWriter wr = new StreamWriter(fs);
foreach (string s in a)
{
wr.WriteLine(s);
}
Console.WriteLine("写入文件成功!");
wr.Close();
}
public static int JudgePoint(string arr, int i, float result)
{
arr = arr + "=" + result.ToString();
if (arr.Contains('.'))
{
i--;//重新生成一道题
}
else arrayList.Add(arr);
Write(arrayList);//写入文件
return i;
}
}
}
四、单元测试与回归测试
1、根据教程所示先新建一个项目,选择单元测试,然后进行引用,最后进行测试。
代码如下:
using System;
using Xunit;
using ConsoleApp2;
namespace XUnitTestProject2
{
public class UnitTest1
{
[Fact]
public void Test1()
{
string s = "1+2+3*4/2";
float f = ConsoleApp2.Program.CalcByDataTable(s);
Assert.Equal(9+"", f+"");
}
}
}
五、效能分析
六、提交代码到Github
七、遇到的问题以及感想
- 第一就是关于写代码的部分对于目前的我来说比较困难,所以我就在网上找了个不是很齐全的代码进行修改过后,并且了解了主要思想写出来了,单元测试的环节是自己写的,主要就是代码方面还有不足,第二就是在Github上传代码的过程中遇到了很大的问题,经常就是建立好了仓库不知道该如何进行上传操作,包括Git的操作,像git push 经常会出现错误,另外就是单元测试环节并不能熟练的使用。还需要多加练习才能达到熟悉的目的。