学生管理系统(超详细教程+源码)

学生管理系统

1. 前言

1.1 项目地址

本项目共有前后两端地址(使用Docker部署,也可以自己部署到本地)。

2. 开发环境

2.1 基础环境

  • JDK版本: 17
  • MySQL版本: 8.0.36
  • Redis版本: 3.2.100
  • IntelliJ IDEA版本: 2024.1
  • Node版本: 20.10.0
  • Docker版本: 26.1.0
  • Nginx版本: 1.18.0

2.2 技术栈

  • 前端: vue-admin-template模板(vue、element-ui)、ECharts、Vuex Store
  • 后端: Springboot、mybatis-plus、maven、阿里云oss对象存储、MD5加密、JWT、邮箱服务、Servlet

3. 系统分析

3.1 需求分析

用户角色与权限

系统应支持三种用户角色:管理员、教师和学生。每种角色都有其特定的功能需求。

  • 管理员: 用户管理、课程管理等。
  • 教师: 个人信息修改、任课信息查询、学生课程成绩管理等。
  • 学生: 个人信息修改、选课信息查询、课程成绩查询等。
3.1.1 公共功能
  • 注册与登录: 提供注册和登录功能,确保用户能够正确地进入系统并使用其账户。
  • 初步验证: 在注册过程中使用JavaScript进行密码格式、手机号、邮箱等的初步验证。
  • 验证码功能: 登录时增加验证码功能,增强账户安全性。
  • 找回密码: 通过邮箱进行找回密码操作。
  • 上传图片: 允许用户上传图片用于个人资料的更新。
  • 报表统计与查询检索: 生成各种报表,并提供强大的查询检索功能。
3.1.2 管理员用户功能
  • 用户管理: 修改各用户的密码,进行用户管理操作。
  • 教师档案管理: 管理教师档案,包括基本信息、工作经历、学历学位等。
  • 学生档案管理: 管理学生档案,包括基本信息、成绩、选课情况等。
  • 课程管理: 负责课程的排课,包括确定任课教师、时间和教室等。
3.1.3 教师用户功能
  • 个人信息修改: 修改个人信息,包括上传头像等。
  • 任课信息查询: 查询任课信息。
  • 学生课程成绩管理: 管理学生的课程成绩,可以以图形化显示或报表形式下载。
  • 学生课程信息分类查询: 根据成绩对学生课程信息进行分类查询,并提供下载和图形化显示选项。
3.1.4 学生用户功能
  • 个人信息修改: 修改个人信息,如姓名、学号、性别等,并上传头像。
  • 选课信息查询: 查询选课信息,包括任课教师、上课时间和地点。
  • 课程成绩查询: 查询课程成绩,并以报表形式下载。

3.3 系统流程分析

系统分为管理员、教师、学生三个角色。每个角色代表不同的账号身份和功能需求。

  • 用户登录流程: 账号和密码必须与数据库中的信息比对,只有正确的信息才能进入下一步操作。

3.4 系统性能分析

  • 后端数据库: 采用MySQL与Redis缓存结合使用,减少数据库访问次数和查询开销。合理设计数据库表结构,建立索引,加快查询速度,使用数据库连接池管理数据库连接。
  • 后端算法优化: 优化算法和代码逻辑,减少资源消耗和计算时间。
  • 前端Vue: 添加keep-alive功能,提升系统性能和用户体验,减少页面渲染开销。

4. 系统设计

4.1 功能结构设计

系统主要基于数据的增加、修改、删除等操作。

4.1.1 管理员功能结构设计

管理员功能包括找回密码(邮箱),上传头像和数据报表统计,对教师和学生的档案管理以及密码管理,对课程信息进行管理。

4.1.2 教师功能结构设计

教师功能包括找回密码(邮箱),上传头像和数据报表统计,对课程进行选择任教,任课信息查询,学生成绩管理及图形化展示,学生课程成绩分类查询。

4.1.3 学生功能结构设计

