java实验一总结
实验一第一部分
在Linux中运行结果

通过cd和mkdir命令建立tree,带包编译并用
javac -d bin
的命令将编译文件保存在bin目录中
通过
java -cp
的命令运行带包的程序
实验第二部分
用idea调试程序
左键点击行号旁边的空白设置断点。

用F7快捷键逐步运行代码

用F9快捷建快速运行到下个断点

右键点击断点可以设置循环条件

实验第三部分
实验题目:实现简单的四则运算
实验代码:
import java.io.*;
import java.util.Stack;
public class siziyunsuan {
public static void main(String[] args) {
int i,f;
double result;
int zuokuohao1 = 0;
String ch2 = new String();
BufferedReader buf = new BufferedReader (new InputStreamReader(System.in));
try{
String str = buf.readLine();
f = chu0.chu0(str);
if(f == 0) {
char[] ch1 = str.toCharArray();
int len1 = ch1.length;
Stack<Character> operators = new Stack<>();
Stack output = new Stack<>();
zuokuohao1 = rpn(operators, output, str);
for (i = 0; i < len1 - 2 * zuokuohao1; i++) {
ch2 = output.pop() + ch2;
}
System.out.println(ch2);
result = jisuanhouxu.evaluate(ch2);
System.out.println(result);
}
else{
System.out.println("除数为0");
}
}catch(IOException e){
}
}
public static int rpn(Stack<Character> operators, Stack output, String str) {
char[] chars = str.toCharArray();
int pre = 0;
boolean digital;
int zuokuohao = 0;
int len = chars.length;
int bracket = 0;
for (int i = 0; i < len; ) {
pre = i;
digital = Boolean.FALSE;
while (i < len && !Operator.isOperator(chars[i])) {
i++;
digital = Boolean.TRUE;
}
if (digital) {
output.push(str.substring(pre, i));
} else {
char o = chars[i++];
if (o == '(') {
bracket++;
zuokuohao++;
}
if (bracket > 0) {
if (o == ')') {
while (!operators.empty()) {
char top = operators.pop();
if (top == '(') {
break;
}
output.push(top);
}
bracket--;
} else {
while (!operators.empty() && operators.peek() != '(' && Operator.cmp(o, operators.peek()) <= 0) {
output.push(operators.pop());
}
operators.push(o);
}
} else {
while (!operators.empty() && Operator.cmp(o, operators.peek()) <= 0) {
output.push(operators.pop());
}
operators.push(o);
}
}
}
while (!operators.empty()) {
output.push(operators.pop());
}
return zuokuohao;
}
}
enum Operator {
ADD('+', 1), SUBTRACT('-', 1),
MULTIPLY('*', 2), DIVIDE('/', 2),
LEFT_BRACKET('(', 3), RIGHT_BRACKET(')', 3);
char value;
int priority;
Operator(char value, int priority) {
this.value = value;
this.priority = priority;
}
public static int cmp(char c1, char c2) {
int p1 = 0;
int p2 = 0;
for (Operator o : Operator.values()) {
if (o.value == c1) {
p1 = o.priority;
}
if (o.value == c2) {
p2 = o.priority;
}
}
return p1 - p2;
}
public static boolean isOperator(char c) {
for (Operator o : Operator.values()) {
if (o.value == c) {
return true;
}
}
return false;
}
}
class jisuanhouxu {
public static double evaluate(String s) {
double c1 = 0;
double c2 = 0;
double d1 = 0;
double d2 = 0;
char[] ch = s.toCharArray();
Stack<Double> num = new Stack<>();
for (int i = 0; i < ch.length; i++) {
char c = ch[i];
if (c >= '0' && c <= '9') {
num.push(Double.parseDouble(Character.toString(c)));
} else {
switch (c) {
case '+':
num.push(num.pop() + num.pop());
break;
case '-':
c1 = num.pop();
c2 = num.pop();
num.push(c2 - c1);
break;
case '*':
num.push(num.pop() * num.pop());
break;
case '/':
d1 = num.pop();
d2 = num.pop();
num.push(d2 / d1);
break;
default:
break;
}
}
}
return num.pop();
}
}
class chu0{
public static int chu0(String s){
int i;
int flag = 0;
char[] ch = s.toCharArray();
for(i=0;i < ch.length;i++){
if(ch[i] == '/' && ch[i+1] == '0')
flag = 1;
}
return flag;
}
}
实验运行结果


