班级考勤管理系统 数据结构 C语言

  • 程序概述
    1. 开发环境

开发程序的工具Microsoft Visual C++ 6.0,(简称Visual C++ 6.0、VC++ 6.0或VC 6.0)是Microsoft公司推出的以C++语言为基础的开发Windows环境程序,面向对象的可视化集成编程系统。同时完全兼容C语言编程,它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点。

    1. 基本原理或技术

掌握C语言运用数据结构编程基本方法,熟练掌握VC 6.0程序开发环境的使用,完成一个应用程序的设计、编码、调试,了解程序设计过程,锻炼实际应用能力,为后续课程打下基础。班级考勤管理系统主要用C语言编写,运用数据结构,将从文件中读取的数据存储在单链表、队列、树中,方便对数据进行增删改查。

    1. 需求说明

班级考勤管理系统,方便班级纪律委员管理和统计班级考勤,方便学生查询考勤状况。班级考勤一目了然,避免学期末因平时成绩产生不必要的冲突。

    1. 开发功能

班级考勤管理系统主要的功能有:读写本地txt文件、实现角色设定,三种用户不同权限、管理员对班级成员增删改查、管理员对班级考勤管理、班委对考勤增删改查、对每周学生的出勤进行统计、班级成员根据不同条件查询考勤纪律。

  • 程序概要
    1. 程序流程图

 

    1. 函数功能关系

每一个函数实现一个功能,模块化编写程序。由单链表、树、队列三种数据结构完成程序功能连接。运行程序首先从welcome函数进入欢迎页面,输入账号和密码进行登录。登录调用login函数,打开本地文件判断用户名和密码是否正确,每个用户对应一个权限,根据权限不同进入administrator函数(管理员界面)、committee函数(班委界面)student函数(学生界面)。三种用户对应不同的功能,管理员实现classpeople函数(班级成员管理)包含insertpeople函数(增加班级成员)、deletepeople函数(删除班级成员)、modifypeople函数(修改成员权限),classattendance函数(班级出勤管理)调用all函数实现跟班委一样的功能。班委实现all函数(查看全部考勤),包含功能增加考情记录、删除考勤记录、修改考勤记录、查找考勤记录,sta函数(出勤率的计算)。学生实现weekall函数(某周全班考勤查询)、stuweek函数(某学生某周考勤查询)、myweek函数(我的考勤查询)。基本功能都已实现,自己测试没有发现BUG,扩展功能也实现,将账号、密码、权限存在用户信息文件中,将学号、姓名、周数、星期、节数、课程、原因存在学生考勤情况文件中。

  • 程序详细设计
    1. 关键代码分析

main函数中system("color 50");设置背景颜色与文字区分,当运行完一个功能利用system("cls");清屏,给用户最佳视觉和体验。

welcome函数中输入账户和密码调用login函数进行登录,login函数中fflush(stdin);清空输入缓冲区,确保不影响后面数据读取,以只读的方式打开.txt文本,利用fscanf函数对文本进行扫描读取,用strcmp函数进行文本和输入账号密码、权限进行比较,判断是否登陆成功和用户所拥有的权限。

administrator函数为管理员页面,进入页面利用data函数初始化链表并创建链表将学生考勤信息保存在单链表中,FILE *fp2读取文件利用单链表把一条考勤记录的信息存在一个结点中rear->next = s; rear = s;,然后创建新的结点s = new node;,直到读取的文件为空while(!feof(fp2))。利用level_creat函数将班级成员保存在树中,同理FILE *fp6读取用户信息文件,利用树的层序生成树,将一个用户信息放在树的一个结点中。通过switch语句对功能选择进入classpeople函数对班级成员管理,即classpeople函数所有的功能都是对树或队列的操作再通过树对文本文件的内容进行更新,层序遍历利用队列先进先出输出所有的账户、密码和权限。Insertpeople函数增加班级成员直接对文件进行操作,在文件内容的尾部fprintf函数增加新的账户、密码和权限。Deletepeople函数删除班级成员通过队列出队判断输入的账户名是否与当前结点账号是否一致if(strcmp(p->account,str)==0),若不一致将这个结点的账号、密码和权限写进新的临时文件中,若一致则不写入。直到队列为空while(!empty_sqqueue(&Q))时,删除原文件remove("用户信息文件.txt");,将临时文件改名rename("用户临时文件.txt","用户信息文件.txt");。Modifypeople函数与deletepeople函数大致相同,在找到输入账号与某一结点账号相同时,对结点中的属性进行修改后保存文件。进入classattendance函数对班级出勤管理。All函数输出单链表的每个结点,选择增加考勤记录insert函数,new一个结点,增加一条记录并使用fprintf函数写进文件里,重点在输入数字与中文连接成字符串,如sprintf(connect,"第%s周",s->week)。方便班委和管理员,只输入数字5,而写进文件即为第5周,使得浏览考勤记录更加清楚明了。删除考勤记录deletes函数,对单链表进行操作,为每一条考勤加上序号,删除指定序号的记录,即删除结点p,新建临时文件,将删除结点p的单链表写入临时文件,并重新编号。修改考勤modify函数,通过序号找到结点,再根据修改不同的成员调用update函数,同样也是利用临时文件重写。查找根据输入的条件遍历单链表,用if语句判断输入的条件与对应的结点成员是否一致,一致则输出。