学生功能包括找回密码(邮箱),上传头像和数据报表统计,对个人信息修改,选课信息查询,课程成绩查询以及报表下载。

4.2 数据库设计

数据库设计包括以下几个关键表:course(课程表)、teacher(教师表)、student(学生表)以及关联表courseteacher(课程-教师关联表)和studentcourseteacher(学生-课程-教师关联表)。

4.2.1 course(课程表)表格设计
列名数据类型说明
cidint课程ID(主键)
cnamevarchar(30)课程名称
ccredittinyint课程学分
locationvarchar(100)上课地点
schedulevarchar(100)上课时间表

索引:cid和cname,Fields分别为cid和cname。

4.2.2 teacher(教师表)表格设计
列名数据类型说明
tidint教师ID(主键)
tnamevarchar(30)教师姓名
passwordvarchar(255)密码(加密存储)
avatarvarchar(255)头像图片链接
emailvarchar(255)电子邮箱
phonevarchar(20)手机号码

索引:tid和tname,Fields分别为tid和tname。

4.2.3 student(学生表)表格设计
列名数据类型说明
sidint学生ID(主键)
snamevarchar(30)学生姓名
passwordvarchar(255)密码(加密存储)
avatarvarchar(255)头像图片链接
emailvarchar(255)电子邮箱
phonevarchar(20)手机号码

索引:sid和sname,Fields分别为sid和sname。

4.2.4 courseteacher(课程-教师关联表)表格设计
列名数据类型说明
ctidint关联ID(主键)
cidint课程ID(外键,关联course)
tidint教师ID(外键,关联teacher)
termvarchar(30)学期
locationvarchar(100)上课地点
schedulevarchar(100)上课时间表

索引:ctid、cid和tid,Fields分别为ctid、cid和tid。

4.2.5 studentcourseteacher(学生-课程-教师关联表)表格设计
列名数据类型说明
sctidint关联ID(主键)
sidint学生ID(外键,关联student)
cidint课程ID(外键,关联course)
tidint教师ID(外键,关联teacher)
gradefloat成绩
termvarchar(30)学期

索引:sid、cid和tid,Fields分别为sid、cid和tid。

  • 数据库中的主键和外键都有明确的命名规则,以便于理解和维护。
  • 密码采用了加密存储,以增强安全性。
  • 学生-课程-教师关联表中包含了成绩信息,以便于记录学生在每门课程中的表现。

5 系统实现

5.1 管理员功能实现

5.1.1 教师信息管理

管理员进入如图 5.1 所示的教师信息管理界面之后,管理员点击信息显示栏中的教师列表,可以对教师信息进行修改、删除和编辑操作。同时也可以输入教师工号或者姓名进行查询,并且可以开启或者关闭模糊查询。学生信息管理功能同上。

在这里插入图片描述

Web层

/**
 * 根据条件查询教师信息
 * @param map 查询条件,包含教师姓名和模糊查询标志
 * @return 符合条件的教师列表
 */
@PostMapping("/findBySearch")
@ApiOperation("根据条件查询教师信息")
public List<Teacher> findBySearch(@RequestBody Map<String, String> map) {
    return teacherService.findBySearch(map);
}

Service层

/**
 * 根据条件查询教师信息
 * @param map 查询条件,包含教师ID、姓名和模糊查询标志
 * @return 符合条件的教师列表
 */
@ApiOperation("根据条件查询教师信息")
public List<Teacher> findBySearch(Map<String, String> map) {
    Integer tid = null;
    String tname = null;
    Integer fuzzy = null;
    if (map.containsKey("tid")) {
        try {
            tid = Integer.parseInt(map.get("tid"));
        } catch (Exception e) {
            // handle exception
        }
    }
    if (map.containsKey("tname")) {
        tname = map.get("tname");
    }
    if (map.containsKey("fuzzy")) {
        fuzzy = map.get("fuzzy").equals("true") ? 1 : 0;
    }
    return teacherMapper.findBySearch(tid, tname, fuzzy);
}
5.1.2 课程信息管理

