当前位置:网站首页 > Java基础 > 正文

java基础实验报告5



*本文是博主对Java各种实验的再整理与详解,除了代码部分和解析部分,一些题目还增加了拓展部分(⭐)。拓展部分不是实验报告中原有的内容,而是博主本人自己的补充,以方便大家额外学习、参考。

目录

一、实验目的

二、实验内容

1、实验题目:基本语法

(1)求任意输入的10个数的和。

(2)实验题目:获取三个整数中的最大值(用三元运算符)

        ⭐拓展-通过泛型类获取任意类型的三个数的最大值

2、实验题目:选择结构的应用 

(1)键盘录入月份的值,输出对应的季节

(2)输入年份和月份,输出该年月的天数

        ⭐拓展-输入年、月、日,输出这天是该年的第几天

(3)出租车计费问题

3、实验题目:循环结构的应用

(1)分别用do-while和for循环计算1+1/2!-1/3!+1/4!-1/5!…的前20项之和。 

(2)求1000以内的完全数(一个数等于它的因子之和称为完全数) 

(3)微信中的一个拿鸡蛋问题

5、实验题目:课后作业题

(1)求六边形面积,六边形面积可以通过下面公式计算(s是边长)

(2)实现会员注册,要求用户名长度不小于3,密码长度不小于6,若不满足需有提示信息,提示输入有误;注册时两次输入密码必须相同(字符串)

(3)找出两个分教最高的学生:编写程序,提示输入学生的个数、每个学生的名字及其分数,最后显示获得最高分的学生和第二高分的学生

(4)定义一维数组并初始化,通过键盘任意输入一个数,查找该数是否存在(结果返回下标值)

(5)编写一个程序,将二维数组a转置后存入数组b(所谓转置就是行列互换)

三、实验总结


一、实验目的

1、掌握变量的命名是否符合Java关于标识符的命名规则。

2、掌握8种基本数据类型和3种类型转换的方法。

3、熟悉各种运算符的优先级和结合方向。

4、掌握控制结构的3种语句。

5、掌握Java输入数据的基本方法;Scanner。

6、掌握方法的定义、调用格式,理解方法调用和参数传递的原理,掌握方法的重载,理解方法的递归调用。

7、掌握数组的定义、动态和静态初始化格式,数组的遍历和应用,Array工具类的使用。


二、实验内容

1、实验题目:基本语法

(1)求任意输入的10个数的和。

源代码:

常规方式for循环输入并求和。该题逻辑非常基础,不作过多说明。对于Scanner不了解的同学可以查看该文档:Scanner

 

列出测试数据和实验结果截图:

java基础实验报告5


(2)实验题目:获取三个整数中的最大值(用三元运算符)

源代码:

代码1:直接使用三目运算符。

 

代码2:将求最大值的程序封装成方法,通过调用方法获取最大值。 

 

列出测试数据和实验结果截图:


⭐拓展-通过泛型类获取任意类型的三个数的最大值

提问:如果想要比较的对象不仅是整数,而是任意的基本数据类型,那该怎么办呢?

当然,我们可以采用方法重载,枚举多种情况、写多个方法。但这样依旧有些费劲,毕竟光是可以比较的数值类型就有7种,更何况可能还需要比较自定义类型。这时,我们可以借助泛型来实现。详解部分可以查阅下面这篇文章:

🔗Java初识泛型 | 如何通过泛型类/泛型方法获取任意类型的三个数的最大值?


2、实验题目:选择结构的应用 

(1)键盘录入月份的值,输出对应的季节

源代码:

用switch或if来进行分支判断都是简便且可行的,这里给出用if实现的代码。 

 

列出测试数据和实验结果截图:

(2)输入年份和月份,输出该年月的天数

 

⭐拓展-输入年、月、日,输出这天是该年的第几天

我们写分支结构时,当发现既可以使用switch-case(同时switch中表达式的取值情况不太多),又可以使用if-else时,我们可以优先选择使用switch-case,因为switch-case的执行效率稍高。 

 

(3)出租车计费问题

• KF市的出租车计费方式为:起步2公里内5元,2公里以上每公里收费1.3元,9公里以上每公里收费2元,燃油附加费1元。

• 编写程序,输入公里数,计算出所需的出租车费用。

源代码:

 

列出测试数据和实验结果截图:


3、实验题目:循环结构的应用

(1)分别用do-while和for循环计算1+1/2!-1/3!+1/4!-1/5!…的前20项之和。 

本题是基础的累加、阶乘的运用。较为基础,故不多作说明。

源代码:

for循环实现

 

do-while循环实现

 

列出测试数据和实验结果截图:

(2)求1000以内的完全数(一个数等于它的因子之和称为完全数) 

通过试除法,找到数n所有的因子并相加,最后作判断即可。 

源代码:

 

(3)微信中的一个拿鸡蛋问题

一筐鸡蛋,1个1个拿,正好拿完。

     2个2个拿,还剩1个。

     3个3个拿,正好拿完。

     4个4个拿,还剩1个。

     5个5个拿,还差1个。

     6个6个拿,还剩3个。

     7个7个拿,正好拿完。

     8个8个拿,还剩1个。

     9个9个拿,正好拿完。

问:筐里最少有多少鸡蛋?

这个问题非常简单,但必须注意细节:5个5个拿时,是还“差”一个,而不是还“剩”一个。假设有4个鸡蛋,那么此时5个5个拿,就是还差一个的情景。因此,此时的鸡蛋数加上差的1个,恰好是5的倍数。

