⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 managestudent.cpp

📁 一个学生管理系统
💻 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 + -