【java阶段练习】----- 学生管理系统



学生管理系统

需求:

​ 采取控制台的方式去书写学生管理系统。

分析:

初始菜单:
java 复制代码
"-------------欢迎来到黑马学生管理系统----------------"
"1:添加学生"
"2:删除学生"
"3:修改学生"
"4:查询学生"
"5:退出"
"请输入您的选择:"
学生类:

​ 属性:id、姓名、年龄、家庭住址

添加功能:

​ 键盘录入每一个学生信息并添加,需要满足以下要求:

  • id唯一
删除功能:

​ 键盘录入要删除的学生id,需要满足以下要求:

  • id存在删除
  • id不存在,需要提示不存在,并回到初始菜单
修改功能:

​ 键盘录入要修改的学生id,需要满足以下要求

  • id存在,继续录入其他信息
  • id不存在,需要提示不存在,并回到初始菜单
查询功能:

​ 打印所有的学生信息,需要满足以下要求

  • 如果没有学生信息,提示:当前无学生信息,请添加后再查询
  • 如果有学生信息,需要按照以下格式输出。(不用过于纠结对齐的问题)
java 复制代码
id			姓名		年龄		家庭住址
heima001	张三		23		 南京
heima002	李四		24		 北京
heima003	王五		25		 广州
heima004	赵六	 	26		 深圳


完整代码实现:

Student类的定义(含注释)

java 复制代码
package com.itdemo;

/**
 * 学生类(Student)
 * 用于封装学生的基本信息,包括学号、姓名、年龄和家庭住址。
 * 提供无参构造方法和全参构造方法,以及所有字段的 getter 和 setter 方法。
 */
public class Student {

    /** 学生的唯一标识(学号) */
    private String id;

    /** 学生的姓名 */
    private String name;

    /** 学生的年龄 */
    private int age;

    /** 学生的家庭住址 */
    private String homeAddress;

    /**
     * 无参构造方法
     * 用于创建一个默认的学生对象(所有字段初始化为默认值)。
     */
    public Student() {
        // 默认构造,字段由Java自动初始化(String为null,int为0)
    }

    /**
     * 全参数构造方法
     * 用于创建一个具有完整信息的学生对象。
     *
     * @param id           学生的学号(唯一标识)
     * @param name         学生的姓名
     * @param age          学生的年龄
     * @param homeAddress  学生的家庭住址
     */
    public Student(String id, String name, int age, String homeAddress) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.homeAddress = homeAddress;
    }

    /**
     * 获取学生的学号
     *
     * @return 学生的学号(String 类型)
     */
    public String getId() {
        return id;
    }

    /**
     * 设置学生的学号
     *
     * @param id 要设置的学号
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * 获取学生的姓名
     *
     * @return 学生的姓名
     */
    public String getName() {
        return name;
    }

    /**
     * 设置学生的姓名
     *
     * @param name 要设置的姓名
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取学生的年龄
     *
     * @return 学生的年龄(整数)
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置学生的年龄
     *
     * @param age 要设置的年龄(应为非负整数)
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取学生的家庭住址
     *
     * @return 学生的家庭住址
     */
    public String getHomeAddress() {
        return homeAddress;
    }

    /**
     * 设置学生的家庭住址
     *
     * @param homeAddress 要设置的家庭住址
     */
    public void setHomeAddress(String homeAddress) {
        this.homeAddress = homeAddress;
    }
}

学生管理系统的主类实现(含注释)

java 复制代码
package com.itdemo;

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

/**
 * 学生管理系统主类
 * 提供添加、删除、修改、查询学生信息的功能
 */
public class StudentSystem {

    /**
     * 程序入口方法
     * 初始化学生列表和Scanner对象,进入主菜单循环
     */
    public static void main(String[] args) {
        // 创建用于存储学生对象的动态数组
        ArrayList<Student> list = new ArrayList<>();
        // 创建Scanner对象,用于接收用户输入
        Scanner sc = new Scanner(System.in);

        // 使用标签 loop 实现无限循环,方便在 switch 中直接退出
        loop: while (true) {
            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.print("请输入您的选择:");

            // 读取用户输入的操作编号(字符串形式)
            String userOperation = sc.next();

            // 根据用户选择执行对应功能
            switch (userOperation) {
                case "1" -> addStudent(list, sc);      // 添加学生
                case "2" -> deleteStudent(list, sc);   // 删除学生
                case "3" -> updateStudent(list, sc);   // 修改学生
                case "4" -> queryStudent(list);        // 查询所有学生
                case "5" -> {
                    System.out.println("即将退出学生管理系统");
                    break loop; // 跳出带 loop 标签的 while 循环,结束程序
                }
                default -> System.out.println("没有此功能,请重新输入!");
            }
        }
    }

    /**
     * 根据学生ID查找其在列表中的索引位置
     *
     * @param targetId 要查找的学生ID
     * @param list     存储学生对象的列表
     * @return 如果找到,返回对应索引;否则返回 -1
     */
    public static int getIndex(String targetId, ArrayList<Student> list) {
        for (int i = 0; i < list.size(); i++) {
            String id = list.get(i).getId();
            if (id.equals(targetId)) {
                return i; // 找到匹配ID,返回索引
            }
        }
        return -1; // 未找到,返回-1
    }

