Java的编程之旅44——学生信息管理系统

news2024/11/25 10:41:07

目录

1.MVC设计模式初探

文件结构的搭建

2.Student类用来初始化学生信息

3.主函数里的两个功能

1.调用初始化学生信息的功能

2.输出欢迎界面功能

4.Global类中方法的编写

5.StuPage类,StuCtrl类,StuModel类中方法的编写

1.查询功能

·selStu方法的编写(StuPage类中)

·selAction方法的编写

1.查询全部信息

·selAllStu方法的编写(StuModel类中)

·ShowStuList方法的编写(StuPage页面中)

 2.按学号查询

·getStuID方法的编写

·getbyStuID方法的编写

3.按姓名查询

·getStuName方法编写

·getbyStuName方法的编写

4.按性别查询

·getStuSex方法编写

·getbyStuSex方法编写

 5.按年龄查询

·getStuAge方法编写

·getbyStuAge方法编写

  6.按成绩查询

·getStuScore方法编写

·getbyStuScore方法编写

2.添加功能

·addStu功能的编写

·doAddStu方法的编写

3.修改功能

·editStu()方法的编写

·doUpdate方法的编写 

4.删除功能

·delAlert()方法的编写

·doDelStuID()方法的编写

·StuPage.failed()方法的编写

 6.完整代码

1.Student类

2.Global类

3.StuPage类

4.StuCtrl类

5.StuModel类

7.StuMain类


1.MVC设计模式初探

学生信息管理系统是对前面的基础知识的一个综合运用

用到了MVC的设计模式

MVC是一种软件设计模式,用于将应用程序的逻辑进行分离和组织。MVC代表Model-View-Controller,即模型-视图-控制器。

模型(Model)是应用程序中处理数据逻辑的部分。它管理应用程序中的数据,并定义了数据的操作和访问方式。

视图(View)是用户界面的部分。它负责将数据呈现给用户,并根据用户的输入更新数据。

控制器(Controller)是连接模型和视图的部分。它接收用户的输入,并根据输入更新模型和视图。

MVC模式的优势在于分离了应用程序的不同部分,使得逻辑更加清晰和可维护。模型与视图分离,使得数据和展示相互独立,方便对数据的增删改查操作和UI的修改。控制器作为中间人,负责协调模型和视图之间的交互。

MVC模式也提供了良好的可扩展性和可重用性。不同的模型和视图可以被重复使用,因为它们之间的关系已经定义清楚。新的模型和视图可以很容易地添加到应用程序中。

总之,MVC设计模式通过将应用程序的逻辑分离和组织,提供了一种灵活和可维护的架构,使得开发人员可以更方便地开发和维护应用程序。

文件结构的搭建

首先创建一下文件结构

1.Student类用来初始化学生信息

2.Global类用来搭载学生信息

3.StuPage类用来显示初始化界面

4.StuCtrl类用来实现功能调度,增删改查

5.StuModel类存储数据、处理数据逻辑和提供数据操作的接口的作用


2.Student类用来初始化学生信息

我们来构思一下思路,学生信息管理系统最基本的实现学生信息的增删改查。首先我们需要学生信息,则需要在Student类中来初始化一下学生信息,定义一些和学生相关的属性。

public class Student {
    private int id;
    private String name;
    private String sex;
    private int age;
    private float score;

    public Student() {
    }

    public Student(String name, String sex, int age, float score) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.score = score;
    }

    public Student(int id, String name, String sex, int age, float score) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.score = score;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public float getScore() {
        return score;
    }

    public void setScore(float score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}

这段代码定义了一个名为 Student 的Java类,用于表示学生对象。下面是对代码的解释:

  1. 类的属性包括:

    • id:学生ID,整型。
    • name:学生姓名,字符串类型。
    • sex:学生性别,字符串类型。
    • age:学生年龄,整型。
    • score:学生成绩,浮点型。
  2. 构造方法:

    • 无参构造方法 public Student():创建一个空的学生对象。
    • 带参构造方法 public Student(String name, String sex, int age, float score):根据给定的姓名、性别、年龄和成绩创建学生对象。
    • 带参构造方法 public Student(int id, String name, String sex, int age, float score):根据给定的ID、姓名、性别、年龄和成绩创建学生对象。
  3. Getter 和 Setter 方法:

    • 提供了对私有属性的访问和设置方法,如 getId()setId()getName()setName()getSex()setSex()getAge()setAge()getScore()setScore()
  4. toString() 方法:

    • 重写了 Object 类的 toString() 方法,返回包含学生对象各个属性值的字符串表示,便于打印输出。

通过以上定义,可以在程序中创建 Student 对象,并操作其属性值,同时也可以方便地将对象转换为字符串进行输出显示。


3.主函数里的两个功能

1.调用初始化学生信息的功能

Global.initStudent();

2.输出欢迎界面功能

下面是完整代码

public class StuMain {
    private static StuCtr sc = new StuCtr();//定义静态私有StuCtr类型变量sc,以便在整个StuCtrl类中使用
    public static void main(String[] args) {

        Global.initStudent();     //Global调用initStudent()方法

        while (true){
            int a = StuPage.welcome();//输出欢迎页面,并让用户选择要操作的功能,获取功能对应的序号
            sc.action(a);          //action为“用户操作的行为”的方法
        }

    }
}

这段代码是一个 Java 类 StuMain 的定义,主要包括了一个静态私有变量 sc 和一个 main 方法。下面是对代码的解释:

  1. 类成员:

    • private static StuCtr sc = new StuCtr();:声明了一个静态私有成员变量 sc,类型为 StuCtr。用于在整个 StuMain 类中使用该 StuCtr 实例。
  2. main 方法:

    • public static void main(String[] args):程序的入口方法,是程序执行的起点。
    • Global.initStudent():调用 Global 类中的 initStudent() 方法进行学生信息的初始化。
    • 进入一个无限循环 while (true),一直执行以下步骤:
      • 调用 StuPage.welcome() 方法显示欢迎页面,并获取用户选择的功能序号赋值给变量 a
      • 调用 sc.action(a) 方法,实际上是调用 StuCtr 类中的 action 方法来处理用户选择的操作行为

