题目描述

按下述方式定义一个日期类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()。身份证第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月8日。输入测试数据的组数 t第一个人姓名、出生日期年月日、15位身份证号码、18位身份证号码、签发日期年月日、有效期(100年按长期处理)第二个人姓名、出生日期年月日、15位身份证号码、18位身份证号码、签发日期年月日、有效期(100年按长期处理)......姓名的最大字符长度为20输出第一个人姓名第一个人18位身份证号信息(号码、签发日期和有效期)或"illegal id"第二个人姓名第二个人18位身份证号信息(号码、签发日期和有效期)或"illegal id"......输入样例1
10
AAAA 1988 2 28 440301880228113 440301198802281133 2006 1 20 20
BBBB 1997 4 30 440301980808554 440301199808085541 2015 2 2 10
CCCC 1920 5 8 530102200508011 53010219200508011X 1980 3 4 30
DDDD 1980 1 1 340524800101001 340524198001010012 1998 12 11 20
EEEE 1988 11 12 110203881112034 110203198811120340 2007 2 29 20
FFFF 1964 11 15 432831641115081 432831196411150810 2015 8 7 100
GGGG 1996 12 10 44030196121010 44030119961210109 2014 6 7 20
HHHH 1988 7 21 440301880721X12 44030119880721X122 2006 5 11 20
IIII 1976 3 30 440301760330098 440301197603300983 2003 4 15 20
JJJJ 1955 9 5 440301550905205 440301195509051052 2004 6 4 100 输出样例1
AAAA
440301198802281133 2006年1月20日 20年
BBBB
illegal id
CCCC
illegal id
DDDD
illegal id
EEEE
illegal id
FFFF
432831196411150810 2015年8月7日 长期
GGGG
illegal id
HHHH
illegal id
IIII
illegal id
JJJJ
illegal id

该题题目很长,好好审题再动手,该题的难点主要在check()的实现上

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include <iomanip>
#include<cmath>
#include<cstring>
#include<cctype>
#include<queue>
#include<set>
using namespace std;class CDate
{
private:int year, month, day;
public:CDate() { ; }CDate(int y, int m, int d){year = y;month = m;day = d;}bool check(); //检验日期是否合法bool isLeap();int gety() { return year; }int getm() { return month; }int getd() { return day; }void print(){cout << year << "年" << month << "月" << day << "日";}void set(int y, int m, int d){year = y;month = m;day = d;}
};class COldId
{
protected:string pId15,pName; //15位身份证号码,姓名CDate birthday; //出生日期
public:COldId() { ; }//COldId(string pIdVal, string pNameVal, CDate& day);//bool check(); //验证15位身份证是否合法//void print();//~COldId();
};class cnewid :public COldId
{
protected:string pid18;CDate issueDay;int validyear;
public:cnewid(string name, string id1, string id2, int y, int m, int d, int yy, int mm, int dd,int age);bool check();void print();
};void cnewid::print()
{if (this->check()){cout << pid18 << ' ';issueDay.print();if (validyear != 100){cout << ' '<<validyear << "年" << endl;}else{cout << ' ' << "长期" << endl;}}}bool cnewid::check()
{if (pid18.length() == 18)//身份证长度是否合格{string id = pid18;string date = id.substr(6, 8);string str = id.erase(6, 2);int len = pid18.length();str = str.erase(15);int y = (date[0] - 48) * 1000 + (date[1]-48) * 100 + (date[2]-48) * 10 + (date[3]-48);int m = (date[4] - 48) * 10 + (date[5] - 48);int d = (date[6] - 48) * 10 + (date[7] - 48);int num = this->issueDay.gety()*10000 +this->issueDay.getm()  * 100 + this->issueDay.getd();CDate D(y, m, d);num += (validyear * 10000);if (D.check()&&str==pId15&&num>=20211108&&y==this->birthday.gety()&& m == this->birthday.getm()&& d == this->birthday.getd()&&issueDay.check()){//身份证中的出生日期是否合格+18位身份证是否由15位扩展来的+身份证是否过期+身份证签发日期是否合格int sign = 1;for (int i = 0; i < len; i++){if (pid18[i] == 'X' && i != 17){sign = 0;break;}if ((pid18[i] >= '0' && pid18[i] <= '9')){sign = 1;}else{sign = 0;break;}}if (sign)//身份证是否出现非法符号{int n = (pid18[0] - 48) * 7 + (pid18[1] - 48) * 9 + (pid18[2] - 48) * 10 + (pid18[3] - 48) * 5 + (pid18[4] - 48) * 8 + (pid18[5] - 48) * 4 + (pid18[6] - 48) * 2 + (pid18[7] - 48) + (pid18[8] - 48) * 6 + (pid18[9] - 48) * 3 + (pid18[10] - 48) * 7 + (pid18[11] - 48) * 9 + (pid18[12] - 48) * 10 + (pid18[13] - 48) * 5 + (pid18[14] - 48) * 8 + (pid18[15] - 48) * 4 + (pid18[16] - 48) * 2;n %= 11;char dui;if (n == 0)dui = '1';else if (n == 1)dui = '0';else if (n == 2)dui = 'X';else if (n == 3)dui = '9';else if (n == 4)dui = '8';else if (n == 5)dui = '7';else if (n == 6)dui = '6';else if (n == 7)dui = '5';else if (n == 8)dui = '4';else if (n == 9)dui = '3';else if (n == 10)dui = '2';if (dui == pid18[17])//身份证校验码是否正确{return true;}}}}return false;
}cnewid::cnewid(string name, string id1, string id2, int y, int m, int d, int yy, int mm, int dd,int age)
{pName = name;birthday.set(y, m, d);pId15 = id1;pid18 = id2;issueDay.set(yy, mm, dd);validyear = age;
}bool CDate::isLeap()
{return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}bool CDate::check()
{int m[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };if (this->isLeap()) m[2] = 29;else m[2] = 28;if (month >= 1 && month <= 12 && day >= 1 && day <= m[month]){return true;}return false;
}
int main()
{int t, y, m, d, yy, mm, dd, age;string OLD, NEW,name;cin >> t;while (t--){cin >> name >> y >> m >> d >> OLD >> NEW>>yy >> mm >> dd >> age;cnewid per(name, OLD, NEW, y, m, d, yy, mm, dd, age);cout << name << endl;if (per.check()){per.print();}else{cout << "illegal id" << endl;}}return 0;
}

