本サイトAIZU ONLINE JUDGE ITP1_10_B へはこちらから
問題:三角形
三角形の2辺 a, b とその間の角 C から、その三角形の面積 S、周の長さ L, a を底辺としたときの高さ h を求めるプログラムを作成して下さい。
Input
a の長さ, b の長さ, Cの大きさ(度)(整数)が空白区切りで与えられます。
Output
S, L, h をそれぞれ1行に出力して下さい。0.0001以下の誤差があってもよいものとします。
Sample Input
4 3 90
Sample Output
6.00000000
12.00000000
3.00000000
解答例
import math
a, b, C = map(int, input().split())
rad = math.radians(C)
S = 0.5*a*b*math.sin(rad)
h = 2*S/a
c = math.sqrt(a**2+b**2-2*a*b*math.cos(rad))
L = a+b+c
print(S, L, h, sep="\n")
解説
以下のように解いていきます。
3つの整数の読み込み
ここではmap関数を使用します。第二引数のinput().split()で空白区切りの文字列を取得した値を、一つずつint関数に当てはめてint型に変換、a, b, Cに設定していきます。
# input().split()で空白区切りの文字列を取得 → intに変換 → a, b, C に設定
a, b, C = map(int, input().split())
※サイト内「AIZU ONLINE JUDGE ITP1_1_Cをpythonで解いてみた」の、map関数とはに使用方法が書かれておりますのでよかったらご覧ください。
度をラジアンに変換
math.radiansの引数に角度を設定することにより、ラジアンを求める事ができます。
文頭に”import math”と宣言し、数学処理に必要となる機能(mathモジュール)をimportすることで使用することができます。
# mathモジュールをインポート
import math
# math.radianで度をラジアンに変換
rad = math.radians(C)
※mathモジュールのmath.radiansに関してはこちらに書かれておりますのでよかったらご覧ください。
三角形の高さ、面積、cの長さ、周の長さを求める
三角形の面積は2辺とその間の角度θから求める事ができます。
今回は、2.度をラジアンに変換で求めたラジアンを使用し0.5*a*b*math.sin(rad)となります。
# 面積
S = 0.5*a*b*math.sin(rad)
※mathモジュールのmath.sinに関してはこちらに書かれておりますのでよかったらご覧ください。
高さ(h)は三角形の公式から求めます。三角形の面積の公式は
面積(S) = 底辺(a) × 高さ(h) × \(\frac{1}{2}\)
これを変形し
高さ(h) = 2 × 面積(S) × \(\frac{1}{底辺(a)}\)
となります。
# 高さ
h = 2*S/a
cは余弦定理を使用して求めます。
c2 = a2 + b2 + 2ab cosC より c**2 = a**2+b**2-2*a*b*math.cos(rad)
この右辺をmath.sqrt()の引数に設定し、平方根cを求めます。
# 余弦定理からa**2+b**2-2*a*b*math.cos(rad)をmath.sqrtの引数に設定し平方根を求める
c = math.sqrt(a**2+b**2-2*a*b*math.cos(rad))
※mathモジュールのmath.cosに関してはこちらに書かれておりますのでよかったらご覧ください。
※mathモジュールのmath.sqrtに関してはこちらに書かれておりますのでよかったらご覧ください。
周の長さ(L)はa+b+cとなります。
# 周の長さ
L = a+b+c
三角形の面積、周の長さ、高さを表示する
print関数を使用し、3.三角形の高さ、面積、cの長さ、周の長さを求めるで求めた結果を表示します。
引数をS, L, hで設定し、sepに改行コード”\n”を設定し、改行して表示されるようにします。
# 区切り文字を指定する引数sepに改行コード"\n"を設定し、改行して表示する。
print(S, L, h, sep="\n")
※サイト内「AIZU ONLINE JUDGE ITP1_1_Aをpythonで解いてみた」の、print関数とはにも使用方法が書かれておりますのでよかったらご覧ください。
最後に、もう一度プログラムを確認してみましょう。
# mathモジュールをインポート
import math
# input().split()で空白区切りの文字列を取得 → intに変換 → a, b, C に設定
a, b, C = map(int, input().split())
# math.radianで度をラジアンに変換
rad = math.radians(C)
# 面積
S = 0.5*a*b*math.sin(rad)
# 高さ
h = 2*S/a
# 余弦定理からa**2+b**2-2*a*b*math.cos(rad)をmath.sqrtの引数に設定し平方根を求める
c = math.sqrt(a**2+b**2-2*a*b*math.cos(rad))
# 周の長さ
L = a+b+c
# 区切り文字を指定する引数sepに改行コード"\n"を設定し、改行して表示する。
print(S, L, h, sep="\n")
コメント