注意:我写代码的方式是先写出要调用的方法,然后通过alt+enter快捷键去生成所对应的方法,其实这样会使思路更清晰

就像这样,红色的是未生成的方法。


4.Global类中方法的编写

public class Global {
    public static int stuID = 1;
    public static ArrayList<Student> stuList = new ArrayList<>();

    public Global() {
    }

    public static void initStudent() {
        stuList.add(new Student(stuID++,"ZS","1",19,81));
        stuList.add(new Student(stuID++,"LS","0",18,86));
        stuList.add(new Student(stuID++,"WU","1",20,78));
        stuList.add(new Student(stuID++,"ZL","0",19,80));
        stuList.add(new Student(stuID++,"NQ","1",20,87));
    }
}

这段代码是一个Java类 Global,其中定义了一个静态变量 stuID 和一个静态 ArrayList 存放 Student 对象。在构造方法中没有具体的代码实现,而在 initStudent() 方法中,向 stuList 中添加了五个 Student 对象,每个学生对象包括学号、姓名、性别、年龄和分数。每次添加完一个学生对象后,stuID 自增 1。这段代码的作用是初始化学生数据并存储在 stuList 列表中


5.StuPage类,StuCtrl类,StuModel类中方法的编写

接下来回到主函数中alt+enter 快捷键进入welcom()方法,在StuPage类中编写

public class StuPage {

    public StuPage() {
    }

    public static int welcome() {
        System.out.println("******* 欢迎进入学生管理系统*********");
        System.out.println("********1.查看学生信息*************");
        System.out.println("********2.增加学生信息*************");
        System.out.println("********3.修改学生信息*************");
        System.out.println("********4.删除学生信息*************");
        System.out.println("********0.退出学生管理系统**********");
        int a;
        do {
            System.out.println("请输入功能选项:");
            a = new Scanner(System.in).nextInt();
        }while (a>4 || a<0);
        return a;
    }
}

这段代码是一个名为 StuPage 的 Java 类,其中定义了一个静态方法 welcome()。在该方法中,首先打印欢迎信息和一些选项,然后使用 do-while 循环来接受用户输入的功能选项。循环会要求用户输入一个整数,并检查输入是否在 0 到 4 之间(包括 0 和 4)。如果输入不在这个范围内,就会提示用户重新输入,直到输入符合要求才跳出循环并返回该值。

这段代码的作用是展示学生管理系统的主页面,让用户选择不同的操作(查看学生信息、增加学生信息、修改学生信息、删除学生信息或退出系统),并返回用户选择的功能选项。


再回到主函数中alt+enter 快捷键进入action()方法,在StuCtrl类中编写增删改查退出功能

1.查询功能

思路

定义二级查询菜单,通过二级界面获取一个查询请求,二级菜单的调度
public class StuCtr {

    public StuCtr() {
    }

    public void action(int a) {
        switch (a){
            case 0://退出
                System.out.println("退出");
                System.exit(0);
                break;
            case 1://查询
                int ss = StuPage.selStu();
                selAction(ss);
                break;
            case 2://添加
                break;
            case 3://修改
                break;
            case 4://删除
                break;

        }
    }

}

该代码是一个名为StuCtr的类,用于控制学生信息的操作。

构造方法:

  • StuCtr():无参构造方法。

方法:

  • action(int a):根据传入的参数a的值执行不同的操作。具体操作如下:
    • 当a为0时,执行退出操作,输出"退出",并使用System.exit(0)方法退出程序。
    • 当a为1时,执行查询操作,调用StuPage类的selStu()方法获取用户输入的查询条件,并调用selAction()方法执行查询操作。
    • 当a为2时,执行添加操作。
    • 当a为3时,执行修改操作。
    • 当a为4时,执行删除操作。

·selStu方法的编写(StuPage类中)


    public static int selStu() {
        System.out.println("**查询功能选择界面**");
        System.out.println("** 1. 查询全部   **");
        System.out.println("** 2. 按学号查询 **");
        System.out.println("** 3. 按姓名查询 **");
        System.out.println("** 4. 按性别查询 **");
        System.out.println("** 5. 按年龄查询 **");
        System.out.println("** 6. 按成绩查询 **");
        System.out.println("** 0. 退出查询   **");
        System.out.println("*****************");
        int a;
        do{
            a = new Scanner(System.in).nextInt();
        }while (a>6 || a<0);
        return a;

    }

·selAction方法的编写

1.查询全部信息
private static StuModel sm = new StuModel();
    private void selAction(int ss) {
        switch (ss){
            case 0:
                System.out.println("退出查询功能");
                System.exit(0);
                break;
            case 1:
                ArrayList<Student> allStu = sm.selAllStu();
                StuPage.ShowStuList(allStu);
                break;
            case 2:break;
            case 3:break;
            case 4:break;
            case 5:break;
            case 6:break;
        }
    }

·selAllStu方法的编写(StuModel类中)
public class StuModel {
    public ArrayList<Student> selAllStu() {
        return Global.stuList;
    }
}

该代码是一个名为StuModel的类,其中包含了一个名为selAllStu的方法。

方法体:

  • selAllStu方法是一个公共方法,返回类型为ArrayList<Student>。
  • 方法体内,直接返回了一个全局变量Global.stuList,这是一个学生对象列表,包含了所有学生的信息。

总结: StuModel类的selAllStu方法用于获取所有学生信息的列表。该方法返回了一个包含所有学生信息的ArrayList<Student>对象。

