模拟一个公民身份证信息管理系统。通过读入文件数据,可以查询每个公民的身份证信息等。同时可以进行身份证校验,并将正确的信息保存至指定文件中。程序开始时,自动从文件读入信息到结构体数组,并提取每个公民的出生年月放入结构体中,同时进行身份证校验位是否正确,判断信息也放入结构体中。写一个获取所有公民的出生年月和身份证校验位是否正确的函数。其中,结构体数组 p 中已经保存 n 个公民身份证和姓名,函数将从每个身份证号码中获得出生年、月、日,判定身份证校验位是否正确,并保存至结构体中。
时间: 2024-04-21 18:30:10 浏览: 67
好的,下面是一个获取所有公民的出生年月和身份证校验位是否正确的函数实现:
```cpp
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
// 定义一个结构体表示出生年月日和身份证校验位
struct citizen {
string name;
string ID;
int check;
int year;
int month;
int day;
};
// 判断身份证校验位是否正确
int checkID(string ID) {
int weight[] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
char check[] = { '1','0','X','9','8','7','6','5','4','3','2' };
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += (ID[i] - '0') * weight[i];
}
int mod = sum % 11;
if (ID[17] == check[mod]) {
return 1;
}
else {
return 0;
}
}
// 从身份证号中提取出生年月日
void getBirth(string ID, citizen& c) {
c.year = stoi(ID.substr(6, 4));
c.month = stoi(ID.substr(10, 2));
c.day = stoi(ID.substr(12, 2));
}
// 获取所有公民的出生年月和身份证校验位是否正确
void getAllCitizens(string filename, citizen* p, int n) {
ifstream ifs(filename);
string line;
int i = 0;
while (getline(ifs, line)) {
int pos = line.find(" ");
p[i].name = line.substr(0, pos);
p[i].ID = line.substr(pos + 1);
p[i].check = checkID(p[i].ID);
if (p[i].check == 1) {
getBirth(p[i].ID, p[i]);
}
i++;
}
}
int main() {
// 测试代码
const int n = 3;
citizen p[n];
getAllCitizens("citizens.txt", p, n);
for (int i = 0; i < n; i++) {
cout << p[i].name << " " << p[i].ID << " " << p[i].check << " " << p[i].year << "-" << p[i].month << "-" << p[i].day << endl;
}
return 0;
}
```
这个函数接收一个文件名、一个公民结构体数组和数组长度,从指定文件中读取每个公民的身份证号码和姓名,然后判断校验位是否正确,如果正确就从身份证号码中提取出生年月日,最后将结果保存至结构体数组中。
希望这个函数能够对你有所帮助!
阅读全文