身份证号码合法性判断
问题描述:
我国公民的身份证号码特点如下:
1、长度为18位;
2、第1~17位只能为数字;
3、第18位可以是数字或者小写英文字母x。
4、身份证号码的第7~14位表示持有人生日的年、月、日信息。
例如:511002198808080111或51100219880808011x。
请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的月日信息进行校验(大小月)。
比如0808表示8月8日月日信息,是合法的;0832表示8月32日,是非法的月日信息;1308表示13月8日,是非法的月日信息。
不需要考虑闰年的情况,2月份统一认为只有28天,测试用例不会输入闰年情况。其他情况的合法性校验,考生不用考虑。
函数返回值:
1) 如果身份证号合法,返回0;
2) 如果身份证号长度不合法,返回1;
3) 如果身份证号第1~17位含有非数字的字符,返回2;
4) 如果身份证号第18位既不是数字也不是英文小写字母x,返回3;
5) 如果身份证号上的日期信息非法,返回4;
[注]
除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
日期合法性判断不考虑闰年情况,即2月只有28天,出现2月29日情况均认为日期非法。测试用例也不会出现闰年的情况,在此情况下如果考生花时间进行了闰年处理,
并不能带来任何加分,并且由于是自动阅卷,甚至出现扣分。
示例
1) 输入:”511002111222”,函数返回值:1;
2) 输入:”511002abc123456789”,函数返回值:2
3) 输入:”511002198808321234”,函数返回值:4
4) 输入:”511002200102291234”,函数返回值:4
5) 输入:”511002198808081234”,函数返回值:0
题目解析:
本题主要也是涉及字符串的基本操作,以及面向对象的程序设计,因为主要是面向软件开发岗位,所以题目的设置是有一定的层次的,需要测试者熟悉一下基本的C++编程
熟悉基本的对象的设计!同时也要明确解决问题的步骤!下面我的代码,由于没有系统的学习够面向对象的设计和C++,就仅仅是使用类的外壳,外加C++语言,做了一下,希望给位大神,予以设计上的批评与指导!感谢大家不吝赐教!
#include <string>
#include <iostream>
using namespace std;
class CheckID
{
public:
CheckID(string id) { m_ID = id; }
~CheckID() { }
public:
int checkIDLength()
{
return ((int)m_ID.length() != 18 ? 1:0) ;
}
int checkIDNormal()
{
for(size_t i=0;i<m_ID.length()-1;i++)
if(m_ID[i] < '0' || m_ID[i] > '9')
return 2;
return 0;
}
int checkIDFinalChar()
{
if(!(m_ID[17] == 'x' || (m_ID[17] <= '9' && m_ID[17] >= '0')))
return 3;
return 0;
}
int checkIDBirthDay()
{
string birthDay = m_ID.substr(10,4);
int month = 0, day = 0;
month = atoi(birthDay.substr(0,2).c_str());
day = atoi(birthDay.substr(2,2).c_str());
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(day > 31 || day < 1)
return 4;
else
break;
case 4:
case 6:
case 9:
case 11:
if(day > 30 || day < 1)
return 4;
else
break;
case 2:
if(day > 28 || day < 1)
return 4;
else
break;
}
return 0;
}
int checkID()
{
int res = 0;
res += checkIDLength();
if(res != 0)
return res;
res += checkIDNormal();
if(res != 0)
return res;
res += checkIDFinalChar();
if(res != 0)
return res;
res += checkIDBirthDay();
if(res != 0)
return res;
return res;
}
private:
string m_ID;
};
int main()
{
string id;
cin >> id;
CheckID check(id);
int res = check.checkID();
cout << res << endl;
}