committee函数为班委界面,功能有管理班级考勤记录和周出勤率排序。班级考勤记录与管理员调用的是同一个函数,即all函数,功能与管理员的班级考勤管理功能一样。sta函数为出勤率排序,查询条件是指定周数,算出出勤率并排序。每周默认为5天,有一条违规记录即为1天缺勤。利用if语句判断遍历单链表,用n暂时储存违规记录条数,用refuse[20][20]暂存已经统计的课堂违规人员。实现对学生出勤率计算。

student函数为学生界面,查询某周所有学生考勤walocate函数if语句判断输入周数和遍历单链表周数是否一致strcmp(p->week,wk)==0,一致则输出该结点的所有信息。查询某学生某周考勤情况,同时判断strcmp(p->week,wk)==0&&strcmp(p->name,name)==0,满足则输出该结点的所有信息。查询登录账号某周考勤mwlocate函数,即对自己的考勤进行查询,在登录时传参到该函数,判断strcmp(p->week,wk)==0&&strcmp(p->id,no)==0,满足则输出该结点的所有信息。

  • 程序使用情况

运行程序首先进入登录系统,输入账号密码进行登录,读取本地txt文件判断该用户权限,进入不同用户界面。

 

用户进入对应功能界面,即可输入功能对应的数字进行操作行程。管理员界面,班级成员管理输出所有用户账、密码和权限,并能对每个用户信息进行增删改查。管理员界面班级出勤管理和班委界面班级考勤记录调用同一个函数功能一样,输出全部考勤信息,并能对考勤信息进行增删改查。班委界面周考勤出勤排序,实现统计某一周学生出勤率。学生界面实现某周全包考勤查询、某学生某周考勤查询、我的考勤查询,在经过筛选以后再输出。

 

 

整个程序共有两个本地txt文件储存,一个用于存储考勤信息,一个用于存储用户信息。三种数据结构,单链表、队列、树。增删改查操作基本都在数据结构完成再存在本地文件中,少数直接对本地文件进行操作。保存5周考勤记录,10个用户信息。

 

  • 总结
    1. 优点

整个程序分模块完成,每个功能写在一个函数,各个模块很明确需要实现的功能,代码也易读,并且做了较多的注释,这也是我往常完成课后小作业从没有这种习惯,数据结构大作业的代码太多,让我体会到了注释的好处。各功能相互调用的比较好。功能完成的比较完整,自我感觉良好。在遇到难题,主动查阅资料学习。

    1. 缺点

寒假比较松懈,知识遗忘的比较多,很多基础知识点还需要查阅课本,程序的逻辑还不够完善,有部分功能例如UI界面完成的比较将就,但作为第一个版本有漏洞,在后期的学习中会不断完善。

    1. 困难及解决的问题

在有C语言大作业的基础上,整个程序完成的难度不大,但是还是有很多逻辑需要自己处理。读取文件,判断账户、密码是否正确,获取考勤记录信息。需要用到的fopen函数的第二个参数有遇到一点坑。经过百度查明白,r以只读方式打开文件,该文件必须存在、rt+以读/写方式打开一个文本文件,允许读和写。w+打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。at+以读/写方式打开一个文本文件,允许读或在文本末追加数据等等,实现不同的功能。

在删除和修改用户信息或考勤信息也踩到坑,直接对文件进行操作有难度,所有借助了数据结构,但是修改和删除只对数据结构进行了修改,实际对本地文件并没有影响,在百度以后知道可以创建一个临时文本把更新后的数据结构中的数据存进临时文件中,再用remove函数将原来文件删除,rename函数对临时文件进行更名。

在计算出勤率功能上,第一次实现功能一切正常,在随着数据库中的数据增多时,会出现重复计算同学的考勤,输出重复的记录。最后自己理清了逻辑,原因是在遍历时,会有同一个学生的记录,所有定义了一个数组refuse,保存已经计算过的学生,在遍历时先判断refuse数组是否已经存在该学生。

为了方便查询等功能,一条数据有多个字符串,大多都只需要用户输入数字即可,在百度找到sprintf函数,把格式化的数据写入某个字符串中。用户操作起来就更加方便。

看似已经差不多完美的程序还有点不满意,很难受的是在使用过程中,进入不同页面或功能printf产生大量信息堆积,界面非常难看,在百度找到system("cls");代码用于清屏,整个程序自然就美观多了。

    1. 总结

在做大作业之前我已经学习了一个学期的C语言又学了一个学期的数据结构,但在做的过程中还是遇到了种种难题是我在课堂中没有接触到了。一句话活到老学到了是真的,更多的是自己在课余时间学习。学会查阅书籍和搜索资料也很重要。也很意外自己从一开始无从下手到最后完成一个另自己比较满意的程序,有一种成就感。一个程序做下来收获了很多课堂中学习不到的知识。任何一门语言光靠理论知识是远远不够的,只有自己动手实践,并理论结合实际才能达到很好的学习效果。

  • 参考文献
  1. 数据结构教程与题解/胡圣荣,周霭如,罗穗萍编著.---北京:清华大学出版社,2011.9
  2. C程序设计/谭浩强著. ---4版. ---北京:清华大学出版社,2010.6
  3. 百度

 

源码在github哦

https://github.com/Hph1998/Check-work-attendance

你可能感兴趣的:(班级考勤管理系统 数据结构 C语言)