JAVA学生信息管理系统(项目概述、分析设计、代码实现)

一、项目信息

1.1 名称

学生信息管理系统

1.2 项目描述

  1. 请使用Java语言设计并实现一个“学生信息管理系统”。该系统能够管理多个学生的基本信息、课程成绩、以及提供简单的统计功能。通过这个系统可以:
    1. 添加新的学生信息;
    2. 查询学生的详细信息(包括基本信息和成绩);
    3. 修改学生信息和课程成绩;
    4. 统计并显示所有学生的平均成绩;
    5. 显示指定课程的最高分和最低分;
    6. 列出所有学生及其成绩;
    7. 删除学生信息。

1.3 功能需求

  1. 学生信息管理功能:
    1. 使用Arraylist数组来存储多个学生的信息
    2. 每个学生的信息包括:学号、姓名、性别、年龄、所修课程及对应的成绩(支持多门课程)。
    3. 实现增、删、改、查等功能,具体包括:
      1. 增加新学生信息
      2. 修改指定学生的基本信息或成绩
      3. 删除指定学生
      4. 根据学号或姓名查询学生详细信息
  2. 成绩统计功能:
    1. 计算并显示所有学生的平均成绩。
    2. 显示指定课程的最高分和最低分。

1.4 类的设计要求

  1. 类设计:
    1. 创建一个Student类,包含学生的基本信息(如学号、姓名、性别、年龄)以及课程成绩。
    2. 使用封装来保护类的属性,提供gettersetter方法。
      1. 实例中public方法是外部类访问该类成员变量的入口。通常情况下,这些方法被称为getter和setter方法。因此,任何要访问类中私有成员变量的类都要通过这些getter和setter方法。
      2. 参考文章:菜鸟教程
    3. 为学生类实现一个toString()方法,用于格式化输出学生信息。
  2. 继承与多态:
    1. 设计一个抽象类Person,其中包含基础的个人信息(如姓名、性别、年龄)和基本的行为(如displayInfo()方法)。让Student类继承自Person类,并实现具体的行为。
  3. 组合:
    1. 学生类中的课程成绩可以设计为一个组合类,如Course类,其中包含课程名称和成绩。

1.5 程序结构要求

  1. 面向对象的设计:运用类、继承、封装、多态和组合的概念。
  2. 数组的应用:用数组或ArrayList来管理学生对象。
  3. 流程控制:程序中需要包含用户交互界面(命令行),如通过菜单操作实现添加、查询、删除、统计功能。
  4. 数据类型与类型转换:注意数据类型的合理使用,如年龄为整数,成绩为浮点数。并在适当场景下实现类型转换。

1.6 次要功能

  1. 提供课程成绩的排序功能,按指定课程的成绩从高到低排序输出学生信息。
  2. 使用异常处理来应对用户输入错误(如输入无效的学号、年龄或成绩)。

二、JAVA设计前置基础知识

2.1 JAVA对象、类

2.1.1 JAVA中的类

  1. 类可以看成是创建 Java 对象的模板
    alt text
  2. 一个类可以包含以下类型变量
    1. 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
    2. 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
    3. 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。

2.1.2 JAVA中的对象

  1. 软件对象的状态就是属性,行为通过方法体现。
  2. 对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:
    1. 声明:声明一个对象,包括对象名称和对象类型。
    2. 实例化:使用关键字 new 来创建一个对象。
    3. 初始化:使用 new 创建对象时,会调用构造方法初始化对象。

2.1.3 源文件声明规则

  1. 一个源文件中只能有一个 public 类
  2. 一个源文件可以有多个非 public 类
  3. 源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么文件应该命名为Employee.java。
  4. 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行。
  5. 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面。
  6. import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。

2.2 JAVA变量类型

  1. 静态变量或类变量(Class Variables):
    1. 类变量是在类中用 static 关键字声明的变量,它们属于类而不是实例,所有该类的实例共享同一个类变量的值,类变量在类加载时被初始化,而且只初始化一次。由于静态变量是与类相关的,因此可以通过类名来访问静态变量,也可以通过实例名来访问静态变量。
    2. 静态变量(也称为类变量)的命名规范通常遵循驼峰命名法,并且通常使用全大写字母,单词之间用下划线分隔,并且要用 static 关键字明确标识。
      1. 使用驼峰命名法:静态变量的命名应该使用驼峰命名法,即首字母小写,后续每个单词的首字母大写。例如:myStaticVariable。
  2. Java String 类
    1. 字符串广泛应用在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

