第二次博客作业——熟悉使用工具

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 道加减乘除(分别使用符号+-*/来表示)练习题,每个数字在 0100 之间,运算符在 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>必须用标注

posted @ 2019-09-18 22:29  EstelleAils  阅读(200)  评论(3编辑  收藏  举报