このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/399
#  [1] 授業単元:C  
#  [2] 問題文(含コード&リンク): 
#  まず学生の人数(100人以下)を入力し、成績結果のファイルseiseki.txtを読み、 
#  それから国語または数学、英語の点数のどれかに注目した小から大への順番に従ってデータを並べ替えて、 
#  write.txtに出力するプログラムを作成しなさい。 
#  例 
#  seiseki.txt 
#  No. 国語 数学 英語 
#  1    90   80   70 
#  2    85   75   65 
#  3    80   70   60 
#  4    75   65   55 
#  5    70   60   50 
#   
#  学生の人数を入力してください。6 
#  科目番号を入力してください。 
#  1:国語、2:数学、3:英語 
#  2 
#   
#  write.txt 
#  5  70  60  50 
#  4  75  65  55 
#  3  80  70  60 
#  2  85  75  65 
#  1  90  80  70 
#   

'まず学生の人数(100人以下)を入力し、成績結果のファイルseiseki.txtを読み、それから国語または数学、英語の点数のどれかに注目した小から大への順番に従ってデータを並べ替えて、write.txtに出力する' :-
        'まず学生の人数(100人以下)を入力し'(_学生の人数),
        '成績結果のファイルseiseki.txtを読み'(_学生の人数,_成績ならび),
        'それから国語または数学、英語の点数のどれかに注目'(_注目した科目,_成績ならび,_着目した科目の成績ならび),
        '小から大への順番に従ってデータを並べ替えて'(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび),
        'write.txtに出力する'(_昇順に整列した着目した科目の成績ならび,_成績ならび).

'まず学生の人数(100人以下)を入力し'(_学生の人数) :-
        整数を得る(学生の人数,_学生の人数 =< 100,_学生の人数).

'成績結果のファイルseiseki.txtを読み'(_学生の人数,_成績ならび) :-
        get_split_lines('seiseki.txt',[' '],LL),
        平坦化(LL,_成績ならび_1),
        学生の人数分を切り取る(_学生の人数,_成績ならび_1,_成績ならび).

学生の人数分を切り取る(_学生の人数,_成績ならび_1,_成績ならび) :-
        length(_成績ならび_1,_要素数),
        _要素数 >= _学生の人数,
        length(_成績ならび,_学生の人数),
        append(_成績ならび,_,_成績ならび_1),!.
学生の人数分を切り取る(_学生の人数,_成績ならび,_成績ならび).

'それから国語または数学、英語の点数のどれかに注目'(_注目した科目,_成績ならび,_注目した科目の成績ならび) :-
        注目した科目を選択する(_注目した科目),
        findall([_注目した科目の成績,_No],(
                    member([_No,_国語,_数学,_英語],_成績ならび),
                    注目した科目成績を選択する(_注目した科目,[_国語,_数学,_英語],_注目した科目の成績)),
                _注目した科目の成績ならび).

注目した科目を選択する(_注目した科目) :-
        write('国語、数学、英語のうち、注目した科目を入力してください : '),
        get_line(Line),
        '診断: 注目した科目を選択する'(Line,_注目した科目),!.
注目した科目を選択する(_注目した科目) :-
        注目した科目を選択する(_注目した科目).

'診断: 注目した科目を選択する'(_注目した科目,_注目した科目) :-
        member(_注目した科目,[国語,数学,英語]),!.
'診断: 注目した科目を選択する'(Line,_注目した科目) :-
        write('入力された %t は国語、数学、英語のいずれでもありません。再入力をお願いします。\n',[Line]),
        fail.

注目した科目成績を選択する(国語,[_国語,_数学,_英語],_国語).
注目した科目成績を選択する(数学,[_国語,_数学,_英語],_数学).
注目した科目成績を選択する(英語,[_国語,_数学,_英語],_英語).

'小から大への順番に従ってデータを並べ替えて'(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび) :-
        整列(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび).

整列([],[]).
整列([_軸要素|_着目した科目の成績ならび],_昇順に整列した着目した科目の成績ならび) :-
        分割(_軸要素,_着目した科目の成績ならび,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび),
        整列(_軸要素より小さい成績ならび,_整列した軸要素より小さい成績ならび),
        整列(_軸要素より大きい成績ならび,_整列した軸要素より大きい成績ならび),
        append(_整列した軸要素より小さい成績ならび,[_軸要素|_整列した軸要素より大きい成績ならび],_昇順に整列した着目した科目の成績ならび).

分割(_,[],[],[]).
分割(_軸要素,[[_成績,_No]|R1],[[_成績,_No]|_軸要素より小さい成績ならび],_軸要素と等しいか大きい成績ならび) :-
        _成績 @<_軸要素,
        分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび).
分割(_軸要素,[[_成績,_No]|R1],_軸要素より小さい成績ならび,[[_成績,_No]|_軸要素と等しいか大きい成績ならび]) :-
        _成績 @>= _軸要素,
        分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび).

'write.txtに出力する'(_昇順に整列した着目した科目の成績ならび,_成績ならび) :-
        open('write.txt',write,Outstream),
        'Outstreamへ出力'(Outstream,_昇順に整列した着目した科目の成績ならび,_成績ならび),

        close(Outstream).

'Outstreamへ出力'(Outstream,_昇順に整列した着目した科目の成績ならび,_成績ならび) :-
        append(_,[[_成績,_No]|R],_昇順に整列した着目した科目の成績ならび),
        member([_No,_国語,_数学,_英語],_成績ならび),
        writef(Outstream,'%t  %t  %t  %t\n',[_No,_国語,_数学,_英語]),
        R = [].

%  平坦化/2