一、设计内容与设计要求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类)数据成员: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.类的派生之间的示意图PersonTercher Assitant MannagerTercher_Assitant五、系统调试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;elsereturn 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;elsereturn Salary+Allowance; } };class Manager:virtual public Person //请假{ protected:int Allowance;int Hours; //第几节课char B;//请假日期char Z;//课程名称public:Manager() {Duty=3;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) //逐个删除结点,包括头结点{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){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();{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";{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);}elsebreak;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;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)//找到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;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');}。