2.3 JAVA修饰符

修饰符用来定义类、方法或者变量,通常放在语句的最前端。

  1. 访问控制修饰符
    1. Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限
      1. private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
      2. public : 对所有类可见。使用对象:类、接口、变量、方法
      3. protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
        alt text
  2. 非访问控制修饰符
    1. static 修饰符,用来修饰类方法和类变量。
    2. final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
    3. abstract 修饰符,用来创建抽象类和抽象方法。

2.4 JAVA循环结构

  1. Java 增强 for 循环
    1. Java5 引入了一种主要用于数组的增强型 for 循环
for(声明语句 : 表达式)
{
   //代码句子
}
  1. 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
  2. 表达式:表达式是要访问的数组名,或者是返回值为数组的方法。

2.5 JAVA方法

  1. System.out.println()
    1. println() 是一个方法
    2. System 是系统类
    3. out 是标准输出对象
    4. 因此,这句话的用法是:调用系统类 System 中的标准输出对象 out 中的方法 println()。
  2. 方法(函数)的命名规则
    1. 方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson
  3. 方法重载
    1. 在同一个类中,创建另一个有相同名字但参数不同的方法即为方法的重载,即一个类的两个方法拥有相同的名字,但是有不同的参数列表。
    2. 重载的方法必须拥有不同的参数列表。你不能仅仅依据修饰符或者返回类型的不同来重载方法
  4. 构造方法
    1. 当一个对象被创建时候,构造方法用来初始化该对象。构造方法和它所在类的名字相同,但构造方法没有返回值。
    2. 每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。

2.5.1 JAVA toString方法

2.6 Java获取用户输入与输出

2.6.1 Java Scanner 类

  1. java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。
  2. 参考资料
    1. 菜鸟教程

2.6.2 JAVA输出

  1. 浮点输出保留位数处理
double d=3.1415926;
double e=3.465;
System.out.println(String.format("%.2f", d));
System.out.println(String.format("%.2f", e));
  1. System.out.printf("%.2f%n",d);
  2. 输出:3.14、3.47(保留两位小数)

2.6.3 JAVA的函数参数传递

  1. 参考资料
    1. 阿里云:在 Java 中如何将 ArrayList 作为参数传递

2.7 JAVA异常处理

2.8 JAVA继承

2.8.1 继承的概念

  1. 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
  2. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。继承需要符合的关系是:父类更通用,子类更具体。

2.8.2 类的继承格式

  1. 在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
class 父类 {
}
 
class 子类 extends 父类 {
}

2.8.3 继承的特性

  1. 子类拥有父类非 private 的属性、方法。
  2. 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
  3. 子类可以用自己的方式实现父类的方法。
  4. Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
  5. 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

2.8.3 super 与 this 关键字

  1. super 关键字:我们可以通过 super 关键字来实现对父类成员的访问,用来引用当前对象的父类。
  2. this 关键字:指向自己的引用,引用当前对象,即它所在的方法或构造函数所属的对象实例。
class Animal {
    void eat() {
        System.out.println("animal : eat");
    }
}
 
class Dog extends Animal {
    void eat() {
        System.out.println("dog : eat");
    }
    void eatTest() {
        this.eat();   // this 调用自己的方法
        super.eat();  // super 调用父类方法
    }
}
 
public class Test {
    public static void main(String[] args) {
        Animal a = new Animal();
        a.eat();
        Dog d = new Dog();
        d.eatTest();
    }
}

2.8.4 JAVA object类

  1. Java Object类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法。
  2. Object类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承Object,成为Object的子类。
  3. Object类部分方法如下
    alt text
  4. 参考资料
    1. 菜鸟教程

2.9 Java 重写(Override)与重载(Overload)

