0%

java实现学生管理系统

简介

这篇博客参考b站黑马程序员刘意老师的Java课程,刘老师讲的很好,写这篇博客是补充说明一些我容易出错的地方,如果你不知道学生管理系统的功能是什么,我会画一个思维导图贴在下面,然后是实现的Java源码,当然,我会把其中重要的部分,单独拿出来讲讲

学生管理系统要实现的功能

需要实现功能的思维导图

整段源码

student_main.java主函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package student_lei;

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

public class student_main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//定义一个集合,装入student类
ArrayList<student> arr = new ArrayList<>();
//定义初使页面,并使用死循环,退出使用system.exit(0)
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.println("输入你的选择:");
int n = sc.nextInt();
switch (n) {
//按照输入的数字调用对应的函数
case 1 -> addStudent(arr);
case 2 -> deleteStudent(arr);
case 3 -> updateStudent(arr);
case 4 -> showStudent(arr);
case 5 -> System.exit(0);
}
}
}
//添加学生函数
public static void addStudent(ArrayList<student> arr) {
Scanner sc = new Scanner(System.in);
//定义在外面,使后面的print能够调用
String sid;
//用死循环配合isUsed函数判断是否输入相同学号
while (true) {
System.out.println("学号");
sid = sc.nextLine();
if (isUsed(arr, sid)) {
System.out.println("学号输入重复,请重新输入");
} else break;
}
System.out.println("姓名");
String name = sc.nextLine();
System.out.println("年龄");
String age = sc.nextLine();
System.out.println("居住地");
String address = sc.nextLine();
//装进student类中
student s = new student();
s.setSid(sid);
s.setName(name);
s.setAge(age);
s.setAddress(address);
//把类装到集合中
arr.add(s);
System.out.println("添加学生成功!");
}
//删除学生函数
public static void deleteStudent(ArrayList<student> arr) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要删除学生的学号:");
String sid = sc.nextLine();
//用boolean来判断是否删除成功,Java中不能把0当作false
boolean index = true;
for (int j = 0; j < arr.size(); j++) {
student s = arr.get(j);
//遍历加if,删除对应的学生
if (s.getSid().equals(sid)) {
arr.remove(j);
index = false;
System.out.println("删除成功!");
break;
}
}
if (index) {
System.out.println("学号输入错误");
}
}
//修改学生函数
public static void updateStudent(ArrayList<student> arr) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要修改的学生学号");
String n = sc.nextLine();
int temp = 0;
for (int j = 0; j < arr.size(); j++) {
if (arr.get(j).getSid().equals(n)) {
temp = j;
break;
}
}
//修改学生功能菜单
System.out.println("-----------");
System.out.println("1.修改学号");
System.out.println("2.修改姓名");
System.out.println("3.修改年龄");
System.out.println("4.修改居住地");
System.out.println("请输入你的选择");
int s = sc.nextInt();
switch (s) {
case 1 -> {
System.out.println("输入新的学号");
//与which连用时,删除缓存
sc.nextLine();
String newSid = sc.nextLine();
arr.get(temp).setSid(newSid);
System.out.println("修改成功");
}
case 2 -> {
System.out.println("输入新姓名");
sc.nextLine();
String newName = sc.nextLine();
arr.get(temp).setName(newName);
System.out.println("修改成功");
}
case 3 -> {
System.out.println("输入新年龄");
sc.nextLine();
String newAge = sc.nextLine();
arr.get(temp).setAge(newAge);
System.out.println("修改成功");
}
case 4 -> {
System.out.println("输入新居住地");
sc.nextLine();
String newAddress = sc.nextLine();
arr.get(temp).setAddress(newAddress);
System.out.println("修改成功");
}
}
}
//展示学生函数
public static void showStudent(ArrayList<student> arr) {
//判断是否有数据存入其中
if (arr.size() == 0) {
System.out.println("无数据,请先输入数据");
return;
}
//使用制表符制作表格,更好的展示
System.out.println("学号" + "\t" + "姓名" + "\t" + "年龄" + "\t" + "地址");
//可以使用增强for循环,针对只对数组,集合中对象单一遍历操作的函数
for (student s : arr) {
System.out.println(s.getSid() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getAddress());
}
}
//判断是否有相同学号的函数,传入集合和输入的新学号,在studentAdd函数中使用,返回值根据情况有所不同
public static boolean isUsed(ArrayList<student> arr, String sid) {
boolean n = false;
for (student s : arr) {
if (s.getSid().equals(sid)) {
n = true;
break;
}
}
return n;
}
}

