ゆるゆるプログラミング

・三角形の面積計算(ヘロンの公式)

三角形の3辺の長さから面積を計算するプログラムを解説します。計算には、ヘロンの公式を使います。

ヘロンの公式は、与えれれた三角形の3辺の長さから面積を計算する公式で、3角形の面積は、下図の式で計算することができます。a,b,cは、それぞれ辺の長さで、Tは面積です。

ヘロンの公式

Heron.java
001:    public class Heron {
002:    	public static void main( String[] args ) {
003:    		// 変数の宣言
004:    		double a, b, c;	// 3辺の長さ
005:    		double t;	// 面積
006:    
007:    		// 入力した引数が3つ以上かを調べる
008:    		if ( 3 >args.length ) {
009:    			// 入力した引数が3つ未満の場合、使用方法を表示する
010:    			System.out.println( "Heron [辺長1]  [辺長2]  [辺長3]" );
011:    			return;
012:    		}
013:    
014:    		// 引数をdouble型に変換し、長さに代入
015:    		try {
016:    			// args[0],args[1],args[2]を数値に変換
017:    			a =  Double.valueOf( args[ 0 ] );
018:    			b =  Double.valueOf( args[ 1 ] );
019:    			c =  Double.valueOf( args[ 2 ] );
020:    		}
021:    		catch( NumberFormatException ne )
022:    		{
023:    			// args[0],args[1],args[2]のどれかが数字ではない
024:    			System.out.println( "辺の長さの取得に失敗しました" );
025:    			return;
026:    		}
027:    	
028:    
029:    		// 面積を計算
030:    		t = herons_formula( a, b, c );
031:    		if ( 0.0 > t ) {
032:    			System.out.println( "面積の計算に失敗しました" );
033:    		}
034:    		else {
035:    			System.out.println( "辺1の長さ="+ a );
036:    			System.out.println( "辺2の長さ="+ b );
037:    			System.out.println( "辺3の長さ="+ c );
038:    			System.out.println( "面積="+ t );
039:    		}
040:    	}
041:    
042:    
043:    	// 3角形の3辺の長さa,b,cから面積を計算するメソッド
044:    	private static double herons_formula( double a, double b, double c )
045:    	{
046:    		double s;	// s = ( a + b + c ) / 2
047:    		double t;	// 面積
048:    		double d;	// 作業用変数
049:    
050:    		// 3辺のどれか1つでも0より小さければ-1.0を返す
051:    		if ( ( 0.0 > a ) || ( 0.0 > b ) || ( 0.0 > c ) ) return -1.0;
052:    
053:    		// sを計算
054:    		s = ( a + b + c ) / 2.0;
055:    
056:    		// s(s-a)(s-b)(s-c)を計算し、マイナスになれば-1.0を返す
057:    		d = s * ( s - a ) * ( s - b ) * ( s - c );
058:    		if ( 0.0 > d ) return -1.0;
059:    
060:    		// 面積tを計算
061:    		t = Math.sqrt( d );
062:    
063:    		// 計算した面積tを返す
064:    		return t;
065:    	}
066:    }

Heronを実行

C:\talavax\javasample>java Heron 5 12 9

3つの引数で渡した3辺の長さから面積を計算した結果を表示します。

Heron.javaの出力結果

辺1の長さ=5.0
辺2の長さ=12.0
辺3の長さ=9.0
面積=20.396078054371138

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

