试定义一个类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位后,进行数字加权,最后算出校验码为X。
编程具体要求如下:
1)私有数据成员:
char s[19],x[11] // S存放身份证号,X存放校验码{1,0,X,9,8,7,6,5,4,3,2}
int w[17] //自左向右各位上的数字的权值,依次为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}
2)共有成员函数
ID(char *str) //构造函数,假定给定的是15位身份证号码,并根据上述题意初始化数据成员x,w
void fun()//将存放的15位身份证号码扩展为18位
void print() //输出18位身份证号码
主函数中用15位的身份证号码对ID类进行测试
int main()
{
char st[]="340524800101001";
ID test(st);
cout<<"原身份证号:";
test.print();
test.fun();
cout<<"扩展后的原身份证号:";
test.print();
return 0;
}