源码在这~~~~~
https://pan.quark.cn/s/4f6693334fed
我编译器用的idea,用其他的也行。
本文介绍了一个基于Java的学生信息管理系统,使用IDEA编译器开发,支持其他编译器。系统功能包括数据持久化、学生信息管理(增删改查)、数据展示和交互体验。整体框架通过ArrayList存储学生信息,并实现文件的自动加载与保存。代码结构分为三个类:Main类负责主程序逻辑,Method类实现增删改查等功能,Student类定义学生信息。系统通过命令行交互,支持添加、删除、修改、查询和展示学生信息,并内置帮助系统。数据保存为CSV文件,程序启动时自动加载数据,确保数据持久化。
一,功能需求
数据持久化:自动加载/保存学生数据文件
信息管理:
添加学生信息(add)
删除学生记录(delete)
修改学生资料(mod)
查询学生信息(query)
数据展示:支持完整列表展示(show)
交互体验:内置帮助系统,实时命令提示
二,整体框架
1. 输入信息存储到集合(ArrayList)。
2. 将结果保存到student.csv文件。
3. 程序启动时自动读取文件数据到集合。
代码实现,先把要写的函数写好,再去具体实现。我一共写了三个类,主函数,方法类实现增删改查的功能,学生类作为学生信息。不嫌麻烦的话,可以自己建一个项目,建三个类,把下面的代码依次复制,运行一下看看效果。
三,代码实现
1,Main类,主循环实现在屏幕捕捉用户输入,进入对应的函数逻辑实现具体的交互。(后来发现了一个bug,如果根目录下没有“student.csv”文件会报错(没写如果没这个文件自动创建),所以得在项目根目录下创建一个。由于没注释,懒得改了)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
static List<Student> students = new ArrayList<>();
public static void main(String[] args) {
Method.loadFromFile(students);
Method.printHelp();
Scanner scanner = new Scanner(System.in);
while (true) {
String command = scanner.nextLine().trim();
switch (command) {
case "add":
Method.AddStudent(students);
break;
case "delete":
Method.DelStudent(students);
break;
case "mod":
Method.ModStudent(students);
break;
case "exit":
System.out.println("程序已退出");
scanner.close();
return;
case "query":
Method.QueryStudent(students);
break;
case "show":
Method.showStudents(students);
break;
default:
System.out.println("无效命令,请重新输入!");
}
}
}
}
2,method类为Main提供具体的方法实现。增删改查。(没注释,代码不用看。浪费时间,复制取用就行,项目思路看一看Main类写的)
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.nio.charset.StandardCharsets;
import java.io.*;
import java.io.BufferedReader;
import java.io.FileReader;
public class Method {
//添加函数
public static void AddStudent(List<Student> students) {
Scanner scan = new Scanner(System.in);
System.out.print("请输入要创建的学生数量: ");
int num = 0;
if (scan.hasNextInt()) {
num = scan.nextInt();
scan.nextLine();
}
for (int i = 1; i <= num; i++) {
System.out.println("\n--- 输入第 " + (i) + " 个学生信息 ---");
System.out.print("学号: ");
long number = 0;
if (scan.hasNextLong()) {
number = scan.nextLong();
scan.nextLine();
for (int j = 0; j < students.size(); j++) {
if (students.get(j).snumber == number){
System.out.println("该同学已存在,是否覆盖(Y/N)");
String k = null;
if (scan.hasNextLine()) {
k = scan.nextLine();
}
assert k != null;
if (k.equals("y")) {
Method.ModStudent(students);
}else if (k.equals("n")) {
Method.AddStudent(students);
}
}
}
}
System.out.print("姓名: ");
String name = null;
if (scan.hasNextLine()) {
name = scan.nextLine();
}
System.out.print("性别: ");
String sex = null;
if (scan.hasNextLine()) {
sex = scan.nextLine();
}
System.out.print("地址: ");
String adress = null;
if (scan.hasNextLine()) {
adress = scan.nextLine();
}
System.out.print("电话: ");
String phone = null;
if (scan.hasNextLine()) {
phone = scan.nextLine();
}
System.out.print("语文成绩: ");
double yuwen = 0;
if (scan.hasNextDouble()) {
yuwen = scan.nextDouble();
}
System.out.print("数学成绩: ");
double math = 0;
if (scan.hasNextDouble()) {
math = scan.nextDouble();
}
System.out.print("英语成绩: ");
double english = 0;
if (scan.hasNextDouble()) {
english = scan.nextDouble();
}
System.out.print("同学评价成绩: ");
double comment = 0;
if (scan.hasNextDouble()) {
comment = scan.nextDouble();
}
System.out.print("思想品德成绩: ");
double virtue = 0;
if (scan.hasNextDouble()) {
virtue = scan.nextDouble();
}
System.out.print("老师评价成绩: ");
double teacherpoint = 0;
if (scan.hasNextDouble()) {
teacherpoint = scan.nextDouble();
}
Student student = new Student(number, name, sex, adress, phone, yuwen, math, english, comment, virtue, teacherpoint);
students.add(student);
}
paixu(students);
Savetofile(students, "students.csv");
System.out.println("\n数据已保存到 students.csv");
}
//删除
public static void DelStudent(List<Student> students) {
System.out.println("请输入要删除的学号:\n");
Scanner scan = new Scanner(System.in);
long n = 0;
if (scan.hasNextLong()) {
n = scan.nextLong();
scan.nextLine();
}
for (int i = 0; i < students.size(); i++) {
if (students.get(i).snumber == n){
students.remove(i);
Savetofile(students, "students.csv");
System.out.println("已删除");
break;
}else {
System.out.println("没找到该同学,请先添加");
}
}
}
//修改
public static void ModStudent(List<Student> students) {
System.out.println("请输入要修改的学号");
Scanner scan = new Scanner(System.in);
long num = 0;
if (scan.hasNextLong()) {
num = scan.nextLong();
scan.nextLine();
}
for (int i = 0; i < students.size() ; i++) {
if (students.get(i).snumber == num){
students.remove(i);
break;
}
}
System.out.print("姓名: ");
String name = null;
if (scan.hasNextLine()) {
name = scan.nextLine();
}
System.out.print("性别: ");
String sex = null;
if (scan.hasNextLine()) {
sex = scan.nextLine();
}
System.out.print("地址: ");
String adress = null;
if (scan.hasNextLine()) {
adress = scan.nextLine();
}
System.out.print("电话: ");
String phone = null;
if (scan.hasNextLine()) {
phone = scan.nextLine();
}
System.out.print("语文成绩: ");
double yuwen = 0;
if (scan.hasNextDouble()) {
yuwen = scan.nextDouble();
}
System.out.print("数学成绩: ");
double math = 0;
if (scan.hasNextDouble()) {
math = scan.nextDouble();
}
System.out.print("英语成绩: ");
double english = 0;
if (scan.hasNextDouble()) {
english = scan.nextDouble();
}
System.out.print("同学评价成绩: ");
double comment = 0;
if (scan.hasNextDouble()) {
comment = scan.nextDouble();
}
System.out.print("思想品德成绩: ");
double virtue = 0;
if (scan.hasNextDouble()) {
virtue = scan.nextDouble();
}
System.out.print("老师评价成绩: ");
double teacherpoint = 0;
if (scan.hasNextDouble()) {
teacherpoint = scan.nextDouble();
}
Student student = new Student(num, name, sex, adress, phone, yuwen, math, english, comment, virtue, teacherpoint);
students.add(student);
paixu(students);
Savetofile(students, "students.csv");
System.out.println("保存成功\n");
}
//查询
public static void QueryStudent(List<Student> students) {
System.out.println("请输入学号进行查询:\n");
Scanner scan = new Scanner(System.in);
long n = 0;
if (scan.hasNextLong()) {
n = scan.nextLong();
scan.nextLine();
}
for (Student student : students) {
if (student.snumber == n) {
System.out.print(student+"\n");
break;
}
}
}
//显示
public static void showStudents(List<Student> students) {
for (Student student : students) {
System.out.print(student+"\n");
}
}
//保存函数
public static void Savetofile(List<Student> students, String filename) {
try (BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(filename),
StandardCharsets.UTF_8))) {
writer.write("学号,姓名,性别,地址,电话,语文成绩,数学成绩,英语成绩,平均成绩,考试排名,同学评价,思想品德,老师评价,总分,排名");
writer.newLine();
for (Student s : students) {
String line = String.format("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s", s.getsnumber(), s.getName(), s.getsex(), s.getaddress(), s.getphone(), s.getyuwen(), s.getmath(), s.getenglish(), (int) s.getavg(), s.gettextrank(), s.getcomment(), s.getvirtue(), s.gettcomment(), (int) s.getpoint(), s.getrank());
writer.write(line);
writer.newLine();
}
} catch (IOException e) {
System.err.println("保存文件时出错: " + e.getMessage());
}
}
//加载函数
static void loadFromFile(List<Student> students) {
try (BufferedReader reader = new BufferedReader(
new FileReader("students.csv", StandardCharsets.UTF_8))) {
// 跳过CSV/文本文件的标题行
reader.readLine();
String line;
while ((line = reader.readLine()) != null) { // 逐行读取直到文件结束
line = line.trim();
if (line.isEmpty()){
continue; // 跳过空行
}
// 使用显式分隔符(假设是逗号分隔)
String[] parts = line.split(",");
// 验证字段数量
if (parts.length != 15) {
System.err.println("忽略无效行(字段数量错误): " + line);
continue;
}
try {
Student studentt = parseStudent(parts);
students.add(studentt);
} catch (IllegalArgumentException e) {
System.err.println("忽略无效行(数据格式错误): " + line);
System.err.println("错误详情: " + e.getMessage());
}
}
} catch (IOException e) {
System.err.println("文件读取失败: " + e.getMessage());
}
}
// 解析方法
private static Student parseStudent(String[] parts) {
return new Student(
Long.parseLong(parts[0]),
parts[1],
parts[2], // 单独处理性别校验
parts[3],
parts[4], // 单独处理电话格式校验
Double.parseDouble(parts[5]),
Double.parseDouble(parts[6]),
Double.parseDouble(parts[7]),
Double.parseDouble(parts[8]),
Double.parseDouble(parts[9]),
Double.parseDouble(parts[10]),
Double.parseDouble(parts[11]),
Double.parseDouble(parts[12]),
Double.parseDouble(parts[13]),
Double.parseDouble(parts[14])
);
}
//帮助
static void printHelp() {
System.out.println("""
--------------------------
命令列表:
add - 添加学生
delete - 删除学生
mod - 更改学生信息
exit - 退出程序
query - 查看学生信息
show - 显示所有信息
--------------------------
""");
}
//排序
public static void paixu(List<Student> students) {
students.sort(Comparator.comparing(Student::getpoint).reversed());
for (int j = 0; j < students.size(); j++) {
students.get(j).rank = 1 + j;
}
students.sort(Comparator.comparing(Student::getavg).reversed());
for (int x = 0; x < students.size(); x++) {
students.get(x).textrank = 1 + x;
}
students.sort(Comparator.comparing(Student::getsnumber));
}
}
3,student类
public class Student {
long snumber;
String sname;
String sex;
String address;
String phone;
double yuwen;
double math;
double english;
double avgscore;
double textrank=0.0;
double comment;
double virtue;
double teacherpoint;
double point;
double rank=0.0;
public Student(long snumber,String sname,String sex,String adress,String phone,double yuwen,double math,double english,double comment,double virtue,double teacherpoint) {
this.snumber=snumber;
this.sname=sname;
this.address=adress;
this.phone=phone;
this.yuwen=yuwen;
this.math=math;
this.english=english;
this.sex=sex;
this.avgscore=(yuwen+math+english)/3;
this.comment=comment;
this.virtue=virtue;
this.teacherpoint=teacherpoint;
this.point=(yuwen+math+english)/5+comment/10+virtue/5;
}
public Student(long snumber, String part, String part1, String part2, String part3, double yuwen, double math, double english, double comment, double virtue, double teacherpoint, double v, double v1, double v2, double v3) {
this.snumber=snumber;
this.sname=part;
this.sex=part1;
this.address=part2;
this.phone=part3;
this.yuwen=yuwen;
this.math=math;
this.english=english;
this.avgscore=comment;
this.textrank=virtue;
this.comment=teacherpoint;
this.virtue=v;
this.teacherpoint=v1;
this.point=v2;
this.rank=v3;
}
public String getName() {
return sname;
}
public String getsex() {
return sex;
}
public Long getsnumber() {
return snumber;
}
public String getaddress() {
return address;
}
public String getphone() {
return phone;
}
public double getyuwen() {
return yuwen;
}
public double getmath() {
return math;
}
public double getenglish() {
return english;
}
public double getavg() {
return avgscore;
}
public double gettextrank() {
return textrank;
}
public double getcomment() {
return comment;
}
public double getvirtue() {
return virtue;
}
public Double gettcomment() {
return teacherpoint;
}
public double getpoint() {
return point;
}
public double getrank() {
return rank;
}
public String toString() {
return String.format("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s",snumber,sname,sex,address,phone,yuwen,math,english,avgscore,textrank,comment,virtue,teacherpoint,point,rank);
}
}