このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1342966104/667
#  [1] 授業単元:C言語  
#  [2] 問題文: http://ime.nu/ideone.com/tRkzM 
#  
#  1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。
#    ただし数値は何番目に生成した数値かも表示する。
#   
#    例)1番目に小さい数は475番目の数10049です。
#   
#  2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を   表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。
#   
#    例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。
#   
#  3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。
#    ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15は仮定する。
#   
#    例)program 5
#        a,b,c,d,e
#        a,b,c,e,d
#        a,b,d,c,e
#            ・
#        ・
#      e,d,c,b,a

'10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示する' :-
        '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび),
        '小さい順にこれら数値を表示する'(_自然数ならび).

'10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび) :-
        findall(N,(
                    between(1,10000,_),
                    N is random(10000) + 10000),
                _自然数ならび).

小さい順にこれら数値を表示する(_自然数ならび) :-
        小さい順に数値を(_自然数ならび,_小さい順に整列した自然数ならび),
        表示する(_小さい順に整列した自然数ならび)

小さい順に数値を([],[]).
小さい順に数値を([_軸要素|_残りならび],_小さい順に整列した自然数ならび) :-
       分割(_軸要素,_残りならび,_軸要素と等しいか小さい自然数ならび,_軸要素より大きい自然数ならび),
       小さい順に数値を(_軸要素と等しいか小さい自然数ならび,_小さい順に整列した軸要素と等しいか小さい自然数ならび),
       小さい順に数値を(_軸要素より大きい自然数ならび,_小さい順に整列した軸要素より大きい自然数ならび),
       append(_小さい順に整列した軸要素と等しいか小さい自然数ならび,[_軸要素|_小さい順に整列した軸要素より大きい自然数ならび],_小さい順に整列した自然数ならび).

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

表示する([]).
表示する([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10|R]) :-
        writef('%t %t %t %t %t %t %t %t %t %t\n',[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]),
        表示する(R).