zoukankan      html  css  js  c++  java
  • 第二次博客作业——熟悉使用工具

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

  • 相关阅读:
    51nod——T1267 4个数和为0
    cf220B莫队
    cf220b
    poj1436水平可见线
    poj2528贴海报,,
    poj3468
    hdu1698
    ural1989 单点更新+字符串hash
    cf Queries on a String
    hdu4605
  • 原文地址:https://www.cnblogs.com/chenVal/p/11545637.html
Copyright © 2011-2022 走看看