?? 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 + -