Javaプログラミング学習サイト ゆるゆるプログラミング

2021/05/28 公開

・短針と長針の角度

ここでは、アナログ時計の短針長針の間の角度を計算する方法を説明します。

時間を0以上の整数、分を0~59の整数で与えて角度を計算します。計算する角度は、短針を時計周り(右周り)に回していき、長針に追いつく角度です。例えば9:00場合は90度、3:00の場合は270度となります。

短針長針の間の角度は、長針短針の角度をそれぞれ求めて、その2つの角度の差から計算します。針の角度は0:00を基準とし、時計回り(右回り)をプラスとします。

それでは、短針長針のそれぞれの角度の計算方法を解説していきます。

短針は、時の単位を表す針で0時(12時)~11時を表します。この針は、12時間で1回転(360度)するので、1時間では30度回転します(360/12=30)。1分間では0.5度回転します(30/60=0.5)。

長針は、分の単位を表す針で0~59分を表します。1時間(60分)で1回転(360度)するので、1分間では6度回転します(360/60=6)。

上記の内容をまとめると以下の計算式になります。

短針の角度の計算式

短針の角度=(360÷12)×時 + (360÷12÷60)×分

長針の角度の計算式

長針の角度=(360÷60)×分

短針長針との間の角度は、

短針長針との間の角度=長針の角度-短針の角度

で計算します。この値がマイナスになった場合、360を足します。

以下は、上記の計算を行うJavaのソースコードです。時間と分はそれぞれキーボードで入力します。

ClockHandtoDegree.java ← クリックしてダウンロードページに移動
001:    import java.util.Scanner;
002:    
003:    public class ClockHandtoDegree {
004:    	// 短針(the hour-hand)の角度を時と分から計算
005:    	// 角度は0時を0度として時計回りにプラス
006:    	// 計測不能時は、-1.0を戻す
007:    	static double getHourHandDeg( int hour, int minute )
008:    	{
009:    		// 時が0未満の場合-1.0を戻す(エラー)
010:    		if ( 0 > hour ) return -1.0;
011:    
012:    		// 分が0未満の場合-1.0を戻す(エラー)
013:    		if ( 0 > minute ) return -1.0;
014:    
015:    		// 分が59を超える場合-1.0を戻す(エラー)
016:    		if ( 59 < minute ) return -1.0;
017:    
018:    		// 時間を0~12に変換
019:    		hour = hour % 12;
020:    
021:    		// 時から計算した短針の角度
022:    		double hh_deg;
023:    		hh_deg = ( 360.0 / 12.0 ) * (double)hour;
024:    
025:    		// 分から計算した長針の角度
026:    		double mh_deg;
027:    		mh_deg = ( 360.0 / 12.0 / 60.0 ) * (double)minute;
028:    
029:    		// 結果を戻す
030:    		return hh_deg + mh_deg;
031:    	}
032:    
033:    
034:    	// 長針(the minute-hand)の角度を分から計算
035:    	// 角度は0分を0度として時計回りにプラス
036:    	// 計測不能時は、-1.0を戻す
037:    	static double getMinuteHandDeg( int minute )
038:    	{
039:    		// 分が0未満の場合-1.0を戻す(エラー)
040:    		if ( 0 > minute ) return -1.0;
041:    
042:    		// 分が59を超える場合-1.0を戻す(エラー)
043:    		if ( 59 < minute ) return -1.0;
044:    
045:    		// 結果を戻す
046:    		return ( 360.0 / 60.0 ) * (double)minute;
047:    	}
048:    
049:    
050:    	// 短針→長針の時計周りの角度を計算
051:    	// 計測不能時は、-1.0を戻す
052:    	static double getClockHandDeg( int hour, int minute )
053:    	{
054:    		// 短針の角度
055:    		double hh_deg = getHourHandDeg( hour, minute );
056:    		if ( 0.0 > hh_deg ) return -1.0;
057:    
058:    		// 長針の角度
059:    		double mh_deg = getMinuteHandDeg( minute );
060:    		if ( 0.0 > mh_deg ) return -1.0;
061:    
062:    		// 短針→長針の角度
063:    		double clock_deg = mh_deg - hh_deg;
064:    
065:    		// 計算結果がマイナスの場合、360を足してプラスにする
066:    		if ( 0.0 > clock_deg )
067:    			clock_deg += 360.0;
068:    			
069:    		return clock_deg;
070:    	}
071:    
072:    
073:    	// メイン
074:    	public static void main( String[] args ) {
075:    		// 整数の値をキーボードから入力
076:    		Scanner scanner = new Scanner( System.in );
077:    
078:    		// 時間の入力
079:    		System.out.print( "時間を整数で入力してください:" );
080:        		String h = scanner.next();
081:    		int hour = Integer.parseInt( h );
082:    
083:    		// 分の入力
084:    		System.out.print( "分を整数で入力してください:" );
085:        		String m = scanner.next();
086:    		int minute = Integer.parseInt( m );
087:    		
088:    		// 短針→長針の角度を計算
089:    		double clock_deg = getClockHandDeg( hour, minute );
090:    
091:    		// 結果出力
092:    		System.out.println( "時刻: " + hour + ":" + minute );
093:    		System.out.println( "角度: " + clock_deg );
094:    	}
095:    }