管理员进入如图 5.2 所示的课程信息管理界面之后,管理员点击信息显示栏中的编辑课程,可以对课程信息进行修改、删除和编辑操作。

在这里插入图片描述

Web层

/**
 * 更新现有课程
 *
 * @param course 更新后的课程对象
 * @return 如果课程成功更新,则为true,否则为false
 */
@ApiOperation("更新课程")
@PostMapping("/updateCourse")
public boolean updateCourse(@RequestBody Course course) {
    return courseService.updateById(course);
}
5.1.3 学生成绩管理

管理员进入如图 5.3 所示的学生成绩信息管理界面之后,管理员点击信息显示栏中的学生成绩查询,可以对学生成绩进行修改、删除和编辑操作,也可以进行多样查询,模糊查询等操作。

在这里插入图片描述

Mapper层

/**
 * 根据提供的条件搜索SCT信息。
 * @param sid 学生ID,可选参数。
 * @param sname 学生姓名,可选参数。
 * @param sFuzzy 是否进行学生姓名的模糊搜索,可选参数。
 * @param cid 课程ID,可选参数。
 * @param cname 课程名称,可选参数。
 * @param cFuzzy 是否进行课程名称的模糊搜索,可选参数。
 * @param tid 教师ID,可选参数。
 * @param tname 教师姓名,可选参数。
 * @param tFuzzy 是否进行教师姓名的模糊搜索,可选参数。
 * @param lowBound 成绩下限,可选参数。
 * @param highBound 成绩上限,可选参数。
 * @param term 学期,可选参数。
 * @param classification 分类,可选参数。
 * @return 返回匹配搜索条件的SCT信息列表。
 */
public List<SCTInfo> findBySearch1(@Param("sid") Integer sid,
                                   @Param("sname") String sname,
                                   @Param("sFuzzy") Integer sFuzzy,
                                   @Param("cid") Integer cid,
                                   @Param("cname") String cname,
                                   @Param("cFuzzy") Integer cFuzzy,
                                   @Param("tid") Integer tid,
                                   @Param("tname") String tname,
                                   @Param("tFuzzy") Integer tFuzzy,
                                   @Param("lowBound") Integer lowBound,
                                   @Param("highBound") Integer highBound,
                                   @Param("term") String term,
                                   @Param("classification") String classification); // 添加分类参数
5.1.4 学生成绩报表导出

管理员进入如图 5.4 所示的学生成绩信息管理界面之后,管理员点击信息显示栏中的数据统计,可以对学生课程成绩进行可视化统计和查看,也可以将统计的数据进行导出报表,如图 5.5。

在这里插入图片描述

在这里插入图片描述

Service层

/**
 * 导出课程业务数据为Excel表格。
 *
 * @param cname 课程名称
 * @param term 学期
 * @param response HttpServlet响应,用于向客户端提供下载
 */
