このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1296387672/147
#  [1] 授業単元:ポインタ  
#  [2] 問題文(含コード&リンク):  
#  ランダムな数値が格納された配列を昇順にソートし、結果を画面に出力する。(コマンドプロンプト)  
#  課題ファイルのmain関数・昇順ソート関数・ソート結果表示関数に、仮引数と関数の中身を追加する。基本的に、main関数内は、関数呼び出しのみとする。  
#  課題ファイル http://ime.nu/uproda.2ch-library.com/lib339300.txt.shtml 
#  
#  #include  
#  
#  void Sort_func( int * ); /* ソート処理関数の定義 */ 
#  void Disp_func( int * ); /* ソート結果表示関数の定義 */ 
#  
#  
#  /* 
#  ※ 2つの関数を呼出しソート結果を画面に出力する。 
#  関数を完成させよ。 
#  定義済の関数宣言・変数の変更(移動)を禁止する。 
#  */ 
#  
#  void main() 
#  { 
#  /* 
#  配列変数 intNumFrom に格納された数値を、 
#  昇順となるようにintNumFrom を変更せよ。 
#  */ 
#  
#  int intNumFrom[8] = {88,52,6,43,65,38,46,16}; 
#  
#  
#  Sort_func( intNumFrom ); /* ソート処理関数呼出し*/ 
#  
#  Disp_func( &intNumFrom[1] ); /* ソート結果表示関数呼出し */ 
#  
#  return; 
#  } 
#  
#  void Sort_func( ###### ) 
#  { 
#  
#  } 
#  
#  
#  void Disp_func( ###### ) 
#  { 
#  
#  } 

'ランダムな数値が格納されたならびを昇順にソートし、結果を画面に出力する。' :-
        ランダムな数値が格納されたならびを(_ランダムな数値が格納されたならび),
        昇順にソートし(_ランダムな数値が格納されたならび,[],_昇順に整列したならび),
        画面に出力する(_昇順に整列したならび).

ランダムな数値が格納されたならびを(_ランダムな数値が格納されたならび) :-
        ならびの要素数を入力する(_要素数),
        length(L,_要素数),
        findall(_ランダムな数値,(
                    append(_,[_ランダムな数値|_],L),
                    ランダムな数値(_ランダムな数値)),
                _ランダムな数値が格納されたならび).

ランダムな数値(_ランダム数値) :-
        1 is random mod 2,
        _ランダムな数値 is ( random mod 10000 ) / 100),!.
ランダムな数値(_ランダム数値) :-
        _ランダムな数値 is random mod 100,!.

ならびの要素数を入力する(_要素数) :-
        範囲指定付き整数入力(要素数,'要素数を入力してください : ',1,100,_要素数).

昇順にソートし([],_昇順に整列したならび,_昇順に整列したならび) :- !.
昇順にソートし([_値1|R1],L1,_昇順に整列したならび) :-
        昇順に挿入(_値1,L1,L2),
        昇順にソートし(R1,L2,_昇順に整列したならび).

昇順に挿入(V,[],[V]) :- !.
昇順に挿入(V,[V1|R1],[V,V1|R1]) :-
        V =< V1,!.
昇順に挿入(V,[V1|R1],[V1|R2]) :-
        V > V1,
        昇順に挿入(V,R1,R2).

画面に出力する(L) :-
        append(_,[_数値|R],L),
        write_formatted('%t ',[_数値]),
        R = [],
        nl.

範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値) :-
        write(_催促),
        get_line(Line),
        範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値),!.
範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値) :-
        範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値).

範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値) :-
        atom_to_term(Line,_値,_),
        integer(_値),
        _値 >= _範囲下限,
        _値 =< _範囲上限,!.
範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値) :-
        write_formatted('入力された %t からは、%tから%tの範囲の適切な%tを得られませんでした。再入力をお願いします。\n',[Line,_範囲下限,_範囲上限,_入力項目名]),
        fail.