文章目录
任务7、统计一组学生成绩
- 统计一组学生成绩的总分、平均分、最高分和最低分
- 假如一组学生100个人,利用前面所学的知识,程序就需要声明10个变量score1,score2,score3,……,score100,来分别记住每位学生的成绩,计算平均分
- average=score1,score2,score3,……,score100/100会显得特别麻烦,此时我们用一个数组来保存100个成绩,通过数组的索引或下标来访问每一个成绩,可以使用循环来处理。
(一)编程实现
- 代码如下:
package p01.t05;
import java.util.Scanner;
/**
* 功能;统计一组学生成绩
* 作者:刘金花
* 日期:2022 年04月14日
*/
public class Task05 {
public static void main(String[] args) {
// 声明部分
double[] scores = new double[10]; // 双精度一维数组,10个元素,scores[0], scores[1],..., scores[9]
double sum, average, max, min;
Scanner sc = new Scanner(System.in);
// 输入部分
for (int i = 0; i < scores.length; i++) {
System.out.print("scores[" + i + "] = ");
scores[i] = sc.nextDouble();
}
// 处理部分
sum = 0;
for (int i = 0; i < scores.length; i++) {
sum = sum + scores[i];
}
average = sum / scores.length;
max = Double.MIN_VALUE;
for (int i = 0; i < scores.length; i++) {
if (scores[i] > max) {
max = scores[i];
}
}
min = Double.MAX_VALUE;
for (int i = 0; i < scores.length; i++) {
if (scores[i] < min) {
min = scores[i];
}
}
// 输出部分
System.out.println("sum = " + sum);
System.out.println("average = " + average);
System.out.println("max = " + max);
System.out.println("min = " + min);
}
}
-
运行程序,查看结果:
-
可以利用增强for循环来遍历数组
课堂练习
- 任务1、确保输入成绩在[0, 100]范围内
- 代码如下:
package p01.t05;
import java.util.Scanner;
/**
* 功能;统计一组学生成绩
* 作者:刘金花
* 日期:2022 年04月14日
*/
public class Task05 {
public static void main(String[] args) {
// 声明部分
double[] scores = new double[10]; // 双精度一维数组,10个元素,scores[0],scores[1],..., scores[9]
double sum, average,max,min;
Scanner sc = new Scanner(System.in);
// 输入部分
for (int i = 0; i < scores.length; i++) {
while (true) {
System.out.print("scores[" + i + "] = ");
scores[i] = sc.nextDouble();
// 判断成绩是否合法 - [0,100]
if (scores[i] >= 0 && scores[i] <= 100) {
break; // 跳出while循环
} else {
// 提示用户输入成绩不合法
System.out.println("温馨提示:成绩必须在[0,100]之间!");
}
}
}
// 处理部分
sum = 0;
for (int i = 0; i < scores.length; i++) {
sum = sum + scores[i];
}
average = sum / scores.length;
max = Double.MIN_VALUE;
for (double score : scores) {
if (max < score) {
max = score;
}
}
min = Double.MAX_VALUE;
for (double score : scores) {
if (min > score) {
min = score;
}
}
// 输出部分
System.out.println("sum = " + sum);
System.out.println("average = " + average);
System.out.println("max = " + max);
System.out.println("min = " + min);
}
}
- 运行代码,查看结果:
- 任务2、确定最高分或最低分的位置
(二)讲解知识点
1、一维数组定义
(1)语法格式
数组类型[] 数组名 = new 数组类型[数组长度];
数组类型[] 数组名 = new 数组类型[]{数组元素0, 数组元素1, ...};
数组类型[] 数组名 = {数组元素0, 数组元素1, ...};
(2)数组定义示例
int[] ids = new int[100];
String[] names = new String[] {"洪艳林", "陈燕文", "郑晓琳", "唐竹龙"};
Object[] student = {1, "张三丰", "男", 20, "15892924560", "maths007@163.com"};
(3)数组定义的内存变化图
- 声明数组变量,此时数组变量还是null,赋值实例化数组之后,才会给它分配内存空间
2、不同类型数组元素默认初始值
数据类型 | 默认初始值 |
---|---|
byte,short,int,long | 0 |
float,double | 0.0 |
char | 一个空字符,即’\u0000’ |
boolean | false |
引用数据类型 | null,表示变量不引用任何对象 |
3、避免数组下标越界异常
- 每个数组的索引(下标)都有一个范围,即[0, length - 1]。在访问数组的元素时,索引不能超出这个范围,否则程序会报错(
ArrayIndexOutOfBoundsException
,即数组角标越界异常)。
4、避免数组空指针异常
- 在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为
null
,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现错误(NullPointerException,即空指针异常)。
(三)拓展练习
- 2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按“
yyyymmdd
”的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。有人表示 20200202 是“千年一遇”的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021年 12月2日。也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212即2121 年 12 月 12 日。算不上“千年一遇”,顶多算“千年两遇”。 - 给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
- 输入描述:输入包含一个八位整数 N,表示日期。
对于所有评测用例,10000101 ≤ N ≤ 89991231,保证 N 是一个合法日期的 8 位数 - 输出描述:输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个ABABBABA 型的回文日期。
任务2、数组排序(升序和降序排列)
1、选择排序法
(1)选择法排序含义
- 选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
(2)选择法排序实现步骤
- 选择法排序(降序):n个数排序,经过n − 1轮比较。
– 第1轮是第1个数跟剩下的( n − 1 ) 个数比较,让第1个数成为本轮最大者,要比较( n − 1 ) 次;
– 第2轮是第2个数跟剩下的( n − 2 )个数比较,让第2个数成为本轮最大者,要比较( n − 2 )次;
– ……
– 第( n − 1 )轮是第( n − 1 )个数与剩下的1个数比较,让第( n − 1 )个数成为本轮最大者,要比较1次。
_ 总比较次数: ( n − 1 ) + ( n − 2 ) + … … + 2 + 1 = n ( n − 1 ) 2 = O ( n 2 ) (n-1)+(n-2)+……+2+1=\displaystyle \frac{n(n-1)}{2}=O(n^2) (n−1)+(n−2)+……+2+1=2n(n−1)=O(n2)
- 代码如下:
package p01.t05;
/**
* 功能;选择法排序
* 作者:刘金花
* 日期:2022 年04月14日
*/
public class XExercise02_1 {
public static void main(String[] args) {
// 声明部分
int t;
int[] arr = {71,5458,29,31,78,2,77,82};
// 处理部分
for (int i = 0; i < arr.length - 1; i++) {
}
}
}
2、冒泡法排序
(1)冒泡法排序含义
- 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端。
(2)冒泡法排序实现步骤
- 冒泡法排序(降序):n个数排序,经过n − 1轮比较。
– 第1轮是n个数里相邻两个数比较,如果后者比前者大就交换,要比较( n − 1 )次,本轮最小者“浮”到第n个位置;
– 第2轮是前( n − 1 )个数里相邻两个数比较,如果后者比前者大就交换,要比较( n − 2 )次,本轮最小者“浮”到第( n − 1 )个位置;
– ……
– 第( n − 1 )轮是前2个数里相邻两个数比较,如果后者比前者大就交换,要比较1次,本轮最小者“浮”到第2个位置;
– 总比较次数: ( n − 1 ) + ( n − 2 ) + . . . + 2 + 1 = n ( n − 1 ) 2 ( n − 1 ) + ( n − 2 ) + . . . + 2 + 1 = n ( n − 1 ) 2 ( n − 1 ) + ( n − 2 ) + . . . + 2 + 1 = n ( n − 1 ) 2 (n-1)+(n-2)+...+2+1 = \displaystyle \frac{n(n-1)}{2} (n−1)+(n−2)+...+2+1=n(n−1)2(n−1)+(n−2)+...+2+1=2n(n−1)
- 代码如下:
package p01.t05;
/**
* 功能;冒泡法排序
* 作者:刘金花
* 日期:2022 年04月21日
*/
public class XExercise02_2 {
public static void main(String[] args) {
// 声明部分
int t;
int[] arr = {71, 54, 58, 29, 31, 78, 2, 77, 82};
System.out.print("原始数组:");
for (int x : arr) {
System.out.print(x + "\t");
}
System.out.println();
// 处理部分
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
// arr[j]与arr[j + 1]比较
if (arr[j] < arr[j + 1]) {
t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
System.out.print("降序排列:");
for (int x : arr) {
System.out.print(x + "\t");
}
System.out.println();
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
// arr[j]与arr[j + 1]比较
if (arr[j] > arr[j + 1]) {
t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
System.out.print("升序排列:");
for (int x : arr) {
System.out.print(x + "\t");
}
}
}
- 运行代码,查看结果:
补充:利用Arrays工具提供的sort()方法实现数组排序
- 运行程序,查看结果:
- 怎么才能实现降序排列呢?此时,我们还得传一个参数给sort()方法,这个参数是
Collections.reverseOrder()
。
- 运行程序,查看结果
- 要访问一个班的全部同学,有两种方式:一种方式是通过学号(id),相当于采用一维数组来访问;一种方式是通过座位号(row, col),相当于采用二维数组来访问。