このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/383
#   
#  [1] 授業単元:プログラミング演習 
#   
#  [2] 問題文(含コード&リンク): 
#   
#   
#  http://ime.nu/codepad.org/bMCs37CD 
#   
#  4):
#  身体検査データを構造体配列として格納し、身長の平均値と視力の分布を求める
#  プログラムを作成する。身長検査データは標準入力からでもプログラムに記述でも
#  どちらでもいい。
#  
#  結果 平均身長 〇〇cm
#     視力の分布 0.0〜:○人
#           0.1〜:○人(以下略
#  
#  struct{
#  
#  }

'身体検査データを構造体配列として格納し、身長の平均値と視力の分布を求める' :-
        身体検査データ(_身体検査データならび),
        身長の平均値を求める(_身体検査データならび,_身長の平均値),
        視力の分布を求める(_身体検査データならび,_度数分布).
        結果を表示する(_身長の平均値,_度数分布).

身長の平均値を求める(_身体検査データならび,_身長の平均値) :-
        findavg(_身長,(
                    append(_,[個人データ(氏名(_),身長(_身長),視力(_))|_],_身体検査データならび)),
                _身長の平均値).

視力の分布を求める(_身体検査データならび,_度数分布) :-
        length(_身体検査データならび,_標本数),
        findall([_階級下限,_階級上限,_度数,_比率],(
                    '0.0から2.0まで0.1刻みの階級で'(_階級下限,_階級上限),
                    階級の度数(_階級下限,_階級上限,_度数),
                    _比率 is _度数 / _標本数),
                _度数分布).

'0.0から2.0まで0.1刻みの階級で'(_階級下限,_階級上限) :-
        '0.0から2.0まで0.1刻みの階級で'(0.0,0.1,_階級下限,_階級上限).

'0.0から2.0まで0.1刻みの階級で'(_階級下限,_階級上限,_階級下限,_階級上限),
        _階級上限 =< 2.0.
'0.0から2.0まで0.1刻みの階級で'(_階級下限_1,_階級上限_1,_階級下限,_階級上限) :-
        _階級上限_1 =< 2.0,
        _階級下限_2 is _階級下限_1 + 0.1,
        _階級上限_2 is _階級上限_1 + 0.1,
        '0.0から2.0まで0.1刻みの階級で'(_階級下限_2,_階級上限_2,_階級下限,_階級上限).

階級の度数(_階級下限,_階級上限,_度数) :-
        count((
                    append(_,[個人データ(氏名(_),身長(_),視力(_視力))|_],_身体検査データならび),
                    _視力>=_階級下限,
                    _視力< _階級上限),
                _度数).

結果を表示する(_身長の平均値,_度数分布) :-
        writef('平均身長 %8r cm\n視力の分布 ',[_身長の平均値]),
        append(_,[_階級下限,_,_度数,_]|R],_度数分布),
        度数分布明細表示(_階級下限,_度数,R).        
        R = [].

度数分布明細表示(_階級下限,_度数,[]) :-
        writef(' %4r 〜: %4r人\n',[_階級下限,_度数]),!.
度数分布明細表示(_階級下限,_度数,_) :-
        writef(' %4r 〜: %4r人\n         ',[_階級下限,_度数]).