学生考勤系统课程设计

  • 格式:doc
  • 大小:84.50 KB
  • 文档页数:14

下载文档原格式

  / 38
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、课程设计题目:

1、课程设计名称:学生考勤系统。

2、课程设计内容:对学生考勤信息的统计与管理,可以分为若干个模块来实现,如:理论课考勤、实验课考勤、班级或院系会议考勤、课外活动考勤等等。

缺勤的情况可以按不同的类型(缺席、迟到、早退、请假)设置不同的权值。系统要求能对考勤信息进行数据录入、情况的统计、信息的输出显示等等。学生也可以根据自己的理解,去考虑更多的功能,并给予实现。能按各种条件进行组合查询和数据统计,并能按指定顺序进行格式化输出。对数据的新增,修改及删除应注意满足相应的约束条件。

二、问题的分析:

在进行问题的分析前,我们应该知道该问题的任务和需求。任务和需求如下:

考勤信息记录了学生的在校所有学习生活的出勤情况,它包括:缺席日期、

缺席类型。如:若是缺课,则应记录缺课日期、第几节课、课程名称、学生学号、

学生姓名、缺课类型(迟到、早退、请假及旷课)。试设计一考勤管理系统,使之能提供以下功能:

1、录入学生的缺勤记录;

2、修改某个学生的缺勤记录;

3、查询某个学生的缺勤情况;

4、统计某段时间内,缺勤学生学号及缺勤次数,按缺勤权值统计学生的负分值,并能进行排序;

5、统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序;

6、系统以菜单方式工作。

具体要求如下:

1、采取模块化方式进行程序设计,要求程序的功能设计、数据结构设计及整体结构设计合理。学生也可根据自己对题目的理解增加新的功能模块(视情况可另外加分)。

2、系统以菜单界面方式(至少采用文本菜单界面,如能采用图形菜单界面更好)工作,运行界面友好,演示程序以用户和计算机的对话方式进行。

3、程序算法说明清晰,理论分析与计算正确,运行情况良好,实验测试数据无误,容错性强(能对错误输入进行判断控制)。

4、编程风格良好(包括缩进、空行、适当注释、变量名和函数名见名知意,程序容易阅读等);

所以进行问题的分析时我们应该进行以下工作:

(1)备工作:

a、仔细阅读课程设计任务书,明确实验设计的目的、实验内容、实验要求、所需知识点等。

b、阅读教材及相关材料,更深入的了解所需知识点,并与其它知识点能够融会贯通,加深对各知识点的了解,使得在进行课程设计的时候能够更好的运用各知识点。

当看到本设计所设计的知识点时,心里真的很害怕,因为其中有很多的知识点我都不知道,所以在课程设计开始的第一周我基本没做出什么。后来经过翻阅资料,问题被逐一解决。

(2)设计整体框架:

由实验设计内容、目的与要求来分析该如何简略设计该实验的总体框架,,然后一步步完善整个程序。

a、分析实验题目,确定需要用到对象,分析如何使用对象,并分配好成员函数和成员数据。

b、分析实验要求的功能,按功能确定需要用到的外部函数。

c、大概想想是不是需要其他的外部函数来辅助外部函数来实现实验要求的功能。

d、想想主函数如何实现。

(3)、完善函数:按实验设计的总体框架一步步来编写函数。对于暂时想不到的函数先跳过或查书,一步步写完函数。

(4)、程序实现思路:

开始是设计程序的界面,了解需要实现的功能模块。

对数据结构的选择

写出的界面,现在需要做的事情其实就是要将所有的菜单功能进行实现。可以考虑将用户输入每个学生的记录用一个结构体里面,即:

struct Student_info {

std::string date; //缺课日期

std::string class_num; //第几节课

std::string course_name; //课程名称

std::string stu_name; //学生姓名

std::string non_attendance_type; // 缺课类型

};

最后所有的学生记录都保存到一个vector里面,然后根据需要再将里面需要查找的元素进行查找,相应的排序可能就是将他们尽可能压进关联式容器map,有的部分就压入set里面,这些都是根据模块的功能来选定的。

对功能的实现

1、录入学生的缺课记录

首先提示用户按照正确的格式进行学生缺课记录的录入,这个步骤比较简单,只需要不断地将记录的每个数据项存入结构体对应的成员中。

2、修改某个学生的缺课记录

首先必须查找到你所需要修改的那位的学生全部缺课记录。这个模块不需要定义新的结构体。

在修改前当然要检查记录是否为空了,不为空的话,可以设置下面这五个菜单供用户选择:

"1、缺课日期2、第几节课3、课程名称

4、学生姓名

5、缺课类型

6、退出修改程序并返回系统主菜单

修改很简单,仅需要对该学生的某个部分进行替换即可。采用switch语句很快就解决。J 最后实现对所选记录的修改,完成后更新原有的学生记录。

3、查询某个学生的缺课情况

查询某个学生的缺课情况,这个模块是在以下这个函数中实现的:

find_student_absent(vector& students, string& name)

其中name为用户本人输入的学生姓名,这样可以很快在vector里面找到该学生的所有的记录。为了达到查询结果按照日期升序排序,同一天内按照所缺课程的时间升序排序的目的,那就需要选择一个数据结构need来保存查找得到的该学生的所有缺课记录,即:

map > > need

这个数据结构看起来有点复杂,其实非常好用。第一个索引值string 类型保存学生的缺课的日期,第二个map的键值则为该学生当天在第几节课缺课,而vector用来保存该学生其余信息,那么得到的need保存的记录已经满足了查询结果按照日期升序排序,同一天内按照所缺课程的时间升序排序的要求,只需要按格式输出这些记录即可。

4、统计旷课学生姓名及旷课节数和有学生旷课的课程及旷课人次

这两个模块之所以放在一起讨论,是由于它们其实功能都是大同小异的。可以考虑用泛型编程来解决。不过我在源程序中并没有这么做,而是写成两个函数模块。

这个两个模块根据课程名称来找出所有与“旷课”这个字符串有关的记录先暂存到一个vector。考虑到vector远远不能满足客户的要求,那么可以考虑新建一个数据结构来保存这些记录,同时满足要求,即:

map > need; //将统计出来的结果保存属于这段时间的学生旷课记录

其中set保存的是旷课学生姓名(有学生旷课的课程),map的键值为学生旷课节数(旷课人次)。

最后会发现一个小问题,输出的结果并不是用户需要的结果先按旷课节数(旷课人次)降序排序,旷课节数相同的学生按姓名(有学生旷课的课程)升序排序,解决的办法很简单,只需要再输出的时候定义一个迭代器即可解决,即:

map >::const_reverse_iterator mapset_it = need.rbegin();

该功能得以解决。

5、退出系统