源代码:

 

列出测试数据和实验结果截图:


5、实验题目:课后作业题

(1)求六边形面积,六边形面积可以通过下面公式计算(s是边长)

注:使用Math类中的方法计算tan值。 

源代码: 

 

列出测试数据和实验结果截图: 

(2)实现会员注册,要求用户名长度不小于3,密码长度不小于6,若不满足需有提示信息,提示输入有误;注册时两次输入密码必须相同(字符串)

本题的关键是字符串的输入与两个字符串之间的比较方法equals的运用。注意,若要求忽略大小写比较,则用到equalsIgnoreCase()方法。

源代码:

 

 列出测试数据和实验结果截图:

(3)找出两个分教最高的学生:编写程序,提示输入学生的个数、每个学生的名字及其分数,最后显示获得最高分的学生和第二高分的学生

方法一:直接求解

该代码没有用到面向对象的思想,编程思路是分别创建两个数组:分数数组与姓名数组进行分开存储。通过排序代码,以分数为标准对姓名数组进行排序,最后输出前两项的姓名。 

源代码:

 

列出测试数据和实验结果截图:

  

方法二:面向对象

该方法是上一种方式的优化,核心思路是实现Student类,创建Student数组,并通过直接对Student数组排序的方式最高分的Student对象与第二高分的Student对象。

注意:由于数组排序的过程中设计对象的比较,因此需要重写compareTo()方法才能进行Student数组的排序。

源代码:

 

代码详解: 

  1. 注释①处写成.next()和.nextLine()在此是有区别的。正确的方式应当是写成reader.next(); 一方面,.next()不会因为获取到上一个输入遗留下来的换行空白符而停止读取;另一方面,在用户实际输入的时候既可以将“姓名”和“分数”用换行隔开,也可以用空格等非换行符隔开。若写成.nextLine()。则会有上面的两个问题,会抛出InputMismatchException
    通过调试可以知道,此时的字符串“小明”并没有被①代码接收,而是被②代码接收,①代码似乎被直接“跳过”了,类型不匹配因此异常
  2.  ③处代码是创建新的Student对象。注意,在创建Student数组的时候,并没有实例化Student对象。数组没有初始化,因此Student数组内均为null。通过构造方法给Student对象的name和score赋值,并实例化数组中的元素。
  3. ④直接调用Arrays中的方法sort给数组中的元素进行排序。注意:该数组是引用类型,要实现排序必须重写Comparable或Comparator接口,并重写相应的比较方法,也就是指定比较的规则。
  4. ⑤处实现了Comparable接口。

列出测试数据和实验结果截图: 

(4)定义一维数组并初始化,通过键盘任意输入一个数,查找该数是否存在(结果返回下标值)

方法一:数组中查找比对

源代码:

 

 列出测试数据和实验结果截图: 

 

方法二:将数组转变为字符串后,调用indexOf()方法

注意,将int数组转换为String,不能直接调用Arrays.toString()方法。因为该方法输出的内容并不完全是原数组中的,而是还有分隔符逗号、前后中括号[] 等。通过调试可以看到:

我们希望0下标的位置是"0",但这里却是"["。Java中没有库函数可以实现int数组直接转换成String的方法,因此我们需要自己实现一个myToString()来完成,逻辑也并不难。 

源代码:

 

列出测试数据和实验结果截图:

 

方法三:调用Arrays工具类中的binarySearch()方法

如图,这是binarySearch()一个方法的api文档。通过文档可知,配合sort()方法,可以直接调用二分查找方法实现查找。 

源代码:

 

(5)编写一个程序,将二维数组a转置后存入数组b(所谓转置就是行列互换)

例如: 

 源代码:

 

列出测试数据和实验结果截图:


实验总结

  1. 完成上述实验,我更熟地掌握了Java的基础语法,包括:
    1. Java关于标识符的命名规则,Java标识符可以字母、数字、下划线和美元符构成,且数字不能开头。类名用大驼峰,变量名、方法名用小驼峰。
    2. 掌握了8种基本数据类型int,byte,short,char,long,float,double,Boolean的使用情况和相应的类型转换方法。
    3. 我熟悉了各种运算符包括自增、自减、三目运算符等的优先级和结合方向。
    4. 我掌握了控制结构的3种语句,包括if、switch选择语句、while、do-while、for、for-each循环语句。
    5. 我掌握了Java输入数据的基本方法:Scanner。我可以熟练地通过调用Scanner对象输入各种数据类型的数据进行编程。
    6. 我掌握了方法的定义和调用格式,能正确写出Java定义方法的语法。也理解了方法调用和参数传递的原理,包括值传递和址传递。
    7. 我掌握了方法的重载,重载的条件是方法的名称必须相同,参数列表必须不同,返回值类型不做要求。
    8. 我也理解了方法的递归调用,递归就是方法自己调用自己,会在虚拟机栈中建立栈帧。

版权声明


相关文章:

  • java基础类型空间2024-10-23 22:10:06
  • java程序设计基础a2024-10-23 22:10:06
  • 浪潮java基础面试2024-10-23 22:10:06
  • java基础语法2122024-10-23 22:10:06
  • java面向对象零基础2024-10-23 22:10:06
  • python需要有java基础吗2024-10-23 22:10:06
  • java英语基础好学吗2024-10-23 22:10:06
  • java基础语法972024-10-23 22:10:06
  • 有java基础再去学python2024-10-23 22:10:06
  • Java基础语句spring2024-10-23 22:10:06