资源描述
一、设计内容和设计要求
1.设计内容:学生考勤管理系统
1、问题描述
学生信息包含:学号、姓名、性别、年纪、班级等信息。
考勤信息包含:缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟到、早退、请假和旷课)。
2、功效要求
(1)添加功效:程序能够添加学生统计和缺课统计,提供选择界面供用户选择所要添加类别。添加学生统计时,要求学号要唯一,假如添加了反复学号统计时,则提醒数据添加反复并取消添加。
(2)查询功效:可依据学号、姓名等信息对已添加学生统计进行查询,假如未找到,给出对应提醒信息,假如找到,则显示对应统计信息。还能够按课程名、学生姓名对缺课统计进行查询。
(3)显示功效:可显示目前系统中全部学生统计和缺课统计,每条统计占据一行。
(4)编辑功效:可依据查询结果对对应统计进行修改,修改时注意学号唯一性。
(5)删除功效:关键实现对已添加学生统计进行删除。假如目前系统中没有对应统计,则提醒“统计为空!”并返回操作。
(6)统计功效:能依据多个参数进行统计。能按课程名统计出学生旷课信息、还能够按姓名统计出任一学生旷课情况。需要排序。
(7)保留功效:可将目前系统中各类统计存入文件中,存入方法任意。
(8)读取功效:可将保留在文件中信息读入到目前系统中,供用户进行使用。
目 录
一、需求分析 6
1.系统设计目标和意义 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
一、 需求分析
1.系统功效步骤图
退出
主程序
初始化程序
菜单程序
查找
删除
修改
统计
录入
显示
保留
3.输入输出要求
1.输入要求:
经过主函数体调用其它函数应用系统主控界面包含学生信息录入,查找等功效模块。学生信息录入功效完成学生信息和缺课信息输入。统计查询功效能够对数据各分类统计进行查询。
2.输出要求:
1)能够按编号、姓名对学生信息进行检索并将检索结果显示在屏幕上。
2)能够统计全部学生缺课类型,及其缺课次数。
3)假如检索不到对应信息应提醒用户。
二、 总体分析
系统功效分析
能够从屏幕上读取一个学生信息和缺课信息并将信息存入到数据文件中。能够将指定信息从文件中删除。能够按编号、姓名对学生信息进行检索并将检索结果显示在屏幕上。能够统计全部学生缺课次数,及其缺课类型。要求有错误提醒功效。假如检索不到对应信息应提醒用户。
三、具体设计
1.类设计:
类:Person
数据组员
学号,姓名,性别,年纪,班级缺课类型,缺课次数,指针域
double num; //学号
char Name[20]; //姓名
char sex;//性别
double old;//年纪
long double G;//班级
int Duty; //缺课类型(1-迟到,2-早退,3-请假,4-旷课)
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(ofstream& 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 Incoming()
迟到类:
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 public 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_Assistant()
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 Add(); //退出
void Delete(); //删除
void Modify(); //修改
void Print(); //输出
void Save(); //信息存盘
void Load(); //信息装入
void Find(); //查找
void Build(); //导引
void Stat(); //统计
四、 界面设计和各功效模块实现
1. 界面设计
1.界面设计
程序运行后会出现一个简捷窗口,便于用户查询数据。
2.功效模块实现设计
经过主窗体调用其它窗体。应用系统主控界面包含学生信息录入,查找等功效模块。学生信息录入功效完成学生信息和成绩输入。统计查询功效能够对数据各分类统计进行查询。
具体举例以下:
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()
{student *p,*p2;
int num;
cout<<"请输入编号: ";
cin>>num;
if( !find(&p,num,"^") )
{cout<<"SORRY!找不到你要删除内容!"<<endl;
return;}
(p->next)->output();
p2=p->next;
p->next=p2->next;
delete p2;
school::setkey(1);}
2. 类派生之间示意图
Tercher
Assitant
Mannager
Tercher_Assitant
Person
五、 系统调试
1.首页进入学生考勤管理系统主菜单
2录入学生信息界面:
3.显示学生信息界面:
4.修改学生信息
六、 使用说明及心得体会
此次c++课程设计,在指导老师精心教导下,我学会了怎样用C++编写一个简单应用程序。首先要对程序设计要求有一个比较明确认识,然后系统分析和系统设计,最终是代码设计和调试。程序实现上,设计了简单查询界面,将各个功效集中出来根据程序编写标准,便于查询。
七、附件
源文件代码:
#include <fstream.h> 文件操作头文件
#include <string.h> 字符串流
class Person //人员类(抽象类) {
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() //基类虚析构
{ }
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 //迟到类
{ protected:
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;
Salary=Incoming(); }
void Input(ifstream& ifs)
{ ifs>>num>>Name>>sex>>old>>G>>Duty>>Hours>>Salary; }
void Output()
{ cout<<num<<"\t"<<Name<<"\t"<<sex<<"\t"<<old<<"\t"<<G<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<Salary<<"\t"<<endl; }
void Output(ofstream& ofs)
{ ofs<<num<<"\t"<<Name<<"\t"<<sex<<"\t"<<old<<"\t"<<G<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<Salary<<"\t"<<endl; }
double Incoming()
{ if(Hours>120)
return Salary+(Hours-120)*20;
else
return Salary; } };
class Assistant:virtual public Person //早退
{ protected:
int Allowance;
int Hours; //第几节课
char B;//早退日期
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(); }
void Input(ifstream& ifs)
{ ifs>>num>>Name>>sex>>old>>G>>Duty>>Hours>>Salary; }
void Output()
{ cout<<num<<"\t"<<Name<<"\t"<<sex<<"\t"<<old<<"\t"<<G<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<Salary<<"\t"<<endl; }
void Output(ofstream& ofs)
{ ofs<<num<<"\t"<<Name<<"\t"<<sex<<"\t"<<old<<"\t"<<G<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<Salary<<"\t"<<endl; }
double Incoming()
{if(Salary>70)
return Salary+Allowance+(Hours-70)*20;
else
return Salary+Allowance; } };
class Manager:virtual public Person //请假
{ protected:
int Allowance;
int Hours; //第几节课
char B;//请假日期
char 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(); }
void Input(ifstream& ifs)
{ ifs>>num>>Name>>sex>>old>>G>>Duty>>Hours>>Salary; }
void Output()
{ cout<<num<<"\t"<<Name<<"\t"<<sex<<"\t"<<old<<"\t"<<G<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<Salary<<"\t"<<endl; }
class College
{
private:
Person *PL;
void Clear();
int College::Cfind(int 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() //结构函数(创建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<<"\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();
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<<"输入你要查询编号:";
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为前看指针)
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::Delete() //删除
{
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** 修改 **\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** 出勤信息表 **\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;
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=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=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;
int 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: pm=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;
Person *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->next;
}
else
{
p2=p1; //继续查找
p1=p1->next;
}
}cout<<b<<"类缺课次数是:"<<i<<endl; }
else if(a==2) {
cout<<"输入出勤下限:";cin>>c;
cout<<"\n输入出勤上限:";cin>>d;
p1=PL->next;
p2=PL;
while(p1)
{
if(p1->Salary>=c&&p1->Salary<=d)
{
p1->Output();//找到
p2=p1; //继续查找
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<<"缺课总数是:"<<Sa<<endl;
}
else if(a==4)
{ Person *p=PL->next;
while(p)
{
i=i+1;
p=p->next;
}
cout<<"缺课次数是:"<<i<<endl;
cout<<"统计完成!!!\n";
}
void main()
{
char ch;
College c; //定义大学对象
do
{
cout<<"\n☆☆ 学生考勤管理系统 ☆☆\n";
cout<<"1-添加\n";
cout<<"2-查询\n";
cout<<"3-编辑\n";
cout<<"4-删除\n";
cout<<"5-统计\n";
cout<<"6-读取\n";
cout<<"7-退出\n"<<"请选择:\n";
cin>>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');
}
展开阅读全文