·ShowStuList方法的编写(StuPage页面中)
public static void ShowStuList(ArrayList<Student> allStu) {
        System.out.printf("┌────┬────────────┬──────┬──────┬──────┐ \n");
        System.out.printf("│%-4s│%-12s│%-6s│%-6s│%-6s│ \n","ID","NAME","SEX","AGE","SCORE");
        for (Student stu:
                allStu) {
            System.out.printf("├────┼────────────┼──────┼──────┼──────┤\n");
            System.out.printf("│ %-4d %-12s %-6s %-6d %-6.1f\n",stu.getId(),stu.getName(),stu.getSex(),stu.getAge(),stu.getScore());
        }
        System.out.printf("└────┴────────────┴──────┴──────┴──────┘\n");
    }

该代码是一个名为ShowStuList的静态方法,用于展示学生信息列表。

参数:

  • ArrayList<Student> allStu:包含所有学生信息的学生对象列表。

方法体:

  • 首先,使用System.out.printf()方法打印表格的表头。表头包括ID、NAME、SEX、AGE和SCORE这五个字段,使用"│%-4s│%-12s│%-6s│%-6s│%-6s│"的格式控制各字段的宽度和对齐方式。
  • 然后,使用一个for-each循环遍历allStu列表中的每个学生对象。
    • 在循环中,首先打印表格的分隔行。
    • 然后,使用System.out.printf()方法打印每个学生对象的信息。使用"│ %-4d %-12s %-6s %-6d %-6.1f"的格式控制各字段的宽度和对齐方式,并传入stu对象的getId()、getName()、getSex()、getAge()和getScore()方法的返回值作为参数。
  • 最后,打印表格的结束行。

总结: 该方法用于在控制台打印学生信息列表的表格形式,每个学生信息占据一行。每行包括ID、NAME、SEX、AGE和SCORE这五个字段的信息,并使用表格的形式展示出来。


 2.按学号查询

private static StuModel sm = new StuModel();
    private void selAction(int ss) {
        switch (ss){
            case 0:
                System.out.println("退出查询功能");
                System.exit(0);
                break;
            case 1:
                ArrayList<Student> allStu = sm.selAllStu();
                StuPage.ShowStuList(allStu);
                break;
            case 2://按学号查询
                int StuID = StuPage.getStuID(); //获取学生ID
                ArrayList<Student>  getStuID = sm.getbyStuID(StuID);//通过学生ID获取学生信息
                StuPage.ShowStuList(getStuID);
                break;
            case 3://按姓名查询
                break;
            case 4:break;
            case 5:break;
            case 6:break;
        }
    }

 case 2:获取学生ID,然后通过StuModel的getbyStuID方法获取指定学生信息的列表,并通过StuPage类的ShowStuList方法显示学生列表。

·getStuID方法的编写
 public static int getStuID() {
        System.out.println("输入学生学号:");
        return new Scanner(System.in).nextInt();
    }
·getbyStuID方法的编写
public ArrayList<Student> getbyStuID(int stuID) {
        ArrayList<Student> resList = new ArrayList<>();
        for (Student stu:
             Global.stuList) {
            if(stuID == stu.getId()){
                resList.add(stu);
            }
        }
        return resList;
    }

该代码是StuModel类中的一个方法,用于根据学生ID获取学生信息的列表。

方法体:

  • 方法内部定义了一个名为resList的ArrayList,用于存储符合条件的学生信息。
  • 使用for-each循环遍历Global.stuList中的每个学生对象。
  • 判断当前学生对象的ID是否与参数stuID相等,如果相等则将该学生对象添加到resList中。
  • 循环结束后,返回resList。

总结: getbyStuID方法通过遍历学生列表,将ID与参数stuID相等的学生信息添加到另一个列表中并返回。这样可以根据学生ID获取对应的学生信息列表。


3.按姓名查询

代码思路和按学号查询的完全一样

case 3://按姓名查询
String StuName = StuPage.getStuName();
ArrayList<Student> getStuName = sm.getbyStuName(StuName);
StuPage.ShowStuList(getStuName);
break;

先,它从界面类(StuPage)获取用户输入的学生姓名(StuName)。

然后,它调用学生管理类(sm)的getbyStuName()方法,传递StuName作为参数来查询学生列表。

查询结果是一个包含符合条件的学生对象的ArrayList。

最后,它调用StuPage的ShowStuList()方法,将查询结果作为参数来显示符合条件的学生列表。

·getStuName方法编写
     public static String getStuName() {
        System.out.println("输入学生姓名:");
        return new Scanner(System.in).nextLine();
    }

该代码片段是一个静态方法,方法名称为getStuName。该方法的作用是获取用户输入的学生姓名,并将其作为字符串返回。

在方法内部,首先会打印一条消息提示用户输入学生姓名。然后,使用Scanner类获取用户输入的字符串,这里使用了nextLine()方法。

最后,将获取到的学生姓名作为字符串返回给调用该方法的地方。  

·getbyStuName方法的编写
    public ArrayList<Student> getbyStuName(String stuName) {
        ArrayList<Student> resList = new ArrayList<>();
        for (Student stu:
             Global.stuList) {
            if(stuName == stu.getName()){
                resList.add(stu);
            }
        }
        return resList;
    }

该代码片段是一个方法,方法名称为getbyStuName。该方法接收一个参数stuName,类型为String,表示要查找的学生姓名。

在方法内部,首先创建一个名为resList的ArrayList对象,用于存储符合条件的学生对象。然后,使用for-each循环遍历全局变量Global中的stuList列表,该列表存储了所有学生对象。

在循环中,通过调用stu对象的getName()方法获取学生的姓名,并与传入的stuName进行比较。如果相等,表示找到了目标学生对象,将其添加到resList列表中。

最后,返回resList列表,该列表中存储了所有符合条件的学生对象。


4.按性别查询
case 4://性别
String StuSex = StuPage.getStuSex();
ArrayList<Student> getStuSex = sm.getbyStuSex(StuSex);
StuPage.ShowStuList(getStuSex);
break;
·getStuSex方法编写
    public static String getStuSex() {
        System.out.println("输入学生性别:");
        return new Scanner(System.in).nextLine();
    }
