Java基础练习:学生管理系统(数组版)

Java基础练习:学生管理系统(数组版)

为了复习和巩固前面所学习的知识,我做了这个练习,遇到了问题,加深了自己的一些理解。
本文适用于Java初学者,也欢迎大佬指正其中所包含的不足,谢谢!
如有疑问,请及时提出,或者私信我,
如有意向,也可私信加微信共勉!
这只是第一版,后面还会更新数据库的版本,敬请期待!

需求:设置一个学生管理系统

1.添加学生信息

2.显示学生信息

3.删除学生信息

4.修改学生信息

5.查看学生信息

6.排序

7.退出

数组版

思路:

1.设计一个数组,用来存储学生信息

2.创建一个student类,用来封装对象

3.使用switch/case条件分支语句来实现对数组内存储的信息进行选择操作模式

4.构建对应的方法用来操作数组中的数据

出现的异常

  • java.util.InputMismatchException :在输入学号是,我错误的输入了名字(即字符),而nextInt()方法只能输入整数,导致抛出此异常。
  • ConcurrentModificationException :在遍历数组时,使用数组的remove方法溢出元素。

遇到的问题

  • 在修改student对象的值后,再次添加该对象进入数组,所得到的数组对象中的值是相同的

在这里插入图片描述

原因:

  • 我们在new对象时,数组对象的id是唯一的,将对象add进入list中,放入list中的其实还是对象的应用,每次每次添加的student只是简单的set对象的额属性,set新的属性值, 而add进list中的对象还是同一个对象id,也就是同一个对象;
  • 每次添加student对象,只是添加对象的应用,新的student覆盖掉之前的add对象,所以每次添加student对象,只会是最后一个设置的值
  • 避免此状况,需要保证对象的应用是惟一的,即new新的对象

下面贴代码


Student.java

package cn.xlb;

/*
@author XiHai ShengGe
*/
public class Student {
    private int number;
    private String name;
    private int grade;

    public Student() {
    }

    public Student(int number, String name, int grade) {
        this.number = number;
        this.name = name;
        this.grade = grade;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getName() {
        return name;
    }

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

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }

    @Override
    public String toString() {
        return "Student{" +
                "number=" + number +
                ", name='" + name + '\'' +
                ", grade='" + grade + '\'' +
                '}';
    }
}

Manage.java

package cn.xlb;

import java.lang.reflect.Array;
import java.util.*;

