学生个人信息及成绩管理系统设计文档

学生个人信息及成绩管理系统

引言

​ 随着计算机技术的发展和互连网时代的到来,计算机早已涉及到我们生活的各个方面,人们对于计算机的应用不再是简单的文字处理和最初的科学计算,更多的利用计算机来进行管理从而减轻我们的工作。而对于学校,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布尔型变量进行判断。
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值