·getbyStuSex方法编写
 public ArrayList<Student> getbyStuSex(String stuSex) {
        ArrayList<Student> resList = new ArrayList<>();
        for (Student stu:
             Global.stuList) {
            if(stuSex == stu.getSex()){
                resList.add(stu);
            }
        }
        return resList;
    }
 5.按年龄查询
case 5://年龄
int StuAge = StuPage.getStuAge();
ArrayList<Student> getStuAge = sm.getbyStuAge(StuAge);
StuPage.ShowStuList(getStuAge);
break;
·getStuAge方法编写
   public static int getStuAge() {
        System.out.println("输入学生年龄:");
        return new Scanner(System.in).nextInt();
    }
·getbyStuAge方法编写
    public ArrayList<Student> getbyStuAge(String stuAge) {
        ArrayList<Student> resList = new ArrayList<>();
        for (Student stu:
             Global.stuList) {
            if(stuAge == stu.getAge()){
                resList.add(stu);
            }
        }
        return resList;
    }
  6.按成绩查询
case 6://成绩
int StuScore = StuPage.getStuScore();
ArrayList<Student> getStuScore = sm.getbyStuScore(StuScore);
StuPage.ShowStuList(getStuScore);
break;
·getStuScore方法编写
   public static int getStuScore() {
        System.out.println("输入学生成绩:");
        return new Scanner(System.in).nextFloat();
    }
·getbyStuScore方法编写
    public ArrayList<Student> getbyStuAge(String stuScore) {
        ArrayList<Student> resList = new ArrayList<>();
        for (Student stu:
             Global.stuList) {
            if(stuSore == stu.getScore()){
                resList.add(stu);
            }
        }
        return resList;
    }

2.添加功能

获取要添加的学生对象,将要添加的学生对象传递给model层来实现
case 2://添加
    while (sm.doAddStu(StuPage.addStu()));
    break;

这段代码是在一个 switch 语句中的 case 2 中的逻辑。

在这段代码中,首先通过调用 StuPage.addStu() 方法获取一个 Student 对象,并将其传递给 sm.doAddStu() 方法进行添加。

接下来,使用 while 循环来不断执行添加学生的操作,直到 sm.doAddStu(StuPage.addStu()) 返回 false

sm.doAddStu(StuPage.addStu()) 返回 false 时,说明添加学生失败,此时循环结束。

·addStu功能的编写

public static Student addStu() {
        System.out.println("输入学生姓名:");
        String name = new Scanner(System.in).nextLine();
        if("over".equals(name)){
            return null;
        }
        System.out.println("输入学生性别:");
        String sex = new Scanner(System.in).nextLine();
        System.out.println("输入学生年龄:");
        int age = new Scanner(System.in).nextInt();
        System.out.println("输入学生成绩:");
        float score = new Scanner(System.in).nextFloat();

        return new Student(name,sex,age,score);
        
    }

这段代码是一个静态方法 addStu,它返回一个类型为 Student 的对象。

在方法的实现中,首先通过调用 System.out.println 打印出提示信息 "输入学生姓名:",然后通过 Scanner 类的 nextLine() 方法,从用户输入中获取学生的姓名,并将其赋值给 name 变量。

接下来,通过比较 name 和字符串 "over" 是否相等,如果相等,则返回 null,表示结束学生输入。

如果 name 不等于 "over",则继续获取学生的性别,通过 System.out.println 打印出提示信息 "输入学生性别:",然后通过 Scanner 类的 nextLine() 方法,从用户输入中获取学生的性别,并将其赋值给 sex 变量。

然后,继续获取学生的年龄,通过 System.out.println 打印出提示信息 "输入学生年龄:",然后通过 Scanner 类的 nextInt() 方法,从用户输入中获取学生的年龄,并将其赋值给 age 变量。

最后,获取学生的成绩,通过 System.out.println 打印出提示信息 "输入学生成绩:",然后通过 Scanner 类的 nextFloat() 方法,从用户输入中获取学生的成绩,并将其赋值给 score 变量

·doAddStu方法的编写

    public boolean doAddStu(Student sa) {
        if (null == sa){
            return false;
        }
        Student student = new Student(
                Global.stuID++,
                sa.getName(),
                sa.getSex(),
                sa.getAge(),
                sa.getScore()
        );
        return Global.stuList.add(student);
    }

这段代码是一个方法,在方法签名中,它返回一个布尔值。方法名是 doAddStu,并且它接受一个类型为 Student 的参数 sa

在方法的实现中,首先进行了一个判断,如果参数 sanull,则返回 false

接下来,通过使用参数 sagetName()getSex()getAge()getScore() 方法,创建了一个新的 Student 对象。在创建新的 Student 对象时,Global.stuID 自增,并将其作为新学生的 ID 属性。

最后,将新创建的学生对象添加到名为 Global.stuList 的列表中,并返回 add() 方法的结果,表示是否成功将学生对象添加到列表中。


3.修改功能

思路:

获取要修改的学生ID,通过ID查出要修改的学生信息,在编辑页面中显示原有的学员信息,并且等待输入新息,更新学员信息
case 3://修改
    int editStuID = StuPage.getStuID();
    ArrayList<Student> editStu = sm.getbyStuID(editStuID);
    Student newStu = StuPage.editStu(editStu.get(0));
    sm.doUpdate(newStu);
    break;

这段代码是在一个 switch 语句中的 case 3 中的逻辑。

在这段代码中,首先调用 StuPage.getStuID() 方法获取要修改的学生的ID。然后,使用该ID调用 sm.getbyStuID() 方法获取与该ID相匹配的学生列表。

接下来,从获取到的学生列表中取出第一个学生对象,并将其作为参数传递给 StuPage.editStu() 方法。该方法会显示该学生的信息,并允许用户修改。

用户修改完学生信息后,得到一个新的学生对象 newStu

最后,将 newStu 作为参数调用 sm.doUpdate() 方法进行更新操作。

·editStu()方法的编写

