このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/335
#  [1] 授業単元:楽しいプログラミング  
#  [2] 問題文(含コード&リンク): 以下の実行例のように,三角形の2 辺の長さとその2 
#  辺のなす角(0〜180[deg])を入力すると,もう1 辺の 
#  長さと,三角形の面積を表示するプログラムを作成せ 
#  よ.π = 3.14159265 とする. 
#   [3.1] OS: linux 
#   [3.2] コンパイラ名とバージョン: gcc 3.4  
#   [3.3] 言語: C 
#  [4] 期限:2011年11月17日 9:00まで 
#  [5] その他の制限: while, if, for, 配列まで 
#   
#    例 
#   三角形の2 辺の長さを入力してください。 
#    辺1:-3.0 
#    正の値を入力してください。辺1:3.0 
#    辺2:6.0 
#    2 辺のなす角度[deg] を入力してください:200.0 
#    0<角度[deg]<180 の値を入力してください。30.0 
#    もう1 辺の長さ= 3.717941 
#    三角形の面積= 4.500000 
# 
# 

'三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると,もう1 辺の長さと,三角形の面積を表示するプログラムを作成せよ.π = 3.14159265 とする' :-
         '三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると'(_辺の長さ_1,_辺の長さ_2,_2辺のなす角),
         もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角).

'三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると'(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :-
        write('三角形の2 辺の長さを入力してください。 '),
        辺の長さ_1の入力(_辺の長さ_1),
        辺の長さ_2の入力(_辺の長さ_2),
        '2辺のなす角の入力'(_2辺のなす角).

辺の長さ_1の入力(_辺の長さ_1) :-
        write('辺[1] : '),
        get_line(Line),
        辺の長さ_1の入力診断(Line,_辺の長さ_1),!.
辺の長さ_1の入力(_辺の長さ_1) :-
        辺の長さ_1の入力(_辺の長さ_1).

辺の長さ_2の入力(_辺の長さ_2) :-
        write('辺[2] : '),
        get_line(Line),
        辺の長さの入力診断(Line,_辺の長さ_2),!.
辺の長さ_2の入力(_辺の長さ_2) :-
        辺の長さ_2の入力(_辺の長さ_2).

辺の長さの入力診断(Line,_辺の長さ) :-
        atom_to_term(Line,_辺の長さ,_),
        number(_辺の長さ),
        _辺の長さ > 0.0,!.        
辺の長さの入力診断(Line,_辺の長さ) :-
        writef('入力された %t からは三角形の辺にあたる情報が得られません。再入力をお願いします。\n',[Line]),
        fail.

'2辺のなす角の入力'(_2辺のなす角) :-
        write('2辺のなす角度を入力して下さい (0<角度<180) : '),
        get_line(Line),
        '2辺のなす角の入力診断'(Line,_2辺のなす角),!.
'2辺のなす角の入力'(_2辺のなす角) :-
        '2辺のなす角の入力(_2辺のなす角).

'2辺のなす角の入力診断'(Line,_2辺のなす角) :-
        atom_to_term(Line,_2辺のなす角),
        number(_2辺のなす角),
        _2辺のなす角 > 0.0,
        _2辺のなす角 < 180.0,!.
'2辺のなす角の入力診断'(Line,_2辺のなす角) :-
        writef('入力された%t からは2辺のなす角を得られません。再入力をお願いします。\n',[Line]),
        fail.

もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :-
        _辺の長さ_2 >= _辺の長さ_1,
        もう1辺の長さ(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_もう1辺の長さ),
        三角形の面積(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_三角形の面積),
        表示する(_もう1辺の長さ,_三角形の面積),!.
もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :-
        _辺の長さ_2 < _辺の長さ_1,
        もう1辺の長さと三角形の面積を表示する(_辺の長さ_2,_辺の長さ_1,_2辺のなす角).

もう1辺の長さ(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_もう1辺の長さ) :-
        _三角形の高さ is _辺の長さ_1 * sin(_2辺のなす角 / 180 * pi),
        _辺の長さ_2_1 is _辺の長さ_1 * cos(_2辺のなす角 / 180 * pi),
        _辺の長さ_2_2 is _辺の長さ_2 - _辺の長さ_2_1,
        _もう1辺の長さ is sqrt(_辺の長さ_2_2 * _辺の長さ_2_2 + _三角形の高さ * _三角形の高さ).

三角形の面積(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_三角形の面積) :-
        _三角形の高さ is _辺の長さ_1 * sin(_2辺のなす角 / 180 * pi),
        _三角形の面積 is _辺の長さ_2 * _三角形の高さ / 2.

表示する(_もう1辺の長さ,_三角形の面積) :-
        writef('%16c : %12r\n%16c : %12r\n',[もう1辺の長さ,_もう1辺の長さ,三角形の面積,_三角形の面積]).