12-D. 学生生日差值计算(运算符重载)

实验12-运算符重载-
题目描述
定义一个学生类Student,包含该学生的姓名、出生年、月、日 ,重定义 “-”号实现两个学生之间相差多少天的比较。并利用重载的“-”运算符,求所有学生中年龄相差最大的两个人的名字以及相差天数。

输入
第一行:输入所需要输入的学生个数;
第二行开始,依次输入每个学生的姓名、出生年、月、日。

输出
输出年龄相差最大的两个人的名字以及相差天数。

输入样例
3
Tom 1995 1 1
Joe 1995 2 28
Jimmy 1996 1 8

输出样例
Tom和Jimmy年龄相差最大,为372天。

计算时间差值的方法很重要

#include<iostream>
using namespace std;

class Cdate
{
    int year,month,day;
public:
    Cdate(int y,int m,int d):year(y),month(m),day(d){}
    int leap(int y)//如果是闰年返回1,如果不是返回0
    {
        int x;
        if((y%4==0&&y%100!=0)||(y%100==0&&y%400==0))
            x=1;
        else
            x=0;
        return x;
    }
    int daysbetween(Cdate c,int flag)
    {
        int sum,i;
        int days[12]={31,29,31,30,31,30,31,31,30,31,30,31};
        int daysleap[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        
        if(leap(c.year))//是闰年
        {
            if(flag)
            {
                sum=c.day;
                for(i=0;i<c.month-1;i++)
                    sum+=days[i];
            }
            else
            {
                sum=days[c.month-1]-c.day;
                for(i=c.month;i<12;i++)
                    sum+=days[i];
            }
        }
        else
        {
            if(flag)
            {
                sum=c.day;
                for(i=0;i<c.month-1;i++)
                    sum+=days[i];
            }
            else
            {
                sum=daysleap[c.month-1]-c.day;
                for(i=c.month;i<12;i++)
                    sum+=daysleap[i];
            }
        }
        return sum;
    }
    int date(Cdate c1,Cdate c2)//最终得出结果的函数->两个日期之间相差多少天
    {
        int y,days;
        if(c1.year!=c2.year)
        {
            days=daysbetween(c1,0);
            for(y=c1.year+1;y<=c2.year;y++)
            {
                if(leap(y))
                    days+=366;
                else
                    days+=365;
            }
            days-=daysbetween(c2,0);
        }
        else if(c1.year==c2.year&&c1.month!=c2.month)
            days=daysbetween(c1,0)-daysbetween(c2,0);
        else if(c1.year==c2.year && c1.month==c2.month && c1.day!=c2.day)
            days=c2.day-c1.day;
        
        return days;
    }
    friend class student;
};

class student
{
    string name;
    int year,month,day;
public:
    student(){}
    student(string n,int y,int m,int d):name(n),year(y),month(m),day(d){}
    void setstu(string n,int y,int m,int d)
    {
        name=n;year=y;month=m;day=d;
    }
    int operator-(student &s)
    {
        Cdate s1(year,month,day);
        Cdate s2(s.year,s.month,s.day);
        
        int sum=s2.date(s1,s2);
        //cout<<name<<" "<<s.name<<sum<<" "<<endl;
        return sum;
    }
    void print(student &s1,student &s2,int max)//岁数大的在前
    {
        cout<<s2.name<<"和"<<s1.name<<"年龄相差最大,为"<<s2-s1<<"天。"<<endl;
    }
};

int main()
{
    int n,i,y,m,d,j;
    string name;
    
    cin>>n;
    student s[n];
    for(i=0;i<n;i++)
    {
        cin>>name>>y>>m>>d;
        s[i].setstu(name,y,m,d);
    }
    
    int max=-1;
    student s1,s2;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
            if(i==j);//自己不与自己比较
            else
            {
                if(s[j]-s[i]>max)
                {
                    max=s[j]-s[i];
                    s1=s[i];s2=s[j];
                }
            }
            
        }
    
    s1.print(s1,s2,max);
    
    return 0;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值