学生信息管理系统(文件+控制台版)

学生信息管理系统(文件+控制台版)

项目描述

基于CSV文件的文件信息管理系统:实现一个基于控制台的学生信息的添加、删除、修改、查询操作

要求

  • 要求可以根据学生的学号、姓名进行查询。
  • 可以通过学号进行删除和修改操作
  • 通过控制台输入学生信息实现添加
提示

CSV:逗号分隔文件,例如:

name,sex,age,idcard,adress
张三,男,13,13412341234,龙子湖校区

学生信息包含五项,分别为:姓名,性别,年龄,学号,地址
创建CSV文件时,编码形式需保存为GB2312或ANSI格式

项目实现思路

从文件中将数据全部读取出来,储存到数组内,进行各种操作,最后再写回文件中

项目具体实现

第一步 创建学生类
  • 创建封装学生类储存单个学生档案信息
  public class stu//学生类
    {
        private String stuNum;//学号
        private String name;//姓名
        private String gender;//性别
        private String age;//年龄
        private String loc;//地址

        public String getStuNum()
        {
            return stuNum;
        }
        public void pushStuNum(String stuNum)
        {
            this.stuNum = stuNum;
        }
        public String getName()
        {
            return name;
        }
        public void pushName(String name)
        {
            this.name = name;
        }
        public String getGender()
        {
            return gender;
        }
        public void pushGender(String gender)
        {
            if(gender.equals("男") || gender.equals("女"))
            {
                this.gender = gender;
                return ;
            }
            else
            {
                System.out.println("输入错误,请重新输入!");
            }
        }
        public String getAge()
        {
            return age;
        }
        public void pushAge(String age)
        {
            this.age = age;
        }
        public String getLoc()
        {
            return loc;
        }
        public void pushLoc(String loc)
        {
            this.loc = loc;
        }
    }
第二‍步 创建文件读取函数
  • 借助InputStreamReader实现字符流与字节流的桥接,避免字符流BufferedReader读取乱码
  • 同时为了保证CSV文件的可读可写性,读取时一行一行的读取
    int read_file(File f, stu[] a) throws IOException {
        FileInputStream fcin = new FileInputStream(f);
        InputStreamReader inr = new InputStreamReader(fcin, "GB2312");
        BufferedReader br = new BufferedReader(inr);
        String line = "";
        String[] arrs = null;
        int ret = 0;
        for(int i = 0; (line=br.readLine())!=null; i ++) {
            arrs=line.split(",");
            a[i] = new stu();
            a[i].pushName(arrs[0].trim());
            a[i].pushGender(arrs[1].trim());
            a[i].pushAge(arrs[2].trim());
            a[i].pushStuNum(arrs[3].trim());
            a[i].pushLoc(arrs[4].trim());
            ret ++;
        }
        br.close();
        inr.close();
        fcin.close();//关闭流时,注意,先开后关,后开先关
        return ret;
    }//从文件中读取数据到数组中
第三步 创建文件写入函数
  • 借助OutputStreamWriter实现字符流与字节流的桥接,避免字符流BufferedWriter写入乱码
  • 同时为了保证CSV文件的可读可写性,写入时,一行一行的写入
    void write_file(File f, stu[] a, int n) throws IOException {
        FileOutputStream fout = new FileOutputStream(f);
        OutputStreamWriter ouw = new OutputStreamWriter(fout, "GB2312");
        BufferedWriter bw = new BufferedWriter(ouw);
        String[] arrs = new String[n];
        for(int i = 0; i < n; i ++)
        {
            arrs[i] = a[i].getName() + "," + a[i].getGender() + "," +  a[i].getAge() + "," + a[i].getStuNum() + "," + a[i].getLoc();
//            System.out.println(arrs[i]);
            bw.write(arrs[i] + "\t\n");
        }
        System.out.println("学生档案信息已储存!");
        bw.close();
        ouw.close();
        fout.close();
    }//将数据从数组存入文件中

第四步 实现菜单功能
  • 直接通过输出即可,这就不用解释了吧
    void putMenu()//显示操作提醒
    {

        System.out.println("********************************");
        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("0.退出学生管理系统并储存学生档案信息");
        System.out.println("********************************");

    }
第五步 实现全体学生档案展示的功能
  • 借助String数组通过for循环在控制台展示全体学生档案
void putAllStu(stu[] a, int n)//展示全部学生档案
    {
        System.out.println("********************************");
        System.out.println("学生档案:");
        String[] arrs = new String[n];
        for(int i = 0; i < n; i ++)
        {
            arrs[i] = "姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" +  a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc();
            System.out.println(arrs[i]);
        }
    }
