在上述条件下给出void get_all_person (struct person p[],int n); 获取所有公民的出生年月和身份证校验位是否正确的函数。其中,结构体数组 p 中已经保存 n 个公民身份证和姓名,函数将从每个身份证号码中获得出生年、月、日,判定身份证校验位是否正确,并保存至结构体中。
时间: 2024-03-31 16:36:42 浏览: 118
可以使用以下代码获取所有公民的出生年月和身份证校验位是否正确的函数:
```c++
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
struct birth { int year, month, day; };
struct person {char ID[19], name[20]; struct birth birthday; int flag; };
int checkID(char id[]) {
int i, sum = 0;
int weight[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char check_code[] = "10X98765432";
for (i = 0; i < 17; i++) {
sum += (id[i] - '0') * weight[i];
}
int mod = sum % 11;
char check = check_code[mod];
if (check == id[17]) {
return 1; // 校验位正确
} else {
return 0; // 校验位错误
}
}
struct birth get_birthday_from_ID(char *ID) {
struct birth birthday;
char year_str[5], month_str[3], day_str[3];
memset(&birthday, 0, sizeof(struct birth));
memset(year_str, 0, sizeof(year_str));
memset(month_str, 0, sizeof(month_str));
memset(day_str, 0, sizeof(day_str));
strncpy(year_str, ID+6, 4);
strncpy(month_str, ID+10, 2);
strncpy(day_str, ID+12, 2);
birthday.year = atoi(year_str);
birthday.month = atoi(month_str);
birthday.day = atoi(day_str);
return birthday;
}
void get_all_person(struct person p[], int n) {
int i;
for (i = 0; i < n; i++) {
p[i].birthday = get_birthday_from_ID(p[i].ID);
p[i].flag = checkID(p[i].ID);
}
}
int main() {
struct person p[2];
strcpy(p[0].ID, "123456197001010101");
strcpy(p[0].name, "张三");
strcpy(p[1].ID, "123456197001010102");
strcpy(p[1].name, "李四");
get_all_person(p, 2);
int i;
for (i = 0; i < 2; i++) {
printf("name: %s, birthday: %d-%d-%d, flag: %d\n", p[i].name, p[i].birthday.year, p[i].birthday.month, p[i].birthday.day, p[i].flag);
}
return 0;
}
```
函数get_all_person接受一个person结构体数组p和整型n,将从每个身份证号中获得出生年、月、日,判定身份证校验位是否正确,并保存至结构体中。在函数内部,使用for循环遍历结构体数组p中的每个元素,调用get_birthday_from_ID函数获取出生年月,并调用checkID函数判断身份证校验位是否正确,最后将结果保存至结构体中。
阅读全文