模拟一个公民身份证信息管理系统。通过读入文件数据,可以查询每个公民的身份证信息等。同时可以进行身份证校验,并将正确的信息保存至指定文件中。程序开始时,自动从文件读入信息到结构体数组,并提取每个公民的出生年月放入结构体中,同时进行身份证校验位是否正确,判断信息也放入结构体中。写一个从身份证号中提取出生年、月、日的函数。其参数 ID 代表一个身份证号,返回对应的birth结构体。
时间: 2024-04-21 17:30:31 浏览: 10
好的,我可以继续帮你完成这个项目。下面是一个提取出生年月日的函数实现:
```cpp
#include <iostream>
#include <string>
using namespace std;
// 定义一个结构体表示出生年月日
struct birth {
int year;
int month;
int day;
};
// 从身份证号中提取出生年月日
birth getBirth(string ID) {
birth b;
b.year = stoi(ID.substr(6, 4));
b.month = stoi(ID.substr(10, 2));
b.day = stoi(ID.substr(12, 2));
return b;
}
int main() {
// 测试代码
string ID = "110101199003074099";
birth b = getBirth(ID);
cout << "出生年月日:" << b.year << "年" << b.month << "月" << b.day << "日" << endl;
return 0;
}
```
这个函数接收一个字符串类型的身份证号码,返回一个出生年月日结构体类型的结果。函数内部使用了 substr 函数从身份证号码的指定位置开始截取指定长度的子串,然后使用 stoi 函数将截取结果转换为整数类型。
希望这个函数能够对你有所帮助!
相关问题
模拟一个公民身份证信息管理系统。通过读入文件数据,可以查询每个公民的身份证信息等。同时可以进行身份证校验,并将正确的信息保存至指定文件中。程序开始时,自动从文件读入信息到结构体数组,并提取每个公民的出生年月放入结构体中,同时进行身份证校验位是否正确,判断信息也放入结构体中。 读取数据文件的函数。其中数组 p 用于存放从文件person.txt中读取到的公民信息,函数返回读取到的公民信息记录数。
好的,这是一个读取数据文件的函数实现思路,供您参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 20 // 定义字符串最大长度
#define MAX_NUM 1000 // 定义最大公民数
// 定义结构体类型
typedef struct {
char name[MAX_LEN]; // 姓名
char id[MAX_LEN]; // 身份证号码
int year; // 出生年份
int month; // 出生月份
int day; // 出生日期
int sex; // 性别,0表示女性,1表示男性
int check; // 身份证校验位,1表示校验正确,0表示校验错误
} Citizen;
// 全局变量,存储公民信息
Citizen citizens[MAX_NUM];
// 根据身份证号码计算校验位是否正确
int check_id(char *id) {
// TODO:实现校验逻辑
}
// 读取数据文件
int read_file(char *filename) {
FILE *fp;
int num = 0;
char line[MAX_LEN * 7]; // 一行最多包含7个字段
char *p;
fp = fopen(filename, "r");
if (fp == NULL) {
printf("无法打开文件 %s\n", filename);
return 0;
}
while (fgets(line, MAX_LEN * 7, fp) != NULL) {
p = strtok(line, " "); // 使用空格分隔字段
// 依次读取姓名、身份证号、出生日期等字段
strcpy(citizens[num].name, p);
p = strtok(NULL, " ");
strcpy(citizens[num].id, p);
// 校验身份证号码
citizens[num].check = check_id(citizens[num].id);
// 如果校验正确,提取出生年月日和性别信息
if (citizens[num].check == 1) {
citizens[num].year = atoi(citizens[num].id + 6);
citizens[num].month = atoi(citizens[num].id + 10);
citizens[num].day = atoi(citizens[num].id + 12);
citizens[num].sex = (citizens[num].id[16] - '0') % 2;
}
num++; // 记录数加一
}
fclose(fp);
return num;
}
```
以上代码中,使用fgets函数逐行读取文件数据,使用strtok函数分隔每行数据中的字段;根据身份证号码计算校验位是否正确,并将校验结果保存到结构体中;如果校验正确,使用atoi函数提取出生年月日和性别信息。函数返回读取到的公民信息记录数。
具体实现还需要考虑很多细节问题,以上代码只是一个大致的思路,您可以根据具体的需求进行编写。
模拟一个公民身份证信息管理系统。通过读入文件数据,可以查询每个公民的身份证信息等。同时可以进行身份证校验,并将正确的信息保存至指定文件中。程序开始时,自动从文件读入信息到结构体数组,并提取每个公民的出生年月放入结构体中,同时进行身份证校验位是否正确,判断信息也放入结构体中。写一个判别身份证校验位是否正确的函数。其中参数 ID 代表一个 18 位身份证号,如果校验位正确,函数返回 1,否则返回 0。
好的,这是一个非常实用的项目!我可以帮你完成身份证校验位判断的函数部分。
首先,身份证号码的前 17 位是地区和出生日期的编码,最后一位是校验位。校验位的计算方法如下:
1. 将身份证号码的前 17 位依次乘以对应的权重因子,权重因子为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。
2. 将乘积相加得到一个累加值 sum。
3. 将累加值 sum 除以 11,得到一个余数 mod。
4. 将余数 mod 转换成一个校验字符,校验字符对应关系如下:
0:1
1:0
2:X
3:9
4:8
5:7
6:6
7:5
8:4
9:3
10:2
5. 将校验字符和身份证号码的第 18 位进行比对,如果相同则校验位正确,返回 1,否则返回 0。
下面是一个 C++ 实现的函数代码示例:
```cpp
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;
}
}
```
这个函数接收一个字符串类型的身份证号码,返回一个整数类型的校验结果(1 表示校验位正确,0 表示校验位错误)。
希望这个函数对你有所帮助!