附件 6:
北 京 理 工 大 学 珠 海 学 院
课 程 设 计 说 明 书
_2011—_2012 学年第_ 1_学期
题目: 考勤统计程序
学 院: 计算机学院
专业班级: 10 数字媒体技术 3 班
学 号:100204031007
学生姓名: 罗威豪
指导教师: 夏力前
成 绩:
时 间: 2011-12-21
2011 年 12 月 21 日
考勤统计程序
摘 要
学生考勤管理程序是作为学校考勤的基本管理,是学校对学生考勤管理的基
本依据。开发考勤管理系统,正是完善学校信息化管理的重要环节。人工考勤已
经很难满足学校规范化管理的要求,面对庞大的信息量,该放手现在存在很多弊
病。因此,简历现代化的只能考情管理系统势在必行。这样也大大减轻了考勤工
作人员的工作量,提高了工作效率,使原本复杂和鼓噪无味的工作变得简单而轻
松。
本文以“考勤信息管理系统”的设计与实现为例,阐述了考勤系统的设计开发的全
过程。该系统侧重于学生信息管理和学生考勤信息的登记与查询。本系统使用的
开发工具是 vc++开发程序,通过已编制好的程序,完成对学生信息的输入、输
出、插入、修改、删除操作,以及学生迟到、早退、旷课考勤信息的登记和查询,
完善学校管理现代化,方便管理人员统计,考勤学生出勤情况,方便学生管理部
门查询,考核学生的出勤率,准确地掌握学生出勤情况和相关资料,有效管理、
掌握学生各项情况。
关键词:考勤管理 visualC++ 文件保存 查询 统计
目 录
1 需求分析.........................................................................................................................................1
问题描述..............................................................................................................................1
基本要求...........................................................................................................................1
2 概要分析.........................................................................................................................................2
数据需求..............................................................................................................................2
程序模块及之间的调用关系...........................................................................................2
3 详细设计......................................................................................................................................3
类的设计..............................................................................................................................3
学生考勤系统的显示模块..................................................................................................3
学生考勤系统的查询模块..................................................................................................4
学生考勤系统的修改模块..................................................................................................4
学生考勤系统的删除模块..................................................................................................6
学生考勤系统的录入模块..................................................................................................6
学生管理系统的统计模块..................................................................................................8
4 程序测试.......................................................................................................................................10
5 参考文献.......................................................................................................................................13
心得 体会......................................................................................................................................14
教师 评语......................................................................................................................................15
1 需求分析
问题描述
考勤信息记录了学生的缺课情况,它包括:缺课日期、第几节课、课程
名称(课程名称中不会出现空格)、学生姓名、缺课类型(迟到、早退、请假及
旷课)。试设计考勤管理系统,使之能提供以下功能:
1).录入学生的缺课记录:从键盘输入数据(提示:为避免重复从键盘
输入数据,测试时 可将数据存储在文件中,利用输入重定向功能读入),输入格
式为:
缺课日期第几节课 课程名称学生姓名 缺课类型
每行一条纪录。
例如:
080429 4 C++程序设计实验 张三 迟到
080428 4 C++程序设计 李四 旷课
2).修改某个学生的缺课记录。
3).查询某个学生的缺课情况。
4). 某段时间内旷课情况的统计。
基本要求
统要实现的是学生考勤管理系统,在设计时应该使系统便于考勤管理员、学
生操作,系统应有的基本功能如下:
(1)、学生考勤管理相关信息的管理功能;
(2)、统计功能;
(3)、查询功能;
(4)、文件保存功能;
2 概要分析
数据需求
本系统主要涉及的数据有学生缺课信息类和有关信息排序类:学生缺课信息
包括缺课时间、学生姓名、课程名称、第几节、学生缺课类型(迟到、早退、旷
课、请假)。有关信息排序类包括对课程排序和对姓名排序。
程序模块及之间的调用关系
图 学生考勤管理系统中菜单函数的功能图
3 详细设计
类的设计
此系统设计了两个类,一个是 record 类,一个是 records 类。Record 类完成对学
生基本信息的声明与获取,包括学生姓名、缺课日期、缺课课程名称、缺课课程
类型、缺课节次。
Record 类的设计
class record
{
public:
void set(string d,int cno,string c,string s,int type)
{
(d);//缺课日期
(c);//缺课课程名称
(s);//学生姓名
this->cno=cno;//缺课节次
this->type=type;//缺课类型
}
void set(record re)
{
();//获取缺课日期
();//获取缺课课程名称
();//获取学生姓名
this->cno=;//获取缺课节次
this->type=;//获取缺课类型
}
string date,cname,sname;//定义日期,课程名称,学生姓名
int cno,type;//定义缺课节次,缺课类型
};
学生考勤系统的显示模块
void pri(records *r)//函数
{if(r->n==0)
{cout<<"记录为空!"<<endl;return;
}
cout<<"\n 序号\t 缺课日期 节次\t 课程名称\t 学生姓名\t 缺课"<<endl;
for(int i=0;i<r->n;i++)
{cout<<i<<"\t"<<flush;prione(r->r[i]);
}
}
学生考勤系统的查询模块
void pri(records *r)//函数
{
if(r->n==0)
{
cout<<"记录为空!"<<endl;
return;
}
cout<<"\n 序号\t 缺课日期 节次\t 课程名称\t 学生姓名\t 缺课类型"<<endl;
for(int i=0;i<r->n;i++)
{
cout<<i<<"\t"<<flush;
prione(r->r[i]);
}
}
学生考勤系统的修改模块
void edt(records *r)//函数
{
if(r->n==0)
{
cout<<"记录为空!"<<endl;
return;
}
cout<<"请输入要修改缺课记录的学生姓名: "<<flush;
string t1,t3,t4;
char tmp[30];
int t2,t5,flag=0;
cin>>tmp;
(tmp);
for(int i=0;i<r->n;i++)
if(r->r[i].sname==t1)
{
flag=7;
break;
}
if(!flag)
{
cout<<"查无此学生!"<<endl;
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;
cout<<"请输入要修改的项目:\n(1.缺课日期 2.缺课节次 3.缺课名称 4.学生姓
名 5.缺课类型 6.全部) "<<flush;
e0:
cin>>flag;
switch(flag)
{
case 1:goto e1;
case 2:goto e2;
case 3:goto e3;
case 4:goto e4;
case 5:goto e5;
case 6:goto e1;
default:goto e0;
}
e1:
cout<<"请输入缺课日期: (例如 100216) "<<flush;
cin>>t1;
if(flag!=6)goto e6;
e2:
cout<<"请输入缺第几节课: "<<flush;
cin>>t2;
if(flag!=6)goto e6;
e3:
cout<<"请输入缺课名称: "<<flush;
cin>>t3;
if(flag!=6)goto e6;
e4:
cout<<"请输入缺课学生姓名: "<<flush;
cin>>t4;
if(flag!=6)goto e6;
e5:
cout<<"请输入缺课类型: (1.迟到 2.早退 3.请假 4.旷课) "<<flush;
cin>>t5;
e6:
r->r[i].set(t1,t2,t3,t4,t5);
char yn;
cout<<"保存修改? (y/n) "<<flush;
cin>>yn;
if(yn=='y')wt(r);
else return;}
学生考勤系统的删除模块
void del(records *r)//函数
{
if(r->n==0)
{
cout<<"记录为空!"<<endl;
return;
}
cout<<"请输入要删除的记录的序号: (输入-1 删除全部) "<<flush;
int flag;
cin>>flag;
if(flag>r->n-1&&flag<-1)
{
cout<<"不存在所要删除的记录!"<<endl;
return;
}
else if(flag==-1)r->n=0;
else
{
for(int i=flag;i<r->n-1;i++)
r->r[i].set(r->r[i+1]);
r->n--;
}
char yn;
cout<<"保存修改? (y/n) "<<flush;
cin>>yn;
if(yn=='y')wt(r);
else return;
}
学生考勤系统的录入模块
void input(records *r)//录入
{
string t1,t3,t4;
int t2,t5,flag=0;
char yn;
cout<<"请输入学生缺课记录:"<<endl;
m1:
cout<<"请输入缺课日期: (例如 100216) "<<flush;
cin>>t1;
if(!(timechk(t1)))goto m1;
m2:
cout<<"请输入缺第几节课: "<<flush;
cin>>t2;
if(t2<1||t2>10)
{
cout<<"节次录入有误! 请重新录入: "<<endl;
goto m2;
}
cout<<"请输入缺课名称: "<<flush;
cin>>t3;
cout<<"请输入缺课学生姓名: "<<flush;
cin>>t4;
m3:
cout<<"请输入缺课类型: (1.迟到 2.早退 3.请假 4.旷课) "<<flush;
cin>>t5;
if(t5<1||t5>4)
{
cout<<"类型输入有误! 请重新录入: "<<endl;
goto m3;
}
for(int i=0;i<r->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)
{
cout<<"该条记录已存在,是否添加为新记录? (y/n) "<<flush;
n1:
cin>>yn;
if(yn=='y')break;
else if(yn=='n')goto n2;
else goto n1;
}
r->r[r->n++].set(t1,t2,t3,t4,t5);
n2:
cout<<"是否继续输入? (y/n) "<<flush;
n3:
cin>>yn;
if(yn=='y')goto m1;
else if(yn=='n')
{
cout<<"保存修改? (y/n) "<<flush;
cin>>yn;
if(yn=='y')wt(r);
else return;
}
else goto n3;}
学生管理系统的统计模块
void search_s(records *r)//统计
{
if(r->n==0)
{
cout<<"记录为空!"<<endl;
return;
}
records *r1=new records();
g1:
cout<<"请输入要检索的时间范围: (例如 080610-080612) "<<flush;
string tmp,ld,hd;
cin>>tmp;
((0,6));
((7,6));
if(!timechk(ld)||!timechk(hd))goto g1;
for(int i=0;i<r->n;i++)
if(r->r[i].(ld)>=0&&r->r[i].(hd)<=0&&r->r[i].type==4
)
r1->r[r1->n++].set(r->r[i]);
cout<<"请选择统计方式: (1.学生旷课情况降序显示 2.课程旷课情况降序显
示)"<<flush;
g2:
cin>>i;
switch(i)
{
case 1:
cout<<"\n 在"<<ld<<"到"<<hd<<"期间学生旷课情况如下:"<<endl;
r1->order_s();
break;
case 2:
cout<<"\n 在"<<ld<<"到"<<hd<<"期间课程旷课情况如下:"<<endl;
r1->order_c();
break;
default:goto g2;
}
}
4 程序测试
1 程序开始运行的界面
2 程序显示功能的界面
3 程序录入功能的界面
4 程序查询功能的界面
5 程序修改功能的界面
6 程序删除功能的界面
5 参考文献
[1] 郑阿奇:《c++面向对象》[M],电子工业出版社 2011 年版,第 374 页。
心得 体会
经过本次课程设计,发现做软件真的需要做很多工作,不仅仅是敲代码。
首先,必须要有需求分析。就拿这次的题目来说,一个清晰的需求分析能让
我省去很多工作,能让我把代码写的更清晰,让我的代码能有更好的重用性,以
此简化程序。而这次的题目其实也算不上需求分析,只能算是功能分析吧。从界
面到用户登陆判断,从增删改查基本功能到文件读写。如果能够把代码细化,把
基本功能都封装成函数,这样应该会提高代码的重用性。
其次,有了清晰的需求分析,还要有注释。注释也很重要,特别是写过之后
重用和测试代码时,都必须得看。否则就不得不将已写好的封装函数从头到尾再
看一遍,再理解,这样很浪费时间。有了注释,就可以省去这些重新理解函数的
时间,可以提高效率。
再次,写注释是为了使函数更简单的被理解。而写注释之前,必须要测试这
段代码的可行性。必须要尽可能多的考虑会出现的情况,对不希望出现的情况予
以相对的措施或者提示。这样在代码重用的时候也可以放心的重用,而不必因为
代码写的不够完善而再来修改,这样也会浪费很多时间。
最后,程序的测试。一个完善的程序应该经得起测试。自己的程序写得好不
好,最终得看测试。如果输入了非法的输入或者操作,程序是否能够正常运行?
还是会像这次一输入错误就会死循环?这是程序的健壮性。做好以上几个方面,
程序基本就做好了。但是任何一个程序都不可能没有 BUG,金无足赤人无完人。
如果要追求完美,就不得不锲而不舍,定期得到用户的反馈然后修复相关问题。
就像微软一样,总是会在问题出现之后就发布漏洞补丁
教师 评语