public void exportBusinessData(String cname, String term, HttpServletResponse response) {
    CourseStatisticVO courseStatisticVO = this.findByCname(cname, term);
    InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("templates/课程成绩报表.xlsx");
    try {
        XSSFWorkbook excel = new XSSFWorkbook(inputStream);
        //获得Excel文件中的一个Sheet页
        XSSFSheet sheet = excel.getSheet("Sheet1");
        //获得第1行
        XSSFRow row = sheet.getRow(0);
        //根据row将第一行第二列写入cname数据
        row.getCell(1).setCellValue(cname + "-成绩报表" +"(" + term + ")");
        //此处省略后面n行的写入,方法同上
        //写入当前日期,精确到分秒
        row.getCell(1).setCellValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        ServletOutputStream out = response.getOutputStream();
        excel.write(out);
        out.flush();
        out.close();
        excel.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

5.2 教师功能实现

5.2.1 教师上传头像

教师进入如图 5.6 所示的教师编辑界面之后,教师点击信息显示栏中的上传头像,可以对本地的头像进行上传,头像加载为阿里云的OSS对象,文件名生成采用的是UUID工具类的randomUUID,使得文件名唯一性。

在这里插入图片描述

Web层

/**
 * 文件上传
 * @param file
 * @return
 */
@PostMapping("/upload")
@ApiOperation("文件上传")
public Result<String> upload(MultipartFile file){
    log.info("文件上传:{}",file);
    try {
        //原始文件名
        String originalFilename = file.getOriginalFilename();
        //截取原始文件名的后缀   dfdfdf.png
        String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
        //构造新文件名称
        String objectName = UUID.randomUUID().toString() + extension;
        //文件的请求路径
        String filePath = aliOssUtil.upload(file.getBytes(), objectName);
        log.info("文件上传成功,文件路径为:{}", filePath);
        return Result.success(filePath);
    } catch (IOException e) {
        log.error("文件上传失败:{}", e);
    }
    return Result.error(MessageConstant.UPLOAD_FAILED);
}
5.2.2 开设课程

教师进入如图 5.7 所示的课程设置界面之后,教师点击信息显示栏中的开设课程,可以对所有展示的课程信息进行选择开设,并且可以对课程信息进行多重查询。

在这里插入图片描述

Web层

/**
 * 根据条件查询课程教师信息
 * @param map 查询条件
 * @return 符合条件的课程教师信息列表
 */
@PostMapping("/findCourseTeacherInfo")
@ApiOperation(value = "根据条件查询课程教师信息")
public List<CourseTeacherInfo> findCourseTeacherInfo(@RequestBody Map<String, String> map) {
    return courseTeacherService.findCourseTeacherInfo(map);
}
5.2.3 学生成绩管理

教师进入如图 5.8 所示的学生成绩管理界面之后,教师点击信息显示栏中的成绩管理,可以对所有展示的学生成绩进行编辑,并且可以对成绩信息进行多重查询。

在这里插入图片描述

Web层

/**
 * 根据提供的条件查询选课信息。
 *
 * @param map 包含查询条件的键值对参数,键代表查询字段,值代表查询值。
 * @return 返回一个包含查询结果的SCTInfo列表。


 */
@PostMapping("/findBySearch1")
@ApiOperation("根据条件查询SCT信息")
public List<SCTInfo> findBySearch1(@RequestBody Map<String, String> map) {
    return sctInfoService.findBySearch1(map);
}

5.3 学生功能实现

5.3.1 课程选课管理

学生进入如图 5.9 所示的学生选课界面之后,学生点击信息显示栏中的选课管理,可以对展示的课程信息进行多重条件查询和添加选课操作,修改已经选择的课程。

在这里插入图片描述

Web层

/**
 * 处理选课操作
 * @param sct 选课对象,包含学生ID和课程ID
 * @return 成功则返回1,失败则返回0
 */
@ApiOperation("选课")
@PostMapping("/addSCT")
public int addSCT(@RequestBody SCT sct) {
    return sctService.addSCT(sct);
}
5.3.2 课程成绩查询

学生进入如图 5.10 所示的课程成绩查询界面之后,学生点击信息显示栏中的课程成绩查询,可以对展示的课程成绩信息进行查询和统计。

在这里插入图片描述

Mapper层

/**
 * 根据学生ID和学期查询学生成绩信息。
 * @param sid 学生ID
 * @param term 学期
 * @return 学生成绩信息列表
 */
public List<SCTInfo> findBySid(@Param("sid") Integer sid, @Param("term") String term);

6 系统测试

6.1 测试环境

本次测试的系统环境如下:

  • 硬件环境:
    • 处理器:Intel Core i7
    • 内存:16 GB
    • 硬盘:500 GB SSD
  • 软件环境:
    • 操作系统:Windows 10
    • 数据库:MySQL 8.0
    • 开发平台:IDEA 2021.1
    • Web服务器:Apache Tomcat 9.0
    • 浏览器:Google Chrome

6.2 测试方法

  • 单元测试:对系统中的各个模块进行独立测试,确保各个模块的功能符合设计要求。
  • 集成测试:将各个模块集成在一起进行测试,验证模块之间的接口和交互。
  • 系统测试:在模拟真实环境下,对整个系统进行全面测试,验证系统的功能、性能、可靠性等是否符合预期。

6.3 测试用例

测试编号测试名称测试输入预期输出实际输出结果
TC001教师信息查询教师姓名、模糊查询标志匹配的教师列表匹配的教师列表通过
TC002课程信息更新课程对象更新成功或失败更新成功通过
TC003学生成绩查询学生姓名、课程名称、模糊查询标志等匹配的学生成绩列表匹配的学生成绩列表通过
TC004教师头像上传头像文件文件上传路径文件上传路径通过
TC005课程开设课程信息课程开设成功或失败课程开设成功通过
TC006成绩管理学生成绩信息成绩更新成功或失败成绩更新成功通过
TC007学生选课管理课程信息选课成功或失败选课成功通过
TC008学生成绩查询学生ID、学期学生成绩信息列表学生成绩信息列表通过

6.4 测试结果

经过单元测试、集成测试和系统测试,本系统所有功能模块均能正常运行,满足设计要求。测试结果如下:

  • 功能测试:所有功能均能正确实现,操作界面友好,用户体验良好。
  • 性能测试:在大数据量和高并发条件下,系统运行稳定,响应时间满足要求。
  • 可靠性测试:系统在长时间运行过程中无异常,数据处理准确无误。

6.5 存在的问题及解决方案

在测试过程中,发现了以下问题,并已提出解决方案:

  1. 问题描述:教师信息模糊查询时,查询结果不准确。
    解决方案:调整模糊查询算法,优化查询条件,提高查询准确性。

  2. 问题描述:课程信息更新时,某些字段未能正确保存。
    解决方案:检查更新逻辑,确保所有字段正确传递并保存到数据库。

  3. 问题描述:学生选课管理功能中,部分选课操作未能成功。
    解决方案:检查选课逻辑,确保选课操作的事务处理正确,避免数据不一致。

  4. 问题描述:系统在高并发访问时,响应时间较长。
    解决方案:优化数据库查询,提高系统处理效率,增加服务器硬件配置。

最后再补充一句,上述环境开发完毕之后,如果想学习服务部署Docker的话,可以看这篇(●ˇ∀ˇ●)!

点击这里:Docker部署项目

vs2015+数据库,需要建的数据表如下: 1. “考试成绩管理系统用户登录”功能 具体要求: (1) 按照图示排列相应的控件,控件名称自定义,其中,界面中的图片可以不加; (2) 当输入正确的用户名和密码时,登录到主系统,如图所示,并且用户名或密码输入不正确时系统有所提示;当单击【取消】按钮时,用户名和密码被清空; (3) 程序中用到的数据库名为SCOREINFO,数据表名为userinfo,数据表结构如下图所示: (4) 数据表中的用户名和密码如下图。 2. 点击主窗体的“密码修改”菜单,完成“密码修改”功能,程序运行如下图所示: 具体要求: (1)此题必须使用数据库连接完成,原始密码必须为数据表里原有的数据,不使用数据库完成的为0分。 (2)需要建立数据库SCOREINFO及数据表userinfo,表的结构及数据第一部分的内容: (3)要有“原始密码输入错误”、“原始密码不能为空”及“两次输入密码不一致”的错误提示; (4)当单击【保存】按钮,新密码被更新到数据表中,不能更新的为0分; (5)单击【关闭】按钮,窗口关闭。 (6)3个Label;3个TextBox;2个Button 3. 完成“成绩查询”功能,程序运行如下图所示: 具体要求: (1) 按照图示排列相应的控件,界面下方是DataGridView控件; (2)程序用到的数据库名为SCOREINFO,数据表名为score,表结构如下: (3)完成的MainForm_Load事件处理程序:当加载窗体时,直接在窗体的dataGridView1控件中显示数据表的所有记录; (4)可以设查询条件:首先在组合框comboBox1中选择查询条件,并在textBox1中输入条件值(可以模糊查询,如按照姓名查询时,输入“王”,可以查所有姓王的同学的成绩),单击查询将结果显示在dataGridView1控件中。 (5)所需控件及属性:1个GroupBox,1个Label,Text为选择查询条件;1个ComboBox(Items:学号、姓名);1个TextBox;1个Button,Text为查询;1个DataGridView 4. 完成“课程信息修改”功能,程序运行如下图所示: 具体要求: (1)按照图示排列相应的控件,控件名称自定义,其中,程序刚开始运行时,“学分”和“课程编码”的文本框是只读的; (2)在数据库名为SCOREINFO中,创建数据表名为course,表结构如下: (3)当单击【查询】时,直接在窗体的dataGridView2控件中显示数据表的所有记录; (4)当选中DataGridView控件中的某一行记录时(DataGridView控件的Mouse_Click事件),“课程名字”、“学分”、“课程代码”文本框中分别显示该项对应的课程信息; (5)当选中某一行记录并单击【编辑】按钮时,【编辑】按钮变为【保存修改】,同时“学分”和“课程编码”的文本框恢复正常(ReadOnly属性为false);在文本框中修改相应的信息后单击【保存修改】,将修改后的数据更新到数据表中。 (6)所需控件及属性:1个GroupBox,3个Label;3个TextBox(textBox2属性ReadOnly为True,textBox3属性ReadOnly为True);2个Button;1个DataGridView 5. 完成“课程信息删除”功能,程序运行如下图所示: 具体要求: (1)按照图示排列相应的控件,控件名称自定义,其中,程序刚开始运行时,“学分”和“课程编码”的文本框是只读的; (2)数据表名为course,表结构同第4部分: (3)当单击【查询】时,直接在窗体的dataGridView控件中显示数据表的所有记录; (4)当选中DataGridView控件中的某一行记录时,“课程名字”、“学分”、“课程代码”文本框中分别显示该项对应的课程信息; (5)当选中某一行记录并单击【删除】按钮时,则该行从数据表中删除。 (6)所需控件:3个Label;3个TextBox(textBox2属性ReadOnly为True,textBox3属性ReadOnly为True);2个Button;1个DataGridView 6. 完成“课程信息添加”功能,程序运行如下图所示: 具体要求: (1)按照图示排列相应的控件,控件名称自定义; (2)程序用到的数据库和数据表名为course,表结构如下同第四部分: (3)当单击【查询】时,直接在窗体的dataGridView1控件中显示数据表的所有记 (4)当选中DataGridView控件中的某一行记录时,“课程名字”、“学分”、“课程代码”文本框中分别显示该项对应的课程信息; (5)当单击【添加】按钮时,在文本框中添加新的内容并将新内容添加到数据表中,并且在DataGridView控件中显示出新的课程信息 (6)所需控件:3个Label;3个TextBox;2个Button;1个DataGridView
学生管理系统程序 #include using namespace std; #include double avg=0;//统计总分和加平均分权 const int mathp=4;//数学学分 const int cppp=5;//C++学分 const sum=70;//设置总学分 class Student { private: int num; char *name; char *sex; char *phone; char *rphone; double math; double cpp; Student* next; public: Student() {next=NULL;} ~Student(); void Push(Student **refhead,int num,char *name,char *sex,char *phone,char *rphone,double math,double cpp); void Delete(Student *head,int data); Student* Find(Student* head,int data); void Display(Student* head); int Length(Student* head); void Math(Student* head,int data); void Update(Student* head,int data); void Insert(); }; Student* head=new Student;//带头结点的头指针 void Student::Push(Student **refhead,int num,char *name,char *sex,char *phone,char *rphone,double math,double cpp) { Student* newnode=new Student;//新增加结点 newnode->num=num; newnode->name=name; newnode->sex=sex; newnode->phone=phone; newnode->rphone=rphone; newnode->math=math; newnode->cpp=cpp; newnode->next=*refhead; *refhead=newnode;//重置表头 } //遍历 void Student::Display(Student* head) { Student* temp; temp=head; if(temp->next==NULL)//判断空表 cout<<"没有学生!"; else {while(temp!=NULL)// { cout<<"学号:"<num<<"姓名:"<name<<"性别:"<sex<<"手机:"<phone<<"宿舍电话:"<rphone<<"数学成绩:"<math<<"C++成绩:"<cpp<next; } } return; } //人数 int Student::Length(Student* head) { Student* cur; cur=head; int count=0; while(cur!=NULL) { count++;//通过累加统计人数 cur=cur->next; } return count; } //查找 Student* Student::Find(Student* head,int data) { Student* cur=head; bool bo=false; while(cur!=NULL) { if(cur->num=data) { bo=true;//如果找到则改变bo的值 cout<<"学号:"<num<<"姓名:"<name<<"性别:"<sex<<"手机:"<phone<<"宿舍电话:"<rphone<<"数学成绩:"<math<<"C++成绩:"<cpp<next; } if(bo==false)//通过判断bo的值判断找到与否 cout<<"没有这个人!"<num==data) break; else {bef=cur;cur=cur->next;} } if(cur==head)//如果是头结点则删除头结点 { head=cur->next; delete cur; } else { bef->next=cur->next; delete cur; } } //修改 void Student::Update(Student* head,int data) { Student* cur=head; bool bo=false; while(cur!=NULL) { if(cur->num==data) { bo=true; int a,b; char *c; double d; for(;;) //找到后提供各字段的修改 { cout<>a; switch(a) { case 1:cout<>b; cur->num=a; break; case 2:cout<>c; cur->name=c; break; case 3:cout<>c; cur->sex=c; break; case 4:cout<>c; cur->phone=c; break; case 5:cout<>c; cur->rphone=c; break; case 6:cout<>d; cur->math=d; break; case 7:cout<>d; cur->cpp=d; break; case 8:exit(1); break; default:cout<<"操作错误"; break; } } break; } } if(bo==false) cout<<"没有这个人!"<num=data) { bo=true; avg=cur->math*(mathp/sum)+cur->cpp*(cppp/sum);//计算总分和加平均分权的公式 break; } cur=cur->next; } if(bo==false){ cout<<"没有这个人!"<<endl; return; } cout<<"该生的总分和加平均分权="<<avg<<endl; return; } //录入 void Student::Insert() { head=NULL; int num; char name[8]; char sex[4]; char phone[11]; char rphone[7]; double math; double cpp; cout<<"请输入基本信息:\n"; cout<>num; cout<>name; cout<>sex; cout<>phone; cout<>rphone; cout<>math; cout<>cpp; Push(&head,num,name,sex,phone,rphone,math,cpp);//调用函数Push建立有序链表 } //用释构函数逐个释放空间 Student::~Student() { while(head!=NULL) { delete head; head=head->next; } } //程序主入口 void main() { for(;;) { head=NULL; Student s; int x; int data; cout<<"|1录入|2查找|3删除|4修改|5统计|6退出|\n"; cout<>x; switch(x) { case 1: start: s.Insert(); cout<>ch; if(ch=='y' || ch=='Y') goto start; s.Display(head); int l; l=s.Length(head); cout<<"一共有"<<l<<"个学生。"<<endl; break; case 2: cout<>data; s.Find(head,data); break; case 3: cout<>data; s.Delete(head,data); break; case 4: cout<>data; s.Update(head,data); break; case 5: cout<>data; s.Math(head,data); break; case 6: exit(1); break; default:cout<<"操作错误!"<<endl; break; } }}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值