C++学生考勤管理系统报告

article/2025/11/6 10:37:35

c++课程设计学生考勤管理系统报告
1.需求分析
1.录入学生的缺课记录;
2.修改某个学生的缺课记录;
3.查询某个学生的缺课情况;
4.统计某段时间内,某门课旷课学生姓名及旷课次数,按旷课次数由多到少排序;
5.统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序;
6.系统以菜单方式工作。
1.3课题意义
程序实践是本科生重要教学环节之一。通过程序实践,强化学生的计算机应用技能,使学生验证、巩固和充实所学的理论知识, 加深对相关内容的理解,拓宽知识面,培养学生的创新精神和实践能力
学生考勤管理程序可以大大减缓学生考勤人员的工作量, 方便了平时上课学生的出勤率的管理。

2.概要设计
根据分析整个系统主要划分为7个功能模块,分别执行要求中的功能。数据管理中可以对学生的基本信息、课程的基本信息、学生缺课的查询、添加、删除和修改。查询管理通过根据学生姓名,课程姓名 时间段儿等信息,查询单个学生的缺课记录,单科课的旷课记录,单个学生的旷课记录。功能模块图如图1所示:
在这里插入图片描述
图2-1功能模块图
这个程序是过程性语言设计的。运用多种条件语句,主体采用的是链表指针。系统的设计采用了数组语句、选择语句和循环语句,在需要处理大量同类数据时,这样就使程序书写更加简洁。程序使用了布尔函数。选择语句多采用if多分支选择结构与switch语句。首先计算switch表达式,然后在caes子句中寻找值相等的常量表达式,并以此为入口符号,由此开始顺序执行。循环语句采用了for语句等、do-while语句,for语句用于已知循环次数的循环结构,括号中的三个量分别用来表示循环变量初值、循环终值和循环增量。do-while语句先循环后判断, Break语句在switch语句中,保证多分支情况的正确执行,在循环语句中,强制终止本层循环。保存和读取函数是典型的函数功能,一个程序是由若干个函数组成的,保存和读取函数是和其他函数互相调用的。
3.详细设计

struct xueke
{char xueke_name[50];int people_num;
};
这是定义了一个xueke结构体,用来存放一个学科名及其相应的旷课人数;struct student
{	char name[50];long time;int lesson_time;char lesson_name[50];int chidao_num;int zaotui_num;int qingjia_num;int kuangke_num;struct student *next;
};这是定义了一个student的结构体,用来存放一个学生的考勤记录,
其中有,字符数组name[50],lesson_name[50],分别存放学生名字,
缺课课程名字;int型变量lesson_time,chidao_num,zaotui_num,qingjia_num,                                   kuangke_num,分别来存放,缺课节次,迟到次数,早退次数,请假次数,旷课次数 long型变量time,记录时间。
主模块设计
建立学生缺课记录子模块
要建立的学生人数,学生基本信息(包括缺课时间、学生姓名、课程名称、节次、迟到次数、早退次数、请假次数、旷课次数)可用creat()函数如图1.

在这里插入图片描述
图3-1建立学生缺课记录子模块

修改学生缺课记录子模块,根据要修改的学生姓名以及科目名称找到相应的信息,再选择要修改的项目进行单项修改, 如图2:
在这里插入图片描述
图3-2修改学生缺课记录子模块

修改学生缺课记录子模块,根据人名可以查出该学生的所有缺课记录,如图3:
在这里插入图片描述
图3-3修改学生缺课记录子模块

查看单科旷课记录子模块,根据学科名称和时间范围查出所有在该范围内旷课的学生以及次数 :如图4
在这里插入图片描述
图3-4查看单科旷课记录子模块

查看学生旷课记录子模块,根据要查询的学科名称及时间段查出在改时间段内该门课上旷课的人数, 如图5
在这里插入图片描述
图3-5查看学生旷课记录子模块

载入学生旷课记录子模块,可以载入实现储存在当前文件夹中txt文件中所储存的数据, 如图6

在这里插入图片描述
图3-6载入学生旷课记录子模块
储存学生旷课记录子模快,进入系统界面,顺序的完成各项操作,进行数据的输入,信息的保存调用相应的函数打开相应的地址,查询各项信息。如图7
在这里插入图片描述
图3-7储存学生旷课记录子模快

代码块

