2016-11-12 9 views
1

2つの日付間の合計日数を求める問題を解決しようとしています。私は、うるう年やユーザーが年を入力する方法など、この2つの日付の間にいくつかの問題を処理する必要があります。 (たとえば、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; 
    } 

私は上記のコードに問題があり、私はそれを実行したときに、 "日付"と "日付"の間に無効なバイナリ演算があると言っていました。私は自分の関数getDifferenceがすでにその問題を処理していると思っていました。 、私はその問題の世話をしなかったようだ。

+2

'2007 - 2001'は' 7と同じものです - 1 '、私は本当にそれについてdicey何が表示されません。 –

+1

私はあなたが言っていることを理解していません。 –

+2

あなたの質問は理解しにくいです。ユーザーが '2007年 'と入力したように入力' 7'を受け入れるべきであることを意味しますか?もしそうなら、入力された年が '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

関連する問題