跳至主要內容
22-用数组灵活处理成绩

0. 目录

  • 一个程序搞定成绩的各种处理需求

1. 一个程序搞定成绩的各种处理需求

  • 求某年最好成绩
  • 求某年的平均成绩
  • 求所有年份最好成绩
  • 求某门课历年最好成绩
  • 自由发挥……
/**
 * @ClassName: ScoreMaster
 * @Description: TODO
 * @Author: AI悦创
 * @Date: 2022/10/9 19:24
 * @Version: V1.0
 * @Blog: https://www.bornforthis.cn
 */

import java.util.Scanner;

public class ScoreMaster {
    public static void main(String[] args) {

        // 声明六个变量, 分别代表六门科目的成绩
        int YuWenIndex = 0;
        int ShuXueIndex = 1;
        int WaiYuIndex = 2;
        int WuLiIndex = 3;
        int HuaXueIndex = 4;
        int ShengWuIndex = 5;

        int totalScoreCount = 6;

        // 每门课的名字
        String[] names = new String[totalScoreCount];
        names[YuWenIndex] = "语文";
        names[ShuXueIndex] = "数学";
        names[WaiYuIndex] = "外语";
        names[WuLiIndex] = "物理";
        names[HuaXueIndex] = "化学";
        names[ShengWuIndex] = "生物";

        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入共有多少年的成绩:");

        int yearCount = scanner.nextInt();

        double[][] scores = new double[yearCount][totalScoreCount];  // 看几年的数组

        for (int i = 0; i < yearCount; i++) {
            for (int j = 0; j < totalScoreCount; j++) {
                scores[i][j] = 80 + Math.random() * 20;
                System.out.println("第" + (i + 1) + "年" + names[j] + "成绩为:" + scores[i][j]);
            }
        }

        boolean cont = true;
        while (cont) {
            System.out.println("请选择要进行的操作:");
            System.out.println("1: 求某年最好成绩\n" +
                    "2: 求某年的平均成绩\n" +
                    "3: 求所有年份最好成绩\n" +
                    "4: 求某门课历年最好成绩");

            int oprtId = scanner.nextInt();

            int year = 0;  // 在 switch 用一块代码块里,不能声明同一个变量,所以直接写在外面,方便。不然得想不同的变量名。
            switch (oprtId) {
                // 先编写 case
                case 1:
                    // 让用户输入指定的年份
                    System.out.println("请输入要计算第几年的最好成绩");
                    year = scanner.nextInt();
                    if (year <= 0 || yearCount < year) {
                        System.out.println("非法的年份:" + year);
                        cont = false;
                        break;
                    }
                    year = year - 1;
                    // 指定年份的最好成绩的编号,开始假设是0
                    int bestOfYearScoreId = 0;
                    // 循环指定年份的成绩,找出最好的成绩
                    // TODO:如果有两门课的成绩一样,而且都是最高的,怎么办?
                    for (int i = 1; i < totalScoreCount; i++) {
                        if (scores[year][bestOfYearScoreId] < scores[year][i]) {
                            bestOfYearScoreId = i;
                        }
                    }
                    System.out.println("第" + (year + 1) + "年成绩最好的科目为" + names[bestOfYearScoreId] + ",成绩为" + scores[year][bestOfYearScoreId] + "。");
                    break;
                case 2:
                    System.out.println("请输入要计算第几年的平均成绩");
                    year = scanner.nextInt();
                    if (year <= 0 || yearCount < year) {
                        System.out.println("非法的年份:" + year);
                        cont = false;
                        break;
                    }
                    year = year - 1;
                    double totalCountForAvg = 0;
                    for (int i = 0; i < totalScoreCount; i++) {
                        totalCountForAvg += scores[year][i];
                    }
                    double avgOfYear = totalCountForAvg / totalScoreCount;
                    System.out.println("第" + (year + 1) + "年的平均成绩为" + avgOfYear + "。");
                    break;
                case 3:
                    int bestYear = 0;
                    int bestScore = 0;

                    for (int i = 0; i < yearCount; i++) {
                        for (int j = 0; j < totalScoreCount; j++) {
                            if (scores[bestYear][bestScore] < scores[i][j]) {
                                bestYear = i;
                                bestScore = j;
                            }
                        }
                    }
                    // 视频中代码有错误,应该是使用 bestYear 而不是 year, 鸣谢 @zZGod 帮忙揪出 bug 一只。
                    System.out.println("所有年度最好成绩为第" + (bestYear + 1) + "年的" + names[bestScore] + ",成绩为" + scores[bestYear][bestScore] + "。");
                    break;
                case 4:
                    System.out.println("请输入科目编号");
                    int subjectId = scanner.nextInt();
                    if (subjectId <= 0 || totalScoreCount < subjectId) {
                        System.out.println("非法的科目编号:" + subjectId);
                        cont = false;
                        break;
                    }
                    subjectId = subjectId - 1;
                    year = 0;
                    for (int i = 1; i < yearCount; i++) {
                        if (scores[year][subjectId] < scores[i][subjectId]) {
                            year = i;
                        }
                    }
                    System.out.println("第" + (year + 1) + "年度" + names[subjectId] + "成绩最好,为" + scores[year][subjectId] + "。");

                    break;
                default:
                    cont = false;
                    System.out.println("不支持:" + oprtId + ", 程序结束。");
            }
        }

    }
}

