このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/109
#  [1] 授業単元:C  
#  [2] 問題文(含コード&リンク):  
#  テストを受験した学生の人数をまず入力し、それから各学生達のテストの点数を次々に入力して配列に格納したうえで、 
#  0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示するプログラムを作成しなさい。 
#  ただしテストを受験する学生の人数は10人以下とする。 
#  

'テストを受験した学生の人数をまず入力し、それから各学生達のテストの点数を次々に入力して配列に格納したうえで、0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示するプログラムを作成しなさい。ただしテストを受験する学生の人数は10人以下とする。' :-
        'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数),
        'それから各学生達のテストの点数を次々に入力して配列に格納したうえで、'(_各学生たちのテストの点数の格納されたならび),
        '0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示する'(_各学生たちのテストの点数の格納されたならび).

'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数) :-
        write('テストを受験した学生の人数(10人以下)を入力してください : '),
        get_line(Line),
        '診断: テストを受験した学生の人数'(Line,_学生の人数),!.
'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数) :-
        'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数).

'診断: テストを受験した学生の人数'(Line,_学生の人数) :-
        atom_to_term(Line,_学生の人数,_),
        integer(_学生の人数),
        _学生の人数 >= 0,
        _学生の人数 =< 10.

'それから各学生達のテストの点数を次々に入力して配列に格納したうえで、'(_学生の人数,_各学生たちのテストの点数の格納されたならび) :-
        length(_各学生たちのテストの点数の格納されたならび,_学生の人数),
        findall(_点数,(
                    各学生達のテストの点数を次々に入力して(_各学生たちのテストの点数の格納されたならび,_点数)),
                _各学生たちのテストの点数の格納されたならび).

各学生達のテストの点数を次々に入力して(_各学生たちのテストの点数の格納されたならび,_点数) :-
        append(Ln,[_|_],_各学生たちのテストの点数の格納されたならび),
        length([_|Ln],_何番目),
        writef('%t番目の点数 : ',[_何番目]),
        get_integer(_点数).

'0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示する'(_各学生たちのテストの点数の格納されたならび) :-
        '80点未満のランクの表示'(A,B,_各学生たちのテストの点数の格納されたならび),
        '80点以上 100点以下の表示'(_各学生たちのテストの点数の格納されたならび).

'80点未満のランクの表示'(_各学生たちのテストの点数の格納されたならび) :-
        append(_,[[A,B]|R],[[A,B],[[0,20],[20,40],[40,60],[60,80]]),
        ランク範囲の人数(A,B,_各学生たちのテストの点数の格納されたならび,_人数)),
        writef('%t点以上 %t点未満   %t 人\n',[A,B,_人数]),
        R = [].

ランク範囲の人数(A,B,_各学生たちのテストの点数の格納されたならび,_人数) :-
        count((
                    member(_点数,_各学生たちのテストの点数の格納されたならび),
                    _点数 >= A,
                    _点数 < B),
                _人数).

'80点以上 100点以下の表示'(_各学生たちのテストの点数の格納されたならび) :-
        count((
                    member(_点数,_各学生たちのテストの点数の格納されたならび),
                    _点数 >= 80,
                    _点数 =< 100),
                _人数),
        writef('80点以上 100点以下   %t 人\n',[_人数]).