华为2011软件开发校园测试机试题--身份证号码合法性判断

来源:互联网 发布:淘宝号刷多少单危险 编辑:程序博客网 时间:2024/05/20 06:23

身份证号码合法性判断

问题描述:
我国公民的身份证号码特点如下:
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;elsebreak;case 4:case 6:case 9:case 11:if(day > 30 || day < 1)return 4;elsebreak;case 2:if(day > 28 || day < 1)return 4;elsebreak;}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;}


 

2 0