📄 managestudent.cpp
字号:
//题目:设计一个学生管理系统,所有信息必须进行完整性校验,然后编写主函数进行测试
#include<iostream>
#include<cstring>
using namespace std;
class Date;
class Student;
istream &operator>>(istream &in,Date &x);
ostream &operator<<(ostream &out,const Date &x);
ostream &operator<<(ostream &out,const Student &m);
/***************************定义日期类,存放学生出生日期**************************************************************/
class Date
{
private:
int Year;int Month;int Day;
public:
Date( ){Year=1;Month=1;Day=1;}//构造函数
void SetDate(int year,int month,int day);//修改、输入日期
inline bool IsLeapYear(int year);//判指定年份是否为闰年
int GetDaynumOfMonth(int year,int month);//返回指定年、月对应的天数
bool IsValidDate();//判断日期是否合法
int GetYear(){return Year;}
int GetMonth(){return Month;}
int GetDay(){return Day;}
friend istream &operator>>(istream &in,Date &x);//重载输入
friend ostream &operator<<(ostream &out,const Date &x);//重载输出
};
//修改、输入日期
void Date::SetDate(int year,int month,int day)
{
Year=year;Month=month;Day=day;
}
//判指定年份是否为闰年
inline bool Date::IsLeapYear(int year)
{
if(year%4==0&&year%100!=0||year%400==0)
return true;
else return false;
}
//返回指定年、月对应的天数
int Date::GetDaynumOfMonth(int year,int month)
{
int daynum[]={0,31,0,31,30,31,30,31,31,30,31,30,31};
if(month==2)
{
if (IsLeapYear(year)) return 29;
else return 28;
}
else return daynum[month];
}
//判断日期是否合法
bool Date::IsValidDate()
{
if(Year<=0) throw Year;
if(Month<=0||Month>12) throw Month;
if(Day<1||Day>GetDaynumOfMonth(Year,Month)) throw Day;
return true;
}
//用友元函数重载输入
istream &operator>>(istream &in,Date &x)
{
in>>x.Year>>x.Month>>x.Day;
return in;
}
//用友元函数重载输出
ostream &operator<<(ostream &out,const Date &x)
{
out<<x.Year<<x.Month<<x.Day;
return out;
}
/*****************************************************************************************************************/
/**************************************学生类**********************************************************************/
class Student
{
private:
char Name[9];//定义学生姓名
char Sex[3];//定义学生性别
char BornPlace[100];//定义学生的出生地
Date BornDate;//定义学生的出生日期
char Race[9];//定义学生所属的民族
char ID[20];//定义学生身份证号码
int StuNum[10];//定义学生学号
char FatherName[9];//定义学生的父姓名
char MatherName[9];//定义学生的母姓名
char BloodType[3];//定义学生的血型
int Mark;//定义学生考试成绩
static int count;//count用来存放总共输入的学生人数
public:
Student();//构造函数
~Student(){count--;}//拷贝构造函数
void SetName();//输入姓名
char GetName(){return Name;}
void SetSex();//输入性别
void SetBornPlace();//输入出生地
void SetBornDate();//输入出生日期
void SetRace();//输入民族属性
void SetID();//输入身份证号码
void SetStuNum();//输入学号
void SetFatherName();//输入父姓名
void SetMatherName();//输入母姓名
void SetBloodType();//输入血型
void SetMark();//输入成绩
friend ostream &operator<<(ostream &out,const Student &m);
void JudgeFirstName();//判别学生姓氏是否与父母姓氏相同
};
//构造函数
Student::Student()
{
strcpy(Name,"无");
strcpy(Sex,"无");
strcpy(BornPlace,"无");
(*this).BornDate.SetDate(1,1,1);
strcpy(Race,"无");
strcpy(ID,"0");
strcpy(StuNum,"0");
strcpy(FatherName,"无");
strcpy(MatherName,"无");
strcpy(BloodType,"O");
Mark=0;
count++;
}
Student::count=0;
//输入姓名
void Student::SetName()
{
gets(Name);
Name[8]='\0';
cout<<endl;
char temp[3];
for(int i=0;Name[i]!='\0';i+=2)
{
temp[0]=Name[i];
temp[1]=Name[i+1];
temp[2]='\0';
if (strcmp(temp,"啊")<0)
throw 'a';
}
}
//输入性别
void Student::SetSex()
{
gets(Sex);
Sex[2]='\0';
cout<<endl;
if(strcmp(Sex,"男")!=0&&strcmp(Sex,"女")!=0)throw 'a';
}
//输入出生地
void Student::SetBornPlace()
{
gets(BornPlace);
BornPlace[99]='\0';
cout<<endl;
}
//输入出生日期
void Student::SetBornDate()
{
cin>>BornDate;
cout<<endl;
BornDate.IsValidDate();
}
//输入民族属性
void Student::SetRace()
{
cin>>Race;//为什么用gets(Race)就不行呢?
Race[8]='\0';
cout<<endl;
int x=0;//定义中间变量处理民族名异同情况
if(strcmp(Race,"汉")==0){x=1;}
if(strcmp(Race,"回")==0){x=1;}
if(strcmp(Race,"藏")==0){x=1;}
if(strcmp(Race,"苗")==0){x=1;}
if(strcmp(Race,"彝")==0){x=1;}
if(strcmp(Race,"壮")==0){x=1;}
if(strcmp(Race,"满")==0){x=1;}
if(strcmp(Race,"侗")==0){x=1;}
if(strcmp(Race,"瑶")==0){x=1;}
if(strcmp(Race,"白")==0){x=1;}
if(strcmp(Race,"傣")==0){x=1;}
if(strcmp(Race,"黎")==0){x=1;}
if(strcmp(Race,"佤")==0){x=1;}
if(strcmp(Race,"畲")==0){x=1;}
if(strcmp(Race,"水")==0){x=1;}
if(strcmp(Race,"土")==0){x=1;}
if(strcmp(Race,"羌")==0){x=1;}
if(strcmp(Race,"怒")==0){x=1;}
if(strcmp(Race,"京")==0){x=1;}
if(strcmp(Race,"蒙古")==0){x=1;}
if(strcmp(Race,"布衣")==0){x=1;}
if(strcmp(Race,"朝鲜")==0){x=1;}
if(strcmp(Race,"土家")==0){x=1;}
if(strcmp(Race,"哈尼")==0){x=1;}
if(strcmp(Race,"僳僳")==0){x=1;}
if(strcmp(Race,"高山")==0){x=1;}
if(strcmp(Race,"拉祜")==0){x=1;}
if(strcmp(Race,"东乡")==0){x=1;}
if(strcmp(Race,"纳西")==0){x=1;}
if(strcmp(Race,"景颇")==0){x=1;}
if(strcmp(Race,"仫佬")==0){x=1;}
if(strcmp(Race,"布朗")==0){x=1;}
if(strcmp(Race,"撒拉")==0){x=1;}
if(strcmp(Race,"毛南")==0){x=1;}
if(strcmp(Race,"仡佬")==0){x=1;}
if(strcmp(Race,"锡伯")==0){x=1;}
if(strcmp(Race,"阿昌")==0){x=1;}
if(strcmp(Race,"普米")==0){x=1;}
if(strcmp(Race,"德昂")==0){x=1;}
if(strcmp(Race,"保安")==0){x=1;}
if(strcmp(Race,"裕固")==0){x=1;}
if(strcmp(Race,"独龙")==0){x=1;}
if(strcmp(Race,"赫哲")==0){x=1;}
if(strcmp(Race,"门巴")==0){x=1;}
if(strcmp(Race,"珞巴")==0){x=1;}
if(strcmp(Race,"基诺")==0){x=1;}
if(strcmp(Race,"维吾尔")==0){x=1;}
if(strcmp(Race,"哈萨克")==0){x=1;}
if(strcmp(Race,"达斡尔")==0){x=1;}
if(strcmp(Race,"塔吉克")==0){x=1;}
if(strcmp(Race,"塔塔尔")==0){x=1;}
if(strcmp(Race,"鄂伦春")==0){x=1;}
if(strcmp(Race,"俄罗斯")==0){x=1;}
if(strcmp(Race,"鄂温克")==0){x=1;}
if(strcmp(Race,"乌孜别克")==0){x=1;}
if(strcmp(Race,"柯尔克孜")==0){x=1;}
if(x==0)throw x;
}
//输入身份证号码
void Student::SetID()
{
cin>>ID;
ID[18]='\0';
cout<<endl;
if((ID[6]-48)*1000+(ID[7]-48)*100+(ID[8]-48)*10+(ID[9]-48)!=BornDate.GetYear()) throw 0;
if((ID[10]-48)*10+(ID[11]-48)!=BornDate.GetMonth()) throw 0;
if((ID[12]-48)*10+(ID[13]-48)!=BornDate.GetDay()) throw 0;
if(strcmp(Sex,"男")==0&&(ID[16]-48)%2==0) throw 'a';
if(strcmp(Sex,"女")==0&&(ID[16]-48)%2!=0) throw 'a';
}
//输入学号
void Student::SetStuNum()
{
cin>>StuNum;
a[9]='\0';
cout<<endl;
}
//输入父姓名
void Student::SetFatherName()
{
cin>>FatherName;
FatherName[8]='\0';
cout<<endl;
char temp[2];
for(int i=0;FatherName[i]!='\0';i+=2)
{
temp[0]=FatherName[i];
temp[1]=FatherName[i+1];
if (strcmp(temp,"啊")<0)
throw 'a';
}
}
//输入母姓名
void Student::SetMatherName()
{
cin>>MatherName;
MatherName[8]='\0';
cout<<endl;
char temp[2];
for(int i=0;MatherName[i]!='\0';i+=2)
{
temp[0]=MatherName[i];
temp[1]=MatherName[i+1];
if (strcmp(temp,"啊")<0)
throw 'a';
}
}
void Student::SetMark();//输入成绩
{
int m;
cin>>m;
Mark=m;
}
//输入血型
void Student::SetBloodType()
{
cin>>BloodType;
BloodType[2]='\0';
cout<<endl;
if(strcmp(BloodType,"A")!=0&&strcmp(BloodType,"B")!=0&&strcmp(BloodType,"AB")!=0&&strcmp(BloodType,"O")!=0)
throw 'a';
}
//友元重载学生类输出
ostream &operator<<(ostream &out,const Student &m)
{
cout<<"姓名:"<<m.Name<<endl;
cout<<"性别:"<<m.Sex<<endl;
cout<<"出生地:"<<m.BornPlace<<endl;
cout<<"出生日期:"<<m.BornDate<<endl;
cout<<"民族:"<<m.Race<<endl;
cout<<"身份证号码:"<<m.ID<<endl;
cout<<"学号:"<<m.StuNum<<endl;
cout<<"成绩:"<<m.Mark<<endl;
cout<<"父姓名:"<<m.FatherName<<endl;
cout<<"母姓名:"<<m.MatherName<<endl;
cout<<"血型:"<<m.BloodType<<endl;
return out;
}
//判别学生姓氏是否与父母姓氏相同
void Student::JudgeFirstName()
{
char firstname1[3];//存放学生姓氏
char firstname2[3];//存放学生的父亲姓氏
char firstname3[3];//存放学生的母亲姓氏
firstname1[0]=Name[0];
firstname1[1]=Name[1];
firstname1[2]='\0';
firstname2[0]=FatherName[0];
firstname2[1]=FatherName[1];
firstname2[2]='\0';
firstname3[0]=MatherName[0];
firstname3[1]=MatherName[1];
firstname3[2]='\0';
if(strcmp(firstname1,firstname2)!=0&&strcmp(firstname1,firstname3)!=0)
{
cout<<"系统发现您输入的学生姓氏与其父母姓氏均不相同,请问是否重新输入学生或其父母姓名?"<<endl;
cout<<"是,请选择1再按回车;否,请选择2再按回车:"<<endl;
int a;
cin>>a;
if(a==1)
{
for(int c=0;c<3;c++)
{
cout<<"请再次检查学生的姓名、父母姓名是否有误,确证无误后:"<<endl;
cout<<"重新输入学生姓名,请选择1再按回车,"<<endl;
cout<<"重新输入学生父姓名,请选择2再按回车,"<<endl;
cout<<"重新输入学生母姓名,请选择3再按回车:"<<endl;
int b;
cin>>b;
try
{
if(b==1){cout<<"学生姓名:";SetName();}
if(b==2){cout<<"学生父姓名:";SetFatherName();}
if(b==3){cout<<"学生母姓名:";SetMatherName();}
}
catch(...)
{
continue;
}
break;
}
}
}
}
void input(Student &m)
{
cout<<"请您输入学生的如下信息:姓名、性别、出生地点、出生年月、民族、身份证号码、学号、成绩、父母姓名、血型"<<endl;
/*****************************************************************************************************************/
cout<<"姓名:";
try
{
m[i].SetName();
}
catch(char)
{
cout<<"抱歉,您输入的姓名不合常规,请查证后再输一次。"<<endl;
cout<<"请重新输入姓名:";m[i].SetName();
}
/*****************************************************************************************************************/
cout<<"性别:";
try
{
m[i].SetSex();
}
catch(char)
{
cout<<"抱歉,您输入的性别不合常规,请查证后再输一次。"<<endl;
cout<<"请重新输入性别:";m[i].SetSex();
}
/*****************************************************************************************************************/
cout<<"出生地:";
m[i].SetBornPlace();
/*****************************************************************************************************************/
cout<<"出生日期:";
try
{
m[i].SetBornDate();
}
catch(int)
{
cout<<"抱歉,您输入的日期不合常规,请查证后再输一次。"<<endl;
cout<<"请重新输入日期:";m[i].SetBornDate();
}
/*****************************************************************************************************************/
cout<<"民族:";
try
{
m[i].SetRace();
}
catch(int)
{
cout<<"抱歉,您输入的民族不是中华民族成员,请查证后再输一次。"<<endl;
cout<<"请重新输入民族:";m[i].SetRace();
}
/*****************************************************************************************************************/
cout<<"身份证号码:";
try
{
m[i].SetID();
}
catch(...)
{
cout<<"抱歉,您输入的身份证号码中的出生日期、或性别位数字和您刚输入的出生日期、或性别不一致,请查证后再输一次。"<<endl;
cout<<"请重新输入身份证号码:";m[i].SetID();
}
/*****************************************************************************************************************/
cout<<"学号:";
m[i].SetSduNum();
cout<<"成绩:";
m[i].SetMark();
/*****************************************************************************************************************/
cout<<"父姓名:";
try
{
m[i].SetFatherName();
}
catch(char)
{
cout<<"抱歉,您输入的父姓名不合常规,请查证后再输一次。"<<endl;
cout<<"请重新输入父姓名:";m[i].SetFatherName();
}
/*****************************************************************************************************************/
cout<<"母姓名:";
try
{
m[i].SetMatherName();
}
catch(char)
{
cout<<"抱歉,您输入的母姓名不合常规,请查证后再输一次。"<<endl;
cout<<"请重新输入母姓名:";
m[i].SetMatherName();
}
//******************************************************************************************************************
m[i].JudgeFirstName();
/*****************************************************************************************************************/
cout<<"血型:";
try
{
m[i].SetBloodType();
}
catch(char)
{
cout<<"抱歉,您输入的血型不合常规,请查证后再输一次。"<<endl;
cout<<"请重新输入血型:";m[i].SetBloodType();
}
/*****************************************************************************************************************/
}
/**************************************主函数*************************************************************************/
void main()
{
Student m[40];
input(m[0])
cout<<"要继续输入学生信息请输入1,不再继续请输入2:"<<endl;
int a;
cin>>a;
int i=1;
for (;i<40;i++)
{
if(a==1)
input(m[i]);
else break;
}
for (int j=0;j<=i;j++)
{
cout<<m[j];
}
cout<<"请输入您要查找的学生名字:"<<endl;
char s[10];
cin>>s;
int x=0;
for(int k=0;k<=i;k++)
{
if(strcmp(m[k].GetName,s)==0)
{
cout<<m[k];
x=1;
break;
}
}
if(x==0)
cout<<"对不起,您所要找的学生信息在数据库中没有收录。"<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -