天天看點

C++--類與對象(下)--相關例題--累加天數--列印日期--日期內插補點--計算日期到天數的轉換--求前N項和累加天數列印對應的日期日期內插補點計算日期到天數的轉換求前N項和

C++相關例題

  • 累加天數
  • 列印對應的日期
  • 日期內插補點
  • 計算日期到天數的轉換
  • 求前N項和

累加天數

要求:設計一個程式能計算一個日期加上若幹天後是什麼日期

這個要求和我們之前在日期相關的例題裡面實作過,大體一緻的.

1.判斷是否是閏年

2.對天數進行判斷,大于當月則減去,并且月份+1

3.一直操作,直到要加的天數為0為止,輸出日期

#include<iostream>
  using namespace std;
   
  int main()
  {
    int n;
    while(cin>>n)		//這裡的是代碼中要累加的數目
    {
      for(int i=0;i<n;i++)		//循環進行
      {
       int y,m,d,num;		//分别為要輸入的年月日和要累加的天數
       int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};	//每個月的月份
       cin>>y>>m>>d>>num;	//cin進行傳入
        
       while(num>days[m-1])	//當要累加的天數大于當月的天數的時候
       {
         if(y%400==0||(y%4==0&&y%100!=0))	//先判斷是否是閏年
           days[1]=29;
         else
           days[1]=28;
         
         num -= days[m-1]-d;		//判斷完對對應的天數減去對應的一個月
         d=0;		//日變為0
         m++;		//月份+1
         if(m==13)		//如果月份為13月的時候
         {
           y++;		//年份+1
           m=1;		//月份=1
         }
      }
        printf("%4d-%02d-%02d\n",y,m,num);		//将其進行輸出,最後的num就是小于這個月月份的,也就是日子
      }
    }
    return 0;
  }
           

列印對應的日期

要求:給出年分m和一年中的第n天,算出第n天是幾月幾号

1.定義出要計算的年份和天數

2.是否是閏年計算

3.按月份進行–,月份++

4.輸出對應的日期

#include <iostream>
  using namespace std;
   
  int main()
  {
    int year;		//年份
    int day;		//這一年的第多少天
     
    int mon[13] = {31, 28, 31, 30, 31, 30, 31, 31, 30 ,31, 30, 31};   
    while(cin>>year>>day)		//循環呢輸入
    {
    	//閏年判斷
      if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
        mon[1] = 29;
      else
        mon[1] = 28;
        
      for(int i = 0; i < 12; i++)		//進行月份的循環
      {	
        if(day <= mon[i])		//如果剩下的天數小于對應的月份
        {
          printf("%04d-%02d-%02d\n", year, i + 1, day);		//直接輸出
          break;		//循環結束
        }
        else
        {
        day = day - mon[i];		//如果大于,則繼續減去對應月份的天數
        }
    }
    }
    return 0;
  }
           

日期內插補點

要求:求兩個日期之間相差的天數,如果兩個日期是連續的我們規定他們之間的天數為兩天

兩日期相減也在之前日期類代碼中實作過,大家可以去看看! 點選此處

1.求出這一年距離0000年01月1号的距離函數,并對其進行封裝

2.定義兩個日期,對其進行輸入

3.調用函數對于這裡兩個日期

4.對調用函數後求出的兩個天數進行絕對值做差并進行輸出

#include <iostream>
using namespace std;

int mon[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };


int Count(int y, int m, int d)		//傳入對應的年月日
{
	
	int yd = y * 365 + y / 4 - y / 100 + y / 400;	//求出這一年分所有的天數和
	
	int md = mon[m - 1];	//看在哪一個月

	if (m > 2 && ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0))
		md += 1;		//是否是閏年判斷

	return yd + md + d;	//整合年份對應的天數+月份對應的天數+天數
}

int main()
{
	int y1, m1, d1;						//==第一組日期輸入求出
	scanf("%4d%2d%2d", &y1, &m1, &d1);
	int n1 = Count(y1, m1, d1);

	int y2, m2, d2;						//==第二組日期輸入求出
	scanf("%4d%2d%2d", &y2, &m2, &d2);
	int n2 = Count(y2, m2, d2);

	cout << abs(n1 - n2) + 1 << endl;	//輸出并絕對值做差   abs絕對值
}
           

計算日期到天數的轉換

要求:輸入對應年份的具體日子,求出是這一年的第多少天

1.對每個月都進行累加,形成一個對應的數組

2.對對應的日期進行相加,如果為5月份,則取前四個月相加的數字加上日期所對應的日

3.輸出即可

#include<iostream>
using namespace std;

const int days[] = { 0,31,59,90,120,151,181,212,243,273,304,334,365 };

int main(){
    
    int y,m,d;
    while(cin>>y>>m>>d){		//循環輸入
        
        int an=days[m-1]+d;		//核心代碼
        if(((y%4==0&&y%100!=0)||y%400==0)&&m>2)		//是否是閏年
            an++;		//++
            cout<<an<<endl;		//輸出
    }
    return 0;
}
           

求前N項和

要求:要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句

我利用了建立一個内部類的思想,在内部内中進行數字的相加和自加,然後定義 一個函數輸入對應的n值,計算出前n項,再調用内部類的函數,注意,靜态成員變量要在類的外部進行聲明!

class Solution {
public:
    
    class Sum{		//建立内部類
        public:		//在公有的條件下
        Sum(){		//建立和的成員函數
        _sum +=_i;
        ++_i;
        }
    };
    int Sum_Solution(int n) {	//建立前n項
        
        _sum=0;		//每次自增後對值進行恢複,防止出錯
        _i=1;
        
        Sum array[n];	//調用
        return _sum;	//輸出最終要求的值
    };
    private:
    static int _i;		//靜态變量
    static int _sum;
};

int Solution::_i=1;			//靜态變量要在類的外部指派
int Solution::_sum=0;
           

今天寫的5個例題難度并不是很高,主要在于你的了解,要将整個思路進行總結,就像我上面的理清思路,然後多注意細節,多敲代碼!!!就可以啦!!!加油!!!

繼續閱讀