#include "stdafx.h"
#include "stdlib.h"
#include <string>
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
const int max=100;
class record
{
public:
void set(string d,int cno,string c,string s,int type)
{
date.assign(d);
cname.assign(c);
sname.assign(s);
this->cno=cno;
this->type=type;
}
void set(record re)
{
date.assign(re.date);
cname.assign(re.cname);
sname.assign(re.sname);
this->cno=re.cno;
this->type=re.type;
}
string tostr()
{
string s;
char tmp[3];
s.assign(date);
itoa(cno,tmp,10);
s.append("#");
s.append(tmp);
s.append("#");
s.append(cname);
s.append("#");
s.append(sname);
itoa(type,tmp,10);
s.append("#");
s.append(tmp);
return s;
}
string date,cname,sname;
int cno,type;
};
class records
{
public:
records()
{
r=new record[max];
n=0;
}
void order_s()
{
string *s=new string[n];
int *c=new int [n];
s[0].assign(r[0].sname);
c[0]=1;
int k=1,flag;
for(int i=1;i<n;i++)
{
flag=0;
for(int j=0;j<k;j++)
if(r[i].sname==s[j])
{
c[j]++;
flag=1;
break;
}
if(!flag)
{
s[k]=r[i].sname;
c[k++]=1;
}
}
for(i=1;i<k;i++)
for(int j=i;j>0;j--)
{
if(c[j]>c[j-1])
{
int tmp=c[j];
c[j]=c[j-1];
c[j-1]=tmp;
string stmp=s[j];
s[j]=s[j-1];
s[j-1]=stmp;
}
}
cout<<"旷课学生姓名\t旷课次数"<<endl;
for(i=0;i<k;i++)
cout<<s[i]<<"\t\t"<<c[i]<<endl;
}
void order_c()
{
string *s=new string[n];
int *c=new int [n];
s[0].assign(r[0].cname);
c[0]=1;
int k=1,flag;
for(int i=1;i<n;i++)
{
flag=0;
for(int j=0;j<k;j++)
if(r[i].cname==s[j])
{
c[j]++;
flag=1;
break;
}
if(!flag)
{
s[k]=r[i].cname;
c[k++]=1;
}
}
for(i=1;i<k;i++)
for(int j=i;j>0;j--)
{
if(c[j]>c[j-1])
{
int tmp=c[j];
c[j]=c[j-1];
c[j-1]=tmp;
string stmp=s[j];
s[j]=s[j-1];
s[j-1]=stmp;
}
}
cout<<"课程名\t旷课人次"<<endl;
for(i=0;i<k;i++)
cout<<s[i]<<"\t"<<c[i]<<endl;
}
record *r;
int n;
};
void wt(records *r)
{
ofstream outf("data.txt");
for(int i=0;i<r->n;i++)
outf<<r->r[i].tostr()<<endl;
outf<<"!"<<endl;
}
void rd(records *r)
{
ifstream inf("data.txt");
if(inf.eof())
{
cout<<"记录为空!"<<endl;
return;
}
string t1,t3,t4;
char tmp[30];
int t2,t5;
r->n=0;
while(true)
{
inf.getline(tmp,10,'#');
if(tmp[0]=='!')break;
t1.assign(tmp);
inf.getline(tmp,3,'#');
t2=atoi(tmp);
inf.getline(tmp,30,'#');
t3.assign(tmp);
inf.getline(tmp,30,'#');
t4.assign(tmp);
inf.getline(tmp,3);
t5=atoi(tmp);
r->r[r->n++].set(t1,t2,t3,t4,t5);
}
}
bool timechk(string t1)
{
int year=atoi(t1.substr(0,2).c_str());
int month=atoi(t1.substr(2,2).c_str());
int day=atoi(t1.substr(4,2).c_str());
if(!(t1.length()==6&&year>0&&year<99&&month>0&&month<13&&day>0&&day<32))
{
cout<<"日期录入有误! 请重新录入: "<<endl;
return false;
}
else return true;
}
void input(records *r)
{
string t1,t3,t4;
int t2,t5,flag=0;
char yn;
cout<<"录入一条学生缺课记录:"<<endl;
m1:
cout<<"请输入缺课日期: (例如100612) "<<flush;
cin>>t1;
if(!(timechk(t1)))goto m1;
m2:
cout<<"请输入缺第几节课: "<<flush;
cin>>t2;
if(t2<1||t2>10)
{
cout<<"节次录入有误! 请重新录入: "<<endl;
goto m2;
}
cout<<"请输入缺课名称: "<<flush;
cin>>t3;
cout<<"请输入缺课学生姓名: "<<flush;
cin>>t4;
m3:
cout<<"请输入缺课类型: (1.迟到 2.早退 3.请假 4.旷课) "<<flush;
cin>>t5;
if(t5<1||t5>4)
{
cout<<"类型输入有误! 请重新录入: "<<endl;
goto m3;
}
for(int i=0;i<r->n;i++)
if(r->r[i].date==t1&&r->r[i].cno==t2&&r->r[i].cname==t3&&r->r[i].sname==t4&&r->r[i].type==t5)
{
cout<<"该条记录已存在,是否添加为新记录? (y/n) "<<flush;
n1:
cin>>yn;
if(yn=='y')break;
else if(yn=='n')goto n2;
else goto n1;
}
r->r[r->n++].set(t1,t2,t3,t4,t5);
n2:
cout<<"是否继续输入? (y/n) "<<flush;
n3:
cin>>yn;
if(yn=='y')goto m1;
else if(yn=='n')
{
cout<<"保存修改? (y/n) "<<flush;
cin>>yn;
if(yn=='y')wt(r);
else return;
}
else goto n3;
}
void prione(record r)
{
cout<<r.date<<"\t\t"
<<r.cno<<"\t"
<<r.cname<<"\t\t"
<<r.sname<<"\t\t"
<<flush;
switch(r.type)
{
case 1:cout<<"迟到"<<endl;break;
case 2:cout<<"早退"<<endl;break;
case 3:cout<<"请假"<<endl;break;
case 4:cout<<"旷课"<<endl;break;
default:;
}
}
void pri(records *r)
{
if(r->n==0)
{
cout<<"记录为空!"<<endl;
return;
}
cout<<"\n序号\t缺课日期 节次\t课程名称\t学生姓名\t缺课类型"<<endl;
for(int i=0;i<r->n;i++)
{
cout<<i<<"\t"<<flush;
prione(r->r[i]);
}
}
void edt(records *r)
{
if(r->n==0)
{
cout<<"记录为空!"<<endl;
return;
}
cout<<"请输入要修改缺课记录的学生姓名: "<<flush;
string t1,t3,t4;
char tmp[30];
int t2,t5,flag=0;
cin>>tmp;
t1.assign(tmp);
for(int i=0;i<r->n;i++)
if(r->r[i].sname==t1)
{
flag=7;
break;
}
if(!flag)
{
cout<<"查无此学生!"<<endl;
return;
}
t1=r->r[i].date;
t2=r->r[i].cno;
t3=r->r[i].cname;
t4=r->r[i].sname;
t5=r->r[i].type;
cout<<"请输入要修改的项目:\n(1.缺课日期 2.缺课节次 3.缺课名称 4.学生姓名 5.缺课类型 6.全部) "<<flush;
e0:
cin>>flag;
switch(flag)
{
case 1:goto e1;
case 2:goto e2;
case 3:goto e3;
case 4:goto e4;
case 5:goto e5;
case 6:goto e1;
default:goto e0;
}
e1:
cout<<"请输入缺课日期: (例如100612) "<<flush;
cin>>t1;
if(flag!=6)goto e6;
e2:
cout<<"请输入缺第几节课: "<<flush;
cin>>t2;
if(flag!=6)goto e6;
e3:
cout<<"请输入缺课名称: "<<flush;
cin>>t3;
if(flag!=6)goto e6;
e4:
cout<<"请输入缺课学生姓名: "<<flush;
cin>>t4;
if(flag!=6)goto e6;
e5:
cout<<"请输入缺课类型: (1.迟到 2.早退 3.请假 4.旷课) "<<flush;
cin>>t5;
e6:
r->r[i].set(t1,t2,t3,t4,t5);
char yn;
cout<<"保存修改? (y/n) "<<flush;
cin>>yn;
if(yn=='y')wt(r);
else return;
}
void del(records *r)
{
if(r->n==0)
{
cout<<"记录为空!"<<endl;
return;
}
cout<<"请输入要删除的记录的序号: (输入-1删除全部) "<<flush;
int flag;
cin>>flag;
if(flag>r->n-1&&flag<-1)
{
cout<<"不存在所要删除的记录!"<<endl;
return;
}
else if(flag==-1)r->n=0;
else
{
for(int i=flag;i<r->n-1;i++)
r->r[i].set(r->r[i+1]);
r->n--;
}
char yn;
cout<<"保存修改? (y/n) "<<flush;
cin>>yn;
if(yn=='y')wt(r);
else return;
}
void search(records *r)
{
if(r->n==0)
{
cout<<"记录为空!"<<endl;
return;
}
cout<<"请输入要查询的学生姓名: "<<flush;
string str;
int j=0,flag=0;
cin>>str;
for(int i=0;i<r->n;i++)
if(r->r[i].sname==str)
{
if(!flag)cout<<"\n序号\t缺课日期 节次\t课程名称\t学生姓名\t缺课类型"<<endl;
cout<<j++<<"\t"<<flush;
prione(r->r[i]);
flag=1;
}
if(!flag)cout<<"没有查到该学生的缺课记录!"<<endl;
}
void search_s(records *r)
{
if(r->n==0)
{
cout<<"记录为空!"<<endl;
return;
}
records *r1=new records();
g1:
cout<<"请输入要检索的时间范围: (例如100610-100612) "<<flush;
string tmp,ld,hd;
cin>>tmp;
ld.assign(tmp.substr(0,6));
hd.assign(tmp.substr(7,6));
if(!timechk(ld)||!timechk(hd))goto g1;
for(int i=0;i<r->n;i++)
if(r->r[i].date.compare(ld)>=0&&r->r[i].date.compare(hd)<=0&&r->r[i].type==4)
r1->r[r1->n++].set(r->r[i]);
cout<<"请选择统计方式: (1.学生旷课情况降序显示 2.课程旷课情况降序显示)"<<flush;
g2:
cin>>i;
switch(i)
{
case 1:
cout<<"\n在"<<ld<<"到"<<hd<<"期间学生旷课情况如下:"<<endl;
r1->order_s();
break;
case 2:
cout<<"\n在"<<ld<<"到"<<hd<<"期间课程旷课情况如下:"<<endl;
r1->order_c();
break;
default:goto g2;
}
}
void main()
{
c1:
cout<<"*** 欢迎进入学生考勤管理系统 ***"<<endl
<<endl
<<"*** 功能列表: ***"<<endl
<<"