このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1325685876/526
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク):このスレの../test/read.cgi/tech/1325685876/464と同じ質問ですhttp://ime.nu/2ch.ac.la/read.php/tech/1201083176/  
#  
#  「8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い、
#  それらのデータをクイックソートし身長の低い順に氏名、学籍番号、身長を
#  画面に出力するプログラムを作成せよ」という問題がでました。

'8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い、それらのデータをクイックソートし身長の低い順に氏名、学籍番号、身長を画面に出力するプログラムを作成せよ' :-
        '8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い'(_入力されたならび),
        '整列の鍵項目(身長)を先頭に付加する'(_入力されたならび,_鍵の付加されたならび),
        整列(_鍵の付加されたならび,_整列されたならび),
        '身長の低い順に氏名、学籍番号、身長を画面に出力する'(_整列されたならび).
'8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い'(_入力されたならび) :-
        length(_入力されたならび,8),
        findall([_氏名,_学籍番号,_身長],(
                    append(_,[L|_],_入力されたならび),
                    '氏名・学籍番号・身長を得る'(_氏名,_学籍番号,_身長)),
                _入力されたならび).

'氏名・学籍番号・身長を得る'(_氏名,_学籍番号,_身長) :-
         催促付き入力('氏名を入力してください : ',_氏名),
         催促付き入力('学籍番号を入力してください : ',_学籍番号),
         催促付き入力('身長を入力してください : ',_身長文字列),
         atom_to_term(_身長文字列,_身長,_).

'整列の鍵項目(身長)を先頭に付加する'(_入力されたならび,_鍵の付加されたならび) :-
        findall([_身長,_氏名,_学籍番号,_身長],(
                    member([_氏名,_学籍番号,_身長],_入力されたならび)),
                 _鍵の付加されたならび).

整列([],[]).
整列([_軸要素|R1],_整列されたならび) :-
        分割(_軸要素,R1,_軸要素より小さい要素ならび,_軸要素と等しいか大きい要素ならび),
        整列(_軸要素より小さい要素ならび,_整列した軸要素より小さい要素ならび),
        整列(_軸要素と等しいか大きい要素ならび,_整列した軸要素と等しいか大きい要素ならび),
        append(_整列した軸要素より小さい要素ならび,[_軸要素|_整列した軸要素と等しいか大きい要素ならび],_整列されたならび).

分割(_,[],[],[]).
分割(_軸要素,[A|R1],[A|R2],R3) :-
        A @< _軸要素,
        分割(_軸要素,R1,R2,R3).
分割(_軸要素,[A|R1],R2,[A|R3]) :-
        A @>= _軸要素,
        分割(_軸要素,R1,R2,R3).

'身長の低い順に氏名、学籍番号、身長を画面に出力する'(_整列されたならび) :-
        append(_,[[_身長,_氏名,_学籍番号,_身長]|R],_整列されたならび),
        writef('%t, %t, %t\n',[_氏名,_学籍番号,_身長]),
        R = [].