讲师中心 微信公众号
AI工具推荐 视频效率加速

Java二维数组与学生成绩管理:计算并关联学生平均分

云伟同学_7314

云伟同学_7314

发布时间:2025-11-25 17:48:06

|

346人浏览过

|

来源于php中文网

原创

java二维数组与学生成绩管理:计算并关联学生平均分

本教程详细介绍了如何在Java中使用二维数组管理学生成绩,并正确地计算每位学生的平均分。文章重点讲解了如何将学生姓名与对应的成绩数据进行关联,避免常见的数组索引和数据类型错误,并提供了完整的代码示例,帮助读者构建一个功能完善的成绩管理系统。

1. 简介:使用数组管理学生成绩

在许多应用程序中,我们需要处理结构化的数据集合。学生成绩管理是一个典型的例子,它涉及到存储学生姓名和他们多门课程的成绩。Java中的数组,特别是二维数组,是处理这类数据的有效工具。本教程将指导您如何利用String[]存储学生姓名,以及int[][]存储对应的考试成绩,并着重解决在计算和显示每位学生平均分时,如何正确地将姓名与成绩关联起来的问题。

2. 数据结构设计

为了实现学生成绩管理,我们需要两种主要的数据结构:

  • 学生姓名数组 (String[]): 用于存储所有学生的姓名。
  • 学生成绩二维数组 (int[][]): 用于存储每位学生的各科成绩。外层数组的每个元素代表一个学生,内层数组的每个元素代表该学生的一门课程成绩。

例如,一个int[5][3]的二维数组可以表示5名学生,每名学生有3门课程的成绩。

立即学习Java免费学习笔记(深入)”;

import java.util.Arrays;
import java.util.Scanner;

public class GradeBook {

    public static void main(String[] args) {
        System.out.println("Starting program\n\n");

        // 声明学生姓名数组
        String[] STUDENT_NAMES = new String[] {"Adams", "Baker", "Campbell", "Dewey", "East"};
        // 声明学生成绩二维数组,5名学生,每人最多3门成绩
        int[][] STUDENT_GRADES = new int[STUDENT_NAMES.length][3]; 

        // 加载学生成绩数据
        loadGradeArray(STUDENT_GRADES);

        // 打印学生姓名和前两门成绩
        System.out.println("学生姓名      成绩1    成绩2");
        System.out.println("------------------------------");
        for (int i = 0; i < STUDENT_NAMES.length; i++) {
            // 使用printf格式化输出,确保对齐
            System.out.printf("%-10s %5d %8d \n", STUDENT_NAMES[i], STUDENT_GRADES[i][0], STUDENT_GRADES[i][1]);
        }
        System.out.println("\n");

        // 计算并打印学生平均分
        getStudentAverage(STUDENT_GRADES, STUDENT_NAMES);

    } //end main

    // ... 其他方法将在后续章节详细介绍
}

3. 填充成绩数据

loadGradeArray方法负责将具体的成绩数据填充到STUDENT_GRADES二维数组中。在实际应用中,这些数据可能来自用户输入、文件读取或数据库。为了本教程的示例,我们将直接在方法中硬编码一些成绩。

原始loadGradeArray方法的潜在问题: 原始代码中的loadGradeArray方法在一个嵌套循环中反复为固定的索引STUDENT_GRADES[0][0]、STUDENT_GRADES[0][1]等赋值,这意味着只有最后一次赋值会生效,并且所有学生的数据都会被重复赋值多次,效率低下且逻辑不清晰。

修正后的loadGradeArray方法: 为了正确地填充数据,我们应该确保每个学生的每门成绩都被准确地赋值一次。

    /**
     * 加载学生成绩数据到二维数组中。
     * 实际应用中,数据可能来自用户输入、文件或数据库。
     * @param studentGrades 存储学生成绩的二维数组
     */
    public static void loadGradeArray(int[][] studentGrades) {
        // 示例:直接赋值具体的学生成绩
        // 假设每个学生有两门成绩,第三列保留或未用

        // Adams: 75, 75
        studentGrades[0][0] = 75; 
        studentGrades[0][1] = 75; 

        // Baker: 100, 75
        studentGrades[1][0] = 100; 
        studentGrades[1][1] = 75; 

        // Campbell: 84, 75
        studentGrades[2][0] = 84; 
        studentGrades[2][1] = 75; 

        // Dewey: 80, 75
        studentGrades[3][0] = 80; 
        studentGrades[3][1] = 75; 

        // East: 50, 75
        studentGrades[4][0] = 50; 
        studentGrades[4][1] = 75; 
    }

