このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/17
#  [1] 授業単元:配列 
#  [2] 問題文(含コード&リンク): 
#  10人の身長(cm単位の実数)を入力させ、配列に記憶する。 
#  その後、平均身長を求めて表示した後、10人分の身長を表示するプログラムを作成しなさい。  
#  

'10人の身長(cm単位の実数)を入力させ、配列に記憶する。その後、平均身長を求めて表示した後、10人分の身長を表示する' :-
        'n人分の身長(cm単位の実数)を入力させ、配列に記憶する'(10,_10人分の身長ならび),
        その後、平均身長を求めて表示(_10人分の身長ならび),
        '10人分の身長を表示する'(_10人分の身長ならび).

'n人分の身長(cm単位の実数)を入力させ、配列に記憶する'(_n,_n人分の身長ならび) :-
        writef('%t人分の身長(実数)をカンマ区切りで入力してください : ',[_n]),
        get_line(Line),
        入力診断(Line,_n,_n人分の身長ならび),!.
'n人分の身長(cm単位の実数)を入力させ、配列に記憶する'(_n,_n人分の身長ならび) :-
        'n人分の身長(cm単位の実数)を入力させ、配列に記憶する'(_n,_n人分の身長ならび).

入力診断(Line,_n,_n人分の身長ならび) :-
        split(Line,[',',' '],L1),
        全て実数化(L1,L2),
        入力診断のニ(L2,_n,_n人分の身長ならび).
入力診断(Line,_n,_) :-
        writef('入力された %t から%t個の実数が得られません。再入力をお願いします。\n',[Line,_n]),
        fail.

入力診断のニ(L1,_n,_n人分の身長ならび) :-
        length(_n人分の身長ならび,_n),
        append(_n人分の身長ならび,L2,L1),
        length(L2,_n_2),
        writef('入力要素が10項を越えました。%t項を切り取ります\n',[_n_2]),!.
入力診断のニ(L1,_n,_n人分の身長ならび) :-
        length(_n人分の身長ならび,_n),
        append(L1,L2,_n人分の身長ならび),
        length(L2,_n_2),
        writef('入力が%t項足りません\n',[_n_2]),
        補充の身長を入力する(_n_2,L2).

補充の身長を入力する(_n,_n人分の身長ならび) :-
        '身長(cm単位の実数)を入力させ、配列に記憶する'(_n,_n人分の身長ならび).

すべて実数化([],[]).
すべて実数化([V|R1],[V|R2]) :-
        real(V),
        すべて実数化(R1,R2).
すべて実数化([N|R1],[V|R2]) :-
        integer(N),
        V is N * 1.0,
        すべて実数化(R1,R2).

その後、平均身長を求めて表示(L) :-
        findavg(A,append(_,[A|_],L),_平均身長),
        writef('平均身長は %t \n',[_平均身長]).

'10人分の身長を表示する'(L) :-
        concat_atom(L,' ',S),
        writef('入力された10人の身長は %t です\n',[S]).