このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1301553333/908

#   
#   
#  [1] 授業単元:計算機プログラミング 
#  [2] 問題文:http://nojiriko.asia/prolog/org1648258.pdf 
#          リンク先の問題2 
# 
#  2.下記のような,学生 10 名の 5 科目の成績表がある(表の仕様,値などは各自決めてよい)。
#  成績表
#  StudentNo. Electromag. Elec.Cct  Computer       Math     English
#  E001          70          65          85          90          70
#  E002          50          45          55          65          60
#  E003          78          90          95          70          85
#  E004          90          98          87          85          75
#  E005          45          75          62          48          50
#
#  個人毎,および科目毎の平均を計算するプログラムを組みなさい。
#  ただし,プログラムの設計仕様に次の 2 点を必ず含めること。
#  
#  (1) キーボードなどから点数を入力し,結果をファイルに出力すること(kekka.txt など)。
#  ファイル(data.txt など)を読込ませてもよい。ただし,値をプログラムに組み込まないこと!
#  (2) 平均を求める箇所を関数にすること。

'個人毎,および科目毎の平均を計算する。キーボードなどから点数を入力し(ファイル(data.txt など)を読込ませてもよい),結果をファイルに出力する'(_入力ファイル,_出力ファイル) :-
        'キーボードなどから点数を入力し(ファイル(data.txt など)を読込ませてもよい)'(_入力ファイル,_見出し項,_生成表),
        '個人毎,および科目毎の平均を計算する'(_成績表,_個人毎平均,_個人毎平均を付加した成績表,_科目毎平均),
        ファイルに出力する(_見出し項,_個人毎平均,_科目毎平均).

'キーボードなどから点数を入力し(ファイル(data.txt など)を読込ませてもよい)'(_入力ファイル,_見出し項,_生成表) :-
        get_split_lines(_入力ファイル,[' '],LL),
        LL = [_見出し項|_成績表].

'個人毎,および科目毎の平均を計算する'(_成績表,_個人毎平均,_個人毎平均を付加した成績表,_科目毎平均) :-
        個人毎の平均を計算する(_成績表,_個人毎平均,_個人毎平均を付加した成績表),
        科目毎の平均を計算する(_成績表,_科目毎平均).

個人毎の平均を計算する(_成績表,_個人毎平均を付加した成績表) :-
        findall(L,(
                    append(_,[L1|_],_成績表),
                    L1 = [_|_個人成績ならび],
                    avg(_個人成績ならび,_個人毎平均),
                    append(L1,[_個人毎平均],L)),
               _個人毎平均を付加した成績表).

科目毎の平均を計算する(_成績表,_科目毎平均) :-
        転置(_成績表,_転置された成績表),
        findall(Avg,(
                    append(_,[[_|L]|_],_転置された成績表),
                    avg(L,Avg)),
                _科目毎平均).

ファイルに出力する(_見出し項,_個人毎平均,_科目毎平均) :-
        open(_出力ファイル,write,Outstream),
        見出し項を出力する(Outstream,_見出し項),
        個人毎の平均を出力する(Outstream,_個人毎平均),
        科目毎の平均を出力する(Outstream,_科目毎平均),
        close(Outstream).

見出し項を出力する(Outstream,_見出し項) :-
        append(_見出し項,['Average'],_見出し項のニ),
        write_formattet(Outstream,'%16t %16t %16t %16t %16t %16t %16t %16t \n',_見出し項のニ),!.

個人毎の平均を出力する(Outstream,_個人毎平均) :-
        append(_,[L|R],_個人毎平均),
        write_formatted(Outstream,'%16t %16t %16t %16t %16t %16t %16t %16t \n',L),
        R = [].

科目毎の平均を出力する(Outstream,_科目毎平均) :-
        write_formatted(Outstream,'avarage         %16t %16t %16t %16t %16t %16t %16t \n',_科目毎平均).