在学习每门计算机语言的时候,总是绕不过学生管理系统的坎,对于学生管理系统,主要需求就是能够实现增删改查,在完成这些功能之后,这个系统的雏形就有了。可以说是管理系统的必备功能,新增功能也需要在其基础上进行扩展。
首先需求如下:
如图所示,首先需要准备的是一个学生类,其次是一个存学生对象的数组,如何就是对每个对象进行操作的方法,以下开始逐步实现:(本次编码中的num代表题目中的id!)
1。创建学生类!(技巧:使用Idea进行编码时,可以通过alt+insert键进行快速创建标准Javabean。也可以通过安装“Ptg”插件进行一键生成。)
package com.wxy;
public class Student {
private int num;//表示该对象的学号
private String name;//表示该对象的姓名
private int age;//表示该对象的年龄
//空参构造函数
public Student() {
}
//满参构造函数
public Student(int num, String name, int age) {
this.num = num;
this.name = name;
this.age = age;
}
//以下为各个成员的getset()方法
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
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;
}
}
2.创建一个长度为3的学生类数组,专门存放学生对象:
Student[]arr = new Student[3];
3.实现学生信息的插入,在插入过程中,额外要求:
1.你需要确保学号的唯一性。
2.如果数组存满了,需要创建一个新的数组并且长度比原来的大一,这样就可以安置新的对象。
3.需要用户自己输入学生的信息(人机交互)
4.每次插入完需要能够显示已经插入的学生信息(此部分将在主函数中呈现,不在此呈现)
//以下为插入方法的主体
public static Student[] insert(Student[]arr){
if (ifOver(arr)){
arr = create(arr);
}
System.out.println("请依次输入该学生的学号名字和年龄");
for (int i = 0; i < arr.length; i++) {
if(arr[i]==null)
{
Student s = new Student();
System.out.println("你现在正在输入学生的学号");
int num = sc.nextInt();
while (contain(arr,num)){
System.out.println("学号重复啦!请重新输入!");
num = sc.nextInt();
}
s.setNum(num);
System.out.println("你现在正在输入学生的名字");
s.setName(sc.next());
System.out.println("你现在正在输入学生的年龄");
s.setAge(sc.nextInt());
arr[i] = s;
break;
}
}
//通过以下方法进行拓展内存。
public static Student[] create(Student[] arr){
Student[] newArr = new Student[arr.length+1];
for (int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}
return newArr;
}
//判断数组是否满了
public static boolean ifOver(Student[]arr)
{
if(arr[arr.length-1] != null){
System.out.println("超过啦正在创建一个新的容器!");
return true;
}
else
return false;
}
//判断是否存在重复学号的学生
public static boolean contain(Student[]arr,int num){
for (int i = 0; i < arr.length; i++) {
if(arr[i]!=null)
if(arr[i].getNum() == num){
return true;
}
}
return false;
}
4.创建一个用于展现已经插入的学生信息(在主函数中调用)
public static void showInfo(Student[]arr){
System.out.println("当前的学生信息如下:");
for (int i = 0; i < arr.length; i++) {
if(arr [i] != null)
{
System.out.println(arr[i].getNum()+arr[i].getName()+arr[i].getAge());
}
}
}
5.定义一个根据学号的值可以删除该学号的信息的方法,额外要求:
1.当删除的学生对象存放的位置不在最后一个时,需要向上补齐,如删除的位置是第二个位置,需要将第三个位置的数据往上移一个单位,并将原来第三个位置的指针进行重定义。
2.能够由用户自己输入想要删除的学号。
3.如果该学号不存在,需要有一个简单的提示。
4.能够在删除后再次展现学生信息(在主函数中实现)。
public static Student[] delate(int num,Student[]arr){
int i = 0;
for (i = 0; i < arr.length; i++) {
//第一步判断是否为空,如果是空的,则没有必要进行判断
if(arr[i]!=null)
//第二步判断是否存在
if(arr[i].getNum() == num){
arr[i] = null;
//第三判断是否位置在数组的最后一个位置,如果是,则直接让其指针置空,如果不是则进行下一步操作,有利于简化算法,提高效率
if(i == arr.length-1){
arr[i] = null;
break;
}
//位置在非最后则进行向上补齐
else{
for (int j=i+1; j < arr.length; j++) {
arr[i] = arr[j];//将删除的位置腾出来给后一位
arr[j] = null;//因为后一位的数据已经移动,所以就有两个后一位的数据,将后一位的数据清空,准备给后面来补上
i = j;//此步为将删除的元素后移,因为每个元素前移之后就代表多了一个重复元素,意味着我们需要再进行删除操作,直至到数组尾,则停止操作。
}
break;
}
}
}
//如果i=数组的长度,说明在上诉过程中,没有找到该学号,以至于没有执行break,以至于i被加到了数组的长度,所以就是没有该学号的意思,进行简单的提示
if(i == arr.length)
System.out.println("没有该学号噢");
//最后返回修改后的数组
return arr;
}
6.定义一个方法能够根据学号修改该学生的名字和年龄,由于题目所说只是年龄加一,这里改变一下要求,要求可以改变其所有的值,额外要求如下:
1.判断是否存在该学号,没有则进行简单的提示
2.提供提示能够让用户知道自己正在改哪个数据
3.由于此处为数组内容的修改,不需要返回新的数组,如果是重新开辟新空间的数组,则需要返回,让旧数组指向新数组的地址。
public static void changeData(int num,Student[]arr){
int i = 0;
for (i = 0; i < arr.length; i++) {
if(arr[i]!=null)
if(arr[i].getNum() == num){
System.out.println("请重新输入该学号的姓名");
arr[i].setName(sc.next());
System.out.println("请重新输入该学号的年龄");
arr[i].setAge(sc.nextInt());
break;
}
}
7.以下编写主函数进行测试,额外要求:
1.能够有一个简单的界面,提示用户选择模式
2.如果用户不选择退出,则会一直在该系统中
public static void main(String[] args) {
Student[]arr = new Student[3];
boolean flag = true;
while (flag){
showInfo(arr);
System.out.println("请选择模式:\n1:插入学生成绩\n2:删除学生信息\n3:修改学生信息\n0:退出");
// System.out.println(arr.length);
//通过i能够判断用户选择的模式
int i = sc.nextInt();
switch (i){
//列四个模式:
case 1 -> {
// System.out.println("你好");
arr = insert(arr);
}
case 2 -> {
System.out.println("请输入你想删除的学生信息的学号");
int num = sc.nextInt();
arr = delate(num,arr);
}
case 3 ->{
System.out.println("请输入需要需改学生信息的学号");
int num = sc.nextInt();
changeData(num,arr);
}
case 0 -> flag = false;
}
}
}
通过以上步骤便可以实现学生信息增删改查的功能,以下为完整代码:
public class Student {
private int num;
private String name;
private int age;
public Student() {
}
public Student(int num, String name, int age) {
this.num = num;
this.name = name;
this.age = age;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
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;
}
}
import com.wxy.Student;
import java.util.Scanner;
public class Studenttest {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
Student[]arr = new Student[3];
boolean flag = true;
while (flag){
showInfo(arr);
System.out.println("请选择模式:\n1:插入学生成绩\n2:删除学生信息\n3:修改学生信息\n0:退出");
// System.out.println(arr.length);
int i = sc.nextInt();
switch (i){
case 1 -> {
// System.out.println("你好");
arr = insert(arr);
}
case 2 -> {
System.out.println("请输入你想删除的学生信息的学号");
int num = sc.nextInt();
arr = delate(num,arr);
}
case 3 ->{
System.out.println("请输入需要需改学生信息的学号");
int num = sc.nextInt();
changeData(num,arr);
}
case 0 -> flag = false;
}
}
}
public static void changeData(int num,Student[]arr){
int i = 0;
for (i = 0; i < arr.length; i++) {
if(arr[i]!=null)
if(arr[i].getNum() == num){
System.out.println("请重新输入该学号的姓名");
arr[i].setName(sc.next());
System.out.println("请重新输入该学号的年龄");
arr[i].setAge(sc.nextInt());
break;
}
}
if(i == arr.length)
System.out.println("没有该学号噢");
}
public static void showInfo(Student[]arr){
System.out.println("当前的学生信息如下:");
for (int i = 0; i < arr.length; i++) {
if(arr [i] != null)
{
System.out.println(arr[i].getNum()+arr[i].getName()+arr[i].getAge());
}
}
}
public static Student[] delate(int num,Student[]arr){
int i = 0;
for (i = 0; i < arr.length; i++) {
if(arr[i]!=null)
if(arr[i].getNum() == num){
arr[i] = null;
if(i == arr.length-1){
arr[i] = null;
break;
}
else{
for (int j=i+1; j < arr.length; j++) {
arr[i] = arr[j];
arr[j] = null;
i = j;
}
break;
}
}
}
if(i == arr.length)
System.out.println("没有该学号噢");
return arr;
}
public static boolean contain(Student[]arr,int num){
for (int i = 0; i < arr.length; i++) {
if(arr[i]!=null)
if(arr[i].getNum() == num){
return true;
}
}
return false;
}
public static boolean ifOver(Student[]arr)
{
if(arr[arr.length-1] != null){
System.out.println("超过啦正在创建一个新的容器!");
return true;
}
else
return false;
}
public static Student[] create(Student[] arr){
Student[] newArr = new Student[arr.length+1];
for (int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}
return newArr;
}
public static Student[] insert(Student[]arr){
if (ifOver(arr)){
arr = create(arr);
}
System.out.println("请依次输入该学生的学号名字和年龄");
for (int i = 0; i < arr.length; i++) {
if(arr[i]==null)
{
Student s = new Student();
System.out.println("你现在正在输入学生的学号");
int num = sc.nextInt();
while (contain(arr,num)){
System.out.println("学号重复啦!请重新输入!");
num = sc.nextInt();
}
s.setNum(num);
System.out.println("你现在正在输入学生的名字");
s.setName(sc.next());
System.out.println("你现在正在输入学生的年龄");
s.setAge(sc.nextInt());
arr[i] = s;
break;
}
}
return arr;
}
}
下面为效果图: