このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1335517816/994
#  [1] 授業単元:C 
#  [2] 問題文(含コード&リンク): 
#  まずテストを受けた生徒の人数を入力し、 
#  それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して 
#  2次元の配列に格納したうえで、生徒別の合計点・平均点と科目別の合計点・平均点とを 
#  小数点以下まで計算して表示するプログラムを作成しなさい。 
#  ただしテストを受ける生徒の人数は20人以下とする。 
#   

 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)、それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して2次元の配列に格納したうえで、生徒別の合計点・平均点と科目別の合計点・平均点とを小数点以下まで計算して表示する。' :-
        'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数),
        'それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して2次元の配列に格納したうえで'(_生徒の人数,_生徒の二次元得点ならび),
        '生徒別の合計点・平均点と科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび).

'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数) :-
        get_line(Line),
        '診断: 生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(Line,_生徒の人数),!.
'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数) :-
        'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数).

'診断: 生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(Line,_生徒の人数) :-
        atom_to_term(Line,_生徒の人数),
        ただしテストを受ける生徒の人数は20人以下(_生徒の人数),!.
'診断: 生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(Line,_生徒の人数) :-
        writef('入力された %t からは20人以下の生徒数が得られません。再入力をお願いします。\n',[Line]),
        fail.

ただしテストを受ける生徒の人数は20人以下(_生徒の人数) :-
        integer(_生徒の人数),
        _生徒の人数 > 0,
        _生徒の人数 =< 20.

'それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して2次元の配列に格納したうえで'(_生徒の人数,_生徒の二次元得点ならび) :-
        length(_生徒の二次元得点ならび,_生徒の人数),
        findall([_国語の点数,_数学の点数,_英語の点数],(
                    append(Ln,[_|_],_生徒の二次元得点ならび),
                    '国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数)),
                _生徒の二次元得点ならび).

'国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数) :-
        length([_|Ln],_何番目),
        writef('%t番目の生徒の国語・数学・英語の点数をカンマ区切りで入力してください : ',[_何番目]),
        get_line(Line),
        '診断: 国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,Line,_国語の点数,_数学の点数,_英語の点数),!.
'国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数) :-
        '国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数).

'診断: 国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,Line,_国語の点数,_数学の点数,_英語の点数) :-
        split(Line,[',',' '],[_国語の点数,_数学の点数,_英語の点数]),
        '0〜100点の整数値'(_国語の点数),
        '0〜100点の整数値'(_数学の点数),
        '0〜100点の整数値'(_英語の点数),!.

'0〜100点の整数値'(_国語の点数) :-
        integer(_点数),
        _点数 >= 0,
        _点数 =< 100.

'生徒別の合計点・平均点と科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび) :-
        '生徒別の合計点・平均点を小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび),
        '科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび),

'生徒別の合計点・平均点を小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび) :-
        append(Ln,[_生徒の得点ならび|R],_生徒の二次元得点ならび),
        length([_|Ln],_何番目),
        sum(_生徒の得点ならび,_生徒の合計点),
        _生徒の平均点 is _生徒の合計点 / 3,
        writef('%t番目の生徒の合計点は %t, 平均点は %t です。\n',[_生徒の合計点,_生徒の平均点]),
        R = [].

'科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび) :-
        転置(_生徒の二次元得点ならび,[_国語の得点ならび,_数学の得点ならび,_英語の得点ならび]),
        国語の合計点と平均点を表示する(_生徒の人数,_国語の得点ならび),
        数学の合計点と平均点を表示する(_生徒の人数,_数学の得点ならび),
        英語の合計点と平均点を表示する(_生徒の人数,_英語の得点ならび).

国語の合計点と平均点を表示する(_生徒の人数,_国語の得点ならび) :-
        sum(_国語の得点ならび,_国語の合計点),
        _国語の平均点 is _国語の合計点 / _生徒の人数,
        writef('国語の合計点は %t, 国語の平均点は %t です\n',[_国語の合計点,_国語の平均点]).

数学の合計点と平均点を表示する(_生徒の人数,_数学の得点ならび) :-
        sum(_数学の得点ならび,_数学の合計点),
        _数学の平均点 is _数学の合計点 / _生徒の人数,
        writef('数学の合計点は %t, 数学の平均点は %t です\n',[_数学の合計点,_数学の平均点]).

英語の合計点と平均点を表示する(_生徒の人数,_英語の得点ならび) :-
        sum(_英語の得点ならび,_英語の合計点),
        _英語の平均点 is _英語の合計点 / _生徒の人数,
        writef('英語の合計点は %t, 英語の平均点は %t です\n',[_英語の合計点,_英語の平均点]).



%  sum/2