このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/399
#  [1] 授業単元:C言語入門 
#  [2] 問題文(含コード&リンク):http://ime.nu/i.imgur.com/UwzPZ.jpg 
#  
#  
#  下の例のような、学生の4科目の(数学、物理、科学、英語)の試験点数(100点満点)を
#  書いたファイルがある。(学生数は100名以下)
#  
#  ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、
#  各科目の平均点を表示するプログラムを作成する。
#  
#  ・ 科目名(6文字未満)を入れる文字列(文字の一次元配列)を4つ用意する。
#  
#  ・ 学籍番号と点数を一緒に入れる二次元整数配列を用意する
#     例   int tensu[ ? ][ ? ]
#  
#  最初に二次元配列を表示して、実行例のように点数を表示し、次に各学生の
#  平均点、各科目の平均点を表示する。
#  
#  ただし、ファイルの先頭には学生数(この例では5名)があり、つぎに4科目の
#  科目名(数学、物理、科学、英語)が記述され、続いて、1行目に指定した学生数分
#  の学籍番号と各試験点数が書かれている。
#  
#  
#  ファイルの例(5名の例)
#  
#  5
#  Math Phys Chem Eng
#  8001 78 64 88 90
#  8004 34 40 52 67
#  8013 83 77 89 93
#  8035 98 81 69 77
#  8062 56 63 47 23
#  
#  表示例
#  
#  点数 ::::
#  8001 78 64 88 90
#  8004 34 40 52 67
#  8013 83 77 89 93
#  8035 98 81 69 77
#  8062 56 63 47 23
#  
#  学生平均 ::::
#  8001 : 80.0
#  8004 : 48.25
#  8013 : 85.50
#  8035 : 81.25
#  8062 : 47.25
#  
#  科目平均
#  数学 : 69.8
#  物理 : 65.0
#  科学 : 69.0
#  英語 : 70.0
#  


'ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_ファイル名) :-
        'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび),
        '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび).

'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :-
        get_lines(_ファイル名,Lines),
        'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数),
        'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび),
        '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび),!.

'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数) :-
        Lines = [_学生数文字列|_],
        atom_to_term(_学生数文字列,_学生数,_),
        integer(_学生数),!.

'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび) :-
        Lines = [_,_二行目文字列|_],
        split(_二行目文字列,[' ',','],_科目名ならび),!.

'続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび) :-
        length(_学籍番号と各試験点数ならび,_学生数),
        Lines = [_,_|_残りLines],
        findall(_学籍番号と各点数,(
                    append(_,[_学籍番号と各点数文字列|_],_残りLines),
                    aplit(_学籍番号と各点数文字列,[' ',','],_学籍番号と各点数)),
                _学籍番号と各試験点数ならび).

'学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :-
        学生の科目の一覧を表示(_学籍番号と各試験点数ならび),
        '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび).

学生の科目の一覧を表示(_学籍番号と各試験点数ならび) :-
        append(_,[_学籍番号と各試験点数|R],_学籍番号と各試験点数ならび),
        concat_atom(_学籍番号と各試験点数,' ',_表示文字列),
        writef('%t\n',[_表示文字列]),
        R = [].

'各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび) :-
        各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび),
        各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点ならび),
        各学生の平均点を表示する(_各学生の平均点ならび),
        各科目の平均点を表示する(_各科目の平均点ならび).

各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび) :-
        findall([_学籍番号,_平均点],(
                    append(_,[[_学籍番号|L]|_],_学籍番号と各試験点数ならび),
                    相加平均(L,_平均点)),
                _各学生の平均点ならび).

各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点ならび) :-
        転置(_学籍番号と各試験点数ならび,[_|_科目別点数ならび]),
        findall([_科目名,_平均点],(
                    科目名と点数ならびを得る(_科目名ならび,_学籍番号と各試験点数ならび,_科目名,_点数ならび),
                    相加平均(_点数ならび,_平均点)),
                _各科目の平均点ならび).

科目名と点数ならびを得る(_科目名ならび,_学籍番号と各試験点数ならび,_科目名,_点数ならび) :-
        append(L0,[_科目名|_],_科目名ならび),
        length(L0,Len),
        nth1(Len,_科目別点数ならび,_点数ならび).

各学生の平均点を表示する(_各学生の平均点ならび) :-
        write('\n学生平均 ::::\n'),
        append(_,[[_学籍番号,_平均点]|R],_各学生の平均点ならび),
        writef('%8r : %5r\n',[_学籍番号,_平均点]),
        R = [].

各科目の平均点を表示する(_各科目の平均点ならび) :-
        write('\n科目平均 ::::\n'),
        append(_,[[_科目名,_平均点]|R],_各科目の平均点ならび),
        writef('8r : %5r\n',[_科目名,_平均点]),
        R = [].

%  
%  http://nojiriko.asia/prolog/c153_399.html の
%  各学生の平均点以下の述語定義と比較して、
%  どちらが、理解しやすいかを問う。
%