-1

コードブロックで何か問題が発生していることに誰かが気付いたのではないかと思っていました。このプログラムは、2つの日付を比較するテストプログラムであると想定されています。作業中の関数は、呼び出し日が大きい場合は1を返し、呼び出し日が小さい場合は-1を返し、呼び出し日がパラメーターの日付と等しい場合は0を返すことになっています。私のテストプログラム:

#include <cstdlib>
#include <iostream>
#include <string>

#include "date.h"

using namespace std;

//date is initialized in a month/day/year format.

int main(int argc, char* argv[])
{
    string* d;

    date d1(4,1,4);
    date d4(4,4,4);

    int greaterTest = d4.compareTo(d1);
    int lessTest = d1.compareTo(d4);


    cout << greaterTest << endl;               //i believe these two lines are printing out a
    cout << lessTest << endl;                  //location in memory
    cout<<&d <<endl;


    system("pause");
    return EXIT_SUCCESS;
}

巨大なcompareTo()関数:

    int date::compareTo (date another_date)
{

    if (this->year == another_date.year && this->month == month && this->day < another_date.day)    //if both year and month are the same, test to see if day is less
    {

        return -1;
    }

    else if (this->year == another_date.year && this->month == month && this->day > another_date.day)   //if both year and month are the same, test to see if day is greater
    {

        return 1;
    }


    else if (this->year == another_date.year && this->month > month)                            //if the years are the same, test to see if the invoking month is greater
    {

        return 1;
    }

    else if (this->year == another_date.year && this->month < month)                            //if the years are the same, test to see if the invoking month is less
    {

        return -1;
    }


    else if (this->year > another_date.year)                                                    //test to see if the invoking year is greater
    {

        return 1;
    }

    else if (this->year < another_date.year)                                                    //test to see if the invoking year is less
    {

        return -1;
    }

    else if(this-> year == another_date.year && this-> month == another_date.month                  //test if the dates are exactly the same
        && this-> day == another_date.day)
    {

        return 0;
    } 


    //else{ return 15;}                                                                             //if none are true, return 15


}

取得する唯一の問題は、日(日付の2番目のパラメーター)を変更しようとしたときです。

4

5 に答える 5

2

テストできないため、これが問題であるかどうかはわかりません...しかし、compareTo関数には次の行があります。

this->month == month

すべきではありません:

this->month == another_date.month

于 2012-05-07T21:13:21.800 に答える
2

最初のifステートメントとその下のいくつかにも次のようなものがあります。

 this->month == month

これは月とそれ自体を比較しています、私はあなたが意味したと思います:

 this->month == another_date.month

また、「this」ポインタを常に使用する必要はありません。

month == another_date.month 

十分なはずです。

于 2012-05-07T21:13:46.930 に答える
0

それはいくつかの早期終了から利益を得るかもしれません:

int date::compareTo (date another_date)
{
    if (year > another_date.year) {
       //the invoking year is greater
       return 1;
    }

    if (year < another_date.year) {
       //the invoking year is less
       return -1;
    }

    // if we reached here, the years are the same.  Don't need to compare them for the other cases

    if (month > another_date.month) {
       return 1;
    }

    if (month < another_date.month) {
       return -1;
    }

    // if we reached here, the year and month are the same

    if (day > another_date.day) {
       return 1;
    }

    if (day < another_date.day) {
       return -1;
    }

    // if we reached here, the year and month and day are the same
    return 0;
}

途中で、そのテストが冗長になったため、カット+ペーストエラーはちょうど...消えました。

于 2012-05-07T21:14:32.157 に答える
0

読みづらかったので、元のコードにバグは見つかりませんでした。それがあなたもそれを見つけられなかった理由だと思います。

この代替案は読みやすく、正しいことを証明するのが簡単かもしれません。

// untested
int date::compareTo (date another_date)
{

    if (year < another_date.year) return -1;
    if (year > another_date.year) return 1;
    if (month < another_date.month) return -1;
    if (month > another_date.month) return 1;
    if (day < another_date.day) return -1;
    if (day > another_date.day) return 1;
    return 0;
}
于 2012-05-07T21:16:21.957 に答える
0

要素ごとの比較を実際に行うことに慣れていない限り、入力の各セットをに入れてからstruct tm、を使用mktimeしてそれらをに変換し、2つのを直接time_t比較します。time_t通常、これらは1970年1月1日の午前0時からの秒数の32ビットまたは64ビットの整数であるため、変換後の比較は簡単になります。

于 2012-05-07T21:16:30.413 に答える