实验中遇到的问题
1、首先是读题问题。题目的要求应是键盘输出式子,而不是随机生成式子。随机生成式子的代码我写了两天,浪费了许多时间,但也不是没有什么收获。随机生成式子的难点在于括号的插入,我一开始的想法是先生成不带括号的式子,然后将括号插入其中。后面发现这样实现起来需要考虑的地方太多。要考虑括号中间不能为空或者只有一个数,还有保证左右括号的数量相等,还有考虑多个左括号或右括号在一起的情况等等。于是我想能否在生成式子的过程中就插入括号呢?后来我还真找到一种方法,那就是通过对str = str1 + op + str2这个函数的递归生成式子,并在每次递归时通过概率判断是否在str1或str2或str1 + op + str2的两端通过拼接生成括号,这种方法生成括号不用考虑任何问题,生成带括号的式子也不会有任何的数学语法错误(因不是实验要求,没有在代码中展现)。
2、第二个难点就是编写逆波兰法。其中有两个较难的地方。(1)是如何控制例如100这样的多位数不被看成1,0,0三个元素。我通过双计数的方式来解决,也就是i跟pre两个变量计数,当循环遍历到数字时,pre指向100中的1,i通过i++的方式循环到100中末位的0,使用String类里的方法substring(pre, i)将1,0,0看作100输出。第二个难点就在于栈里的数据已经按后序排好(假设是32),可由于栈是先进后出,读出来的结果会是23,所以我想到了用字符串向前拼接的方式ch2 = output.pop() + ch2;就能输出32*。
3、第三个问题是在多次运行程序时有时候值会出现 infinity,后经过调试发现是没有考虑到除0的特殊情况,于是我通过编写chu0类,并在chu0中编写静态方法能够判断是否有除0的情况并通过返回flag的值控制程序。
4、最后一个就是时间的安排问题。我提前三天开始写实验,本以为足够完成实验,可没有想到出现读题错误的特殊情况,让前两天的工作覆水东流,最后只剩一天的时间编写实验程序导致不能按时完成。所以以后对于较大任务量的作业,一定要尽早安排时间完成,防止突发情况的发生。
java实验一总结的更多相关文章
- Java实验五
20145113 Java实验五 网络编程及安全 实验内容 对于客户端与服务器端:修改原代码,使其可以实现连续的传消息,并且传送文件. 对于加解密部分: 对于原先的加密只加密"hello w ...
- Java实验四
20145113 Java实验四 快捷键 之前没怎么记ISDEA的快捷键,但是熟练使用快捷键可以带来很多的便利,于是先开始学习一些常用的快捷键,就采用它默认的快捷键,这样后期就不会出现冲突,一些and ...
- Java实验一
20145113 Java实验一 使用JDK编译.运行简单的Java程序 安装JDK并配置相关环境 安装JDK后配置环境变量 计算机→属性→高级系统设置→高级→环境变量 新建 JAVA_HOME 变量 ...
- Java实验二20135104
课程:Java程序设计 班级: 1351 姓名:刘帅 学号:20135104 成绩: 指导教师:娄嘉鹏 实验日期:2 ...
- Java实验报告五:Java网络编程及安全
Java实验报告五:Java网络编程及安全 ...
- Java实验报告二:Java面向对象程序设计
Java实验报告二:Java面向对象程序设计 ...
- java实验一实验报告
Java实验报告一:Java开发环境的熟悉 ...
- java实验报告三 敏捷开发与XP
20145306 java 实验三 实验报告 实验内容 1.git下载结对同学的代码 2.修改结对同学的代码 3.实现代码重构 实验步骤 新建存储空间 git下载代码 将修改后的代码上传 上传结果 重 ...
- 20145102 Java 实验一
20145102 Java 实验一 Java环境的安装 就像第一周写的一样,在linux下java的安装和配置简直简单的不行不行的,一个命令足以: sudo pacman -S jdk 配置什么的也就 ...
- 第四次java实验
java实验 实验一: 要求 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第 ...
随机推荐
- Mac 桌面软件开发基础问答
1> Mac OS X平台下的桌面软件是由什么编程语言处理 答: 由Objective-C, swift编程语言处理 2> Mac OS X平台下的桌面软件是由什么框架构建 答: 由Coc ...
- spring boot 2.0 neo4j 使用
参考文档 官方文档 http://spring.io/projects/spring-data-neo4j#learn https://docs.spring.io/spring-data/neo4j ...
- Codeforces 700E. Cool Slogans 字符串,SAM,线段树合并,动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/CF700E.html 题解 首先建个SAM. 一个结论:对于parent树上任意一个点x,以及它所代表的子树内任 ...
- Tomcat目录结构详解
1.bin: 该目录下存放的是二进制可执行文件,如果是安装版,那么这个目录下会有两个exe文件:tomcat6.exe.tomcat6w.exe,前者是在控制台下启动Tomcat,后者是弹出UGI窗口 ...
- SparkCore| 算子
RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象.代码中是一个抽象类,它代表一个弹性的.不可变.可分区.里面的元素可并行 ...
- 格式时间转UTC时间
public void dateChange() throws ParseException { String str="2010-5-27 12:10:12"; SimpleDa ...
- 【Redis】-- 安装及配置
我们redis的安装较为复杂,属于Linux上的源码编译安装,即不能直接通过yum安装. 1.安装Redis 具体步骤: 1.进入redis官网,复制下载链接,通过wget下载源码 官网:https: ...
- Visual GC提示"不受此JVM支持“解决方案(配置jstatd)
Visual GC提示"不受此JVM支持“,如果想使用这个插件,就需要配置jstatd连接方式,下面来看jstatd的配置: 1.配置安全策略文件路径$JAVA_HOME/jre/lib/s ...
- 【整理】Java 8新特性总结
闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...
- request请求携带证书,如:微信企业零钱付款
const Promise = require('bluebird') const request = Promise.promisifyAll(require('request')) const w ...