AI悦创原创...大约 10 分钟Java体系课Java体系课
21-多维数组

0. 目录

  • 如果要存储多年的成绩怎么办?
  • 多维数组
  • 用多维数组存储多年的成绩

1. 如果要存储多年的成绩怎么办?

  • 为每年创建一个数组?
  • 这种行为和为每一门成绩创建一个变量很像!
import java.util.Scanner;

public class OneYearOneArray {
    public static void main(String[] args) {
        // 声明六个变量, 分别代表六门科目的成绩
        int YuWenIndex = 0;
        int ShuXueIndex = 1;
        int WaiYuIndex = 2;
        int WuLiIndex = 3;
        int HuaXueIndex = 4;
        int ShengWuIndex = 5;

        // 每门课的名字
        String[] names = new String[6];
        names[YuWenIndex] = "语文";
        names[ShuXueIndex] = "数学";
        names[WaiYuIndex] = "外语";
        names[WuLiIndex] = "物理";
        names[HuaXueIndex] = "化学";
        names[ShengWuIndex] = "生物";

        // 每门课的成绩
        double[] year1 = new double[6];

        // 用随机数给成绩赋值
        for (int i = 0; i < 6; i++) {
            year1[i] = 80 + Math.random() * 20;
        }

        // 每门课的成绩
        double[] year2 = new double[6];

        // 用随机数给成绩赋值
        for (int i = 0; i < 6; i++) {
            year2[i] = 80 + Math.random() * 20;
        }

        // 每门课的成绩
        double[] year3 = new double[6];

        // 用随机数给成绩赋值
        for (int i = 0; i < 6; i++) {
            year3[i] = 80 + Math.random() * 20;
        }

        double[] yearToUse;

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要查看第几年的成绩:");
        int year = scanner.nextInt();

        switch (year) {
            case 1:
                yearToUse = year1;
                break;
            case 2:
                yearToUse = year2;
                break;
            case 3:
                yearToUse = year3;
                break;
            default:
                System.out.println("输入的年份不对,将查看的是最新一年的成绩");
                yearToUse = year3;
                break;

        }

        System.out.println("请输入要查看的成绩编号:");

        int scoreIndex = scanner.nextInt();

        System.out.println("第" + year + "年的" + names[scoreIndex] + "的成绩是:" + yearToUse[scoreIndex]);

    }
}

AI悦创原创...大约 4 分钟Java体系课Java体系课
20-认识变量和数组

0. 目录

  • 重新认识基本类型的变量
  • 认识数组
  • 数组的长度
  • 数组索引过界会出错
  • 让变量代表新的数组

1. 重新认识基本类型的变量

1.1 一个简单的使用变量的程序

import java.util.Scanner;

public class UseVariable {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int a;
        System.out.println("创建了变量 a,输入一个整数:");
        a = in.nextInt();
        System.out.println("给 a 赋值,a 的值为" + a + ",请再次输入一个整数:");

        a = in.nextInt();
        System.out.println("再次给赋值,现在 a 的值为" + a);
    }
}

AI悦创原创...大约 8 分钟Java体系课Java体系课
19-用数组保存成绩

0. 目录

  • 语数外物化生的成绩怎么表示?
  • 什么是数组和数组的语法
  • 用数组处理 6 门课的成绩

1. 语数外物化生的成绩怎么表示?

  • 用六个变量表示,如果有更多的科目怎么办?
  • 如果有更多的科目怎么办?
  • 如果想求出成绩最高的科目怎么办?
public class SevenScore {
    public static void main(String[] args) {
        // 声明六个变量, 分别代表六门科目的成绩
        int YuWen = 0;
        int ShuXue = 0;
        int WaiYu = 0;
        int WuLi = 0;
        int HuaXue = 0;
        int ShengWu = 0;
    }
}

AI悦创原创...大约 4 分钟Java体系课Java体系课
18-循环和判断的总结

0. 目录

  • Java 中的单行注释
  • 从标准输出读取字符串和整数
  • 生成指定范围内的随机数
  • 猜数字的游戏

