c++学生考勤信息管理系统教学总结.docx
《c++学生考勤信息管理系统教学总结.docx》由会员分享,可在线阅读,更多相关《c++学生考勤信息管理系统教学总结.docx(16页珍藏版)》请在冰豆网上搜索。
c++学生考勤信息管理系统教学总结
/*题目:
学生考勤管理系统
考勤信息记录了学生的缺课情况,它包括:
缺课日期、第几节课(连续多节课用begin-end的形式表示)、课程名称(课程名称中不会出现空格)、学生姓名、缺课类型(迟到、早退、请假及旷课)。
试设计一考勤管理系统,使之能提供以下功能:
1.录入学生的缺课记录:
从键盘输入数据(提示:
为避免重复从键盘输入数据,测试时可将数据存储在文件中,利用输入重定向功能读入),输入格式为:
缺课日期第几节课课程名称学生姓名缺课类型
每行一条纪录。
例如:
2008-04-293-4C++程序设计实验张三迟到
2008-04-283-4C++程序设计李四旷课
2.修改某个学生的缺课记录:
可以对缺课纪录的任意部分进行修改。
3.查询某个学生的缺课情况:
查询结果按照日期升序排序,同一天内按照所缺课程的时间升序排序。
4.统计某段时间内(以天为单位),旷课学生姓名及旷课节数,查询结果先按旷课节数降序排序,旷课节数相同的学生按姓名升序排序;
5.统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序,旷课人次相同的课程按课程名称升序排序;
6.系统以菜单方式工作。
通过几天的奋斗终于将这个设计做出来了,如下是该程序的详细过程*/
#include
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
structStudent_info{
intyear,month,day,lesson1,lesson2;
std:
:
stringcourse,name,type;
std:
:
istream&read(std:
:
istream&);
};
istream&Student_info:
:
read(istream&in)
{
in>>year>>month>>day>>lesson1>>lesson2>>course>>name>>type;
returnin;
}
istream&read_record(istream&in,vector&s)//第一个模块--------------输入学生的缺课记录
{
Student_inforecord;
s.clear();//调用s.clear()来清空s的记录
while(record.read(in))
{
s.push_back(record);
}
in.clear();//将记录的错误状态恢复正确,以继续读取记录
returnin;
}
boolis_empty(vector&s)//判断输入学生的记录是否为空,为空则返回真
{
returns.empty();
}
boolcompare(Student_info&x,Student_info&y)//按照时间排序,若日期相等则看课程时间
{
if(x.year==y.year&&x.month==y.month&&x.day==y.day){
returnx.lesson1}
elseif(x.year==y.year&&x.month==y.month&&x.day!
=y.day){
returnx.day}
elseif(x.year==y.year&&x.month!
=y.month){
returnx.month}
else{
returnx.year}
}
booltime(constStudent_info&stud,inty1,intm1,intd1,inty2,intm2,intd2)//筛选符合输入时间段的数据
{
if((y1==stud.year&&stud.month==m1&&stud.dayd2))
return0;
elseif((y1==stud.year&&stud.monthm2))
return0;
elseif(y1>stud.year||y2return0;
else
return1;
}
voidrewrite(vector&s)//第二个模块--------------修改某个学生的缺课情况
{
if(!
is_empty(s))
{
intn,m,j,k;
map>s_name;
map>:
:
iteratorix2;
vector:
:
iteratorix,iter,itera;
stringname;//-------------------定义这些参数和迭代器必须在SWITHC外,不然它可能被忽略跳过
while(true)
{
cout<<"*********************************************************"<cout<<"*1.请输入你要修改缺课记录的学生姓名*"<cout<<"**"<cout<<"*2.返回上一级菜单*"<cout<<"*********************************************************"<cout<<"请选择菜单选项:
";
cin>>n;
if(n==1)
{
s_name.clear();//------------------------------清空MAP容器
for(ix=s.begin();ix!
=s.end();++ix)
{
s_name[(*ix).name].push_back(*ix);
}
s.clear();
cout<<"请输入该学生的姓名:
";
cin>>name;
cout<if(s_name.find(name)!
=s_name.end())
{
ix2=s_name.find(name);//----------找到符合名字要求的数据,并显示出
for(iter=(*ix2).second.begin();iter!
=(*ix2).second.end();++iter)
{
cout<<(*iter).year<<"-"<<(*iter).month<<"-"<<(*iter).day<<"\t";
cout<<(*iter).lesson1<<"-"<<(*iter).lesson2;
cout<<"\t"<<(*iter).course<<"\t"<<(*iter).name<<"\t"<<(*iter).type<}
itera=(*ix2).second.begin();
cout<<"请输入要更改记录的序号:
";
cin>>j;
for(k=0;k!
=j-1;++k)
{
++itera;
}
cout<<"**************************************************************************"<cout<<"*需要更改的项目*"<cout<<"**"<cout<<"*1日期2节次3课程名称4姓名5缺课类型6返回上一级*"<cout<<"**"<cout<<"**************************************************************************"<cout<<"请选择要更改的项目号:
";
cin>>m;
switch(m)
{
case1:
cout<<"请输入更改的日期(年月日):
";
cin>>(*itera).year>>(*itera).month>>(*itera).day;
break;
case2:
cout<<"请输入更改的节次(L1、L2):
";
cin>>(*itera).lesson1>>(*itera).lesson2;
break;
case3:
cout<<"请输入要更改的课程名称:
";
cin>>(*itera).course;
break;
case4:
cout<<"请输入要更改的学生姓名:
";
cin>>(*itera).name;
break;
case5:
cout<<"请输入缺课类型:
";
cin>>(*itera).type;
break;
case6:
break;
default:
cout<<"你的选择错了,请看清楚!
"<break;
}
for(ix2=s_name.begin();ix2!
=s_name.end();ix2++)//将改写后的数据放入vector容器中
{
for(iter=ix2->second.begin();iter!
=ix2->second.end();iter++)
{
s.push_back(*iter);
}
}
}
else
{
cout<<"没有这个学生的缺课记录"<cout<}
break;
}
elseif(n==2)
{
return;
}
else
cout<<"你的选择错了,请看清楚!
"<}
}
else
cout<<"记录为空,没有学生的缺课记录!
"<}
voidSearch_record(vector&s)//第三个模块-------------查找某学生的缺课情况
{
if(!
is_empty(s))
{
inti;
vector:
:
iteratoriter;
map>:
:
iteratorit1;
map>s_name;
map>:
:
iteratoritera;
vector:
:
iteratorit;
stringname;
while(true)
{
cout<<"**********************************************************"<cout<<"**"<cout<<"*1输入你要查询的学生姓名2返回上一级*"<cout<<"**"<cout<<"**********************************************************"<cout<<"请选择菜单:
";
cin>>i;
if(i==1){
s_name.clear();
for(it=s.begin();it!
=s.end();++it)
{
s_name[(*it).name].push_back(*it);
}
for(itera=s_name.begin();itera!
=s_name.end();++itera)
{
sort(itera->second.begin(),itera->second.end(),compare);
}
cout<<"请输入名字:
";
cin>>name;
cout<if(s_name.find(name)!
=s_name.end())
{
it1=s_name.find(name);
for(iter=(*it1).second.begin();iter!
=(*it1).second.end();++iter)
{
cout<<(*iter).year<<"-"<<(*iter).month<<"-"<<(*iter).day<<"\t";
cout<<(*iter).lesson1<<"-"<<(*iter).lesson2;
cout<<"\t"<<(*iter).course<<"\t"<<(*iter).name<<"\t"<<(*iter).type<}
}
else
{
cout<<"没有这个学生."<cout<}
}
elseif(i==2)
{
return;
}
else
cout<<"对不起,没有这个选项!
"<}
}
else
cout<<"没有这个学生的缺课记录"<}
structSearch_struct{
stringname,course;
inttimes;
};//定义另一个结构模块
boolcompare2(Search_struct&x,Search_struct&y)//按照次数排序,次数相等的则按照名字排序
{
if(x.times==y.times)
returnx.nameelse
returnx.times>y.times;
}
voidSearch_s_t(vector&std)//第四个模块----------------查找某段时间内旷课学生姓名及旷课节数
{
if(!
is_empty(std))
{
vector:
:
iteratorit;
vector:
:
iteratoritera;
map:
:
iteratoriter;
vectorvec;
inty1,m1,d1,y2,m2,d2;
mapret;
cout<<"请输入你要查找的一个时间段(y1m1d1y2m2d2):
"<cin>>y1>>m1>>d1>>y2>>m2>>d2;
for(it=std.begin();it!
=std.end();++it)
{
if(time(*it,y1,m1,d1,y2,m2,d2))
{
ret[it->name]+=(it->lesson2-it->lesson1+1);
}
}
for(iter=ret.begin();iter!
=ret.end();iter++)
{
Search_structtmp;
tmp.name=iter->first;
tmp.times=iter->second;
vec.push_back(tmp);
}
sort(vec.begin(),vec.end(),compare2);
for(itera=vec.begin();itera!
=vec.end();itera++)
{
cout<name<<"\t"<times<}
}
else
cout<<"对不起,没有你要查找的记录!
"<}
voidSearch_c_t(vector&std)//第五个模块---------------查找某段时间内旷课的课程及旷课人次
{
if(!
is_empty(std))
{
vector:
:
iteratorit;
vector:
:
iteratoritera;
map:
:
iteratoriter;
vectorvec;
inty1,m1,d1,y2,m2,d2;
mapret;
cout<<"请输入你想要查找的时间段(y1m1d1y2m2d2):
"<cin>>y1>>m1>>d1>>y2>>m2>>d2;
for(it=std.begin();it!
=std.end();++it)//建立map容器
{
if(time(*it,y1,m1,d1,y2,m2,d2))
{
ret[it->course]+=1;
}
}
for(iter=ret.begin();iter!
=ret.end();iter++)
{
Search_structtmp;
tmp.course=iter->first;
tmp.times=iter->second;
vec.push_back(tmp);
}
sort(vec.begin(),vec.end(),compare2);
for(itera=vec.begin();itera!
=vec.end();itera++)
{
cout<course<<"\t"<times<}
}
else
cout<<"这段时间内没有学生的缺课纪录!
"<}
intmain()
{
vectorstu;
intchoice;
while(true)
{
cout<<"*************************************************************"<cout<<"*学生考勤管理系统*"<cout<<"************************************************************"<cout<<"*1.录入学生的缺课记录*"<cout<<"**"<cout<<"*2.修改某个学生的缺课记录*"<cout<<"**"<cout<<"*3.查找某学生的缺课情况*"<cout<<"**"<cout<<"*4.查找某段时间内旷课学生姓名及旷课节数*"<cout<<"**"<cout<<"*5.查找某段时间内旷课的课程及旷课人次*"<cout<<"**"<cout<<"*6.退出系统*"<cout<<"*************************************************************"<cout<<"请选择菜单选项:
";
cin>>choice;
if(choice==1){
cout<<"请输入数据:
"<read_record(cin,stu);
cout<}
elseif(choice==2){
rewrite(stu);
cout<}
elseif(choice==3){
Search_record(stu);
cout<}
elseif(choice==4){
Search_s_t(stu);
cout<}
elseif(choice