このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1325685876/650
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク): 
#  出席番号、算数、国語、社会の点数(適当で)からできている成績データを
#  読み込み、各生徒の3科目の平均点と最高点を算出して、それを各生徒の
#  データとして加え、3科目の平均点の順番にソートするプログラムを
#  選択ソートでかきなさい。 
#  

 '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み、各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え、3科目の平均点の順番にソートする'(_成績データファイル,_3科目の平均点の順ならび) :-
        '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み'(LL),
        '各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え'(LL,LL2),
        '3科目の平均点の順番にソートする'(LL2,_3科目の平均点の順ならび).

'出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み'(LL) :-
        get_split_lines(_成績データファイル,[','],LL).

'各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え'(LL,LL2) :-
        findall(L2,(
                    member([_出席番号|L],LL),
                    平均(L,_平均点),
                    最大値(L,_最高点),
                    append([_出席番号|L],[_平均点,_最高点],L2)),
                LL2).

'3科目の平均点の順番にソートする'(LL2,_3科目の平均点の順ならび) :-
        '3科目の平均点を鍵として行頭に付加する'(LL2,LL3),
        逆順整列(LL3,LL4),
        '付加した整列鍵を削除する'(LL4,_3科目の平均点の順ならび).

'3科目の平均点を鍵として行頭に付加する'(LL2,LL3) :-
        findall([_平均点|L],(
                    member(L,LL2),
                    append(_,[_平均点,_],L)),
                LL3).

'付加した整列鍵を削除する'(LL4,_3科目の平均点の順ならび) :-
        findall(L,(
                    member([_|L],LL4)),
                _3科目の平均点の順ならび).

逆順整列(L1,L2) :-
        sort(L1,L3),
        reverse(L3,L2).

平均(L,_平均) :-
        length(L,Len),
        sum(L,_合計),
        _平均 is _合計 / Len.

最大値([A|R],_最大値) :-
        append(_,[B|R2],R),
        B @> A,
        最大値([B|R2],_最大値).
最大値([_最大値|_],_最大値).