public static Student editStu(Student student) {
        System.out.println("输入姓名("+student.getName()+"):");
        String name = new Scanner(System.in).nextLine();
        System.out.println("输入性别("+student.getSex()+"):");
        String sex = new Scanner(System.in).nextLine();
        System.out.println("输入年龄("+student.getName()+"):");
        int age = new Scanner(System.in).nextInt();
        System.out.println("输入成绩("+student.getName()+"):");
        Float score = new Scanner(System.in).nextFloat();
        return new Student(student.getId(),name,sex,age,score);
    }

这段代码定义了一个静态方法 editStu(Student student),该方法用于修改学生信息。

在方法中,首先通过 student 参数获取要修改学生的原始信息,并在提示信息中显示出来。然后,分别提示用户输入新的姓名、性别、年龄和成绩。

用户输入完毕后,使用 Scanner 类接收用户输入的新的姓名、性别、年龄和成绩,并将其赋值给对应的变量。

最后,使用原始学生的 ID 和新的姓名、性别、年龄和成绩创建一个新的学生对象,并将其返回。

总结来说,这段代码的作用是在控制台上提示用户输入新的学生信息,并返回一个包含新信息的学生对象。

·doUpdate方法的编写 

 public void doUpdate(Student newStu) {
        for (int i = 0; i < Global.stuList.size(); i++) {
            if (newStu.getId() == Global.stuList.get(i).getId()){
                Global.stuList.set(i,newStu);
                return;
            }
        }

    }

这段代码是一个方法,名为doUpdate,接受一个Student对象作为参数。

该方法的作用是根据传入的Student对象的id属性,在全局变量Global.stuList中查找对应的学生对象,并将传入的Student对象替换掉原来的对象。

具体流程如下:

  • 方法使用一个for循环遍历全局变量Global.stuList中的每一个学生对象。
  • 在循环中,使用if语句判断当前遍历到的学生对象的id属性是否和传入的newStu对象的id属性相同。
  • 如果相同,说明找到了需要更新的学生对象,就把newStu对象替换掉Global.stuList中原来的对象。
  • 最后,使用return语句终止方法的执行。

4.删除功能

思路

获取要删除的学生ID,通过ID查出要删除的学生信息,如果要删除的学生信息存在则删除(先展示学生列表,再显示界面提示删除信息,再开始进行删除操作),不存在则提示不存在
case 4://删除
    int delStu = StuPage.getStuID();
    ArrayList<Student> delStuID = sm.getbyStuID(delStu);
    if (!delStuID.isEmpty()){
        StuPage.ShowStuList(delStuID);
            if (StuPage.delAlert()){
                sm.doDelStuID(delStu);
            }
        }else
    StuPage.failed("删除失败");
    break;

这段代码是一个switch语句的一个case分支,针对选项4(删除)进行处理。

具体流程如下:

  • 首先,从StuPage类中获取输入的待删除学生的ID。
  • 使用StudentManager类的getByStuID方法,根据输入的学生ID从学生管理器中获取学生对象列表delStuID。
  • 使用if语句判断delStuID列表是否为空。
  • 如果不为空,表示找到了对应的学生对象。然后调用StuPage类的ShowStuList方法,展示delStuID列表中的学生信息。
  • 接着,使用StuPage类的delAlert方法,显示一个确认删除的提示框。如果用户确认删除,就调用StudentManager类的doDelStuID方法,删除该学生。
  • 如果delStuID列表为空,表示找不到对应的学生对象,就调用StuPage类的failed方法,显示一个删除失败的提示信息。
  • 最后,使用break语句结束该分支的执行。

·delAlert()方法的编写

public static boolean delAlert() {
        System.out.println("Y/y(确认删除),N/n(取消删除)");
        switch (new Scanner(System.in).nextLine()){
            case "Y":
            case "y":
                return true;
            case "N":
            case "n":
                return false;
            default:
                System.out.println("输入非法,取消删除");
        }
        return false;
    }

这段代码是一个静态方法delAlert(),用于显示一个确认删除的提示信息,并根据用户的输入返回一个布尔值。

具体流程如下:

  • 首先,使用System.out.println()方法在控制台打印出一个确认删除的提示信息,提示用户输入"Y"或"y"表示确认删除,输入"N"或"n"表示取消删除。
  • 使用switch语句对用户输入的字符串进行匹配。
  • 如果用户输入的是"Y"或"y",则返回true,表示确认删除。
  • 如果用户输入的是"N"或"n",则返回false,表示取消删除。
  • 如果用户输入的既不是"Y"也不是"y"也不是"N"也不是"n",则使用System.out.println()方法打印出一个输入非法的提示信息,并继续执行代码。
  • 最后,使用return false语句作为默认情况,返回false,表示取消删除。

·doDelStuID()方法的编写

    public void doDelStuID(int delStu) {
        for (int i = 0; i < Global.stuList.size(); i++) {
            if (delStu == Global.stuList.get(i).getId()){
                Global.stuList.remove(i);
                return;
            }
        }
    }

这段代码是一个方法doDelStuID(int delStu),用于根据给定的学生ID删除学生信息。

具体流程如下:

  • 首先,使用for循环遍历全局变量Global.stuList中的所有学生对象。
  • 在每次循环中,使用if语句判断当前学生对象的ID是否与给定的delStu相等。
  • 如果相等,则使用Global.stuList.remove(i)方法将该学生对象从列表中移除,并返回。
  • 如果不相等,则继续循环判断下一个学生对象。
  • 最后,如果循环结束后仍未找到与给定ID相等的学生对象,则说明删除失败或不存在该学生ID。  

·StuPage.failed()方法的编写

public static void failed(String info) {
        System.out.println("学员信息不存在"+info);
    }

这段代码是一个静态方法failed(String info),用于在控制台输出学员信息不存在的提示信息。

具体流程如下:

  • 首先,使用System.out.println()方法在控制台输出"学员信息不存在"以及传入的info参数。
  • 这段代码的作用是在特定情况下提示用户所输入的学员信息不存在。当找不到对应的学员信息时,可以调用该方法输出提示信息给用户。

 6.完整代码

