7

私は C++ を初めて使用します。HH:MM 形式を使用して時間を加算および減算するプログラムを作成したいと考えていました。サンプル入力:

12:00 + 3:00 - 6:00

サンプル出力:

9:00

別の入力例:

9:00 + 8:00 + 13:00 - 2:25

サンプル出力:

27:35

どうすればこれを手に入れることができますか?私はすべてを秒に変換してから数学を適用し、モジュラス60関数を使用して時間を返すことを考えていました。そのようなプログラムを構築するための助けはありますか?

4

5 に答える 5

3

「時間」とはどういう意味かを考える必要があります。時点と期間の2つの概念があります。時点を足し合わせても意味がありません。期間を加算および減算することは理にかなっており(結果として期間になります)、ある時点で期間を加算および減算することは理にかなっています(元の時点から新しい時点オフセットになります)。また、ある時点を別の時点から減算して、間にある期間を生成することも理にかなっています。

多くの場合、APIは2つの概念を区別するのに優れた仕事をしませんが、標準C++<chrono>ライブラリはそうします。

tmこれは、ユーザーから2、3の期間を取得するために、Cタイプを悪用し、それらを合計tmしてから、もう一度悪用して結果を出力するコードです。

#include <iostream> // cout, cin
#include <iomanip>  // get_time, put_time
#include <chrono>   // hours, minutes, duration_cast

int main() {
    // input, get a couple durations to do arithmetic on
    // technically std::tm represents a time point and get_time is supposed to
    // parse a time point, but we treat the results as a duration
    std::tm t;
    std::cin >> std::get_time(&t, "%H:%M");

    auto duration1 = std::chrono::hours(t.tm_hour) + std::chrono::minutes(t.tm_min);

    std::cin >> std::get_time(&t, "%H:%M");
    auto duration2 = std::chrono::hours(t.tm_hour) + std::chrono::minutes(t.tm_min);

    // do the arithmetic
    auto sum = duration1 + duration2;

    // output
    auto hours   = std::chrono::duration_cast<std::chrono::hours>(sum);
    auto minutes = std::chrono::duration_cast<std::chrono::minutes>(sum - hours);

    t.tm_hour = hours.count();
    t.tm_min  = minutes.count();

    std::cout << std::put_time(&t, "%H:%M") << '\n';
}
于 2012-12-22T08:59:33.770 に答える
1

これ(パート 1) とこれ(パート 2) はまさにあなたが望むものでなければなりません..

明確な説明が得られ、作成者はコードを 1 行ずつ実行し、ベスト プラクティスも使用します。

于 2012-12-22T05:07:00.677 に答える
0

最も簡単な解決策は、入力を整数に解析し ( を使用)、それらを( で定義された型std::istream) に挿入し、(これも で)を呼び出すことです。(C++11 で時間を処理するための新しい機能がいくつかありますが、まだよくわかりません。)tm<time.h>mktime<time.h>

于 2012-12-22T08:30:47.710 に答える
0

この行に小さな問題が見つかりました:

int nDiff(m_Hours*3600 + m_Minutes*60 - (rTime.Hours()*3600 + rTime.Minutes()*60));

nDiff( ... ) では、引数は絶対値である必要があります! nDiff( abs(...) )

たとえば、次の場合:

Time time1("01:00");
Time time2("02:00");
cout << ( time1 - time2 ).TimeStr() << endl;

出力:

hours = 18446744073709551615
Invalid input

この場合:

cout << ( time1 + time2 ).TimeStr() << endl;

出力:

03:00

その結論は単なる変更です。

int nDiff(m_Hours*3600 + m_Minutes*60 - (rTime.Hours()*3600 + rTime.Minutes()*60));

これについて:

int nDiff( abs(m_Hours*3600 + m_Minutes*60 - (rTime.Hours()*3600 + rTime.Minutes()*60) ) );

これをコードのヘッダーに追加します。

#include <cstdlib> // function abs()

このようにして、コードは非常にうまく機能します。:)

ハッピーコーディング!乾杯。

于 2020-04-18T00:01:33.093 に答える