通过这种方式,每位学生的成绩都被清晰且正确地设置。

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载

4. 计算并显示学生平均分

getStudentAverage方法是本教程的核心,它负责遍历每个学生,计算他们的平均分,并将结果与对应的学生姓名一起打印出来。

原始getStudentAverage方法的问题:

  1. 姓名关联错误: Arrays.toString(name)会打印整个name数组的字符串表示,而不是当前学生的姓名。
  2. 平均分计算硬编码: average = sum/2; 硬编码了每位学生只有两门成绩。如果成绩数量变化,这将导致错误。
  3. 整数除法: 如果sum和grade[row].length都是整数,sum/grade[row].length会执行整数除法,丢失小数部分。

修正后的getStudentAverage方法: 我们将解决上述问题,确保平均分的计算准确无误,并且学生姓名能够正确地关联。

    /**
     * 计算并打印每位学生的平均分。
     * @param grades 存储学生成绩的二维数组
     * @param names  存储学生姓名的字符串数组
     */
    public static void getStudentAverage(int[][] grades, String[] names) {
        // Scanner in = new Scanner(System.in); // 示例中不需要用户输入,可移除

        // 遍历每个学生(外层循环控制行,即学生)
        for (int row = 0; row < grades.length; row++) {
            double sum = 0; // 使用double类型存储总和,避免整数除法问题

            // 遍历当前学生的所有成绩(内层循环控制列,即成绩)
            for (int col = 0; col < grades[row].length; col++) {
                sum = sum + grades[row][col];
            }

            // 计算平均分。确保使用浮点数除法,并考虑成绩数量的动态性
            // 如果grades[row].length可能为0,需要添加检查以避免除以零错误
            double average = (grades[row].length > 0) ? sum / grades[row].length : 0.0;

            // 打印结果,正确关联学生姓名
            // 使用 names[row] 获取当前学生的姓名
            System.out.printf("The average of %s is: %.1f\n", names[row], average);
        }
        // in.close(); // 如果使用了Scanner,记得关闭
    }

关键修正点解释:

  • names[row]: 这是解决姓名关联问题的关键。row变量在循环中代表当前学生的索引,直接使用names[row]即可获取对应学生的姓名。
  • sum / grades[row].length: 这使得平均分计算更加通用。grades[row].length会返回当前学生(当前行)拥有的成绩数量,无论它是2门、3门还是更多。
  • double sum = 0;: 将sum声明为double类型,可以确保在进行除法运算时,结果是浮点数,从而保留小数部分,得到更精确的平均分。
  • %.1f: 在printf中,%.1f用于格式化输出浮点数,保留一位小数。

5. 完整的程序示例

将以上所有修正和方法整合到GradeBook.java类中,形成一个完整的、可运行的程序。

import java.util.Arrays; // 引入Arrays工具类,虽然本例中直接使用了索引
import java.util.Scanner; // 引入Scanner类,如果需要用户输入

public class GradeBook {

    public static void main(String[] args) {
        System.out.println("Starting program\n\n");

        // 声明学生姓名数组
        String[] STUDENT_NAMES = new String[] {"Adams", "Baker", "Campbell", "Dewey", "East"};
        // 声明学生成绩二维数组,5名学生,每人最多3门成绩
        // 注意:这里定义了3列,但loadGradeArray只填充了前两列,第三列默认为0
        int[][] STUDENT_GRADES = new int[STUDENT_NAMES.length][3]; 

        // 加载学生成绩数据
        loadGradeArray(STUDENT_GRADES);

        // 打印学生姓名和前两门成绩的概览
        System.out.println("学生姓名      成绩1    成绩2");
        System.out.println("------------------------------");
        for (int i = 0; i < STUDENT_NAMES.length; i++) {
            // 使用printf格式化输出,确保对齐
            System.out.printf("%-10s %5d %8d \n", STUDENT_NAMES[i], STUDENT_GRADES[i][0], STUDENT_GRADES[i][1]);
        }
        System.out.println("\n");

        // 计算并打印学生平均分
        getStudentAverage(STUDENT_GRADES, STUDENT_NAMES);

    } //end main