1.Student类

package com.H.Demo03;

/**
 * @Description:
 * @Author: Hongming
 */
public class Student {
    private int id;
    private String name;
    private String sex;
    private int age;
    private float score;

    public Student(String name, String sex, int age, float score) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.score = score;
    }

    public Student(int id, String name, String sex, int age, float score) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.score = score;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public float getScore() {
        return score;
    }

    public void setScore(float score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}

2.Global类

package com.H.Demo03;

import java.util.ArrayList;

/**
 * @Description:
 * @Author: Hongming
 */
public class Global {
    public static int stuID = 1;
    public static ArrayList<Student> stuList = new ArrayList<>();

    public Global() {
    }

    public static void initStudent() {
        stuList.add(new Student(stuID++,"ZS","1",19,81));
        stuList.add(new Student(stuID++,"LS","0",18,86));
        stuList.add(new Student(stuID++,"WU","1",20,78));
        stuList.add(new Student(stuID++,"ZL","0",19,80));
        stuList.add(new Student(stuID++,"NQ","1",20,87));
    }
}

3.StuPage类

package com.H.Demo03;

import sun.util.locale.provider.FallbackLocaleProviderAdapter;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * @Description:
 * @Author: Hongming
 */
public class StuPage {

    public StuPage() {
    }

    public static int welcome() {
        System.out.println("******* 欢迎进入学生管理系统*********");
        System.out.println("********1.查看学生信息*************");
        System.out.println("********2.增加学生信息*************");
        System.out.println("********3.修改学生信息*************");
        System.out.println("********4.删除学生信息*************");
        System.out.println("********0.退出学生管理系统**********");
        int a;
        do {
            System.out.println("请输入功能选项:");
            a = new Scanner(System.in).nextInt();
        }while (a>4 || a<0);
        return a;
    }


    public static int selStu() {
        System.out.println("**查询功能选择界面**");
        System.out.println("** 1. 查询全部   ** ");
        System.out.println("** 2. 按学号查询 **");
        System.out.println("** 3. 按姓名查询 **");
        System.out.println("** 4. 按性别查询 **");
        System.out.println("** 5. 按年龄查询 **");
        System.out.println("** 6. 按成绩查询 **");
        System.out.println("** 0. 退出查询   **");
        System.out.println("*****************");
        int a;
        do{
            a = new Scanner(System.in).nextInt();
        }while (a>6 || a<0);
        return a;

    }

    public static void ShowStuList(ArrayList<Student> allStu) {
        System.out.printf("┌────┬────────────┬──────┬──────┬──────┐ \n");
        System.out.printf("│%-4s│%-12s│%-6s│%-6s│%-6s│ \n","ID","NAME","SEX","AGE","SCORE");
        for (Student stu:
                allStu) {
            System.out.printf("├────┼────────────┼──────┼──────┼──────┤\n");
            System.out.printf("│ %-4d %-12s %-6s %-6d %-6.1f\n",stu.getId(),stu.getName(),stu.getSex(),stu.getAge(),stu.getScore());
        }
        System.out.printf("└────┴────────────┴──────┴──────┴──────┘\n");
    }

    public static int getStuID() {
        System.out.println("输入学生学号:");
        return new Scanner(System.in).nextInt();
    }

    public static String getStuName() {
        System.out.println("输入学生姓名:");
        return new Scanner(System.in).nextLine();
    }

    public static String getStuSex() {
        System.out.println("输入学生性别:");
        return new Scanner(System.in).nextLine();
    }

    public static int getStuAge() {
        System.out.println("输入学生年龄:");
        return new Scanner(System.in).nextInt();
    }

    public static float getStuScore() {
        System.out.println("输入学生成绩:");
        return new Scanner(System.in).nextFloat();
    }

    public static Student addStu() {
        System.out.println("输入学生姓名:");
        String name = new Scanner(System.in).nextLine();
        if("over".equals(name)){
            return null;
        }
        System.out.println("输入学生性别:");
        String sex = new Scanner(System.in).nextLine();
        System.out.println("输入学生年龄:");
        int age = new Scanner(System.in).nextInt();
        System.out.println("输入学生成绩:");
        float score = new Scanner(System.in).nextFloat();

        return new Student(name,sex,age,score);

    }

    public static Student editStu(Student student) {
        System.out.println("输入姓名("+student.getName()+"):");
        String name = new Scanner(System.in).nextLine();
        System.out.println("输入性别("+student.getSex()+"):");
        String sex = new Scanner(System.in).nextLine();
        System.out.println("输入年龄("+student.getAge()+"):");
        int age = new Scanner(System.in).nextInt();
        System.out.println("输入成绩("+student.getScore()+"):");
        Float score = new Scanner(System.in).nextFloat();
        return new Student(student.getId(),name,sex,age,score);
    }

    public static boolean delAlert() {
        System.out.println("Y/y(确认删除),N/n(取消删除)");
        switch (new Scanner(System.in).nextLine()){
            case "Y":
            case "y":
                return true;
            case "N":
            case "n":
                return false;
            default:
                System.out.println("输入非法,取消删除");
        }
        return false;
    }

    public static void failed(String info) {
        System.out.println("学员信息不存在"+info);
    }
}

4.StuCtrl类

package com.H.Demo03;


import java.util.ArrayList;

/**
 * @Description:
 * @Author: Hongming
 */
public class StuCtr {


    public StuCtr() {
    }

    public void action(int a) {
        switch (a){
            case 0://退出
                System.out.println("退出");
                System.exit(0);
                break;
            case 1://查询
                int ss = StuPage.selStu();
                selAction(ss);
                break;
            case 2://添加
                while (sm.doAddStu(StuPage.addStu()));
                break;
            case 3://修改
                int editStuID = StuPage.getStuID();
                ArrayList<Student> editStu = sm.getbyStuID(editStuID);
                Student newStu = StuPage.editStu(editStu.get(0));
                sm.doUpdate(newStu);
                break;
            case 4://删除
                int delStu = StuPage.getStuID();
                ArrayList<Student> delStuID = sm.getbyStuID(delStu);
                if (!delStuID.isEmpty()){
                    StuPage.ShowStuList(delStuID);
                    if (StuPage.delAlert()){
                        sm.doDelStuID(delStu);
                    }
                }else
                    StuPage.failed("删除失败");
                break;

        }
    }

