完整word版学生考勤管理系统.docx
《完整word版学生考勤管理系统.docx》由会员分享,可在线阅读,更多相关《完整word版学生考勤管理系统.docx(27页珍藏版)》请在冰豆网上搜索。
完整word版学生考勤管理系统
一、设计内容与设计要求
1.设计内容:
学生考勤管理系统
1、问题描述
学生信息包括:
学号、姓名、性别、年龄、班级等信息。
考勤信息包括:
缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟到、早退、请假和旷课)。
2、功能要求
(1)添加功能:
程序能够添加学生的记录和缺课记录,提供选择界面供用户选择所要添加的类别。
添加学生记录时,要求学号要唯一,如果添加了重复学号的记录时,则提示数据添加重复并取消添加。
(2)查询功能:
可根据学号、姓名等信息对已添加的学生记录进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。
还可以按课程名、学生姓名对缺课记录进行查询。
(3)显示功能:
可显示当前系统中所有学生的记录和缺课记录,每条记录占据一行。
(4)编辑功能:
可根据查询结果对相应的记录进行修改,修改时注意学号的唯一性。
(5)删除功能:
主要实现对已添加的学生记录进行删除。
如果当前系统中没有相应的记录,则提示“记录为空!
”并返回操作。
(6)统计功能:
能根据多种参数进行统计。
能按课程名统计出学生旷课的信息、还可以按姓名统计出任一学生的旷课情况。
需要排序。
(7)保存功能:
可将当前系统中各类记录存入文件中,存入方式任意。
(8)读取功能:
可将保存在文件中的信息读入到当前系统中,供用户进行使用。
一、需求分析
1.系统功能流程图
3.输入输出的要求
1.输入的要求:
通过主函数体调用其他函数应用系统主控界面包括学生信息录入,查找等功能模块。
学生信息录入功能完成学生信息和缺课信息的输入。
记录查询功能可以对数据各分类的记录进行查询。
2.输出的要求:
1)能够按编号、姓名对学生的信息进行检索并将检索结果显示在屏幕上。
2)可以统计全部学生缺课类型,及其缺课次数。
3)如果检索不到相应的信息应提示用户。
二、总体分析
系统功能分析
能够从屏幕上读取一个学生的信息和缺课信息并将信息存入到数据文件中。
能够将指定的信息从文件中删除。
能够按编号、姓名对学生的信息进行检索并将检索结果显示在屏幕上。
可以统计全部学生缺课次数,及其缺课类型。
要求有错误提示功能。
如果检索不到相应的信息应提示用户。
三、详细设计
1.类设计:
类:
Person
数据成员
学号,姓名,性别,年龄,班级缺课类型,缺课次数,指针域
doublenum;//学号
charName[20];//姓名
charsex;//性别
doubleold;//年龄
longdoubleG;//班级
intDuty;//缺课类型(1-迟到,2-早退,3-请假,4-旷课)
doubleSalary;//缺课次数
Person*next;//指针域、
成员函数
Person()//基类构造
{
next=0;//指针域设置为空
}
virtual~Person()//基类虚析构
{
}
virtualvoidInput()=0;//从键盘输入数据
virtualvoidInput(ifstream&ifs)=0;//从文件输入数据
virtualvoidOutput()=0;//向屏幕输出数据
virtualvoidOutput(ofstream&ofs)=0;//向文件输出数据
virtualdoubleIncoming()=0;//计算次数
friendclassCollege;
类:
Teacher(公共继承与Person类)
数据成员:
protected:
intHours;//第几节课
charB;//迟到日期
charZ;//课程名称classschool
成员函数:
Tercher(){}
voidInput()
voidInput(ifstream&ifs)
voidOutput(ofstream&ofs)
doubleIncoming()
迟到类:
classAssistant:
virtualpublicPerson
数据成员:
protected:
intAllowance;
intHours;//第几节课
charB;//早退日期
charZ;//课程名称
成员函数:
Assistant()
voidInput()
voidInput(ifstream&ifs)
voidOutput()
voidOutput(ofstream&ofs)
doubleIncoming()
请假类:
classManager:
virtualpublicPerson
数据成员:
protected:
intAllowance;
intHours;//第几节课
charB;//请假日期
charZ;//课程名称
成员函数:
Manager()
voidInput()
voidInput(ifstream&ifs)
voidOutput()
voidOutput(ofstream&ofs)
doubleIncoming()
旷课类:
classTeacher_Assistant:
publicTeacher,publicAssistant
成员函数:
Teacher_Assistant()
voidInput()
voidInput(ifstream&ifs)
voidOutput()
voidOutput(ofstream&ofs)
doubleIncoming()
学生类:
classCollege
数据成员
private:
Person*PL;
voidClear();
intCollege:
:
Cfind(intID,Person**p1,Person**p2)
成员函数:
public:
College();//构造
~College();//析构
voidAdd();//退出
voidDelete();//删除
voidModify();//修改
voidPrint();//输出
voidSave();//信息存盘
voidLoad();//信息装入
voidFind();//查找
voidBuild();//导引
voidStat();//统计
四、界面设计与各功能模块的实现
1.界面设计
1.界面设计
程序运行后会出现一个简捷的窗口,便于用户查询数据。
2.功能模块实现设计
通过主窗体调用其他窗体。
应用系统主控界面包括学生信息录入,查找等功能模块。
学生信息录入功能完成学生信息和成绩的输入。
记录查询功能可以对数据各分类的记录进行查询。
具体举例如下:
1)输入函数:
voidInput()
{
cout<<"\n学号:
";cin>>num;
cout<<"\n姓名:
";cin>>Name;
cout<<"\n性别:
";cin>>sex;
cout<<"\n年龄:
";cin>>old;
cout<<"\n班级:
";cin>>G;
cout<<"\n第几节课:
";cin>>Hours;
Salary=Incoming();}2)删除函数
voidschool:
:
del()
{student*p,*p2;
intnum;
cout<<"请输入编号:
";
cin>>num;
if(!
find(&p,num,"^"))
{cout<<"SORRY!
找不到你要删除的内容!
"<return;}
(p->next)->output();
p2=p->next;
p->next=p2->next;
deletep2;
school:
:
setkey
(1);}
2.类的派生之间的示意图
五、系统调试
1.首页进入学生考勤管理系统主菜单
2录入学生信息界面:
3.显示学生信息界面:
4.修改学生信息
六、使用说明及心得体会
此次c++课程设计,在指导教师的精心教导下,我学会了如何用C++编写一个简单的应用程序。
首先要对程序的设计要求有一个比较明确的认识,然后系统分析与系统设计,最后是代码设计与调试。
程序实现上,设计了简单的查询界面,将各个功能集中出来按照程序编写原则,便于查询。
七、附件
源文件代码:
#include文件操作头文件
#include字符串流
classPerson//人员类(抽象类){
protected:
doublenum;//学号
charName[20];//姓名
charsex;//性别
doubleold;//年龄
longdoubleG;//班级
intDuty;//缺课类型(1-迟到,2-早退,3-请假,4-旷课)
doubleSalary;//缺课次数
Person*next;//指针域
public:
Person()//基类构造
{next=0;//指针域设置为空}
virtual~Person()//基类虚析构
{}
virtualvoidInput()=0;//从键盘输入数据
virtualvoidInput(ifstream&ifs)=0;//从文件输入数据
virtualvoidOutput()=0;//向屏幕输出数据
virtualvoidOutput(ofstream&ofs)=0;//向文件输出数据
virtualdoubleIncoming()=0;//计算次数
friendclassCollege;};
classTeacher:
virtualpublicPerson//迟到类
{protected:
intHours;//第几节课
charB;//迟到日期
charZ;//课程名称
public:
{Duty=1;
Salary=800;}
voidInput()//键盘补充输入其它数据
{cout<<"\n学号:
";cin>>num;
cout<<"\n姓名:
";cin>>Name;
cout<<"\n性别:
";cin>>sex;
cout<<"\n年龄:
";cin>>old;
cout<<"\n班级:
";cin>>G;
cout<<"\n第几节课:
";cin>>Hours;
Salary=Incoming();}
voidInput(ifstream&ifs)
{ifs>>num>>Name>>sex>>old>>G>>Duty>>Hours>>Salary;}
voidOutput()
{cout<voidOutput(ofstream&ofs)
{ofs<doubleIncoming()
{if(Hours>120)
returnSalary+(Hours-120)*20;
else
returnSalary;}};
classAssistant:
virtualpublicPerson//早退
{protected:
intAllowance;
intHours;//第几节课
charB;//早退日期
charZ;//课程名称
public:
Assistant(){
Duty=2;
Salary=650;
Allowance=150;}
voidInput()
{cout<<"\n学号:
";cin>>num;
cout<<"\n姓名:
";cin>>Name;
cout<<"\n性别:
";cin>>sex;
cout<<"\n年龄:
";cin>>old;
cout<<"\n班级:
";cin>>G;
cout<<"\n第几节课:
";cin>>Hours;
Salary=Incoming();}
voidInput(ifstream&ifs)
{ifs>>num>>Name>>sex>>old>>G>>Duty>>Hours>>Salary;}
voidOutput()
{cout<voidOutput(ofstream&ofs)
{ofs<doubleIncoming()
{if(Salary>70)
returnSalary+Allowance+(Hours-70)*20;
else
returnSalary+Allowance;}};
classManager:
virtualpublicPerson//请假
{protected:
intAllowance;
intHours;//第几节课
charB;//请假日期
charZ;//课程名称
public:
Manager(){
Duty=3;
Salary=750;
Allowance=250;}
voidInput()
{cout<<"\n学号:
";cin>>num;
cout<<"\n姓名:
";cin>>Name;
cout<<"\n性别:
";cin>>sex;
cout<<"\n年龄:
";cin>>old;
cout<<"\n班级:
";cin>>G;
cout<<"\n第几节课:
";cin>>Hours;
Salary=Incoming();}
voidInput(ifstream&ifs)
{ifs>>num>>Name>>sex>>old>>G>>Duty>>Hours>>Salary;}
voidOutput()
{cout<classCollege
{
private:
Person*PL;
voidClear();
intCollege:
:
Cfind(intID,Person**p1,Person**p2);
public:
College();//构造
~College();//析构
voidAdd();//退出
voidDelete();//删除
voidModify();//修改
voidPrint();//输出
voidSave();//信息存盘
voidLoad();//信息装入
voidFind();//查找
voidBuild();//导引
voidStat();//统计
};
College:
:
College()//构造函数(创建1个头结点的链表)
{
Person*p=newTeacher;
PL=p;cout<<"自动装入数据……………………\n";
Build();
}College:
:
~College()//析构函数(仅保留1个头结点)
{
Person*p=PL;
while(p)//逐个删除结点,包括头结点
{
PL=p->next;
deletep;
p=PL;
}
PL=0;
}
voidCollege:
:
Add()//增加
{
charc;do
{cout<<"\n**增加**\n";
//查找尾结点
Person*p=PL;Teacher*pt;Assistant*pa;Manager*pm;
Teacher_Assistant*pta;
switch(ch){
case1:
pt=newTeacher;pt->Input();
p->next=pt;
break;
case2:
pa=newAssistant;pa->Input();
p->next=pa;
break;
case3:
pm=newManager;pm->Input();
p->next=pm;
break;
case4:
pta=newTeacher_Assistant;pta->Input();
p->next=pta;
break;
default:
return;
}
cout<<"是否进行循环?
y/n\n";
cin>>c;
}while(c=='y'||c=='Y');
Save();
}/查找
voidCollege:
:
Find()
{
doubleID;
Person*p1;
Person*p2;
cout<<"输入你要查询的编号:
";
cin>>ID;
p1=PL->next;
p2=PL;
while(p1)
{
if(p1->num==ID)
break;//找到
else
{
p2=p1;//继续查找
p1=p1->next;
}
}
if(!
p1){cout<<"找不到你所查询的人!
!
!
\n请确认你所查询的编号是否出错!
!
!
\n";return;}
else
{cout<<"\n**出勤信息表**\n";
cout<<"学号姓名性别年龄班级缺课类型缺课次数\n";
p1->Output();}
}
//查找缺课结点(返回1-找到,0-未找到.结点指针由p1返回,p2为前看指针)
intCollege:
:
Cfind(intID,Person**p1,Person**p2)
{
*p1=PL->next;
*p2=PL;
while(*p1)
{
if((*p1)->num==ID)
break;//找到
else
{
*p2=*p1;//继续查找
*p1=(*p1)->next;
}
return*p1?
1:
0;
}
voidCollege:
:
Delete()//删除
{
cout<<"\n**删除**\n";
intnum;Person*p1,*p2;
cout<<"编号:
";cin>>num;
if(!
Cfind(num,&p1,&p2))
{
cout<<"指定的人员没有找到!
\n";
}
else
{
p2->next=p1->next;//连接
deletep1;
cout<<"正确删除!
\n";
}
Save();
}
voidCollege:
:
Modify()//修改
{
cout<<"\n**修改**\n";
intnum;
Person*p1,*p2;
cout<<"编号:
";cin>>num;
if(!
Cfind(num,&p1,&p2))
{
cout<<"指定的人员没有找到!
\n";
}
else
{
p1->Output();//输出原来的出勤信息(做提示)
p1->Input();//输入新的出勤信息(更新)
cout<<"修改完成!
\n";
}
Save();}
voidCollege:
:
Print()//输出出勤信息
{
cout<<"\n**出勤信息表**\n";
cout<<"学号姓名性别年龄班级缺课类型缺课次数\n";
Person*p=PL->next;
if(!
p)
{
cout<<"无出勤记录!
\n";
return;
}
while(p)//遍历链表,输出出勤信息
{
p->Output();
p=p->next;
}
}
voidCollege:
:
Save()//出勤信息存盘?
{
ofstreamf("Person.dat",ios:
:
out);//打开文件
Person*p=PL->next;
while(p)
{
p->Output(f);
p=p->next;
}
f.close();//关闭文件
cout<<"职工信息已经保存在Person.dat.\n";
}
voidCollege:
:
Build()//出勤信息
{
charbuf[81];//临时空间
intDuty;//人员类型
Person*p2;//新建结点的指针
longt;//读写位置
Clear();
ifstreamf("Person.dat",ios:
:
in);
Person*p=PL;//尾结点指针
while
(1)
{
t=f.tellg();
f>>buf>>buf>>Duty;
if(f)
{switch(Duty){
case1:
p2=newTeacher;break;
case2:
p2=newAssistant;break;
case3:
p2=newManager;break;
case4:
p2=newTeacher_Assistant;b