如何用C语言编写一个程序,该程序接受用户输入n(n小于20)个身份证号码,然后通过解析第7至14位作为出生日期来计算每个人的年龄,并按照年龄从大到小的顺序进行排序和输出?请提供必要的步骤,包括定义和实现自定义函数处理身份证号和计算年龄的部分。
时间: 2024-12-29 09:28:42 浏览: 116
在C语言中,要实现这个程序,你需要遵循以下步骤:
1. 定义数据结构和全局变量:
首先,你可以创建一个结构体来表示一个人的信息,包含身份证号和年龄两个字段。同时,定义一个数组来存储用户输入的身份证信息,以及一个整型变量用于存储当前的人数。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char id[18];
int age;
} Person;
Person people[20]; // 存储最大20个人
int numPeople = 0; // 当前人数
```
2. 输入身份证号码并计算年龄:
定义一个函数 `getAndCalculateAge()` 来获取用户的输入并计算年龄。对于身份证号码的解析,中国身份证号码的第7至14位代表出生年月日,减去当前年份即可得到年龄。注意需要处理闰年的情况。
```c
void getAndCalculateAge() {
for (int i = 0; i < numPeople && numPeople < 20; ++i) {
printf("请输入第%d个人的身份证号码: ", i + 1);
fgets(people[i].id, sizeof(people[i].id), stdin); // 读取全行
people[i].id[strcspn(people[i].id, "\n")] = '\0'; // 清除换行符
int yearOfBirth = atoi(&people[i].id[6]) - 1900;
int monthOfBirth = atoi(&people[i].id[8]);
int dayOfBirth = atoi(&people[i].id[9]);
time_t current_time = time(NULL);
struct tm *timeinfo = localtime(¤t_time);
int current_year = timeinfo->tm_year + 1900;
int age = (current_year - yearOfBirth) - ((current_month < monthOfBirth) || ((current_month == monthOfBirth) && (current_day < dayOfBirth)) ? 0 : 1);
people[i].age = age;
}
}
```
3. 排序和输出:
定义另一个函数 `sortByAge()` 对数组按年龄降序排列,然后遍历输出每个人的信息。
```c
void sortByAge() {
qsort(people, numPeople, sizeof(Person), compareAge); // 使用qsort函数进行排序
}
int compareAge(const void *a, const void *b) {
return (*(const Person *) b).age - (*(const Person *) a).age;
}
void displaySortedPeople() {
printf("\n姓名\t身份证号\t年龄\n");
for (int i = 0; i < numPeople; ++i) {
printf("%s\t%s\t%d\n", "未提供", people[i].id, people[i].age);
}
}
```
4. 主函数:
在`main()` 函数里,调用上述函数完成整个流程。
```c
int main() {
getAndCalculateAge();
sortByAge();
displaySortedPeople();
return 0;
}
```
现在,当你运行这个程序时,它会提示用户输入身份证号码,并根据提供的信息计算和显示每个人的年龄,按年龄从大到小排序。记得处理可能出现的错误情况,如无效的输入或超出数组大小等。
阅读全文