    private static StuModel sm = new StuModel();
    private void selAction(int ss) {
        switch (ss){
            case 0:
                System.out.println("退出查询功能");
                System.exit(0);
                break;
            case 1:
                ArrayList<Student> allStu = sm.selAllStu();
                StuPage.ShowStuList(allStu);
                break;
            case 2://按学号查询
                int StuID = StuPage.getStuID(); 
                ArrayList<Student>  getStuID = sm.getbyStuID(StuID);
                StuPage.ShowStuList(getStuID);
                break;
            case 3://按姓名查询
                String StuName = StuPage.getStuName();
                ArrayList<Student> getStuName = sm.getbyStuName(StuName);
                StuPage.ShowStuList(getStuName);
                break;
            case 4://性别
                String StuSex = StuPage.getStuSex();
                ArrayList<Student> getStuSex = sm.getbyStuSex(StuSex);
                StuPage.ShowStuList(getStuSex);
                break;
            case 5://年龄
                int StuAge = StuPage.getStuAge();
                ArrayList<Student> getStuAge = sm.getbyStuAge(StuAge);
                StuPage.ShowStuList(getStuAge);
                break;
            case 6://成绩
                float StuScore = StuPage.getStuScore();
                ArrayList<Student> getStuSore = sm.getbyStuScore(StuScore);
                StuPage.ShowStuList(getStuSore);
                break;
        }
    }


}

5.StuModel类

package com.H.Demo03;

import java.util.ArrayList;

/**
 * @Description:
 * @Author: Hongming
 */
public class StuModel {
    public ArrayList<Student> selAllStu() {
        return Global.stuList;
    }

    public ArrayList<Student> getbyStuID(int stuID) {
        ArrayList<Student> resList = new ArrayList<>();
        for (Student stu:
             Global.stuList) {
            if(stuID == stu.getId()){
                resList.add(stu);
            }
        }
        return resList;
    }

    public ArrayList<Student> getbyStuName(String stuName) {
        ArrayList<Student> resList = new ArrayList<>();
        for (Student stu:
             Global.stuList) {
            if(stuName == stu.getName()){
                resList.add(stu);
            }
        }
        return resList;
    }

    public ArrayList<Student> getbyStuSex(String stuSex) {
        ArrayList<Student> resList = new ArrayList<>();
        for (Student stu:
             Global.stuList) {
            if(stuSex == stu.getSex()){
                resList.add(stu);
            }
        }
        return resList;
    }

    public ArrayList<Student> getbyStuAge(int stuAge) {
        ArrayList<Student> resList = new ArrayList<>();
        for (Student stu:
             Global.stuList) {
            if(stuAge == stu.getAge()){
                resList.add(stu);
            }
        }
        return resList;
    }

    public ArrayList<Student> getbyStuScore(float stuScore) {
        ArrayList<Student> resList = new ArrayList<>();
        for (Student stu:
             Global.stuList) {
            if(stuScore == stu.getScore()){
                resList.add(stu);
            }
        }

        return resList;

    }

    public boolean doAddStu(Student sa) {
        if (null == sa){
            return false;
        }
        Student student = new Student(
                Global.stuID++,
                sa.getName(),
                sa.getSex(),
                sa.getAge(),
                sa.getScore()
        );
        return Global.stuList.add(student);
    }

    public void doUpdate(Student newStu) {
        for (int i = 0; i < Global.stuList.size(); i++) {
            if (newStu.getId() == Global.stuList.get(i).getId()){
                Global.stuList.set(i,newStu);
                return;
            }
        }

    }

    public void doDelStuID(int delStu) {
        for (int i = 0; i < Global.stuList.size(); i++) {
            if (delStu == Global.stuList.get(i).getId()){
                Global.stuList.remove(i);
                return;
            }
        }
    }
}

7.StuMain类

package com.H.Demo03;

/**
 * @Description:
 * @Author: Hongming
 */