1. Java 中的单行注释

  • 以 // 为开始,到这一行结束都是注释内容
  • 注释可以是任何内容
  • 可以在一行的开始注释,也可以在程序内容后面添加注释
  • 注释不会对程序有任何影响

2. 生成指定范围内的随机数

2.1 新功能

  • Math.random() 生成随机数,随机数在 0 到 1 之间,类型是 double

AI悦创原创...大约 16 分钟Java体系课Java体系课
17-程序执行流程之 switch 语句

0. 目录

  • 将阿拉伯数字转换为中文数字
  • 使用 switch 语句简化程序
  • switch 语法中的 break
  • switch 语句语法点总结

1. 将阿拉伯数字转换为中文数字

  • 使用 if 可以完成,但是略显不够整洁
  • 能够根据两个值相比较,进入某个代码块最适合这个情况
public class IfElseNum {
    public static void main(String[] args) {

        int n = 1;

        String ret = n + "对应的汉字是";
        if (n == 0) {
            ret = ret + "零";
        } else if (n == 1) {
            ret = ret + "壹";
        } else if (n == 2) {
            ret = ret + "贰";
        } else if (n == 3) {
            ret = ret + "叁";
        } else if (n == 4) {
            ret = ret + "肆";
        } else if (n == 5) {
            ret = ret + "伍";
        } else if (n == 6) {
            ret = ret + "陆";
        } else if (n == 7) {
            ret = ret + "柒";
        } else if (n == 8) {
            ret = ret + "捌";
        } else if (n == 9) {
            ret = ret + "玖";
        } else {
            System.out.println("错误的值" + n + "。值需要在大于等于1,小于等于9。");
        }

        System.out.println(ret);
    }
}

AI悦创原创...大约 5 分钟Java体系课Java体系课
16-程序循环之 while 语句

0. 目录

  • 用 while 语句增强找整除数的程序
  • do-while 语句——至少执行一次
  • 死循环(endless loop)
  • 一个看似死循环却不是死循环的例子
  • 使用 break 语句结束循环

1. 用 while 语句增强找整除数的程序

1.1 增强点:找出 n 个可以被整除的数

while 语句的语法

  • 条件表达式的结果是一个 boolean 值,如果为 true,则执行循环体,如果为 false,则循环结束。
  • While 循环体是一个代码块。所以 while 循环也是可以嵌套别的语句的,包括 while 语句,for 语句,if-else 语句等。

AI悦创原创...大约 5 分钟Java体系课Java体系课
15-代码块和变量的作用域

0. 目录

  • 大括号括起来的就是代码块
  • 变量的作用域
  • 理解作用域和命名空间
  • for 循环嵌套

1. 大括号括起来的就是代码块

  • 代码块的示例
  • 有名字的代码块—— if-else 代码块,for 循环代码块,main 方法代码块
  • 代码块也叫体,比如 for 循环体,main 方法体
  • 代码块以嵌套

先看一个基本代码,后续演示会用到:

public class demo {
    public static void main(String[] args) {
        int a = 1;
        int a = 2;
    }
}
// 输出:
java: 已在方法 main(java.lang.String[])中定义了变量 a

AI悦创原创...大约 9 分钟Java体系课Java体系课
14-程序循环之 for 语句

0. 目录

  • 简化输出连续 26 个字符的程序
  • 简化并增强找整除数的程序
  • break 语句
  • continue 语句

1. 简化输出连续 26 个字符的程序

1.1 for 语句

  • 让程序在满足某条件时,重复执行某个代码块。for 是 Java 中的关键字
  • for 语句语法和简单的示例程
  • 初始语句在 for 循环开始前执行一次,以后不再执行;循环体条件表达式在每次循环体执行前会执行,如果为 true,则执行循环体,否则循环结束;循环体后语句会在每次循环执行后被执行;

AI悦创原创...大约 5 分钟Java体系课Java体系课
13-程序执行流程之 if-else 语句

0. 目录

  • 顺序执行
  • 怎么能多买几个热包子?用 if-else
  • 增强寻找可以被整除的程序
  • if-else 的嵌套
  • if-else 的简化

1. 顺序执行

  • 代码块的执行是顺序执行
  • 只要程序运行过程中不出错,就会一行行的向下顺序执行

2. 怎么能多买几个热包子?用 if-else

2.1 买包子的问题

  • 买 3 个肉包子
  • 如果是刚出笼的热肉包子,就多买两个呢?

AI悦创原创...大约 12 分钟Java体系课Java体系课
12-操作符和数据类型总结

0. 目录

  • 自增和自减操作符
  • 打印 26 个连续的字符
  • 找到可以被整除的数

