学生个人信息及成绩管理系统
引言
随着计算机技术的发展和互连网时代的到来,计算机早已涉及到我们生活的各个方面,人们对于计算机的应用不再是简单的文字处理和最初的科学计算,更多的利用计算机来进行管理从而减轻我们的工作。而对于学校,Internet技术持续迅猛的发展,也给传统的办学提出了新的模式。但一直以来,学校使用传统人工的方式进行管理,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护带来了不少的困难。为了提高工作效率,提高整个学校的学生信息管理水平,我们开发了这套学生信息管理系统,通过它,我们可以帮助学校、老师方便,快捷的掌握学生个人信息及成绩的情况,实现学生信息的系统化、规范化、自动化、达到提高学生信息管理效率的目的。
第一章 项目简介
1.1项目背景
随着计算机技术的发展和互连网时代的到来,计算机早已涉及到我们生活的各个方面,人们对于计算机的应用不再是简单的文字处理和最初的科学计算,更多的利用计算机来进行管理从而减轻我们的工作。
1.2研究目的
为了提高工作效率,提高整个学校的学生信息管理水平,我开发了这套学生信息管理系统,通过它,我们可以帮助学校、老师方便,快捷的掌握学生的个人信息及成绩情况,实现学生信息的系统化、规范化、自动化、达到提高学生信息管理效率的目的。
1.3使用工具
开发工具:IntelliJ IDEA 2021.2.3
编程语言:Java
运行环境:jdk1.8
硬件:笔记本电脑,鼠标,键盘;
操作系统:Windows 10;
其它软件:截图工具,谷歌浏览器,ProcessOn,Typora;
第二章 需求分析
2.1项目内容
设计并实现一个学生个人信息及成绩管理系统,即定义一个包含学生个人信息(学号,姓名,性别,年龄)及成绩(专业课成绩,高数成绩,英语成绩,体育成绩)的在控制台显示的数据表。
2.2功能分析
(1)package com.StudentInformationScoreManagementSystem.Main;
- Main类:实现读取文档初始化学生对象和显示菜单功能
(2)package com.StudentInformationScoreManagementSystem.Judge;
- Judge类:提供多种静态方法对输入的各种数据进行验证是否合法
(3)package com.StudentInformationScoreManagementSystem.Student;
- Student类:以成员变量的形式,用字符串储存学生的学号(唯一),姓名,性别,年龄,专业课成绩,高数成绩,英语成绩,体育成绩
(4)package com.StudentInformationScoreManagementSystem.Manage;
- Manage类: 菜单功能,用户可以选择一项进行操作。将学生信息按照学号进行排序。 将学生信息写入文件中。
- HelpWay类: 帮助菜单,为用户提供简单的使用方法。
- Insert类: 插入学生个人信息及成绩,并将其存入文档 。
- ModifyWay类: 修改学生个人信息及成绩,并将其存入文档 。
- DisplayWay类: 显示功能,显示当前已有学生的个人信息及成绩 。
- DelWay类: 删除功能,按照学号可以将该学生的个人信息及成绩删除。
- SeekWay类:查找功能,通过输入学号或者姓名查找该学生的个人信息及成绩。
- ReadFileWay类: 读档功能,在未显示菜单之前执行一次,读取已有学生的个人信息及成绩。
- SortWay类: 排序工能,将学生对象排序,并按学号升序重新将信息写入文件 。
2.3项目要求
(1)有良好程序风格(文档注释,函数注释,语句注释)。
(2)程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。
(3)程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4)将功能尽可能全部实现,并减少重复的代码出现。
(5)使用文件功能能对程序运行结果进行保存和读取。
(6)判断功能,每次输入时都会判断是否合理,如果不合理,将给出提示并重新输入。
(7)存储结构采用对象数组,顺序储存结构。
第三章 主要算法流程设计
3.1主方法流程图
用例描述:首先开始会进行一个读档的功能,即在未显示菜单执行一次,读取已有学生的个人信息及成绩。然后用户在控制台输入相应数字,如果输入数字合法且菜单的命令正确执行,则本次功能的使用完成,否则,则需要重新输入相应数字,来执行菜单中的命令。
3.2增加学生信息流程图
用例描述:首先进入增加学生个人信息及成绩的命令之中,然后输入增加输入学生的个数,此时,系统会自动创建学生对象,然后用户根据提示一个一个正确且合法的输入学生的信息及成绩,如果信息合理,则会提示信息录入完毕,将学生信息存入文档中,再对学生按照学号升序排序。如果信息不合理,则需要重新输入该学生的信息及成绩,如果信息未录入完毕,则需要重新创建学生对象。
3.3功能流程图
第四章 项目详细设计
4.1项目结构
4.2主函数
package com.StudentInformationScoreManagementSystem.Main;
import com.StudentInformationScoreManagementSystem.Manage.Manage;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
//建立学生成绩管理系统
Manage m1 = new Manage();
//从文档中读取已有学生的信息
try {
m1.readFile();
} catch (IOException e) {
e.printStackTrace();
}
//在Manage类中默认public boolean flag = true;
while(m1.flag){
m1.meau();
}
System.out.println("您已经退出该系统");
}
}
4.3学生属性
package com.StudentInformationScoreManagementSystem.Student;
public class Student {
//学号
public String code;
//姓名
public String name;
//性别
public String sex;
//年龄
public String age;
//专业课成绩
public String ProfessionalCourseScores;
//高数成绩
public String HighScores;
//英语成绩
public String EnglishScores;
//体育成绩
public String PEScores;
}
4.4功能实现
4.4.1菜单功能
4.4.2显示功能
4.4.3判别功能
- 核心代码
- 不同属性判别略有区别 但大体一样
//判断输入学生的数量是否合法 非法返回false 合法返回ture
public static boolean judgeNum(String str){
char [] ch = str.toCharArray();
for (int i = 0; i < ch.length; i++) {
if(ch[i] < 48 || ch[i] > 57){
//十进制的48对应的字符为0 十进制的57对应的字符为9
return false;
}
}
// Manage.N-Manage.n 不得超过最大学生数量N
if(Integer.parseInt(str) < 0 || Integer.parseInt(str) > Manage.N-Manage.n)
return false;
return true;
}
4.4.4增加学生功能
- 核心代码
- 增加学生信息代码大致相同 此处仅是举例
//输入学号并判断是否输入合法
System.out.println("请输入第" + (j - n + 1) + "个学生的学号");
stu[j].code = sc.next();
if (!Judge.judgeCode(stu[j].code)) {
System.out.println("输入有误或学号已存在,请重新输入该学生的信息");
continue;
}
4.4.5将增加信息存入文档功能
- 核心代码
// 将新输入的信息存入文档
FileWriter fw = null;
try {
fw = new FileWriter("Student.txt", true);
} catch (IOException e) {
e.printStackTrace();
}
String strTemp = new String(stu[j].code + " \t " + stu[j].name + " \t"
+ stu[j].age + " \t" + stu[j].sex + " \t" + stu[j].ProfessionalCourseScores
+ " \t" + stu[j].HighScores + " \t "
+ stu[j].EnglishScores + " \t" + stu[j]. PEScores + " \t" + stu[j].getAverage() + "\r\n");
try {
fw.write(strTemp);
} catch (IOException e) {
e.printStackTrace();
}
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
4.4.6按学号删除学生功能
- 删除前
- 删除后
- 核心代码
// 对文件里该学生的信息进行删除
File f = new File("Student.txt");
long length = f.length();
FileReader fr = new FileReader("Student.txt");
char[] ch = new char[(int) length];
fr.read(ch);
fr.close();
String str = new String(ch);
// 进行删除操作
str = str.replace(dataOfStudent, "");
// 将新字符串写入文件
FileWriter fw = new FileWriter("Student.txt");
fw.write(str);
fw.close();
4.4.7修改学生信息功能
- 修改前
- 修改中
-
修改后
-
核心代码
// 定义字符串变量dataOfStudentNew存储修改后学生的信息
String dataOfStudentNew = new String(stu[i].code + " \t " + stu[i].name + " \t"
+ stu[i].age + " \t" + stu[i].sex + " \t" + stu[i].ProfessionalCourseScores
+ " \t" + stu[i].HighScores + " \t "
+ stu[i].EnglishScores + " \t" + stu[i]. PEScores + " \t" + stu[i].getAverage() + "\r\n");
File f = new File("Student.txt");
long length = f.length();
FileReader fr = null;
try {
fr = new FileReader("Student.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
char[] ch = new char[(int) length];
try {
fr.read(ch);
} catch (IOException e) {
e.printStackTrace();
}
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
String str1 = new String(ch);
// 进行修改操作
//replace() 方法用于在字符串中用一些字符替换另一些字符
str1 = str1.replace(dataOfStudentOld, dataOfStudentNew);
// 将新字符串写入文件
FileWriter fw = null;
try {
fw = new FileWriter("Student.txt");
} catch (IOException e) {
e.printStackTrace();
}
try {
fw.write(str1);
} catch (IOException e) {
e.printStackTrace();
}
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
4.4.8查询学生成绩功能
- 核心代码
System.out.println("请输入要查询的学生的学号:\n");
code = sc.next();
for (int i = 0; i < n; i++)
if (stu[i].code.equals(code)) {
System.out.println("学生学号 学生姓名 年龄 性别 专业课成绩 高数成绩 英语成绩 体育成绩 平均分");
System.out.println("----------------------------------------------------------------------------------------------------------------\n");
System.out.println(stu[i].code + " \t " + stu[i].name + " \t"
+ stu[i].age + " \t" + stu[i].sex + " \t" + stu[i].ProfessionalCourseScores
+ " \t" + stu[i].HighScores + " \t "
+ stu[i].EnglishScores + " \t" + stu[i]. PEScores + " \t" + stu[i].getAverage()+ "\r\n");
}
System.out.println("请输入要查询的学生的姓名:");
name = sc.next();
for (int i = 0; i < n; i++)
if (stu[i].name.equals(name)) {
System.out.println("学生学号 学生姓名 年龄 性别 专业课成绩 高数成绩 英语成绩 体育成绩 平均分");
System.out.println("----------------------------------------------------------------------------------------------------------------\n");
System.out.println(stu[i].code + " \t " + stu[i].name + " \t"
+ stu[i].age + " \t" + stu[i].sex + " \t" + stu[i].ProfessionalCourseScores
+ " \t" + stu[i].HighScores + " \t "
+ stu[i].EnglishScores + " \t" + stu[i]. PEScores + " \t" + stu[i].getAverage()+"\r\n");
}
4.4.9计算平均分功能
public String getAverage() {
double allScrse =0;
allScrse = Double.parseDouble(ProfessionalCourseScores) +
Double.parseDouble(HighScores) +
Double.parseDouble(EnglishScores) +
Double.parseDouble(PEScores);
return "" + allScrse/4;
}
4.4.10学号排序功能
- 核心代码
//对学号进行排序
void sort() throws IOException {
int[] code = new int[n];
int temp;
Student stuTemp = new Student();
for (int i = 0; i < n; i++) {
code[i] = Integer.parseInt(stu[i].code);
}
//使用选择排序法对学生对象进行排序
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (code[i] > code[j]) {
// 对code数组元素进行交换
temp = code[i];
code[i] = code[j];
code[j] = temp;
// 对Student对象数组元素进行交换
stuTemp = stu[i];
stu[i] = stu[j];
stu[j] = stuTemp;
}
}
}
第五章 改进
5.1用户方面
- 设置三重身份:学生 老师 管理员。 不同身份可以使用的功能也不一样 权力大小:学生<老师<管理员
- 不同身份所看到的页面也不相同,三重身份之间,操作互不影响。
5.2界面方面
- 界面将不再在Java控制台显示,而是通过Swing 或者html实现 。
5.3数据保存方面
- 使用ArrayList或者Vector存储数据,都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,导致索引数据快而插入数据慢。
- LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,索引就变慢了,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。且LinkedList 也是线程不安全的,但LinkedList 提供了一些方法,使得 LinkedList 可以被当作堆栈和队列来使用。
- 使用数据库对数据进行一个存储
5.4技术使用方面
- 不再是简单的纯Java代码 引用SpringBoot框架,数据库,Mysql,MyBaits,Tomcat7.0 ,html,css等。
第六章 总结
6.1文件操作
- 使用FileReader类对文件操作时,若要获取整个字符串,可先用File类对象获取文件长度,定义大小刚好合适的字符数组,使用FileReader类对象的read(char[] arr)将文件存储在字符数组中,然后转化为字符串进行操作。
- 使用FileWriter类的对象进行写入文件时,可根据不同情况选择从头写入还是末尾追加进行打开文件。写入文件成功后牢记关闭对象引用,防止文件丢失。
6.2字符串操作
- 使用正则表达式,用于分割字符串。空白字符可用\s表示。则换行符"\r\n"的对应正则表达式为:regex = “\s{2}”。
- 删除某一字符串str1时可用str = str.replace(str1,“”)进行删除。
- 从键盘读取一个字符串时可用sc.next()进行读取。
6.3其他
va代码 引用SpringBoot框架,数据库,Mysql,MyBaits,Tomcat7.0 ,html,css等。
第六章 总结
6.1文件操作
- 使用FileReader类对文件操作时,若要获取整个字符串,可先用File类对象获取文件长度,定义大小刚好合适的字符数组,使用FileReader类对象的read(char[] arr)将文件存储在字符数组中,然后转化为字符串进行操作。
- 使用FileWriter类的对象进行写入文件时,可根据不同情况选择从头写入还是末尾追加进行打开文件。写入文件成功后牢记关闭对象引用,防止文件丢失。
6.2字符串操作
- 使用正则表达式,用于分割字符串。空白字符可用\s表示。则换行符"\r\n"的对应正则表达式为:regex = “\s{2}”。
- 删除某一字符串str1时可用str = str.replace(str1,“”)进行删除。
- 从键盘读取一个字符串时可用sc.next()进行读取。
6.3其他
- 设计程序时,若要判断某一段程序是否被执行,可合理设置flag布尔型变量进行判断。