2016-11-12 55 views
1

我試圖解決一個問題,要求我給出兩個日期之間的總天數。我必須關注這兩個日期之間的一些問題,如閏年和用戶輸入年份的方式。 (例如,如果你輸入1和17,代碼仍然會給你16年的差異(2017 - 2001 = 16)。我不應該改變main()函數中的任何東西。這裏是我的代碼。2個日期之間的總天數C++

#include <iostream> 
#include <cmath> 

using namespace std; 

class date 
{ 
    private: 
    int m; 
    int d; 
    int y; 

    public: 
    date(int, int, int); 
    int countLeapYears(date&); 
    int getDifference(date&); 
    int operator-(date&);  
    }; 

    int main() 
    { 
    int day, month, year; 
    char c; 

    cout << "Enter a start date: " << endl; 
    cin >> month >> c >> day >> c >> year; 

    date start = date(month, day, year); 

    cout << "Enter an end date: " << endl; 
    cin >> month >> c >> day >> c >> year; 

    date end = date(month, day, year); 
    int duration = end-start; 

    cout << "The number of days between those two dates are: " <<  
    duration << endl; 

    return 0; 
    } 


    date::date(int a, int b, int c) 
    { 
    m = a; 
    d = b; 
    y = c; 
    } 

    const int monthDays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 
    30, 31}; 

    int date::countLeapYears(date& d) 
    { 
     int years = d.y; 
     if (d.m <= 2) 
     years--; 
     return years/4 - years/100 + years/400; 
    } 

    int date::getDifference(date& other) 
    { 

     int n1 = other.y*365 + other.d; 

     for (int i=0; i<other.m - 1; i++) 
    { 
     n1 += monthDays[i]; 
     n1 += countLeapYears(other); 
     } 

     return n1; 
     } 

    int date::operator-(date& d) { 
     int difference = getDifference(d); 
     return difference; 
    } 

我有一個問題與我上面的代碼,我需要你的幫助,請。當我運行它,它說:「日期」和「日期」之間的無效的二進制運算。現在,我想,當我初始化INT duration = end - start,我應該得到一個數字,我猜我在做什麼錯在這裏是我沒有把(結束 - 開始)日期類型轉換爲整數,我認爲我的函數getDifference已經處理了這個問題。 ,似乎我沒有照顧這個問題。

+2

'2007 - 2001'是同樣的事情'7 - 1',我實在看不出有什麼冒險有關。 –

+1

我不明白你在說什麼。 –

+2

你的問題很難理解。你的意思是你應該接受輸入'7',就好像用戶輸入了'2007'一樣嗎?如果是這樣,只需檢查輸入的年份是否小於'2000',並在這種情況下添加'2000'。 – DUman

回答

1

Ch符合接受。

使用此free, open-source, header-only date library

#include "date.h" 
#include <iostream> 

namespace me 
{ 

class date 
{ 
    ::date::sys_days tp_; 
public: 
    date(int month, int day, int year) 
     : tp_{::date::year(year)/month/day} 
     {} 

    friend 
    int 
    operator-(const date& x, const date& y) 
    { 
     return (x.tp_ - y.tp_).count(); 
    } 
}; 

} // namespace me 

using namespace std; 
#define date me::date 

int main()... 
+0

這看起來很神奇,但我不應該使用date.h來解決這個難題。我的朋友通過使用運算符重載給了我提示,並且我不應該改變main()函數。我仍在努力。 – Hugh

+0

@Hugh:實際上最真實的日期算法比家庭作業級的編碼更先進。對於想要編寫自己的日期代碼的人,我通過這些公有領域的算法:http://howardhinnant.github.io/date_algorithms.html –

+0

您好霍華德先生,我上面的代碼存在問題,我需要您的幫助。當我運行它時,它表示「日期」和「日期」之間的無效二進制操作。現在,我假設當我初始化int duration = end - start時,我應該得到一個數字。我猜我在做什麼錯在這裏是我未能將(結束 - 開始)日期類型轉換爲整數。我認爲我的功能getDifference已經處理了這個問題。不知何故,似乎我沒有關心這個問題。 – Hugh