java基础的6个实训
不死神兔
需求:
- 有一对兔子,
- 从出生后第3个月起每个月都生一对兔子,
- 小兔子长到第三个月后每个月又生一对兔子,
- 假如兔子都不死,问第二十个月的兔子对数为多少?
思路:
- 定义一个数组存储兔子对数
- 第一月、第二月都是已知,都是1,
- 找到规律用循环实现计算
代码:
public class Demo1 {
public static void main(String[] args) {
// 定义一个数组存储兔子对数
int[] rabbitNum = new int[20];
// 第一月、第二月都是已知,都是1
rabbitNum[0] = 1;
rabbitNum[1] = 1;
/*
* 思路:
* rabbitNum[2] = rabbitNum[0]+rabbitNum[1];
* rabbitNum[3] = rabbitNum[1]+rabbitNum[2];
* rabbitNum[4] = rabbitNum[2]+rabbitNum[3];
* ……
* 第20月
* rabbitNum[19] = rabbitNum[17]+rabbitNum[18];
* */
// 找到规律用循环实现计算
for (int i = 2; i < rabbitNum.length; i++) {
rabbitNum[i] = rabbitNum[i - 2] + rabbitNum[i - 1];
// 检验
System.out.println("第"+ (i + 1) +"月,兔子有"+ rabbitNum[i] +"只");
}
}
}
百钱百鸡
需求:
- 我国古代数学家张丘建在《算经》一书中提出的数学问题:
- 鸡翁一值钱五,
- 鸡母一值钱三,
- 鸡雏三值钱一。
- 百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
问题:
- 公鸡一只5元,母鸡一只3元,雏鸡3只1元,
- 一共花了100元买了100只,
- 买了各几只
思路:
- 假设公鸡x只,母鸡y只,雏鸡z只,
- 一共100只
- 满足x+y+z = 100;
- 一共100元
- 5x + 3y + z/3 = 100;
代码:
public class Demo2 {
public static void main(String[] args) {
/*
* 由100元和100只得出:
* 0 <= x <= 20
* 0 <= y <= 33
* 0 <= z <= 100
* */
for (int x = 0; x <= 20; x++) {
for (int y = 0; y <= 33; y++) {
int z = 100 - (x + y);
// 判断小鸡数量为3的倍数并且钱数相加为100的情况
if (z % 3 == 0 && 5 * x + 3 * y + z / 3 == 100) {
System.out.println("成立的只数:x:" + x + ",y:" + y + ",z:" + z);
System.out.println("-------------------------------------");
}
}
}
}
}
判断两个数组内容是否相同
代码:
public class Demo3 {
public static void main(String[] args) {
// 定义两个数组
int[] nums1 = {1, 2, 3};
int[] nums2 = {1, 2, 3};
// 利用匿名实例化对象并调用方法的返回值进行判断
if (new Demo3().compare(nums1, nums2)) {
System.out.println("两个数组相同");
} else {
System.out.println("两个数组不相同");
}
}
// 判断方法
// 返回为boolean值,参数为需要比较的数组
public boolean compare(int[] nums1, int[] nums2) {
// 养成好习惯,返回布尔值时定义一个布尔值,初始化为true,用于返回
boolean flag = true;
// 判断两个数组的长度是否相同
if (nums1.length == nums2.length) {
// 判断数组内元素是否相等
for (int i = 0; i < nums1.length; i++) {
// 如果相同时返回true
if (nums1[i] != nums2[i]){
flag = false;
}
}
} else {
flag = false;
}
return flag;
}
}
查找
需求:
- 已知一个数组arr = {19,28,37,46,50};
- 键盘录入一个数据,
- 查找该数据在数组中的索引,
- 并在控制台输出找到的索引值。
代码:
import java.util.Scanner;
public class Demo4 {
public static void main(String[] args) {
// 打印匿名实例化对象并调用find()的返回值
System.out.println(new Demo4().findIndex());
}
public int findIndex() {
// 定义一个数组
int[] arr = {19, 28, 37, 46, 50};
// 定义一个索引值,默认为-1,用于返回
int index = -1;
System.out.println("请输入一个数:");
// 实例化一个扫描器
Scanner scanner = new Scanner(System.in);
int input = scanner.nextInt();
for (int i = 0; i < arr.length; i++) {
if (arr[i] == input) {
index = i;
}
}
// 关闭资源
scanner.close();
return index;
}
}
反转数组
代码:
import java.util.Arrays;
public class Demo5 {
public static void main(String[] args) {
// 定义一个需要反转的数组
int[] arr = {19, 28, 37, 46, 50};
// 打印匿名实例化对象并调用reverse()的返回值
System.out.println(Arrays.toString(new Demo5().reverse(arr)));
}
public int[] reverse(int[] arr) {
// 定义一个反转后的数组,长度为反转前的数组
int[] newArray = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
// 将旧数组从后向前赋给新数组
newArray [i] = arr[arr.length - 1 - i];
}
// 返回新数组
return newArray;
}
}
评委打分
需求:
- 在编程竞赛中,有6个评委为参赛的选手打分,
- 分数为0-100的整数分。
- 选手的最后得分为:
- 去掉一个最高分和一个最低分后的4个评委平均值(不考虑小数部分)。
代码:
import java.util.Scanner;
public class Demo6 {
public static void main(String[] args) {
// 定义一个长度为6的数组
int[] arr = new int[6];
// 调用getArray()进行获取数值
arr = new Demo6().getArray(arr);
// 调用getScore()并打印返回值
System.out.println(new Demo6().getScore(arr));
}
// 键盘录入方法
public int[] getArray(int[] arr) {
System.out.println("请输入6位评委的分数");
// 实例化扫描器扫描输入
Scanner scanner = new Scanner(System.in);
// 用循环接收数据并赋值给数组
for (int i = 0; i < arr.length; i++) {
arr[i] = scanner.nextInt();
}
// 关闭资源
scanner.close();
return arr;
}
// 算分方法
public int getScore(int[] arr) {
// 在数组中找出最大值和最小值
// 定义一个最大值
int max = arr[0];
// 定义一个最小值
int min = arr[0];
// 定义一个求和
int sum = arr[0];
// 遍历判断
for (int i = 1; i < arr.length; i++) {
// 使用Math类中的max()和min()
max = Math.max(max, arr[i]);
min = Math.min(min, arr[i]);
sum += arr[i];
}
// 去掉最大值和最小值
sum -= (max + min);
// 返回和的平均值
return sum / (arr.length - 2);
}
}