C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で2つの時刻の差を計算する方法(HH:MM:SS形式)

プログラミングでは、2つの時刻の差を計算する場面がよくあります。例えば、処理時間の測定やタイムカードの管理などがその代表例です。本記事では、C++を使って「時:分:秒」の形式で与えられた2つの時刻の差を求める方法を解説します。

問題の概要

'HH:MM:SS'形式(HHは時間、MMは分、SSは秒を表す)で表された2つの時刻が与えられます。この2つの時刻の差を、同じ'HH:MM:SS'形式で出力するのが目的です。

入力例と出力例

時刻1 = 8:6:2
時刻2 = 3:9:3
時刻の差 = 4:56:59

計算の考え方

時刻の差を求める際のポイントは、桁借り(繰り下がり)の処理です。引き算の結果が負にならないように、以下の手順で計算します。

  • 秒の計算: 時刻2の秒の方が大きい場合、時刻1から1分(60秒)を借りてきます。このとき、分を1減らします。
  • 分の計算: 時刻2の分の方が大きい場合、時刻1から1時間(60分)を借りてきます。このとき、時間を1減らします。
  • 時間の計算: 最後に時間同士の差を求めます。

C++での実装例

以下が、上記のロジックを実装したC++プログラムの完全なコードです。

#include <iostream>
using namespace std;
int main() {
    int hour1, minute1, second1;
    int hour2, minute2, second2;
    int diff_hour, diff_minute, diff_second;
    cout << "時刻1を入力してください" << endl;
    cout << "時間・分・秒を順に入力してください: "<< endl;
    cin >> hour1 >> minute1 >> second1;
    cout << "時刻2を入力してください" << endl;
    cout << "時間・分・秒を順に入力してください: "<< endl;
    cin >> hour2 >> minute2 >> second2;
    // 秒の桁借り処理
    if(second2 > second1) {
        minute1--;
        second1 += 60;
    }
    diff_second = second1 - second2;
    // 分の桁借り処理
    if(minute2 > minute1) {
        hour1--;
        minute1 += 60;
    }
    diff_minute = minute1 - minute2;
    diff_hour = hour1 - hour2;
    cout <<"時刻の差は "<< diff_hour <<":"<< diff_minute <<":"<<diff_second;
    return 0;
}

実行結果

このプログラムを実行すると、以下のような出力が得られます。

時刻1を入力してください
時間・分・秒を順に入力してください: 7 6 2
時刻2を入力してください
時間・分・秒を順に入力してください: 5 4 3
時刻の差は 2:1:59

コードの解説

このプログラムの流れを簡単に整理すると、次のようになります。

  1. 2つの時刻(時・分・秒)をそれぞれ標準入力から受け取ります。
  2. まず秒同士を比較し、引き算で負になる場合は分から1借りて、秒に60を加えます。
  3. 次に分同士を比較し、同様に負になる場合は時から1借りて、分に60を加えます。
  4. 最後に各単位の差を計算して「時:分:秒」の形式で出力します。

まとめ

C++で時刻の差を計算する場合、単純な引き算ではなく、秒→分→時間の順に桁借り処理を行うことが重要です。今回紹介した手法は、ストップウォッチ機能や勤怠管理システムなど、さまざまなアプリケーションで応用できる基本的なテクニックです。ぜひ実際にコードを動かして、動作を確認してみてください。

  1. C++で円を2つの部分に分割したときの角度差の最小値を求めるプログラム

    この記事では、円を構成する各部分(扇形)の角度が格納された配列が与えられたとき、それらを連続的につなぎ合わせて2つの部分に分割した場合の角度差の最小値を求めるC++プログラムを解説します。問題の概要円全体(360度)を構成するすべての部分の角度が配列として与えられます。これらの部分を連続する範囲ごとに結合して2つのグループを作り、それぞれのグループの角度の合計の差が最小になるようにします。重要なのは、離れた位置にある部分(例えば最初の部分と3番目の部分など)を一緒にすることはできないという点です。入力例で理解しましょう入力ang[] = {90, 45, 90, 135}出力90説明1つ目と2

  2. C++で二分木の指定した2つのレベル間にあるすべてのノードを出力する方法

    この問題では、二分木と、木の中の2つのレベル(上位レベルと下位レベル)が与えられ、その2つのレベル間に存在するすべてのノードを出力することが求められます。二分木とは、各ノードが最大2つの子ノード(0個・1個・2個)を持つ特殊な木構造のことです。問題の例具体例を使って問題を理解しましょう。上位レベル(upper):3下位レベル(lower):1出力結果:6 3 9 7 4 8 10解決アプローチ方法1:再帰関数を使う方法この問題を解くには、指定されたレベルのノードを出力する必要があります。upperからlowerまでのレベルをループで回しながら、再帰関数を呼び出すことで実現できます。このアルゴリ