需求:

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

分析:

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

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

添加功能:

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

  • id唯一
删除功能:

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

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

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

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

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

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

学生管理系统_System

学生管理系统_键盘录入_02

学生管理系统实现步骤

  • 案例需求
    针对目前我们的所学内容,完成一个综合案例:学生管理系统。该系统主要功能如下:
    添加学生:通过键盘录入学生信息,添加到集合中
    删除学生:通过键盘录入要删除学生的学号,将该学生对象从集合中删除
    修改学生:通过键盘录入要修改学生的学号,将该学生对象其他信息进行修改
    查看学生:将集合中的学生对象信息进行展示
    退出系统:结束程序
  • 实现步骤
  1. 定义学生类,包含以下成员变量
    private String sid // 学生id
    private String name // 学生姓名
    private String age // 学生年龄
    private String address // 学生所在地
  2. 学生管理系统主界面的搭建步骤
    2.1 用输出语句完成主界面的编写 2.2 用Scanner实现键盘输入 2.3 用switch语句完成选择的功能 2.4 用循环完成功能结束后再次回到主界面
  3. 学生管理系统的添加学生功能实现步骤
    3.1 定义一个方法,接收ArrayList集合 3.2 方法内完成添加学生的功能 ①键盘录入学生信息 ②根据录入的信息创建学生对象 ③将学生对象添加到集合中 ④提示添加成功信息 3.3 在添加学生的选项里调用添加学生的方法
  4. 学生管理系统的查看学生功能实现步骤
    4.1 定义一个方法,接收ArrayList集合 4.2 方法内遍历集合,将学生信息进行输出 4.3 在查看所有学生选项里调用查看学生方法
  5. 学生管理系统的删除学生功能实现步骤
    5.1 定义一个方法,接收ArrayList集合 5.2 方法中接收要删除学生的学号 5.3 遍历集合,获取每个学生对象 5.4 使用学生对象的学号和录入的要删除的学号进行比较,如果相同,则将当前学生对象从集合中删除 5.5 在删除学生选项里调用删除学生的方法
  6. 学生管理系统的修改学生功能实现步骤
    6.1 定义一个方法,接收ArrayList集合 6.2 方法中接收要修改学生的学号 6.3 通过键盘录入学生对象所需的信息,并创建对象 6.4 遍历集合,获取每一个学生对象。并和录入的修改学生学号进行比较.如果相同,则使用新学生对象替换当前学生对象 6.5 在修改学生选项里调用修改学生的方法
  7. 退出系统
    使用System.exit(0);退出JVM

学生类的定义

package com.itheima.studentsystem;

public class Student {
    private String id;
    private String name;
    private int age;
    private String address;

 	//下面是空参,全参,get和set方法
}

测试类的定义

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

public class StudentTest {
    private static final String ADD_STUDENT = "1";
    private static final String DELETE_STUDENT = "2";
    private static final String UPDATE_STUDENT = "3";
    private static final String QUERY_STUDENT = "4";
    private static final String EXIT = "5";