public class StuMain {
    private static StuCtr sc= new StuCtr();
    public static void main(String[] args) {
        Global.initStudent();
        while(true){
            int a = StuPage.welcome();
            sc.action(a);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1563624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯真题:单词分析

import java.util.Scanner; //1:无需package //2: 类名必须Main, 不可修改 public class Main{public static void main(String[]args) {Scanner sannernew Scanner(System.in);String strsanner.nextLine();int []anew int [26];for(int i0;i<str.length();i) {a[str.charA…

使用vite创建一个react18项目

一、vite是什么&#xff1f; vite 是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验。它主要由两部分组成&#xff1a; 一个开发服务器&#xff0c;它基于原生 ES 模块提供了丰富的内建功能&#xff0c;如速度快到惊人的模块热更新&#xff08;HMR&#xff09;。 …

iOS苹果签名共享签名是什么以及如何获取?

哈喽&#xff0c;大家好呀&#xff0c;咕噜淼淼又来和大家见面啦&#xff0c;最近有很多朋友都来向我咨询共享签名iOS苹果IPA共享签名是什么&#xff0c;针对这个问题&#xff0c;淼淼来解答一下大家的疑惑并告诉大家iOS苹果ipa共享签名需要如何获取。 现在苹果签名在市场上的…

CSS(二)---【常见属性、复合属性使用】

零.前言 本篇文章主要阐述CSS常见属性、复合属性&#xff0c;更多前置知识请见作者其它文章&#xff1a; CSS(一)---【CSS简介、导入方式、八种选择器、优先级】-CSDN博客 1.CSS属性 CSS的属性有上百个&#xff0c;但是我们并不需要全部学习&#xff0c;只要我们学习一部分…

二叉树 - 栈 - 计数 - leetcode 331. 验证二叉树的前序序列化 | 中等难度

题目 - 点击直达 leetcode 331. 验证二叉树的前序序列化 | 中等难度1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理方法1&#xff1a;栈方法2&#xff1a;计数 3. 时间复杂度 3. 代码实现方法1&#xff1a;栈方法2&#xff1a;计数 leetcode 331. 验证二…

通俗易懂的JMeter调试错误全集

一、前言 在使用jmeter做接口测试的过程中大家是不是经常会遇到很多问题&#xff0c;但是无从下手&#xff0c;不知道从哪里开始找起&#xff0c;对于初学者而言这是一个非常头痛的事情。这里总结出以下方法。 二、通过查看运行日志调试问题 写好脚本后&#xff0c;可以先试…

HarmonyOS实战开发-为应用添加运行时权限

介绍 通过AbilityAccessCtrl动态向用户申请“允许不同设备间的数据交换”的权限&#xff0c;使用设备管理实例获取周边不可信设备列表。 说明&#xff1a; 查询周边不可信设备之前&#xff0c;请确保本设备与周边设备未进行配对。如果已配对&#xff0c;则恢复出厂设置之后重新…

税务知识竞赛活动方案

为了提高税务工作人员的业务技能和知识&#xff0c;现在全市范围开展税务知识竞赛&#xff0c;希望通过“以赛促学”&#xff0c;在税务系统掀起一场税务知识学习热潮。下面是本次竞赛的活动方案。 1、第一轮&#xff1a;争分夺秒。选择题或判断题&#xff0c;每位参赛选手按编…

LiDAR和Camera融合的BEV感知算法-BEVFusion

0. 简述 本次给大家讲解一篇非常经典的融合工作叫 BEVFusion&#xff0c;我们依旧从算法动机&开创性思路、主体结构、损失函数以及性能对比四个方面展开 BEVFusion 有两篇文章&#xff0c;本次主要讲解的是阿里和北大的&#xff1a;BEVFusion: A Simple and Robust LiDAR-…

Docker容器与虚拟化技术:OpenEuler 部署 Docker UI

目录 一、实验 1.环境 2.OpenEuler 部署 docker-compose-ui 2.OpenEuler 部署 docker ui 3.使用cpolar内网穿透 二、问题 1.docker run -w 的作用 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 192.168…

MQ

目录 MQ优点 异步 解耦 削峰填谷 mq的缺点 MQ常见的几种模式 Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别 MQ优点 mq是一种常见的中间件&#xff0c;在项目中经常用到&#xff0c;它具有异步、解耦、削峰填谷的作用。 异步 比如下单流程&#xff0c;A服务—>B服务&a…

SiameseRPN原理详解(个人学习笔记)

参考资源&#xff1a; 视觉目标跟踪SiamRPNSiameseRPN详解CVPR2018视觉目标跟踪之 SiameseRPN 目录&#xff09; 1. 模型架构1.1 Siamese Network1.2 RPN 2. 模型训练2.1 损失函数2.2 端到端训练2.3 正负样本选择 3. 跟踪阶段总结 SiamRPN是在SiamFC的基础上进行改进而得到的一…

FreeRTOS_day3:2024/4/2

1.总结任务调度算法之间的区别&#xff0c;重新实现一遍任务调度算法的代码。 (1)抢占式调度&#xff1a;高优先级任务可以打断低优先级任务&#xff0c;用于任务优先级不同的任务 (2)时间片轮转&#xff1a;相同优先级的任务&#xff0c;分配相同的时间片(一般为 1ms)&#x…

解决GNU Radio+USRP实现OFDM收发在接收端存在误码问题

文章目录 前言一、OFDM 收发流程1、OFDM 收端流程2、OFDM 收端流程 二、问题所在1、find_trigger_signal 函数解读2、general_work 函数3、问题所在 三、修改源码四、运行结果1、频谱2、传输数据测试 五、调试小技巧六、资源自取 前言 在使用 GNU Radio 时使用官方例程搭建 GN…

游戏引擎之高级动画技术

一、动画混合 当我们拥有各类动画素材&#xff08;clips&#xff09;时&#xff0c;要将它们融合起来成为一套完整的动画。 最经典的例子就是从走的动画自然的过渡到跑的动画。 1.1 线性插值 不同于上节课的LERP&#xff08;同一个clip内不同pose之间&#xff09;&#xff…

学习使用echats因xAxis值过多,可以滚动的柱状图解决方案

学习使用echats因xAxis值过多&#xff0c;可以滚动的柱状图解决方案 效果图柱状图代码关键代码 效果图 柱状图代码 function echarts() {// 基于准备好的dom&#xff0c;初始化echarts实例var myChart echarts.init(document.getElementById(echart4));let xaxisData [1, 2,…

HTML常用标签-最基础的标签

从本篇开始&#xff0c;我们围绕HTML原生标签开始&#xff0c;围绕整个前端三剑客进行&#xff0c;将进行一个大致的介绍和案例展示&#xff0c;没有啥技术含量&#xff0c;只是把学习前端的时候&#xff0c;案例全部展示出来&#xff0c;作为一个实时记录&#xff0c;或者说回…

Redis高可用(持久化)

目录 一、Redis高可用 1. Redis高可用概述 2. Redis高可用策略 二、Redis持久化 1. Redis持久化的功能 2. Redis持久化的两种方式 3. RDB持久化 3.1 触发条件 3.1.1 手动触发 3.1.2 自动触发 ① 配置方式 ②其他自动触发机制 3.2 执行流程 3.3 启动时加载 4. AOF…

jnpf3.6私有化部署

文件内容 project web > 特别说明&#xff1a;源码、JDK、MySQL、Redis等安装或存放路径禁止包含中文、空格、特殊字符等## 一 技术栈- 主框架&#xff1a;Spring Boot Spring Framework - 持久层框架&#xff1a;MyBatis-Plus - 数据库连接池&#xff1a;Alibaba Druid -…