このディレクトリの索引 http://hibari.2ch.net/test/read.cgi/tech/1284632294/633 # [1]C言語中級 # [2]指定されたフロー構造に基づき次の仕様のプログラムを作成せよ # 仕様: # ★行とは、先頭か最後の区切り子からその次の区切り子までの区切り子を含まない文字列のこと # ただしその次の区切り子が出現しないまま終端した場合は最後の文字列まで # ★区切り子とは、改行文字(0x0A) 復改文字(0x0D),その組み合わせ(0x0D0x0A,0x0A0x0D)のいずれかと # する(混在することを前提) # ★標準入力から任意の長さの文字列を読み取り各行の空白スペースを除く先頭が0〜9からなる # 文字列(これをキー数列と呼ぶ)でその直後が空白、タブで区切られている場合に限りその行を認識する。 # それ以外の形式の場合は認識せず無視する。キー数列の長さが1024を超える場合も無視対象とする。 # ★認識した行はキー数列を10進数の正整数を表すものとして、その順序(小さい順)に # 整列して出力する # フロー構造 # main関数のみで構成。ライブラリ関数はstdio.hで定義されている関数のみを利用可能とする。 # 当然だが記憶領域はキー数列を記憶する領域の3倍程度しか確保できないことを前提 # [3] FreeBSD上でC言語で記述しgccコンパイラで処理する。 # [4] 10/10迄 # '標準入力から任意の長さの文字列を読み取り各行の空白スペースを除く先頭が0〜9からなる文字列(これをキー数列と呼ぶ)でその直後が空白、タブで区切られている場合に限りその行を認識する。' :- get_chars(Chars), 行と認識(Chars,'',_行ならび), sort(_行ならび,_昇順の行ならび), 文字列部分のみ出力(L2). 行と認識([],_行,[[_10進キー数値,_行]]) :- 行検査(_行,_10進キー数値),!. 行と認識([],_行,[]) :- !. 行と認識(['\r','\n'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識(['\n','\r'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識(['\r'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識(['\n'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識([A|R1],_行1,R2) :- \+(member(A,['\n','r'])), atom_concat(_行1,A,_行2), 行と認識(R1,_行2,R2). 行と認識([A|R1],_行1,R2) :- member(A,['\n','\r']), 行と認識(R1,_行1,R2). 文字列部分のみ出力(L) :- append(_,[[_,_行]|R],L), write_formatted('%t\n',[_行]), R = []. 行検査(_行,N) :- 空白・タブを読み飛ばす(_行,_行1), sub_atom(_行1,Len1,1,Len2,A), Len1 =< 1024, member(A,[' ','\t']), sub_atom(_行1,0,Len1,0,B), 全て数字(0,Len1,B), atom_to_chars(B,Bcodes), encode(Bcodes,N). 空白・タブを読み飛ばす(_行,_行1) :- sub_atom(_行,Len,1,Rlen,A), \+(member(A,[' ','\t'])), Len2 is Len + 1, sub_atom(_行,Len2,Rlen,_行1). 全て数字(Len,Len,_) :- !. 全て数字(M,Len,B) :- sub_atom(B,M,1,_,C), member(C,['0','1','2','3','4','5','6','7','8','9']), M2 is M + 1, 全て数字(M2,Len,B).