ClockHandtoDegree実行

C:\talavax\javasample>java ClockHandtoDegree

ClockHandtoDegree.javaの出力結果

時間を整数で入力してください: 10
分を整数で入力してください: 10
時刻 10:10
角度 115.0

ここからは、このソースコードを上から順番に解説していきます。

001:    import java.util.Scanner;

Javaのクラスライブラリの中から「java.util.Scanner」というパッケージにあるクラスを使うために記述しています。

003:    public class ClockHandtoDegree {

クラス名を、ClockHandtoDegreeとしています。

004:    	// 短針(the hour-hand)の角度を時と分から計算
005:    	// 角度は0時を0度として時計回りにプラス
006:    	// 計測不能時は、-1.0を戻す
007:    	static double getHourHandDeg( int hour, int minute )
008:    	{
009:    		// 時が0未満の場合-1.0を戻す(エラー)
010:    		if ( 0 > hour ) return -1.0;
011:    
012:    		// 分が0未満の場合-1.0を戻す(エラー)
013:    		if ( 0 > minute ) return -1.0;
014:    
015:    		// 分が59を超える場合-1.0を戻す(エラー)
016:    		if ( 59 < minute ) return -1.0;
017:    
018:    		// 時間を0~12に変換
019:    		hour = hour % 12;
020:    
021:    		// 時から計算した短針の角度
022:    		double hh_deg;
023:    		hh_deg = ( 360.0 / 12.0 ) * (double)hour;
024:    
025:    		// 分から計算した長針の角度
026:    		double mh_deg;
027:    		mh_deg = ( 360.0 / 12.0 / 60.0 ) * (double)minute;
028:    
029:    		// 結果を戻す
030:    		return hh_deg + mh_deg;
031:    	}

短針の角度を計算するメソッドです。引数に時間を表すhourと分を表すminuteを渡し、角度を戻すメソッドです。引数が範囲外の場合には、-1.0を戻します。これはエラーを意味しています。

引数hourは、hour = hour % 12;によって0~11の値に変換しています。例えばhour=23の場合、23 % 12 = 11となります。

034:    	// 長針(the minute-hand)の角度を分から計算
035:    	// 角度は0分を0度として時計回りにプラス
036:    	// 計測不能時は、-1.0を戻す
037:    	static double getMinuteHandDeg( int minute )
038:    	{
039:    		// 分が0未満の場合-1.0を戻す(エラー)
040:    		if ( 0 > minute ) return -1.0;
041:    
042:    		// 分が59を超える場合-1.0を戻す(エラー)
043:    		if ( 59 < minute ) return -1.0;
044:    
045:    		// 結果を戻す
046:    		return ( 360.0 / 60.0 ) * (double)minute;
047:    	}

長針の角度を計算するメソッドです。引数に分を表すminuteを渡し、角度を戻すメソッドです。引数が範囲外の場合には、-1.0を戻します。これはエラーを意味しています。

050:    	// 短針→長針の時計周りの角度を計算
051:    	// 計測不能時は、-1.0を戻す
052:    	static double getClockHandDeg( int hour, int minute )
053:    	{
054:    		// 短針の角度
055:    		double hh_deg = getHourHandDeg( hour, minute );
056:    		if ( 0.0 > hh_deg ) return -1.0;
057:    
058:    		// 長針の角度
059:    		double mh_deg = getMinuteHandDeg( minute );
060:    		if ( 0.0 > mh_deg ) return -1.0;
061:    
062:    		// 短針→長針の角度
063:    		double clock_deg = mh_deg - hh_deg;
064:    
065:    		// 計算結果がマイナスの場合、360を足してプラスにする
066:    		if ( 0.0 > clock_deg )
067:    			clock_deg += 360.0;
068:    			
069:    		return clock_deg;
070:    	}

短針長針の間の角度を計算するメソッドです。引数に時間を表すhourと分を表すminuteを渡し角度を求めます。

短針の角度を求めるメソッドgetHourHandDegと、長針の角度を求めるメソッドgetMinuteHandDegから戻された角度の差を計算し、その値がマイナスの場合に360を足してプラスにしています。

073:    	// メイン
074:    	public static void main( String[] args ) {

このmainメソッドからプログラムを実行します。

075:    		// 整数の値をキーボードから入力
076:    		Scanner scanner = new Scanner( System.in );

標準入力System.inを使って、Scannerクラスのscanを初期化しています。

078:    		// 時間の入力
079:    		System.out.print( "時間を整数で入力してください:" );
080:        		String h = scanner.next();
081:    		int hour = Integer.parseInt( h );

printメソッドで、"時間を整数で入力してください:" をコンソール出力しています。printメソッドを使っているので、コンソール入力した文字はメッセージの右側に表示されます。printlnメソッドを使った場合、コンソール入力した文字はメッセージの下の行に表示されます。

nextLineメソッドで、キーボードから入力された1行を読み取り、String型のhに代入しています。ここで、入力待ち状態になり、Enterキーが押されるまでの入力文字がlineに格納されます。キーボードの"Ctrl"キーを押しながら"C"を押すと強制終了します。

IntegerクラスのparseIntメソッドで、文字列hを整数hourに変換しています。

083:    		// 分の入力
084:    		System.out.print( "分を整数で入力してください:" );
085:        		String m = scanner.next();
086:    		int minute = Integer.parseInt( m );

printメソッドで、"分を整数で入力してください:" をコンソール出力しています。printメソッドを使っているので、コンソール入力した文字はメッセージの右側に表示されます。printlnメソッドを使った場合、コンソール入力した文字はメッセージの下の行に表示されます。

nextLineメソッドで、キーボードから入力された1行を読み取り、String型のmに代入しています。ここで、入力待ち状態になり、Enterキーが押されるまでの入力文字がlineに格納されます。キーボードの"Ctrl"キーを押しながら"C"を押すと強制終了します。

IntegerクラスのparseIntメソッドで、文字列mを整数minuteに変換しています。

088:    		// 短針→長針の角度を計算
089:    		double clock_deg = getClockHandDeg( hour, minute );

短針長針の間の角度を計算するメソッドを呼び出しています。計算結果は、double型変数clock_degに代入されます。

091:    		// 結果出力
092:    		System.out.println( "時刻: " + hour + ":" + minute );
093:    		System.out.println( "角度: " + clock_deg );

結果をコンソール出力しています。

以上です。

■関連コンテンツ

角度の正規化 角度(単位°)を0~360°に収めるメソッド
キーボード入力 ScannerクラスとSystem.inを使用
メソッド メソッドについて解説
return文 メソッドの戻り値
値のコンソール表示 print()、println()とは?
四則演算(足し算/引き算/掛け算/割り算)について-画像

計算結果の表示

足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)の使い方を説明

条件による処理の分岐に使用するif文について解説-画像

if文

条件による処理の分岐に使用するif文について解説

剰余(余り)を計算した結果を表示するプログラムについて解説-画像

剰余(余り)計算

剰余(余り)をを計算するプログラムの紹介と、その結果を表示する方法を解説

■新着情報

2021.06.18 変数の初期値 変数に値を代入しないで計算
2021.05.28 短針と長針の角度 短針と長針の角度は?
2021.05.19 各位(くらい)を求める 1の位の値は?10の位は?

■広告

 

 

 

 

 

 

 

 

 

Topへ