这次我们来尝试使用Java实现一下"学生管理系统",顾名思义,就是实现一个能用来管理学生各种数据的系统。在后续学习中我们将对"学生管理系统"进行两种实现:
📚 学生管理系统[初阶](不带模拟登录系统)
📚 学生管理系统[进阶](附带模拟登录系统)
在这篇文章学习实现"学生管理系统"之前,需要我们了解并学习过以下知识点:
📕 Java的输入和输出
📕 Java的分支与循环
📕 Java的数组
📕 Java的方法(定义 调用 重载)
📕 Java的初阶面向对象(类和对象 构造方法)
📕 Java的集合(基本使用)
一、学生管理系统[初阶]
在创建"学生管理系统"之前,我们需要知道这个系统要拥有哪些功能:
① 在系统中添加学生
② 在系统中删除学生
③ 在系统中修改某学生信息
④ 对学生的信息进行查询(打印)
⑤ 退出学生管理系统
(注意:要求学生拥有"id","名字","年龄","成绩"四个属性)
① 创建学生类
那么既然是"学生"管理系统,我们自然要创建一个"学生类"用来代表学生:
对着"src"点击鼠标右键。
然后New一个JavaClass。
取名为"Student"。
这样我们就可以在该文件中创建Student类啦:
public class Student {
private String id;
private String name;
private int age;
private double score;
}
这里我们分享一个IDEA的小技巧:
我们先按"NumLk"按键将键盘右侧的数字小键盘关闭,然后按住"ALT"+"INSERT"键:
点击Constructor:
点击Shift全选中:
这样就会直接出现一个带参构造。
但是创建了带参构造后,我们还得补充一个默认的无参构造才行,于是重复刚刚的步骤,不选参数:
这样无参构造也完成啦~
然后我们接下来选择Getter and Setter:
仍然全选:
这样Student的所有属性的get和set就都自动补全啦:
② 创建系统菜单
完成Student类的创建后,我们再回到Main文件中:
我们先写出一个基本的菜单:
然后我们要知道,进行选择需要进行数据的输入,再分别判断是否为"1","2","3","4","5"来进行对应的操作,那么此时我们就可以使用switch语句:
我们来运行一下:
我们可以看到,明明我们想要的应该是重新选择,而此时却结束了,那我们就可以在外面套用一层while循环:
再次运行:
虽然可以重复选择了,但好像...停不下来了?这是因为break的就近原则:
我们可以看到:break离switch比while更近,所以break会优先跳出switch这个语句,从而导致了while一直循环。其实想解决这个问题也很简单,我们可以给while起个名字,然后让break指定跳出while就好了:
再次调试:
这样就退出成功啦~
③ 对学生的信息进行查询(打印)
想要对学生的信息进行打印,我们就要确保有数据来存储学生的信息,并且能够随时进行存储,取出,删除。而进行此类工作,最最合适的也就是"集合"了!!那么让我们现在创建一个学生类的集合:
(注:String数组也能够实现该功能,但相较于"集合",代码量会多出一些,并且也没有"集合"便于理解,不过想尝试的小伙伴们也可以尝试一下,就当对String的用法训练了嘛~)
这样就创建好了~
然后我们进行"查询学生"的方法实现:
📌 要求:
📕 如果集合中没有学生,则查询失败。
📕 如果集合中有学生,则显示学生信息。
📚 方法实现:
public static void print(ArrayList<Student> stu) {
System.out.println("查询学生");
if(stu.size() == 0){
System.out.println("目前系统中暂无学生!");
}
for (int i = 0; i < stu.size(); i++) {
Student s = stu.get(i);
System.out.println("id:" +String.format("%-8s",s.getId())+
"姓名:"+String.format("%-8s",s.getName()) +
"年龄:"+String.format("%-8d",s.getAge()) +
String.format("%-8.2f",s.getScore())+ "成绩:");
}
}
实现思路:
📕 当传进方法的集合"stu"长度为0时,代表集合中没有学生,于是则不打印学生。
📕 当传进方法的集合"stu"长度大于0时,代表集合中有学生,于是对学生进行打印。我们使用for循环,每一次循环都将集合中对应的"学生"取出,然后对数据进行打印,直到循环结束。
(待会儿完成"在系统中添加学生"方法后,与该功能一起演示~)
④ 在系统中添加学生
完成最简单的查询功能后,我们来完成稍微复杂一点的"添加学生"功能:
📌 要求:
📕 传入的 id 必须唯一 (如果有重复则传输失败)
📚 方法实现:
通过要求我们可以得知,要完成此方法我们还需要知道传入id是否唯一,那么我们在写该方法前,先写出另一个用于实现"判断方法是否唯一"的方法:
public static int findnum(ArrayList<Student> stu,String id1) {
for (int i = 0; i < stu.size(); i++) {
Student s = stu.get(i);
if(s.getId().equals(id1)){
return i;
}
}
return -1;
}
思路:我们将集合与"id1"都传入方法"findnum"中,遍历集合中的"学生类"。
如果有"id"与"id1"重复的,就说明此学生已存在,返回"i",添加失败。
如果没有"id"与"id1"重复的,就说明此学生未存在,返回"-1",添加成功。
(注意,查找id时使用的不是 " == ",而是" equals() ",这是因为对于String类进行比较时,只有同为初始化时才能够成功比较,如果String是new出来的,那么就无法进行比较。因为" == "比较String时,本质是比较地址,而" equals() "比较的才是内容)。
📌 注意:此方法非常重要!!!
因为后续我们在完成"在系统中修改某学生信息"方法时,还需要获取"对应学生的下标"才能够修改,而此方法不仅能够通过返回值的正负确定学生是否存在,还能够直接返回学生对应的下标。
那么接下来,我们完成"在系统中添加学生"方法:
public static void add(ArrayList<Student> stu) {
System.out.println("添加学生");
Scanner in = new Scanner(System.in);
while (true) {
System.out.println("请输入学生id:");
String id1 = in.next();
if(findnum(stu,id1) >= 0){
System.out.println("该学生已经存在,请重新输入");
continue;
}
System.out.println("请输入学生姓名:");
String name1 = in.next();
System.out.println("请输入学生年龄:");
int age1 = in.nextInt();
System.out.println("请输入学生成绩:");
double score1 = in.nextDouble();
Student s = new Student(id1,name1,age1,score1);
stu.add(s);
System.out.println("学生添加成功");
break;
}
}
实现思路:
📕 首先输入学生id,并通过"finenum"方法传回的值来确认该学生是否存在于"集合"中。
📕 (如果返回值 >=0 代表在"集合"中通过"id"找到了该学生,则添加失败,重新输入id)
📕 (如果返回值 <0 代表在"集合"中没能通过"id"找到该学生,则添加成功,继续输入剩余数据)
📕 创建一个临时使用的"学生",将新数据传递给"学生",再通过学生添加到集合中。
那么写了这么久~让我们调试一下,看看我们的"学生管理系统"现在的两个功能是否有误吧~:
当我们输入错误时,能够成功的循环进行再次输入。
当没有学生的时候,查询学生能正确显示。
那么接下来我们对"添加学生"与"信息查询"进行检测:
我们可以看到,查询学生和添加学生的功能是无误滴~
至此,两种方法成功~
⑤ 在系统中删除学生
📌 要求:
📕 若id存在则进行删除
📕 若id不存在,则不删除,重新输入。
📚 方法实现:
public static void delete(ArrayList<Student> stu) {
Scanner in = new Scanner(System.in);
System.out.println("删除学生");
while (true) {
System.out.println("请输入学生id:");
String id1 = in.next();
int num = findnum(stu,id1);
if(num >= 0){
System.out.println("删除成功!");
stu.remove(num);
break;
}else if(num < 0){
System.out.println("未找到该学生,请重新输入");
}
}
}
实现思路:
📕 通过之前创建的"findnum"方法来确认是否存在该"学生"。
📕 (如果返回值 >=0 代表在"集合"中通过"id"找到了该学生,则删除成功)
📕 (如果返回值 <0 代表在"集合"中没能通过"id"找到该学生,则删除失败)
我们可以看到,删除方法也是没有问题的~
⑥ 在系统中修改某学生信息
接下来就要进行"学生管理系统[初阶]"中,四个功能中最难的一个功能的实现啦~不怕不怕,也没"最难"那么可怕啦~"难"这种词语,还是留着下一次做进阶版时再说也不迟~
📌 要求:
📕 如果id存在,则进行新数据的传入:
(新数据的传入需要保证,新的 id 不与集合中现有其他学生 id 重复)
📕 如果id不存在,则重新输入
📚 方法实现:
public static void revise(ArrayList<Student> stu){
Scanner in = new Scanner(System.in);
System.out.println("修改学生");
while(true){
System.out.println("请输入学生id:");
String id1 = in.next();
int num = findnum(stu,id1);
if(num < 0){
System.out.println("未找到此id的学生,请重新输入:");
}else{
System.out.println("请输入学生新的id:");
String id2 = in.next();
int num1 = findnum(stu,id2);
if(num1 >= 0) {
System.out.println("此id已经拥有,请重新输入:");
}else{
System.out.println("请输入学生新的姓名:");
String name1 = in.next();
System.out.println("请输入学生新的年龄:");
int age1 = in.nextInt();
System.out.println("请输入学生新的成绩:");
double score1 = in.nextDouble();
Student s = new Student(id2,name1,age1,score1);
stu.set(num,s);
System.out.println("学生修改成功");
break;
}
}
}
}
实现思路:
📕 先输入学生id,然后仍然是使用findnum方法来查找是否存在该学生:
📕 (如果返回值 >=0 代表在"集合"中通过"id"找到了该学生,则进行新数据的输入):
(输入新的id,再用findnum进行查找,如果能找到该id,则告知"此id重复,请重新输入")
(如果找不到该id,则此id为新学生id,然后继续修改其余数据)
📕 (如果返回值 <0 代表在"集合"中没能通过"id"找到该学生,则修改失败,重新输入)
那么最后让我们调试一下吧~:
没有任何滴失误~
那么关于"学生管理系统[初阶]"就完成啦~如果有哪里讲解的不够清楚,或者有的地方还能再加改进,还请各位在评论区多多指出。而关于"学生管理系统[进阶](模拟登录)"我们将在下一篇文章中进行讲解,大家敬请期待啦~
双手奉上源码!!!:
Student.java:
public class Student {
private String id;
private String name;
private int age;
private double score;
public Student(String id, String name, int age, double score) {
this.id = id;
this.name = name;
this.age = age;
this.score = score;
}
public Student() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
Main.java:
import java.sql.SQLOutput;
import java.util.*;
import java.util.stream.StreamSupport;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
ArrayList<Student> stu = new ArrayList<>();
outside :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("请输入你的选择:");
String num = in.next();
switch (num){
case "1" -> add(stu);
case "2" -> delete(stu);
case "3" -> revise(stu);
case "4" -> print(stu);
case "5" -> {
System.out.println("退出学生管理系统");
break outside;
}
default -> System.out.println("输入错误,请重新选择");
}
}
}
public static void add(ArrayList<Student> stu) {
System.out.println("添加学生");
Scanner in = new Scanner(System.in);
while (true) {
System.out.println("请输入学生id:");
String id1 = in.next();
if(findnum(stu,id1) >= 0){
System.out.println("该学生已经存在,请重新输入");
continue;
}
System.out.println("请输入学生姓名:");
String name1 = in.next();
System.out.println("请输入学生年龄:");
int age1 = in.nextInt();
System.out.println("请输入学生成绩:");
double score1 = in.nextDouble();
Student s = new Student(id1,name1,age1,score1);
stu.add(s);
System.out.println("学生添加成功");
break;
}
}
public static void delete(ArrayList<Student> stu) {
Scanner in = new Scanner(System.in);
System.out.println("删除学生");
while (true) {
System.out.println("请输入学生id:");
String id1 = in.next();
int num = findnum(stu,id1);
if(num >= 0){
System.out.println("删除成功!");
stu.remove(num);
break;
}else if(num < 0){
System.out.println("未找到该学生,请重新输入");
}
}
}
public static void revise(ArrayList<Student> stu){
Scanner in = new Scanner(System.in);
System.out.println("修改学生");
while(true){
System.out.println("请输入学生id:");
String id1 = in.next();
int num = findnum(stu,id1);
if(num < 0){
System.out.println("未找到此id的学生,请重新输入:");
}else{
System.out.println("请输入学生新的id:");
String id2 = in.next();
int num1 = findnum(stu,id2);
if(num1 >= 0) {
System.out.println("此id已经拥有,请重新输入:");
}else{
System.out.println("请输入学生新的姓名:");
String name1 = in.next();
System.out.println("请输入学生新的年龄:");
int age1 = in.nextInt();
System.out.println("请输入学生新的成绩:");
double score1 = in.nextDouble();
Student s = new Student(id2,name1,age1,score1);
stu.set(num,s);
System.out.println("学生修改成功");
break;
}
}
}
}
public static void print(ArrayList<Student> stu) {
System.out.println("查询学生");
if(stu.size() == 0){
System.out.println("目前系统中暂无学生!");
}
for (int i = 0; i < stu.size(); i++) {
Student s = stu.get(i);
System.out.println("id:" +String.format("%-8s",s.getId())+
"姓名:"+String.format("%-8s",s.getName()) +
"年龄:"+String.format("%-8d",s.getAge()) +
"成绩:"+String.format("%-8.2f",s.getScore()));
}
}
public static int findnum(ArrayList<Student> stu,String id1) {
for (int i = 0; i < stu.size(); i++) {
Student s = stu.get(i);
if(s.getId().equals(id1)){
return i;
}
}
return -1;
}
}