最小生日差值计算(运算符重载)
时间: 2023-07-11 17:30:25 浏览: 259
题目描述
定义一个学生类Student,包含该学生的姓名、出生年、月、日 ,重定义 “-”号实现两个学生之间相差多少天的比较。并利用重载的“-”运算符,求所有学生中年龄相差最小的两个人的名字以及相差天数。
输入
第一行:输入所需要输入的学生个数;
第二行开始,依次输入每个学生的姓名、出生年、月、日。
输出
输出年龄相差最小的两个人的名字以及相差天数,名字的输出顺序按输入的先后,天数大于等于0。
输入样例
3
Tom 1995 1 1
Joe 1995 2 28
Jimmy 1996 1 8
输出样例
Tom和Joe年龄相差最小,为58天。
代码实现
```cpp
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
class Student
{
public:
string name;
int year, month, day;
int days;//存储距离1970年1月1日的天数
Student() {}
Student(string name, int year, int month, int day)
{
this->name = name;
this->year = year;
this->month = month;
this->day = day;
days = getDays(year, month, day);
}
int getDays(int year, int month, int day)
{
int days = 0;
int months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
for(int i = 1970; i < year; i++)
{
if((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
{
days += 366;//闰年
}
else
{
days += 365;//平年
}
}
for(int i = 1; i < month; i++)
{
if(i == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
{
days += 29;//闰年的2月
}
else
{
days += months[i];//其他月份
}
}
days += day;//加上天数
return days;
}
int operator - (const Student &s)
{
return abs(days - s.days);
}
};
int main()
{
int n;
cin >> n;
Student s[n];
for(int i = 0; i < n; i++)
{
string name;
int year, month, day;
cin >> name >> year >> month >> day;
s[i] = Student(name, year, month, day);
}
int minDiff = 0x7fffffff;
string name1, name2;
for(int i = 0; i < n; i++)
{
for(int j = i + 1; j < n; j++)
{
int diff = s[i] - s[j];
if(diff < minDiff)
{
minDiff = diff;
name1 = s[i].name;
name2 = s[j].name;
}
}
}
cout << name1 << "和" << name2 << "年龄相差最小,为" << minDiff << "天。" << endl;
return 0;
}
```
阅读全文