类和对象(4)——补充内容+DateOJ题

一,static成员

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。
特点:

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
  2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
  3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制

例题

在这里插入图片描述

class Sum
{
public:
    Sum()
    {
        _ret+=_i;
        _i++;
    }
    static int GetSum()
    {
        return _ret;
    }
private:
    static int _i;
    static int _ret;
};
int Sum::_i=1;
int Sum::_ret=0;
class Solution {
public:
    int Sum_Solution(int n) {
        Sum sun[n];
        return Sum::GetSum();
    }
};

因为static定义的变量是所有成员共同拥有的,所以要计算n次,那么就调用n次的构造即可。

二,DateOJ题

一,计算日期到天数转换

在这里插入图片描述
在这里插入图片描述

1.1分析

从题目要求出发,我们先计算给出的月份距离一月的天数,然后再加上day。我们这里计算月份的天数可以用数组来计算。

1.2代码

#include <iostream>
using namespace std;

int main() {
    int year,month,day;
    cin>>year>>month>>day;
    int GetDay[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};
    int n=GetDay[month-1]+day;
    if(month > 2 && ((year%4==0 && year%100!=0)||(year%400==0)))
    {
        n+=1;
    }
    cout<<n<<endl;
}

二,日期差值

在这里插入图片描述

2.1分析

我们有了上一题的代码,我们就可以先算出两个(month+day)的差值然后再计算year之间的差。

2.2代码

#include <iostream>
using namespace std;
int Getday(int year, int month,int day)
{
    int GetDay[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};
    int n=GetDay[month-1]+day;
    if(month > 2 && ((year%4==0 && year%100!=0)||(year%400==0)))
    {
        n+=1;
    }
    return n;
}
int main() {
	int year1,month1,day1;
	int year2,month2,day2;
	int ret=0;
	while (scanf("%04d%02d%02d\n%04d%02d%02d", &year1, &month1, &day1, &year2, &month2, &day2) != EOF)
    {
        int num1=Getday(year1,month1,day1);
        int num2=Getday(year2,month2,day2);
        int ret=0;
        if(num1>num2)
        {
            ret=num1-num2;
        }
        else {
        ret=num2-num1;
        }
        int max=year1,min=year2;
        if(max<year2)
        {
            max=year2;
            min=year1;
        }
        while(min!=max)
        {
            if((min%4==0 && min%100!=0)||(min%400==0))
            {
                ret+=366;
            }
            else {
            ret+=365;
            }
            min++;
        }
        cout<<ret+1<<endl;
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

三,打印日期

在这里插入图片描述

3.1分析

第n天减去每个月份的天数,然后月份++

3.2代码

#include <iostream>
using namespace std;
int dayTab[2][13] = {
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int IsLeapYear(int year) {           //是否为闰年
    if((year % 4 == 0 && year % 100 != 0 ) || (year % 400 == 0))
    {
        return 1;
    }
    else {
        return 0;
    }
}
int main() {
    int year, month, day, number;
    while (scanf("%d%d", &year, &number) != EOF) {
        month=0;
        int row =IsLeapYear(year);
        while(number>dayTab[row][month])
        {
            number-=dayTab[row][month];
            month++;
        }
        day=number;               
        printf("%04d-%02d-%02d\n",year,month,day);
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

四,日期累加

在这里插入图片描述

4.1分析

这个题和上面的打印日期非常的像,我们多加一个year的考虑即可

4.2代码

#include <iostream>
using namespace std;
int dayTab[2][13] = {
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int IsLeapYear(int year) {           //是否为闰年
    if((year % 4 == 0 && year % 100 != 0 ) || (year % 400 == 0))
    {
        return 1;
    }
    else {
        return 0;
    }
}
int main() {
    int year, month, day, n, number;
    scanf("%d", &n);
    while (n--) {
        scanf("%d %d %d %d", &year, &month, &day, &number);
        day+=number;
        int row =IsLeapYear(year);
        while(day>dayTab[row][month])
        {
            day-=dayTab[row][month];
            month++;
            if(month>12)
            {
                month=1;
                year++;
                row =IsLeapYear(year);
            }
        }
        printf("%04d-%02d-%02d\n",year,month,day);
    }
}
// 64 位输出请用 printf("%lld")
  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tpoog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值