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)>第 ...
随机推荐
- Coverity代码扫描工具
1.说明:Coverity代码扫描工具可以扫描java,C/C++等语言,可以和jenkins联动,不过就是要收钱,jenkins上的插件可以用,免费的,适用于小的java项目 2.这是Coverit ...
- c++ typeid
简单使用 #include<iostream> #include<string> #include<new> #include<typeinfo> us ...
- .net core2.x - 关于工作单元(UnitOfWork) 模式
概要:在搭建框架,顺手说下写下,关于unitofwork,可能你理解了,可能你还不理解,可能与不可能不是重点,重点是感兴趣就看看吧. 1.工作单元(unitofowork)是什么(后面简写uow)? ...
- Codeforces 628F 最大流转最小割
感觉和昨天写了的题一模一样... 这种题也能用hall定理取check, 感觉更最小割差不多. #include<bits/stdc++.h> #define LL long long # ...
- c#一步一步实现ORM(二)
c#一步一步实现ORM(二) 上一篇描述了简单的思路,这一片我们来稍微细化一下 1插入的时候忽略某些字段 public int Insert<T>(T o, params string[] ...
- python 字符串常用操作
字符串常用方法 capitalize() String.capitalize() 将字符串首字母变为大写 name = 'xiaoming' new_name = name.capitalize() ...
- 数字图像特征提取之HOG特征
1.灰度化:(以便可以使用sobel等算子计算梯度)2.gamma校正: (降低光照影响)3.求每个像素的梯度和方向: (利用任意一种梯度算子,例如:sobel,laplacian等,对该patch进 ...
- Linux系统(和mac系统)chmod修改权限总结
在 Mac 系统的终端上修改文件权限使用的是 Linux 中的 chmod 命令. chmod 用户+操作+权限+文件 用户部分:使用字母 u 表示文件拥有者(user),g 表示拥有者所在群组(gr ...
- <iframe>和<frame>区别
1.frame不能脱离frameSet单独使用,iframe可以 2.frame不能放在body中,否则不能正常显示 frame不能和body同时使用 <!--<body>--> ...
- 艺术模板 art-template-web
艺术模板 art-template____jQuery 项目可用 最快的模板渲染引擎 兼容 ejs 语法 推荐语法 {{each arr}} {{$value}} ---- {{$index}} {{ ...