1. 自增和自减操作符

  • 自增自减操作符是可以直接改变变量值的操作符
  • 前加加和前减减
  • 后加加和后减减
  • ++:其实是一个 +1 操作和一个赋值操作的缩写
  • --:其实是一个 -1 操作和一个赋值操作的缩写

AI悦创原创...大约 9 分钟Java体系课Java体系课
11-字符编码和字符串

0. 目录

  • 什么是字符集和编码
  • 编码和字符集介绍
  • ASCII 码和转义符(escape character)
  • 字符串的“加法”

1. 什么是字符集和编码

1.1 什么是字符集(Charset)

  • 字符集就是字符的集合。一般会包含一种语言的字符。比如:GBK,是包含所有常用汉字字符的字符集。ASCII 是包含英文字符的字符集。
  • 字符就是 Java 中的 char,char 是 character 的简写。

AI悦创原创...大约 6 分钟Java体系课Java体系课
10-基本数据类型的更多语法点

0. 目录

  • 变量要先赋值后使用
  • 计算并赋值运算符
  • 数据类型自动转换
  • 强制类型转换和数字溢出
  • 从数值计算溢出,理解程序员和编程语言

1. 变量要先赋值后使用

  • 不给变量赋值代表什么
  • 不赋值就使用会怎么样
public class AssignFirst {
    public static void main(String[] args) {
        int a;
        int b = a + 1; // 其实就是没有初始化
        /*java: 可能尚未初始化变量a
        * 初始化,就是你要给他赋值,你创建变量的时候要给它一个值。
        * 如果你不用这个变量 a 直接声明变量也是可以的*/
    }
}

AI悦创原创...大约 6 分钟Java体系课Java体系课
09-Java 中位运算符

你好,我是悦创。本次课,先学:https://bornforthis.cn/posts/21.html

0. 目录

  • 字面值的八进制和十六进制
  • 按位运算符
  • 位移运算符
  • 位运算符不会改变原变量的值
  • 位运算符用处

1. 字面值的八进制和十六进制

1.1 以 0 开头的整数为八进制


AI悦创原创...大约 7 分钟Java体系课Java体系课
08-Java 的布尔运算「专栏补充」

你好,我是悦创。

1. 布尔运算符

这里强调一点,根据一个具有实际开发十几年经验的前辈所得来的经验,能用 且且、或或 运算符,尽量使用 且且、或或 ,具体原因先看如下代码:

/*
 * project = 'Java_Coder', file_name = '笔记', author = 'AI悦创'
 * time = '2020/5/8 下午6:15', product_name = IntelliJ IDEA, 公众号:AI悦创
 * code is far away from bugs with the god animal protecting
 *    I love animals. They taste delicious.
 */

public class notes {
	public static void main(String[] args){
		boolean a = true;
		boolean b = false;
		
		System.out.println(a & b); // & 且 (and)
		System.out.println(a && b); // && 且且 (andand)
		System.out.println(a | b); // | 或 (or)
		System.out.println(a || b); // | 或或 (oror)
		// 对比
		System.out.println(a || (10 / 0 > 1));
		System.out.println(a | (10 / 0 > 1));
	}
}

AI悦创原创...大约 5 分钟Java体系课Java体系课
07-Java 中的运算符

1. 目录

  • 什么是运算符
  • 取模运算符
  • 整数的除法运算
  • 比较运算符和布尔运算符
  • 小括号运算符
  • 运算符优先级
  • 理解运算符优先级

2. 什么是运算符

  • 运算符对一个或者多个值进行运算,并得出一个运算结果。
  • 运算符的运算结果类型有的是固定的,有时候会根据被计算的值变化。比如两个 int 相加,结果的类型就是 int。两个 byte 相加,返回值的类型就是 int。
  • 混淆点:除赋值运算符外,运算符本身不会更改变量的值

AI悦创原创...大约 8 分钟Java体系课Java体系课
06-Java 中的基本数据类型

1. 目录

  • 认识二进制
  • 数字的基本数据类型
  • 布尔和字符数据类型
  • 使用各种基本数据类型
public class BigNumber {
    public static void main(String[] args) {
        int bigNum = 9999999999;  // 会报错:java: 整数太大
        long number = 9999999999L;  // 解决方法
    }
}

AI悦创原创...大约 9 分钟Java体系课Java体系课
02-Java String charAt() Method

Example

Return the first character (0) of a string:

返回字符串的第一个字符(0):

String myStr = "Hello";
char result = myStr.charAt(0);
System.out.println(result);  // H

AI悦创原创...大约 2 分钟Java体系课Java FQAJava supplementJava体系课Java FQAJava supplement