2.9.1 重写(Override)

  1. 重写(Override)是指子类定义了一个与其父类中具有相同名称、参数列表和返回类型的方法,并且子类方法的实现覆盖了父类方法的实现。 即外壳不变,核心重写!
  2. 重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。这样,在使用子类对象调用该方法时,将执行子类中的方法而不是父类中的方法。

2.9.2 重载(Overload)

  1. 重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
  2. 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。

2.9.3 总结

  1. 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
  2. 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
    alt text

2.10 JAVA多态

  1. 多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。
  2. 多态存在的三个必要条件:继承、重写、父类引用指向子类对象:Parent p = new Child();
  3. 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

2.11 JAVA封装

  1. 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

2.11.1 实现封装的步骤

  1. 修改属性的可见性来限制对属性的访问(一般限制为private)
  2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,通常情况下,这些方法被称为getter和setter方法。因此,任何要访问类中私有成员变量的类都要通过这些getter和setter方法。

2.12 JAVA Arraylist

2.12.1 Arraylist介绍

  1. ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
  2. ArrayList 类位于 java.util 包中,使用前需要引入它。
  3. ArrayList 是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
  4. 语法格式如下:
import java.util.ArrayList; // 引入 ArrayList 类

ArrayList<E> objectName =new ArrayList<>();  // 初始化,E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。
  1. 参考资料
    1. 菜鸟教程

2.12.2 将Arraylist写入纯文本文件

后面再说

2.13 JAVA组合类

  1. alt text

2.14 JAVA疑惑

  1. main函数中的传入参数是什么?为什么会有传入参数?

三、项目构思流程

3.1 思维导图绘制

3.1.1 需求思维导图

alt text

3.1.2 模拟运作流程图

alt text

3.1.3 体系架构图

alt text

四、JAVA编程错误处理

4.1 输入输出流

  1. Exception in thread “main“ java.util.NoSuchElementException
    1. 只要确保关闭流之后不会再调用输入流读取方法就可以了,通常把close()方法放在程序末尾.
    2. 参考文章
      1. CSDN:Java编译报错:Exception in thread “main“ java.util.NoSuchElementException(剖析原因理解及解决方法)

五、项目设计说明

5.1 类的设计思路

本项目目前设计了四大类

  1. Person类
    1. 抽象类Person其中包含基础的个人信息(如姓名、性别、年龄)和基本的行为(如displayInfo()方法)。
    2. Person类是Student类的父类。
  2. Student类
    1. Student类包含学生的基本信息(如学号、姓名、性别、年龄)以及课程成绩。
    2. Student类继承自Person类。
    3. Student类使用封装来保护类的属性,提供gettersetter方法。
    4. Student类中实现toString()方法,用于格式化输出学生信息。
    5. Student类中实例化Course类,用于存储该学生课程信息(类的组合)。
  3. Course类
    1. 包含课程名称和成绩
  4. Main类
    1. Main类用于命令行交互,并提供学生信息增删改查的选项。
    2. 由ArryList存储Student类。

5.2 面向对象编程特性应用

package Students_Information_Management;

class Student extends Person{
    private String ID; //ID为子类属性,父类属性使用super访问,子类属性使用this引用。

    public void setName(String name) { //定义getter和setter方法,访问父类属性
        super.name = name;
    }
    public String getName() {
        return super.name;
    }
    public void setSex(String sex) {
        super.sex = sex;
    }
    public String getSex() {
        return super.sex;
    }
    public void setAge(int age) {
        super.age = age;
    }
    public int getAge() {
        return super.age;
    }
    public void setID(String ID) { //定义getter和setter方法,访问子类属性
        this.ID = ID;
    }
    public String getID() {
        return this.ID;
    }

    private Course course = new Course();
    public void setOperateSystemGrades(int operateSystemGrades) { //定义getter和setter方法,访问Course类属性operateSystemGrades
        course.operateSystemGrades = operateSystemGrades;
    }
    public float getOperateSystemGrades() {
        return course.operateSystemGrades;
    }
    public void setComputerNetworkGrades(int computerNetworkGrades) { //定义getter和setter方法,访问Course类属性computerNetworkGrades
        course.computerNetworkGrades = computerNetworkGrades;
    }
    public float getComputerNetworkGrades() {
        return course.computerNetworkGrades;
    }
    public void setDataStructureGrades(int dataStructureGrades) { //定义getter和setter方法,访问Course类属性dataStructureGrades
        course.dataStructureGrades = dataStructureGrades;
    }
    public float getDataStructureGrades() {
        return course.dataStructureGrades;
    }
    public void setDataBaseGrades(int dataBaseGrades) { //定义getter和setter方法,访问Course类属性dataBaseGrades
        course.dataBaseGrades = dataBaseGrades;
    }
    public float getDataBaseGrades() {
        return course.dataBaseGrades;
    }

