任务7、统计一组学生成绩

本文介绍了如何使用Java进行数组操作,包括定义、初始化、避免异常及统计学生成绩。此外,详细讲解了选择排序和冒泡排序算法,并提供了实现代码。文章还探讨了数组排序的优化,利用Arrays.sort()方法实现升序和降序排列。
摘要由CSDN通过智能技术生成

任务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,long0
float,double0.0
char一个空字符,即’\u0000’
booleanfalse
引用数据类型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) n1+(n2)++2+1=2n(n1)=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} (n1)+(n2)+...+2+1=n(n1)2(n1)+(n2)+...+2+1=2n(n1)
    请添加图片描述
  • 代码如下:
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),相当于采用二维数组来访问。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值