1、 一、设计内容和设计要求 1.设计内容:学生考勤管理系统 1、问题描述 学生信息包含:学号、姓名、性别、年纪、班级等信息。 考勤信息包含:缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟到、早退、请假和旷课)。 2、功效要求 (1)添加功效:程序能够添加学生统计和缺课统计,提供选择界面供用户选择所要添加类别。添加学生统计时,要求学号要唯一,假如添加了反复学号统计时,则提醒数据添加反复并取消添加。 (2)查询功效:可依据学号、姓名等信息对已添加学生统计进行查询,假如未找到,给出对应提醒信息,假如找到,则显示对应统计信息。还能够按课程名、学生姓名对缺课统计进行查询。
2、3)显示功效:可显示目前系统中全部学生统计和缺课统计,每条统计占据一行。 (4)编辑功效:可依据查询结果对对应统计进行修改,修改时注意学号唯一性。 (5)删除功效:关键实现对已添加学生统计进行删除。假如目前系统中没有对应统计,则提醒“统计为空!”并返回操作。 (6)统计功效:能依据多个参数进行统计。能按课程名统计出学生旷课信息、还能够按姓名统计出任一学生旷课情况。需要排序。 (7)保留功效:可将目前系统中各类统计存入文件中,存入方法任意。 (8)读取功效:可将保留在文件中信息读入到目前系统中,供用户进行使用。 目 录 一、需求分析 6 1.系统设计目标和
3、意义 6 2.系统功效需求(系统步骤图) 6 3.系统功效步骤图 7 4.输入输出要求 7 二、总体分析 7 1. 系统功效分析 8 2.系统功效结构图 8 三、具体设计 9 1.类设计: 11 四、界面设计和各功效模块实现 12 1. 界面设计 12 五、系统调试 14 1.首页进入学籍管理系统主菜单 14 2录入学生信息缺课界面: 15 3.显示学生信息缺课界面 16 4.查找学生信息界面 17 5.删除学生信息界面 18 6.修改学生信息 18 7.统计学生信息: 19 六、 使用说明及心得体会 20 七、附件 20
4、一、 需求分析 1.系统功效步骤图 退出 主程序 初始化程序 菜单程序 查找 删除 修改 统计 录入 显示 保留 3.输入输出要求 1.输入要求: 经过主函数体调用其它函数应用系统主控界面包含学生信息录入,查找等功效模块。学生信息录入功效完成学生信息和缺课信息输入。统计查询功效能够对数据各分类统计进行查询。 2.输出要求: 1)能够按编号、姓名对学生信息进行检索并将检索结果显示在屏幕上。 2)能够统计全部学生缺课类型,及其缺课次数。 3)假如检索不到对应信息应提醒用户。 二、 总体分析 系统功效分析 能够从屏幕上读取一个学生信息和缺课信息
5、并将信息存入到数据文件中。能够将指定信息从文件中删除。能够按编号、姓名对学生信息进行检索并将检索结果显示在屏幕上。能够统计全部学生缺课次数,及其缺课类型。要求有错误提醒功效。假如检索不到对应信息应提醒用户。 三、具体设计 1.类设计: 类:Person 数据组员 学号,姓名,性别,年纪,班级缺课类型,缺课次数,指针域 double num; //学号 char Name[20]; //姓名 char sex;//性别 double old;//年纪 long double G;//班级 int Duty; //缺课类型(1-迟到,2-早退,3-请假,4-
6、旷课) double Salary; //缺课次数 Person *next; //指针域 、 组员函数 Person() //基类结构 { next=0; //指针域设置为空 } virtual ~Person() //基类虚析构 { } virtual void Input()=0; //从键盘输入数据 virtual void Input(ifstream& ifs)=0; //从文件输入数据 virtual void Output()=0; //向屏幕输出数据 virtual void Output(ofstr
7、eam& ofs)=0; //向文件输出数据 virtual double Incoming()=0; //计算次数 friend class College; 类:Teacher(公共继承和Person类) 数据组员: protected: int Hours; //第几节课 char B;//迟到日期 char Z;//课程名称class school 组员函数:Tercher(){} void Input() void Input(ifstream& ifs) void Output(ofstream& ofs) double Inc
8、oming() 迟到类: class Assistant:virtual public Person 数据组员: protected: int Allowance; int Hours; //第几节课 char B;//早退日期 char Z;//课程名称 组员函数: Assistant() void Input() void Input(ifstream& ifs) void Output() void Output(ofstream& ofs) double Incoming() 请假类: class Manager:virtual pub
9、lic Person 数据组员: protected: int Allowance; int Hours; //第几节课 char B;//请假日期 char Z;//课程名称 组员函数: Manager() void Input() void Input(ifstream& ifs) void Output() void Output(ofstream& ofs) double Incoming() 旷课类: class Teacher_Assistant:public Teacher,public Assistant 组员函数: Teacher_A
10、ssistant() void Input() void Input(ifstream& ifs) void Output() void Output(ofstream& ofs) double Incoming() 学生类: class College 数据组员 private: Person *PL; void Clear(); int College::Cfind(int ID,Person **p1,Person **p2) 组员函数: public: College(); //结构 ~College(); //析构 void
11、Add(); //退出 void Delete(); //删除 void Modify(); //修改 void Print(); //输出 void Save(); //信息存盘 void Load(); //信息装入 void Find(); //查找 void Build(); //导引 void Stat(); //统计 四、 界面设计和各功效模块实现 1. 界面设计 1.界面设计 程序运行后会出现一个简捷窗口,便于用户查询数据。 2.功效模块实现设计 经过主窗体调用其它窗体。应用系统主控界面包含学生信息录入,查找等功效模块。学生信息
12、录入功效完成学生信息和成绩输入。统计查询功效能够对数据各分类统计进行查询。 具体举例以下: 1) 输入函数: void Input() { 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)删除函数 void school::del() {st
13、udent *p,*p2;
int num;
cout<<"请输入编号: ";
cin>>num;
if( !find(&p,num,"^") )
{cout<<"SORRY!找不到你要删除内容!"<
14、 系统调试
1.首页进入学生考勤管理系统主菜单
2录入学生信息界面:
3.显示学生信息界面:
4.修改学生信息
六、 使用说明及心得体会
此次c++课程设计,在指导老师精心教导下,我学会了怎样用C++编写一个简单应用程序。首先要对程序设计要求有一个比较明确认识,然后系统分析和系统设计,最终是代码设计和调试。程序实现上,设计了简单查询界面,将各个功效集中出来根据程序编写标准,便于查询。
七、附件
源文件代码:
#include
15、员类(抽象类) { protected: double num; //学号 char Name[20]; //姓名 char sex;//性别 double old;//年纪 long double G;//班级 int Duty; //缺课类型(1-迟到,2-早退,3-请假,4-旷课) double Salary; //缺课次数 Person *next; //指针域 public: Person() //基类结构 { next=0; //指针域设置为空 } virtual ~Person() //基类虚析构 {
16、 } virtual void Input()=0; //从键盘输入数据 virtual void Input(ifstream& ifs)=0; //从文件输入数据 virtual void Output()=0; //向屏幕输出数据 virtual void Output(ofstream& ofs)=0; //向文件输出数据 virtual double Incoming()=0; //计算次数 friend class College; }; class Teacher:virtual public Person //迟到类 { prote
17、cted: int Hours; //第几节课 char B;//迟到日期 char Z;//课程名称 public: { Duty=1; Salary=800; } void Input() //键盘补充输入其它数据 { cout<<"\n学号:"; cin>>num; cout<<"\n姓名:"; cin>>Name; cout<<"\n性别:"; cin>>sex; cout<<"\n年纪:"; cin>>old; cout<<"\n班级:"; cin>>G; cout<<"\n第几节课:"; cin>>Hours;
18、
Salary=Incoming(); }
void Input(ifstream& ifs)
{ ifs>>num>>Name>>sex>>old>>G>>Duty>>Hours>>Salary; }
void Output()
{ cout< 19、t"< 20、日期
char Z;//课程名称
public:
Assistant() {
Duty=2;
Salary=650;
Allowance=150; }
void Input()
{ 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( 21、); }
void Input(ifstream& ifs)
{ ifs>>num>>Name>>sex>>old>>G>>Duty>>Hours>>Salary; }
void Output()
{ cout< 22、<<"\t"< 23、ar Z;//课程名称
public:
Manager() {
Duty=3;
Salary=750;
Allowance=250; }
void Input()
{ 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(); }
voi 24、d Input(ifstream& ifs)
{ ifs>>num>>Name>>sex>>old>>G>>Duty>>Hours>>Salary; }
void Output()
{ cout< 25、 ID,Person **p1,Person **p2);
public:
College(); //结构
~College(); //析构
void Add(); //退出
void Delete(); //删除
void Modify(); //修改
void Print(); //输出
void Save(); //信息存盘
void Load(); //信息装入
void Find(); //查找
void Build(); //导引
void Stat(); //统计
};
College::College() 26、 //结构函数(创建1个头结点链表)
{
Person *p=new Teacher;
PL=p; cout<<"自动装入数据……………………\n";
Build();
} College::~College() //析构函数(仅保留1个头结点)
{
Person *p=PL;
while(p) //逐一删除结点,包含头结点
{
PL=p->next;
delete p;
p=PL;
}
PL=0;
}
void College::Add() //增加
{
char c; do
{ cout< 27、<"\n** 增加 **\n";
//查找尾结点
Person *p=PL; Teacher *pt; Assistant *pa; Manager *pm;
Teacher_Assistant *pta;
switch(ch) {
case 1: pt=new Teacher; pt->Input();
p->next=pt;
break;
case 2: pa=new Assistant; pa->Input();
p->next=pa;
break;
case 3: pm=new Manager; pm->Input( 28、);
p->next=pm;
break;
case 4: pta=new Teacher_Assistant; pta->Input();
p->next=pta;
break;
default: return;
}
cout<<"是否进行循环?y/n\n";
cin>>c;
}while(c=='y'||c=='Y');
Save();
}/查找
void College::Find()
{
double ID;
Person *p1;
Person *p2;
cout<<"输入你要查询编 29、号:";
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->Ou 30、tput();}
}
//查找缺课结点(返回1-找到,0-未找到.结点指针由p1返回,p2为前看指针)
int College::Cfind(int ID,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;
}
void College::Dele 31、te() //删除
{
cout<<"\n** 删除 **\n";
int num; Person *p1,*p2;
cout<<"编号:"; cin>>num;
if(!Cfind(num,&p1,&p2))
{
cout<<"指定人员没有找到!\n";
}
else
{
p2->next=p1->next; //连接
delete p1;
cout<<"正确删除!\n";
}
Save();
}
void College::Modify() //修改
{
cout<<"\n** 修改 32、 **\n";
int num;
Person *p1,*p2;
cout<<"编号:"; cin>>num;
if(!Cfind(num,&p1,&p2))
{
cout<<"指定人员没有找到!\n";
}
else
{
p1->Output(); //输出原来出勤信息(做提醒)
p1->Input(); //输入新出勤信息(更新)
cout<<"修改完成!\n";
}
Save(); }
void College::Print() //输出出勤信息
{
cout<<"\n** 出勤信息表 33、 **\n";
cout<<"学号 姓名 性别 年纪 班级 缺课类型 缺课次数\n";
Person *p=PL->next;
if(!p)
{
cout<<"无出勤统计!\n";
return;
}
while(p) //遍历链表,输出出勤信息
{
p->Output();
p=p->next;
}
}
void College::Save() //出勤信息存盘?
{
ofstream f("Person.dat",ios::out); //打开文件
Person *p=PL->next; 34、
while(p)
{
p->Output(f);
p=p->next;
}
f.close(); //关闭文件
cout<<"职员信息已经保留在Person.dat.\n";
}
void College::Build() //出勤信息
{
char buf[81]; //临时空间
int Duty; //人员类型
Person *p2; //新建结点指针
long t; //读写位置
Clear();
ifstream f("Person.dat",ios::in);
Person *p= 35、PL; //尾结点指针
while(1)
{
t=f.tellg();
f>>buf>>buf>>Duty;
if(f)
{ switch(Duty) {
case 1: p2=new Teacher; break;
case 2: p2=new Assistant; break;
case 3: p2=new Manager; break;
case 4: p2=new Teacher_Assistant; break;
default: f.close(); return;
}
p->next=p2;
p= 36、p->next;
f.seekg(t);
p->Input(f);
}
else
break;
f.close();
}
void College::Load() //出勤信息录入
{
char ah;
int c;
cout<<"\n** 出勤信息录入 **\n";
do
{
cout<<"输入要录入出勤人员个数:\n";
cin>>c;
for(int i=1;i<=c;i++)
{
Person *p=PL;
while(p->next)p=p->next;
i 37、nt ch;
cout<<"输入出勤分类码[1-迟到,2-早退,3-请假,4-旷课]:"; cin>>ch;
Teacher *pt;
Assistant *pa;
Manager *pm;
Teacher_Assistant *pta;
switch(ch)
{
case 1: pt=new Teacher; pt->Input();
p->next=pt;
break;
case 2: pa=new Assistant; pa->Input();
p->next=pa;
break;
case 3: p 38、m=new Manager; pm->Input();
p->next=pm;
break;
case 4: pta=new Teacher_Assistant; pta->Input();
p->next=pta;
break;
default: return;
}
}
Save();
cout<<"是否还要继续录入出勤信息?? y/n\n";
cin>>ah;
}while(ah=='Y'||ah=='y');
}
void College::Stat()
{
Person *p1;
Per 39、son *p2;
double Sa=0;
int a,b,i=0;
double c,d;
cout<<"选择你要统计类别\n[1-类别;2-次数;3-缺课总次数;]\n";
cin>>a;
if(a==1)
{
cout<<"输入你要统计类别:\n[1-迟到,2-早退,3-请假,4-旷课]\n";
cin>>b;
p1=PL->next;
p2=PL;
while(p1)
{
if(p1->Duty==b)
{
i++;
//找到
p2=p1; //继续查找
p1=p1->n 40、ext;
}
else
{
p2=p1; //继续查找
p1=p1->next;
}
}cout<>c;
cout<<"\n输入出勤上限:";cin>>d;
p1=PL->next;
p2=PL;
while(p1)
{
if(p1->Salary>=c&&p1->Salary<=d)
{
p1->Output();//找到
p2=p1; //继续查找
41、 p1=p1->next;
}
else
{
p2=p1; //继续查找
p1=p1->next;
}
else if(a==3)
{
Person *p=PL->next;
while(p) //遍历链表
{
Sa=Sa+(p->Salary);
p=p->next;
}
cout<<"缺课总数是:"< 42、
}
cout<<"缺课次数是:"<>ch;
switch(ch)
{
case '1': c.Load(); break;
case '2': c.Find(); break;
case '3': c.Modify(); break;
case '4': c.Delete(); break;
case '5': c.Stat(); break;
case '6': c.Print(); break;
case '7': c.Add; break;
}
}while(ch!='7');
}






