このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1311089619/797
#  【質問テンプレ】  
#  [1] 授業単元: コンピュータ言語 
#  [2] 問題文(含コード&リンク): 
#  ttp://uproda.2ch-library.com/408813lG9/lib408813.txt 
#  
#  
#  
#  542
#  903
#  890
#  1960
#  3
#  ・
#  ・
#  ・
#  という具合に格納されたテキストファイルがある。
#  これを読み込んで数値の小さいものから昇順に並び替えて
#  ユーザーが好きな名前で保存できるプログラムを作成せよ。
#  
#  この問題について、テキストファイルには何件数値が
#  格納されているかはわからない状態であることを
#  考慮して作成すること。
#  [3] 環境 
#   [3.1] OS: Windows 7 PRO
#   [3.2] コンパイラ名とバージョン:visual studio
#   [3.3] 言語:C言語
#  [4] 期限:明日まで
#  [5] その他の制限:
#  授業内で学んだ単純交換ソートを組み込んで作成すること。
#  #define swap(type, x, y)	do {type t = x; x = y; y = t; } while (0)
#  
#  void bubble(int a[], int n)
#  {
#  	int  i, j;
#  
#  	for (i = 0; i < n - 1; i++) {
#  		for (j = n - 1; j > i; j--)
#  			if (a[j - 1] > a[j])
#  				swap(int, a[j - 1], a[j]);
#  	}
#  }
#  
#  
#  プログラムのインタフェースは下記の例に基づいて作成すること
#  実行例:
#  テキストファイル名を入力してください->number.txt
#  
#  ファイルの中身は以下の通りです
#  x[0]:504
#  x[1]:4980
#  x[2]:735
#  x[3]:1234
#  x[4]:5
#  x[5]:430
#   ・
#   ・
#   ・
#  
#  ファイルの中身を以下のようにソートしました
#  
#  x[0]:5
#  x[1]:430
#  x[2]:504
#  x[3]:735
#  x[4]:1234
#  x[5]:4980
#   ・
#   ・
#   ・
#  
#  ソートしたデータを保存します
#  ファイル名を入力してください->sort.txt
#  
#  sort.txtというファイル名で保存しました。
#  


'0から5000までの数値がランダムに一行にひとつずつ格納されたテキストファイルがある。これを読み込んで数値の小さいものから昇順に並び替えてユーザーが好きな名前で 保存する'(_テキストファイル) :-
        '0から5000までの数値が,ランダムに一行にひとつずつ格納されたテキストファイルを作る'(_テキストファイル),
        好きな名前で保存(_好きな名前のファイル),
        get_integers(_テキストファイル,_整数ならび),
        整列(_整数ならび,_昇順に整列した整数ならび
        保存する(_好きな名前のファイル,_昇順に整列した整数ならび).

'0から5000までの数値が,ランダムに一行にひとつずつ格納されたテキストファイルを作る'(_テキストファイル) :-
        open(_テキストファイル,write,Outstream),
        _値 is random(5002),
        '0から5000までの数値が,ランダムに一行にひとつずつ格納されたテキストファイルを作る'(Outsteam,_値),
        close(Outstream).

'0から5000までの数値が,ランダムに一行にひとつずつ格納されたテキストファイルを作る'(Outsteam,5001) :- !.
'0から5000までの数値が,ランダムに一行にひとつずつ格納されたテキストファイルを作る'(Outsteam,N) :-
        writef(Outstream,'%t\n',[N1]),
        N2 is random(5002),
        '0から5000までの数値が,ランダムに一行にひとつずつ格納されたテキストファイルを作る'(Outsteam,N2).

好きな名前で保存(_好きな名前のファイル) :-
        write('保存ファイル名を入力してください : '),
        get_line(_好きな名前のファイル).

get_integers(_入力ファイル,_整数ならび) :-
        open(_入力ファイル,read,Instream),
        get_integers(Instream,_整数ならび),
        close(Instream).

get_integers(Instream,[]) :-
        at_end_of_stream(Instream),!.
get_integers(Instream,[_整数|R]) :-
        get_char(Instream,Char),
        数値ならび(Instream,Char,_整数),
        get_integers(Instream,R),!.
get_integers(Instream,_整数ならび) :-
        get_integers(Instream,_整数ならび).

数値ならび(Instream,'+',_整数) :-
        数値ならび(Instream,_数値ならびの一),
        \+(_数値ならびの一 = []),
        number_chars(_整数,[+|_数値ならびの一]),!.
数値ならび(Instream,'-',_整数) :-
        数値ならび(Instream,_数値ならびの一),
        \+(_数値ならびの一 = []),
        number_chars(_整数,[-|_数値ならびの一]),!.
数値ならび(Instream,A,_数値ならび) :-
        A @>= '0',
        A @=< '9',
        数値ならび(Instream,_数値ならびの一),
        number_chars(_整数,[A|_数値ならびの一]).

数値ならび(Instream,[]) :-
        at_end_of_stream(Instream),!.
数値ならび(Instream,[A|R]) :-
        get_char(A),
        A @>= '0',
        A @=< '9',
        数値ならび(Instream,R).
数値ならび(Instream,[]) :- !.

文字数値変換('0',0).
文字数値変換('1',1).
文字数値変換('2',2).
文字数値変換('3',3).
文字数値変換('4',4).
文字数値変換('5',5).
文字数値変換('6',6).
文字数値変換('7',7).
文字数値変換('8',8).
文字数値変換('9',9).

整列([],[]) :- !.
整列(L1,L2) :-
        L1 = [A|L1_1],
        分割(A,L1_1,_より小さいならび,_等しいかより大きいならび),
        整列(_より小さいならび,L3),
        整列(_等しいかより大きいならび,L4),
        append(L3,[A|L4],L2).

分割(A,[],[],[]) :- !.
分割(A,[B|R],[B|R1],R2) :-
        A @> B,
        分割(A,R,R1,R2),!.
分割(A,[B|R],R1,[B|R2]) :-
        A =< B,
        分割(A,R,R1,R2),!.

保存する(_保存ファイル,L) :-
        open(_保存ファイル,write,Outstream),
        append(_,[N|R],L),
        writef(Outstream,'%t\n',[N]),
        R = [],
        close(Outstream).