实验指导书

课程名称 Java程序设计
课程性质 专业选修课
开课年度 2023年
开课学期 秋季
授课班级 计21-123;计实验21;计贯通22;计专起本22-12
主讲教师 李欣
课程所属学院(部门) 信息学院
课程所属系(教研室) 计算机系

Table of Contents

1. Java编程环境安装配置

实验一

日期
[2023-09-15 Fri]
地点
910, 911
学时
2
实验目的
  1. 学会使用JDK(Java SE Development Kit)开发Java应用程序(Java Application)。 熟悉JDK的基本命令、功能和基本用法。
  2. 学会配置 PATH CLASSPATH 等环境变量。了解不同操作系统下配置环境变量的方式。
  3. 学会使用任意编辑器或Eclipse集成开发环境对Java源程序进行编辑。
  4. 学会使用JDK环境下 javac 命令编译Java源程序及 java 命令运行字节码文件。 学会在JDK环境下调试程序、查看程序输出结果等。
  5. 学会对Eclipse集成开发环境的安装及简单使用,了解其内置的JDK版本,理解Eclipse与JDK的区别与联系。
  6. 通过实验,理解Java应用程序的基本结构、Java应用程序文件名和类名的说明规则等知识。
实验内容
  1. 下载并安装JDK( 官方下载页面: https://www.oracle.com/java/technologies/downloads
  2. 下载并安装Eclipse集成开发环境( 官方下载页面: https://www.eclipse.org/downloads/
  3. 通过配置环境变量,使得 javac java 等命令可在任意目录位置使用。
  4. 建立自己的工作目录。例如,一个Windows下的路径 C:\Users\username\workspace\ 或 Linux下的路径 /home/username/workspace 均可作为自己的工作目录。
  5. 编写Java应用程序,输出字符串 Hello World!
  6. 编写Java应用程序,求 \(1+2*2+3*3 +...+n*n\) 的值。 \(n\) 的值可通过键盘输入(可借助 Scanner 工具类 ),或由命令行参数传入(参考教材 p.166 例6-4 )。
基本要求
  1. 实验报告中的题号标记需与以上实验内容的标号相一致。
  2. JDK和Eclipse集成开发环境的下载与安装过程、环境变量的配置过程等的截图可填入实验报告中作为相应内容的体现。
  3. 创建的工作目录可为任意目录,编写的Java应用程序需保存在该目录下,需各自做好该目录的保存与备份。
  4. Java应用程序的编辑、编译、运行及调试等每一个环节均需独自完成。

2. 分支循环程序设计

实验二

日期
[2023-09-29 Fri]
地点
910, 911
学时
2
实验目的
  1. 掌握Java中标识符的定义规则,了解Java中的保留字、各种数据类型的使用方法、以及有逻辑量意义数据的表示方式。
  2. 掌握Java中运算符与表达式的基本知识,了解各种运算符的使用及优先级控制, 了解表达式的组成及表示条件的表达式的类型。
  3. 熟练掌握通过 if 语句进行单分支结构和双分支结构程序设计的基本方法。
  4. 熟练掌握通过 if 语句的嵌套及 switch 语句进行多分支结构程序设计的基本方法。
  5. 熟练掌握 while do-whilefor 三种语句组成循环结构的基本方法。 熟练掌握 continue 语句、带标号及不带标号的 break 语句、 return 语句的用法。
  6. 熟练掌握一维数组和二维数组的使用。
  7. 把课堂上学到的理论用于实践,验证理论的正确性,发现并探索新的问题。
实验内容
  1. 编写程序接受用户输入多个整数, 当用户输入的整数为 \(0\) 时显示已输入所有整数的平均值并结束程序。
  2. 编写程序接受用户输入的10个整数, 通过一维数组存放比较并输出其中的最大值和最小值。
  3. 编写程序输出九九乘法表。
  4. 编写程序接受用户输入两次 \(1\) 到 \(9\) 的数值, 输出通过查询九九乘法表得到的乘积。(使用二维数组实现)
  5. 编写程序输出用户指定数据的所有素数因子。
  6. 编写程序接受用户输入的一个表示月份的整数, 若用户输入了从 \(1\) 到 \(12\) 以外的整数则提示输入有误, 利用 switch 语句输出对应月份的天数。(可暂不考虑闰年,以2月份为28天来实现)
  7. 编写一个应用程序,用两个 for 循环语句分别输出小写和大写的字母表。
  8. 编写程序求满足 \(1 + 2! + 3! + ... + n! <= 9876\) 的最大整数 \(n\) 。
  9. 为节约用电,某市将用户用电量分成3个区间,针对不同的区间给出不同的收费标准。 对于1至90千瓦时(度)的电量,每千瓦时0.6元; 对于91至150千瓦时的电量,每千瓦时1.1元; 对于用大于151千瓦时的电量,每千瓦时1.7元。 编写程序接受用户输入用电量并输出应缴电费。
  10. 假设某大学某专业今年的学费是5000元,且以每年 \(17\%\) 的速度增加。 编写程序计算多少年之后该专业学费会达到今年的三倍。
基本要求
  1. 实验报告中的题号标记需与以上实验内容的标号相一致。
  2. 实验报告中需同时包含所编写的源码及输出结果。
  3. 遇到的问题或错误及时记录,并将调试和查错的过程描述在实验报告中。
  4. 实验过程中遇到困难可交流或提问,但实验中的代码编码过程及实验报告需每位同学独立完成。
  5. 鼓励在实验报告中加入自己独自分析或思考的部分内容。

3. 面向对象编程

实验三

日期
[2023-10-13 Fri] [2023-10-27 Fri]
地点
910, 911
学时
4
实验目的
  1. 熟练掌握类、对象的概念以及对事物的抽象。
  2. 熟练掌握成员、方法的概念以及构造方法的概念。
  3. 熟练掌握封装性,多态性的概念。
  4. 理解面向对象的程序设计方法。
  5. 熟练掌握类的设计。
  6. 熟练掌握类的继承和接口的定义与实现。
  7. 学会综合运用继承、多态等知识编写类与子类,同时实现类与子类的基本功能。
实验内容
  1. 编写Java代码实现一个计数器类 Counter ,包含域 counterValue 用来保存计数器的当前数值, 方法 increment() 使计数器加一、方法 decrement() 使计数器减一、方法 reset() 使计数器清零。
  2. 编程实现矩形类,其中包括计算矩形周长和面积的方法。
  3. 使用上题的矩形类,编程统计若干块土地的相关信息,由用户输入每块儿土地的长与宽,程序将相关结果输出。
  4. 定义一个表示学生的类 Student ,包括域 id name gender classId age , 方法 getId() getName() getGender() getClassId() getAge() setAge(int age)
  5. 在上题的基础上为 Student 类定义构造方法并初始化所有的域, 增加一个 toString() 方法把 Student 类对象的所有域信息组合成一个字符串。 编程创建 Student 类的对象并测试新增的功能。
  6. 定义一个父类 Animal ,包含 public 成员属性 name age 与方法 showProfile() , 接着定义其子类 Cat 并包含一个成员方法 sleep() 。 编程创建 Cat 类的对象,为该对象的 name age 属性赋值, 并调用父类中定义的方法 showProfile() 与子类中定义的方法 sleep()
  7. 在上题的基础上定义一个 Animal 的子类 Dog ,包含成员方法 run() 。 编程分别创建一个 Cat 类的对象和一个 Dog 类的对象并分别为两个对象的属性赋值, 分别调用它们的 showProfile() 方法,然后调用各对象特有的方法 sleep()run()
  8. 在上题的基础上为 Animal 类增加成员方法 speak() ,并在子类 CatDog 中分别覆盖重写该方法, 编程创建两个子类的对象并调用 showProfile()speak() 方法。
  9. 在上题的基础上编程创建一个长度为4的 Animal 类的数组, 并创建该数组中的偶数元素为 Cat 类的对象,奇数元素为 Dog 类的对象,调用数组中所有对象的 speak() 方法。
  10. 编写一个只含有一个方法 int method(int n) 的接口 InterfaceA , 再编写一个类 ClassA 来实现接口 InterfaceA 。 实现接口方法 int method(int n) 时,要求计算 \(1\) 到 \(n\) 的和。
  11. 在上题的基础上,编写另一个类 ClassB 来实现接口 InterfaceA , 实现接口方法 int method(int n) 时,要求计算 \(n\) 的阶乘 \(n!\) , 最后使用接口回调的方式来测试 \(n = 4\) 时的程序执行情况。
  12. 设计一个名为 MyPoint 的类,包含以 \(x\) 坐标和 \(y\) 坐标表示的点。 设计该类的具体需求包括:
    1. 数据属性 \(x\) 和 \(y\) ,用于表示坐标,
    2. setX setYgetX getY 方法,分别用于设置及获取数据属性 \(x\) 和 \(y\) ;
    3. 创建点 \((0, 0)\) 的无参构造方法;
    4. 创建特定坐标点的构造方法;
    5. distance 方法,返回从该点到 MyPoint 类型的指定点之间的距离;
    6. distance 方法,返回从该点到由 \(x\) 和 \(y\) 确定的点之间的距离,体会方法重载;
    7. 编写一个测试程序,创建两个点的对象,并显示他们之间的距离。
基本要求
  1. 实验报告中的题号标记需与以上实验内容的标号相一致。
  2. 实验报告中需同时包含所编写的源码及输出结果。
  3. 遇到的问题或错误及时记录,并将调试和查错的过程描述在实验报告中。
  4. 实验过程中遇到困难可交流或提问,但实验中的代码编码过程及实验报告需每位同学独立完成。
  5. 鼓励在实验报告中加入自己独自分析或思考的部分内容。

4. 工具类与算法

实验四

日期
[2023-11-10 Fri] [2023-11-24 Fri]
地点
910, 911
学时
4
实验目的
  1. 熟练掌握工具类的用法与常用方法的调用。
  2. 熟悉常用的工具类,学会利用工具类编写程序。
  3. 熟悉常见数据结构,学会通过Java构建常用数据结构。
  4. 学会基于常用数据结构并编写算法解决常见数学问题。
实验内容
  1. 编写程序练习使用 String 类的 public String toUpperCase() 方法、 public String toLowerCase() 方法、以及 public String concat(String str) 方法。
  2. 编写程序使用 String 类的 public char charAt(int index) 方法得到一个字符串的第一个和最后一个字符。
  3. 编写程序剔除一个字符串中的全部非数字字符。
  4. 编程练习 Math 类的常用方法。
  5. 编写程序接受用户输入某两天的年、月、日信息,并计算这两天之间的天数间隔。
  6. 编写程序接受用户输入的年份和月份,输出相应的日历牌。 利用工具类 Calendar ,并定义 MyCalendar 类的 getCalendar() 方法来实现。
  7. 使用 Scanner 类的实例解析字符串 数学87分,物理76分,英语96分 中的考试成绩,并计算出总成绩以及平均分数。
  8. 求解约瑟夫问题:12个人排成一圈,从1号报数,凡是数到5的人就出队列(出局), 然后继续报数,试问最后一个出局的人是谁。
  9. 一个数如果恰好等于它的因子之和,这个数就称为完数。编写程序求1000以内的所有完数。
  10. 编程实现二分查找法,查找某个单词是否在给定的字典里。
  11. 编程实现给定一个整数数组 nums 和一个整数目标值 target ,在该数组中找出和为目标值 target 的两个整数,并返回它们的数组下标。 可假设每种输入只对应一种答案,但数组中的相同元素在答案中不能重复出现。 可以使用工具类中的数据结构,输入与输出的示例可参考下表。

    nums (输入) target (输入) results (输出)
    \([2, 7, 11, 15]\) \(9\) \([0, 1]\)
    \([3, 2, 4]\) \(6\) \([1, 2]\)
    \([3, 3]\) \(6\) \([0, 1]\)
  12. 编写程序根据用户录入的年份、产品类型和随机数生成固定资产编号。随机数的生成可使用 Math 类提供的方法。 固定资产编号的生成规则可参考下表。

    年份 产品类型 随机数 固定资产编号
    \(2021\) \(1\) (台式计算机) \(238\) \(20211238\)
    \(2022\) \(2\) (笔记本电脑) \(314\) \(20222314\)
    \(2022\) \(3\) (其他设备) \(693\) \(20223693\)
  13. 以下歌词节选自 Michael Jackson 的 Beat It 曲目,请从这段歌词中统计出 beat 出现的次数。可以组合使用 String 类的相关方法。

    They're out to get you, better leave while you can
    Don't wanna be a boy, you wanna be a man
    You wanna stay alive, better do what you can
    So beat it da just beat it du
    You have to show them that you're really not scared
    You're playing with your life, this ain't no truth or dare oh
    They'll kick you, then they'll beat you, then they'll tell you it's fair
    So beat it da, but you wanna be bad
    Just beat it beat it, beat it beat it
    No one wants to be defeated
    Showing how funky and strong is your fight
    It doesn't matter who's wrong or right
    Just beat it beat it, beat it beat it
    No one wants to be defeated
    Showing how funky and strong is your fight
    It doesn't matter who's wrong or right
    Just beat it beat it
    beat it beat it
    beat it beat it
    beat it beat it
    beat it beat it
    
基本要求
  1. 实验报告中的题号标记需与以上实验内容的标号相一致。
  2. 实验报告中需同时包含所编写的源码及输出结果。
  3. 遇到的问题或错误及时记录,并将调试和查错的过程描述在实验报告中。
  4. 实验过程中遇到困难可交流或提问,但实验中的代码编码过程及实验报告需每位同学独立完成。
  5. 鼓励在实验报告中加入自己独自分析或思考的部分内容。

5. 输入输出和多线程

实验五

日期
[2023-12-08 Fri]
地点
910, 911
学时
2
实验目的
  1. 了解线程的概念、线程的生命周期。
  2. 学会多线程的编程:继承 Thread 类与使用 Runnable 接口。
  3. 了解简单的多线程互斥和同步。
  4. 理解流的概念,流的划分。
  5. 掌握文件描述,顺序处理,随机访问处理的方法。学会编写程序对文件进行读写操作。
  6. 能够熟练的使用过滤流;掌握字符流处理的方法。
  7. 理解对象串行化的概念和方法。
实验内容
  1. 利用多线程编程实现模拟同时听歌和下载。通过分别定义一个 DownloadThread 子类和一个 MusicThread 子类 继承 Thread 类并重写 run() 方法的方式来实现多线程。 使两个子类重写后的 run() 方法在控制台每隔一秒分别输出 下载听歌 即可,并观察两者每次的输出顺序。
  2. 利用多线程编程实现多窗口同时售票。通过实现 Runnable 接口的方式模拟三个窗口同时售卖100张火车票的过程。
  3. 编写程序练习创建文件,读入文本文档并查看文件长度、修改时间,查看文件夹下所有文件对象。
  4. 编程利用Java基本输入输出流类将字符串保存到文本文档,再将保存的文本文档读取出来并将字符串输出。
  5. 编程将存放在磁盘中任意路径下的一张图片文件数据读入到内存,使用字节数据保存, 然后创建新的图片文件 a.jpg ,并将内存中存放的图片数据的字节数组写入到磁盘 a.jpg 文件中。
  6. 使用 String 类的 hashCode 方法获取指定文本的哈希值,并将获得的哈希值这一串字符保存到文本文档, 再将保存的文本文档读取出来并将保存的哈希值输出。
  7. 乌龟和兔子进行龟兔赛跑,假设它们从相同位置出发,乌龟每秒跑1米,兔子每秒跑3米。 编程使用多线程模拟随着时间进行它们所处的位置。
基本要求
  1. 实验报告中的题号标记需与以上实验内容的标号相一致。
  2. 实验报告中需同时包含所编写的源码及输出结果。
  3. 遇到的问题或错误及时记录,并将调试和查错的过程描述在实验报告中。
  4. 实验过程中遇到困难可交流或提问,但实验中的代码编码过程及实验报告需每位同学独立完成。
  5. 鼓励在实验报告中加入自己独自分析或思考的部分内容。

6. 网络和数据库

实验六

日期
[2023-12-22 Fri]
地点
910, 911
学时
2
实验目的
  1. 掌握 InetAddress 类的使用。
  2. 掌握TCP与UDP编程:Socket与Datagram的概念和编程方法。
  3. 了解 URL 类的使用:URL的概念和编程。
  4. 掌握JDBC编程接口。
  5. 了解 Connection Statement ResultSet PreparedStatement 类的使用。
实验内容
  1. 利用 InetAddress 编写程序接受用户输入主机名,输出这个主机的IP地址。
  2. 利用 Socket 编写一个服务器端程序和一个客户端程序,要求服务器端程序运行后监听指定端口, 检测到客户端程序连接并发来数据后,服务器端对该数据进行处理并传回客户端一段信息。
  3. 安装并配置MySQL数据库,并准备好JDBC所需扩展 mysql-connector-java-8.0.26.jar 以备之后使用。

    https://dev.mysql.com/downloads/mysql/
    https://dev.mysql.com/downloads/connector/j/
    
  4. 配置好MySQL后,利用下面的SQL语句创建 test 数据库、 websites 表,并向表中增添数据。

    -- 创建 test 数据库
    CREATE DATABASE test DEFAULT CHARSET UTF8;
    -- 创建 websites 表
    CREATE TABLE `websites` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` char(20) NOT NULL DEFAULT '' COMMENT '站点名称',
    `url` varchar(255) NOT NULL DEFAULT '',
    `alexa` int(11) NOT NULL DEFAULT '0' COMMENT 'Alexa 排名',
    `country` char(10) NOT NULL DEFAULT '' COMMENT '国家',
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
    -- 向 websites 表中增添数据
    INSERT INTO `websites` VALUES
    ('1', 'Google', 'https://www.google.cm/', '1', 'USA'),
    ('2', '淘宝', 'https://www.taobao.com/', '13', 'CN'),
    ('3', '微博', 'http://weibo.com/', '20', 'CN'),
    ('4', 'Facebook', 'https://www.facebook.com/', '3', 'USA');
    
  5. 编程利用JDBC连接数据库,获取 test 数据库中 websites 表的数据并输出到控制台。
  6. 利用 Socket 编写一个服务器端程序和一个客户端程序,服务器端程序运行后监听指定端口, 当检测到客户端程序连接并发来数据后,服务器端对该数据进行处理并保存到数据库,同时传回客户端一段信息。
基本要求
  1. 实验报告中的题号标记需与以上实验内容的标号相一致。
  2. 实验报告中需同时包含所编写的源码及输出结果。
  3. 遇到的问题或错误及时记录,并将调试和查错的过程描述在实验报告中。
  4. 实验过程中遇到困难可交流或提问,但实验中的代码编码过程及实验报告需每位同学独立完成。
  5. 鼓励在实验报告中加入自己独自分析或思考的部分内容。