while True:

問題14

四辺形 ABCD の面積を計算するプログラムを作れ.ただし,頂点 A, B, C, D の位置は,直交系を基準とするそれぞれの座標(x, y)で与えられるものとする. [ヒント]四辺形 ABCD を 2 つの三角形に分割し,各三角形の面積をヘロンの公式 𝑆 = √𝑠(𝑠 − 𝑎)(𝑠 − 𝑏)(𝑠 − 𝑐) (ただし,𝑎, 𝑏, 𝑐 は各辺の長さで,𝑠 = (𝑎 + 𝑏 + 𝑐)⁄2)により求め,それらの和として全体の面積を計算する. ただし,念のため,四辺形を三角形 ABC と ACD に分割した場合と ABD とBCD とに分割した場合の両方について計算するようにプログラムせよ. 変な形の四辺形の場合(四辺形の内角のひとつが 180 度を越える場合)には,異なる答えが得られる. このときは小さい方の答えが正しい.

難易度 ★★★☆☆

標準的な問題です。それぞれの辺の長さを出し、ヘロンの公式に入れるだけの簡単なお仕事です。それぞれの辺の長さを変数に入れておくと見やすくていい気がします。
program question14
	implicit none
	real :: pos(4, 2), AB, BC, CD, AC, BD, DA, k, S1, S2

	print *, "input ABCD(x, y):"
	read *, pos

	AB = ((pos(1, 1) - pos(2, 1)) ** 2 + (pos(1, 2) - pos(2, 2)) ** 2) ** 0.5
	BC = ((pos(2, 1) - pos(3, 1)) ** 2 + (pos(2, 2) - pos(3, 2)) ** 2) ** 0.5
	CD = ((pos(3, 1) - pos(4, 1)) ** 2 + (pos(3, 2) - pos(4, 2)) ** 2) ** 0.5
	DA = ((pos(4, 1) - pos(1, 1)) ** 2 + (pos(4, 2) - pos(1, 2)) ** 2) ** 0.5
	AC = ((pos(1, 1) - pos(3, 1)) ** 2 + (pos(1, 2) - pos(3, 2)) ** 2) ** 0.5
	BD = ((pos(2, 1) - pos(4, 1)) ** 2 + (pos(2, 2) - pos(4, 2)) ** 2) ** 0.5

	! ABC and ACD
	k = (AB + BC + AC) / 2
	S1 = (k * (k - AB) * (k - BC) * (k - AC)) ** 0.5
	k = (AC + CD + DA) / 2
	S1 = S1 + (k * (k - AC) * (k - CD) * (k - DA)) ** 0.5

	! ABD and BCD
	k = (AB + BD + DA) / 2
	S2 = (k * (k - AB) * (k - BD) * (k - DA)) ** 0.5
	k = (BC + CD + BD) / 2
	S2 = S2 + (k * (k - BC) * (k - CD) * (k - BD)) ** 0.5

	if (S1 < S2) then
		print *, S1
	else
		print *, S2
	end if

end program question14
ページのトップへ戻る