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仓库
二、代码编写
问题背景
阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。
作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:
程序接收一个命令行参数 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 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 GetPractice(int number)
{
//使用List来存储题目
List list = new List(number) ;
//运算符,通过生成一个随机数选择数组中的运算符号并映射到字典当中
string[] optionsArr = new string[] { "+", "-", "*", "/" };
//小孩子似看不懂计算机里面的乘除的,所以创建一个字典
Dictionary optionsDic = new Dictionary();
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 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++;
单元测试
Push到GitHub
这里开始fork错了仓库,导致无法Request Pull,报错信息是master 和 Java分支历史提交信息完全不同。