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


    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分支历史提交信息完全不同。

  • 相关阅读:
    Python----定义
    [转载]Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
    彻底明白IP地址——计算相关地址
    [转载] 教你如何迅速秒杀掉:99%的海量数据处理面试题
    [转载]从B 树、B+ 树、B* 树谈到R 树
    [转载]Java抽象类和接口的学习
    [转载]字符串匹配的Boyer-Moore算法
    [转载]字符串匹配的KMP算法
    [转载]孤儿进程与僵尸进程[总结]
    [转载]Huffman编码压缩算法
  • 原文地址:https://www.cnblogs.com/panghu98/p/11536485.html
Copyright © 2020-2023  润新知