<<构建之法>>--第二次作业

GIT地址 https://github.com/Panghu98/AchaoCalculator.git
GIT用户名 Panghu98
学号后五位 62632
博客地址 https://www.cnblogs.com/panghu98/p/11536485.html
作业链接 https://www.cnblogs.com/ChildishChange/p/10398212.html

一、环境配置

  • 已配置好环境的VS2015
  • 安装好的Git Bash

github仓库

  • fork仓库
    image.png

  • 将远程仓库克隆到本地
    1.创建自己的仓库并初始化自己的仓库
    步骤1

2.克隆远程仓库
image.png

3.创建文件夹
步骤3

5.配置git提交信息
步骤4

6.创建项目
步骤6


二、代码编写

问题背景

阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。

作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:

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

13+17-1=29
11*15-5=160
3+10+4-16=1
15÷5+3-2=4

实现分析

  • 产生随机数在 0 和 100 之间,运算符在 2 个 到 3 个之间
  • 不能产生分数,也就是其中的除法运算必须为整数
  • 练习题的数量是可以选择的并且需要将生成的 n 道练习题及其对应的正确答案输出到一个文件 subject.txt

代码实现

  • 主函数
static void Main(string[] args)
        {
            //检测并获取正确的数字
            int number = GetNumber();
            List<string> list = GetPractice(number);
            foreach (string str in list)
            {
                Console.WriteLine(str);
            };
            GetFile(list);
            Console.Read();
                
        }
  • 获取练习题数量函数
 private  static int GetNumber()
        {
            Console.WriteLine("请输入你想要生成的练习题数量,并以回车键结束.");
            Console.Write("练习题数量:");
            //练习题输出的数量
            int number;
            try
            {
                //进行输入转换
                number = int.Parse(Console.ReadLine());
            }
            catch
            {
                Console.WriteLine("==============================================");
                Console.WriteLine("======警告:您输入的数字有误,请重新输入======");
                Console.WriteLine("==============================================");
                number = GetNumber();
            }
            Console.WriteLine("即将打印"+number+"道练习题.......");
            return number;
        }
  • 计算结果函数
private static string GetAnswer(string practice)
        {
            DataTable dateTable = new DataTable();
            // 将算式部分计算出结果并转为字符串
            string answer = dateTable.Compute(practice, null).ToString();
            // 如果结果是个小数,则返回null
            if (double.Parse(answer) % 1 != 0) 
            {
                return null;
            }

            return answer;
        }
  • 获取练习题函数
 private static List<string> GetPractice(int number)
        {
            //使用List来存储题目
            List<string> list = new List<string>(number) ;
            //运算符,通过生成一个随机数选择数组中的运算符号并映射到字典当中
            string[] optionsArr = new string[] { "+", "-", "*", "/" };
            //小孩子似看不懂计算机里面的乘除的,所以创建一个字典
            Dictionary<string, string> optionsDic = new Dictionary<string, string>();
            optionsDic.Add("+", "+");
            optionsDic.Add("-", "-");
            optionsDic.Add("*", "x");
            optionsDic.Add("/", "÷");

            //生成随机数产生器
            Random random = new Random(Guid.NewGuid().GetHashCode());
            //产生运算符个数 2~3个
            int count = random.Next(2, 4);
            
            for(int i = 1;i <= number; i++)
            {
                //用于拼接计算式
                StringBuilder stringBuilder = new StringBuilder();
                //用于拼接输出式
                StringBuilder stringBuilder2 = new StringBuilder();

                //产生第一个随机数
                int firstNumber = random.Next(1, 41);
                stringBuilder.Append(firstNumber);
                stringBuilder2.Append(firstNumber);
     
                //产生一个练习题
                for (int j = 0; j < count; j++)
                {
                    //产生随机运算符
                    int index = random.Next(0, 4);
                    int randomNumber = random.Next(1, 31);
                    stringBuilder.Append(optionsArr[index]).Append(randomNumber);
                    //添加正确的输出式
                    stringBuilder2.Append(optionsDic[optionsArr[index]]).Append(randomNumber);
                }
                string result = GetAnswer(stringBuilder.ToString());
                //生成不正确的表达式,重新生成
                if (result == null)
                {
                    i--;
                }
                //把正确的结果放在输出的表达式上
                else
                {
                    stringBuilder2.Append(" = "+result);
                    string str = stringBuilder2.ToString();
                    list.Add(str);
                }
            }
            return list;
        }
  • 文件写入函数
 private static void GetFile(List<string> list)
        {
            try
            {
                StreamWriter streamWriter = new StreamWriter("C:\Users\51030\Desktop\panghu_rep\subject.txt", true);
                //将生成的正确的算术式输出到控制台
                foreach (string str in list)
                {
                    streamWriter.WriteLine(str);
                };
                streamWriter.Close();
                Console.WriteLine("打印完成------");
            }
            catch
            {
                Console.WriteLine("==============================================");
                Console.WriteLine("=============错误:文件生成失败===============");
                Console.WriteLine("==============================================");
            }
        }

  • 运行效果
    运行效果展示图

回归测试

回归测试样例1

  • 在最开始的时候没有将*/转换成对应的数学符号,转化之后发现tsringBuiler输出的结果有错误

通过调试发现是这里的stringBuilder写成了stringBuiler,调试过程忘了保留。
回归测试2

  • 当生成错误的(含有分数结果的算术)应当重新生成,这里开始写成了i++,应当是i--或者是number++;

单元测试

  • 创建单元测试
    创建单元测试解决方案

  • 需要测试的源代码Class
    image.png

  • 添加引用
    添加应用

  • 创建单元测试方法

  • 测试结果
    测试结果

文件输出结果

Push到GitHub

  • 上传到本地
    上传到本地

  • 登录并上传
    登录并上传

  • 申请提交
    申请提交

这里开始fork错了仓库,导致无法Request Pull,报错信息是master 和 Java分支历史提交信息完全不同。

原文地址:https://www.cnblogs.com/panghu98/p/11536485.html