资源描述
《Java语言程序设计试验指导书》试验指导书
高川翔
2月
一、试验地位、作用
Java语言程序设计试验作为课程实践性步骤之一,是教学过程中必不可少关键内容。经过计算机试验和案例分析,使学生加深了解、验证巩固课堂教学内容;增强高级语言程序设计感性认识;掌握程序设计基础方法;培养学生理论和实践相结合能力。
二、试验开设对象
本试验开设对象为《Java语言程序设计》课程学习者(信息和计算科学专业本科生),试验为必修内容。
三、基础原理及课程介绍
Java语言程序设计是必修基础课程。本课程以BlueJ为工具,关键介绍面向对象程序设计方法,Java面向对象程序设计语言和面向对象程序设计工具。使学生掌握面向对象思想方法,是后续专业课程基础。
四、指导老师
标准上由Java语言程序设计讲授老师负责,由年轻老师担任关键试验指导老师,试验室人员配合指导。指导老师应在每次试验前讲清试验目标、基础原理、试验要求等,指导学生在要求时间内完成相关课程试验。
五、试验设备配置
每人配置1台电脑,安装有JDK,和Blue J、Eclipse或JBuilder。
六、考评和汇报
1.试验后,学生将试验结果等内容写出试验汇报,符合试验教学要求,并得到指导老师认可。
2.指导老师对每份试验汇报进行审阅、评分。
3.该试验程依附于理论课,试验课成绩记入课程平时成绩,占总成绩25%
试验一 Java运行环境安装、配置和运行
一、试验课时
3课时。
二、试验目标
1. 掌握下载并安装 JDK 软件包方法。
2. 掌握在BlueJ环境下编写、编译和运行 Java 程序方法。
3. 了解 Java 语言概貌。
4. 了解设置环境变量,命令行编译java程序方法。
三、试验内容和要求
内容:
1.安装 JDK 软件包和BlueJ开发环境并进行配置。
(1) 配置JDK运行环境:
a) 配置windowspath环境变量。将安装J2SDK(注意:必需安装J2SDK)bin文件夹完整路径添加到path系统变量中,图3-4所表示。
图1-1 path系统变量配置
b) 配置CLASSPATH系统变量。假如系统变量中不存在classpath,则“新建”之。将J2SDKlib文件夹完整路径写入。图3-5。
图1-2 CLASSPATH系统变量配置
(2) 进入DOS虚拟环境;
(3) 将试验1程序保留在d:\example文件夹下;
(4) 使用javac命令编译程序;(图3-6)
(5) 使用java运行程序。注意包中程序编译和运行方法。
图1-3 利用JDK环境编译运行Java应用程序
(以下试验前请仔细阅读BlueJ教程电子文档)
2.在BlueJ环境下新建一个工程,在工程中编写一个简单 Java 程序,在屏幕上输出”hello,java!”。
public class Hello
{
public static void main(String args[])
{
System.out.println("hello,java!");
}
}
3.编译运行 Java 程序。
4.设置环境变量,在命令行下编译运行Java程序。
5.浏览运行JDK 自带 Applet 应用小程序。
6.在程序中设置断点、单步实施、查看变量值。
要求:
1、独立完成;并以实际上机操作计成绩;
2、全部上机试验必需在下一次试验之前完成,不然此次试验成绩算0分;
3、编写试验汇报(根据汇报模板编写,必需写出具体试验步骤及必需屏幕截图)。试验二 创建一个Applet
一、试验课时
3课时。
二、试验目标
了解Applet和Application区分,学会设计Applet程序。
三、试验内容和要求
已知JButton类有一个结构函数原形为:
public JButton(String text,Icon icon)。
其中参数text为显示在按钮上文本、参数icon为显示在按钮上图标。下面例子就是利用此结构函数产生一个带有文本、图标按钮,而且当按一下按钮,图标就切换一次。此图标切换是在两个图标中循环进行。程序以下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ButtonExample extends JApplet{
int imageNum=1;
public void init( ){
Container con = getContentPane( );
final JButton jb_ok=new JButton(″按我″,new ImageIcon(″sun1.gif″));
con.setLayout(new FlowLayout());
con.add(jb_ok);
jb_ok.addActionListener(new ActionListener( ){
public void actionPerformed(ActionEvent e){
if(imageNum = =1){
jb_ok.setIcon(new ImageIcon(″sun2.gif″));
imageNum=2;
}
else{
jb_ok.setIcon(new ImageIcon(″sun1.gif″));
imageNum=1;
}
}
});
}
}
此程序中还用到了JButton类setIcon( )方法,用以设置按钮新图标。
Html文件代码: (文件名为Appcounter.htm)
<applet code=ButtonExample.class width=300 height=200>
</applet>
将该文件和ButtonExample.class保留在同一个目录中,使用appletviewer appconmter.htm命令就能够运行这个applet。
要求:
1、独立完成;并以实际上机操作计成绩;
2、全部上机试验必需在下一次试验之前完成,不然此次试验成绩算0分;
3、编写试验汇报(根据汇报模板编写,必需写出具体试验步骤及必需屏幕截图)。试验三 数据类型及表示式
一、试验课时
3课时。
二、试验目标
1.掌握Java语言基础数据类型,了解数据类型包装类概念。
2.掌握变量和表示式使用方法。
3.了解类型转换概念。
三、试验内容和要求
1. 输入并运行下面程序,体会多种基础数据类型变量申明、初始化及使用。
public class BasicTypes{
public static void main(String args[]) {
byte b = 0x88;
short s = 0200;
int i = 111111;
long l = 0x;
char c ='A';
float f =.33f;
double d =.00001001;
boolean bl= true;
System.out.println(″byte b =″+b);
System.out.println(″short s =″+s);
System.out.println(″int i =″+i);
System.out.println(″long 1 =″+1);
System.out.println(″char c =″+c);
System.out.println(″float f =″+f);
System.out.println(″double d =″+d);
System.out.println(″boolean bl =″+bl);
}
}
思索:
(1)上述程序中定义了哪些变量?每个变量变量名、数据类型和作用域分别是什么?
(2)查看程序运行结果,分析为何有些变量最终输出结果和初始化时不一样?
2. 输入并运行下面程序并分析结果,体会多种表示式使用方法。
(1)public class ArithmaticOp{
public static void main(String args[ ]){
int a =5, b=3,c;
double d=2.5;
c=a/b+a%b;
System.out.println(″c=″+c);
d=c*b+a/b*d;
System.out.println(″d=″+d);
}
}
(2) public class ArithmaticOp2{
public static void main(String args[ ]) {
int a,b,c;
a=b=c=5;
a=++b-++c;
System.out.println(″a=″+a+″b=″+b+″c=″+c);
a=b+++c++;
System.out.println(″a=″+a+″b=″+b+″c=″+c);
a=b――+c――;
System.out.println(″a=″+a+″b=″+b+″c=″+c;
}
}
(3) public class LogicOp{
public static void main(String args[ ]){
boolean x, y;
x=5>3‖3*4<6&&!(5<3);
y=2= =6&&9>8+4||5+6<7+4&&!x;
Systeme.out.println(″x=″+x+″,y=″+y);
}
}
思索:
(1)上述程序中用到了哪些运算符?运算符优先级怎样?
(2)增一和减一运算符(++和--)放在变量和放在变量以后,其使用方法有何不一样?
(3)将你分析程序得到结果和实际运行结果相比较,假如有不一样,原因在哪里?
3. 输入并运行下面程序,分析结果,了解并掌握自动类型转换使用方法。
public class Promotion{
public static void main(String args[ ]){
byte b=10;
char c=′a′;
int i =90;
long l=5551;
float f =3.5f;
double d = 1.234;
float f1=f*b; //float*byte―>float
int i1 = c+i; //char+int―>int
long l1 = 1+i1; //long+int―>long
double d1 =f1/i1-d; //float/int―>float,float―double―>double
System.out.println(″f1=″+f1);
System.out.println(″il=″+il);
System.out.println(″l1=″+l1);
System.out.println(″d1=″+d1);
}
}
思索:
(1)上面程序用到了哪些自动类型转换?分别是怎样实现?
(2)何时需要用到强制类型转换?强制类型转换可能会造成什么不良后果?
提升:
1.在Java中,数据类型包装类(type wrapper class)用于封装基础数据类型相关信息和操作。即使我们常常直接使用Java基础数据类型,但因为它本身不含有任何操作,无法扩充本身功效,所以,为确保Java语言纯面向对象特征,Java语言基础包为数据类型提供了部分对象封装。
数据类型包装类是由多个类组成一个集合,每种数据类型均存在对应对象封装类。
下表列出了Java数据类型包装及其对应基础数据类型。
基础数据类型 数据类型包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
每一个类全部提供了部分属性和方法,用户能够依据需要来灵活使用。
注意:数据类型包装类和对应基础数据类型名字几乎相同,请不要混淆。前者显著特点是第一个字母应为大写。
2.输入并运行下面程序,了解并掌握数据类型包装类属性和使用方法。
public class MaxVariables{
public static void main(String args[ ]){
//integers
byte largestByte =Byte.MAX_VALUE;
//MAX_VALUE是Byte类属性(表示Byte类所能达成最大值)
short largestShort = Short.MAX_VALUE;
int largestInteger = Integer.MAX_VALUE;
long largestLong = Long.MAX_VALUE;
//real numbers
float largestFloat = Float.MAX_VALUE;
double largestDouble = Double.MAX_VALUE;
//other primitive types
char aChar=′S′;
boolean aBoolean =true;
//display them all
System.out.println(″The largest byte value is″+largestByte);
System.out.println(″The largest short value is″+largestShort);
System.out.println(″The largest integer value is″+largestInteger);
System.out.println(″The largest long value is″+largestLong);
System.out.println(″The largest float value is″+largestFloat);
System.out.println(″The largest double value is″+largestDouble);
//Character类有一个方法boolean isUpperCase(char ch)是用来判定一个字符是
//否是大写
if(Character.isUpperCase(aChar)){
System.out.println(″The character″+aChar+″is upper case. ″);
}else{
System.out.println(″The character″+aChar+″is lower case. ″);
}
System.out.println(″The value of aBoolean is″+aBoolean);
}
}
(1)修改上面程序,让它能输出每种整型数据类型能表示最小值。(提醒:Byte类型最小值属性是MIN_VALUE)
(2)Character类有另一个方法boolean isLowerCase(char ch),能够来判定一个字符是否为小写。修改合适语句,使程序完成相同功效。
(3)修改上面程序,使布尔型变量aBoolean含有一个不一样值。
要求:
1、独立完成;并以实际上机操作计成绩;
2、全部上机试验必需在下一次试验之前完成,不然此次试验成绩算0分;
3、编写试验汇报(根据汇报模板编写,必需写出具体试验步骤及必需屏幕截图)。
试验四 控制步骤
一、试验课时
3课时。
二、试验目标
1.充足掌握步骤控制语句格式和功效。
2.熟练利用步骤控制语句进行程序设计。
3.学会进行简单程序调试。
三、试验内容和要求
1.输入并运行下面两个程序:
(1)public class WhileDemo2{
public static void main (String[ ]args){
int i =100;
while(i<100{
System.out.println(″Print″+i);
i++;
}
}
}
(2) public class DoWhileDemo2{
public static void main (String[ ]args){
int i =100;
do{
System.out.println(″Print″+i);
i++
} while(i<100);
}
}
思索:
运行上面两个程序,比较While和DoWhile语句实施过程有何不一样。
2.输入并运行下面程序:
public class lxsum{
public static void main (String[ ]args){
int i =1,sum;
sum=0;
while(i<=100){
sum+=i;
i++
}
System.out.println(″sum=″+sum);
}
}
思索:
(1)循环通常适适用于什么情况?
(2)请用for循环和do-while循环为实现上面程序功效。
3.输入并运行下面程序,体会switch语句使用。
public class lxswitch{
public static void main (String [ ]args){
int x=1,y=2,i=0,j=0;
switch(x){
case 1: switch(y){
case 1: i+ +; break;
case 2:j++; break;
default: i+ +;
j++;
}
case2: i+ +;j++;break;
default: i++;j++;
}
System.out.println(″i=″+i);
Sysem.out.printin(″j=″+j);
}
}
思索:
(1)将你分析程序得到结果和实际运行结果相比较,看看有没有什么不一样。假如有不一样,原因在哪里?
(2)break语句在switch语句中起到了什么作用?
4. 输入并运行下面程序,判定某十二个月是否是闰年。闰年条件是符合下面二者之一:
(1)能被4整除,但不能被100整除;
(2)能被4整除,又能被400整除。
public class JudgeLeapYear{
public staic void main (String args[ ]){
//方法1
int year=1800;
if((year%4= =0 && year%100!=0)||(year%400= = 0))
System.out.println(year+″年是闰年″);
else
System.out.println(year+″年不是闰年″);
//方法2
year = 1997;
boolean leap;
if(year%4!=0)
leap=false;
else if (year%100!=0)
leap = true;
else if(year%400!=0)
leap = false;
else
leap = true;
if (leap = = true)
System.out.println(year+″年是闰年″);
else
System.out.println(year+″年不是闰年″)
//方法3
year=;
if (year%4= = 0){
if (year%100= =0){
if (year%400= =0)
leap=true;
else
leap=false;
}else
leap = false;
}else
leap = false;
if (leap = = true)
System.out.println(year+″年是闰年″);
else
System.out.prinln(year+″年不是闰年″);
}
}
思索:
(1)程序中是怎样判定一个数能被另一个数整除?
(2)请说出程序中用了哪三种方法来判定是否闰年,并体会其中联络和区分。
提升:
在输入程序过程中难免要犯错。通常说业,程序中错误有两种:语法错误和逻辑错误。程序调试就是要找出程序中错误,编出正确程序。
下面程序用来输出5次"Hello!",请更正程序中错误,并上机调试运行。
public class Hello {
public static void main(String[ ]args){
for(i=1;i<5;i++);
{
System.out.println(″time″+i+″:Hello! ″);
}
}
}
在MS-DOS下编译该程序,输入javac Hello. java,屏幕上会出现以下错误信息:
Hello.java:5:Undefined variable:i
for (i=1;i<5;i++);
?
Hello.java:5:Undefined variable:i
for(i=1;i<5;i++);
Hello.java:5:Undefined varable:i
for (i=1;i<5;i++)
?
Hello.java:7:Undefined variable:i
System.out.println(″time″+i+″:Hello″);
4errors
能够看到,Java中错误信息包含以下内容:
(1)源程序文件名;
(2)犯错那一行行号;
(3)犯错类型;
(4)犯错那一行内容。
依据系统给犯错误信息,能够进行对应修改。如上面多个错误,类型全部是"Undefined variable:i",也就是说,变量i还未定义。于是就能够分析出犯错原因是程序中没有申明变量i就直接使用了它,就是一个语法错误,在源程序中进行对应修改。修改过程序内容以下:
public class Hello{
public static void main (String[ ]args) {
int i; //新添变量说明
for (i=1;i<5;i + +){
System .out. println(″time″+i+″:Hello! ″)
}
}
}
对上面程序再进行编译,顺利经过(屏幕没有出现任何信息)后生成对应.class文件。运行该文件,结果为:
time 5:Hello!
只输出了一次"Hello!"和题目标要求(输出5次"Hello!")不符,这是一个逻辑错误。分析结果,发觉它只实施了i为5那一次输出。再次检验程序,发觉在for语句圆括号后面多了一个分号,造成了for语句循环体实际为空语句。从源程序中将";"去掉,重新存盘、编译、运行。结果以下:
time1:Hello!
time2:Hello!
time3:Hello!
time4:Hello!
发觉还少输出一次"Hello!",将循环变量结束条件为"i<6",重新存盘、编译,运行正确。
思索:
(1)变量i在程序中起到什么作用?
(2)假如将i初值改设为0,那么应怎样改写终止循环条件?
(3)假如将i初值改设为3,那么应怎样改写终止循环条件?
要求:
1、独立完成;并以实际上机操作计成绩;
2、全部上机试验必需在下一次试验之前完成,不然此次试验成绩算0分;
3、编写试验汇报(根据汇报模板编写,必需写出具体试验步骤及必需屏幕截图)。
试验五 数组
一、试验课时
3课时。
二、试验目标
1.掌握Java中数组申明、创建、初始化和使用。
2.了解Java中提供对数组排序常见方法。
3.了解在数组中查找一个特定值常见方法。
三、试验内容和要求
1.数组元素排序是一个常常会碰到问题,冒泡(起泡)排序法(bubble sort)是一个常见排序方法。它基础思想是:对一个含有n个元素数组,首先将第一个元素值和第二个元素值进行比较,若为逆序(即第一个元素值大于第二个元素值),则将两个元素交换之,然后比较第二个元素和第三个元素值,依次类推,直到第n-1个元素和第n个元素进行比较、交换为止。如此经过一趟排序,使得值最大元素被安置到最终一个元素位置上。然后,对前n-1个元素进行一样操作,则含有次大值元素被安置在第n-1个元素位置上。反复以上过程直到没有元素需要交换为止。此过程可图示以下:
初始数组元素: [49 38 65 97 76 13 27]
第1趟排序以后:[38 49 65 76 13 27] 97
第2趟排序以后:[38 49 65 13 27] 76 97
第3趟排序以后:[38 49 13 27] 65 76 97
第4趟排序以后:[38 13 27] 49 65 76 97
第5趟排序以后:[13 27] 38 49 65 76 97
第6趟排序以后:13 27 38 49 65 76 97
在此过程中,值小数组元素好比水中气泡逐趟向上飘浮,而值大数组元素好比石块沉入水底。下面代码是冒泡排序法程序实现,请输入并运行之:
public class BubbleSort{
public static void main (String args[ ]){
int i,j;
int intArray[ ] ={30,1,-9,70,25};
int 1=intArray .length;
for(i=1;i<1;i++)
for(j=0;j<1-i-1;j+ +)
if(intArray[j]>intArray[j+1]){
int t =intArray[i];
intArray[j]=intArray[j+1];
intArray[j+1]=t;
}
for(i=0;i<1;i++)
System.out.println(intArray[i]+″″);
}
}
思索:
(1)什么情况下使用数组比较合理?
(2)为何要用双重循环来实现此算法?循环变量i和j是怎样来确定范围?
(3)怎样来交换两个数组元素值?
2.试着修改上面程序,改为对一维数组中元素按值从大到小进行排序,并输出最终止果。
3.我们常常需要在数组中查找一个特定值。对于已排好序数组来说,二分查找法(折半查找法)是一个比较快捷方法。二分查找法基础思绪是:先将整个数组作为查找区间,用给定值和查找区间中间元素值相比较,若相等,则查找成功;若不等,则缩小范围,判定该值落在区间前一部分还是后一部分,再将其所在部分作为新查找区间。继续上述过程,一直到找到该值或区间大小小于0表明查找不成功时为止。请输入并运行下面程序,体会二分查找法算法实现方法。
public class arrayBinary{
public static int bsearch(int array[ ],int value){
boolean found = false;
int high =array.length-1;
int low =0;
int cnt =0;
int mid =(high+low)/2;
System.out.println(″Looking for″+value);
while (!found &&(high> =low)){
System.out.println(″Low″+low+″Mid″+mid+″High″+high);
if(value= =array[mid])
found=true;
else
if(value<array[mid])
high =mid-1;
else
low =mid+1;
mid= (high+low)/2;
cnt + +;
}
System.out.println(″Steps″+cnt);
retrun ((found)?mid:-1);
}
public static void main(String args[ ]){
int a[ ]=new int [100];
for (int i=0;i<a.length;i++)
a[ i]=i;
System.out.println(″Result″+bsearch(a,32));
System.out.println(″Result″+bsearch(a,1));
System.out.println(″Result″+bsearch(a,1031));
}
}
思索:
(1)程序中整型变量high、low、mid、cnt分别起什么作用?布尔型变量found又起到什么作用?
(2)该程序是怎样确定查找区间范围?
(3)该程序先定义了一个bsearch方法,然后在main()中数次调用该方法,请说出这么做有什么优点。
4.编程实现在无序数组中次序查找一个特定值,找到则返回该值在数组中位置(下标),找不到则返回-1。(想想,为何用负值用为返回标志?)
提醒:数组中元素是无序,所以搜索范围一定要是整个数组。
5.输入并运行下面程序,体会二维数组使用方法。
class MaxMatrix{
public static void main(String args[ ]){
int row =0;
int col=0; //放行号和列号
int max;
int m[ ] [ ] ={{6,2,3,24},{-5,8,7,6},{-3,18,-4,1}};
max =m[0] [0];
for (int i=0;i<=2;i++){
if(m[ i] [j ]>max){
max =m[i] [j];
row =i ;
col = j;
}
}
System.out.println(″最大元素值为:″+max);
System.out.println(″该元素位置在:″+row+″行,″+col+″列″);
}
}
6.修改上面程序,改为求矩阵中最小那个元素值,和其所在行号和列号。
提升:
1.在Java中对数组进行排序,能够使用以下步骤:
(1)使用import java.util.*语句,能够让java.util包中全部类在程序中全部能够使用;
(2)创建一个数组;
(3)使用Arrays类sort( )方法来重新调整一个数组数据。
用Arrays类sort( )方法排过序数组元素将被调整为按升序排列。
import java.util.*; //让java.util包中全部类在程序中全部能够使用
class SortName{
public static void main(String args[ ]){
String names[ ]= {″Akbar″,″Umberto″,″Peter″,″Zemo″,″Digo″};
System.out.println(″数组元素原来次序是:″);
for (int i =0;i<names.length;i++)
System.out.println(i+″; ″+names[i]);
Arrays.sort(names); //使用Arrays类sor()方法为数组names排序
System.out.println(″数组元素现在次序是:″);
for (int i =0;i<names.length;i++)
System.out.println(i+″: ″+names[i]);
}
}
2.建立一个字符串数组并按升序进行排序。
3.建立一个浮点型数组并按升序进行排序。
要求:
1、独立完成;并以实际上机操作计成绩;
2、全部上机试验必需在下一次试验之前完成,不然此次试验成绩算0分;
3、编写试验汇报(根据汇报模板编写,必需写出具体试验步骤及必需屏幕截图)。
试验六 类
一、试验课时
3课时。
二、试验目标
1.掌握怎样定义类。
2.掌握怎样定义类组员变量、组员方法。
3.掌握怎样创建对象。
4.掌握关键字static使用方法。
5.掌握类组员访问权限。
三、试验内容和要求
1.下面是一个老师类Teacher,用于学校某个系部管理。系部在管理老师时,所关心信息关键有老师编号、姓名、性别、年纪、家庭住址、电话号码等,于是抽取这些属性来描述"老师"这个实体。考虑到老师年纪、家庭住址、电话号码等不宜对无关人员公开,于是将这些数据设为私有组员变量(即实施保护)。要取得这些数据,必需使用类所提供一组方法,并给出口令。检验口令是否正确是由私有方法checkPasswork完成。阅读并编译这一程序,体会类组员变量、类方法和访问权限设计。
class Teacher { //定义老师类
//申明组员变量
String tCode; //老师编号
String tName; //老师姓名
String tSex; //老师性别
private String tAge; //老师年纪
private String tAddr; //家庭住址
private String tTelenmb; //电话号码
private String tPassword;访问口令
//申明结构方法
Teacher(String password){
tPassword = password;
}
//申明组员方法
private int checkPassword(String password) { //私有方法:检验口令是否正确
if(tPassword= =password)
return 1;
else return 0;
}
void setAge(String passwork,String age) //置年纪
展开阅读全文