题目描述 设计一个结构体类型,包含姓名、出生日期。其中出生日期又包含年、月、日三部分信息。输入n个好友的信息,输出年龄最小的好友的姓名和出生日期。 输入 首先输入一个整数n(1<=n<=10),表示好友人数,然后输入n行,每行包含一个好友的信息:姓名(不超过8位)以及三个整数,分别表示出生日期的年月日。 输出 输出年龄最小的好友的姓名和出生日期,用空格隔开,出生日期的输出格式见输出样例。 样例输入 Copy 3 Zhangling 1983 2 4 Wangliang 1983 12 11 Fangfang 1985 6 1 样例输出 Copy Fangfang 1985-06-01
时间: 2024-03-24 20:39:20 浏览: 73
这是一道结构体嵌套的题目,可以用一个结构体表示日期,另一个结构体表示好友信息。计算年龄时,可以先将当前日期和好友的出生日期都转化为天数,然后相减得到天数差,最后将天数差转化为年龄。
以下是 C++ 代码实现:
```cpp
#include <iostream>
#include <string>
using namespace std;
struct Date {
int year;
int month;
int day;
};
struct Friend {
string name;
Date birth_date;
};
int days_in_month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool is_leap_year(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int days_in_year(int year) {
return is_leap_year(year) ? 366 : 365;
}
int days_in_month_of_year(int year, int month) {
if (month == 2 && is_leap_year(year)) {
return 29;
} else {
return days_in_month[month];
}
}
int days_between_dates(Date d1, Date d2) {
int days = 0;
for (int i = d1.year; i < d2.year; i++) {
days += days_in_year(i);
}
for (int i = 1; i < d2.month; i++) {
days += days_in_month_of_year(d2.year, i);
}
days += d2.day;
for (int i = 1; i < d1.month; i++) {
days -= days_in_month_of_year(d1.year, i);
}
days -= d1.day;
return days;
}
int main() {
int n;
cin >> n;
Friend min_friend;
Date current_date = {2022, 12, 31}; // 假设当前日期为 2022 年 12 月 31 日
int min_days = days_between_dates(min_friend.birth_date, current_date);
for (int i = 0; i < n; i++) {
Friend f;
cin >> f.name >> f.birth_date.year >> f.birth_date.month >> f.birth_date.day;
int days = days_between_dates(f.birth_date, current_date);
if (days < min_days) { // 更新年龄最小的好友
min_friend = f;
min_days = days;
}
}
cout << min_friend.name << " ";
printf("%04d-%02d-%02d\n", min_friend.birth_date.year, min_friend.birth_date.month, min_friend.birth_date.day);
return 0;
}
```
输入格式为:
```
3
Zhangling 1983 2 4
Wangliang 1983 12 11
Fangfang 1985 6 1
```
输出格式为:
```
Fangfang 1985-06-01
```
阅读全文