    @Override
    public String toString() { //重写toString()函数
        return "Student:name=" + super.name + " ID=" + this.ID + " sex=" + this.sex + " age=" + this.age + " operateSystemGrades=" + course.operateSystemGrades + "分 computerNetworkGrades=" + course.computerNetworkGrades + "分 dataStructureGrades=" + course.dataStructureGrades + "分 dataBaseGrades=" + course.dataBaseGrades + "分";
    }
}
  1. 封装
    1. 使用private关键词封装Student类属性,提供提供gettersetter方法访问Student类属性。
  2. 继承
    1. class Student extends Person表示Student类继承自Person类。
  3. 重写
@Override
    public String toString() { //重写toString()函数
        return "Student:name=" + super.name + " ID=" + this.ID + " sex=" + this.sex + " age=" + this.age + " operateSystemGrades=" + course.operateSystemGrades + "分 computerNetworkGrades=" + course.computerNetworkGrades + "分 dataStructureGrades=" + course.dataStructureGrades + "分 dataBaseGrades=" + course.dataBaseGrades + "分";
    }
  1. 重写tostring()函数
  2. 组合
    1. private Course course = new Course();在Student类中实例化一个Course类,用于保存学生的课程成绩。

5.3 数组的使用情况

  1. 使用ArryList保存Student类。
  2. 选择ArryList是因为其具有线性结构,且增删查找操作简易,有高度集成接口。

5.4 测试用例

提供若干测试用例,展示系统的增、删、改、查功能及统计功能的测试情况

  1. 输入规范
    1. 姓名:String
    2. 学号:String
    3. 年龄:int
    4. 性别:String
    5. 课程成绩:float
  2. 系统增、删、改、查功能请具体操作。

六、提升与改进

6.1 本项目目前存在的问题

  1. Main类中的代码块有多段重复,模块化程度不高。
  2. 对学生信息的输入异常处理不完备(如学号位数、年龄区间等)

6.2 本项目可提升的空间

  1. 当前我们利用ArrayList存储创建的Student类,一旦程序停止运行,存储在内存中的信息会全部被清除。为了能够保留创建的包含Student类的ArrayList,我们可以将ArrayList写入到本地硬盘中,下次加载时将ArrayList读入程序即可实现数据的保留。或者可结合数据库做相应实现。
  2. 命令行界面有些简陋,可做适当的UI设计。

七、提交项目的完整代码清单

/*
Person类
*/
package Students_Information_Management;

class Person {
    protected String name;
    protected String sex;
    protected int age;

    protected void displayInfo() {
    }
}
/*
Student类(继承自Person类)
*/
package Students_Information_Management;

class Student extends Person{
    private String ID; //ID为子类属性,父类属性使用super访问,子类属性使用this引用。

    public void setName(String name) { //定义getter和setter方法,访问父类属性
        super.name = name;
    }
    public String getName() {
        return super.name;
    }
    public void setSex(String sex) {
        super.sex = sex;
    }
    public String getSex() {
        return super.sex;
    }
    public void setAge(int age) {
        super.age = age;
    }
    public int getAge() {
        return super.age;
    }
    public void setID(String ID) { //定义getter和setter方法,访问子类属性
        this.ID = ID;
    }
    public String getID() {
        return this.ID;
    }