student.java类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package student_lei;

public class student {
//学号
private String sid;
//姓名
private String name;
//年龄
private String age;
//居住地
private String address;

public student() {}
//使用command + n 自动生成构造函数,配合shift,还能生成get,set函数
public student(String sid, String name, String age, String address) {
this.sid = sid;
this.name = name;
this.age = age;
this.address = address;
}

public String getSid() {
return sid;
}

public void setSid(String sid) {
this.sid = sid;
}

public String getName() {
return name;
}

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

public String getAge() {
return age;
}

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

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}
}

如何利用IntelliJ自动生成构造函数,set(),get()函数

相信大家都很厌倦写构造函数和get,set函数了,如果你使用的是intellij,那么可以用一个快捷键来快速解决哦,用完之后我直接感动,以后再也不用像个🤡一样自己写了

Mac快捷键

command + n

Mac我会配合自己的截图,如果使用Windows,我查到快捷键的是alt + insert,用windows的小伙伴如果不清楚的话,可以搜索一下哦

先创建一个Java类,然后随便定义几个变量,按下command + n 后,会有这个界面

选你想选的,这里我选Getter + Setter,然后会有这个界面

一般来说,你只能点一个,但是如果按下shift的同时点击,就能达到我这样的多选效果

最后成果图

省时又省力,芜湖

学生管理系统初始化界面书写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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.println("输入你的选择:");
int n = sc.nextInt();
switch (n) {
//按照输入的数字调用对应的函数
case 1 -> addStudent(arr);
case 2 -> deleteStudent(arr);
case 3 -> updateStudent(arr);
case 4 -> showStudent(arr);
case 5 -> System.exit(0);
}
}

前面一大段输出函数,用来输出一开始的选择界面

这没说明好说的,到后面的switch(Java14增强版switch)才是重点,从一开始就可以看到,整个代码都在死循环中,目的是不断以一个不断循环的方式,执行用户的指令,只有用户输入5(退出),才能够退出系统,在刚开始写这段代码的时候,准备在case5处,写break,但是break与switch连用,被用于跳出switch ,如果在增强switch中写,就被直接提示这个break不需要,所以,需要使用System.exit(0)来直接结束程序

添加学生函数

isUsed函数

使用这个函数,是为了完成添加学生类的附加功能,判断学号是否重合

1
2
3
4
5
6
7
8
9
10
11
public static boolean isUsed(ArrayList<student> arr, String sid) {
boolean n = false;
for (student s : arr) {
if (s.getSid().equals(sid)) {
n = true;
break;
}
}
return n;
}
}

要用一个函数来判断,可以使用boolean来定义,代码中的for循环为增强for循环,一开始传入了要比较多两个数据,新输入的学号,和原来用来存学号的集合,在for循环的遍历下,用equals函数一一比较,如果发现相同,则返回true,如果没有发现相同,则返回false,把这个函数单独写出的原因是,以后可以复用,根据之前的思维导图,只有添加学生时检查了学号是否复用,如果以后有其他函数中需要判断学号是否复用,就可以调用此函数

添加学生

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static void addStudent(ArrayList<student> arr) {
Scanner sc = new Scanner(System.in);
//定义在外面,使后面的print能够调用
String sid;
//用死循环配合isUsed函数判断是否输入相同学号
while (true) {
System.out.println("学号");
sid = sc.nextLine();
if (isUsed(arr, sid)) {
System.out.println("学号输入重复,请重新输入");
} else break;
}
System.out.println("姓名");
String name = sc.nextLine();
System.out.println("年龄");
String age = sc.nextLine();
System.out.println("居住地");
String address = sc.nextLine();
//装进student类中
student s = new student();
s.setSid(sid);
s.setName(name);
s.setAge(age);
s.setAddress(address);
//把类装到集合中
arr.add(s);
System.out.println("添加学生成功!");
}

