用C++编一个身份证15位升18位的程序
已知旧身份证号码为15位,其中第7~12位体现居民的出生日期,由两位年份+两位月份+两位日期组成;新身份证号码为18位,其中第7~14位体现居民的出身日期,由四位年份+两位月份+两位日期组成。试定义一个类ID,根据居民的出身日期校验其身份证号是否正确。具体要求如下:
int fun( ); 根据出生日期校验身份证号是否正确,如果正确,函数返回值为1,否则返回值为0。必须使用如下算法:首先确定身份证号码的位数(15位或18位),再分别取出身份证中的表示年份、月份、日期的子字符串,然后利用val函数分别将它们转换为数值,最后与相应成员数据比较,得到校验结果;
void print( ); 输出所有成员数据。
在主函数中输入两个身份证号(一个18位:321102190002151910,另一个15位:321102490318191),分别用这两个身份证号初始化类ID的两个对象,然后通过成员函数fun校验身份证号是否正确,并输出相应的信息(身份证号、出生日期、校验结果)
答案:
#include <iostream>
#include <string>using namespace std;
class IDException
{
public:
enum IDExceptionCode
{
IDLengthInvalid = 1
};
IDException(IDExceptionCode Code)
{
m_IDExcepCode = Code;
}
const char *GetExceptionStr()
{
return m_IDExcepStr[(int)m_IDExcepCode-1];
}
private:
IDExceptionCode m_IDExcepCode;
(const char *m_IDExcepStr)[1];/*={
"ID长度错误。ID长度必须为15位或者18位。"
};*/
};
class ID
{
public:
//ID类别
enum IDGeneration
{
Gen_Invalid = -1,
Gen_1st = 1, //第一代
Gen_2nd = 2 //第二代
};
//构造函数
ID()
{
m_strID[0]='\0';
m_BirYear = 0;
m_BirMonth = 0;
m_BirDay = 0;
m_IDGen = ID::Gen_Invalid;
}
ID(char * strID);
ID(char *strID, unsigned int BirYear, unsigned int BirMonth, unsigned int BirDay);
//设置ID串
void SetID(char * strID);
//设定出生日期
void SetBirDate(unsigned int BirYear, unsigned int BirMonth, unsigned int BirDay);
//获取ID类别
IDGeneration GetIDGeneration()
{
return m_IDGen;
}
//校验出生日期
bool ValidateBirDate();
//校验区域代码
bool ValidateAreaCode();
//校验后缀区分代码
bool ValidateSuffixCode();
//应题目而作
int fun();
//应题目而作
void print();
private:
char m_strID[18];
unsigned int m_BirYear;
unsigned int m_BirMonth;
unsigned int m_BirDay;
IDGeneration m_IDGen;
};
//构造函数
ID::ID(char * strID)
{
if (15==strlen(strID))
{
m_IDGen = ID::Gen_1st;
strcpy(m_strID, strID);
}
else if (18==strlen(strID))
{
m_IDGen = ID::Gen_1st;
strcpy(m_strID, strID);
}
else
{
throw IDException(IDException::IDLengthInvalid);
}
m_BirYear = 0;
m_BirMonth = 0;
m_BirDay = 0;
}
//构造函数
ID::ID(char *strID, unsigned int BirYear, unsigned int BirMonth, unsigned int BirDay)
{
if (15==strlen(strID))
{
m_IDGen = ID::Gen_1st;
strcpy(m_strID, strID);
}
else if (18==strlen(strID))
{
m_IDGen = ID::Gen_2nd;
strcpy(m_strID, strID);
}
else
{
throw IDException(IDException::IDLengthInvalid);
}
m_BirYear = BirYear;
m_BirMonth = BirMonth;
m_BirDay = BirDay;
}
//校验出生日期
bool ID::ValidateBirDate()
{
unsigned int YearInIdStr=0, MonthInIdStr=0, DayInIdStr=0;
char tmpStr[5];
if (ID::Gen_1st==m_IDGen)
{
tmpStr[0] = m_strID[6];
tmpStr[1] = m_strID[7];
tmpStr[2] = '\0';
if (atoi(tmpStr) != m_BirYear)
return false;
tmpStr[0] = m_strID[8];
tmpStr[1] = m_strID[9];
tmpStr[2] = '\0';
if (atoi(tmpStr) != m_BirMonth)
return false;
tmpStr[0] = m_strID[10];
tmpStr[1] = m_strID[11];
tmpStr[2] = '\0';
if (atoi(tmpStr) != m_BirDay)
return false;
return true;
}
if (ID::Gen_2nd==m_IDGen)
{
tmpStr[0] = m_strID[6];
tmpStr[1] = m_strID[7];
tmpStr[2] = m_strID[8];
tmpStr[3] = m_strID[9];
tmpStr[4] = '\0';
if (atoi(tmpStr) != m_BirYear)
return false;
tmpStr[0] = m_strID[10];
tmpStr[1] = m_strID[11];
tmpStr[2] = '\0';
if (atoi(tmpStr) != m_BirMonth)
return false;
tmpStr[0] = m_strID[12];
tmpStr[1] = m_strID[13];
tmpStr[2] = '\0';
if (atoi(tmpStr) != m_BirDay)
return false;
return true;
}
//Visual C++ like so....
return true;
}
//校验区域代码
bool ID::ValidateAreaCode()
{
//可查表校验区域代码是否正确
return true;
}
//校验后缀区分代码
bool ID::ValidateSuffixCode()
{
//可加上判断后缀区分代码的逻辑
return true;
}
//应题目而作
int ID::fun()
{
if (ValidateBirDate())
return 1;
else
return 0;
}
//应题目而作
void ID::print()
{
cout << "ID : " << m_strID;
cout << ", \t代别 : 第" << ((m_IDGen == ID::Gen_1st)?1:(m_IDGen == ID::Gen_2nd)?2:-1)<<"代";
cout << ", \t出生日期:" << m_BirYear << "年" << m_BirMonth << "月" << m_BirDay << "日";
}
void main()
{
ID ID_One("321102190002151910", 1990, 2, 15); //注意,出生年故意输入错误,以验证代码
ID ID_Two("321102490318191", 49, 3, 18);
if (0==ID_One.fun())
cout << "ID对象ID=321102190002151910出生日期有误" << endl;
else
cout << "ID对象ID=321102190002151910出生日期正确" << endl;
cout << "相关信息为:" << endl << "\t";
ID_One.print();
cout << endl << endl << endl;
if (0==ID_Two.fun())
cout << "ID对象ID=321102490318191出生日期有误" << endl;
else
cout << "ID对象ID=321102490318191出生日期正确" << endl;
cout << "相关信息为:" << endl << "\t";
ID_Two.print();
cout << endl;
}
上一个:请教一个c++窗口消息的传递和句柄获取的问题
下一个:课后作业,帮忙编写完整的C++程序