0

時間:分:秒の形式で時間を比較する次のプログラムがあります。

class time
{
public:

    string Hours;
    string Minutes;
    string Seconds;
};

bool CompareTimes(time A, time B)
{
    if (A.Hours < B.Hours)
    {
        return true;
    }

    if (A.Minutes < B.Minutes)
    {
        return true;
    }

    if (A.Seconds < B.Seconds)
    {
        return true;
    }

    return false;
}

そして主に…

sort(TimeArray, TimeArray + NumberOfTimes, CompareTimes);

ただし、これは正しくソートされていないようです。一方、CompareTimes メソッドを次のように変更すると:

bool CompareTimes(time A, time B)
    {
        if (A.Hours > B.Hours)
        {
            return false;
        }

        if (A.Minutes > B.Minutes)
        {
            return false;
        }

        if (A.Seconds > B.Seconds)
        {
            return false;
        }

        return true;
    }

その後、すべてが正常に機能します。2 番目の入力が最初の入力より大きい場合、sort 関数は true を返す必要があると思いました。最初のケースでは機能しなかったのに、2 番目のケースでは機能したのはなぜですか?

4

2 に答える 2

2
if (A.Hours < B.Hours)
{
        return true;
}

その後、2 つのオプションがあります: 時間が等しいか、A.hours>B.hours です。それらが等しい場合、分を比較することは理にかなっています。A の時間がそれより長い場合、分数を比較しても意味がありません。2 番目の条件は次のとおりです。

if (A.Hours == B.Hours && A.Minutes < B.Minutes)

同様に、3 番目の条件は次のようになります。

if (A.Hours == B.Hours && A.Minutes == B.Minute && A.Seconds < B.Seconds)

最後の戻り値は同じままにする必要があります。また、これらを文字列として保存すると、アルファベット順に並べられることに注意してください。(またはASCIIコード順)。

于 2013-09-26T02:23:21.197 に答える
0

true を返すには、3 つの条件すべてを 1 回で確認する必要があると思います。

return (A.Hours*60*60 +A.Minutes*60+A.Seconds > B.Hours*60*60 + B.Minutes*60 + B.Seconds);

以下のようにサンプルを書くだけです。

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
using namespace std;
class time_
{
public:
    string Hours;
    string Minutes;
    string Seconds;
    time_(int h,int m,int s){ 
        char buf[6]={0,};
        memset(buf,0,sizeof(buf));sprintf(buf,"%d",h);Hours+=buf;
        memset(buf,0,sizeof(buf));sprintf(buf,"%d",m);Minutes+=buf;
        memset(buf,0,sizeof(buf));sprintf(buf,"%d",s);Seconds+=buf;
    }   
};

bool CompareTimes(time_ A, time_ B){ 
    return (\
        ((atoi(A.Hours.c_str())*60*60)+(atoi(A.Minutes.c_str())*60)+atoi(A.Seconds.c_str())) > \
        ((atoi(B.Hours.c_str())*60*60)+(atoi(B.Minutes.c_str())*60)+atoi(B.Seconds.c_str())));
}
int main(){
    time_ A(10,10,10);
    time_ B(10,10,11);
    std::cout<<(CompareTimes( A, B)?"greater":"smaller")<<endl;
    time_ A1(10,11,10);
    time_ B1(10,10,10);
    std::cout<<(CompareTimes( A1, B1)?"greater":"smaller")<<endl;
}
于 2013-09-26T02:20:33.210 に答える