java实验总结_java实验一总结

实验一第一部分

在Linux中运行结果

0fb6ec9e075c799fe97505a4df18f747.png

通过cd和mkdir命令建立tree,带包编译并用

javac -d bin

的命令将编译文件保存在bin目录中

通过

java -cp

的命令运行带包的程序

实验第二部分

用idea调试程序

左键点击行号旁边的空白设置断点。

1cce5a2eba5a33a08924377c9a755689.png

用F7快捷键逐步运行代码

cc185e553458c093b1376953e0494604.png

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

9d30cbb9778fb6ba0c84d0a9cc291a80.png

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

15068f21ab59b68f7848cd70c77f7b07.png

实验第三部分

实验题目:实现简单的四则运算

实验代码:

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 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 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 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;

}

}

实验运行结果

5508ce8a2bbec232bc5f7b3526ce8354.png

0aeebe4964792d46b8bc1f5849b2a889.png

实验中遇到的问题

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、最后一个就是时间的安排问题。我提前三天开始写实验,本以为足够完成实验,可没有想到出现读题错误的特殊情况,让前两天的工作覆水东流,最后只剩一天的时间编写实验程序导致不能按时完成。所以以后对于较大任务量的作业,一定要尽早安排时间完成,防止突发情况的发生。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验1 Java语言基础 4 一、实验目的 4 二、实验要求 4 三、实验内容 4 (一) 声明不同数据类型的变量 4 (二) 了解变量的使用范围 5 (三) 使用关系运算符和逻辑运算符 5 (四) 使用表达式语句与复合语句 6 (五) 使用选择语句 6 (六) 使用循环语句 8 实验2 面向对象编程 11 一、实验目的 11 二、实验要求 11 三、实验内容 11 (一)创建 Applet 应用小程序 11 (二)创建对象并使用对象 12 (三)编写显示当前日期和时间的程序 13 (四)使用修饰符 14 (五)方法中参数传递 15 (六)类的继承性 16 (七)类的多态性 18 实验3 包、接口与异常处理 22 一、实验目的 22 二、实验要求 22 三、实验内容 22 (一)了解并使用 Java 的系统包 22 (二)创建并使用自定义包 22 (三)使用接口技术 24 (四)了解异常处理机制 25 实验4 常用系统类的使用 27 一、实验目的 27 二、实验要求 27 三、实验内容 27 (一)了解 Applet 的生命周期 27 (二)使用数学函数类 28 (三)使用日期类 29 实验5 建立图形用户界面 32 一、实验目的 32 二、实验要求 32 三、实验内容 32 (一)创建图形用户界面 32 (二)了解事件处理机制 34 (三)建立独立运行的窗口界面并使用匿名类 36 (四)使用 Swing 组件 39 (五)使用自定义对话框与内部类 41 实验6 图形处理 44 一、实验目的 44 二、实验要求 44 三、实验内容 44 (一)使用图形类 Graphics 44 实验7图形处理(二) 47 一、实验目的 47 二、实验要求 47 三、实验内容 47 (一)幻灯机效果——连续显示多幅图像 47 (二)使用滚动条改变背景颜色 48 (三)Applet 与 Application 合并运行 49 (四)创建电闪雷鸣的动画 50 实验8 流与文件 53 一、实验目的 53 二、实验要求 53 三、实验内容 53 (一)使用标准数据流的应用程序 53 (二)使用文件输入输出流的应用程序 54 (三)使用随机文件类的应用程序 54 (四)使用数据输入输出流与文件输入输出流类的应用程序 55 (五)使用对象输入输出流的应用程序 56 实验9 线程 58 一、实验目的 58 二、实验要求 58 三、实验内容 58 (一)Thread子类的方法实现多线程 58 (二)实现Runnable接口的方法实现多线程 59 实验10 数据库的连接:JDBC 61 一、实验目的 61 二、实验要求 61 三、实验内容 61 (一)配置ODBC数据源 61 (二)编写程序,按照下表的结构建立"student"表 61 (三)编写程序,完成填写功能 62 (四)编写程序,完成查询功能 62

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值