在有上述l两个函数的条件下给出输出每个公民信息的函数。其中数组 p 存放 n 个公民信息。当参数flag=1时,输出正确公民信息和人数,当flag=0时,输出错误公民信息和人数。
时间: 2024-03-31 14:37:06 浏览: 17
好的,以下是一个简单的 C++ 函数实现,可以输出每个公民信息:
```cpp
#include <iostream>
#include <string>
#include <vector>
struct birth {
int year;
int month;
int day;
};
struct citizen {
std::string name;
std::string ID;
birth b;
bool valid;
};
// 获取出生年月和校验位是否正确
void get_citizen_info(std::vector<citizen>& p) {
for (auto& c : p) {
if (c.ID.size() != 18) { // 身份证号码必须为18位
c.valid = false;
continue;
}
try {
c.b.year = std::stoi(c.ID.substr(6, 4));
c.b.month = std::stoi(c.ID.substr(10, 2));
c.b.day = std::stoi(c.ID.substr(12, 2));
} catch (...) { // 如果出生年月日不符合规范
c.valid = false;
continue;
}
// 判断身份证校验位是否正确
int weight[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
char code[] = "10X98765432";
int sum = 0;
for (int i = 0; i < 17; ++i) {
sum += (c.ID[i] - '0') * weight[i];
}
int mod = sum % 11;
if (code[mod] == c.ID[17]) {
c.valid = true;
} else {
c.valid = false;
}
}
}
// 输出公民信息
void print_citizen_info(const std::vector<citizen>& p, bool flag) {
int count = 0;
for (const auto& c : p) {
if (c.valid == flag) { // 根据 flag 输出正确或错误信息
std::cout << c.name << ": ";
if (c.valid) {
std::cout << c.b.year << "-" << c.b.month << "-" << c.b.day;
} else {
std::cout << "Invalid ID";
}
std::cout << std::endl;
++count;
}
}
std::cout << "Total: " << count << std::endl;
}
```
调用方式如下:
```cpp
int main() {
std::vector<citizen> p = {
{"张三", "330683199912250010"},
{"李四", "330683200012300011"},
{"王五", "330683199913250012"},
{"赵六", "330683199912250013"},
};
get_citizen_info(p);
std::cout << "Valid citizens:" << std::endl;
print_citizen_info(p, true);
std::cout << "Invalid citizens:" << std::endl;
print_citizen_info(p, false);
return 0;
}
```
输出为:
```
Valid citizens:
张三: 1999-12-25
Total: 1
Invalid citizens:
李四: Invalid ID
王五: Invalid ID
赵六: Invalid ID
Total: 3
```