E. 新旧身份证(继承)相关推荐

  1. 常用正则表达式 新旧身份证合法性验证及相互转换算法

    关键字:正则表达式  模式匹配 Javascript 摘要:收集一些常用的正则表达式. 正则表达式用于字符串处理,表单验证等场合,实用高效,但用到时总是不太把握,以致往往要上网查一番.我将一些常用的表 ...

  2. 新旧身份证合法性验证及相互转换算法(三):Java身份证号码验证及将15位转换18位

    package test; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 身份证号码验证 * */ pub ...

  3. Flex布局新旧混合写法详解

    flex是个非常好用的属性,如果说有什么可以完全代替 float 和 position ,那么肯定是非它莫属了(虽然现在还有很多不支持 flex 的浏览器).然而国内很多浏览器对 Flex 的支持都不 ...

  4. odoo10参考系列--ORM API 二(新旧API兼容性、模型参考和方法修饰符)

    新API与旧API的兼容性 现在的Odoo是从就的(不规律的)API过渡来的,它可能需要从一个手动桥接到另一个手动桥接: RPC层(XML-RPC和RPC)是在旧的API的形式表达,表达的纯粹的方法在 ...

  5. 2015(4)软件工程,软件运行与维护,新旧系统转换策略,遗留系统的演化策略,数据转换与数据迁移...

    试题四 随着信息化的发展,某银行的中心账务系统,从城市中心.省中心模式已经升级到全国中心模式.但是处理各种代收代付业务的银行中间业务系统,目前仍然采用省中心模式,由各省自行负责,使得全国中间业务管理非 ...

  6. 新旧系统更替产生的数据迁移问题

    新旧系统更替产生的数据迁移问题 作者:西安项目组夏凯撰文时间:2004.11.08 在信息化建设过程中,随着技术的发展,原有的信息系统不断被功能更强大的新系统所取代.从两层结构到三层结构,从Clien ...

  7. 系统规划---新旧系统的分析和比较

     新旧系统的分析和比较 计算机技术飞速发展,日新月异,许多企业因为业务发展的需要和市场竞争的压力,需要建设新的企业信息系统.在这种升级改造的过程中,怎么处理和利用那些历史遗留下来的老系统,成为影响新系 ...

  8. Java新旧代码的比较_比较java新旧I/O的性能——以复制大文件为例

    package newio; import java.io.*; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; / ...

  9. 再度剖析AD账户新旧密码同时可用的问题

        上周五写了一篇名为<深度剖析修改AD用户密码的数据同步机制>的文章,其中发现在修改了AD用户密码以后,5分钟之内,新旧密码同时可用的状况.     今天微软GTSC的工程师换了两拨 ...

最新文章

  1. CAS单点登录3--服务端登录页个性化
  2. linux之RAID知识总结
  3. 双三次插值(BiCubic插值)
  4. Mac安装HomeBrewHomeBrew安装yarn
  5. 一文介绍解银行卡验证api接口详情
  6. PostScript文件
  7. 重装系统(无法开机时候操作方法)
  8. 每个计算机的ip地址要一样吗,同一ip网站-局域网中的所有电脑都是同一个IP地址吗? – 手机爱问...
  9. 虚拟服务器的克隆,怎么克隆远程服务器上的虚拟机
  10. 被巨头、快递、新贵分食的跨境电商
  11. android本地商城,Android本地商城应用
  12. 计算机移动应用技术与服务,计算机移动技术应用探究
  13. IIS 7.5 中提供的 Web 服务器 (IIS) 角色服务
  14. VC 操作excel
  15. 制定进度计划-规划范围管理
  16. Panda 常见的坑
  17. R:使用ggplot2画散点图时出现错误: Continuous value supplied to discrete scale
  18. Python3爬虫——爬取猫眼电影排行
  19. java jsoup爬动态网页_使用Jsoup+HtmlUnit抓取动态网页数据
  20. C# 中object sender与EventArgs e

热门文章

  1. RocketMQ消息消费方式 推拉模式
  2. 终端中显示git分支名称的方法
  3. Dynamic 365 子网格编辑控制列可编辑
  4. 安卓 APP更新的两种途径
  5. 支付宝支付--手机支付
  6. 计算机基本原理问答题及答案
  7. 元宇宙产业委共同主席倪健中带队参访杭州市总工会推动元宇宙合作
  8. 悦轩饼家-商品列表样式
  9. java 图形处理_课内资源 - 基于Java实现的几何图形处理系统
  10. QT入门之UI设计界面