个人第二次作业

GIT地址 link
GIT用户名 sllierz
学号后五位 24236
博客地址 个人博客
作业链接 作业链接

一、配置环境

1、VS2017的安装与配置
vs是上个学期就已经安装好的,在配置过程中没有遇到什么问题。
个人第二次作业_第1张图片

2、git的安装与配置
个人第二次作业_第2张图片

二、克隆项目

1、登录到我的GITHUB的主页

2、 进入阿超仓库的网址,点击右上角的 Fork ,将阿超的四则运算库拷贝到自己的同名仓库中
个人第二次作业_第3张图片
3、将项目克隆到电脑硬盘中(E:\zb 软件工程作业)
个人第二次作业_第4张图片

三、代码设计

1、打开VS2017,新建项目
个人第二次作业_第5张图片
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;
        }
    }
}

3、结果如下
个人第二次作业_第6张图片

四、单元测试与回归测试

1、根据教程所示先新建一个项目,选择单元测试,然后进行引用,最后进行测试。
个人第二次作业_第7张图片
代码如下:

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+"");
        }
    }
}

个人第二次作业_第8张图片
2、检查修改后的代码有无错误即对代码进行回归测试。

五、效能分析

根据教程我们可以进行操作
个人第二次作业_第9张图片
个人第二次作业_第10张图片
个人第二次作业_第11张图片

六、提交代码到Github

个人第二次作业_第12张图片

七、遇到的问题以及感想

  • 第一就是关于写代码的部分对于目前的我来说比较困难,所以我就在网上找了个不是很齐全的代码进行修改过后,并且了解了主要思想写出来了,单元测试的环节是自己写的,主要就是代码方面还有不足,第二就是在Github上传代码的过程中遇到了很大的问题,经常就是建立好了仓库不知道该如何进行上传操作,包括Git的操作,像git push 经常会出现错误,另外就是单元测试环节并不能熟练的使用。还需要多加练习才能达到熟悉的目的。

你可能感兴趣的:(个人第二次作业)