学生生日差值计算(运算符重载)
题目描述
定义一个学生类Student,包含该学生的姓名、出生年、月、日 ,重定义 “-”号实现两个学生之间相差多少天的比较。并利用重载的“-”运算符,求所有学生中年龄相差最大的两个人的名字以及相差天数。
输入
第一行:输入所需要输入的学生个数;
第二行开始,依次输入每个学生的姓名、出生年、月、日。
输出
输出年龄相差最大的两个人的名字以及相差天数。
样例输入
3
Tom 1995 1 1
Joe 1995 2 28
Jimmy 1996 1 8
样例输出
Tom和Jimmy年龄相差最大,为372天。
c++实现
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
#pragma warning(disable:4996)
class Birth {
int year, mon, day;
char *name;
public:
Birth(){}
void set(char *p,int y, int m, int d) {
name = new char(strlen(p) + 1);
strcpy(name, p);
year = y;
mon = m;
day = d;
}
bool IsLeap(int year)
{
return (year % 4 == 0 || year % 400 == 0) && (year % 100 != 0);
}
int operator-(Birth& b) {
int DAY[12] = { 31,28,31,30,31,30,31,31,30,31,30,31};
int DAY1[12] = { 31,29,31,30,31,30,31,31,30,31,30,31};
int length1=0, length2=0;
if (IsLeap(year)) {
for (int j = 0; j < mon-1; j++) {
length1 += DAY1[j];
}
}
else {
for (int j = 0; j < mon-1; j++) {
length1 += DAY[j];
}
}
length1 += day;
if (IsLeap(b.year)) {
for (int j = 0; j < b.mon-1; j++) {
length2 += DAY1[j];
}
}
else {
for (int j = 0; j < b.mon-1; j++) {
length2 += DAY[j];
}
}
length2 += b.day;
if (year == b.year) {
return abs(length1 - length2);
}
else if (year > b.year) {
int year2 = b.year;
while(year - year2) {
if (IsLeap(year2)) {
length1 += 366;
}
else {
length1 += 365;
}
year2++;
}
return length1-length2;
}
else {
int year2 = year;
while (b.year - year2) {
if (IsLeap(year2)) {
length2 += 366;
}
else {
length2 += 365;
}
year2++;
}
return length2 - length1;
}
}
void printName() {
cout << name;
}
};
int main() {
int t;
char name[20];
int year, mon, day;
cin >> t;
int t1 = t;
Birth *birth=new Birth[t];
int k = 0;
int max = 0;
int maxIndex = 0;
int minIndex = 1;
while (t--) {
cin >> name >> year >> mon >> day;
birth[k].set(name, year, mon, day);
k++;
}
int distance = 0;
for (int i = 0; i < t1-1 ; i++) {
for (int j = i+1; j < t1; j++) {
distance = birth[i] - birth[j];
if (distance > max) {
max = distance;
maxIndex = i;
minIndex = j;
}
}
}
birth[maxIndex].printName();
cout << "和";
birth[minIndex].printName();
cout << "年龄相差最大,为" << birth[maxIndex]-birth[minIndex] << "天。" << endl;
return 0;
}