• 2018-2019-2 20175310实验一《Java开发环境的熟悉》实验报告


    2018-2019-2 20175310实验一《Java开发环境的熟悉》实验报告

    一、实验步骤及内容

    (一)、Java开发环境的熟悉-1

    1、建立20175310exp1的目录
    2、在20175310exp1目录下建立src,bin等目录
    3、javac,java的执行在20175310exp1目录

    (二)、IDEA中调试设置条件断点

    1、创建HelloWorld项目,新建「HelloJDB」类,输入代码。
    2、设置断点和单步运行。设置断点只要在设置断点的行号旁用鼠标单击一下,如图,在第5行设置一个断点:

    3、单击菜单「Run」->「Debug...」调试Java程序,我们可以看到程序停留在了第5行,如下图所示:

    4、可以通过条件断点解决循环内部出现的问题。设置条件断点,我们在第9行左边断点处单击鼠标右键,弹出断点属性框,我们设置条件i==50,如下图所示:

    (三)、练习:实现简单四则运算(能支持分数,加减乘除,支持括号),并进行测试(正常情况,异常情况,边界情况)

    代码:

    import java.util.Stack; 
    import java.util.Scanner;  
     
    public class sizeyunsuan {
     
        static Stack<Character> op = new Stack<>();
         
         
        //计算后缀式的值 
        public static float calrp(String rp){//参数rp:后缀式
            Stack<Float> v = new Stack<>();
            char[] arr = rp.toCharArray();
            int len = arr.length;
            for(int i = 0; i < len; i++){
                Character ch = arr[i];
     
                // 如果是操作数,则推到堆栈
                if(ch >= '0' && ch <= '9') v.push(Float.valueOf(ch - '0'));
     
                // 如果是运算符,则计算结果
                // 在堆栈中有前2个操作数的情况下,将结果推送到堆栈中
                else v.push(getv(ch, v.pop(), v.pop()));
            }
            return v.pop();//返回值return:表达式结果
        }
     
    
    
    
       //将中缀式转换为后缀式
        public static String getrp(String s){//参数s:中缀形式的字符串
             char[] arr = s.toCharArray();
             int len = arr.length;
             String out = "";
     
             for(int i = 0; i < len; i++){   //从左到右扫描中缀式
                 char ch = arr[i];
                 if(ch == ' ') continue;
                 if(ch >= '0' && ch <= '9') {// 如果是操作数,则直接输出
                     out+=ch;
                     continue;
                 }
     
                 if(ch == '+' || ch == '-'){//如果遇到“+”或“-”,则从堆栈中弹出运算符,直到遇到“(”,然后输出,并进栈。
                     while(!op.empty() && (op.peek() != '(')) 
                         out+=op.pop();
                     op.push(ch);
                     continue;
                 }
     
                 
                 if(ch == '*' || ch == '/'){//如果是“*”或“/”,则退栈并输出,直到优先级较低或“(”将运算符进栈
                     while(!op.empty() && (op.peek() == '*' || op.peek() == '/')) 
                         out+=op.pop();
                     op.push(ch);
                     continue;
                 }
    
                 if(ch == '(') op.push(ch);//如果遇到“(”,则直接进栈
     
        
                 
                 if(ch == ')'){ //如果遇到“)”一直退栈输出,直到退到“(”,弹出“(”
                     while(!op.empty() && op.peek() != '(') 
                         out += op.pop();
                     op.pop();
                     continue;
                 }
             }
             while(!op.empty()) out += op.pop();
             return out;//返回值return:后缀形式的字符串
        }
     
    
    
    
        public static Float getv(char op, Float f1, Float f2){
            if(op == '+') return f2 + f1;
            else if(op == '-') return f2 - f1;
            else if(op  == '*') return f2 * f1;
            else if(op == '/') return f2 / f1;
            else return Float.valueOf(-0);
        }
     
         
        public static void main(String[] args){
         try{        
            Scanner reader=new Scanner(System.in);
            System.out.println("请输入表达式:");
            String exp=reader.nextLine();
            System.out.println(calrp(getrp(exp)));
         }
         catch (Exception IOException)           {                                                            
            System.out.println("输入格式错误!");            
         }                
        }
     
    }
    

    测试运行结果:

    二、实验过程中遇到的问题以及解决方案

    • 问题1:
      参考了2016-2017-2 《Java 程序设计》课堂实践项目这篇博客,看到老师的参考代码,将MyDC.javaMyDCTester.java两个文件编译运行之后发现,这个代码只能实现表达式是后缀式的运算,当我们输入平时的运算式时提示出错。
    • 问题1解决方案:
      需要把我们平时使用的中缀式转换为后缀式(逆波兰式),再对逆波兰式进行计算结果,将中缀式转换为后缀式为类getrp,代码如下:
        public static String getrp(String s){//参数s:中缀形式的字符串
             char[] arr = s.toCharArray();
             int len = arr.length;
             String out = "";
     
             for(int i = 0; i < len; i++){   //从左到右扫描中缀式
                 char ch = arr[i];
                 if(ch == ' ') continue;
                 if(ch >= '0' && ch <= '9') {// 如果是操作数,则直接输出
                     out+=ch;
                     continue;
                 }
     
                 if(ch == '+' || ch == '-'){//如果遇到“+”或“-”,则从堆栈中弹出运算符,直到遇到“(”,然后输出,并进栈。
                     while(!op.empty() && (op.peek() != '(')) 
                         out+=op.pop();
                     op.push(ch);
                     continue;
                 }
     
                 
                 if(ch == '*' || ch == '/'){//如果是“*”或“/”,则退栈并输出,直到优先级较低或“(”将运算符进栈
                     while(!op.empty() && (op.peek() == '*' || op.peek() == '/')) 
                         out+=op.pop();
                     op.push(ch);
                     continue;
                 }
    
                 if(ch == '(') op.push(ch);//如果遇到“(”,则直接进栈
     
        
                 
                 if(ch == ')'){ //如果遇到“)”一直退栈输出,直到退到“(”,弹出“(”
                     while(!op.empty() && op.peek() != '(') 
                         out += op.pop();
                     op.pop();
                     continue;
                 }
             }
             while(!op.empty()) out += op.pop();
             return out;//返回值return:后缀形式的字符串
        }
    
    • 问题2:
      没有检测输入格式错误的功能
    • 问题2解决方案:
      catch加入之后显示没有try

      catch一起加进去编译成功,而且有检测输入格式错误的功能

    三、实验总结

    在拿到题目之后觉得挺简单,没什么难度,但是开始做之后发现一点都不简单,我整理了以下遇到的问题,我的设计思路主要分以下几个步骤:
    1、首先要能支持分数,因此输入输出的变量都应该设为double型。
    2、其次这是能支持括号的四则运算,所以不能直接用加减乘除,需要用到“栈”的知识。而栈之前没有学过,只能参考老师、学长们的博客学习栈的用法。
    3、老师博客中有写过四则运算的代码,但是那个输入是后缀式,我们习惯上用的是中缀式,参考了许多博客之后,我把将中缀式转换成后缀式的代码编写出来。
    总的来说,这次代码编写过程不是很顺利,问题一个接着一个,有的时候解决了一个问题但又出现了新问题。这次的问题解决方式主要是参考别人写的博客,学习了有关于“栈”和将中缀式转换成后缀式这两块的写法。
    4、PSP时间

    步骤 耗时(min) 百分比
    需求分析 20 11%
    设计 30 17%
    代码实现 75 44%
    测试 25 14%
    分析总结 20 11%
  • 相关阅读:
    python 中给文件加锁——fcntl模块
    python生成二维码
    uwsgi常用配置
    php curl实现get和post请求
    python __enter__ 与 __exit__的作用,以及与 with 语句的关系
    python文件操作总结
    Python时间,日期,时间戳之间转换
    Python random模块(获取随机数)
    wigs的理解和应用
    shiro中接入单点登录功能
  • 原文地址:https://www.cnblogs.com/xicyannn/p/10584417.html
Copyright © 2020-2023  润新知