用c编写一个,#include <stdio.h> #include <string.h> #define N 100 struct birth { int year; int month; int day; }; struct person { char ID[19]; char name[20]; struct birth birthday; int flag;//校验位是否正确, 1代表正确,0代表错误 }; int read(struct person p[]) { FILE *fp; int count=0; fp=fopen("person.txt",'r'); if(fp==NULL){ printf("Failed to open file.\n"); return -1; } while(fscanf(fp,"%s%s%d%d%d%d",p[count].ID,p[count].name, &p[count].birthday.year,&p[count].birthday.month, &p[count].birthday.day,&p[count].flag)!=EOF){ count++; } fclose(fp); return count; } int checkID(char *ID) { int weight[18]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//ID号码权重 char checkcode[11]={1,0,'X',9,8,7,6,5,4,3,2};//校验码字符 int sum=0;//加权和 int i; if(strlen(ID)!=18){ return 0; } for(i=0;i<17;i++){ if(!isdigit(ID[i])){//isdigit=? return 0; } } for(i=0;i<17;i++){ // sum+=ID[i]*weight[i]; sum+=(ID[i]-'0')*weight[i]; } int code; code=sum%11; if(ID[17]==checkcode[code]){ return 1; } else{ return 0; } } struct birth get_birth(char *ID) { int i,j; struct birth b; char year_s[5]={0}, month_s[3]={0}, day_s[3]={0}; for(i=6,j=0;j<4;i++,j++){ year_s[j]=ID[i]; } for(i=10,j=0;j<2;i++,j++){ month_s[j]=ID[i]; } for(i=12,j=0;j<2;i++,j++){ day_s[j]=ID[i]; } //将字符串转换为整型 b.year=(year_s[0]-'0')*1000+(year_s[1]-'0')*100+ (year_s[2]-'0')*10+(year_s[3]-'0'); b.month=(month_s[0]-'0')*10+(month_s[1]-'0'); b.day=(day_s[0]-'0')*10+(day_s[1]-'0'); return b; } void get_all_person(struct person p[], int n) { int i; for(i=0;i<n;i++){ struct birth b=get_birth(p[i].ID); if(checkID(p[i].ID)){ p[i].birthday=b; p[i].flag=1; } else{ p[i].flag=0; } } }void save(struct person p[],int n); 将身份证号码正确的数据(身份证号码、姓名、出生年月日)写入文件person_checked.txt的函数。其中数组 p 中存放 n 个公民信息。
时间: 2023-06-25 20:05:02 浏览: 139
void save(struct person p[], int n) {
FILE *fp;
fp = fopen("person_checked.txt", "w");
if (fp == NULL) {
printf("Failed to open file.\n");
return;
}
int i;
for (i = 0; i < n; i++) {
if (p[i].flag == 1) {
fprintf(fp, "%s %s %d-%02d-%02d\n", p[i].ID, p[i].name, p[i].birthday.year, p[i].birthday.month, p[i].birthday.day);
}
}
fclose(fp);
}
相关问题
用c编写,程序开始时,自动从文件读入信息到结构体数组,并提取每个公民的出生年月放入结构体中,同时进行身份证校验位是否正确,判断信息也放入结构体中。用户选择1时,显示校验位正确的公民信息;用户选择1时,显示校验位正确的公民信息;用户选择2时,显示校验位错误的公民信息,并统计人数。用户选择2时,显示校验位错误的公民信息,并统计人数。用户选择3时,将正确公民信息按出生日期排序并输出。 用户选择4时,在正确公民信息中查找和指定姓名同名的人数。若用户选择0,会退出程序,但在此之前,会自动将身份证号码正确的数据写入文件person_checked.txt中。补全主函数,#include <stdio.h> #include <string.h> #define N 100 struct birth { int year; int month; int day; }; struct person { char ID[19]; char name[20]; struct birth birthday; int flag;//校验位是否正确, 1代表正确,0代表错误 }; int read(struct person p[]); int checkID(char *ID); struct birth get_birth(char *ID); void get_all_person(struct person p[], int n); void display_person(struct person p[], int n, int flag); int birth_cmp(struct birth birth1, struct birth birth2); void birth_sort(struct person p[], int n); int search(struct person p[], int n, char *name); void save(struct person p[], int n); int prompt(void); int main(void) { struct person p[N]; int cmd, n; while (1) { cmd = prompt(); } return 0; }
#include <stdio.h>
#include <string.h>
#define N 100
struct birth {
int year;
int month;
int day;
};
struct person {
char ID[19];
char name[20];
struct birth birthday;
int flag;//校验位是否正确, 1代表正确,0代表错误
};
int read(struct person p[]);
int checkID(char *ID);
struct birth get_birth(char *ID);
void get_all_person(struct person p[], int n);
void display_person(struct person p[], int n, int flag);
int birth_cmp(struct birth birth1, struct birth birth2);
void birth_sort(struct person p[], int n);
int search(struct person p[], int n, char *name);
void save(struct person p[], int n);
int prompt(void);
int main(void) {
struct person p[N];
int cmd, n;
n = read(p); // 读入信息到结构体数组
while (1) {
cmd = prompt();
switch (cmd) {
case 0:
save(p, n); // 将身份证号码正确的数据写入文件person_checked.txt中
return 0;
case 1:
display_person(p, n, 1); // 显示校验位正确的公民信息
break;
case 2:
display_person(p, n, 0); // 显示校验位错误的公民信息,并统计人数
break;
case 3:
birth_sort(p, n); // 将正确公民信息按出生日期排序并输出
break;
case 4:
char name[20];
printf("请输入姓名:");
scanf("%s", name);
int count = search(p, n, name); // 在正确公民信息中查找和指定姓名同名的人数
printf("与%s同名的人数为:%d\n", name, count);
break;
default:
printf("无效的选项!\n");
break;
}
}
}
// 从文件读入信息到结构体数组,并提取每个公民的出生年月放入结构体中,同时进行身份证校验位是否正确,判断信息也放入结构体中
int read(struct person p[]) {
FILE *fp;
fp = fopen("person.txt", "r");
if (fp == NULL) {
printf("打开文件失败!\n");
return 0;
}
int n = 0;
while (!feof(fp) && n < N) {
fscanf(fp, "%s%s", p[n].ID, p[n].name);
p[n].birthday = get_birth(p[n].ID);
p[n].flag = checkID(p[n].ID);
n++;
}
fclose(fp);
return n;
}
// 身份证校验位验证
int checkID(char *ID) {
int weight[18] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; // 加权因子
char check_code[11] = "10X98765432"; // 校验码
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += (ID[i] - '0') * weight[i];
}
int mod = sum % 11;
char code = check_code[mod];
if (ID[17] == code) {
return 1; // 校验位正确
} else {
return 0; // 校验位错误
}
}
// 根据身份证号码提取出生年月
struct birth get_birth(char *ID) {
struct birth birthday;
birthday.year = (ID[6] - '0') * 1000 + (ID[7] - '0') * 100 + (ID[8] - '0') * 10 + (ID[9] - '0');
birthday.month = (ID[10] - '0') * 10 + (ID[11] - '0');
birthday.day = (ID[12] - '0') * 10 + (ID[13] - '0');
return birthday;
}
// 获取所有公民信息
void get_all_person(struct person p[], int n) {
printf("所有公民信息如下:\n");
for (int i = 0; i < n; i++) {
printf("%s\t%s\t%d-%02d-%02d\t%s\n", p[i].ID, p[i].name, p[i].birthday.year, p[i].birthday.month, p[i].birthday.day, p[i].flag ? "校验位正确" : "校验位错误");
}
}
// 显示校验位正确或错误的公民信息,并统计人数
void display_person(struct person p[], int n, int flag) {
printf("校验位%s的公民信息如下:\n", flag ? "正确" : "错误");
int count = 0;
for (int i = 0; i < n; i++) {
if (p[i].flag == flag) {
printf("%s\t%s\t%d-%02d-%02d\n", p[i].ID, p[i].name, p[i].birthday.year, p[i].birthday.month, p[i].birthday.day);
count++;
}
}
printf("共%d人\n", count);
}
// 比较两个出生日期的大小,返回值小于0表示birth1早于birth2,等于0表示相等,大于0表示birth1晚于birth2
int birth_cmp(struct birth birth1, struct birth birth2) {
if (birth1.year != birth2.year) {
return birth1.year - birth2.year;
} else if (birth1.month != birth2.month) {
return birth1.month - birth2.month;
} else {
return birth1.day - birth2.day;
}
}
// 将正确公民信息按出生日期排序并输出
void birth_sort(struct person p[], int n) {
// 冒泡排序
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (birth_cmp(p[j].birthday, p[j + 1].birthday) > 0) {
struct person tmp = p[j];
p[j] = p[j + 1];
p[j + 1] = tmp;
}
}
}
printf("按出生日期排序后的公民信息如下:\n");
for (int i = 0; i < n; i++) {
if (p[i].flag == 1) {
printf("%s\t%s\t%d-%02d-%02d\n", p[i].ID, p[i].name, p[i].birthday.year, p[i].birthday.month, p[i].birthday.day);
}
}
}
// 在正确公民信息中查找和指定姓名同名的人数
int search(struct person p[], int n, char *name) {
int count = 0;
for (int i = 0; i < n; i++) {
if (p[i].flag == 1 && strcmp(p[i].name, name) == 0) {
count++;
}
}
return count;
}
// 将身份证号码正确的数据写入文件person_checked.txt中
void save(struct person p[], int n) {
FILE *fp;
fp = fopen("person_checked.txt", "w");
if (fp == NULL) {
printf("打开文件失败!\n");
return;
}
for (int i = 0; i < n; i++) {
if (p[i].flag == 1) {
fprintf(fp, "%s\t%s\t%d-%02d-%02d\n", p[i].ID, p[i].name, p[i].birthday.year, p[i].birthday.month, p[i].birthday.day);
}
}
fclose(fp);
}
// 显示菜单并获取用户输入的选项
int prompt(void) {
printf("\n请选择要执行的操作:\n");
printf("0. 退出程序\n");
printf("1. 显示校验位正确的公民信息\n");
printf("2. 显示校验位错误的公民信息,并统计人数\n");
printf("3. 将正确公民信息按出生日期排序并输出\n");
printf("4. 在正确公民信息中查找和指定姓名同名的人数\n");
printf("请输入选项:");
int cmd;
scanf("%d", &cmd);
return cmd;
}
帮我写一个查找身份证省份的函数,输入地区编号,输出对应公民信息,主函数只能用来调用函数。#include <stdio.h> #include <string.h> #define N 100 struct birth { int year; int month; int day; }; struct person { char ID[19]; char name[20]; struct birth birthday; int flag;//校验位是否正确, 1代表正确,0代表错误 };每行代码注释清楚
好的,我来帮您写一个查找身份证省份的函数。
首先,需要准备一个存储公民信息的数组,该数组中每个元素存储一个公民的信息,包括身份证号、姓名、生日和校验位。
代码如下:
```c
#define N 100
struct birth {
int year;
int month;
int day;
};
struct person {
char ID[19];
char name[20];
struct birth birthday;
int flag; // 校验位是否正确,1代表正确,0代表错误
};
struct person citizens[N]; // 存储公民信息的数组
```
接下来,我们需要编写一个函数来根据地区编号查找对应的公民信息。假设地区编号为一个整数,函数原型如下:
```c
void search_citizen(int area_code);
```
该函数的实现思路如下:
1. 遍历存储公民信息的数组,查找每个公民的身份证号中前6位是否与地区编号匹配。
2. 如果匹配,则输出该公民的信息,包括姓名、生日和校验位是否正确。
代码实现如下:
```c
#include <stdio.h>
#include <string.h>
#define N 100
struct birth {
int year;
int month;
int day;
};
struct person {
char ID[19];
char name[20];
struct birth birthday;
int flag; // 校验位是否正确,1代表正确,0代表错误
};
struct person citizens[N]; // 存储公民信息的数组
void search_citizen(int area_code) {
int i;
for (i = 0; i < N; i++) {
char area[7];
strncpy(area, citizens[i].ID, 6); // 截取身份证号前6位
area[6] = '\0'; // 字符串结尾
if (area_code == atoi(area)) { // 匹配地区编号
printf("姓名:%s\n", citizens[i].name);
printf("生日:%d年%d月%d日\n", citizens[i].birthday.year, citizens[i].birthday.month, citizens[i].birthday.day);
if (citizens[i].flag == 1) {
printf("校验位正确\n");
} else {
printf("校验位错误\n");
}
}
}
}
int main() {
// 在这里调用 search_citizen 函数,并传入地区编号参数
search_citizen(110101);
return 0;
}
```
其中,使用 `strncpy` 函数截取身份证号前6位,使用 `atoi` 函数将字符串转换为整数进行匹配。在主函数中,调用 `search_citizen` 函数,并传入地区编号参数。
阅读全文