需求:
采取控制台的方式去书写学生管理系统。
分析:
初始菜单:
"-------------欢迎来到学生管理系统----------------"
"1:添加学生"
"2:删除学生"
"3:修改学生"
"4:查询学生"
"5:退出"
"请输入您的选择:"
学生类:
属性:id、姓名、年龄、家庭住址
添加功能:
键盘录入每一个学生信息并添加,需要满足以下要求:
- id唯一
删除功能:
键盘录入要删除的学生id,需要满足以下要求:
- id存在删除
- id不存在,需要提示不存在,并回到初始菜单
修改功能:
键盘录入要修改的学生id,需要满足以下要求
- id存在,继续录入其他信息
- id不存在,需要提示不存在,并回到初始菜单
查询功能:
打印所有的学生信息,需要满足以下要求
- 如果没有学生信息,提示:当前无学生信息,请添加后再查询
- 如果有学生信息,需要按照以下格式输出。(不用过于纠结对齐的问题)
id 姓名 年龄 家庭住址
heima001 张三 23 南京
heima002 李四 24 北京
heima003 王五 25 广州
heima004 赵六 26 深圳
学生管理系统实现步骤
- 案例需求
针对目前我们的所学内容,完成一个综合案例:学生管理系统。该系统主要功能如下:
添加学生:通过键盘录入学生信息,添加到集合中
删除学生:通过键盘录入要删除学生的学号,将该学生对象从集合中删除
修改学生:通过键盘录入要修改学生的学号,将该学生对象其他信息进行修改
查看学生:将集合中的学生对象信息进行展示
退出系统:结束程序 - 实现步骤
- 定义学生类,包含以下成员变量
private String sid // 学生id
private String name // 学生姓名
private String age // 学生年龄
private String address // 学生所在地 - 学生管理系统主界面的搭建步骤
2.1 用输出语句完成主界面的编写 2.2 用Scanner实现键盘输入 2.3 用switch语句完成选择的功能 2.4 用循环完成功能结束后再次回到主界面 - 学生管理系统的添加学生功能实现步骤
3.1 定义一个方法,接收ArrayList集合 3.2 方法内完成添加学生的功能 ①键盘录入学生信息 ②根据录入的信息创建学生对象 ③将学生对象添加到集合中 ④提示添加成功信息 3.3 在添加学生的选项里调用添加学生的方法 - 学生管理系统的查看学生功能实现步骤
4.1 定义一个方法,接收ArrayList集合 4.2 方法内遍历集合,将学生信息进行输出 4.3 在查看所有学生选项里调用查看学生方法 - 学生管理系统的删除学生功能实现步骤
5.1 定义一个方法,接收ArrayList集合 5.2 方法中接收要删除学生的学号 5.3 遍历集合,获取每个学生对象 5.4 使用学生对象的学号和录入的要删除的学号进行比较,如果相同,则将当前学生对象从集合中删除 5.5 在删除学生选项里调用删除学生的方法 - 学生管理系统的修改学生功能实现步骤
6.1 定义一个方法,接收ArrayList集合 6.2 方法中接收要修改学生的学号 6.3 通过键盘录入学生对象所需的信息,并创建对象 6.4 遍历集合,获取每一个学生对象。并和录入的修改学生学号进行比较.如果相同,则使用新学生对象替换当前学生对象 6.5 在修改学生选项里调用修改学生的方法 - 退出系统
使用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) {