このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1294061094/965
#  [1] 授業単元: cプログラム 
#  [2] 問題文(含コード&リンク):100点満点の試験の得点データが学生の人数分ある。これを「不定個数のデータの読み込み」の 
#   どちらかの方法(最初にデータの個数を読み込むか、データの終わりを特別な値で知らせるか) 
#   で読み込み、10点刻みでの度数分布表を作成しなさい。 
#  

'100点満点の試験の得点データが学生の人数分ある。これを「不定個数のデータの読み込み」のどちらかの方法(最初にデータの個数を読み込むか、データの終わりを特別な値で知らせるか)で読み込み、10点刻みでの度数分布表を作成する' :-
        最初にデータの個数を読み込む(_データの個数),
        length(_得点ならび,_データの個数),
        得点データを読み込む(_得点ならび),
        '10点刻みでの度数分布表を作成する'(_得点ならび,_度数分布ならび),
        度数分布表の表示(_度数分布ならび).

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

データの個数読み込み診断(Line,_データの個数) :-
        atom_to_term(Line,_データの個数,_),
        integer(_データの個数),
        _データの個数 > 0,!.
データの個数読み込み診断(Line,_データの個数) :-
        write_formatted('入力された %t から正の整数が得られませんでした。再入力をお願いします。\n',[Line]),
        fail.

得点データを読み込む(L) :-
        findall(_得点,(
                    append(L0,[_得点|_]),L),
                    得点データを読み込む([_|L0],_得点)),
                L).

得点データを読み込む(Ln,_得点) :-
        length(Ln,Len),
        write_formatted('%t人目の得点を入力してください : ',[Len]),
        get_line(Line),
        得点データ診断(Line,_得点),!.
得点データを読み込む(Ln,_得点) :-
        得点データを読み込む(Ln,_得点).

得点データ診断(Line,_得点) :-
        atom_to_term(Line,_得点,_),
        integer(_得点),
        _得点 >= 0,
        _得点 =< 100,!.
得点データ診断(Line,_) :-
        write_formatted('入力された %t から0以上100以下の整数の得点は得られませんでした。\n再入力をお願いします\n',[Line]),
        fail.

'10点刻みでの度数分布表を作成する'(L,_データの個数,_度数分布表) :-
        '10点刻みでの度数ならびを作成する'(L,[0,0,0,0,0,0,0,0,0,0,0],_度数ならび),
        findall(U,(
                    append(_,[A|_],_度数ならび),
                    U is truncate(floor((A * 100 / _データの個数) + 0.5))),
                _度数分布表).

'10点刻みでの度数ならびを作成する'([],L,L) :- !.
'10点刻みでの度数ならびを作成する'([A|R],L1,L) :-
        度数ならびの更新(A,L1,L2),
        '10点刻みでの度数ならびを作成する'(R,L2,L).

度数ならびの更新(_得点,L1,L2) :-
        _位置 is _点数 // 10,
        append(L0,[_度数|R],L1),
        length(L0,_位置),
        _度数2 is _度数 + 1,
        append(L0,[_度数2|R],L2),!.

度数分布表の表示(_度数分布表) :-
        write('階級 , 度数\n'),
        度数分布表の表示(0,_度数分布表).

度数分布表の表示(_,[]) :- !.
度数分布表の表示(100,[_度数|R]) :-
        write_formatted('%2d   ,%3d\n',[N,N1,_度数]),!.
度数分布表の表示(N,[_度数|R]) :-
        N1 is N + 9,
        write_formatted('%2d-%2d,%3d\n',[N,N1,_度数]),
        N2 is N + 10,
        度数分布表の表示(N2,R).