このディレクトリの索引

# 出典 :: C/C++の宿題片付けます 130代目 #42 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):問題の基準に従い、 # 任意のローカルフォルダに置いた、指定したwords.txtの指定行から # 指定した行数の英単語を読み込み、 # マージソートをして表示するプログラムを作成せよ。 # 同じようにヒープソートや基数ソートのプログラムも作成せよ。 # 問題の定義はhttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9906.txt # 指定されたwords.txtは # http://nojiriko.asia/data/words.txt にコピーさせていただきました。 # 単語の綴りを逆に並べた際の(ASCIIコードに基づく)辞書順に並び替えよ。 # たとえば"a","b""aa","ab","za","aaa"をこの基準で並べると、 # "a","aa","za","aaa","b","ab"となる。 # ただし、マージソートはボトムアップ方式で実行し、連結リストを用いて # 新たに別の列を作らずに、一方の列に他方の列のノードを挿入することで実現する。 # マージソートは下に指定した構成でプログラムを書くこと。 # # /*適切なファイルをインクルード*/ # # #define WORDS_START 100000 /*開始行目*/ # #define WORDS_NUM 10 /*抽出する単語数(10,100などさまざまな値で試せ)*/ # #define WORD_LIMIT 64 /*単語の文字数の最大数*/ # 開始行(100000). 抽出する単語数(10). 単語の文字数の最大数(64). '任意のローカルフォルダに置いた、指定した"words.txt"の指定行から 指定した行数、英単語を読み込み、単語の最大文字数の制限の調整を施してから、 挿入整列をして表示する' :- '任意のローカルフォルダに置いた、指定した"words.txt"の指定行から指定した行数、英単語を読み込み、単語の最大文字数の制限の調整を施してから、挿入して整列する'(_整列されたならび), 表示する(_整列されたならび). '任意のローカルフォルダに置いた、指定した"words.txt"の指定行から指定した行数、英単語を読み込み、単語の最大文字数の制限の調整を施してから、挿入して整列する'(_整列されたならび) :- '開始行、抽出する単語数、単語の文字数の最大数はPrologデータベースから得る'(_開始行,_抽出する単語数,_単語の文字数の最大数), '"words.txt"ファイルを開始行以降を読み出し語ならびを得る'(_開始行,_抽出する単語数,_語ならび), 文字列の反転と文字数の調整された語ならびを先頭から挿入して整列する(_抽出する単語数,_語ならび,_整列されたならび). 文字列の反転と文字数の調整された語ならびを先頭から挿入して整列する(_抽出する単語数,_語ならび,_整列されたならび) :- 文字列の反転と文字数の調整(_抽出する単語数,_語ならび,_語ならび_2), 先頭から挿入して整列する(_語ならび_2,[],_整列されたならび). '開始行、抽出する単語数、単語の文字数の最大数はPrologデータベースから得る'(_開始行,_抽出する単語数,_単語の文字数の最大数) :- 開始行(_開始行), 抽出する単語数(_抽出する単語数), 単語の文字数の最大数(_単語の文字数の最大数). '"words.txt"ファイルを開始行以降を読み出し語ならびを得る'(_開始行,_抽出する単語数,_語ならび) :- n行目まで読み飛ばす('words.txt',_開始行,_入力), 対象となる語ならびを得る(_入力,_抽出する単語数,_語ならび), close(_入力). 対象となる語ならびを得る(_入力,_抽出する単語数,_語ならび) :- findall(_行,( 連続して行入力する(_入力,_抽出する単語数,_行)),_語ならび). 連続して行入力する(_入力,_抽出する単語数,_行) :- between(1,_抽出する単語数,_), 行入力(_入力,_行). 文字列の反転と文字数の調整(_,[],[]) :- !. 文字列の反転と文字数の調整(_単語の文字数の最大数,L1,L2) :- '文字列長が単語の文字数の最大数を越えた場合だけ末尾を切り落として最大文字数とする、越えない場合はただ反転するだけとする'(_単語の文字数の最大数,L1,L2),!. '文字列長が単語の文字数の最大数を越えた場合だけ末尾を切り落として最大文字数とする、越えない場合はただ反転するだけとする'(_単語の文字数の最大数,[_語|R1],[_反転した語|R2]) :- '文字列長が単語の文字数の最大数を越えた場合だけ末尾を切り落として最大文字数とする'(_単語の文字数の最大数,[_語|R1],[_反転した語|R2]). '文字列長が単語の文字数の最大数を越えた場合だけ末尾を切り落として最大文字数とする、越えない場合はただ反転するだけとする'(_単語の文字数の最大数,L1,L2) :- 越えない場合はただ反転するだけとする(_単語の文字数の最大数,L1,L2). '文字列長が単語の文字数の最大数を越えた場合だけ末尾を切り落として最大文字数とする'(_単語の文字数の最大数,[_語|R1],[_反転した語|R2]) :- 文字列長が単語の文字数の最大数を越えた場合だけ(_単語の文字数の最大数,_語), 末尾を切り落として最大文字数とする(_単語の文字数の最大数,_語,_反転した語,R1,R2). 文字列長が単語の文字数の最大数を越えた場合だけ(_単語の文字数の最大数,_語) :- atomic_length(_語,Len), Len > _単語の文字数の最大数,!, 末尾を切り落として最大文字数とする(_単語の文字数の最大数,_語,_反転した語,R1,R2) :- 文字列の反転(_語,反転した語_1), sub_atom(_反転した語_1,0,_単語の文字数の最大数,_,_反転した語), 文字列の反転と文字数の調整(_単語の文字数の最大数,R1,R2). 越えない場合はただ反転するだけとする(_単語の文字数の最大数,[_語|R1],[_反転した語|R2]) :- 文字列長が単語の文字数の最大数を越えない場合は(_単語の文字数の最大数,_語), ただ反転するだけとする(_単語の文字数の最大数,_語,_反転した語,R1,R2). 文字列長が単語の文字数の最大数を越えない場合は(_単語の文字数の最大数,_語) :- atomic_length(_語,Len), Len =< _単語の文字数の最大数. ただ反転するだけとする(_単語の文字数の最大数,_語,_反転した語,R1,R2) :- 文字列の反転(_語,反転した語), 文字列の反転と文字数の調整(_単語の文字数の最大数,R1,R2). 先頭から挿入して整列する([],X,X) :- !. 先頭から挿入して整列する(L,Y,X) :- 先頭から挿入して整列して行く(L,Y,X). 先頭から挿入して整列して行く([A|R],Y,X) :- 整列するように挿入する(A,Y,Z), 先頭から挿入して整列する(R,Z,X). 整列するように挿入する(A,[],[A]) :- !. 整列するように挿入する(A,[B|R1],L2) :- 'AがBに等しいか小さい場合は先頭に挿入して停止し、大きい場合は整列するように挿入を続ける'(A,[B|R1],L2). 'AがBに等しいか小さい場合は先頭に挿入して停止し、大きい場合は整列するように挿入を続ける'(A,[B|R1],L2) :- 'AがBに等しいか小さい場合は先頭に挿入して停止し、'(A,[B|R1],L2). 'AがBに等しいか小さい場合は先頭に挿入して停止し、大きい場合は整列するように挿入を続ける'(A,[B|R1],L2) :- '大きい場合は整列するように挿入を続ける'(A,[B|R1],L2). 'AがBに等しいか小さい場合は先頭に挿入して停止し、'(A,[B|R],[A,B|R]) :- A @=< B,!. '大きい場合は整列するように挿入を続ける'(A,[B|R1],[B|R2]) :- A @> B, 整列するように挿入する(A,R1,R2). 表示する(_反転した語ならび) :- forall( member(_反転した語,_反転した語ならび), writef('%w\n',[_反転した語])). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % *** user: 'n行目まで読み飛ばす' / 3 *** 'n行目まで読み飛ばす'(_ファイル,1,_入力) :- open(_ファイル,read,_入力),!. 'n行目まで読み飛ばす'(_ファイル,_n,_入力) :- open(_ファイル,read,_入力), succ(_n_1,_n), between(1,_n_1,M), ( at_end_of_stream(_入力),!,close(_入力),fail; 行入力(_入力,_行)), M = _n_1. 行入力(_入力,_行) :- read_line_to_codes(_入力,_コードならび), atom_codes(_行,_コードならび). 文字列の反転(_文字列,_反転された文字列) :- atom_chars(_文字列,_文字ならび), reverse(_文字ならび,_反転した文字ならび), atom_chars(_反転した文字列,_反転した文字ならび).