#include<cstdio>      //cstdio是将stdio.h的内容用C++头文件的形式表示出来
#include<iostream>    
#include<malloc.h>     //malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。#include<cstring>       //当调用库函数,客户程序提供的是string类型参数,而库函数内部实现用的是c-串,因此需要将string对象,转化为char*对象,而c_str()提供了这样一种方法,它返回一个客户程序可读不可改的指向字符数组的指针。#include<iomanip>      //I/O流控制头文件
#define NULL 0
#define guding 10
#define LEN sizeof(struct student)
using namespace std;
int student_num;
FILE *fp1;
struct xueke
{char xueke_name[50];int people_num;
};struct student
{	char name[50];long time;int lesson_time;char lesson_name[50];int chidao_num;int zaotui_num;int qingjia_num;int kuangke_num;struct student *next;
};
void chaxun(struct student *head)
{	int i;char chaxun_name[50];cout<<"请输入要查询的人名:";cin>>chaxun_name;struct student *p;if(head==NULL)cout<<"联系人为空";p=head;for(i=0;i<student_num;i++){if(strcmp(chaxun_name,p->name)==0){cout<<"缺课时间:"<<p->time<<"     学生姓名:"<<p->name<<"      课程名称:"<<p->lesson_name<<"      节次:"<<p->lesson_time<<endl<<"迟到次数:"<<p->chidao_num<<"            早退次数:"<<p->zaotui_num<<"           请假次数:"<<p->qingjia_num<<"     旷课次数:"<<p->kuangke_num<<endl;}	p=p->next; }}
struct student *xiugai(struct student *head)
{char xiugai_name[50];char xiugai_xueke_name[50];int k;cout<<"请输入要修改的学生姓名与学科名称【格式:学生姓名(空格)学科名称】:";cin>>xiugai_name>>xiugai_xueke_name;struct student *p1,*p2; p2=(struct student *)malloc(LEN);p1=head;if(head==NULL){cout<<"没有学生信息\n";return head; }while((strcmp(xiugai_name,p1->name)!=0||strcmp(xiugai_xueke_name,p1->lesson_name)!=0)&&(p1->next!=NULL))p1=p1->next;if(strcmp(xiugai_name,p1->name)==0&&strcmp(xiugai_xueke_name,p1->lesson_name)==0){   cout<<"====================================  修改信息 =================================\n"; cout<<"                                   1-修改缺课时间             \n";cout<<"                                   2-修改学生姓名             \n";cout<<"                                   3-修改课程名称             \n";cout<<"                                   4-修改第几节缺课           \n";cout<<"                                   5-修改迟到次数             \n";cout<<"                                   6-修改早退次数             \n";cout<<"                                   7-修改请假次数             \n";cout<<"                                   8-修改旷课次数             \n\n";cout<<"================================================================================\n";cin>>k;switch(k){case 1:cout<<"请输入新的缺课时间:";cin>>p1->time;break;case 2:cout<<"请输入新的学生姓名:";cin>>p1->name;break;case 3:cout<<"请输入新的课程名称:";cin>>p1->lesson_name;break;case 4:cout<<"请输入新的缺课节次:";cin>>p1->lesson_time;break;case 5:cout<<"请输入新的迟到次数:";cin>>p1->chidao_num;break;case 6:cout<<"请输入新的早退次数:";cin>>p1->zaotui_num;break;case 7:cout<<"请输入新的请假次数:";cin>>p1->qingjia_num;break;case 8:cout<<"请输入新的旷课次数:";cin>>p1->kuangke_num;break; }}return head;
}
struct student *creat()
{int i,b;struct student *head,*p1,*p2;      cout<<"请输入要建立资料的学生人数:";cin>>b;head=p2=NULL;p1=(struct student *)malloc(LEN);cout<<"【输入格式:缺课时间(空格)学生姓名(空格)课程名称(空格)第几节(空格)迟到次数(空格)早退次数(空格)请假次数(空格)旷课次数】\n";cout<<"请输入第1名学生信息:";cin>>p1->time>>p1->name>>p1->lesson_name>>p1->lesson_time>>p1->chidao_num>>p1->zaotui_num>>p1->qingjia_num>>p1->kuangke_num;head=p1;p2=p1;student_num+=1;for(i=1;i<b;i++){p1=(struct student*)malloc(LEN);cout<<"请输入第"<<i+1<<"名学生信息:";cin>>p1->time>>p1->name>>p1->lesson_name>>p1->lesson_time>>p1->chidao_num>>p1->zaotui_num>>p1->qingjia_num>>p1->kuangke_num;p2->next=p1;p2=p1;student_num+=1;}p2->next=NULL;      return head;
}
void print(struct student *head)
{struct student *p;p=head;if(p==NULL)cout<<"没有学生信息\n";while(p!=NULL)	{   cout<<"缺课时间:"<<p->time<<"     学生姓名:"<<setw(10)<<p->name<<"      课程名称:"<<p->lesson_name<<"      节次:"<<p->lesson_time<<endl<<"迟到次数:"<<p->chidao_num<<"            早退次数:"<<p->zaotui_num<<"           请假次数:"<<p->qingjia_num<<"     旷课次数:"<<p->kuangke_num<<endl;p=p->next;}	
}
struct student *tongji_lesson(struct student *head)
{	struct student *p1,*p2,*p3;char lesson[50];long look_time1,look_time2;int xunhuan_num=0;p3=(struct student *)malloc(LEN);if(head==NULL){cout<<"没有学生信息";return(head); }p1=head;p2=p1->next;while(xunhuan_num<student_num){while(p2!=NULL){if(p2->kuangke_num>p1->kuangke_num){p3->chidao_num=p2->chidao_num;p3->kuangke_num=p2->kuangke_num;p3->qingjia_num=p2->qingjia_num;p3->zaotui_num=p2->zaotui_num;p3->lesson_time=p2->lesson_time;p3->time=p2->time;strcpy(p3->lesson_name,p2->lesson_name);strcpy(p3->name,p2->name);p2->chidao_num=p1->chidao_num;p2->kuangke_num=p1->kuangke_num;p2->qingjia_num=p1->qingjia_num;p2->zaotui_num=p1->zaotui_num;p2->lesson_time=p1->lesson_time;p2->time=p1->time;strcpy(p2->lesson_name,p1->lesson_name);strcpy(p2->name,p1->name);p1->chidao_num=p3->chidao_num;p1->kuangke_num=p3->kuangke_num;p1->qingjia_num=p3->qingjia_num;p1->zaotui_num=p3->zaotui_num;p1->lesson_time=p3->lesson_time;p1->time=p3->time;strcpy(p1->lesson_name,p3->lesson_name);strcpy(p1->name,p3->name);}p1=p2;p2=p2->next;}p1=head;p2=p1->next;xunhuan_num++;}cout<<"请输入要查看的学科名称:";cin>>lesson;cout<<"请输入要查看的时间范围【输入格式:时间(空格)时间】";cin>>look_time1>>look_time2;p1=head;   while(p1!=NULL){if(strcmp(lesson,p1->lesson_name)==0&&look_time1<=p1->time&&p1->time<=look_time2)cout<<"学生姓名:"<<p1->name<<"     旷课次数:"<<p1->kuangke_num<<endl;p1=p1->next; }return head;
}
struct student *tongji_student(struct student *head)
{    struct xueke a[10];int n,i,j,zhongjian;struct student *p1;char zhongjian_name[50];long look_time1,look_time2;if(head==NULL){cout<<"没有学生信息\n";return head; }cout<<"请输入一共的学科数:";cin>>n;for(i=0;i<n;i++){cout<<"请输入第"<<i+1<<"个学科名称:";cin>>a[i].xueke_name;a[i].people_num=0; }cout<<"请输入要查看的时间范围由小到大【输入格式:时间(空格)时间】";cin>>look_time1>>look_time2;p1=head;for(i=0;i<n;i++){while(p1!=NULL&&look_time1<=p1->time&&p1->time<=look_time2){if(a[i].xueke_name==p1->lesson_name)a[i].people_num+=p1->kuangke_num;p1=p1->next;}p1=head; }for(j=0;j<n-1;j++)                                                 for(i=0;i<n-1-j;i++){if(a[i].people_num<a[i+1].people_num){	zhongjian=a[i+1].people_num;a[i+1].people_num=a[i].people_num;a[i].people_num=zhongjian;strcpy(zhongjian_name,a[i+1].xueke_name);strcpy(a[i+1].xueke_name,a[i].xueke_name);strcpy(a[i].xueke_name,zhongjian_name);}else if(a[i].people_num==a[i+1].people_num&&strcmp(a[i].xueke_name,a[i+1].xueke_name)>0){       zhongjian=a[i+1].people_num;a[i+1].people_num=a[i].people_num;a[i].people_num=zhongjian;strcpy(zhongjian_name,a[i+1].xueke_name);strcpy(a[i+1].xueke_name,a[i].xueke_name);strcpy(a[i].xueke_name,zhongjian_name);}}for(i=0;i<n;i++){cout<<"学科名称:"<<a[i].xueke_name<<" 旷课次数:"<<a[i].people_num<<endl;return head;}return head;
}
struct student *zairu()
{struct student *p1=NULL,*p2=NULL,*head=NULL;struct student student_ziliao[100];int i=0,n=0;if((fp1=fopen("xueshengziliao.txt","rb+"))==NULL){ printf("cannot open file\n");return(head); }  while(!feof(fp1)){if(fread(&student_ziliao[i],LEN,1,fp1)!=1){if(feof(fp1)){fclose(fp1); break; }printf("file read error\n");}i++;}n=i;student_num=n;p1=p2=(struct student *)malloc(LEN);head=p1;	for(i=0;i<n;i++){p1->chidao_num=student_ziliao[i].chidao_num;p1->kuangke_num=student_ziliao[i].kuangke_num;strcpy(p1->lesson_name,student_ziliao[i].lesson_name);p1->lesson_time=student_ziliao[i].lesson_time;strcpy(p1->name,student_ziliao[i].name);p1->qingjia_num=student_ziliao[i].qingjia_num;p1->time=student_ziliao[i].time;p1->zaotui_num=student_ziliao[i].zaotui_num;p2->next=p1;p2=p1;p1=(struct student*)malloc(LEN); }p2->next=NULL;return(head);
}
void chucun(struct student *head)
{	struct student *p1;p1=head;fp1=fopen("xueshengziliao.txt","wb+");while(p1!=NULL){fwrite(p1,LEN,1,fp1);p1=p1->next; }fclose(fp1);cout<<"                    储存成功\n";
}
void main()
{
struct student *head;int a,b,c;
zhuye:  cout<<"$$$$$$$$$$$$$$$$$$$$$$    欢迎使用学生考勤管理系统    V1.0.0  $$$$$$$$$$$$$$$$$$\n";  cout<<"                              1_进入管理\n\n\n";cout<<"                              2_查看系统相关信息\n\n\n";cout<<"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n\n\n\n\n";cin>>a;if(a==1){do{ 	 cout<<"********************************************************************************\n";cout<<"                                1_建立学生缺课记录\n";cout<<"                                2_修改学生缺课记录\n";cout<<"                                3_查询学生缺课记录\n";cout<<"                                4_查看单科旷课记录\n";cout<<"                                5_查看学生旷课记录\n";cout<<"                                6_载入学生旷课记录\n";cout<<"                                7_储存学生旷课记录\n";cout<<"                                8_退出考勤管理程序\n";
cout<<"********************************************************************************\n";cin>>b;switch(b){case 1:head=creat();print(head);break;case 2:head=xiugai(head);print(head);break;case 3:chaxun(head);break;case 4:head=tongji_lesson(head);break;case 5:head=tongji_student(head);break;case 6:head=zairu();print(head);break;case 7:chucun(head);break;}}while(b!=8);}else {cout<<"******************************欢迎使用本系统 **************************************\n";cout<<"******************************返回主页请按1*************************************\n";cin>>c;if(c==1)goto zhuye;

http://chatgpt.dhexx.cn/article/ecDprkN4.shtml

相关文章

学生考勤管理系统

学生考勤管理系统 学生考勤管理系统 背景分析&#xff1a; 随着高校校园信息化的逐步完善&#xff0c;有效地借助网络、数据库等技术提高工作和管理效率。如今针对师生的成绩查询系统、教务管理系统、招生就业系统、BBS、校园网站等系统在各大高校纷纷出现[1]&#xff0c;对全…

C语言课程设计——学生考勤管理系统

C语言课程设计——学生考勤管理系统 题目要求&#xff1a; 学生考勤管理系统设计 &#xff08;1&#xff09;问题描述 考勤信息记录了学生的缺课情况&#xff0c;它包括&#xff1a;缺课日期、第几节课、课程名称、学生姓名、缺课类型&#xff08;迟到、早退、请假及旷课&…

基于java学生考勤管理系统设计——计算机毕业设计

考勤作为一个学校的基础管理,是对学生的个人出勤情况的依据。传统的考勤靠手工操作、纸质传递,这样的方式造成了考勤不全面、数据不准确和资料的共享程度低。因此学校需要一个可以适应大量信息控制和数据处理的考勤管理系统,用计算机的高效处理方法和数据库的严谨结构代替手工操…

基于JavaSwing的学生考勤管理系统设计与实现

目录 前言 7 一、系统开发环境及相关技术 8 &#xff08;一&#xff09;系统设计思想及处理流程 8 &#xff08;二&#xff09;运行环境 8 &#xff08;三&#xff09;开发技术及开发工具简介 8 三、需求分析 10 &#xff08;一&#xff09;学生用户需求 10 &#xff08;二&…

《学生考勤信息管理系统》数据库课程设计

目录 一、 需求分析 前台功能模块 后台功能模块 1.1 功能模块的划分及介绍 1.2 实体及重要属性 1.3 业务流程图 二、 概念结构设计 2.1. E-R图的设计 三 、逻辑结构设计 表设计 User1-用户表 Student-学生信息表 College-院系信息表 Attendance personnel 考勤人员表 C…

多个div在同一行显示

使用float:left&#xff0c;也可以使用display : inline-block&#xff0c;可以使多个div在同一行显示。 <div class"search_row"><div class"form-group" style"float:left" > <%-- 通过左浮动使多个div在一行显示--%&g…

HTML如何让两个div并排在一行,如何实现两个或多个div并列于一行

div是块状元素&#xff0c;默认是独占据一行。 但是&#xff0c;如何让两个或多个块区域并列于一行&#xff1f; 块状元素有一个很重要的“float”属性&#xff0c;可以达成这种效果。float 属性也被称为浮动属性&#xff0c;这个词非常形象。 对前面的div元素设置浮动属性后&a…

两个div在一行显示

原因&#xff1a;div为块级元素&#xff0c;默认占一行高度 解决方法1&#xff1a;两个div都添加样式 display&#xff1a;inline-block&#xff1b;&#xff08;如值为inline&#xff0c;设置宽高失效&#xff0c;div靠内容撑起&#xff09; 代码&#xff1a; <style>…

html如何在同一行显示两个div?

代码&#xff1a; <div style"background: blue;float:left">aaa </div> <div style"background: green;float:left">bbb </div>效果&#xff1a;

在HTML中如何让两个图像(div)不换行的显示在一起

代码如下 示意图如下 在两个box后面加入float即可

怎么把两个div一左一右放

怎么把两个div一左一右放 1.代码 <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><title>Title</title> </head> <body> <div style"width:150px;height:50px;margin:0…

css 并排放置两个div

写代码时遇到了并排放置两个div的需求&#xff0c;于是总结了一下&#xff0c;有以下几种方法可以实现&#xff1a; &#xff08;1&#xff09;设置浮动&#xff1a; a&#xff09;两个div都设置为左浮动&#xff1a; <!DOCTYPE html> <html> <head><…

【HTML】把两个div的内容放置在同一行

使用float属性把两个div的内容放置在同一行&#xff1a; <html> <head> </head> <body><div ><div style"float:right;">我在右侧</div><div>我在左侧</div></div> </body> </html>结果图&…

css如何让两个div并列在同一行

让两个Div并排显示的方法有很多&#xff0c;使用display的inline属性、通过设置float来让Div并排显示都可以实现&#xff0c;感兴趣的朋友可以参考下本文 让两个Div并排显示 一、使用display的inline属性 代码如下 二、通过设置float来让Div并排显示 代码如下 三、对于两个d…

Web前端培训:两个div在同一行可以实现吗?

我们在写页面的时候经常会遇到需要将两个div盒子同行显示的情况&#xff0c;那么“两个Div同行显示”该如何显示呢?一般两个div同行显示可以用float: left和display: inline_block来实现&#xff0c;下面我们分别介绍。 首先我们先来看&#xff0c;没有同行显示的两个div什么…

将两个或多个div放在同一行

1.先画出三个大盒子 2.1在style属性中添加display:inline-block,结果如图&#xff1a; 但是使用该方法盒子与盒子间的默认缝隙是不能修改的&#xff0c;通常我们会使用以下的方法实现两个以上的盒子的摆放 2.2在style属性中添加float&#xff1a;left&#xff1b;将元素移到左…

如何让两个div处于一行

我们知道 div是块级元素,是独占一行的.一般情况下,两个相邻的div是不会处于一行的 例如: Html代码 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>让两个div处于同一行</title&…

1、RH850时钟源及配置

一、时钟源 系统时钟源有5种&#xff1a; 外部主晶振8M-24M。(main osc) 外部副晶振32.768KHz。 &#xff08;sub osc&#xff09; 内部高速晶振8M。(high speed int osc) 内部低速晶振240KHz。(low speed int osc) PLL倍频器。 Note 1. 外部副晶振只有 144 pin and 17…

【经验】RH850 RS-CANFD接收滤波配置

芯片型号&#xff1a;RH850/F1KM-S1 不同PIN封装形式所支持的CAN通道数量不同&#xff0c;RS-CAN通道数量最多可支持6路。 目录 一、FLECCTR&#xff08;接收规则Entry控制寄存器&#xff09; 二、FLCFG0&#xff08;接收规则配置寄存器0&#xff09; 三、FLCFG1&#xff08…