    private Course course = new Course();
    public void setOperateSystemGrades(int operateSystemGrades) { //定义getter和setter方法,访问Course类属性operateSystemGrades
        course.operateSystemGrades = operateSystemGrades;
    }
    public float getOperateSystemGrades() {
        return course.operateSystemGrades;
    }
    public void setComputerNetworkGrades(int computerNetworkGrades) { //定义getter和setter方法,访问Course类属性computerNetworkGrades
        course.computerNetworkGrades = computerNetworkGrades;
    }
    public float getComputerNetworkGrades() {
        return course.computerNetworkGrades;
    }
    public void setDataStructureGrades(int dataStructureGrades) { //定义getter和setter方法,访问Course类属性dataStructureGrades
        course.dataStructureGrades = dataStructureGrades;
    }
    public float getDataStructureGrades() {
        return course.dataStructureGrades;
    }
    public void setDataBaseGrades(int dataBaseGrades) { //定义getter和setter方法,访问Course类属性dataBaseGrades
        course.dataBaseGrades = dataBaseGrades;
    }
    public float getDataBaseGrades() {
        return course.dataBaseGrades;
    }

    @Override
    public String toString() { //重写toString()函数
        return "Student:name=" + super.name + " ID=" + this.ID + " sex=" + this.sex + " age=" + this.age + " operateSystemGrades=" + course.operateSystemGrades + "分 computerNetworkGrades=" + course.computerNetworkGrades + "分 dataStructureGrades=" + course.dataStructureGrades + "分 dataBaseGrades=" + course.dataBaseGrades + "分";
    }
}
/*
Course类:用于Student内的组合设计
*/
package Students_Information_Management;

class Course {
    protected String operateSystem = "操作系统";
    protected float operateSystemGrades = 0;
    protected String computerNetwork = "计算机网络";
    protected float computerNetworkGrades = 0;
    protected String dataStructure = "数据结构";
    protected float dataStructureGrades = 0;
    protected String dataBase = "数据库";
    protected float dataBaseGrades = 0;
}
/*
Statistics类:用于统计函数的汇总
*/
package Students_Information_Management;
import java.util.ArrayList;

