0
点赞
收藏
分享

微信扫一扫

【id:262】【10分】E. OOP身份证扩展(类构造与析构)

猫er聆听没落的旋律 2022-04-17 阅读 59
c++

题目描述

定义一个身份证类,将 15 位的旧版身份证号扩充为 18 位。

在 15 位身份证号中,第 7、8 两位为出生年份,例如,1980 年出生的人,身份证号码的第 7、8 位的值是 80,在 18 位身份证号中,将 7~10 四位的值改为 1980,并将原身份证号码第 9 位开始以后的所有数字依次向右平移 2 位。在 18 位身份证号中, 最后增加一位校验码,校验码的计算方法如下(只考虑 20 世纪出生的公民):

(1)将已扩展出的 17 位身份证号按各位上的数字进行加权求和,结果为 S。自左到右各位上的数字的权值依次为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}。

(2)将 S 对 11 取余运算,结果为 Y。

(3)根据 Y 的取值大小顺序{0,1,2,3,4,5,6,7,8,9,10}取对应的校验码{1,0,X,9,8,7,6,5,4,3,2}。

例如,当 15 位身份证号为 340524800101001 时,扩展年份后成 17 位:34052419800101001,各位上的数字的加权和 S=3*7+4*9+0*10+5*5+2*8+4*4+1*2+9*1+8*6+0*3+0*7+1*9+0*10+1*5+0*8+0*4+1*2=189,S对11取余,即 S%11=189%11=2,则校验码为“X”。

要求类定义中包含完整的含参构造函数,默认构造函数,以及析构函数。

输入

测试组数t

以下t行,输入15位身份证号

2
340524800101001
310001000101452

输出

每个实例包含三行输出

第1行,在构造函数输出原身份证号,看样例

第2行,调用类方法输出扩展后的身份证号,看样例

第3行,在析构函数输出提示信息,包含扩展后身份号末4位,看样例

construct ID=340524800101001
upgrade ID=34052419800101001X
destruct ID=001X
construct ID=310001000101452
upgrade ID=310001190001014527
destruct ID=4527

代码

#include <iostream>
#include <string>
using namespace std;
class idcard
{
private:
    string id, nid;

public:
    idcard()
    {
        cin >> id;
        cout << "construct ID=" << id << endl;
    };
    void upid()
    {
        nid = id;
        nid.insert(6, "19");
        int array[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}, s = 0;
        for (int i = 0; i < 17; i++)
            s += (nid[i] - '0') * array[i];
        char array2[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
        nid.insert(nid.end(), array2[s % 11]);
        cout << "upgrade ID=" << nid << endl;
    }
    ~idcard()
    {
        cout << "destruct ID=";
        for (int i = 14; i < 18; i++)
            cout << nid[i];
        cout << endl;
    };
};
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        idcard id;
        id.upid();
    }
}
举报

相关推荐

0 条评论