    /**
     * 判断指定ID的学生是否已存在于系统中
     *
     * @param targetId 要检查的学生ID
     * @param list     学生列表
     * @return 存在返回 true,不存在返回 false
     */
    public static boolean searchId(String targetId, ArrayList<Student> list) {
        return getIndex(targetId, list) >= 0;
    }

    /**
     * 添加学生信息功能
     * 步骤:
     * 1. 输入ID,若已存在则提示失败并返回
     * 2. 输入姓名、年龄、家庭住址
     * 3. 创建Student对象并加入列表
     *
     * @param list 学生列表
     * @param sc   Scanner输入对象
     */
    public static void addStudent(ArrayList<Student> list, Scanner sc) {
        System.out.print("请输入学生Id:");
        String targetId = sc.next();

        // 检查ID是否重复
        if (searchId(targetId, list)) {
            System.out.println("该学生信息已存在,学生信息添加失败");
            return;
        }

        System.out.print("请输入学生姓名:");
        String targetName = sc.next();

        System.out.print("请输入学生年龄:");
        int targetAge = sc.nextInt();
        sc.nextLine(); // 清除nextInt()后残留的换行符,防止后续输入异常

        System.out.print("请输入学生家庭住址:");
        String targetHomeAddress = sc.next(); // 注意:不支持含空格的地址

        // 创建新学生对象并添加到列表
        Student newStudent = new Student(targetId, targetName, targetAge, targetHomeAddress);
        list.add(newStudent);
        System.out.println("学生信息添加成功!");
    }

    /**
     * 删除指定ID的学生信息
     * 步骤:
     * 1. 输入要删除的学生ID
     * 2. 查找该ID是否存在
     * 3. 存在则从列表中移除,否则提示失败
     *
     * @param list 学生列表
     * @param sc   Scanner输入对象
     */
    public static void deleteStudent(ArrayList<Student> list, Scanner sc) {
        System.out.println("请输入要删除学生信息的学生id:");
        String targetId = sc.next();

        // 获取目标ID的索引
        int showId = getIndex(targetId, list);
        if (showId == -1) {
            System.out.println("没有此id,删除失败");
            return;
        }

        // 根据索引删除学生对象
        list.remove(showId);
        System.out.println("学生信息删除成功");
    }

    /**
     * 修改指定ID的学生信息
     * 步骤:
     * 1. 输入要修改的学生ID
     * 2. 若ID不存在,提示失败
     * 3. 否则依次输入新的姓名、年龄、地址,并更新对象
     *
     * @param list 学生列表
     * @param sc   Scanner输入对象
     */
    public static void updateStudent(ArrayList<Student> list, Scanner sc) {
        System.out.println("请输入要修改学生信息学生的id:");
        String targetId = sc.next();

        //获取索引
        int index = getIndex(targetId, list);

        // 判断ID是否存在
        if (index==-1) {
            System.out.println("没有此id,修改失败");
            return;
        }

        System.out.println("请输入学生信息:");
        System.out.print("姓名:");
        String targetName = sc.next();

        System.out.print("年龄:");
        int targetAge = sc.nextInt();
        sc.nextLine(); // 清除换行符

        System.out.print("家庭住址:");
        String targetHomeAddress = sc.next();

        // 创建新学生对象并替换原位置数据
        Student newStudent = new Student(targetId, targetName, targetAge, targetHomeAddress);
        list.set(index, newStudent);
        System.out.println("学生信息修改成功");
    }

    /**
     * 查询并打印所有学生信息
     * 若列表为空,则提示用户
     */
    public static void queryStudent(ArrayList<Student> list) {
        // 检查列表是否为空
        if (list.isEmpty()) {
            System.out.println("当前系统无学生信息,请添加后再查询");
            return;
        }

        // 打印表头
        System.out.println("学号\t\t姓名\t\t年龄\t\t家庭住址");
        // 遍历列表,逐行输出学生信息
        for (Student student : list) {
            System.out.println(
                            student.getId() + "\t\t" +
                            student.getName() + "\t\t" +
                            student.getAge() + "\t\t" +
                            student.getHomeAddress()
            );
        }
    }
}

2.学生管理系统升级版

。。。后续更新

相关推荐
爱笑的源码基地2 小时前
基于Java+Spring Boot、Vue的B/S医院患者随访管理系统源码,支持二次开发,三级随访体系(出院/门诊随访)、智慧云库(表单配置)
java·vue.js·spring boot·源码·程序代码·随访系统·诊后回访
我曾遇到一束光2 小时前
Springboot3.X+security6.5+jdk21
java·开发语言
jtymyxmz2 小时前
1.1.4 Spring的下载及目录结构
java·后端·spring
robch2 小时前
Spring 的 DelegatingFilterProxy 用法
java·后端·spring
tryxr2 小时前
Java 不同创建线程的方式什么时候才可以使用 this 来获取线程的引用
java·开发语言·多线程
代码程序猿RIP2 小时前
【C 语言面试】高频考点深度解析
java·面试·职场和发展
ashane13143 小时前
Springboot 启动过程及源码分析
java·spring boot·后端
caron43 小时前
c++ -- 循环依赖解决方案
java·c++·算法
七夜zippoe3 小时前
深入理解Java泛型:类型擦除、通配符PECS原则与实践
java·泛型·通配符·类型擦除·pecs