第六步 主函数实现
  • 通过学生类数组储存从CSV文件中读取的数据,通过switch语句实现选项操作
  • 注意:如果程序没有正常终止,则操作无法正确储存到文件中
public static void main(String[] args) throws IOException {
        File f = new File ("F:\\JAVA\\student\\student.csv");
        stu[] a = new stu[100000];
        StudentSystem op = new StudentSystem();
        Scanner sc = new Scanner(System.in);

        int total = op.read_file(f, a);//记录读取的学生档案总数
        System.out.println("********************************");
        System.out.println("欢迎来到学生信息管理系统");
        int flag = 1;//借助变量flag的值来控制循环的停止与否
        while(flag == 1)
        {
            op.putMenu();
            int data = sc.nextInt();
            switch (data)
            {
                case 0:
                    flag = 0;
                    System.out.println("啊~~,朋友再见!");
                    break;
                case 1:
                    op.putAllStu(a, total);
                    break;
                case 2:
                    total = op.pushStu(a, total);
                    break;
                case 3:
                    op.selectStu(a, total);
                    break;
                case 4:
                    op.reviseStu(a, total);
                    break;
                case 5:
                    total = op.deleteStu(a, total);
                    break;
            }
        }

        op.write_file(f, a, total);//不执行此步则本次运行期间操作无法影响CSV文件
    }
第七步 实现查询操作功能
  • 数据规模较小,直接通过双重循环实现该功能
  • 通过学号或姓名索引,查找学生档案
    void selectStu(stu[] a, int n)//查询学生信息
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入所要进行的查询方式的编号:");
        System.out.println("1.根据学号进行查询");
        System.out.println("2.根据姓名进行查询");
        int data = sc.nextInt();
        switch (data)
        {
            case 1:
                System.out.println("请输入所要查询的学号:");
                String ret1 = sc.next().trim();
                for(int i = 0; i < n; i ++)
                {
                    if(a[i].getStuNum().equals(ret1))
                    {
                        System.out.println("姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" +  a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc());
                        break;
                    }
                    if(i == n - 1) System.out.println("查无此人");
                }
                break;
            case 2:
                System.out.println("请输入所要查询的姓名:");
                String ret2 = sc.next().trim();
                for(int i = 0; i < n; i ++)
                {
                    if(a[i].getName().equals(ret2))
                    {
                        System.out.println("姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" +  a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc());
                        break;
                    }
                    if(i == n - 1) System.out.println("查无此人");
                }
        }
    }
第八步 实现录入学生档案信息功能
  • 通过在数组内尾部添加学生档案信息实现录入,同时返回增加后的学生总数
    int pushStu(stu[] a, int n)//录入学生信息
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入所要添加的学生信息:");
        System.out.println("请输入姓名:");
        String name = sc.next().trim();
        System.out.println("请输入性别:");
        String gender = sc.next().trim();
        System.out.println("请输入年龄:");
        String age = sc.next().trim();
        System.out.println("请输入学号:");
        String stuNum = sc.next().trim();
        System.out.println("请输入地址:");
        String loc = sc.next().trim();
        a[n] = new stu();
        a[n].pushName(name);
        a[n].pushGender(gender);
        a[n].pushAge(age);
        a[n].pushStuNum(stuNum);
        a[n].pushLoc(loc);
        System.out.println("录入成功!");
        System.out.println("姓名:" + a[n].getName() + " 性别:" + a[n].getGender() + " 年龄:" +  a[n].getAge() + " 学号:" + a[n].getStuNum() + " 地址:" + a[n].getLoc());
        return n + 1;
    }
第九步 实现删除学生档案信息功能
  • 通过将数组最后位置的学生信息,覆盖到要删除的学生信息来实现删除,并返回删除后的学生总数
  • 通过学号来索引,查找要删除的学生档案
    int deleteStu(stu[] a, int n)//删除学生信息
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入所要删除的学生档案的学号:");
        String ret = sc.next().trim();
        for(int i = 0; i < n; i ++)
        {
            if(a[i].getStuNum().equals(ret))
            {
                a[i].pushName(a[n - 1].getName());
                a[i].pushGender(a[n - 1].getGender());
                a[i].pushAge(a[n - 1].getAge());
                a[i].pushStuNum(a[n - 1].getStuNum());
                a[i].pushLoc(a[n - 1].getLoc());
                System.out.println("已删除目标学生档案");
                return n - 1;
            }
        }
        System.out.println("查无此人");
        return n;
    }
