このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/522
#  [1] 情報処理演習 
#  [2]  問題:何個かのデータをもらって,その平均,総和,最大値,最小値,標準偏差を計算するプログラムを作成する.プログラムは以下の条件をみたすこと. 
#  ・あらかじめ100個の整数型の要素を持つ配列を定義しておく. 
#  ・scanfを用いてデータの個数を入力できること.また,scanfを用いてデータの値を配列に入力できること. 
#  ・if文を用いて0以下,101以上のデータの個数が入力されないようにすること. 
#  ・for文を用いること. 
#  ・解は実数で求めること. 
#  実行例 
#  ================================ 
#  Input integer: 5 
#  Input numbers: 
#  40 
#  50 
#  60 
#  70 
#  80 
#  Average: 60 
#  Sum: 300 
#  Max: 80 
#  Min: 40 
#  Standard Deviation: 14.1 
#  ================================ 
#  

'あらかじめ100個の整数型の要素を持つならびを定義しておく'(_100個の整数型の要素を持つならび) :-
        length(_100個の整数型の要素を持つならび,100),
        assertz('100個の整数型の要素を持つならび'(_100個の整数型の要素を持つならび)).

'何個かのデータをもらって,その平均,総和,最大値,最小値,標準偏差を計算する' :-
        '100個の整数型の要素を持つならび'(_100個の整数型の要素を持つならび),
        データの個数を入力(_データの個数),
        データの入力(_データの個数,_100個の整数型の要素を持つならび),
        '平均・総和・最大値・最小値・標準偏差'(_100個の整数型の要素を持つならび,_平均,_総和,_最大値,_最小値,_標準偏差),
        表示('平均: %t\n総和: %t\n最大値: %t\n最小値: %t\n標準偏差: %t\n',[_平均,_総和,_最大値,_最小値,_標準偏差]).

データの個数を入力(_データの個数) :-
        write('データの個数を入力してください : '),
        get_line(Line),
        データの個数入力診断(Line,_データの個数),!.
データの個数を入力(_データの個数) :-
        データの個数を入力(_データの個数).

データの個数入力診断(Line,_データの個数) :-
        atom_to_term(Line,_データの個数,_),
        integer(_データの個数),
        _データの個数 > 0,
        _データの個数 < 101,!.
データの個数入力診断(Line,_データの個数) :-
        writef('入力された %t はデータの個数として適切ではありません。再入力をお願いします : ',[Line]),
        fail.

データの入力(_データの個数,_100個の整数型の要素を持つならび) :-
        length(L,_データの個数),
        findall(_整数,(
                    append(_,[_整数|_],L),
                    get_integer(_整数)),
                L),
        append(L,_,_100個の整数型の要素を持つならび).

'平均・最大値・最小値・標準偏差'(_100個の整数型の要素を持つならび,_平均,_最大値,_最小値,_標準偏差) :-
        平均(_100個の整数型の要素を持つならび,_平均),
        総和(_100個の整数型の要素を持つならび,_総和),
        最大値(_100個の整数型の要素を持つならび,_最大値),
        最小値(_100個の整数型の要素を持つならび,_最小値),
        標準偏差(_100個の整数型の要素を持つならび,_標準偏差).

総和([A|R],0) :-
        var(A),!.
総和([A|R],_総和) :-
        総和(R,_総和_1),
        _総和 is A + _総和_1,!.
総和([],0).

平均(L,_平均) :-
        length(L,_要素数),
        _要素数 > 0,
        総和(L,_総和),
        _平均 is _総和 / _要素数.

最大値(L,_最大値) :-
        append(L0,[_最大値|R],L),
        \+((member(V1,L0),\+(var(V1)),V1 > _最大値)),
        \+((member(V2,R),\+(var(V2)),V2 > 最大値)).

最小値(L,_最小値) :-
        append(L0,[_最小値|R],L),
        \+((member(V1,L0),\+(var(V1)),V1 < _最小値)),
        \+((member(V2,R),\+(var(V2)),V2 < 最小値)).

標準偏差([A|_],N,_,_総和,_標準偏差) :-
        var(A),
        V is sqrt(_総和 / (N - 1)),!.
標準偏差([],N,_,_総和,_標準偏差) :-
        V is sqrt(_総和 / (N - 1)),!.
標準偏差([A|R],N,_平均,S,_標準偏差) :-
        S1 is (A - _平均) ^ 2,
        S2 is S + S1,
        標準偏差(R,N,_平均,S2,V).

標準偏差(L,_標準偏差) :-
        length(L,N),
        算術平均(L,_平均),
        標準偏差(L,N,_平均,0.0,_標準偏差).