0

2時間を比較する方法は?私は以下のコードで試しましたが、それは私に2回与えますtrue、しかしそれは与えるべきですfalseそしてtrue

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

bool earlierEqual(int h1, int m1, int s1, int h2, int m2, int s2)
{
    if(h1 <= h2)
    {
        return true;
    }
    else
    {
        if(m1 <= m2)
        {
            return true;
        }
        else
        {
            if(s1 <= s2)
            {
                return true;
            }
            else
                return false;
        }
    }
}

bool laterEqual(int h1, int m1, int s1, int h2, int m2, int s2)
{
    if(h1 >= h2)
    {
        return true;
    }
    else
    {
        if(m1 >= m2)
        {
            return true;
        }
        else
        {
            if(s1 >= s2)
            {
                return true;
            }
            else
                return false;
        }
    }
}

int main()
{
    int h1 = 12, m1 = 4, s1 = 29;
    int h2 = 11, m2 = 12, s2 = 1;

    // false
    cout << earlierEqual(h1, m1, s1, h2, m2, s2) << "\n";
    // true
    cout << laterEqual(h1, m1, s1, h2, m2, s2) << "\n";


    return 0;
}
4

6 に答える 6

3

ブランチelseは、時間が等しい場合にのみアクティブ化する必要があります。h1それ以外の場合は、時間が時間よりも大きい場合でも、分の比較によって決定されh2ます。コードを次のように変更する必要があります。

bool earlierEqual(int h1, int m1, int s1, int h2, int m2, int s2)
{
    if (h1 < h2)
    {
        return true;
    }
    else if (h1 == h2)
    {
        if (m1 < m2)
        {
            return true;
        }
        else if (m1 == m2)
        {
            if (s1 < s2)
            {
                return true;
            }
        }
    }

    return false;
}
于 2013-01-29T16:38:47.060 に答える
1

使用std::tie

#include <tuple>
bool earlierEqual(int h1, int m1, int s1, int h2, int m2, int s2) {
  return std::tie(h1, m1, s1) <= std::tie(h2, m2, s2);
}
bool laterEqual(int h1, int m1, int s1, int h2, int m2, int s2) {
  return std::tie(h1, m1, s1) >= std::tie(h2, m2, s2);
}
于 2013-01-29T17:20:33.467 に答える
1

時間が等しい場合は分をチェックする必要があり、これらが等しい場合は秒をチェックする必要があります。条件が少ない場合にのみ、すぐにtrueを返すことができます。同じことが2番目の関数にも当てはまります。大きい場合にのみ、早期に戻ることができます。

于 2013-01-29T16:37:08.097 に答える
1

比較を行う前に、すべてを数秒で変換する方が簡単です。

于 2013-01-29T16:37:21.373 に答える
1

これが私のやり方です。読みやすく、エラーが発生しにくくなっています。秒に変換してから比較を行います。

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

bool earlierEqual(int h1, int m1, int s1, int h2, int m2, int s2)
{
    int totalSeconds1 = getTotalSeconds(h1, m1, s1);
    int totalSeconds2 = getTotalSeconds(h2, m2, s2);

    if(totalSeconds1 <= totalSeconds2)
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool laterEqual(int h1, int m1, int s1, int h2, int m2, int s2)
{
    int totalSeconds1 = getTotalSeconds(h1, m1, s1);
    int totalSeconds2 = getTotalSeconds(h2, m2, s2);

    if(totalSeconds1 >= totalSeconds2)
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool getTotalSeconds(int h1, int m1, int s1)
{
   return h1 * 3600 + m1 * 60 + s1;
}
于 2013-01-29T16:50:09.073 に答える
0

単なる提案:単一の32ビット整数で時間+分+秒を表すことができます。(時間は0-24-5ビット、秒0-60:6ビット分0-60:6ビット)

2つの整数に両方の数値を入力したら、基本的にこのブロックにロジックを配置します(時間、分、秒を抽出するにはビットマスクが必要です)

以下の疑似コード:

bool compare(val1,val2) { 

if(h1 < h2) return true; 
if( h1 ==  h2 && m1 < m2 )  return true;
if( h1 == h2 && m1 == m2 && s1 <s2) return true;
return false  ;
}
于 2013-01-29T17:20:54.130 に答える