程序开始时,自动从文件读入信息到结构体数组,并提取每个公民的出生年月放入结构体中,同时进行身份证校验位是否正确,判断信息也放入结构体中2.用户选择1时,显示校验位正确的公民信息;用户选择2时,显示校验位错误的公民信息,并统计人数
时间: 2024-06-08 10:07:21 浏览: 95
好的,这个任务可以使用 C 语言来完成。
首先,我们需要定义一个结构体,用来存储每个公民的信息,包括姓名、身份证号码、出生年月等等。代码如下:
```c
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 1000
struct Citizen {
char name[20];
char id[19];
int year;
int month;
int day;
};
int main() {
struct Citizen citizens[MAX_SIZE];
int num_citizens = 0;
// 从文件中读取公民信息
FILE* fp = fopen("citizens.txt", "r");
if (fp == NULL) {
printf("Failed to open file.\n");
return 1;
}
char line[100];
while (fgets(line, sizeof(line), fp) != NULL) {
// 解析一行数据,将姓名、身份证号、出生年月等信息存入结构体中
char name[20];
char id[19];
int year, month, day;
sscanf(line, "%s %s %d-%d-%d", name, id, &year, &month, &day);
// 校验身份证号的校验位是否正确
int nums[17];
for (int i = 0; i < 17; i++) {
nums[i] = id[i] - '0';
}
int factors[18] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char check_codes[11] = "10X98765432";
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += nums[i] * factors[i];
}
int index = sum % 11;
char check_code = check_codes[index];
if (check_code != id[17]) {
printf("Invalid ID: %s\n", id);
continue;
}
// 将公民信息存入结构体中
struct Citizen c;
strcpy(c.name, name);
strcpy(c.id, id);
c.year = year;
c.month = month;
c.day = day;
citizens[num_citizens++] = c;
}
fclose(fp);
// 用户选择1,显示校验位正确的公民信息
printf("Correct:\n");
for (int i = 0; i < num_citizens; i++) {
struct Citizen c = citizens[i];
int nums[17];
for (int j = 0; j < 17; j++) {
nums[j] = c.id[j] - '0';
}
int factors[18] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char check_codes[11] = "10X98765432";
int sum = 0;
for (int j = 0; j < 17; j++) {
sum += nums[j] * factors[j];
}
int index = sum % 11;
char check_code = check_codes[index];
if (check_code == c.id[17]) {
printf("%s %s %04d-%02d-%02d\n", c.name, c.id, c.year, c.month, c.day);
}
}
// 用户选择2,显示校验位错误的公民信息,并统计人数
printf("Incorrect:\n");
int num_incorrect = 0;
for (int i = 0; i < num_citizens; i++) {
struct Citizen c = citizens[i];
int nums[17];
for (int j = 0; j < 17; j++) {
nums[j] = c.id[j] - '0';
}
int factors[18] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char check_codes[11] = "10X98765432";
int sum = 0;
for (int j = 0; j < 17; j++) {
sum += nums[j] * factors[j];
}
int index = sum % 11;
char check_code = check_codes[index];
if (check_code != c.id[17]) {
printf("%s %s %04d-%02d-%02d\n", c.name, c.id, c.year, c.month, c.day);
num_incorrect++;
}
}
printf("Number of incorrect IDs: %d\n", num_incorrect);
return 0;
}
```
在这个代码中,我们首先定义了一个结构体 Citizen,用来存储每个公民的信息。然后,我们从文件中读取公民信息,并将每个公民的信息存入结构体数组中。
在存储信息之前,我们需要对身份证号的校验位进行校验,判断其是否正确。如果校验位不正确,则将该公民信息忽略掉。
接下来,用户可以选择1或2,进行相应的操作。如果用户选择1,则遍历结构体数组,找出校验位正确的公民信息,并将这些信息打印出来。如果用户选择2,则遍历结构体数组,找出校验位错误的公民信息,并将这些信息打印出来,并统计校验位错误的公民数量。
注意,为了计算校验位,我们需要先将身份证号码中的前17位转换成数字,然后按照规定的因子进行加权求和,最后根据得到的结果计算出校验位。如果校验位与身份证号码中的最后一位不一致,则说明身份证号码不合法。
希望这个代码能够帮助你完成任务。如果还有其他问题,请随时提出。
阅读全文