このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/675
#  [1] 授業単元:プログラミングC 
#  [2] 問題文(含コード&リンク):ある学校の複数のクラスで試験を実施した. 
#  クラスごとの各学生の試験の得点が2次元配列の形で与えられている. 
#  クラスごとの平均点を計算 
#  し,コンソールに出力するプログラムを作成せよ 
#  
#  ==== クラス 0: 4人 ==== 
#  出席番号 0: 得点 32点 
#  出席番号 1: 得点 52点 
#  出席番号 2: 得点 18点 
#  出席番号 3: 得点 58点 
#  クラス平均点:40.0点 
#  ==== クラス 1: 3人 ==== 
#  出席番号 0: 得点 41点 
#  出席番号 1: 得点 59点 
#  出席番号 2: 得点 50点 
#  クラス平均点:50.0点 
#  ==== クラス 2: 6人 ==== 
#  出席番号 0: 得点 63点 
#  出席番号 1: 得点 83点 
#  出席番号 2: 得点 71点 
#  出席番号 3: 得点 89点 
#  出席番号 4: 得点 77点 
#  出席番号 5: 得点 97点 
#  クラス平均点:80.0点 
# 


試験の点数([[32,52,18,58],[41,59,50],[63,83,71,89,77,97]]).

program :- 'ある学校の複数のクラスで試験を実施した.クラスごとの各学生の試験の得点が2次元配列の形で与えられている.クラスごとの平均点を計算し,コンソールに出力する'.

'ある学校の複数のクラスで試験を実施した.クラスごとの各学生の試験の得点が2次元配列の形で与えられている.クラスごとの平均点を計算し,コンソールに出力する' :-
        試験の点数(_試験の点数),
        クラスごとの平均点(_試験の点数,_クラスごとの平均点),
        コンソールに出力する(_クラスごとの平均点).

クラスごとの平均点([],[]).
クラスごとの平均点([L|R1],[[_平均点,L]|R2]) :-
        相加平均(L,_平均点),
        コンソールに出力する
        クラスごとの平均点(R1,R2).

コンソールに出力する(_クラスごとの平均点) :-
        append(L0,[[_平均点,L]|R],_クラスごとの平均点),
        クラス番号とメンバー数の表示(L0,L),
        メンバーの得点表示(L),
        平均点の表示(_平均点),
        R = [],!.

クラス番号とメンバー数の表示(L0,L) :-
        length(L0,_クラス番号),
        length(L,_メンバー数),
        writef('====クラス%t: %t人====\n',[_クラス番号,_メンバー数]).

メンバーの得点表示(L) :-
        append(L0,[_得点|R],L),
        length(L0,_出席番号),
        writef('出席番号 %t: 得点 %t点\n',[_出席番号,_得点]),
        R = [],!.

平均点の表示(_平均点) :-
        _平均点表示 is truncate(_平均点 * 10) / 10,
        writef('クラス平均点: %t点\n',[_平均点表示]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

相加平均(L,M) :-
        length(L,N),
        相加平均(L,N,0.0,M).

相加平均([],N,S,M) :-
        M is S / N,!.
相加平均([A|R],N,S,M) :-
        S1 is S + A,
        相加平均(R,N,S1,M).