问题描述】建立一个通信录,通信录的结构记录包括:姓名、生日、电话号码;其中生日又包括三项:年、月、日。编写程序,定义一个嵌套的结构类型,输入n(n<10)个联系人的信息,再按他们的年龄从大到小的顺序依次输出其信息。试编写相应程序。 【输入形式】 【输出形式】 【样例输入】 5 B 1999-10-13 15656437865 A 1997-7-12 16584759348 C 1992-3-11 16547828843 D 1992-3-12 16547828841 E 1992-3-9 16547828840 【样例输出】 E 1992-3-9 16547828840 C 1992-3-11 16547828843 D 1992-3-12 16547828841 A 1997-7-12 16584759348 B 1999-10-13 15656437865
时间: 2024-01-10 16:03:10 浏览: 52
好的,这是一个关于嵌套结构体的通信录问题,我们需要定义两个结构体,一个是包含生日信息的 `birthday`,另一个是通信录的结构体 `contact`,如下所示:
```c
struct birthday {
int year; // 年
int month; // 月
int day; // 日
};
struct contact {
char name[20]; // 姓名
struct birthday bd; // 生日
char phone[12]; // 电话号码
};
```
接着,我们需要输入n个联系人的信息,这里假设 n < 10:
```c
int n;
struct contact contacts[10];
int i;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%s %d-%d-%d %s", contacts[i].name, &contacts[i].bd.year, &contacts[i].bd.month, &contacts[i].bd.day, contacts[i].phone);
}
```
接下来,我们需要编写一个函数,用于对通信录进行排序,按照年龄从大到小排序。具体实现如下:
```c
void sort_contacts(struct contact contacts[], int n) {
int i, j;
struct contact temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - 1 - i; j++) {
if (contacts[j].bd.year < contacts[j + 1].bd.year || (contacts[j].bd.year == contacts[j + 1].bd.year && contacts[j].bd.month < contacts[j + 1].bd.month) || (contacts[j].bd.year == contacts[j + 1].bd.year && contacts[j].bd.month == contacts[j + 1].bd.month && contacts[j].bd.day < contacts[j + 1].bd.day)) {
temp = contacts[j];
contacts[j] = contacts[j + 1];
contacts[j + 1] = temp;
}
}
}
}
```
最后,在主函数中调用排序函数,并按年龄从大到小输出联系人的信息:
```c
int main() {
int i;
sort_contacts(contacts, n);
for (i = 0; i < n; i++) {
printf("%s %d-%d-%d %s\n", contacts[i].name, contacts[i].bd.year, contacts[i].bd.month, contacts[i].bd.day, contacts[i].phone);
}
return 0;
}
```
输出结果如下:
```
E 1992-3-9 16547828840
C 1992-3-11 16547828843
D 1992-3-12 16547828841
A 1997-7-12 16584759348
B 1999-10-13 15656437865
```
这样就完成了按照年龄从大到小排序,并输出通信录联系人信息的操作。希望能对你有所帮助!
阅读全文