/*
@author XiHai ShengGe
*/public class Manage {
    public static void main(String[] args) {
        //创建ArrayList数组用来存储数据
        List<Student> students = new ArrayList<Student>();
        //开始进行操作,避免程序使用一次后就退出
        System.out.println("欢迎进入学生管理系统\n" +
                "1.添加学生信息\n" +
                "2.显示学生信息\n" +
                "3.删除学生信息\n" +
                "4.修改学生信息\n" +
                "5.查询学生信息\n" +
                "6.排序\n" +
                "7.退出\n");
        //创建Scanner对象,以免循环体中重复创建
        Scanner s = new Scanner(System.in);
        Manage manage = new Manage();
        while (true) {
            System.out.println("请输入你要进行的操作:");
            int i = s.nextInt();
            //使用switch/case方法模块化各种方法
            switch (i) {
                case 1:
                    manage.add(s, students);
                    break;
                case 2:
                    show(students);
                    break;
                case 3:
                    manage.del(s, students);
                    break;
                case 4:
                    manage.update(s,students);
                    break;
                case 5:
                    manage.inquire(s,students);
                    break;
                case 6:
                    manage.sort(s,students);
                    break;
                case 7:
                    System.exit(0);
                    break;
                default:
                    System.out.println("请输入1~7之间的数");
            }
        }
    }

    /*
     *添加学生信息
     *
     */
    public void add(Scanner s,List<Student> students) {
        //创建Student对象,使得每一次所添加的student都不相同
        Student student = new Student();
        System.out.print("请输入需要添加的学号:");
        int number = s.nextInt();
        //注意排除学号相同的情况
        boolean f = true;
        if (students != null) {
            for (Student stu : students) {
                if (stu.getNumber() == number) {
                    f = false;
                    break;
                }
            }
        }
        if (f) {
            student.setNumber(number);
            System.out.print("请输入对应的姓名:");
            student.setName(s.next());
            System.out.print("请输入对应的成绩:");
            student.setGrade(s.nextInt());
            students.add(student);
            System.out.println(students);
        }else{
            System.out.println("学号重复");
        }
    }

    /*
     *显示所有学生信息
     *
     */
    public static void show(List<Student> students) {
        for (Student s : students) {
            System.out.println("学号:" + s.getNumber() + "姓名:" + s.getName() + "成绩:" + s.getGrade());
        }
    }

    /*
     *删除学生信息
     *
     */
    public void del(Scanner s, List<Student> list) {
        System.out.println("请输入需要删除的学生学号:");
        int number = s.nextInt();
        System.out.println("你是否要继续进行删除操作?(1是,2否)");
        int i = s.nextInt();
        if (i == 1) {
            boolean flag = false;
            //返回此列表中元素的迭代器。
            Iterator<Student> iterator = list.iterator();
            while (iterator.hasNext()){
                Student student = iterator.next();
                if (student.getNumber() == number) {
                    iterator.remove();
                    flag = true;
                    break;
                }
            }
            if (flag) {
                System.out.println("学号为" + number + "的学生信息已删除");
            }else {
                System.out.println("没有该学号对应的学生信息");
            }
            /*
            //会出现ConcurrentModificationException异常
            for (Student student : list) {
                if (student.getNumber() == number) {
                    System.out.println("学号为"+ number + "的学生信息已删除");
                    list.remove(student);
                } else {
                    System.out.println("没有该学号对应的学生信息");
                }
            }
            */

        } else if (i == 2) {
            System.out.println("已退出删除操作");
        } else {
            System.out.println("输入错误,已退出");
        }
    }

    /*
     *修改学生信息
     *
     */
    public void update(Scanner s,List<Student> list) {
        boolean flag = false;
        System.out.println("请输入要修改信息的学号:");
        int number = s.nextInt();
        for (Student student : list) {
            if (student.getNumber() == number){
                System.out.println("修改学号为" + number + "的学生信息");
                System.out.print("修改姓名为:");
                student.setName(s.next());
                System.out.print("修改成绩为:");
                student.setGrade(s.nextInt());
                flag = true;
                break;
            }
        }
        if (flag){
            System.out.println("修改完成");
        }else {
            System.out.println("输入学号有误");
        }
    }

    /*
     *查询学生信息
     *
     */
    public void inquire(Scanner s,List<Student> list) {
        boolean flag = false;
        System.out.println("请输入需要查询信息的学生学号");
        int number = s.nextInt();
        for (Student stu : list) {
            if (stu.getNumber() == number){
                System.out.println("学号:" + stu.getNumber() + "姓名:" + stu.getName() + "成绩:" + stu.getGrade());
                flag = true;
                break;
            }
        }
        if (!flag){
            System.out.println("所查询学号不存在");
        }
    }

    /*
     *排序
     *
     */
    public void sort(Scanner s,List<Student> list) {
        System.out.println("请选择排序方法:1.按学号排序;2.按成绩排序");
        int i = s.nextInt();
        boolean flag = true;
        //选择排序模式
        switch(i){
            case 1:
                //冒泡排序
                for (int j = 0; j < list.size()-1 && flag; j++) {
                    flag = false;
                    for (int k = 0; k < list.size()-j-1; k++) {
                        System.out.println(list.get(k).getNumber());
                        if ((Integer)list.get(k).getNumber() > (Integer)list.get(k+1).getNumber()){
                            //交换两个位置上的值
                            Student tp = list.get(k);
                            list.set(k,list.get(k+1));
                            list.set(k+1,tp);
                            flag = true;
                        }
                    }
                }
                show(list);
                break;
            case 2:
                //冒泡排序
                for (int j = 0; j < list.size()-1 && flag; j++) {
                    flag = false;
                    for (int k = 0; k < list.size()-j-1; k++) {
                        System.out.println(list.get(k).getGrade());
                        if ((Integer)list.get(k).getGrade() > (Integer)list.get(k+1).getGrade()){
                            //交换两个位置上的值
                            Student tp = list.get(k);
                            list.set(k,list.get(k+1));
                            list.set(k+1,tp);
                            flag = true;
                        }
                    }
                }
                show(list);
                break;
            default:
                System.out.println("请输入1或2");
        }
    }
}

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值