软件工程第二次作业--熟悉实用工具
Git地址 | https://github.com/Yanyixiao |
---|---|
Git用户名 | Yanyixiao |
学号后五位 | 23225 |
博客地址 | https://www.cnblogs.com/xiaoxiao0331/ |
作业链接 | https://www.cnblogs.com/harry240/p/11515697.html |
一、预先准备工作
Part 0. 程序需求
- 程序接收一个参数 n 随机产生 n 道包含 四则运算 的练习题,数字在 0-100 之间,运算符为 2 或者 3 个。
- 程序运算过程中不得出现分数,运算过程中与结果中都不可以出现。
- 练习题生成好后,将生成的 n 道练习题及其对应答案输出至文件 Subject.txt 中。
Part 1. 配置环境
- 几个月前我的电脑已经安装好Visual Studio 2019 Preview,不再赘述。
二、克隆项目
Part 2.克隆项目
-
Step 1.注册Github账号,已有不再赘述。
-
Step 2.成功登录后,输入阿超仓库的网址,点击右上角Fork,拷贝到自己的同名仓库中。
-
Step 3.在桌面右键菜单中打开Git Bash命令行,输入
git clone https://github.com/Yanyixiao/AchaoCalculator.git
,然后Enter。之后会发现桌面上多了一个同名文件夹。
-
根据作业要求,不执行
git checkout cplusplus
。 -
新建文件夹,命名为
Yanyixiao
-
启动VS2019时发现,2019自带签出代码功能诶。
Part 2.5 签下来的代码是Java的,还得自己写。。
阅读了Java版的代码。
- 照着Java版本的Calculator写了好久,有一个问题还没解决,但是已经很饿了。(09152019 7:00pm)
- 代码最终是写完了。(09182019)
public static Formula MakeFormula()
{
Random ran = new Random();
Formula Form = new Formula();
string build = null;
int count = ran.Next(1, 3); // generate random count
int start = 0;
int number1 = ran.Next(1, 99);
build = build + number1;
Form.FormQueue.Enqueue(Convert.ToString(number1));//uytd 8796r756eu675v 786f876v
while (start <= count)
{
int operation = ran.Next(0, 4); ; // generate operator
int number2 = ran.Next(1, 99);
build = build + op[operation] + number2;
Form.FormQueue.Enqueue(op[operation]);
Form.FormQueue.Enqueue(Convert.ToString(number2));
start++;
}
Form.Form = build;
return Form;
}//Make a Formula(like 1*5+62-5)
- 利用生成随机数的方式,获得随机数字以及随机操作符,使用一个队列来记录生成的算式,方便后续采用双栈法计算混合算式。
public static double Solve(Formula formula)
{
Stack<double> numberStack = new Stack<double>();//Store number
Stack operatorStack = new Stack();//Store operator
while (!(formula.FormQueue.Count == 0))
{
if (!(formula.FormQueue.Peek() == "+" || formula.FormQueue.Peek() == "-"
|| formula.FormQueue.Peek() == "*" || formula.FormQueue.Peek() == "/"))//判断是否数字或者operator
{
numberStack.Push(Convert.ToDouble(formula.FormQueue.Dequeue()));
}
else
{
double X, Y;
switch (formula.FormQueue.Dequeue())
{
case "*":
X = numberStack.Pop();
Y = Convert.ToDouble(formula.FormQueue.Dequeue());
numberStack.Push(X * Y);
goto First;
case "/":
X = numberStack.Pop();
Y = Convert.ToDouble(formula.FormQueue.Dequeue()); /////Designed by Yanyixiao
numberStack.Push(X / Y); /////09/18/2019
goto First;
case "+":
operatorStack.Push("+");
goto First;
case "-":
operatorStack.Push("-");
goto First;
}
First:;
}
}//乘除法计算完毕
while (numberStack.Count >1)
{
switch(operatorStack.Peek())
{
case "+":
numberStack.Push((Convert.ToDouble(numberStack.Pop()) + Convert.ToDouble(numberStack.Pop())));
goto Second;
case "-":
double X, Y;
X = Convert.ToDouble(numberStack.Pop());
Y = Convert.ToDouble(numberStack.Pop());
numberStack.Push(Y - X);
goto Second;
}
Second:;
}
return numberStack.Pop();
}
- 采用双栈法计算混合算式,将数字压入栈中,遇到乘除运算符时弹出两个数字用于运算,再压入数字栈中。
- 加减运算符压入操作栈中,待乘除运算完成后运算加减。
- 我将代码贴到了我的github上并选择了public公开。
- 欢迎大家Fork,点点Star。点击转到Github查看代码
更新了代码,消灭了出现小数的算式,顺手消灭了结果为负数的算式。
因为采用的方式是,舍弃出现小数的算式,同时,因为随机生成1-99的随机数,所以出现小数的概率实在是太高了。所以生成式子中的除法很少。
Part 3.单元测试
- 新建单元测试
- 添加引用
- 测试代码如图
Part 4.效能工具
尝试查看CPU使用率,实际上使用率很低,但是也没学过怎么优化,听说可以多利用其他线程。
也只是听说,不一定对,没了解过。
Part.5 提交代码
利用git commit -m"message"
git push
等命令行,提交了十次,但是我还是很不擅长分支管理,有很多分支都很乱,还有Visual Studio 2019版本里自带push
commit
等功能,地表最强编译器不是盖的。
至此,整个教程完成啦。