Java-学生管理系统[初阶]
这次我们来尝试使用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;}
}
相关文章:

Java-学生管理系统[初阶]
这次我们来尝试使用Java实现一下"学生管理系统",顾名思义,就是实现一个能用来管理学生各种数据的系统。在后续学习中我们将对"学生管理系统"进行两种实现: 📚 学生管理系统[初阶](不带模拟登录系统) &#…...
微信小程序 详情图片预览功能实现详解
详情图片预览功能实现详解 在开发微信小程序时,我们经常需要实现点击商品图片进行全屏预览的功能。这不仅提升了用户体验,还允许用户进行保存图片、发送给朋友等操作。本文将详细介绍如何实现这一功能。 思路分析 当用户在商品详情页点击图片时&#…...

LeetCode 48 Rotate Image 解题思路和python代码
题目: You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise). You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and …...

余承东直播论道智能驾驶:激光雷达不可或缺,华为ADS 3.0引领安全创新
华为余承东:激光雷达,智能驾驶安全性的关键 9月29日,华为消费者业务集团CEO余承东在一场引人注目的直播中,与知名主持人马东就智能驾驶技术的最新进展进行了深入交流。在这场直播中,余承东针对激光雷达在智能驾驶中的必要性问题,发表了明确且深刻的观点,引发了业界和公众…...

51WORLD携手浙江科技大学,打造智慧校园新标杆
当前,国家教育数字化战略行动扎实推进,高等教育数字化转型步伐加快。 紧抓数字教育发展战略机遇,浙江科技大学联合51WORLD、正方软件股份有限公司(简称:正方软件),共同研发打造浙科大孪生数智校…...

SAP SD学习笔记09 - 受注传票中的不完全Log 和 Business Partner(取引先机能)
好久没写SD了,今天继续写。 上一章讲了SD的如下知识 - SD的售前的流程(引合和見積(询价和报价)) - 数据流的概念,主要就是后传票可以参照前传票,以实现数据的流动,减少输入 - Co…...
【ROS2】里程计(odometry)数据计算、发布
1、里程计消息 1.1 Odometry消息 消息描述:nav_msgs::msg::Odometry 是ROS2中用发布里程计信息的消息,包括:线速度、角速度、位置和朝向 消息路径:/opt/ros/humble/share/nav_msgs/msg/Odometry.msg 消息内容: # 包含父ID std_msgs/Header header# 子ID,即姿势所在的坐…...
AcWing 187 导弹防御系统 暴搜
代码 #include <bits/stdc.h> #define int long long using namespace std;const int N 200010, mod 1e9 7;int n, m, k, x, y, z, ans, t, depth; int w[N], f[N]; int up[N], down[N];bool dfs(int depth, int u, int su, int sd) {if (su sd > depth) return …...

SpringSecurity(三)——自定义优化器
在SpringSecurity中,如果我们在认证或者授权的过程中出现了异常会被ExceptionTranslationFilter捕 获到。在ExceptionTranslationFilter中会去判断是认证失败还是授权失败出现的异常。 一、自定义验证异常类 创建exception包,在exception包下创建自定义…...

STM32通用定时器TIM3的PWM输出实验配置步骤
通用定时器 PWM 输出实验 本小节我们来学习使用通用定时器的 PWM 输出模式。 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。我们可以让定时…...
device tree 预研
linux kernel 引入 dts 的背景 http://www.wowotech.net/linux_kenrel/why-dt.html 什么是 device tree device tree 是一种描述硬件资源的数据结构。device tree 可以描述的信息包括 cpu 的数量和类别、内存基地址和大小、clock 控制器和 clock 使用情况、外设基地址以及…...

英伟达股价分析:英伟达股价能否上涨到150美元,接下来该如何操作?
来源:猛兽财经 作者:猛兽财经 猛兽财经核心观点: (1)华尔街投行Oppenheimer已将英伟达的目标价上调到了150美元。 (2)产品方面的最新进展和合作伙伴关系进一步提升了英伟达的市场地位。 &…...

Rust 快速入门(一)
Rust安装信息解释 cargo:Rust的编译管理器、包管理器、通用工具。可以用Cargo启动新的项目,构建和运行程序,并管理代码所依赖的所有外部库。 Rustc:Rust的编译器。通常Cargo会替我们调用此编译器。 Rustdoc:是Rust的…...
java 程序在服务器出现时区错误问题(使用Date,LocalDateTime,ZonedDateTime都不正确)
排查 查询系统时区信息 timedatectl status打印java的时区信息 import java.util.TimeZone;public class CheckTimeZone {public static void main(String[] args) {TimeZone defaultTimeZone TimeZone.getDefault();System.out.println("Default TimeZone ID: "…...
Kotlin 语言的协程是什么?
目录 1. 什么是协程 2. 协程的基本概念 3. 如何使用协程 3.1. 引入依赖 3.2. 启动协程 3.3. 使用挂起函数 4. 结构化并发 5. 处理异常 6. 总结 Kotlin 的协程是一种轻量级的线程,可以用于简化异步编程。它允许你以顺序的方式编写异步代码,从而提…...

uniapp 游戏 - 使用 uniapp 实现的扫雷游戏
0. 思路 1. 效果图 2. 游戏规则 扫雷的规则很简单。盘面上有许多方格,方格中随机分布着一些雷。你的目标是避开雷,打开其他所有格子。一个非雷格中的数字表示其相邻 8 格子中的雷数,你可以利用这个信息推导出安全格和雷的位置。你可以用右键在你认为是雷的地方插旗(称为标…...
LeetCode组合总和
题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被…...

MATLAB - 机械臂手眼标定(眼在手内) - 估计安装在机器人上的移动相机的姿态
系列文章目录 前言 本示例展示了如何为装有手眼构型摄像头的机械臂或机械手执行和验证手眼校准。 一、概述 执行手眼校准有助于操作配备末端执行器(简称 “手”)的机械臂,该末端执行器依赖于摄像头提供的视觉数据。一旦完成了眼在手外的校准&…...

【Unity】TextMeshPro 3.0.9无法显示emoji表情问题
需要下载TextMeshPro 3.2.x-pre.xxx版本,重新生成Sprite Asset文件解决 注意:若Package Manager没有搜到pre版本,那么可以去github下载到本地,再解压后,将文件夹移动到工程Packages文件夹下,然后打开Packa…...

金九银十软件测试面试题(800道)
今年你的目标是拿下大厂offer?还是多少万年薪?其实这些都离不开日积月累的过程。 为此我特意整理出一份(超详细笔记/面试题)它几乎涵盖了所有的测试开发技术栈,非常珍贵,人手一份 肝完进大厂 妥妥的&#…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...