GIT地址 | https://github.com/chenval/AchaoCalculator.git |
---|---|
GIT用户名 | chenval |
学号后五位 | 62224 |
博客地址 | https://www.cnblogs.com/chenVal/ |
作业链接 | https://www.cnblogs.com/harry240/p/11515697.html |
因为自己电脑C盘内存有限,并且自己学的java,在经过老师的同意后,此次作业采用IDEA开发工具+java语言实现。
IDEA天下第一!!!
一、克隆项目
将项目克隆到自己的仓库
然后使用git将项目克隆到本地
(如果采用IDEA进行开发可以直接在Check out from Version Control 中添加仓库的url选好地址自动添加)
添加完成后,进入IDEA。在该项目下新建Modules并命名为Calculator
引入单元测试插件后,即可开始写代码。
二、代码设计
a)题目要求
- 程序接收一个命令行参数 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
可以看出要求中出现的运算符随机,出现的数字随机,运算符的数量随机。所以我们可以写一个随机数类生成这三种随机数。
b)生成随机数
在Calculator目录下的src文件建立com包 然后新建randomNum类
具体代码如下图
package com;
import java.util.Random;
public class randomNum {
int num;
public int createNum(){ //生成数字
this.num=(int)(Math.random()*100)+1;
return num;
}
public String createRuler(){ //生成运算符
this.num=(int) (Math.random()*4)+1;
if(num==1){
return "+";
}else if(num==2){
return "-";
}else if(num==3){
return "*";
}else {
return "/";
}
}
public int createLen(){ //生成运算符的数量
Random random=new Random();
this.num=random.nextInt(2)+2;
return num;
}
}
这样满足了随机生成式子需要的类,接下来将生成出的数字和字符组合在一起。
c)生成随机式子
这里我没用采用JAVA有的类直接进行四则运算,而是自己写,简称自己造轮子。所以在Calculator类中新建方法createFormula
同时考虑到数字是int
型,运算符是string
型。所以用list<Object>
进行储存
public List createFormula(){
randomNum a=new randomNum();
List<Object> formula=new ArrayList<>();
for(int i=0;i<a.createLen();i++){
int num=a.createNum();
String op=a.createRuler();
formula.add(num);
formula.add(op);
}
formula.add(a.createNum());
return formula;
}
d)计算随机式子的值
在计算四则运算时,要考虑运算顺序,先乘除,后加减。因此我这里使用栈进行处理,当运算符为加减时,就入栈。当运算符为乘除时,计算后再入栈,最后得到的栈中只有加减。然后依次出栈计算,即可得到目标结果。
因为要得到传入随机生成的式子且式子
使用list<Object>
储存的所以栈的类型也应该是Object.
并且这里在取值的时候所有数字取的全是int型,所以进行计算的时候不会出现小数
public int solve(List formula){
Stack<Object> stack=new Stack<>();//生成栈
int l=formula.size();//得到式子长度
for(int i=0;i<l;i++){
if(formula.get(i).equals("*")||formula.get(i).equals("/")){
int num=(int)stack.pop();//对输入的数据进行判断如果是乘除,就把之前栈顶元素弹出与后面一个元素计算后再入栈
if(formula.get(i).equals("*")){
int sum=num*(int)formula.get(i+1);
i+=1;//这里是因为,已经在遇到乘除的时候把后面的元素加入计算,所以要加1
stack.push(sum);//入栈
}else if(formula.get(i).equals("/")){
try {//进行错误判断,避免被除数为零的情况
int sum=num/(int)formula.get(i+1);
i+=1;
stack.push(sum);
}catch (Exception e) {
e.printStackTrace();
}
}
}else {
stack.push(formula.get(i));
}
}
int res=0;
Object num;
while(true){
num=stack.pop();//此时栈全是加减,依次出栈计算
if(!stack.isEmpty()){
if(stack.pop().equals("-"))
num=0-(int)num;
}
res=res+(int)num;
if (stack.isEmpty()){
break;
}
}
return res;
}
程序运行输入10得到
这里可以看到list.toString()方法有大括号和点,所以在main方法中用StringBuffer类重新储存式子并写入文件
StringBuffer str=new StringBuffer();
for(Object x:a ){
str.append(x);
}
在当前目录下的subject.txt中得到输出
三、单元测试
在当前类中的空白位置右键点击Generate
选择 JUnit Test
->选择JUnit 4
自动生成测试类。
a)测试solve方法
这里我们输入三个式子,用list<Object>
储存 调用Assert方法进行测试
运行结果表示通过了测试。
b)测试createFormula方法
同时测试createFormula方法是否生成了式子
结果不为空说明,生成了式子。
四、断点测试
点击debug,并在需要断点测试的代码行左边做下记录点,然后点下图中圈出来的箭头一步步 进行。
下图右下框里可以看到响应的变量对应的值。
五、性能测试
(吐槽一下IDEA下载插件,一开始我无法找到任何插件,win的防火墙把插件下载地址拦住了,IDEA自己也认为不安全访问。。。还要说手动关防火墙)
安装插件后,我们打开对自己的程序进行性能分析。
结果如图
六、代码提交
a) 提交到自己的仓库
在需要提交的文件目录下右键点击选择 git bash
随后会弹出
输入自己github相对应的账号密码,点击Login。
出现以上图示说明项目提交到git仓库成功。这个时候应该回收到邮件消息,如果没有收到说明上传失败。
这里我第一次提交的时候出现了如图所示的错误无法上传。经过google搜索后发现Github 禁用了TLS v1.0 and v1.1,必须更新Windows的git凭证管理器,下载地址是这里
b) 向源仓库提交
在项目向自己的仓库提交成功后,我们还要向源仓发起 Pull Request,使得自己的开发能被其他开发这所看见。
在进入自己仓库中,点击圈出来的,一步步跟着步骤走。等待源仓库同意后,即可加入。
六、总结
本次操作通过git实现了代码的提交,以前用github仅仅在于copy优秀的开源项目。这次作业更加深入理解了使用。github访问很慢,不得不使用一些科学方法
这样使得访问速度变快。我们使用的开发工具无论是VS还是IDEA 功能都很强大,我们平时使用知识简单用来写代码,很多功能都没有使用过。如果合理使用这些功能会让开发效率大大提升。
顺便吐槽一个BUG,在我的博客园中背景设置的半透明,如果markdown中出现<Object>
背景就全部透明。,<object>
必须用标注