#2018-2019-2 20175310实验一《Java开发环境的熟悉》实验报告 ##1、实验步骤及内容 ###(一)、Java开发环境的熟悉-1 一、创建20175310exp1
的目录 二、在20175310exp1
目录下创建src
,bin
等目录 三、javac,java的执行在20175310exp1
目录html
###(二)、IDEA中调试设置条件断点 一、建立HelloWorld
项目,新建「HelloJDB」类,输入代码。 二、设置断点和单步运行。设置断点只要在设置断点的行号旁用鼠标单击一下,如图,在第5行设置一个断点: java
三、单击菜单「Run」->「Debug...」调试Java程序,咱们能够看到程序停留在了第5行,以下图所示: 学习
四、能够经过条件断点解决循环内部出现的问题。设置条件断点,咱们在第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("输入格式错误!"); } } }
测试运行结果: 调试
##2、实验过程当中遇到的问题以及解决方案code
- 问题1: 参考了2016-2017-2 《Java 程序设计》课堂实践项目这篇博客,看到老师的参考代码,将
MyDC.java
和MyDCTester.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
一块儿加进去编译成功,并且有检测输入格式错误的功能
##3、实验总结 在拿到题目以后以为挺简单,没什么难度,可是开始作以后发现一点都不简单,我整理了如下遇到的问题,个人设计思路主要分如下几个步骤: 一、首先要能支持分数,所以输入输出的变量都应该设为double型。 二、其次这是能支持括号的四则运算,因此不能直接用加减乘除,须要用到“栈”的知识。而栈以前没有学过,只能参考老师、学长们的博客学习栈的用法。 三、老师博客中有写过四则运算的代码,可是那个输入是后缀式,咱们习惯上用的是中缀式,参考了许多博客以后,我把将中缀式转换成后缀式的代码编写出来。 总的来讲,此次代码编写过程不是很顺利,问题一个接着一个,有的时候解决了一个问题但又出现了新问题。此次的问题解决方式主要是参考别人写的博客,学习了有关于“栈”和将中缀式转换成后缀式这两块的写法。 四、PSP时间htm
步骤 | 耗时(min) | 百分比 |
---|---|---|
需求分析 | 20 | 11% |
设计 | 30 | 17% |
代码实现 | 75 | 44% |
测试 | 25 | 14% |
分析总结 | 20 | 11% |