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>必须用标注

相关文章:

  • 2022-12-23
  • 2021-12-02
  • 2022-12-23
  • 2021-10-10
  • 2022-12-23
  • 2021-07-02
  • 2022-12-23
猜你喜欢
  • 2021-04-07
  • 2021-05-20
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案