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仓库

  • 将远程仓库克隆到本地

    1.创建自己的仓库并初始化自己的仓库

2.克隆远程仓库

3.创建文件夹

5.配置git提交信息

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("==============================================");
}
}
  • 运行效果


回归测试

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

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

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

单元测试

  • 创建单元测试

  • 需要测试的源代码Class

  • 添加引用

  • 创建单元测试方法

  • 测试结果

Push到GitHub

  • 上传到本地

  • 登录并上传

  • 申请提交

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

<<构建之法>>--第二次作业的更多相关文章

  1. java技术第二次作业

    (一)学习总结 1.什么是构造方法?什么是构造方法的重载? 构造方法是用于对对象初始化的方法,当新对象被创建的时候,构造函数会被调用. 每一个类都有构造函数.在程序员没有给类提供构造函数的情况下,Ja ...

  2. 2017-2018-1 JAVA实验站 第二周作业

    2017-2018-1 JAVA实验站 第二周作业 小组成员: 组长 20162318张泰毓 成员 20162303石亚鑫 20162304张浩林 20162307张韵琪 20162321王彪 201 ...

  3. 2017《Java技术》预备作业01

    2017<Java技术>预备作业 1.学习使用MarkDown 本学期的随笔都将使用MarkDown格式,要求熟练掌握MarkDown语法,学会如何使用标题,插入超链接,列表,插入图片,插 ...

  4. 2017《JAVA技术》预备作业

    1.阅读邹欣老师的博客,谈谈你期望的师生关系是什么样的? ==我期望的师生关系是长辈和晚辈,前辈和后生,朋友与朋友之间的关系,作为晚辈,要尊敬长辈,不能对长辈进行言语攻击和起冲突:作为后生,要谨遵教诲 ...

  5. 2017-2018-1 Java演绎法 第二周 作业

    团队任务:讨论Android上的游戏软件 参考现代软件工程 第一章 [概论]练习与讨论: 软件有很多种,也有各种分类办法,本次团队任务是讨论选取Android上的一个游戏软件,考虑到每位组员接触的游戏 ...

  6. 2017《JAVA技术》预备作业-计科1502-19-何俏依

    1.阅读邹欣老师的博客,谈谈你期望的师生关系是什么样的? 我期望的师生关系是长辈和晚辈,前辈和后生,朋友与朋友之间的关系,作为晚辈,要尊敬长辈,不能对长辈进行言语攻击和起冲突:作为后生,要谨遵教诲,有 ...

  7. 《Java技术》第一次作业——Java语言基础

    学习总结 Scanner类实现基本数据输入的方法 Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配.然后可以使用不同的 next 方法将得到的标记转换为不同类型的值. ...

  8. 《Java技术》预备作业总结

    Java预备作业总结 第一次的博客作业完成了,对于一种崭新的形式,大家可能还不太适应,学习和借鉴好的理念和学习方式,是我们缩小差距.提升自己的第一步. 关于你期望的师生关系 从幼儿园到大学,大家接触到 ...

  9. 2017《Java技术》预备作业02

    1.学习使用Git和码云托管代码 参考资料:如何使用Git和码云 安装Git 在码云注册账号,新建项目,名称为Java-CS01(02)XXX, 一班为CS01,二班为CS02,后三位或两位为姓名缩写 ...

  10. 《Java技术》第一次作业

    (一)学习总结 1.在java中通过Scanner类完成控制台的输入,查阅JDK帮助文档,Scanner类实现基本数据输入的方法是什么?不能只用文字描述,一定要写代码,通过具体实例加以说明. (1)使 ...

随机推荐

  1. MySQL学习笔记——MySQL启动过程(一)

    首先去官网或者github下载MySQL5.7的源码. 官网地址:https://dev.mysql.com/downloads/mysql/ github地址:https://github.com/ ...

  2. [US Open 2004][luogu2342] 叠积木 [带权并查集]

    题面 洛谷传送门 思路 害 学了4年多OI,第一次知道还有带权并查集这个东西 wtcl 这个玩意儿的原理和详细实现,可以参考这个博客:带权并查集传送门 这道题,就是在带权并查集的基础上,加个维护每个集 ...

  3. 使用wkwebview时,push后,再pop返回,报错

    使用wkwebview时,push后,再pop返回,报错 Cannot form weak reference to instance (xxxx) of class xxxx. It is poss ...

  4. java获取当前年、半年、季度、月、日、小时 开始结束时间等

    import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 获取 当前年.半年 ...

  5. 使用speedtest-cli测量服务器带宽

    使用speedtest-cli测量服务器带宽,这个是python写的工具,很方便,只需要在服务器端安装即可. 1.安装python-pip # yum install python-pip –y 2. ...

  6. Ubuntu下U盘文件只读的解决办法

    转自linux公社:http://www.linuxidc.com/Linux/2012-12/76130.htm Ubuntu下U盘出现文件系统只读的问题了.症状为无法删除U盘中现有文件,无法向U盘 ...

  7. 如何用C++实现栈

    栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素 ...

  8. vs2017环境下python包的安装

    1)---vs已经下载了的才适用 1,鼠标放在右侧窗口python环境那里(如没有窗口,可点击最上方的“窗口”-“重置窗口”) 2,右键然后点击“查看所有python环境”,会弹出当前默认的环境(高亮 ...

  9. AS3.0 位图(BMP)解析类

    /** * *-----------------------------* * | *** BMP格式解析类 *** | * *-----------------------------* * * 编 ...

  10. Mybatis的实现原理

    在spring启动的时候,spring会根据我们配置的有关mapper.xml的路径加载此路径下的xml文件,得到一个List<Resource>的集合,然后将这个集合转化成Resourc ...