class Statistics {
    public static void averageGrades(ArrayList<Student> arrayList, int course) {
        int len = arrayList.size();
        float average = 0;
        switch (course) {
            case 1:
                for(Student student : arrayList)
                    average += student.getOperateSystemGrades();
                average = average / len;
                System.out.println("OperateSystemGrades所有学生平均分为" + average);
                break;
            case 2:
                for(Student student : arrayList)
                    average += student.getComputerNetworkGrades();
                average = average / len;
                System.out.println("ComputerNetworkGrades所有学生平均分为" + average);
                break;
            case 3:
                for(Student student : arrayList)
                    average += student.getDataStructureGrades();
                average = average / len;
                System.out.println("DataStructureGrades所有学生平均分为" + average);
                break;
            case 4:
                for(Student student : arrayList)
                    average += student.getDataBaseGrades();
                average = average / len;
                System.out.println("DataBaseGrades所有学生平均分为" + average);
                break;
        }
    }
    public static void maxAndMinGrades(ArrayList<Student> arrayList, int course) {
        float max = 0, min = 0;
        switch (course) {
            case 1:
                min = arrayList.getFirst().getOperateSystemGrades();
                for(Student student : arrayList) {
                    if(student.getOperateSystemGrades() > max)
                        max = student.getOperateSystemGrades();
                    if (student.getOperateSystemGrades() < min)
                        min = student.getOperateSystemGrades();
                }
                System.out.println("OperateSystemGrades的最高分为:" + max + " ,最低分为:" + min + "。");
                break;
            case 2:
                min = arrayList.getFirst().getComputerNetworkGrades();
                for(Student student : arrayList) {
                    if(student.getComputerNetworkGrades() > max)
                        max = student.getComputerNetworkGrades();
                    if (student.getComputerNetworkGrades() < min)
                        min = student.getComputerNetworkGrades();
                }
                System.out.println("ComputerNetworkGrades的最高分为:" + max + " ,最低分为:" + min + "。");
                break;
            case 3:
                min = arrayList.getFirst().getDataStructureGrades();
                for(Student student : arrayList) {
                    if(student.getDataStructureGrades() > max)
                        max = student.getDataStructureGrades();
                    if (student.getDataStructureGrades() < min)
                        min = student.getDataStructureGrades();
                }
                System.out.println("DataStructureGrades的最高分为:" + max + " ,最低分为:" + min + "。");
                break;
            case 4:
                min = arrayList.getFirst().getDataBaseGrades();
                for(Student student : arrayList) {
                    if(student.getDataBaseGrades() > max)
                        max = student.getDataBaseGrades();
                    if (student.getDataBaseGrades() < min)
                        min = student.getDataBaseGrades();
                }
                System.out.println("DataBaseGrades的最高分为:" + max + " ,最低分为:" + min + "。");
                break;
        }
    }
    public static void printNameAndGrades(ArrayList<Student> arrayList) {
        System.out.println("姓名    OperateSystemGrades    ComputerNetworkGrades    DataStructureGrades    DataBaseGrades");
        for (Student student : arrayList)
            System.out.println(student.getName() + "            " + student.getOperateSystemGrades() + "                     " + student.getComputerNetworkGrades() + "                 " + student.getDataStructureGrades() + "                  " + student.getDataBaseGrades());
    }
}
/*
Main类:命令行控制,实现学生信息管理系统
*/
package Students_Information_Management;
import java.util.Objects;
import java.util.Scanner;
import java.io.IOException;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        ArrayList<Student> studentManager = new ArrayList<Student>();
        while(true) {
            int select = 0;
            System.out.println("(1)添加学生信息\n(2)查询学生信息\n(3)删除学生信息\n(4)修改学生信息\n(5)统计成绩信息\n(6)退出程序\n请输入您的操作选项:");
            Scanner scan = new Scanner(System.in); //利用scanner读取用户输入
            if(scan.hasNextInt()) { //判断输入是否是一个合法整数,**属于异常处理**
                select = scan.nextInt();
            }
            else {
                System.err.println("输入错误,请重新选择!");
                continue;
            }
            if(select == 1) {
                Student newstudent = new Student();
                System.out.println("请输入待添加的学生姓名:");
                Scanner scan11 = new Scanner(System.in);
                String info11 = scan11.next();
                newstudent.setName(info11);
                System.out.println("请输入" + newstudent.getName() + "的学号:");
                Scanner scan12 = new Scanner(System.in);
                String info12 = scan12.next();
                newstudent.setID(info12);
                System.out.println("请输入" + newstudent.getName() + "的性别:");
                Scanner scan13 = new Scanner(System.in);
                String info13 = scan13.next();
                newstudent.setSex(info13);
                System.out.println("请输入" + newstudent.getName() + "的年龄:");
                Scanner scan14 = new Scanner(System.in);
                if(scan14.hasNextInt()) { //判断输入是否是一个合法整数,**属于异常处理**
                    int info14 = scan14.nextInt();
                    newstudent.setAge(info14);
                }
                else {
                    System.err.println("输入错误,请重新选择!");
                    continue;
                }
                System.out.println("是否需要添加学生成绩信息?(请输入T/F)");
                char scan15 = '0';
                try {
                    scan15 = (char)System.in.read();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if(scan15 == 'T') {  //输入学生成绩信息
                    System.out.println("请输入" + newstudent.getName() + "的operateSystemGrades:");
                    Scanner scan16 = new Scanner(System.in);
                    int info16 = scan16.nextInt();
                    newstudent.setOperateSystemGrades(info16);
                    System.out.println("请输入" + newstudent.getName() + "的computerNetworkGrades:");
                    Scanner scan17 = new Scanner(System.in);
                    int info17 = scan17.nextInt();
                    newstudent.setComputerNetworkGrades(info17);
                    System.out.println("请输入" + newstudent.getName() + "的dataStructureGrades:");
                    Scanner scan18 = new Scanner(System.in);
                    int info18 = scan18.nextInt();
                    newstudent.setDataStructureGrades(info18);
                    System.out.println("请输入" + newstudent.getName() + "的dataBaseGrades:");
                    Scanner scan19 = new Scanner(System.in);
                    int info19 = scan19.nextInt();
                    newstudent.setDataBaseGrades(info19);
                    studentManager.add(newstudent);
                }
                else {
                    studentManager.add(newstudent);
                    continue;
                }
            }
            else if(select == 2) {
                System.out.println("请输入待查询学生姓名:");
                Scanner scan21 = new Scanner(System.in);
                String info21 = scan21.next();
                int flag1 = 0; //做个标记
                for(Student student : studentManager) {
                    if(Objects.equals(student.getName(), info21)) {
                        flag1++;  //遍历后如果找到了就给个标记
                        System.out.println(student.toString());
                        Thread.sleep(2000);  //输出信息后延迟两秒再进入下一循环
                        break;
                    }
                }
                if(flag1 == 0) //证明没找到
                    System.out.println("学生"+ info21 + "信息不存在。");
            }
            else if(select == 3) {
                System.out.println("请输入待删除学生的姓名:");
                Scanner scan31 = new Scanner(System.in);
                String info31 = scan31.next();
                int flag2 = 0;
                for(Student student : studentManager) {
                    if(Objects.equals(student.getName(), info31)) {
                        flag2++;
                        studentManager.remove(student);
                        System.out.println(info31 + "信息已被删除!");
                    }
                }
                if(flag2 == 0)
                    System.out.println("学生不存在!");
            }
            else if(select == 4) {
                System.out.println("请输入待修改学生的姓名:");
                Scanner scan41 = new Scanner(System.in);
                String info41 = scan41.next();
                int flag3 = 0;
                for(Student student : studentManager) {
                    if(Objects.equals(student.getName(), info41)) {
                        flag3++;
                        while(true){
                            int flag4 = 0;
                            System.out.println("请选择您想修改的" + info41 + "的信息");
                            System.out.println("(1)姓名\n(2)学号\n(3)性别\n(4)年龄\n(5)OperateSystemGrades\n(6)ComputerNetworkGrades\n(7)DataStructureGrades\n(8)DataBaseGrades\n(9)退出");
                            Scanner scan42 = new Scanner(System.in);
                            int info42 = scan42.nextInt();
                            switch (info42) {
                                case 1:
                                    String temp1 = student.getName();
                                    System.out.println("请输入修改后学生的姓名:");
                                    Scanner scan43 = new Scanner(System.in);
                                    String info43 = scan43.next();
                                    student.setName(info43);
                                    System.out.println(temp1 + "的姓名已改为" + student.getName());
                                    info41 = info43;
                                    break;
                                case 2:
                                    String temp2 = student.getID();
                                    System.out.println("请输入修改后学生的学号:");
                                    Scanner scan44 = new Scanner(System.in);
                                    String info44 = scan44.next();
                                    student.setID(info44);
                                    System.out.println(info41 + "的学号已由" + temp2 + "改为" + student.getID());
                                    break;
                                case 3:
                                    String temp3 = student.getSex();
                                    System.out.println("请输入修改后学生的性别:");
                                    Scanner scan45 = new Scanner(System.in);
                                    String info45 = scan45.next();
                                    student.setID(info45);
                                    System.out.println(info41 + "的性别已由" + temp3 + "改为" + student.getSex());
                                    break;
                                case 4:
                                    int temp4 = student.getAge();
                                    System.out.println("请输入修改后学生的年龄:");
                                    Scanner scan46 = new Scanner(System.in);
                                    int info46 = scan46.nextInt();
                                    student.setAge(info46);
                                    System.out.println(info41 + "的年龄已由" + temp4 + "改为" + student.getAge());
                                    break;
                                case 5:
                                    float temp5 = student.getOperateSystemGrades();
                                    System.out.println("请输入修改后学生的OperateSystemGrades:");
                                    Scanner scan47 = new Scanner(System.in);
                                    int info47 = scan47.nextInt();
                                    student.setOperateSystemGrades(info47);
                                    System.out.println(info41 + "的OperateSystemGrades已由" + temp5 + "改为" + student.getOperateSystemGrades());
                                    break;
                                case 6:
                                    float temp6 = student.getComputerNetworkGrades();
                                    System.out.println("请输入修改后学生的ComputerNetworkGrades:");
                                    Scanner scan48 = new Scanner(System.in);
                                    int info48 = scan48.nextInt();
                                    student.setComputerNetworkGrades(info48);
                                    System.out.println(info41 + "的ComputerNetworkGrades已由" + temp6 + "改为" + student.getComputerNetworkGrades());
                                    break;
                                case 7:
                                    float temp7 = student.getDataStructureGrades();
                                    System.out.println("请输入修改后学生的DataStructureGrades:");
                                    Scanner scan49 = new Scanner(System.in);
                                    int info49 = scan49.nextInt();
                                    student.setDataStructureGrades(info49);
                                    System.out.println(info41 + "的DataStructureGrades已由" + temp7 + "改为" + student.getDataStructureGrades());
                                    break;
                                case 8:
                                    float temp8 = student.getDataBaseGrades();
                                    System.out.println("请输入修改后学生的DataBaseGrades:");
                                    Scanner scan410 = new Scanner(System.in);
                                    int info410 = scan410.nextInt();
                                    student.setDataStructureGrades(info410);
                                    System.out.println(info41 + "的DataBaseGrades已由" + temp8 + "改为" + student.getDataBaseGrades());
                                    break;
                                case 9:
                                    flag4++;
                                    break;
                                default:
                                    System.out.println("输入选择错误,请重新输入!");
                                    break;
                            }
                            if(flag4 == 1)
                                break;
                        }
                    }
                }
                if (flag3 == 0)
                    System.out.println("学生不存在!");
            }
            else if(select == 5) {
                while (true) {
                    int flag5 = 0;
                    System.out.println("请选择您将统计的信息:");
                    System.out.println("(1)平均分\n(2)最高/最低分\n(3)所有学生的各门课程成绩汇总\n(4)退出");
                    Scanner scan51 = new Scanner(System.in);
                    if (scan51.hasNextInt()) {
                        int info51 = scan51.nextInt();
                        switch (info51) {
                            case 1:  //计算平均分
                                while(true) {
                                    System.out.println("请选择您想查询平均分的课程:");
                                    System.out.println("(1)OperateSystemGrades\n(2)ComputerNetworkGrades\n(3)DataStructureGrades\n(4)DataBaseGrades\n(5)退出查询");
                                    Scanner scan52 = new Scanner(System.in);
                                    if (scan52.hasNextInt()) {
                                        int info52 = scan52.nextInt();
                                        if (info52 < 1 || info52 > 5) {
                                            System.out.println("输入选择错误,请重新选择!");
                                            continue;
                                        }
                                        if(info52 == 5)
                                            break;
                                        if (studentManager.isEmpty() || studentManager == null) {
                                            System.out.println("表中暂无学生信息!");
                                            break;
                                        }
                                        Statistics.averageGrades(studentManager, info52); //调用计算均值函数
                                    }
                                    else {
                                        System.err.println("输入选择错误,请重新选择!");
                                    }
                                }
                                break;
                            case 2: // 每门课的最高/最低分
                                while(true) {
                                    System.out.println("请选择您想查询最高/最低分的课程:");
                                    System.out.println("(1)OperateSystemGrades\n(2)ComputerNetworkGrades\n(3)DataStructureGrades\n(4)DataBaseGrades\n(5)退出查询");
                                    Scanner scan53 = new Scanner(System.in);
                                    if (scan53.hasNextInt()) {
                                        int info53 = scan53.nextInt();
                                        if (info53 < 1 || info53 > 5) {
                                            System.out.println("输入选择错误,请重新选择!");
                                            continue;
                                        }
                                        if(info53 == 5)
                                            break;
                                        if (studentManager.isEmpty() || studentManager == null) {
                                            System.out.println("表中暂无学生信息!");
                                            break;
                                        }
                                        Statistics.maxAndMinGrades(studentManager, info53); //调用计算最高/最低分函数
                                    }
                                    else {
                                        System.err.println("输入选择错误,请重新选择!");
                                    }
                                }
                                break;
                            case 3: //成绩汇总打印
                                Statistics.printNameAndGrades(studentManager);
                            case 4:
                                flag5++;
                                break;
                            default:
                                System.out.println("输入选择错误,请重新输入!");
                                break;
                        }
                        if(flag5 == 1)
                            break;
                    }
                    else {
                        System.err.println("输入选择错误,请重新选择!");
                        continue;
                    }
                }
            }
            else if(select == 6) {
                System.exit(0);
            }
        }
    }
}
posted @ 2024-10-29 08:44  宇星海  阅读(1763)  评论(1)    收藏  举报