学生考勤管理系统课程设计报告1.docx

上传人:b****1 文档编号:22793130 上传时间:2023-04-28 格式:DOCX 页数:34 大小:261.41KB
下载 相关 举报
学生考勤管理系统课程设计报告1.docx_第1页
第1页 / 共34页
学生考勤管理系统课程设计报告1.docx_第2页
第2页 / 共34页
学生考勤管理系统课程设计报告1.docx_第3页
第3页 / 共34页
学生考勤管理系统课程设计报告1.docx_第4页
第4页 / 共34页
学生考勤管理系统课程设计报告1.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

学生考勤管理系统课程设计报告1.docx

《学生考勤管理系统课程设计报告1.docx》由会员分享,可在线阅读,更多相关《学生考勤管理系统课程设计报告1.docx(34页珍藏版)》请在冰豆网上搜索。

学生考勤管理系统课程设计报告1.docx

学生考勤管理系统课程设计报告1

.需求分析

功能需求:

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

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

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

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

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

6、系统以菜单方式工作数据需求

本系统主要涉及的数据有学生缺课信息类和有关信息排序类。

学生缺课信息包括缺课时间,学生姓名,课程名称,第几节,学生迟到次数,早退次数,请假次数,旷课次数。

有关信息排序类包括对课程排序和对姓名排序。

性能需求

要求系统具有可靠性,速度要快

二、系统的主要功能

(1)、录入学生的缺课记录,函数代码voidinput(records*r){}模块中。

首先提示用户

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

(2)、修改某个学生的缺课记录,函数代码voidedt(records*r){}模块中。

首先必须查

找到你所需要修改的那位的学生全部缺课记录。

这个模块不需要定义新的结构体。

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

1、缺课日

期2、第几节课3、课程名称4、学生姓名5、缺课类型6、退出修改程序并返回系统主菜单。

修改很简单,仅需要对该学生的某个部分进行替换即可。

采用switch语句很快就解决。

最后

实现对所选记录的修改,完成后更新原有的学生记录。

(3)、查询某个学生的缺课情况,函数代码voidsearch(records*r){}模块中。

达到查

询结果按照日期升序排序,同一天内按照所缺课程的时间升序排序的目的,

(4)、统计,函数代码为voidorder_c(){}和voidorder_s(){}的类模块中。

其中实现对课程排序和对学生姓名的排序。

三、流程图

学生考勤系统结构图:

基类的数据成员和成员描述

类名/函数名

描述"

类名/函数名

描述

record

基类

edt()

修改学生信息

records

实现学生旷课情况排序的类

del()

删除学生信息

wt/rd()

实现对文件的输入和输出

search()

查找学生信息

input()

录入学生的缺课记录

search_s()

一定范围查找学生

信息

edt()

修改学生信息

main()

主函数

四、数据结构设计

此程序运用多种条件语句,主体采用的是动态数组、指针。

系统的设计采用了数组语句、选择语句和循环语句,在需要处理大量同类数据时,这样就使程序书写更加简洁。

程序使用了布尔函数。

选择语句多采用if多分支选择结构与switch语句。

首先计算switch表达式,然后在caes子句中寻找值相等的常量表达式,并以此为入口符号,由此开始顺序执行。

循环语句采用了for语句等、do-while语句,for语句用于已知循环次数的循环结构,括号中的三个量分别用来表示循环变量初值、循环终值和循环增量。

do-while语句先循环后判断,Break语句在switch语句中,保证多分支情况的正确执行,在循环语句中,强制终止本层循环。

保存和读取函数是典型的函数功能,一个程序是由若干个函数组成的,保存和读取函数是和其他函数互相调用的再有使用有关类的设计,学生缺课信息类和有关信息排序类,如下:

classrecord//学生缺课信息类

{public:

voidset(stringd,inteno,stnngc,strings,inttype)

{

日期

课程名字

学生姓名

对缺课类型的选择为int型

缺课类型

date.assign(d);//

cname.assign(c);//sname.assign(s);//this->cno=cno;//this->type=type;//

}

voidset(recordre)

{

date.assign(re.date);cname.assign(re.cname);sname.assign(re.sname);this->cno=re.cno;

this->type=re.type;

}

stringdate,cname,sname;intcno,type;

};

