题目描述
输入身份证号码,用子串查找的方法获取该身份证号码拥有者的身份信息,包括省市、出生年月日,性别等。要求能判断输入身份证号码是否符合规定,比如:是否是18位,1-17位是否是数字,最后一位是否是0X,1112位合起来不能大于12,13~14位合起来不能大于31或者30,29,28(即符合每月最大日期)。
输入形式
以字符串的形式输入一个身份证号码
输出形式
如果身份证号码不符合规定,提示身份证信息错误,若符合规定,则输出该身份证号码拥有者的信息,即省市、出生年月日,性别。
源代码
#include <iostream>
#include <string>
using namespace std;
bool isValidID(string id) {
// 判断身份证号码是否符合规定
if (id.length() != 18) {
return false;
}
for (int i = 0; i < 17; i++) {
if (!isdigit(id[i])) {
return false;
}
}
if (!(id[17] == 'X' || id[17] == 'x' || isdigit(id[17]))) {
return false;
}
int month = stoi(id.substr(10, 2));
int day = stoi(id.substr(12, 2));
if (month < 1 || month > 12 || day < 1 || day > 31) {
return false;
}
if ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30) {
return false;
}
if (month == 2) {
int year = stoi(id.substr(6, 4));
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
if (day > 29) {
return false;
}
} else {
if (day > 28) {
return false;
}
}
}
return true;
}
void getIDInfo(string id) {
// 获取身份证号码拥有者的信息
string province = id.substr(0, 2);
string birthday = id.substr(6, 8);
string gender;
if (id[16] % 2 == 0) {
gender = "女";
} else {
gender = "男";
}
cout << "省市:" << province << endl;
cout << "出生年月日:" << birthday << endl;
cout << "性别:" << gender << endl;
}
int main() {
string id;
while (cin >> id) {
if (!isValidID(id)) {
cout << "身份证信息错误" << endl;
} else {
getIDInfo(id);
}
}
return 0;
}
在这个问题中,我们首先定义了一个函数isValidID,用于判断输入的身份证号码是否符合规定。函数中,我们通过一系列的条件判断来验证身份证号码的合法性,包括长度为18位、前17位都是数字、最后一位是数字或者大写字母X、月份和日期的范围等。
接下来,我们定义了一个函数getIDInfo,用于获取身份证号码拥有者的信息。函数中,我们使用substr函数从身份证号码中提取省市、出生年月日和性别信息,并将其输出。
在主函数中,我们使用循环读取输入的身份证号码,并根据isValidID函数的返回值判断输入的身份证号码是否符合规定。如果不符合规定,则输出错误信息;如果符合规定,则调用getIDInfo函数获取身份证拥有者的信息,并输出。
注意:题目要求输入多组数据,因此使用了一个while循环来不断读取输入并进行处理。
© 版权声明
本站资源来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!
THE END