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
コードの解説
このプログラムの流れを簡単に整理すると、次のようになります。
- 2つの時刻(時・分・秒)をそれぞれ標準入力から受け取ります。
- まず秒同士を比較し、引き算で負になる場合は分から1借りて、秒に60を加えます。
- 次に分同士を比較し、同様に負になる場合は時から1借りて、分に60を加えます。
- 最後に各単位の差を計算して「時:分:秒」の形式で出力します。
まとめ
C++で時刻の差を計算する場合、単純な引き算ではなく、秒→分→時間の順に桁借り処理を行うことが重要です。今回紹介した手法は、ストップウォッチ機能や勤怠管理システムなど、さまざまなアプリケーションで応用できる基本的なテクニックです。ぜひ実際にコードを動かして、動作を確認してみてください。
-
C++で円を2つの部分に分割したときの角度差の最小値を求めるプログラム
この記事では、円を構成する各部分(扇形)の角度が格納された配列が与えられたとき、それらを連続的につなぎ合わせて2つの部分に分割した場合の角度差の最小値を求めるC++プログラムを解説します。問題の概要円全体(360度)を構成するすべての部分の角度が配列として与えられます。これらの部分を連続する範囲ごとに結合して2つのグループを作り、それぞれのグループの角度の合計の差が最小になるようにします。重要なのは、離れた位置にある部分(例えば最初の部分と3番目の部分など)を一緒にすることはできないという点です。入力例で理解しましょう入力ang[] = {90, 45, 90, 135}出力90説明1つ目と2
-
C++で二分木の指定した2つのレベル間にあるすべてのノードを出力する方法
この問題では、二分木と、木の中の2つのレベル(上位レベルと下位レベル)が与えられ、その2つのレベル間に存在するすべてのノードを出力することが求められます。二分木とは、各ノードが最大2つの子ノード(0個・1個・2個)を持つ特殊な木構造のことです。問題の例具体例を使って問題を理解しましょう。上位レベル(upper):3下位レベル(lower):1出力結果:6 3 9 7 4 8 10解決アプローチ方法1:再帰関数を使う方法この問題を解くには、指定されたレベルのノードを出力する必要があります。upperからlowerまでのレベルをループで回しながら、再帰関数を呼び出すことで実現できます。このアルゴリ