学生考勤管理系统课程设计报告
目录
1设计内容及要求.........................................3
1.1设计内容.....................................................3
1.2设计任务及具体要求...........................................3
2概要设计.........................................................4
2.1该系统的功能简介.............................................4【更多免费素材,微信lbgzkf1】
2.2 总体程序框图.................................................4
2.3各个模块之间的主要关系........................................5
3 设计过程或程序代码............................................5
3.1各个模块的程序流程图及运行界面................................5【更多免费素材,微信 lbgzkf1】
3.2对关键代码加以分析说明.......................................10
4程序调试分析.....................................................14
5小结.............................................................17
致谢...........................................................17
参考文献...........................................................17
附:源程序..........................................................18
1 设计内容及要求
1.1设计内容
学生考勤信息记录了学生的缺课情况,它包括:缺课日期、第几节课(连续用begin-end的形式表示)、课程名称(课程名称中不会出现空格)、学生姓名、缺课类型(迟到、早退、请假及旷课)。
1.2设计任务及具体要求
任务:(1)给出软件结构,说明各模块的功能。
(2)设计相关的类,并说明该类的作用。特别要用图形说明类之间的继承关系。
(3)编写代码
具体要求:(1)定义相关的数据,比如:
学生学号
学生姓名
课程名称
上课时间
到课时间
出勤状态 [旷课/病假/事假/迟到/早退]
(2)能够进行以下操作:
A.能够对数据进行增、删、改、查操作。
B.能够按学号顺序列出某一课程的出勤状况
2 概要设计
2.1系统的功能简介
考勤管理系统,有以下功能:
(1).录入学生的缺课记录:从键盘输入数据(提示:为避免重复从键盘输入数据,测试时可将数据存储在文件中,利用输入重定向功能读入),输入格式为:缺课日期 第几节课 课程名称学生姓名 缺课类型 每行一条纪录。 例如:
2013-04-29 2-4 中国近现代文学史 李云龙 迟到 2013-04-28 2-4 大学生社交礼仪
(2).修改某个学生的缺课记录:可以对缺课纪录的任意部分进行修改,然后显示一下修改后的纪录。
(3).查询某个学生的缺课情况:查询结果按照日期升序排序,同一天内按照所缺课程的时间升序排序。
(4).统计某段时间内(以天为单位),旷课学生姓名及旷课节数,查询结果先按旷课节数降序排序,旷课节数相同的学生按姓名升序排序;
(5).统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序,旷课人次相同的课程按课程名称升序排序。
2.2 总体程序框图
【更多免费素材 ,微信lbgzkf1】
修改某学生的缺课信息 查询某学生的缺课信息 统计某段时间内旷课学生姓名及旷课节数 【更多免费素材,微信lbgzkf1 】 统计某段时间内,有学生旷课的课程及旷课人次 录入学生的缺课信息 学生考勤管理系统 录入缺课学生的姓名、缺课日期、缺课节次、缺课课程名称、缺课类型 修改某学生的缺课日期、缺课节次、缺课课程名称、缺课类型 查询某学生的缺课日期、缺课节次、缺课课程名称、缺课类型 按时间升序显示旷课学生姓名及旷课节数 按时间升序显示有学生旷课的课程及旷课人次 修改某学生的缺课信息 查询某学生的缺课信息 统计某段时间内旷课学生姓名及旷课节数 【更多免费素材,微信lbgzkf1 】 统计某段时间内,有学生旷课的课程及旷课人次 录入学生的缺课信息 学生考勤管理系统 录入缺课学生的姓名、缺课日期、缺课节次、缺课课程名称、缺课类型 修改某学生的缺课日期、缺课节次、缺课课程名称、缺课类型 查询某学生的缺课日期、缺课节次、缺课课程名称、缺课类型 按时间升序显示旷课学生姓名及旷课节数 按时间升序显示有学生旷课的课程及旷课人次
2.3各个模块之间的主要关系
本程序用结构体新定义一种数据类型,系统包含一个主函数和6个子函数(insert(),check(),rivise(),Delete(),output(),deleteallchain()),6个子函数分别用来插入、查询、修改、删除、输出、收回动态分配的空间,在主函数中通过调用子函数来实现所需功能。
3设计过程或程序代码
3.1各个模块的程序流程图及运行界面
学生考勤管理系统中四个类的类层次图为:
Time类 Time类
Xinxi类 Xinxi类
qstu类 qstu类 qkechen类 qkechen类
图2 学生考勤管理系统中中四个类的类层次图
学生考勤管理系统中各功能模块的实现:
菜单 菜单
统计某段时间内,有学生旷课的课程及旷课人次 统计某段时间内,有学生旷课的课程及旷课人次 统计某段时间内旷课学生姓名及旷课节数 统计某段时间内旷课学生姓名及旷课节数 查询某学生的缺课信息 查询某学生的缺课信息 录入学生的缺课信息 录入学生的缺课信息 修改某学生的缺课信息 修改某学生的缺课信息
图3 学生考勤管理系统中菜单函数的功能图
学生缺课信息录用功能模块:
【 更多免费素材,微信lbgzkf1】
学生缺课信息录用功能 录入学生缺课节次 录入学生缺课日期 录入学生缺课课程名称 录入缺课学生姓名 录入学生缺课类型 学生缺课信息录用功能 录入学生缺课节次 录入学生缺课日期 录入学生缺课课程名称 录入缺课学生姓名 录入学生缺课类型
修改某学生缺课信息功能的模块图
修改某学生缺课信息功能 修改某学生缺课信息功能
修改某学生的缺课节次 修改某学生的缺课节次
修改某学生的缺课日期 修改某学生的缺课日期
修改某学生的缺课课程 修改某学生的缺课类型 修改某学生的缺课课程 修改某学生的缺课类型
图5 学生考勤管理系统修改学生缺课信息功能图
3 查询某学生缺课信息功能图:【更多免费素材,微信lbgzkf1】
查询某学生缺课信息功能 查询某学生缺课信息功能
输入要查询的学生姓名 输入要查询的学生姓名
显示要查询的学生缺课信息 显示要查询的学生缺课信息
继续查询或返回菜单 继续查询或返回菜单
图6 学生考勤管理系统查询学生缺课信息功能图
统计某段时间内旷课学生姓名及旷课节数功能模块:
统计某段时间内旷课学生姓名及旷课节数功能 统计某段时间内旷课学生姓名及旷课节数功能
统计某段时间内旷课学生姓名及旷课节数 显示某段时间内旷课学生姓名及旷课节数 返回菜单 统计某段时间内旷课学生姓名及旷课节数 显示某段时间内旷课学生姓名及旷课节数 返回菜单
图7统计某段时间内旷课学生姓名及旷课节数功能图
5、统计某段时间内,有学生旷课的课程及旷课人次功能模块
统计某段时间内,有学生旷课的课程及旷课人次 统计某段时间内,有学生旷课的课程及旷课人次 统计某段时间内,有学生旷课的课程及旷课人次功能 统计某段时间内,有学生旷课的课程及旷课人次功能
显示某段时间内,有学生旷课的课程及旷课人次 显示某段时间内,有学生旷课的课程及旷课人次
返回菜单 返回菜单
图8 统计某段时间内,有学生旷课的课程及旷课人次功能图
Tine -year:int -month:int -day:int +time() +~time() Xinxi -name[20]:char -kechen[10]:char -jieci[3]:char - queke[10]:char -tm[3]:char -tiaoshu:int=0 +xinxi() +~xinxi() +setname(n:char*):void +settime(y:int, m:int,d:int):void +setqklx(qk: char*): void +setjieci(jc: char*):void +setkechen(kc: char*):void +getname():char* +getqklx():char* +getjieci():char* +getkechen():char* +gettime():int* qkechen -renci:int -kcshu:int=0 +qkechen() +~qkechen() +getrc(st1:xinxi,n:int ,j:int):int +qkn[20]:char qstu -jieshu:int -qst:int +qstu() +~qstu() +print(st1:xinxi ):void +getjs( st1:xinxi,n:int, j:int):int +setjs(js:int=0):int +qstn[20]:char 基类 派生类 派生类【更多免费素材,微信lbgzkf1】 派生类 Tine -year:int -month:int -day:int +time() +~time() Xinxi -name[20]:char -kechen[10]:char -jieci[3]:char - queke[10]:char -tm[3]:char -tiaoshu:int=0 +xinxi() +~xinxi() +setname(n:char*):void +settime(y:int, m:int,d:int):void +setqklx(qk: char*): void +setjieci(jc: char*):void +setkechen(kc: char*):void +getname():char* +getqklx():char* +getjieci():char* +getkechen():char* +gettime():int* qkechen -renci:int -kcshu:int=0 +qkechen() +~qkechen() +getrc(st1:xinxi,n:int ,j:int):int +qkn[20]:char qstu -jieshu:int -qst:int +qstu() +~qstu() +print(st1:xinxi ):void +getjs( st1:xinxi,n:int, j:int):int +setjs(js:int=0):int +qstn[20]:char 基类 派生类 派生类【更多免费素材,微信lbgzkf1】 派生类
3.2对关键代码加以分析说明
#include<iostream.h>
#include<string.h>
#include<iomanip.h>
struct chuqin{ //用结构体定义一个新的数据类型出勤chuqin
char name[10],number[20],subject[15],time1[15],time2[15],zhuangtai[10];
chuqin *next;
};
//------------------------------------------------------------------------------------
void insert(chuqin* head1)//创建单向链表并插入数据
{
chuqin *n;//定义一个chuqin类型指针n
while(1)//一个死循环
{
n=new chuqin;//用new运算符动态分配一个chuqin空间给指针n
cout<<"请依次输入姓名、学号、课程、上课时间、到课时间、出勤状态(第一个字母输入N表示结束插入):\n";//输出提示信息
cin>>n->name;//输入姓名
if(n->name[0]=='N') //判断刚才输入的第一个字母是否为N
{
delete n;//若输入的第一个字母为N,则用delete运算符收回刚才动态分配的空间
break;//跳出死循环,结束插入
}
cin>>n->number>>n->subject>>n->time1>>n->time2>>n->zhuangtai;//若条件不满足,则继续输入学号、课程、上课时间到课时间等
if(!head1) head1=n,n->next=NULL;/*假如head指针为空,则直接让head指针指向n指向的存储空间(head=n),将n->next赋值为空,即不指向任何存储空间*/
else n->next=head1,head1=n;//若head指针非空,则将n指向的存储空间插在最前面
}
}
//------------------------------------------------------------------------------------
void check(chuqin *head)//子函数实现查询功能
{
char number1[10];//定义一个字符串数组name1临时存放要查询的姓名【更多免费素材,微信lbgzkf1】
int flag=1;
cout<<"请输入要查询的学号:";//输出提示信息
cin>>number1;//输入要查询的学号
while(head)//用while循环检索查询是否有匹配的姓名
{
if(strcmp(number1,head->number)==0) //用函数strcmp()判断是否有匹配姓名
{
if(flag)
{ cout<<"找到!\n"<<setw(12)<<"姓名"<<setw(12)<<"学号"<<setw(12)<<"课程";
cout<<setw(12)<<"上课时间"<<setw(12)<<"到课时间"<<setw(12)<<"出勤状态\n";
}/*若条件为真,则输出提示信息*/
cout<<setw(12)<<head->name<<setw(12)<<head->number<<setw(12)<<head->subject;
cout<<setw(12)<<head->time1<<setw(12)<<head->time2<<setw(12)<<head->zhuangtai<<endl;
flag=0;
}
head=head->next;//更新head指针,是它指向下一个chuqin类型的存储空间
}
if(flag) cout<<"未找到!";//假如flag值为1,则输出"未找到!"
}
//------------------------------------------------------------------------------------
void rivise(chuqin *head)//定义子函数实现修改功能
{ char name1[10];//定义一个字符串数组name1临时存放要修改的姓名
cout<<"请输入修改的姓名:";//输出提示信息
cin>>name1;//输入要查询的姓名
while(head)
{
if(strcmp(name1,head->name)==0)
{ cout<<"找到此人!\t"<<"请输入此人新的信息(依次为:课程、上课时间、到课时间、出勤状态)\n";
cin>>head->subject>>head->time1>>head->time2>>head->zhuangtai;//输入新的课程、上课时间、到课时间
break;
}
head=head->next;
}
if(head==NULL) cout<<"未找到此人!无法修改!\n";
}
//------------------------------------------------------------------------------------
void Delete(chuqin* head)//定义子函数实现删除功能
{ char name1[10];【更多免费素材,微信 lbgzkf1】
int flag=1;
chuqin *p1=NULL,*p2,*p3=head;
cout<<"请输入要删除的姓名:";
cin>>name1;
while(head)
{
if(strcmp(name1,head->name)==0)
{
cout<<"找到此人!\t将此人的全部信息删除\n";
if(p1==NULL)
{
p1=head;
head=head->next;
delete p1;
}
else if(p2->next==NULL)
{ p1->next=NULL;
delete p2;
head=p3;
}
else
{ p1->next=p2->next;
delete p2;
head=p3;
}
flag=0;break;
}
p1=head;
head=head->next;
p2=head;
}
if(flag)
{
cout<<"未找到此人!无法删除!\n";
}
}
//------------------------------------------------------------------------------------
void output(chuqin *head)//定义子函数实现输出功能
{
if(head==NULL) cout<<"记录为空!";
else
{ cout<<"所有的记录依次为:\n"<<setw(12)<<"姓名"<<setw(12)<<"学号"<<setw(12)<<"课程";
cout<<setw(12)<<"上课时间"<<setw(12)<<"到课时间"<<setw(12)<<"出勤状态\n";
}
while(head)
{【更多 免费素材,微信lbgzkf1】
cout<<setw(12)<<head->name<<setw(12)<<head->number<<setw(12)<<head->subject;
cout<<setw(12)<<head->time1<<setw(12)<<head->time2<<setw(12)<<head->zhuangtai<<endl;
head=head->next;
}
}
//-----------------------------------------------------------------------------------------------
void deleteallchain(chuqin *head)//定义子函数来收回所有动态分配的存储空间
{
chuqin *p;
while(head)
{p=head;
head=head->next;
delete p;
}
}【更多免费素材,微信lbgzkf1 】
//------------------------------------------------------------------------------------
void main()//主函数
{
int a;//定义一个整型变量
chuqin *head;//定义一个head指针
head=NULL;
while(1)//死循环
{
cout<<"请输入一个数字(1表示插入,2表示查询,3表示修改,";
cout<<"4表示删除,5表示输出,6表示跳出整个程序)\n";//输出提示信息
cin>>a;//输入一个整型值
if(a==6) break;//若该值为6则跳出整个循环
switch(a)//若a值不为6,执行一下程序
{
case 1: insert(head);break;
case 2: check(head);break;
case 3: rivise(head);break;
case 4: Delete(head);break;
case 5: output(head);break;
default: cout<<"输入有误,请重新输入\n";/*若输入的a值不符合要求,则输出提示信息*/
}
}
deleteallchain(head);//调用函数deleteallchain()收回所有动态分配的存储空间
}
4设计结果与分析
系统调试
程序编写完成后,我进行了程序调试。调试过程中,出现了以下问题:
当录入学生缺课信息时,出现了无法退出录入函数的情况,主要原因是输入函数中while循环语句没有设置跳出循环的条件。除此之外,修改某学生缺课信息时,如果没有该学生的缺课信息,系统没有提示要用户没有该学生信息,也没有建议用户重新输入要修改的学生姓名。由此我发现了该系统修改学生缺课信息的不足。
于是,我对修改函数进行了修改与完善。在该函数中,我设置了if语句用来判断系统中是否存有用户要修改的学生缺课信息。如果没有,则提示用户没有该学生的缺课信息,用户可以选择继续输入要修改的学生姓名或者退出修改环节,可以在 循环语句中改变循环进行的条件从而终止循环。
至于在修改后显示该学生的缺课信息,运行时发现系统并没有做到这一点,对源代码检查之后发现是修改函数中显示函数的调用出了点问题,显示函数的实参有误,应该把要修改缺课信息的学生所在的信息类对象作为实参,然后用显示函数的形参引用实参对象,通过对象调用信息类的成员函数,从而实现显示功能。
INCLUDEPICTURE "Z:\\upload\\Documents\\Tencent Files\\935522458\\Image\\O~Y]V_JAWK[_IZZZV70DQWU.jpg" \* MERGEFORMATINET
INCLUDEPICTURE "Z:\\upload\\Documents\\Tencent Files\\935522458\\Image\\A8KEHE4_BBR%RYUE155KAOG.jpg" \* MERGEFORMATINET
5 小 结
这次的课设,我写的程序也没有什么独到之处,函数参数设定不够完美,整个程序中对指针的运用比较少。对于指针的巧妙运用把握得不够。还有就是容易missing;或者是},这都是些应该改掉的毛病。
除此以外,我对于怎样用文件保存数据还没深入了解,但我将数据保存到文件后又因文件打不开而无法访问文件中的数据,对于动态链表,我不是很清晰,也就是说无法做到熟稔运用。在调试过程中我发现在主函数中把字符数组名name赋值给字符指针p即p=name;然后用cout<<p;语句可以输出字符数组里全部的内容,但利用函数返回指针值却不能做到这一点,在我思考一番后终于明白了,这与内存中的地址值有关。
致谢
在这次C语言课程设计中,我不仅参考了大量资料和翻阅了图书馆内的相关书籍,而且我的老师和同学给了我及大的帮助。特别是我的指导老师孙淮宁老师和徐宁。在此,我对他们表示感谢,感谢他们在我面对学习上的困难时给了我帮助和支持。也感谢那些给我帮助的所有同学!
参考文献
刘维富 陈建平 葛建芳 王春明,《C++程序设计》,北京,清华大学出版社,2007
张岳新,《Visual C++程序设计》,苏州,苏州大学出版社,2002
和克智,《C++程序设计》(第二版),西安,西安交通大学出版社,1999
王挺 周会平 贾丽丽 徐锡山,《C++程序设计》,北京,清华大学出版社,2005
附录:源程序清单
#include<iostream>
#include<cstring>
#include<windows.h>
using namespace std;
//时间类
class time
{public:
time(int y=0,int m=0,int d=0)
{year=y;month=m;day=d;}
~time(){}
protected:
int year,month,day;
};
//信息类
class xinxi:public time
{ public:
xinxi(){ tiaoshu++;}
~xinxi(){tiaoshu--;}
void setname(char *n){strcpy(name,n);}
void settime(int y,int m,int d){year=y;month=m;day=d;}
void setqklx(char *qk){strcpy(queke,qk);}
void setjieci(char *jc){strcpy(jieci,jc);}
void setkechen(char *kc){strcpy(kechen,kc);}
char *getname(){char *n;n=name;return n;}
char *getqklx(){char *qk=queke;return qk;}
char *getjieci(){char *jc;jc=jieci;return jc;}
char *getkechen(){char *gk;gk=kechen;return gk;}
int *gettime();
private:
char name[20];//姓名
char jieci[3],kechen[10],queke[10];
int tm[3];
static int tiaoshu;
};
int xinxi::tiaoshu=0;
int *xinxi::gettime()
{ int *t;
t=tm;
tm[0]=year;
tm[1]=month;
tm[2]=day;
return t;
}
//缺课课程类
class qkechen:public xinxi
{public:
qkechen(){kcshu++;}
~qkechen(){kcshu--;}
int getrc(xinxi st1,int n,int j);
char qkn[20];//公有数据成员【更多免费素材,微 信lbgzkf1】
private:
int renci;
static int kcshu;//静态数据成员
};
int qkechen::kcshu=0;
int qkechen::getrc(xinxi st1,int n,int j)
{ renci=0;
renci++;
for(int i=0;i<n;i++)
if(*(st1[i+1].gettime()+1)==*(st1[j].gettime()+1)*(st1[i+1].gettime()+2)==
*(st1[j].gettime()+2))
if(strcmp(qkn,st1[i].getkechen())==0)
renci++;
return renci;
}
//缺课学生类
class qstu:public xinxi
{public:
qstu(){qst++;}
~qstu(){qst--;}
void print(xinxi st1);
int getjs(xinxi st1,int n,int j);
int setjs(int js=0)
{jieshu=js;}
char qstn[20];
private:
int jieshu;
static int qst; //静态数据成员
};
int qstu::qst=0;
//类的实现
void qstu::print(xinxi st1)
{
cout<<"| 缺课日期 |"<<" 第几节课 |"<<" 课程名称 |"<<" 缺课类型|"<<endl;
cout<<"|"<<*st1.gettime()<<"|"<<*(st1.gettime()+1)<<*(st1.gettime()+2)<<"|"<<st1.getjieci()<<"|"
<<st1.getkechen()<<"|"<<st1.getqklx()<<"|"<<endl;
}
int qstu::getjs(xinxi st1,int n,int j)
{ int i=0,js=0;
xinxi min;
if(*(st1[j].getjieci()+2)!='\0')
js=+2;
else
js++;
for(i=0;i<n;i++)
if(*(st1[i+1].gettime()+1)==*(st1[j].gettime()+1)*(st1[i+1].gettime()+2)==*(st1[j].gettime()+2))
if(strcmp(st1[i+1].getname(),qstn)==0)
{
if(*(st1[i].getjieci()+2)!='\0')
js=+2;
else
js++;
}【更多免费素材,微信lbgzkf1】
jieshu=js;
return jieshu;
}
// 函数声明
int shuru(xinxi st1);
void chaxun(xinxi st1,qstu qt);
void xiugai(xinxi st1,int n);
void tongji1(xinxi st1,qstu qt1);
void tongji2(xinxi st1,qkechen qk1);
void caidan();
void xiansi(xinxi st1);
void setqstn(xinxi st1,qstu qt1,int n);
void setqkn(xinxi st1,qkechen qk,int n);
//全局变量
int g,k=1,b=1;
int q=-1;
char name[20],kechen[10],queke[10],jieci[3];
int y,m,d;
//主函数
int main()
{ xinxi tl[15];//定义15条信息类对象
qstu qt[10];
qkechen qk[6];
int ch;
while(1)
{cout<<"***欢迎进入学生考勤管理系统!****"<<endl;
caidan();
cout<<"--------请选择菜单项:"<<endl;
cin>>ch;
switch(ch)
{case 1: g=shuru(tl); break;
case 2: xiugai(tl,g); break;
case 3: chaxun(tl,qt); break;
case 4: tongji1(tl,qt); break;
case 5: tongji2(tl,qk); break;
case 6: exit(0);
}
}
return 0;
}
//菜单函数【更多免费素材,微信lbgzkf1】
void caidan()
{ system("color A");
cout<<"*"<<endl;
cout<<"* 学生考勤管理系统 *"<<endl;
cout<<"*"<<endl; cout<<"1.-------------录入学生的缺课记录---------------------------*"<<endl; cout<<"2.-------------修改学生的缺课记录---------------------------*"<<endl;
cout<<"3.-------------查询学生的缺课情况---------------------------*"<<endl;
cout<<"4.--------统计某段时间内旷课学生姓名及旷课节数--------------*"<<endl;
cout<<"5.--------统计某段时间内旷课的课程及旷课人次----------------*"<<endl;
cout<<"6.----------------退出系统----------------------------------*"<<endl;
}
//输入函数
int shuru(xinxi st1)
{ char a;
cout<<"------输入开始!----"<<endl;
do{ q++;
cout<<"请输入学生姓名"<<endl;
cin>>name;
st1[q].setname(name);
cout<<"请输入课程名称"<<endl;
cin>>kechen;
st1[q].setkechen(kechen);
cout<<"请输入缺课日期"<<endl;
cin>>y>>m>>d;
st1[q].settime(y,m,d);
cout<<"请输入缺课类型"<<endl;
cin>>queke;
st1[q].setqklx(queke);
cout<<"请输入缺课节次"<<endl;
cin>>jieci;
st1[q].setjieci(jieci);
cout<<"是否还要继续输入:(y/n)"<<endl;
cin>>a;
}while(a=='y');
return q+1;
}
//修改函数
void xiugai(xinxi st1,int n)
{
int k=1,j=0,a[10];
int flgh;
int h;
while(k==1)
{ cout<<"请输入你要修改缺课记录的学生姓名"<<endl;
cin>>name;
flgh=0;
for(int i=0;i<n;i++)
if(strcmp(name,st1[i].getname())==0)
do{ a[j]=i;
cout<<"1.修改日期2.修改节次3.修改课程名称4.修改缺课类型"<<endl;
cout<<"请输入要选择的数值(1,2,3,4)"<<endl;
int b;
cin>>b;
if(b==1)
{ cout<<"请输入新日期"<<endl;
cin>>y>>m>>d;
st1[i].settime(y,m,d);
}
else if(b==2)
{cout<<"请输入新节次"<<endl;
cin>>jieci;
st1[i].setjieci(jieci);
}
else if(b==3)
{cout<<"请输入新课程名称"<<endl;
cin>>kechen;
st1[i].setkechen(kechen);
}
else if(b==4)
{ cout<<"请输入新缺课类型"<<endl;
cin>>queke;
st1[i].setqklx(queke);
}
flgh=1;j++;
}while(b<1||b>4);
if(flgh==0)
{cout<<"没有你要找的学生姓名,请重试要退出请按0"<<endl;
cin>>k;
}
else
{cout<<"还要继续吗(1\0)退出请按0"<<endl;
cin>>k;
}
}
for(int i=0;i<j;i++)
{ h=a[i];
xiansi(st1[h]);
}
}
// 查询函数
void chaxun(xinxi st1,qstu qt)
{
char n='y';
int u[10];
while(n=='y')
{ int j=0;
cout<<"输入你要查询的学生姓名:"<<endl;
cin>>name;
int i=0;
for(;i<g;i++)
if(strcmp(name,st1[i].getname())==0)
{ u[j]=i;
j++;
}
if(j==0)
{ cout<<"没有你所要的学生名字!";//没有找到【更多免费素材,微信lbgzkf1】
cout<<"是否退出退出请按n\n";
cin>>n;
}
for(int a=0;a<j;a++)
{ //只有一条信息
if(j<2)
{ i=u[a];【更多免费素材,微信lbgzkf1】
cout<<"| 缺课日期 |"<<" 第几节课 |"<<" 课程名称 |"<<" 缺课类型|"<<endl;
cout<<"| "<<*st1[i].gettime()<<"| "<<*(st1[i].gettime()+1)<<"| "<<*(st1[i].gettime()+2)<<"| "<<st1[i].getjieci()<<"| "
<<st1[i].getkechen()<<"| "<<st1[i].getqklx()<<"| "<<endl;
}
//两条信息以上排序
else
{
i=u[a];
if(*(st1[i].gettime()+1)<*(st1[i+1].gettime()+1))
qt[i].print(st1[i]);
else if(*(st1[i].gettime()+1)==*(st1[i+1].gettime()+1)*(st1[i].gettime()+2)<*(st1[i+1].gettime()+2))
qt[i].print(st1[i]);
else if(*(st1[i].gettime()+1)==*(st1[i+1].gettime()+1)*(st1[i].gettime()+2)==*(st1[i+1].gettime()+2))
if(strcmp(st1[i].getjieci(),st1[i+1].getjieci())==-1)
qt[i].print(st1[i]);
}
cout<<"是否继续查询(y/n)继续请按y退出按n"<<endl;
cin>>n;
}
}
}
//统计某段时间内旷课学生姓名及旷课节数
void tongji1(xinxi st1,qstu qt1)
{ int d1=0,js=0;
xinxi min;
if(g==0)
cout<<"没有你要统计的学生信息请返回菜单录入学生缺课信息"<<endl;
else if(g==1)
{cout<<"姓名:"<<st1[0].getname()<<endl;
if(*(st1[0].getjieci()+2)!='\0')
js=+2;
else
js++;
cout<<"节数:"<<js<<endl;
}【更多免费素材,微信 lbgzkf1】
else
//信息按时间排序
{int i=0;
for(;i<(g-1);i++)
{
if(*(st1[i].gettime()+1)<*(st1[i+1].gettime()+1))
{min=st1[i];st1[i]=st1[i+1];st1[i+1]=st1[i];}
else if(*(st1[i].gettime()+1)==*(st1[i+1].gettime()+1)*(st1[i].gettime()+2)<*(st1[i+1].gettime()+2))
{min=st1[i];st1[i]=st1[i+1];st1[i+1]=st1[i];}
else if(*(st1[i].gettime()+1)==*(st1[i+1].gettime()+1)*(st1[i].gettime()+2)==*(st1[i+1].gettime()+2))
d1++;
}
for(int j=0;j<(g-d1);j++)
{
cout<<*st1[j].gettime()<<*(st1[j].gettime()+1)<<*(st1[j].gettime()+2)<<endl;
for(i=0;i<k;i++)
{ setqstn(st1,qt1,g);
cout<<"姓名:"<<qt1[i].qstn<<endl;
cout<<"节数:"<<qt1[i].getjs(st1,g,i)<<endl;
}
}
}
}
//统计某段时间内旷课的课程及旷课人次
void tongji2(xinxi st1,qkechen qk1)
{ int d1=0,rc=0;
xinxi min;
if(g==0)
cout<<"没有你要统计的学生信息请返回菜单录入学生缺课信息"<<endl;
else if(g==1)
{cout<<"课程名:"<<st1[0].getkechen()<<endl;【更多免费素材 ,微信lbgzkf1】
rc++;
cout<<"人数:"<<rc<<endl;
}
else
{
int i=0;
for(;i<g;i++)
{
if(*(st1[i].gettime()+1)<*(st1[i+1].gettime()+1))
{min=st1[i];st1[i]=st1[i+1];st1[i+1]=st1[i];}
else if(*(st1[i].gettime()+1)==*(st1[i+1].gettime()+1)*(st1[i].gettime()+2)<*(st1[i+1].gettime()+2))
{min=st1[i];st1[i]=st1[i+1];st1[i+1]=st1[i];}
else if(*(st1[i].gettime()+1)==*(st1[i+1].gettime()+1)*(st1[i].gettime()+2)==*(st1[i+1].gettime()+2))
d1++;
}
for(int j=0;j<(g-d1);j++)
{
cout<<*st1[j].gettime()<<*(st1[j].gettime()+1)<<*(st1[j].gettime()+2)<<endl;
for(i=0;i<b;i++)
{ setqkn(st1,qk1,g);
cout<<"课程名:"<<qk1[i].qkn<<endl;
cout<<"人数:"<<qk1[i].getrc(st1,g,i)<<endl;【更多免费素材,微信lbgzkf1】
}
}
}
}
//显示函数
void xiansi(xinxi st1)
{ cout<<"| 缺课日期 |"<<" 第几节课 |"<<" 课程名称 |"<<" 学生姓名|"<<" 缺课类型|"<<endl;
cout<<"|"<<*(st1.gettime())<<"|"<<*(st1.gettime()+1)<<*(st1.gettime()+2)
<<"|"<<st1.getjieci()<<"|"<<st1.getkechen()<<"|"<<st1.getname()<<"|"<<st1.getqklx()<<"|"<<endl;
}
//设置缺课学生名
void setqstn(xinxi st1,qstu qt1,int n)
{
int i=0;
for(;i<n;i++)
{if(i==0)
strcpy(qt1[0].qstn,st1[i].getname());
else if(strcmp(st1[i].getname(),st1[i+1].getname())!=0)
{strcpy(qt1[i].qstn,st1[i].getname());
k++;
}
}
}
//设置有缺课学生的课程名
void setqkn(xinxi st1,qkechen qk,int n)
{
int i=0;
for(;i<n;i++)
{ if(i==0)
strcpy(qk[0].qkn,st1[i].getkechen());
else if(strcmp(st1[i].getkechen(),st1[i+1].getkechen())!=0)
{strcpy(qk[i].qkn,st1[i+1].getkechen());
b++;
}
}
}
(阅读全部图文内容,您需要先登录!)