    /**
     * 计算并打印每位学生的平均分。
     * @param grades 存储学生成绩的二维数组
     * @param names  存储学生姓名的字符串数组
     */
    public static void getStudentAverage(int[][] grades, String[] names) {
        // Scanner in = new Scanner(System.in); // 如果不需要用户输入,可以移除

        // 遍历每个学生(外层循环控制行,即学生)
        for (int row = 0; row < grades.length; row++) {
            double sum = 0; // 使用double类型存储总和,避免整数除法问题

            // 遍历当前学生的所有成绩(内层循环控制列,即成绩)
            for (int col = 0; col < grades[row].length; col++) {
                sum = sum + grades[row][col];
            }

            // 计算平均分。确保使用浮点数除法,并考虑成绩数量的动态性
            // 增加对grades[row].length的检查,避免除以零错误(尽管本例中不会发生)
            double average = (grades[row].length > 0) ? sum / grades[row].length : 0.0;

            // 打印结果,正确关联学生姓名
            // 使用 names[row] 获取当前学生的姓名
            System.out.printf("The average of %s is: %.1f\n", names[row], average);
        }
        // in.close(); // 如果使用了Scanner,记得关闭
    }

    /**
     * 加载学生成绩数据到二维数组中。
     * 实际应用中,数据可能来自用户输入、文件或数据库。
     * @param studentGrades 存储学生成绩的二维数组
     */
    public static void loadGradeArray(int[][] studentGrades) {
        // 示例:直接赋值具体的学生成绩
        // 假设每个学生有两门成绩,第三列保留或未用

        // Adams: 75, 75
        studentGrades[0][0] = 75; 
        studentGrades[0][1] = 75; 

        // Baker: 100, 75
        studentGrades[1][0] = 100; 
        studentGrades[1][1] = 75; 

        // Campbell: 84, 75
        studentGrades[2][0] = 84; 
        studentGrades[2][1] = 75; 

        // Dewey: 80, 75
        studentGrades[3][0] = 80; 
        studentGrades[3][1] = 75; 

        // East: 50, 75
        studentGrades[4][0] = 50; 
        studentGrades[4][1] = 75; 
    }

} //end class

程序输出示例:

Starting program


学生姓名      成绩1    成绩2
------------------------------
Adams        75       75 
Baker       100       75 
Campbell     84       75 
Dewey        80       75 
East         50       75 


The average of Adams is: 75.0
The average of Baker is: 87.5
The average of Campbell is: 79.5
The average of Dewey is: 77.5
The average of East is: 62.5

6. 重要注意事项与最佳实践

  • 数据类型选择: 在计算平均分时,务必使用double或float等浮点数类型来存储总和及平均值,以避免整数除法导致的数据精度丢失。
  • 数组索引的准确性: 访问数组元素时,确保索引在有效范围内(从0到length - 1)。越界访问会导致ArrayIndexOutOfBoundsException。
  • 代码的通用性: 在计算平均分时,使用grades[row].length来获取当前学生的成绩数量,而不是硬编码一个数字(如2)。这样,即使未来每位学生的成绩数量发生变化,代码也无需修改。
  • 输入验证: 如果成绩数据来自用户输入,应进行严格的输入验证,确保输入的是有效的数字,并处理可能的异常(如InputMismatchException)。
  • 对象导向设计: 对于更复杂的学生管理系统,可以考虑创建Student类,将姓名和成绩封装在一起,而不是使用两个独立的数组。这将提高代码的可维护性和可扩展性。
  • 资源管理: 如果使用Scanner等需要关闭的资源,确保在不再需要时调用其close()方法,以防止资源泄露。

7. 总结

本教程通过一个学生成绩管理的具体案例,深入探讨了Java中二维数组的使用技巧。我们学习了如何正确地声明、初始化和填充二维数组,并重点解决了在遍历数组时,如何精确地将相关数据(如学生姓名和其平均分)进行关联和输出。通过修正常见的编程错误,例如不正确的数组字符串转换和硬编码的平均分计算,我们构建了一个功能更健壮、更通用的成绩管理程序。掌握这些基本概念对于处理各种结构化数据至关重要。

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2331

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

494

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

402

2026.02.12

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5079

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

5267

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

564

2025.10.23

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

608

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

989

2023.11.28

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

0

2026.09.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn