试定义一个类ID,将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+...=189
,S对11取余,得2,则校验码为X。最终升位后的身份证号码为:34052419800101001X
##请补充类的定义,实现上述功能测试主程序如下:
#include <iostream> #include <string.h> using namespace std; int main() { char oldID[15]; cin>>oldID; ID myID(oldID); cout<<"ID No.:"; myID.print(); myID.convert(); cout<<"New ID NO.:"; myID.print(); return 0; }
输入样例:
150105890811001
输出样例:
ID No.:150105890811001 New ID NO.:150105198908110012
代码:
#include <iostream>
#include <string.h>
using namespace std;
/* 请在这里填写答案 */
class ID{
public:
ID(char *idd){//构造函数:完成对象初始化
strcpy(id,idd);
strcpy(check,"10X98765432");//校验码
int t[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
for(int i=0;i<17;i++){//十七位权值初始化
weight[i]=t[i];
}
}
void print(){
cout<<id<<endl;
}
void convert();
private:
char id[19],check[12];//身份证号18位+‘\0’占位符
//\0' 在c语言中是字符串的结束符,C语言标准库中对字符串的处理
//都会以\0作为字符串结束标志,任何字符串之后都会自动加上'\0'
int weight[17];//权值
};
void ID::convert(){
for(int i=16;i>=8;i--){
id[i]=id[i-2];
}
id[6]='1';
id[7]='9';
id[18]='\0';
//确定最后一位,校验位
int S=0;
for(int i=0;i<17;i++){//把char型转化为数字参加运算
//S += (id[i] - '0') * weight[i];
S += (int(id[i]) - '0') * weight[i];//强制类型转换
}
id[17] = check[S%11];
}
int main()
{
char oldID[15];
cin>>oldID;
ID myID(oldID);
cout<<"ID No.:";
myID.print();
myID.convert();
cout<<"New ID NO.:";
myID.print();
return 0;
}