重点在为什么把String sid放到while循环定义外,而不是直接使用

String sid = sc.nextLine()

因为定义在while循环内的变量循环外是无法访问到的,这也是我们容易忽视的一点

删除学生函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static void deleteStudent(ArrayList<student> arr) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要删除学生的学号:");
String sid = sc.nextLine();
//用boolean来判断是否删除成功,Java中不能把0当作false
boolean index = true;
for (int j = 0; j < arr.size(); j++) {
student s = arr.get(j);
//遍历加if,删除对应的学生
if (s.getSid().equals(sid)) {
arr.remove(j);
index = false;
System.out.println("删除成功!");
break;
}
}
if (index) {
System.out.println("学号输入错误");
}
}

这个函数中,比较重要的是对于index的使用,我是第一次碰到,删除成功很好输出,跟在remove的后面就行了,但是输出失败(学号输入错误)的提示该放在哪呢,如果直接放在for循环外,那么输出成功后也会提示输出失败,所以,需要把加一个判断条件index,如果输出成功,就把index赋值为false,这样就不会在输出成功后也提示输出失败了

修改学生函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public static void updateStudent(ArrayList<student> arr) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要修改的学生学号");
String n = sc.nextLine();
int temp = 0;
for (int j = 0; j < arr.size(); j++) {
if (arr.get(j).getSid().equals(n)) {
temp = j;
break;
}
}
//修改学生功能菜单
System.out.println("-----------");
System.out.println("1.修改学号");
System.out.println("2.修改姓名");
System.out.println("3.修改年龄");
System.out.println("4.修改居住地");
System.out.println("请输入你的选择");
int s = sc.nextInt();
switch (s) {
case 1 -> {
System.out.println("输入新的学号");
//与which连用时,删除缓存
sc.nextLine();
String newSid = sc.nextLine();
arr.get(temp).setSid(newSid);
System.out.println("修改成功");
}
case 2 -> {
System.out.println("输入新姓名");
sc.nextLine();
String newName = sc.nextLine();
arr.get(temp).setName(newName);
System.out.println("修改成功");
}
case 3 -> {
System.out.println("输入新年龄");
sc.nextLine();
String newAge = sc.nextLine();
arr.get(temp).setAge(newAge);
System.out.println("修改成功");
}
case 4 -> {
System.out.println("输入新居住地");
sc.nextLine();
String newAddress = sc.nextLine();
arr.get(temp).setAddress(newAddress);
System.out.println("修改成功");
}
}
}

看起来有一大段代码,但是重要的只有一行代码,就是

sc.nextLine();

在switch中用nextLine(),需要先用上面的代码,否则在运行的时候会直接当你输入的值为空,具体为什么我没查到,但我猜跟nextInt()和nextLine()一起用的问题相似

展示学生函数

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void showStudent(ArrayList<student> arr) {
//判断是否有数据存入其中
if (arr.size() == 0) {
System.out.println("无数据,请先输入数据");
return;
}
//使用制表符制作表格,更好的展示
System.out.println("学号" + "\t" + "姓名" + "\t" + "年龄" + "\t" + "地址");
//可以使用增强for循环,针对只对数组,集合中对象单一遍历操作的函数
for (student s : arr) {
System.out.println(s.getSid() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getAddress());
}
}

比较重要的就是制表符的使用,在学C语言时就把**\t**叫制表符,这次使用\t按表格输出数据,会有更好的展示效果

后记

到此,需要注意的点都讲完了,这个管理系统虽然简单,但是在写它的过程中,我还是发现了许多我之前不知道的知识,算是有所收获吧,我也会经常拿这篇文章看看,复习一下,如果太长时间不敲,也会忘记,我一般复习的时候,会同时打开intellij和sublime,先用sublime敲一下代码中比较重要的部分,在对照intellij看看写错没有,只需要敲比较重要,容易出错的地方就行,希望大家也能多多复习哦👾

-------------本文结束感谢您的阅读-------------