    public static void main(String[] args) {
        //ctrl+alt+t 用循环包裹,可以让用户持续输入
        //loop:
        ArrayList<Student> list = new ArrayList<>();
        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.退出");
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入您的选择:");
            //这边写sc.next()而不写sc.nextInt()原因是sc.next()容错率更高,sc.nextInt()万一叛逆的人手残打了字符串程序就终止了
            String choose = sc.next();

            switch (choose) {
                case ADD_STUDENT -> addStudent(list);
                case DELETE_STUDENT -> deleteStudent(list);
                case UPDATE_STUDENT -> updateStudent(list);
                case QUERY_STUDENT -> queryStudent(list);
                case EXIT -> {
                    System.out.println("退出");
                    //break;//只跳出单层循环,无法跳出整个while循环
                    //break loop;//咱把循环起个名字,这样就能跳出整个循环了
                    System.exit(0);//停止虚拟机运行(点击右上角的叉号,让所有的代码直接结束)
                }
                default -> System.out.println("没有这个选项");

            }
        }


    }

    //添加学生
    public static void addStudent(ArrayList<Student> list) {
        //利用空参构造先创建学生对象
        Student s = new Student();

        System.out.println("添加学生");
        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请输入学生的id");
            int id = sc.nextInt();
            boolean existResult = contains(list, id);
            if (existResult) {
                System.out.println("id已存在,请重新输入");
            } else {
                //id不存在,就添加
                s.setId(id);
                break;
            }
        }


        System.out.println("请输入学生的姓名");
        String name = sc.next();
        s.setName(name);

        System.out.println("请输入学生的年龄");
        int age = sc.nextInt();
        s.setAge(age);


        System.out.println("请输入学生的家庭住址");
        String address = sc.next();
        s.setAddress(address);

        list.add(s);

        System.out.println("添加成功");

    }

    //删除学生
    public static void deleteStudent(ArrayList<Student> list) {
        System.out.println("删除学生");
        Scanner sc = new Scanner(System.in);
        int id = sc.nextInt();
        //查询id在集合中的索引
        int index = indexContains(list, id);
        //对index进行判断
        if (index >= 0){
            //如果-1,就表示不存在,结束方法,回到初始菜单
            //如果大于等于0的,表示存在,直接删除
            list.remove(index);
            System.out.println(id + "删除成功");
        } else {
            System.out.println("id不存在");
        }

    }

    //修改学生
    public static void updateStudent(ArrayList<Student> list) {
        System.out.println("修改学生");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要修改的学生id");
        int id = sc.nextInt();

        int index = indexContains(list,id);
        if (index == -1){
            System.out.println(id + "不存在");
            return;
        }

        //当代码执行到这里,表示什么?表示当前id是存在的。
        //获取要修改的学生对象
        Student stu = list.get(index);

        //输入其他的信息并修改
        System.out.println("请输入你要修改的学生姓名");
        String newName = sc.next();
        stu.setName(newName);

        System.out.println("请输入你要修改的学生年龄");
        int newAge = sc.nextInt();
        stu.setAge(newAge);

        System.out.println("请输入你要修改的学生家庭住址");
        String newAddress = sc.next();
        stu.setAddress(newAddress);

        System.out.println("修改成功");

    }

    //查询学生
    public static void queryStudent(ArrayList<Student> list) {
        System.out.println("查询学生");
        if (list.size() == 0) {
            System.out.println("当前无学生信息,请添加后再查询");
            return;//结束方法
        }
        //打印表头
        System.out.println("id\t\t姓名\t年龄\t家庭住址");
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t" + stu.getAddress());
        }

    }

    //判断id在集合中是否存在
    public static boolean contains(ArrayList<Student> list, int id) {
//        for (int i = 0; i < list.size(); i++) {
//            Student stu = list.get(i);
//            if (id == stu.getId()) {
//                return true;
//            }
//        }
//        return false;

        return indexContains(list,id) >= 0;

    }

    //根据索引判断id在集合中是否存在
    public static int indexContains(ArrayList<Student> list, int id) {
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            if (id == stu.getId()) {
               return i;
            }
        }
        return -1;
    }
}
//判断字符串personID是否以0开头
personID.startswith("0");
1.以“0”开头,方法返回true
2.不以“0”开头,方法返回false
System.exit(0);//退出
//先验证格式是否正确,再验证是否唯一
//因为在以后所有的数据,都是存在数据库中,如果我们要校验,需要使用到网络资源。
//随机生成验证码,长度为5,由4位大写或者小写字母和1位数字组成,同一个字母可重复,数字可以出现在任意位置。

private static String getCode(){
    //1.创建一个集合添加所有的大写和小写字母
    ArrayList<Character> list = new ArrayList<>();
    for (int i = 0; i < 26; i++) {
        list.add((char)('a' + i));	//把a-z存入到list集合中
        list.add((char)('A' + i));	//把A-Z存入到list集合中
    }

	StringBuilder sb = new StringBuilder():
    //2.要随机抽取4个字符
	Random r = new Random();
    for (int i = 0; i < 4; i++) {
        //获取随机索引
        int index = r.nextInt(list.size());
        //利用随机索引获取字符
        char c = list.get(index);
        //把随机字符添加到sb当中
        sb.append(c);
    }
    
    //3.把一个随机数字添加到末尾
    int number = r.nextInt(10);
    sb.append(number);
    
    //4.如果我们要修改字符串中的内容
    //先把字符串变成字符数组,在数组中修改,然后再创建一个新的字符串
    char[] arr = sb.tostring().toCharArray();
    //拿着最后一个索引,跟随机索引进行交换
    int randomIndex = r.nextInt(arr.length);
    //最大索引指向的元素 跟随机索引指向的元素交换
    char temp = arr[randomIndex];
    arr[randomIndex] = arr[arr.length - 1];
    arr[arr.length - 1] = temp;
    return new String(arr); //创建一个新的字符串,把 arr 传递过来。
}
//封装思想的应用:
	//我们可以把一些零散的数据,封装成一个对象
	//以后传递参数的时候,只要传递一个整体就可以了,不需要管这些零散的数据。
	User useInfo = new User(username, password, null,null);
	boolean result = checkUserInfo(list,useInfo);
	//想要比对用户名和密码是否一致,把参数传递给 userlnfo后面直接调用userlnfo 就可以了,就不用一个个调用了
}

	private static boolean checkUserInfo(ArrayList<User> list, User useInfo) {