时间限制3s
内存限制128MB
题目描述
按下述方式定义一个日期类CDate和描述15位身份证号的旧身份证类COldId:
class CDate
{
private:
int year, month, day;
public:
CDate(int, int, int);
bool check(); //检验日期是否合法
bool isLeap();
void print();
};
class COldId
{
protected:
char* pId15, * pName; //15位身份证号码,姓名
CDate birthday; //出生日期
public:
COldId(char* pIdVal, char* pNameVal, CDate& day);
bool check(); //验证15位身份证是否合法
void print();
~COldId();
};
然后以COldId为基类派生18位身份证号的新身份证类CNewId,并增加3个数据成员:pId18(18位号码)、issueDay(签发日期)和validYear(有效期,年数),并重新定义check()和print()。
15位身份证号扩展为18位身份证号的规则为:前6位号码保持一致,年份由2位变为4位(在前面加上19,例如88变为1988),剩余号码都保持一致,再加上第18位校验码。
身份证第18位校验码的生成方法:
1、将身份证号码前17位数分别乘以7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2。然后将其相加。
2、将17位数字与系数乘加的和除以11,得到余数。
3、余数与校验码的对应关系为1,0,X,9,8,7,6,5,4,3,2。也即:如果余数是3,身份证第18位就是9。如果余数是2,身份证的最后一位号码就是X。
主函数定义一个派生类对象,并用派生类对象调用check(),若返回false则输出“illegal id”否则调用print()输出身份证信息。check()对身份证合法性进行验证的规则:
1. 确认18位号码是从15位号码扩展的,且第18位校验码正确.
2. 身份证中的出生日期合法.
3. 身份证号码中不含非法字符.
4. 身份证号码的长度正确.
5. 身份证目前处于有效期内,假设当前日期为2021年11月9日。
输入
测试数据的组数 t
第一个人姓名、出生日期年月日、15位身份证号码、18位身份证号码、签发日期年月日、有效期(100年按长期处理)
第二个人姓名、出生日期年月日、15位身份证号码、18位身份证