classrecords//实现学生旷课情况排序的类

{

public:

records()//构造函数

{

r=newrecord[100];

n=0;

}

voidorder_s()//姓名的排序

{

inti;

intj;

string*s=newstring[n];

int*c=newint[n];

s[0].assign(r[0].sname);

c[0]=1;

intk=1,flag;

for(i=1;i

{

flag=0;

for(j=0;j

if(r[i].sname==s[j])

{

c[j]++;flag=1;break;

}if(!

flag){

s[k]=r[i].sname;c[k++]=1;

}

}for(i=1;ivk;i++)

for(j=i;j>0;j--)

{

if(c[j]>c[j-1])

{

inttmp=c[j];c[j]=c[j-1];c[j-1]=tmp;stringstmp=s|j];s[j]=s[j-1];s[j-1]=stmp;

}

}

coutvv"旷课学生姓名\t旷课次数"<

coutvvs[i]vv"\t\t"vvc[i]vvendl;

}

voidorder_c()//课程排序

{

inti,j;

string*s=newstring[n];

int*c=newint[n];s[0].assign(r[0].cname);c[0]=1;

intk=1,flag;

for(i=1;i

{

flag=0;for(j=0;j

c[j]++;flag=1;break;

}if(!

flag){

s[k]=r[i].cname;c[k++]=1;

}

}

for(i=1;i

for(j=i;j>0;j--)

{

if(c[j]>c[j-1])

{

inttmp=c|j];c[j]=c[j-1];c[j-1]=tmp;stringstmp=s[j];s[j]=s[j-1];s[j-1]=stmp;

}

}

coutvv"课程名\t旷课人次"<

coutvvs[i]vv"\t"vvc[i]vvendl;

}

record*r;

intn;

};

把所有的学生记录都保存到一个文件里面,然后根据需要再将里面需要查找的元素进行

查找,相应的排序可能就是将他们尽可能压进关联式容器map有的部分就压入set里面,

这些都是根据模块的功能来选定的。

可以这么说,选择好合理的数据结构查找与排序就可以一劳永逸了。

这点在后面部分会有详细的说明。

还有就是对各功能子函数的编写应用。

五、类设计

系统中主要涉及了两个类:

一个是classrecord//关于学生考勤基本信息类

另一个是classrecords//实现学生旷课情况排序的类

六、主要算法设计

关键算法:

旷课情况的排序:

classrecords//实现学生旷课情况排序的类

{

public:

records()//构造函数

{

r=newrecord[100];

n=0;

旷课记录的修改:

coutvv"请输入要修改缺课记录的学生姓名:

"vvfiush;

stringt1,t3,t4;

chartmp[30];

intt2,t5,flag=0;

cin>>tmp;

tl.assign(tmp);

for(i=0;ivr->n;i++)

if(r->r[i].sname==t1)

{

flag=7;

break;

}

if(!

flag)

{

coutvv"查无此学生!

"<

return;

}

t1=r->r[i].date;

t2=r->r[i].cno;

t3=r->r[i].cname;

t4=r->r[i].sname;

t5=r->r[i].type;

旷课项目的修改!

coutvv"请输入要修改的项目:

\n(1.缺课日期2.缺课节次3.缺课名称4.学生姓名5.缺课类型6.全部)"vvflush;

e0:

cin>>flag;

switch(flag)

{

case1:

gotoe1;

case2:

gotoe2;

case3:

gotoe3;

case4:

gotoe4;

case5:

gotoe5;

case6:

gotoe1;

default:

gotoe0;

}

用到的知识点有:

函数的作用域、函数的调用、数组赋值、函数循环、以及类的定义,另外还用到了for函数、getch函数、switch函数、case函数、default函数等等。

七、主要代码

第一部分:

学生考勤管理系统

#include"stdiib.h"

#inelude"hanshushixian.h"

#include"record.h"

#inelude

#include

#include

#ineludevfstream>usingnamespacestd;#include"record.h"

 

intmain()

{

c1:

//主菜单实现

system("cls");

{

coutvv"

*************************************************************"<

★欢迎访问学生考勤管理系统^

coutvv"

***"vvendl;

coutvv"

*mmm*mmmn*******************"VVend];

***系统主菜单:

1.显示所有学生的缺课记录

cout<<"

***"<

cout<<"

***"<

cout<<"

***"<

cout<<"

***"<

cout<<"

***"<

cout<<"

***"<

cout<<"

***"<

coutvv"

2.录入学生的缺课信息记录

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

4.修改某个学生的缺课记录

5.删除某个学生的缺课记录

6.统计某段时间内旷课情况

7.退出系统

 

*************************************************************"<

coutvv"O(n_n)0请选择你所需要的操作0(n_n)o:

"《flush;intchose;

c2:

cin>>chose;

if(chose==7)exit(0);

records*r=newrecords();

rd(r);

switch(chose)

{

case1:

pri(r);break;

case2:

input(r);break;

case3:

search(r);break;

case4:

edt(r);break;

case5:

del(r);break;

case6:

search_s(r);break;

default:

gotoc2;

}

你的选择:

"vvfiush;

coutvv"是否返回主菜单?

(y/n)charyn;

c3:

cin>>yn;

if(yn二二'y')gotoc1;

elseif(yn=='n')exit(O);

elsegotoc3;

return0;

第二部分:

record.h(类的设计部分)

#include

#include

usingnamespacestd;

#ifndefrecord_class

#definerecord_class

classrecord//关于学生考勤基本信息类

{

public:

voidset(stringd,inteno,stnngc,strings,inttype){

date.assign(d);cname.assign(c);sname.assign(s);this->cno=cno;this->type=type;

}

voidset(record&re)

{

可以避免不必要的内存分配,可以提高效率

date.assign(re.date);//assigncname.assign(re.cname);sname.assign(re.sname);this->cno=re.cno;this->type=re.type;

}

stringtostr()

{

strings;

chartmp[3];

s.assign(date);

itoa(cno,tmp,10);

s.append("#");

s.append(tmp);//直接添加另一个完整的字符串

s.append("#");

s.append(cname);

s.append("#");

s.append(sname);itoa(type,tmp,10);

s.append("#");

s.append(tmp);

returns;

}

stringdate;

stringcname;

stringsname;

intcno;

inttype;

};

#endifrecord_class

#ifndefrecords_class#definerecordsclass

classrecords//实现学生旷课情况排序的类{

public:

records()//构造函数

{

r=newrecord[100];

n=0;

}

voidorder_s()//姓名的排序

{

inti;

intj;

string*s=newstring[n];

int*c=newint[n];

s[0].assign(r[0].sname);c[0]=1;

intk=1,flag;

for(i=1;i

{

flag=0;

for(j=0;j

c[j]++;flag=1;break;

}if(!

flag){

s[k]=r[i].sname;c[k++]=1;

}

}for(i=1;i0;j--){

if(c[j]>c[j-1])

{

inttmp=c[j];c[j]=c[j-1];c[j-1]=tmp;stringstmp=s|j];s[j]=s[j-1];s[j-1]=stmp;

}

}

coutvv"旷课学生姓名\t旷课次数"<

coutvvs[i]vv"\t\t"vvc[i]vvendl;

}

voidorder_c()//课程排序

{"

inti,j;

string*s=newstring[n];

int*c=newint[n];s[0].assign(r[0].cname);c[0]=1;

intk=1,flag;

for(i=1;i

{

flag=0;

for(j=0;j

if(r[i].cname==s[j])

{

c[j]++;flag=1;break;

}if(!

flag){

s[k]=r[i].cname;c[k++]=1;

}

}for(i=1;i0;j--){

if(c[j]>c[j-1])

{

inttmp=c[j];c[j]=c[j-1];c[j-1]=tmp;stringstmp=s|j];s[j]=s[j-1];s[j-1]=stmp;

}

}

coutvv"课程名\t旷课人次"<

coutvvs[i]vv"\t"vvc[i]vvendl;

}

record*r;

intn;

};

#endifrecords_class

第三部分:

hanshushixian.h(功能子函数的实现部分)

#include"record.h"

#include

#include

#include

#include"stdlib.h"

#includeusingnamespacestd;

voidwt(records*r)//实现对文件的输出

{

ofstreamoutf("data.txt");

for(inti=0;in;i++)

outf<r[i].tostr()<

"vvendl;

}

voidrd(records*r)//实现对文件的输入

{

ifstreaminf("data.txt");

if(inf.eof())

{

coutvv"记录为空!

"<

}

stringt1,t3,t4;

chartmp[30];

intt2,t5;

r->n=0;

while(true)

{

inf.getline(tmp,10,'#');if(tmp[0]=='!

')break;t1.assign(tmp);

inf.getline(tmp,3,#);t2=atoi(tmp);

inf.getline(tmp,30,'#');t3.assign(tmp);

inf.getline(tmp,30,#);t4.assign(tmp);

inf.getline(tmp,3);t5=atoi(tmp);

r->r[r->n++].set(t1,t2,t3,t4,t5);

booltimechk(stringt1)

{

intyear=atoi(t1.substr(0,2).c_str());

intmonth=atoi(t1.substr(2,2).c_str());

intday=atoi(t1.substr(4,2).c_str());

if(!

(t1.length()==6&&year>0&&yearv99&&month>0&&monthv13&&day>0&&day<32)){

coutvv"日期录入有误!

请重新录入:

"wendl;

returnfalse;

}

elsereturntrue;

}

录入学生的缺课记录

voidinput(records*r)//

{

stringt1,t3,t4;

intt2,t5,flag=0;

charyn;

coutvv"录入一条学生缺课记录:

"vvendl;//endl表示终止一行并刷新缓冲区

m1:

coutvv"请输入缺课日期:

(例如110627)"vvflush;//flush表示刷新缓冲区

cin>>t1;

if(!

(timechk(t1)))gotom1;

m2:

coutvv"请输入缺第几节课:

"vvfiush;

cin>>t2;

if(t2v1||t2>10)

{

coutvv"节次录入有误!

请重新录入:

"vvendl;

gotom2;

}

coutvv"请输入缺课名称:

"vvfiush;

cin>>t3;

coutvv"请输入缺课学生姓名:

"vvfiush;

cin>>t4;

m3:

coutvv"请输入缺课类型:

(1.迟到2.早退3.请假4.旷课)"vvflush;cin>>t5;

if(t5v1||t5>4)

{

coutvv"类型输入有误!

请重新录入:

"vvendl;

gotom3;

}

for(inti=0;ivr->n;i++)

if(r->r[i].date==t1&&r->r[i].cno==t2&&r->r[i].cname==t3&&r->r[i].sname==t4&&r->r[i].type==t5)

coutvv"该条记录已存在,是否添加为新记录?

(y/n)"vvfiush;

n1:

n2:

coutvv"是否继续输入?

(y/n)"<

n3:

cin>>yn;

if(yn二二'y')gotom1;

elseif(yn=='n')

{

coutvv"保存修改?

(y/n)"vvflush;cin>>yn;

if(yn二二'y')wt(r);

elsereturn;

}

elsegoton3;

voidprione(recordr)

{

coutvvr.datevv"\t\t"ovv"\t"vvr.cnamevv"\t\t"vvr.snamevv"\t\t"vvflush;

switch(r.type)

迟至U"vvendl;break;早退"vvendl;break;请假"vvendl;break;旷课"vvendl;break;

{

case1:

coutvv"

case2:

coutvv"

case3:

coutvv"

case4:

coutvv"default:

;

}

}

修改学生信息

voidp"(records*r)//{

if(r->n==O)

{

coutvv"记录为空!

"<

}

节次\t课程名称\t学生姓名\t缺课类型"<

cout<<"\n序号\t缺课日期for(inti=0;in;i++)

{

cout<

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1