このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1309076891/729
#  【 課題 】<プログラムの仕様> 
#              ・N人の、M科目の成績が書かれたCSVファイルを読み込む 
#              ・平均点、最高点、最低点、度数分布を各科目毎に出力する 
#              ・各科目、総合点のランキングリストを出力する 
#              ・成績の処理結果をテキストファイルに出力する  
#  【 形態 】1. Javaアプリケーション(main()で開始) 
#  【 GUI  】4. 制限なし 
#  【 期限 】1/26(木) 20:00  
#  【 Ver  】java version "1.7.0" 
#  【 補足 】http://ime.nu/www1.axfc.net/uploader/Sc/so/311237.zip 
#        上記のリンクが、課題のCSVファイルと、 
#        参考資料としてあげられていたCSVファイルの読み込み・書き込みを行うプログラムです。 
#        CSVファイルは編集してはならないとのことです。 
#        CSVファイルは、左から順番に、 
#        「国語」「数学」「英語」「社会」「理科」「美術」「工芸」「書道」「音楽」「体育」の科目で、 
#        上から順番に「生徒1」「生徒2」・・・「生徒100」となっております。 
#        よろしくお願いいたします。 
#   

'・N人の、M科目の成績が書かれたCSVファイルを読み込む ・平均点、最高点、最低点、度数分布を各科目毎に出力する ・各科目、総合点のランキングリストを出力する ・成績の処理結果をテキストファイルに出力する'(_CSVファイル,_書き込みテキストファイル) :-
        get_split_lines(_CSVファイル,[','],LL),
        転置(LL,_転置LL),
        '平均点、最高点、最低点、度数分布を各科目毎に集約する'([国語,数学,英語,社会,理科,美術,工芸,書道,音楽,体育],_転置LL,_集約リスト),
        総合点のランキングリスト(LL,_総合点のランキングリスト),
        出力する(_書き込みテキストファイル,_集約リスト,_総合点のランキングリスト).        

'平均点、最高点、最低点、度数分布を各科目毎に集約する'([],[],[]).
'平均点、最高点、最低点、度数分布を各科目毎に集約する'([_科目|R1],[_列|R2],[[_科目,_平均点,_最高点,_最低点,_度数分布,_ランキングリスト]|R3]) :-
        最高点(_列,_最高点),
        最低点(_列,_最低点),
        平均点(_列,_平均点),
        度数分布(_列,_度数分布),
        科目毎のランキングリスト(_列,_ランキングリスト),
        '平均点、最高点、最低点、度数分布を各科目毎に集約する'(R1,R2,R3).

総合点のランキングリスト(LL,_ランキングリスト) :-
        総合点集約(1,LL,LL1),
        sort(LL1,LL2),
        reverse(LL3,_ランキングリスト).

総合点集約(_,[],[]).
総合点集約(N,[_行|R1],[[_合計点,N]|R2]) :-
        sum(_行,_合計点),
        N2 is N + 1,
        集合点集約(N2,R1,R2).

度数分布(_列,_度数分布) :-
        findall(_度数,(
                    member([_点数下限,_点数上限],[[0,19],[20,39],[40,59],[60,79],[80,100]]),
                    count((
                                member(_点数,_列),
                                _点数 >= _点数下限,
                                _点数 =< _点数上限),
                           _度数分布).

科目毎のランキングリスト(_列,_ランキングリスト),
        整列用ランキングリスト(1,_列,_整列用ランキングリスト),
        sort(_整列用ランキングリスト,_整列済みランキングリスト),
        reverse(_整列済みランキングリスト,_ランキングリスト).

整列用ランキングリスト(_,[],[]).
整列用ランキングリスト(N,[_得点|R1],[[_得点,N]|R2]) :-
        N2 is N + 1,
        整列用ランキングリスト(N2,R1,R2).

出力する(_書き込みテキストファイル,_集約リスト,_総合点のランキングリスト) :-
        open(_書き込みテキストファイル,write,Outstream),
        科目別項目の書き込み(Outstream,_集約リスト),
        総合点のランキングの書き込み(Outstream,_総合点ランキングリスト),
        close(Outstream).

科目別項目の書き込み(Outstream,_集約リスト) :-
        append(_,[[_科目,_平均点,_最高点,_最低点,_度数分布,_ランキングリスト]|R],_集約リスト),
        writef(Outstream,'科目 %t\n',[_科目]),
        writef(Outstream,'平均点 %4r\n最高点 %4r\n最低点 %4r\n',[_平均点,_最高点,_最低点]),
        writef(Outstream,'0~19点 %4r\n20~39点 %4r\n40~59点 %4r\n60~79点 %4r\n80~100点 %4r\n',_度数分布),
        ランキングリストの書き込み(Outstream,_ランキングリスト),
        R = [].

ランキングリストの書き込み(Outstream,_ランキングリスト) :-
        write(Outstream,'科目毎ランキング\n'),
        append(_,[[_得点,_生徒番号]|R],_ランキングリスト),
        writef(Outstream,'生徒%2l %4r\n',[_生徒番号,_得点]),
        R = [].

総合点のランキングの書き込み(Outstream,_総合点ランキングリスト) :-
        write(Outstream,'総合点ランキング\n'),
        append(_,[[_得点,_生徒番号]|R],_総合点ランキングリスト),
        writef(Outstream,'生徒%2l %4r\n',[_生徒番号,_得点]),
        R = [].