使用C语言输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。 输入格式: 输入第一行给出正整数n(<10)。随后n行,每行按照“姓名 生日 电话号码”的格式给出一位朋友的信息,其中“姓名”是长度不超过10的英文字母组成的字符串,“生日”是yyyymmdd格式的日期,“电话号码”是不超过17位的数字及+、-组成的字符串。 输出格式: 按照年龄从大到小输出朋友的信息,格式同输出。
时间: 2024-03-18 10:40:11 浏览: 111
输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。
5星 · 资源好评率100%
以下是使用 C 语言实现该题的代码:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_N 10
#define MAX_NAME_LEN 11
#define MAX_DATE_LEN 9
#define MAX_PHONE_LEN 18
struct Friend {
char name[MAX_NAME_LEN]; // 姓名
char date[MAX_DATE_LEN]; // 生日
char phone[MAX_PHONE_LEN]; // 电话号码
int age; // 年龄
};
// 按照年龄从大到小排序的比较函数
int cmp(const void *a, const void *b) {
struct Friend *pa = (struct Friend *)a;
struct Friend *pb = (struct Friend *)b;
return pb->age - pa->age;
}
// 计算年龄
int calc_age(char *date) {
int year = atoi(date) / 10000;
int month = atoi(date) % 10000 / 100;
int day = atoi(date) % 100;
int now_year = 2022; // 当前年份
int now_month = 2; // 当前月份
int now_day = 6; // 当前日期(假设为2022年2月6日)
int age = now_year - year;
if (month > now_month || (month == now_month && day > now_day)) {
age--;
}
return age;
}
int main() {
int n;
scanf("%d", &n);
struct Friend friends[MAX_N];
for (int i = 0; i < n; i++) {
scanf("%s %s %s", friends[i].name, friends[i].date, friends[i].phone);
friends[i].age = calc_age(friends[i].date);
}
// 按照年龄从大到小排序
qsort(friends, n, sizeof(struct Friend), cmp);
// 输出通讯录
for (int i = 0; i < n; i++) {
printf("%s %s %s\n", friends[i].name, friends[i].date, friends[i].phone);
}
return 0;
}
```
代码思路如下:
1. 定义一个 `Friend` 结构体,包含姓名、生日、电话号码和年龄等信息。
2. 读取输入的朋友信息,并计算每个朋友的年龄。
3. 使用 `qsort()` 函数按照年龄从大到小排序。
4. 输出排好序的通讯录。
注意事项:
1. 姓名的长度不超过 10,需要用长度为 11 的字符数组存储,以便存储字符串结尾的空字符。
2. 生日的格式为 yyyymmdd,需要用长度为 9 的字符数组存储,以便存储字符串结尾的空字符。
3. 电话号码的长度不超过 17,需要用长度为 18 的字符数组存储,以便存储字符串结尾的空字符。
4. `calc_age()` 函数用于计算年龄,需要首先将生日转换为年、月、日三个整数,再根据当前日期和生日计算年龄。
5. `qsort()` 函数用于排序,需要自定义一个比较函数 `cmp()`,按照年龄从大到小排序。
阅读全文