第十步 实现修改学生档案信息功能
  • 通过覆盖写入数组的方法,实现修改学生档案信息功能
  • 通过学号来索引,查找要修改的学生档案
    void reviseStu(stu[] a, int n)//修改学生信息
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入所要修改的学生档案的学号:");
        String ret = sc.next().trim();
        for(int i = 0; i < n; i ++ )
        {
            if(a[i].getStuNum().equals(ret))
            {
                System.out.println("请输入修改后的学生信息:");
                System.out.println("请输入姓名:");
                String name = sc.next().trim();
                System.out.println("请输入性别:");
                String gender = sc.next().trim();
                System.out.println("请输入年龄:");
                String age = sc.next().trim();
                System.out.println("请输入学号:");
                String stuNum = sc.next().trim();
                System.out.println("请输入地址:");
                String loc = sc.next().trim();
                a[i].pushName(name);
                a[i].pushGender(gender);
                a[i].pushAge(age);
                a[i].pushStuNum(stuNum);
                a[i].pushLoc(loc);
                System.out.println("修改成功!");
                System.out.println("姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" +  a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc());
                return ;
            }
        }
        System.out.println("查无此人");
    }

项目完整代码

package IO;

import java.io.*;
import java.util.Scanner;

public class StudentSystem {
    public static void main(String[] args) throws IOException {
        File f = new File ("F:\\JAVA\\student\\student.csv");
        stu[] a = new stu[100000];
        StudentSystem op = new StudentSystem();
        Scanner sc = new Scanner(System.in);

        int total = op.read_file(f, a);
        System.out.println("********************************");
        System.out.println("欢迎来到学生信息管理系统");
        int flag = 1;
        while(flag == 1)
        {
            op.putMenu();
            int data = sc.nextInt();
            switch (data)
            {
                case 0:
                    flag = 0;
                    System.out.println("啊~~,朋友再见!");
                    break;
                case 1:
                    op.putAllStu(a, total);
                    break;
                case 2:
                    total = op.pushStu(a, total);
                    break;
                case 3:
                    op.selectStu(a, total);
                    break;
                case 4:
                    op.reviseStu(a, total);
                    break;
                case 5:
                    total = op.deleteStu(a, total);
                    break;
            }
        }

        op.write_file(f, a, total);
    }

    int read_file(File f, stu[] a) throws IOException {
        FileInputStream fcin = new FileInputStream(f);
        InputStreamReader inr = new InputStreamReader(fcin, "GB2312");
        BufferedReader br = new BufferedReader(inr);
        String line = "";
        String[] arrs = null;
        int ret = 0;
        for(int i = 0; (line=br.readLine())!=null; i ++) {
            arrs=line.split(",");
            a[i] = new stu();
            a[i].pushName(arrs[0].trim());
            a[i].pushGender(arrs[1].trim());
            a[i].pushAge(arrs[2].trim());
            a[i].pushStuNum(arrs[3].trim());
            a[i].pushLoc(arrs[4].trim());
//            System.out.println(a[i].getName() + "*" + a[i].getGender() + "*" +  a[i].getAge() + "*" + a[i].getStuNum() + "*" + a[i].getLoc());
            ret ++;
        }
        br.close();
        inr.close();
        fcin.close();
        return ret;
    }//从文件中读取数据到数组中

    void write_file(File f, stu[] a, int n) throws IOException {
        FileOutputStream fout = new FileOutputStream(f);
        OutputStreamWriter ouw = new OutputStreamWriter(fout, "GB2312");
        BufferedWriter bw = new BufferedWriter(ouw);
        String[] arrs = new String[n];
        for(int i = 0; i < n; i ++)
        {
            arrs[i] = a[i].getName() + "," + a[i].getGender() + "," +  a[i].getAge() + "," + a[i].getStuNum() + "," + a[i].getLoc();
//            System.out.println(arrs[i]);
            bw.write(arrs[i] + "\t\n");
        }
        System.out.println("学生档案信息已储存!");
        bw.close();
        ouw.close();
        fout.close();
    }//将数据从数组存入文件中

