资源描述
虞山学院
《Java程序设计》实验指导及报告书
/ 学年 第 学期
姓 名:______________
学 号:______________
班 级:______________
指导教师:______________
计算机科学与工程学院
2009
实验
实验一 创建简单的JAVA应用程序 2
实验二 选择和循环 2
实验三 数组和字符串处理 2
实验四 类和对象编程(一) 2
实验五 类和对象编程(二) 2
实验六 继承与多态编程 2
实验七 接口和集合 2
实验八 文件和输入输出 2
实验一 创建简单的JAVA应用程序
一、实验目的
1.了解JAVA 基本程序结构;
2.熟悉命令行方式下JAVA应用程序编写、编译、调试和执行过程;
3.了解Eclipse集成开发环境的功能和特点。
二、实验内容
1. 安装并配置JDK开发工具包
2. 调试并运行下列Hello,world程序,并写出运行结果:
(各文件统一按照注释行上的文件名进行命名)
版本一、
//HelloJava1.java
public class HelloJava1
{
public static void main(String[] args)
{
System.out.println (“Hello!\nWorld.”);
}
}
存盘后(假设存在d:\)
(1) 编译
d:\> javac HelloJava1.java
(2) 由虚拟机解释执行
d:\> java HelloJava1
运行结果(注意,按照屏幕输出格式写):
(3) 程序不以HelloJava1.java命名,编译能通过吗?为什么?
版本二、
//HelloJava2.java
import javax.swing.*; //导入JFrame和JLabel类所在的包
public class HelloJava2
{
public static void main(String[] args)
{
//新建一个JFrame对象以便在屏幕上显示一个窗口。
JFrame frame = new JFrame (“Hello Java!”);
frame.setSize(300,300); //设置窗口的高度和宽度。
frame.setVisible (true); //设置窗口可见。
}
}
运行结果(注:按Ctrl+C退出程序):
版本三、
在版本二的基础上增加两条语句,编译、运行查看效果。
//HelloJava3.java
import javax.swing.*; //导入JFrame和JLabel类所在的包
public class HelloJava3
{
public static void main(String[] args)
{
JFrame frame = new JFrame (“Hello Java!”);
// 增加一个标签,来保存一个文本,从而可在窗口中央显示文本。
JLabel labe1 = new JLabel (“Hello Java!”, JLabel.CENTER );
//把标签label加入到窗口frame中。
frame.getcontentPane().add (label);
frame.setSize(300,300);
frame.setVisible (true);
}
}
运行结果(注:按Ctrl+C退出程序):
将程序中JLabel.CENTER改为JLabel.LEFT或JLabel.RIGHT运行效果有何变化?
版本四、
编写并运行基于浏览器的Applet小应用程序
Step1:
编写如下代码,并以HelloApplet.java存盘。
import java.applet.*;
import java.awt.*;
public class HelloApplet extends Applet
{
public void paint(Graphics g)
{
g.drawString(“Hello World.” , 50 , 50);
}
}
Step2:
编译生成HelloApplet.class字节码文件。
Step3:
编写如下代码,并以HelloExam.html(网页)存盘。
<HTML>
<HEAD>
<TITLE>MyFirstJavaApplet</TITLE>
</HEAD>
<BODY>
<HR>
<APPLET CODE=HelloApplet.class WIDTH=400 HEIGHT=200>
</APPLET>
</BODY>
</HTML>
Step4:
用IE打开该网页,查看运行效果。
Step5:
D:\>appletviewer HelloExam.html来启动Applet小应用查看运行效果。
(注HelloApplet.class文件和HelloExam.html在同一目录下。)
3. 调试并运行下面程序,并写出运行结果:
//StarTriangle.java
public class StarTriangle
{ public static void main(String[] args)
{
int i, j;
for (i = 0; i <= 3; i++)
{
for (j = 0; j <= 2 - i; j++)
System.out.print(" "); //一个空格
for (int k = 0; k <= 2 * i; k++)
System.out.print("*");
System.out.println(); //输出换行
}
}
}
运行结果(注意,按照屏幕输出格式写):
4. 下面是一个模拟计算器的程序(两个操作数都为正整数)。计算器应该能够执行以下算术操作:加法、减法、乘法、除法中的一种。调试并运行下面程序,根据输入写出运行结果。
注意:程序输入时要区分大小写。
//TestCalc.java
import java.util.*; //Scanner类在此包中,故需导入
class CalcNumber
{
private int number1,number2;
private int option;
private int result;
public void compute()
{
Scanner scanner = new Scanner(System .in);
System.out.println(“Enter the First Number:”);
number1 = scanner.nextInt();
System.out.println(“Enter the Second Number:”);
number2 = scanner.nextInt();
System.out.println(“Main Menu”);
System.out.println(“1.Addition”);
System.out.println(“2.Subtraction”);
System.out.println(“3.Multiplication”);
System.out.println(“4.Division”);
System.out.println(“Enter the Operation you want to perform:”);
option = scanner.nextInt();
switch (option)
{
case 1: result=number1 + number2;
break;
case 2: result=number1 - number2;
break;
case 3: result=number1 * number2;
break;
case 4: result=number1 / number2;
break;
default: System.out.println(“Invalid Option”);
return;
}
System.out.println(“The result is :” + result);
}
}
public class TestCalc
{
public static void main(String[] args)
{
CalcNumber myCalc = new CalcNumber();
myCpute();
}
}
从键盘输入8和2两个整数时,
(1) 选择3时的运行结果:
(2) 选择5时的运行结果:
从键盘输入8和two时(第二个数为非整数),程序运行结果:
5.在保持功能不变的情况下,改写上例代码如下(注意修改的代码):
import java.util.*;
class CalcNumber
{ private int number1,number2;
private int option;
private Scanner scanner = new Scanner(System .in);
public void getNumber()
{
System.out.println(“Enter the First Number:”);
number1 = scanner.nextInt();
System.out.println(“Enter the Second Number:”);
number2 = scanner.nextInt();
}
public void getOption()
{
System.out.println(“Main Menu”);
System.out.println(“1.Addition”);
System.out.println(“2.Subtraction”);
System.out.println(“3.Multiplication”);
System.out.println(“4.Division”);
System.out.println(“Enter the Operation you want to perform:”);
option = scanner.nextInt();
}
public int compute()
{
int result;
switch(option)
{
case 1: result=number1 + number2;
break;
case 2: result=number1 - number2;
break;
case 3: result=number1 * number2;
break;
case 4: result=number1 / number2;
break;
default: throw new IllegalArgumentException(“Invalid Option”);
}
return result;
}
}
public class TestCalc
{
public static void main(String[] args)
{
try
{
CalcNumber myCalc = new CalcNumber();
myCalc.getNumber();
myCalc.getOption();
int result = myCpute();
System.out.println(“The result is :” + result);
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
}
比较与上例运行结果,是否完全相同:
从键盘输入8和2两个整数时,
选择3时的运行结果:
选择5时的运行结果:
从键盘输入8和two时(第二个数为非整数),程序运行结果:
在main()函数中如不加try和catch部分代码,运行结果又会怎样?
体会程序5的结构与程序4相比哪一个好,谈谈你的理解?
三、教师评分
实验预习
20%
实验过程
20%
实验结果
30%
实验报告
30%
总成绩
实验二 选择和循环
一、实验目的
1. 掌握Java基本数据类型和表达式的特点和用法。
2. 熟练掌握单分支、双分支、多分支选择语句的格式与功能,能正确选取选择语句来设计选择结构的程序。
3. 熟练掌握while、do-while、for、break语句、continue语句的格式和功能;并能根据循环结构的要求正确选取循环语句来实现循环和多重循环。
二、预习内容
1.Java基本数据类型有哪几种?
2.从存储角度看Java将变量的类型分为基本数据类型和引用类型,它们两者有何区别(举例说明)?
3.学习查阅JDK文档,找到Random类和Math类,说明它们分别在什么包当中,并了解它们的用法。
三、实验内容
1.调试并运行下面程序,写出运行结果:
//ThrowRoll.java
import java.util.*;
public class ThrowRoll
{ public static void main(String[] args)
{ int roll ;
Random rd = new Random(); //创建一个生成随机数的对象rd
System.out.println("开始掷筛子");
for(int count=0; count<5; count++)
{ //rd .nextInt(n)生成[0,n-1]之间的随机整数
roll = 1+rd.nextInt(6); //生成1-6的随机整数
System.out.print ("第"+count+"次:"+roll+" ");
switch (roll)
{ case 1:
case 3:
case 5: System.out.print ("筛子是奇数\t");break;
case 2:
case 4:
case 6: System.out.print ("筛子是偶数\t");break;
}
System.out.println(“它的平方根是:”+ Math.sqrt(roll));
}
}
}
程序运行结果:
2.某服装店经营套服,也单件出售,若买的不少于50套,每套80元,不足50套,每套90元,若只买上衣每件60元,只买裤子每条45元,从键盘读入所买上衣coat和裤子trousers件数,计算应付款money?
提示: (1)先计算成套的衣服多少钱?
(2)再计算剩下的单件的上衣、单件的裤子多少钱;
(3)计算总付款
将程序补充完整:
//CalcPay.java
import java.util.*;
public class CalcPay
{ public static void main(String[] args)
{ int coat,trousers,money;
Scanner scanner = new Scanner(System.in);
System.out.println(“Enter coat number:”);
coat = scanner.nextInt();
System.out.println(“Enter trousers number:”);
trousers = scanner.nextInt();
money = getPay (coat, trousers);
System.out.println( “total money = ”+money);
}
public static int getPay(int c, int t)
{
}
}
要求用以下三套测试数据测试程序:
a) coat: 55, trousers: 70
b) coat: 55, trousers: 40
c) coat: -5, trousers: 3 , 此时应显示错误信息
运行结果分别是:
3. 编程输入年份月份,打印该月的天数
变量命名要求: 年份:year;月份:month;计算结果:天数days
程序代码:
输入
年份:2008;月份:10,运行结果:
年份:2008;月份:2,运行结果:
年份:2009;月份:9,运行结果:
年份:2009;月份:2,运行结果:
年份:2009;月份:99,运行结果:
4.计算机来当一年级的算术老师,要求给出十道两位数的四则运算的算术题,每道题10分,学生输入该题的答案,计算机根据学生的答案判断正确与否,当结束时给出成绩。 (提示:用Random类产生两个两位数的随机数)
程序代码:
四、实验小结
谈谈本次实验的心得、体会?
五、选做实验
编写一个程序打印九九乘法表
1×1=1
2×1=2 2×2=4
3×1=3 3×2=6 3×3=9
4×1=4 4×2=8 4×3=12 4×4=16
…
六、教师评分
实验预习
20%
实验过程
20%
实验结果
30%
实验报告
30%
总成绩
50
实验三 数组和字符串处理
一、实验目的
1. 要求掌握一维数组、多维数组(主要指二维)的创建、初始化、数组元素的引用等方法。
2. 掌握冒泡排序算法。
3. 掌握二分查找算法。
4. 掌握字符串处理的相关方法。
二、预习内容
1.如何创建一个能存放十个整数的一维数组intArr?
2.如何创建一个如下图的不等长的存放整数的二维数组jagArr?
2
1
5
4
3
0
9
8
7
6
3.查阅JDK文档,至少写出String类的五个方法,并说明这些方法的作用?
三、实验内容
1. 实现对从键盘输入一批非零整数,以-1作为输入结束标记,对这批整数进行排序。要求:
1)用选择或冒泡升序排
2)从控制台获取数据、排序、输出数组功能分别做成三个方法。
3)安排方法的调用,注意方法调用时参数的传递。
程序代码:
2. 数组A中的N(0<N<100)个整数从小到大进行连续编号,要求不能改变数组A中元素的顺序。如A=(78,42,-34,94,25)则输出为(4,3,1,5,2)。数组长度N和数组中元素要求从键盘输入。
程序代码:
3.已知一个已经从小到大排序的数组,这个数组中的一个平台就是指连续的一串值相同的元素,并且这一串元素不能再延伸,例如,在1,2,2,3,3,3,3,4,4,5,5,5,6中1,2,2,3,3,3,3,4,4,5,5,5,6划线部分都是一个平台,试编写程序,接收任意一个已排好序数组,把这个数组中最长的平台找出来。在上面的例子中3,3,3,3就是该数组中最长的平台,平台长为4。
4.调试下列代码,写出运行结果。
public class Example
{ public static void change(String str,char[ ] ch)
{
str = “test ok”;
ch[0] = ‘g’;
}
public static void main(String[] args)
{
String str = “good”;
char[ ] ch = {‘a’,’b’,’c’};
change(str,ch);
System.out.print(str + “ and “);
System.out.println(ch);
}
}
运行结果是test ok and gbc吗?为什么?请分析原因:
5. 调试下列代码,写出运行结果,分析程序的功能。
class DeleteStr
{ public static String Del(String origin ,String smod)
{ if( origin !=null && smod !=null)
{
int index = origin.indexOf(smod);
while( index!= -1)
{
String ret = origin.substring(0,index);
ret = ret+origin.substring(index+smod.length());
origin = ret;
index = origin.indexOf(smod);
}
return origin;
}
else
return null;
}
}
public class Program
{
public static void main(String[] args)
{ String str = "hellxyzo,wxyzoxyzrldxyz.";
String smod = "xyz";
String newString;
newString = DeleteStr.Del(str, smod);
System.out.println(newString);
}
}
运行结果:
程序完成什么样功能?
六、教师评分
实验预习
20%
实验过程
20%
实验结果
30%
实验报告
30%
总成绩
实验四 类和对象编程(一)
一、实验目的
1. 掌握Java中类的定义、对象的创建方法;
2. 理解封装性及其意义;
3. 掌握构造函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。
4. 能够根据给定的要求定义类并实现类的成员函数;
5. 理解类的成员的访问控制的含义,公有、私有和保护成员的区别
二、实验内容
1. 定义一个学生类,其中有学号、姓名、年龄3个数据成员,以及若干成员函数。同时编写主函数使用这个类,实现对学生数据的赋值和输出。要求:使用构造函数实现对数据的输入,使用成员函数实现对数据的输出。 调试下列的参考代码。
//Student.java
public class Student
{ private String id;
private String name;
private int age;
public Student(String id,String name,int age)
{
this.id = id;
this.name = name;
this.age = age;
}
public void display()
{
System.out.println(“id=”+id+“\tname=”+name+“\tage=”+age);
}
public static void main()
{
Student s1 = new Student(“001”, “zhangshan”,16);
s1.display();
}
}
程序的Student类使用了构造方法,请回答
(1)构造方法何时被调用?
(2)关键字this有何作用?
(3)在实例化了s1对象后,如要将s1对象的id改为“002”,程序将如何修改。
2. 实现交通工具Vehicle类
版本一:
(1)没有数据隐藏的类
创建一个Vehicle 类实现上面的UML类图。
A) 含有两个public属性:
load —“车辆当前的载货量”
maxLoad —“车辆的最大载货量”。
B) 含有一个公有的构造函数用于初始化最大载货量属性maxLoad。
C) 含有两个公有的函数:
public double getLoad(); // 用于得到当前的载货量
public double getMaxLoad()// 用于取得最大载货量
(注意:所有的数据都是假定以千克(kilograms)作为单位的。
在这个版本的Vehicle类中,你将把所有成员的属性设置为public,这样在下面测试程序TestVehicle1中可以直接访问这些成员。
(2)编写下面的程序对Vehicle类进行测试,代码如下:
public class TestVehicle1
{
public static void main(String[] args)
{
Vehicle vehicle = new Vehicle(10000.0);
System.out.println("Add box #1 (500kg)");
vehicle.load = vehicle.load + 500.0;
System.out.println("Add box #2 (250kg)");
vehicle.load = vehicle.load + 250.0;
System.out.println("Add box #3 (5000kg)");
vehicle.load = vehicle.load + 5000.0;
System.out.println("Add box #4 (4000kg)");
vehicle.load = vehicle.load + 4000.0;
System.out.println("Add box #5 (300kg)");
vehicle.load = vehicle.load + 300.0;
System.out.println("Vehicle load is "+vehicle.getLoad()+" kg\n");
}
}
应该得到以下的结果:
Add box #1 (500kg)
Add box #2 (250kg)
Add box #3 (5000kg)
Add box #4 (4000kg)
Add box #5 (300kg)
Vehicle load is 10050.0 kg
从程序的运行结果来看,你发现了什么问题?思考如何才能避免?
版本二:
(1)基本数据隐藏
为了解决第一个版本中的问题,你应该隐藏类中的数据成员(load 和 maxLoad) 并且提供一个方法addBox, 来检查车辆是否会发生超载。
创建一个Vehicle 类实现上面的UML类图。
A) 把load和maxLoad属性修改为private(私有的)。
B) 添加addBox方法。
public boolean addBox(double weight); //参数为所加箱子重量
这个方法必须检查加上一个箱子后是否会超过车辆的最大载货量。如果超过了,应该拒绝装载这个箱子并返回false;否则把箱子加到车上并返回true。 注意:所有的数据都是假定以千克(kilograms)作为单位的。
(2)编写下面的程序对新版本的Vehicle类进行测试,代码如下:
public class TestVehicle2
{
public static void main(String[] args)
{
Vehicle vehicle=new Vehicle(10000.0);
System.out.println("Add box #1 (500kg):"+ vehicle.addBox(500.0));
System.out.println("Add box #2 (250kg):"+ vehicle.addBox(250.0));
System.out.println("Add box #3 (5000kg):"+ vehicle.addBox(5000.0));
System.out.println("Add box #4 (4000kg):"+ vehicle.addBox(4000.0));
System.out.println("Add box #5 (300kg):"+ vehicle.addBox(300.0));
System.out.println("Vehicle load is "+vehicle.getLoad()+" kg");
}
}
阅读并运行下面的测试程序段。注意代码中不能直接修改load属性的值,现在我们可以使用addBox()方法。这个方法将返回true或false并打印到屏幕上。
应该得到以下的结果:
Add box #1 (500kg) : true
Add box #2 (250kg) : true
Add box #3 (5000kg) : true
Add box #4 (4000kg) : true
Add box #5 (300kg) : false
Vehicle load is 9750.0 kg
版本三:
(1)改变重量的内部表示单位为牛顿
现在假设你将要作一些关于车辆发动机和轮胎等磨损的计算,这些计算使用用牛顿表示的重量。
创建一个Vehicle 类实现上面的UML类图。
修改构造方法,getLoad(), getMaxLoad(), 和addBox() 方法,使它们使用一个从千克到牛顿的相互转换。你可以定义下面的私有方法:
private double kiloToNewts(double weight) { ...... }
private double newtsToKilo(double weight) { ...... }
注意vehicle 对象的内部数据是以牛顿为单位的,而外部数据(在方法中传递的参数)还是以千克为单位 。
(2)编写下面的程序对新版本的Vehicle3类进行测试,注意它和版本2中的测试代码是相同的,代码如下:
public class TestVehicle3
{
public static void main(String[] args)
{
Vehicle3 vehicle=new Vehicle3(10000.0);
System.out.println("Add box #1 (500kg):"+ vehicle.addBox(500.0));
System.out.println("Add box #2 (250kg):"+ vehicle.addBox(250.0));
System.out.println("Add box #3 (5000kg):"+ vehicle.addBox(5000.0));
System.out.println("Add box #4 (4000kg):"+ vehicle.addBox(4000.0));
System.out.println("Add box #5 (300kg):"+ vehicle.addBox(300.0));
System.out.println("Vehicle load is "+vehicle.getLoad()+" kg");
}
}
应该得到以下的结果:
Creating a vehicle with a 10,000kg maximum load.
Add box #1 (500kg) : true
Add box #2 (250kg) : true
Add box #3 (5000kg) : true
Add box #4 (4000kg) : true
Add box #5 (300kg) : false
Vehicle load is 9750.0 kg
对Vehicle类的第二个和第三个版本采用相同的测试代码,输出的结果有没有发生变化?从代码可维护性的角度谈谈封装的好处。
3. 如果已知一个日期为2007/3/8,求10天后是哪
展开阅读全文