001:    public class Heron {

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

002:    	public static void main( String[] args ) {

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

003:    		// 変数の宣言
004:    		double a, b, c;	// 3辺の長さ
005:    		double t;	// 面積

このプログラムで使う変数を宣言しています。

007:    		// 入力した引数が3つ以上かを調べる
008:    		if ( 3 >args.length ) {
009:    			// 入力した引数が3つ未満の場合、使用方法を表示する
010:    			System.out.println( "Heron [辺長1]  [辺長2]  [辺長3]" );
011:    			return;
012:    		}

3つ以上の引数が与えられたかをチェックし、足りたかった場合に、使い方のメッセージを表示し、returnによってmainメソッドを抜けています。

014:    		// 引数をdouble型に変換し、長さに代入
015:    		try {
016:    			// args[0],args[1],args[2]を数値に変換
017:    			a =  Double.valueOf( args[ 0 ] );
018:    			b =  Double.valueOf( args[ 1 ] );
019:    			c =  Double.valueOf( args[ 2 ] );
020:    		}
021:    		catch( NumberFormatException ne )
022:    		{
023:    			// args[0],args[1],args[2]のどれかが数字ではない
024:    			System.out.println( "辺の長さの取得に失敗しました" );
025:    			return;
026:    		}

与えられた引数をそれぞれ、変数a,b,cに代入しています。

try { ~ } catchは、失敗する可能性がある処理を波括弧で囲み、その処理に失敗したときにcatch { ~ }の波括弧で囲まれた処理を実行するということです。この場合は、与えられた引数が数値でなかったり、doubleの範囲を超えた引数が与えられたことが原因で処理が失敗する可能性があります。処理が失敗するとreturnによってmainメソッドを抜けるようにしています。

029:    		// 面積を計算
030:    		t = herons_formula( a, b, c );
031:    		if ( 0.0 > t ) {
032:    			System.out.println( "面積の計算に失敗しました" );
033:    		}
034:    		else {
035:    			System.out.println( "辺1の長さ="+ a );
036:    			System.out.println( "辺2の長さ="+ b );
037:    			System.out.println( "辺3の長さ="+ c );
038:    			System.out.println( "面積="+ t );
039:    		}

後で説明するherons_formulaメソッドに3辺の長さa,b,cを渡して面積を計算します。herons_formulaメソッドの戻り値がマイナスの場合は、計算に失敗していることを表しているので、エラーメッセージを表示しています。面積計算に成功した場合は、メッセージを表示しています。

043:    	// 3角形の3辺の長さa,b,cから面積を計算するメソッド
044:    	private static double herons_formula( double a, double b, double c )

新しいメソッドherons_formulaメソッドを定義しています。double型変数a,b,cで3つの辺の長さを与え、double型で面積を返すメソッドです。

046:    		double s;	// s = ( a + b + c ) / 2
047:    		double t;	// 面積
048:    		double d;	// 作業用変数

面積計算で使う変数を宣言しています。

050:    		// 3辺のどれか1つでも0より小さければ-1.0を返す
051:    		if ( ( 0.0 > a ) || ( 0.0 > b ) || ( 0.0 > c ) ) return -1.0;

与えられた3つの引数のうち1つでも0.0より小さい場合は、エラーとして-1.0を返しています。

053:    		// sを計算
054:    		s = ( a + b + c ) / 2.0;

ヘロンの公式で使うsを計算しています。

056:    		// s(s-a)(s-b)(s-c)を計算し、マイナスになれば-1.0を返す
057:    		d = s * ( s - a ) * ( s - b ) * ( s - c );
058:    		if ( 0.0 > d ) return -1.0;

s,a,b,cをヘロンの公式の平行根に渡す値dを計算しています。これは、平方根を計算するMath.sqrtメソッドにマイナスの値を渡さないようするためです。値がマイナスであれば-1.0を返すようにしています。

060:    		// 面積tを計算
061:    		t = Math.sqrt( d );

dの平方根を計算し、tに代入しています。このtの値が面積です。

Math.sqrtメソッド

public static double Math.sqrt( double a )
■引数aで指定した数値の平方根を返します。

  パラメータ a : 平方根を求める数値

  戻り値     aの平方根

063:    		// 計算した面積tを返す
064:    		return t;

計算した面積をtをreturnで戻して終了です。

■関連コンテンツ

平方根 Math.sqrtの使い方について解説
コマンドライン引数 外部からの値を受け取る方法について解説

■新着情報

2017.11.17 N値化 カラー画像をN値化する方法について解説
2017.11.16 最も近い値の取得 指定値に最も近い配列の値を取得する方法を解説
2017.10.02 アルファ値(透過) アルファ値(透過)について

■広告

法人向けのETC専用カード

~約8,000名の受講生と80社以上の導入実績~ 企業向けプログラミング研修ならCodeCamp

日本最大級ショッピングサイト!お買い物なら楽天市場

Topへ