    void selectStu(stu[] a, int n)//查询学生信息
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入所要进行的查询方式的编号:");
        System.out.println("1.根据学号进行查询");
        System.out.println("2.根据姓名进行查询");
        int data = sc.nextInt();
        switch (data)
        {
            case 1:
                System.out.println("请输入所要查询的学号:");
                String ret1 = sc.next().trim();
                for(int i = 0; i < n; i ++)
                {
                    if(a[i].getStuNum().equals(ret1))
                    {
                        System.out.println("姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" +  a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc());
                        break;
                    }
                    if(i == n - 1) System.out.println("查无此人");
                }
                break;
            case 2:
                System.out.println("请输入所要查询的姓名:");
                String ret2 = sc.next().trim();
                for(int i = 0; i < n; i ++)
                {
                    if(a[i].getName().equals(ret2))
                    {
                        System.out.println("姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" +  a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc());
                        break;
                    }
                    if(i == n - 1) System.out.println("查无此人");
                }
        }
    }

    int deleteStu(stu[] a, int n)//删除学生信息
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入所要删除的学生档案的学号:");
        String ret = sc.next().trim();
        for(int i = 0; i < n; i ++)
        {
            if(a[i].getStuNum().equals(ret))
            {
                a[i].pushName(a[n - 1].getName());
                a[i].pushGender(a[n - 1].getGender());
                a[i].pushAge(a[n - 1].getAge());
                a[i].pushStuNum(a[n - 1].getStuNum());
                a[i].pushLoc(a[n - 1].getLoc());
                System.out.println("已删除目标学生档案");
                return n - 1;
            }
        }
        System.out.println("查无此人");
        return n;
    }
    void reviseStu(stu[] a, int n)//修改学生信息
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入所要修改的学生档案的学号:");
        String ret = sc.next().trim();
        for(int i = 0; i < n; i ++ )
        {
            if(a[i].getStuNum().equals(ret))
            {
                System.out.println("请输入修改后的学生信息:");
                System.out.println("请输入姓名:");
                String name = sc.next().trim();
                System.out.println("请输入性别:");
                String gender = sc.next().trim();
                System.out.println("请输入年龄:");
                String age = sc.next().trim();
                System.out.println("请输入学号:");
                String stuNum = sc.next().trim();
                System.out.println("请输入地址:");
                String loc = sc.next().trim();
                a[i].pushName(name);
                a[i].pushGender(gender);
                a[i].pushAge(age);
                a[i].pushStuNum(stuNum);
                a[i].pushLoc(loc);
                System.out.println("修改成功!");
                System.out.println("姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" +  a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc());
                return ;
            }
        }
        System.out.println("查无此人");
    }
    int pushStu(stu[] a, int n)//录入学生信息
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入所要添加的学生信息:");
        System.out.println("请输入姓名:");
        String name = sc.next().trim();
        System.out.println("请输入性别:");
        String gender = sc.next().trim();
        System.out.println("请输入年龄:");
        String age = sc.next().trim();
        System.out.println("请输入学号:");
        String stuNum = sc.next().trim();
        System.out.println("请输入地址:");
        String loc = sc.next().trim();
        a[n] = new stu();
        a[n].pushName(name);
        a[n].pushGender(gender);
        a[n].pushAge(age);
        a[n].pushStuNum(stuNum);
        a[n].pushLoc(loc);
        System.out.println("录入成功!");
        System.out.println("姓名:" + a[n].getName() + " 性别:" + a[n].getGender() + " 年龄:" +  a[n].getAge() + " 学号:" + a[n].getStuNum() + " 地址:" + a[n].getLoc());
        return n + 1;
    }
    void putAllStu(stu[] a, int n)//展示全部学生档案
    {
        System.out.println("********************************");
        System.out.println("学生档案:");
        String[] arrs = new String[n];
        for(int i = 0; i < n; i ++)
        {
            arrs[i] = "姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" +  a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc();
            System.out.println(arrs[i]);
        }
    }
    void putMenu()//显示操作提醒
    {

        System.out.println("********************************");
        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("0.退出学生管理系统并储存学生档案信息");
        System.out.println("********************************");

    }

    public class stu//学生类
    {
        private String stuNum;//学号
        private String name;//姓名
        private String gender;//性别
        private String age;//年龄
        private String loc;//地址

        public String getStuNum()
        {
            return stuNum;
        }
        public void pushStuNum(String stuNum)
        {
            this.stuNum = stuNum;
        }
        public String getName()
        {
            return name;
        }
        public void pushName(String name)
        {
            this.name = name;
        }
        public String getGender()
        {
            return gender;
        }
        public void pushGender(String gender)
        {
            if(gender.equals("男") || gender.equals("女"))
            {
                this.gender = gender;
                return ;
            }
            else
            {
                System.out.println("输入错误,请重新输入!");
            }
        }
        public String getAge()
        {
            return age;
        }
        public void pushAge(String age)
        {
            this.age = age;
        }
        public String getLoc()
        {
            return loc;
        }
        public void pushLoc(String loc)
        {
            this.loc = loc;
        }
    }
}

我是@荒诞丶学家,水平有限,不过觉得文章不错的话,不妨点个赞关注下!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值