このディレクトリの索引

% 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒の成績を管理するプログラムを作成する。 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 内容は 数学:70 英語:80 国語:75 理科:80 社会:60 となっている このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(_テキストファイル名ならび), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(_テキストファイル名ならび,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(_テキストファイル名ならび) :- shs('ls -N *.txt',_テキストファイル名ならび). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する([],_,_) :- !. 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(_テキストファイル名,_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の場合は出席番号を表示して行く(_テキストファイル名,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の場合は出席番号を表示して行く([_テキストファイル名|R],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の場合は出席番号を表示する([_テキストファイル名|R],_指定した科目,_指定した点数), 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(R,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の場合は出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数) :- forall(指定した科目で指定した点数の(_テキストファイル名,_指定した科目,_指定した点数), 生徒の出席番号を表示する(_テキストファイル名)). 指定した科目で指定した点数の(_テキストファイル名,_指定した科目,_指定した点数) :- get_split_lines(_テキストファイル名,[' ',':'],_行ならび), member([_指定した科目,_指定した点数],_行ならび). 生徒の出席番号を表示する(_テキストファイル名) :- 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(L1,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1) :- shs('ls -N *.txt',L1). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([],_,_). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_テキストファイル名|R1],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_|R1],_指定した科目,_指定した点数) :- 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(R1,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号) :- get_split_lines(_テキストファイル名,[' ',':'],L), member([_指定した科目,_指定した点数],L), 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは ファイルから全行読み取る(_ファイル,_全行) :- open(_ファイル,read,_ストリーム), ストリームから全行読み取る(_ストリーム,_全行), close(_ストリーム). ストリームから全行読み取る(_ストリーム,[]) :- at_end_of_stream(_ストリーム),!. ストリームから全行読み取る(_ストリーム,_全行) :- ストリームから全行読み取って行く(_ストリーム,_全行). ストリームから全行読み取って行く(_ストリーム,[_行|R]) :- 行入力(_ストリーム,_行), ストリームから全行読み取る(_ストリーム,R). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 134代目 #358 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10471.txt # # ≪問題と条件≫ # 第1引数に指定したファイルからバイナリーモードで1バイトずつファイルを読み込み、 # ファイルの内容を16進数で示したものを第2引数に指定したファイルに書き込むプログラムを作成せよ。ただし、16バイトごとに改行を入れること。 '第1引数に指定したファイルからバイナリーモードで1バイトずつファイルを読み込み、ファイルの内容を16進数で示したものを第2引数に指定したファイルに書き込む。 ただし、16バイトごとに改行を入れる'(_入力バイナリファイル,_出力16進表示テキストファイル) :- '入力ファイルはバイナリーモード、出力ファイルはテキストモード'(_入力バイナリファイル,_出力16進表示テキストファイル,Input,Output), '1バイトずつファイルを読み込み、16進数で示したものを書き込む。ただし、16バイトごとに改行を入れる'([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_],Input,Output), ストリームを閉じる(Input,Output). '入力ファイルはバイナリーモード、出力ファイルはテキストモード'(_入力バイナリファイル,_出力16進表示テキストファイル,Input,Output) :- '入力ファイルはバイナリーモード、'(_入力バイナリファイル,Input), '出力ファイルはテキストモード'(_出力16進表示テキストファイル,Output). '入力ファイルはバイナリーモード、'(_入力バイナリファイル,Input) :- open(_入力バイナリファイル,read,Input,[type(binary)]). '出力ファイルはテキストモード'(_出力16進表示テキストファイル,Output) :- open(_出力16進表示テキストファイル,write,Output). ストリームを閉じる(Input,Output) :- close(Input), close(Output). '1バイトずつファイルを読み込み、16進数で示したものを書き込む。ただし、16バイトごとに改行を入れる'(Ln,Input,Output) :- 'at_end_of_stream状態になったら停止する'(Ln,Input,Output),!. '1バイトずつファイルを読み込み、16進数で示したものを書き込む。ただし、16バイトごとに改行を入れる'(Ln,Input,Output) :- 'at_end_of_streamになるまで、1バイトずつファイルを読み込み、16進数で示したものを書き込む。ただし、16バイトごとに改行を入れる'(Ln,Input,Output). 'at_end_of_stream状態になったら停止する'(Ln,Input,Output) :- at_end_of_stream(Input), 改行を入れる(Output). 'at_end_of_streamになるまで、1バイトずつファイルを読み込み、16進数で示したものを書き込む。ただし、16バイトごとに改行を入れる'(Ln,Input,Output) :- 既に16バイト目になっていたら改行を入れる(Ln,Output,Ln2), '1バイトファイルを読み込み、16進数で示したものを書き込む'(Input,Output), '1バイトずつファイルを読み込み、16進数で示したものを書き込む。ただし、16バイトごとに改行を入れる'(Ln2,Input,Output). '1バイトファイルを読み込み、16進数で示したものを書き込む'(Input,Output) :- '1バイトファイルを読み込み、'(Input,_1バイト), '16進数で示したものを書き込む'(Output,_1バイト). '1バイトファイルを読み込み、'(Input,_1バイト) :- get_byte(Input,_1バイト). '16進数で示したものを書き込む'(Output,_1バイト) :- '16進数で示したものを'(_1バイト,_16進数文字列), 書き込む(Output,_16進数文字列). '16進数で示したものを'(_1バイト,_16進数文字列) :- 上位桁の16進数文字列変換(_1バイト,_16進数上位桁文字列), 下位桁の16進数文字列変換(_1バイト,_16進数下位桁文字列), atomic_list_concat([_16進数上位桁文字列,_16進数下位桁文字列,' '],_16進数文字列). 上位桁の16進数文字列変換(_1バイト,_16進数上位桁文字列) :- X is _1バイト // 16, '16進数文字コード'(X,_16進数上位桁文字列). 下位桁の16進数文字列変換(_1バイト,_16進数下位桁文字列) :- Y is _1バイト mod 16, '16進数文字コード'(Y,_16進数下位桁文字列). '16進数文字コード'(15,'F') :- !. '16進数文字コード'(14,'E') :- !. '16進数文字コード'(13,'D') :- !. '16進数文字コード'(12,'C') :- !. '16進数文字コード'(11,'B') :- !. '16進数文字コード'(10,'A') :- !. '16進数文字コード'(N,C) :- atom_number(C,N). 書き込む(Output,_16進数文字列) :- write(Output,_16進数文字列). 既に16バイト目になっていたら改行を入れる([],Output,[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]) :- 改行を入れる(Output). 既に16バイト目になっていたら改行を入れる([_|Ln],_,Ln). 改行を入れる(Output) :- write(Output,'\n'). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 134代目 #358 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10471.txt # # ≪問題と条件≫ # 第1引数に指定したファイルからバイナリーモードで1バイトずつファイルを読み込み、 # ファイルの内容を16進数で示したものを第2引数に指定したファイルに書き込むプログラムを作成せよ。ただし、16バイトごとに改行を入れること。 '第1引数に指定したファイルからバイナリーモードで1バイトずつファイルを読み込み、ファイルの内容を16進数で示したものを第2引数に指定したファイルに書き込む。 ただし、16バイトごとに改行を入れる'(_入力バイナリファイル,_出力16進表示テキストファイル) :- '入力ファイルはバイナリーモード、出力ファイルはテキストモード'(_入力バイナリファイル,_出力16進表示テキストファイル,Input,Output), '1バイトずつファイルを読み込み、16進数で示したもの書き込む。ただし、16バイトごとに改行を入れる'(Input,Output), ストリームを閉じる(Input,Output). '入力ファイルはバイナリーモード、出力ファイルはテキストモード'(_入力バイナリファイル,_出力16進表示テキストファイル,Input,Output) :- '入力ファイルはバイナリーモード、'(_入力バイナリファイル,Input), '出力ファイルはテキストモード'(_出力16進表示テキストファイル,Output). '入力ファイルはバイナリーモード、'(_入力バイナリファイル,Input) :- open(_入力バイナリファイル,read,Input,[type(binary)]). '出力ファイルはテキストモード'(_出力16進表示テキストファイル,Output) :- open(_出力16進表示テキストファイル,write,Output). ストリームを閉じる(Input,Output) :- close(Input), close(Output). '1バイトずつファイルを読み込み、16進数で示したもの書き込む。ただし、16バイトごとに改行を入れる'(Input,Output) :- forall('16バイト分、1バイトずつファイルを読み込み、16進数で示したものを書き込む'(Input,Output), 改行を入れる(Output)). '16バイト分、1バイトずつファイルを読み込み、16進数で示したものを書き込む'(Input,Output) :- findnsols(16,1,'1バイトずつファイルを読み込み、16進数で示したものを書き込む'(Input,Output),_). '1バイトずつファイルを読み込み、16進数で示したものを書き込む'(Input,Output) :- repeat, ( at_end_of_stream(Input),!,fail; '1バイトファイルを読み込み、16進数で示したものを書き込む'(Input,Output)). '1バイトファイルを読み込み、16進数で示したものを書き込む'(Input,Output) :- '1バイトファイルを読み込み、'(Input,_1バイト), '16進数で示したものを書き込む'(Output,_1バイト). '1バイトファイルを読み込み、'(Input,_1バイト) :- get_byte(Input,_1バイト). '16進数で示したものを書き込む'(Output,_1バイト) :- '16進数で示したものを'(_1バイト,_16進数文字列), 書き込む(Output,_16進数文字列). '16進数で示したものを'(_1バイト,_16進数文字列) :- 上位桁の16進数文字列変換(_1バイト,_16進数上位桁文字列), 下位桁の16進数文字列変換(_1バイト,_16進数下位桁文字列), atomic_list_concat([_16進数上位桁文字列,_16進数下位桁文字列,' '],_16進数文字列). 上位桁の16進数文字列変換(_1バイト,_16進数上位桁文字列) :- X is _1バイト // 16, '16進数文字コード'(X,_16進数上位桁文字列). 下位桁の16進数文字列変換(_1バイト,_16進数下位桁文字列) :- Y is _1バイト mod 16, '16進数文字コード'(Y,_16進数下位桁文字列). '16進数文字コード'(15,'F') :- !. '16進数文字コード'(14,'E') :- !. '16進数文字コード'(13,'D') :- !. '16進数文字コード'(12,'C') :- !. '16進数文字コード'(11,'B') :- !. '16進数文字コード'(10,'A') :- !. '16進数文字コード'(N,C) :- atom_number(C,N). 書き込む(Output,_16進数文字列) :- write(Output,_16進数文字列). 改行を入れる(Output) :- write(Output,'\n'). % 以下のサイトは ファイル行入力(_ファイル,_ストリーム,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,end_of_file) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_ストリーム,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,_) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!,fail. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,end_of_file) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,_) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!,fail. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典 :: Qiita_47443e0fb2988c1332b2 表(1,×,×,×,×,×). 表(2,×,×,×,○,×). 表(3,×,×,○,×,×). 表(4,×,○,×,×,×). 表(5,×,×,○,○,○). 表(6,×,○,○,×,×). 表(7,×,○,×,○,○). 表(8,×,○,○,○,○). 表(9,○,×,×,×,×). 表(10,○,×,×,○,×). 表(11,○,×,○,×,○). 表(12,○,○,×,×,○). 表(13,○,×,○,○,○). 表(14,○,○,○,×,○). 表(15,○,○,×,○,○). 表(16,○,○,○,○,○). 結婚できるか(_結婚できるか) :- findall(_項目の判定,聞き取り(_項目の判定),[_年収,_身長,_学歴,_親が資産家]), 結婚できるか(_年収,_身長,_学歴,_親が資産家,_結婚できるか). 聞き取り項目(年収,年収). 聞き取り項目(身長,身長). 聞き取り項目(学歴,学歴). 聞き取り項目(親の資産額,親が資産家). 聞き取り(_項目の判定) :- 聞き取り項目の値を得る(_項目,_値), 項目の判定(_項目,_値,_項目の判定). 聞き取り項目の値を得る(_項目,_値) :- 聞き取り項目(_質問,_項目), writef('%t : ',[_質問]), 行入力(_値). 項目の判定(_項目,_値,_項目の判定) :- P =.. [_項目,_値,_項目の判定], call(P). 年収(_年収文字列,○) :- 年収が10000000円以上(_年収文字列),!. 年収(_,×). 年収が10000000円以上(_年収文字列) :- atom_number(_年収文字列,_年収), _年収 >= 10000000. 親が資産家(_資産額文字列,○) :- 親の資産が10000000円以上(_資産額文字列),!. 親が資産家(_,×). 親の資産が10000000円以上(_資産額文字列) :- atom_number(_資産額文字列,_資産額), _資産額 >= 100000000. 身長(_身長文字列,○) :- 身長が180cm以上(_身長文字列),!. 身長(_,×). 身長が180cm以上(_身長文字列) :- atom_number(_身長文字列,_身長), _身長 >= 180. 学歴(_学歴,○) :- 最終学歴の偏差値が65以上(_学歴),!. 学歴(_学歴,×). 最終学歴の偏差値が65以上(_大学卒) :- 入試時点の偏差値(_大学卒,_偏差値), _偏差値 >= 65. 入試時点の偏差値(南河内大学,71). 入試時点の偏差値(私立東京未来大学,62). 結婚できるか(_年収,_身長,_学歴,_親が資産家,結婚できる) :- 表(_,_年収,_身長,_学歴,_親が資産家,○). 結婚できるか(_年収,_身長,_学歴,_親が資産家,結婚できない) :- 表(_,_年収,_身長,_学歴,_親が資産家,×). 行入力(_行文字列) :- 行入力文字ならびを得る(_行入力文字ならび), atom_chars(_行文字列,_行入力文字ならび). 行入力文字ならびを得る(_行入力文字ならび) :- findall(_文字,(文字入力(_文字),(行入力終了(_文字),!,fail;true)),_行入力文字ならび). 文字入力(end_of_file) :- at_end_of_stream(user_input). 文字入力(_文字) :- get_char(_文字). 文字入力(_文字) :- 文字入力(_文字). 行入力終了(end_of_file). 行入力終了('\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/726 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した10文字以内の任意の文字列の中で、 # ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す関数 # char *cut_str(char *address1, char target_char)を定義し、 # その動作を確認するkadai7-2.cを作りなさい。 # ただし、文字列と、ある特定の文字の入力は、 # char str[10], target_char; # scanf("%s %c", str, &target_char); # で入力されるものとして、 # 答えは以下で出力されるものとする。 # printf("answer = %s\n", cut_str(str, target_char)); # # 'キーボードから入力した10文字以内の任意の文字列の中で、ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す'(_ある特定の文字が最初に現れる位置からそれ以降の部分文字列) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字), 'ある特定の文字が最初に現れる位置からそれ以降の部分文字列を返す'(_文字列,_ある特定の文字,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列). キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- 催促の後一行入力して文字列とある特定の文字を得る(_文字列,_ある特定の文字),!. キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字). 催促の後一行入力して文字列とある特定の文字を得る(_文字列,_ある特定の文字) :- 催促の後一行入力する(_入力文字列), 文字列入力診断(_入力文字列,_文字列,_ある特定の文字). 催促の後一行入力する(_入力文字列) :- write('10文字以内の任意の文字列とある特定の文字を空白区切りで入力してください : '), 一行読み込む(_入力文字列,_). 文字列入力診断(_入力文字列,_文字列,_ある特定の文字) :- 文字列とある特定の文字を切り出す(_入力文字列,_文字列,_ある特定の文字), 文字列の長さ診断(_文字列,_ある特定の文字),!. 文字列入力診断(_入力文字列,_,_) :- writef('入力された %t から適切な情報が得られません。再入力をお願いします。\n',[_入力文字列]), fail. 文字列とある特定の文字を切り出す(_入力文字列,_文字列,_ある特定の文字) :- sub_atom(_入力文字列,_文字列,_空白文字列,_ある特定の文字), 空白文字列(_空白文字列), ある特定の文字は先頭文字は空白になり得ない(_ある特定の文字). 空白文字列(_空白文字列) :- sub_atom(_空白文字列,_,1,_,' '), forall(sub_atom(_空白文字列,_,1,_,_文字),_文字 = ' '). ある特定の文字は先頭文字は空白になり得ない(_ある特定の文字) :- \+(sub_atom(_ある特定の文字,0,1,_,' ')). 文字列の長さ診断(_文字列,_ある特定の文字) :- '10文字以内の文字列と1文字のある特定の文字'(_文字列,_ある特定の文字),!. 文字列の長さ診断(_文字列,_ある特定の文字) :- atom_length(_文字列,_文字列の長さ), writef('入力された文字列 %t は%t文字あります。10文字以下の長さで再入力をお願いします\n',[_文字列,_文字列の長さ]), fail. '10文字以内の文字列と1文字のある特定の文字'(_文字列,_ある特定の文字) :- '10文字以内の文字列'(_文字列), '1文字のある特定の文字'(_ある特定の文字). '10文字以内の文字列'(_文字列) :- atom_length(_文字列,_文字列の長さ), _文字列の長さ =< 10. '1文字のある特定の文字'(_ある特定の文字) :- atom_length(_ある特定の文字,1). 'ある特定の文字が最初に現れる位置からそれ以降の部分文字列を返す'(_文字列,_ある特定の文字,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列) :- sub_atom(_文字列,S,_,_,_ある特定の文字), sub_atom(_文字列,S,_,0,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列),!. 一行読み込む(_行,_終了状態) :- 行入力(_行,_終了状態). 行入力(X,_終了状態) :- get_char(C), '行入力/3'(C,Chars,_終了状態), atom_chars(X,Chars). '行入力/3'('\n',[],改行) :- !. '行入力/3'([A],[A],end_of_file) :- at_end_of_stream(user_input),!. '行入力/3'(C,[C|R],_終了状態) :- get_char(C2), '行入力/3'(C2,R,_終了状態). % 以下のサイトは # 出典 :: Yahoo 知恵袋 pata0103さんの質問 # - - - # 1 2 - # 1 - 3 # このようなテキストファイルを読み取って # int a[3][3]という配列に # 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する # といったことをするにはどのようにコードを書けばいいのでしょう? # 簡単なことで申し訳ありませんがよろしくお願いします。 # '- - - 1 2 - 1 - 3 このようなテキストファイルを読み取って int a[3][3]という配列に 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(_ファイル,_a) :- テキストファイルを読み取って(_ファイル,_Lines), 'int a[3][3]という配列に 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(Lines,_a). このようなテキストファイルを読み取って(_ファイル,Lines) :- get_lines(_ファイル,Lines). 'int a[3][3]という配列に 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(Lines,_a) :- findall(L,( 読み取った行をならびに変換し(Line,L1), 'ならびの各要素に、座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(L1,L)),_a). 読み取った行をならびに変換し(Line,L1) :- member(Line,Lines), split(Line,[' '],L1). 'ならびの各要素に、座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(L1,L) :- findall(B,( member(A,L1), '”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(A,B)),L). '”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(-,-1) :- !. '”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(_数字,_数字). get_line(Line) :- read_line_to_codes(user_input,Codes), atom_codes(Line,Codes). get_lines([]) :- at_end_of_stream(user_input),!. get_lines([Line|R]) :- get_line(Line), get_lines(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/649 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # ダイエットファイルに # # 20100930,curry and rice # 20101003,kitsune soba # 20101003,rice ball # # のような形で日付とその日食べた昼食が保存されているとする. # コマンド行引数にダイエットファイル名と日付(yyyymmdd 形式) を指定して実行すると, # ファイルの中から指定した日付を含む行を検索し,その日の昼食を出力するプログラムを作成せよ. # また,引数としてファイルと文字列を指定しなかった場合に,使い方を出力して終了するようにせよ. # 日付の検索には,標準関数char *strstr(const char *str1, const char *str2); を使用するのが簡単である. # # 【実行例】 # % ./q3-3 diet.txt 20100929 # date 20100929 was not found in file diet.txt # % ./q3-3 diet.txt 20101003 # 20101003,kitsune soba # 20101003,rice ball # % ./q3-3 # Usage: ./q3-3 filename date(yyyymmdd) # % # # program :- パラメータを得る(_ファイル,_日付), get_split_lines(_ファイル,[','],LL), 日付をキーに検索する(_日付,LL,LL2), 検索した行を表示する(_日付,LL2). halt. パラメータを得る(_ファイル,_日付) :- user_paramaters(L), 診断(L,_ファイル,_日付),!. 診断([_ファイル,_日付],_ファイル,_日付) :- !. 診断(_,_,_) :- write('Usage: ./prolog filename date(yyyymmdd)\n'), halt. 日付をキーに検索する(_,[],[]) :- !. 日付をキーに検索する(_日付,[[_日付,_その日食べた昼食]|R1],[[_日付,_その日食べた昼食]|R2]) :- 日付をキーに検索する(_日付,R1,R2),!. 日付をキーに検索する(_日付,[_|R1],R2) :- 日付をキーに検索する(_日付,R1,R2),!. 検索した行を表示する([]) :- !. 検索した行を表示する([[_,_日付,_その日食べた昼食]|R]) :- write('%t,%t\n',[_日付,_その日食べた昼食]), 検索した行を表示する(R). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/477 # # [1] アルゴリズム論 # [2] Unixコマンドのgrepを実装したmygrepの作成 #   コマンドライン引数で検索文字列とファイル名をもらい、ファイル内に検索文字列が含まれる行があればその行を出力する #   正規表現に対応させる必要はない # [3] # [3.1]windows xp  # [3.2]gcc  # [3.3]c言語 # [4] 無期限 # [5] strstrは使用禁止 # # よろしくおねがいします # program :- user_paramaters([_検索文字列,_ファイル名]), open(_ファイル名,read,Instream), grep_line(Instream,_検索文字列), close(Instream), halt. grep_line(Instream,_検索文字列) :- at_end_of_stream(Instream),!. grep_line(Instream,_検索文字列) :- get_line(Stream,Line), sub_atom(Line,_,_,_,_検索文字列), writef('%t\n',[Line]), fail. grep_line(Instream,_検索文字列) :- grep_line(Instream,_検索文字列). % 以下のサイトは ローンパターン述語(_ファイル名,Instream,_外部述語,_貸し出し述語) :- open(_ファイル名,read,Instream), 外部述語への貸し出し(_外部述語,_貸し出し述語), close(Instream). 外部述語への貸し出し(_外部述語,_貸し出し述語) :- call(_外部述語,_貸し出し述語). 読み込み述語(Stream,_項) :- read(Stream,_項). 外部述語(_借入述語) :- repeat, ( arg(1,_借入述語,Stream),at_end_of_stream(Stream),!; call(_借入述語), arg(2,_借り入れ述語,_項), writef('%q\n',[_項]), fail). ?- ローンパターン述語('temp1.pro',Instream,外部述語,読み込み述語(Instream,_項)). % 以下のサイトは ローンパターン述語(_ファイル名,Instream,_外部述語,_貸し出し述語) :- open(_ファイル名,read,Instream), 外部述語への貸し出し(_外部述語,_貸し出し述語), close(Instream). 外部述語への貸し出し(_外部述語,_貸し出し述語) :- call(_外部述語,_貸し出し述語). 読み込み述語(Stream,_項) :- read(Stream,_項). 外部述語(_借入述語) :- arg(1,_借入述語,Stream), at_end_of_stream(Stream). 外部述語(_借入述語) :- copy_term(_借入述語,_借入述語_2), call(_借入述語), arg(2,_借り入れ述語,_項), writef('%q\n',[_項]), 外部述語(_借入述語_2). ?- ローンパターン述語('temp1.pro',Instream,外部述語,読み込み述語(Instream,_項)). % 以下のサイトは ローンパターン述語(_ファイル名,Instream,_外部述語,_貸し出し述語) :- open(_ファイル名,read,Instream), 外部述語への貸し出し(_外部述語,_貸し出し述語), close(Instream). 外部述語への貸し出し(_外部述語,_貸し出し述語) :- call(_外部述語,_貸し出し述語). 読み込み述語(Stream,_項) :- read(Stream,_項). 外部述語(_借入述語) :- arg(1,_借入述語,Stream), at_end_of_stream(Stream). 外部述語(_借入述語) :- call(_借入述語), arg(2,_借り入れ述語,_項), writef('%q\n',[_項]), 外部述語(_借入述語). ?- ローンパターン述語('temp1.pro',Instream,外部述語,読み込み述語(Instream,_項)). % 以下のサイトは % % SWI-Prolog のコマンド引数の内、ユーザパラメータ部分をリストに得る。 % user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/348 # # [1] C言語演習 # # [2] argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 # 但し、第一引数だけは別の配列(ary)に格納はしないこと。 # 例)argv:./test a b c d e f # 例)ary :./test b c d e f # # [3.1] redhat # [3.3] C言語 # [4] 本日中 # [5] 制限:なし # わかる方どうかよろしくお願いします。 # # 'argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 但し、第一引数だけは別の配列(ary)に格納はしないこと'(UserParameterList) :- user_parameters([_|UserParameterList]),!. user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/425 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 与えた文字列を指定した回数繰り返す文字列に変換するプログラムを作成しなさい。 # ただし、main関数を以下のように宣言し、実行時に引数をとれるようにする。 # 第一引数は繰り返し回数とし、第二引数は繰り返される文字列とする。 # すなわち、./prog 3 "ABC"と実行した場合は、ABCABCABCとなる文字列が作られる。 # 作られた文字列は、表示すること。必要に応じて、数字を数値に変換する関数atoi()を使用してもよい。 # その際は、#include<stdlib.h>を加えること。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc,char*argv[]){ # /** argc:引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:引数**/ # x=atoi(argv[1]);/*atoiの使用例*/ # return(0); # } # program :- 与えた文字列を指定した回数繰り返す文字列に変換する. 与えた文字列を指定した回数繰り返す文字列に変換する :- user_parameters([_回数文字列,_文字列]), atom_to_term(_回数文字列,_回数,_), length(Ln,_回数), append(_,[_|R],Ln), write(_文字列), R = []. user_parameters(A) :- current_prolog_flag(argv, B), append(_, [--|A], B). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/639 # # [1] C言語演習 # [2] argvで入力された引数 "123:456:78:90" の様な文字列を ":" 区切りで # 別の配列へ順に格納せよ。(strchr関数を使いなさい) # 上記の例では、[0]=123,[1]=456,[2]=78,[3]=90となる。 # 尚、::の連続もありで、"12:34::90" は [0]=12,[1]=34,[2]=null,[3]=90となる。 # # 下の様に処理しているが、スマートに行きません。。。 # p = NULL; # p = strchr(str, ':'); # while (p != NULL) { # printf("length %d\n", strlen(str)-strlen(p)); # p++; # p = strchr(p, ':'); # } # 'argvで入力された引数 "123:456:78:90" の様な文字列を ":" で区切り、プログラム引数述語のリスト引数とする' :- user_parameters([_引数文字列]), split(_引数文字列,[':'],L), assertz(プログラム引数(L)). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/682 # # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(0,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,1,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,0,1,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,1,0,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,0,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(0,1,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,1,1,'NG') :- !. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/699 # # ../test/read.cgi/tech/1311089619/682について内容が不足していたので再投稿します。 # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # [3] フラグ・判定にビット演算を使用してください。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する。判定はビット演算を使う' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'OK') :- 0 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'NG') :- 1 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/453 # # 【 課題 】コマンドラインから入力された点数を集計するプログラムを作成。 #       ソースファイルにコードを追加して、以下の実行結果になるように。 # # 実行結果  #       java CalcMain 69 88 70 45 95 33 #       高得点順: 95点 , 88点 , 70点 , 69点 , 45点 , 33点 #       科目数:6科目 #       合計点:400点 #       平均点: 66.666664点 #        CalcMainクラスはmain()メソッドを持つ。 #        Calculationクラスは、合計点の計算をするgetTotal()メソッド、平均点の計算をするgetAve()メソッド、並び替え処理を行うsort()メソッドを持つ。 #        コマンドライン引数から受け取った不特定数の数値(点数)について、降順並び替え表示、科目数、合計点、平均点の表示を行う。 #        sort()メソッドの並び替え処理には「バブルソート」を使用する # # #       ソースファイル #       http://ime.nu/www.dotup.org/uploda/www.dotup.org2249012.java.html # # http://ime.nu/www.dotup.org/uploda/www.dotup.org2249060.java # # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11月14日まで # 【 Ver  】java version "1.6.0_22" # 【 用語 】 # 【 補足 】よろしくお願いします。 # # 'コマンドラインから入力された点数を集計するプログラムを作成。ソースファイルにコードを追加して、以下の実行結果になるように。' :- コマンドラインから入力された点数(_コマンドラインから入力された点数ならび), 高得点順に表示(_コマンドラインから入力された点数ならび), 科目数と合計点と平均点の表示(_コマンドラインから入力された点数ならび). コマンドラインから入力された点数(_コマンドラインから入力された点数ならび) :- current_prolog_flag(argv,_コマンドライン), append(_,['--'|_コマンドラインから入力された点数ならび],_コマンドライン]). 高得点順に表示(L) :- バブルソート降順(L,L2), concat_atom(L2,',',_表示文字列), writef('高得点順: %t\n',[_表示文字列]). 科目数の表示(L,_科目数) :- length(L,_科目数), writef('科目数: %t\n',[_科目数]), 科目数と合計点と平均点の表示(L) :- length(L,_科目数), sum(L,_合計点), _平均点 is _合計点 / _科目数. writef('科目数: %t\n合計点: %t\n平均点: %t\n',[_科目数,_合計点,_平均点]). バブルソート降順(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一), !, バブルソート降順(_対象ならびの一,_整列済みならび). バブルソート降順(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 降順交換(R1,R2). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/670 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # #include<stdio.h> # int main(void) # { # int i=0; # char *ptr; # char str[128]; # # ptr = str; # # scanf("%s",&str); # # while(*ptr++){ # i++; # } # # printf("%d\n",i); # } # # 上記の入力したテキストの文字数を表示するプログラムの読み込み部分をファイル処理に変更せよ。 # fgetc() 関数を使用し、コマンドラインにファイル名が指定できるようにすること。 # ただし、ファイル名を指定しない場合は標準入力とする。 # ファイルが見つからなかった時はエラーメッセージを出し、プログラムを終了する。 # 'length系組込述語を使わず入力したテキストの文字数を表示する' :- get_chars(_文字ならび), ならびの文字数を数える(_文字ならび,_文字数), writef('文字数は %t文字です\n',[_文字数]). ならびの文字数を数える([],0). ならびの文字数を数える([_|R],_文字数) :- ならびの文字数を数える(R,_文字数_1), _文字数 is _文字数_1 + 1. 読み込み部分をファイル処理に変更する :- コマンドラインからファイル名を取り出す(_ファイル名), 読み込み部分をファイル処理に変更する(_ファイル名). 読み込み部分をファイル処理に変更する(user_input,_文字数) :- ファイルから読み出しながら文字数を数える(user_input,_文字数). 読み込み部分をファイル処理に変更する(_ファイル名,_文字数) :- open(_ファイル名,read,Instream), ファイルから読み出しながら文字数を数える(Instream,_文字数), close(Instream). ファイルから読み出しながら文字数を数える(Instream,0) :- at_end_of_stream(Instream),!. ファイルから読み出しながら文字数を数える(Instream,_文字数) :- get_char(Instream,_), ファイルから読み出しながら文字数を数える(Instream,_文字数_1), _文字数 is _文字数_1 + 1. コマンドラインからファイル名を取り出す(_ファイル名) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList), ParameterList = [_ファイル名|_],!. コマンドラインからファイル名を取り出す(user_input). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/613 # # 明日までの課題です。 # まったくわかりません。 # # キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力するプログラムを書きなさい。 # なお、プログラムは次の要件を満たすこと。 # # 1.キーボードからの入力は、Enter(return)キーを2回連続して入力すると終了する # 2.入力終了後、画面に入力した行数を表示する # 3.コマンドラインからプログラムを起動後、入力する文字列に各自の氏名(ローマ字表記)を含めた場合、入力処理終了後、各自の氏名を含む行は何行目にあり、その行の文字列が何であるか表示する。 # 氏名が入力データに含まれていない場合には、含まれていなかったことを表示する # # よろしくお願いします。 # # program :- 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する' :- user_parameters([_ファイル名]), open(_ファイル名,write,Outstream), get_line(Line), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,[]), close(Outstream). 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,'',Ln) :- length(Ln,_行数), writef('行数は %t です\n',[_行数]),!. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,Ln) :- writef(Outstream,'%t\n',[Line]), get_line(Line_2), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line_2,[_|Ln] user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/59 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # main関数を以下のように宣言し、実行時に引数を取れるようにする。 # 引数がすべて得点であるとして、その平均値を # 求めるプログラムを作成しなさい。 # すなわち、 # ./prog 50 70 90 と実行した場合は、70と表示される。 # 必要に応じて、数字を数値に変換する関数atoi()や # atof()を使用してもよい。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc, char *argv[] ) { # /** argc: 引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:実数 **/ # x = atof( argv[1] ); /* atofの使用例 */ # return(0); # } # # ※ 配列のサイズなど、定数は必ず#defineを利用すること. # ※ 表示や入力を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わないこと. # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月15日 # よろしくお願いします! # # program :- user_parameters(_ユーザパラメータならび), プログラム引数を整数ならびに変換(_ユーザパラメータならび,_整数ならび), avg(整数ならび,_相加平均), writef('%t\n',[_相加平均]). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). プログラム引数を整数ならびに変換([],[]). プログラム引数を整数ならびに変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), integer(N), プログラム引数を整数ならびに変換(R1,R2). プログラム引数を整数ならびに変換([_|R1],R2) :- プログラム引数を整数ならびに変換(R1,R2). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/642 # # [1] 授業単元:C言語演習 # [2] 問題文: # 実行ファイル名をmultiとして、multiに続いて2つの正の整数を入力すると、小さい方の整数から大きい方の整数までの積を出力するプログラムを作成せよ。 # 但し、入力時には小さい方の整数、大きいほうの整数の順で入力されるものとする。 # <入力例>$./multi 3 6 # <計算結果>360 # program :- user_parameters([_引数1,_引数2]), 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2), user_parameters(ParametersList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2) :- atom_number(_引数1,N1), atom_number(_引数2,N2), 小さい方の整数と大きい方の整数(N1,N2,_小さい方の整数,_大きい方の整数), 小さい方の整数から大きい方の整数までの積を(_小さい方の整数,_大きい方の整数,_積), 出力する(_積). 小さい方の整数と大きい方の整数(N1,N2,N1,N2) :- N1 =< N2. 小さい方の整数と大きい方の整数(N1,N2,N2,N1) :- N1 > N2. 小さい方の整数から大きい方の整数までの積を(N,N,N). 小さい方の整数から大きい方の整数までの積を(N,_大きい方の整数,_積) :- N < _大きい方の整数, N1_2 is N1 + 1, 小さい方の整数から大きい方の整数までの積を(N_2,_大きい方の整数,_積_2), _積 is _積_2 * N. 出力する(_積) :- writef('%t\n',[N]). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/786 # # C言語 # gcc # Linux # 問題:cat関数を作りなさい。ただし、fgets,fputsを用いること。です。 # # 明日のお昼までにお願いします。 # # cat :- user_parameters([]), get_code(user_input,Code), ストリームから読み取り書き出す(user_input,Code),!. cat :- user_parameters(L), append(_,[File|R],L), ファイルを書き出す(File), R = [],!. ファイルを書き出す(File) :- open(File,read,Instream), get_code(Instream,Code), ストリームから読み取り書き出す(Instream,Code), close(Instream). ストリームから読み取り書き出す(_,-1) :- !. ストリームから読み取り書き出す(Instream,Code_1) :- put_code(Code_1), get_code(Instream,Code_2), ストリームから読み取り書き出す(Instream,Code_2). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % % SWI-Prologの起動は % # swipl -t cat -f プログラムファイル名 -- ファイル1 ファイル名2 ... % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/907 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のようにmain関数を定義し、mainの引数を合計するプログラムsumを作成せよ。ただし、引数の数は未定であり、実行時に決定されるものとする。 # int main(int argc, char *argv[]) # main :- 利用者引数ならび(_利用者引数ならび), findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値ならび), sum(_数値ならび,_合計), writef('%t\n',[_合計]). sum([],0). sum([_数値|R],_合計) :- sum(R,_合計_1), _合計 is _数値 + _合計_1. 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). % % # swipl --quiet -f c161_907.html -g main -- 33.0 25.1 38.4 % 96.5 % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/957 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク): # コマンド行から複数の数値を受け取りその平均値を出力するプログラムを # 作成し、プログラムリストと実行結果を示せ。ヒント:受け取った文字列を # double型に変換するには、関数double atof(const char *nPtr)を使う。 # この関数を使うには<stdlib.h>のインクルードが必要である。 # #include <stdio.h> # #include <stdlib.h> # int main(void) # { # char str[]="1.41421356"; # double x; # x = atof(str); # } # 'コマンド行から複数の数値を受け取りその平均値を出力する' :- 利用者引数ならび(_利用者引数ならび), 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび), 相加平均(_数値引数ならび,_相加平均), writef('平均値は %t です\n',[_相加平均]). 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび) :- findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値引数ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0e+00,M). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは # 出典: twitter_by_@_ktwr_20140620 # 出典: Qiita::Prologカットについて # # stream を使って書きなおしてみる。 "findallterm_from_stream.pro"に保存。 # findallterm_from_stream(Stream,_):- at_end_of_stream(Stream),!. findallterm_from_stream(Stream,Term) :- read(Stream,Term0), process(Term0,Term), findallterm_from_stream(Stream,Term). process(Term0,Term) :- \+(Term0=Term),!. process(Term0,_) :- write(Term0), nl. :- open('findallterm_from_stream.pro',read,Input), findallterm_from_stream(Input,_), close(Input). findallterm_from_stream(_G1737,_G1738):-at_end_of_stream(_G1737),! findallterm_from_stream(_G1748,_G1749):-read(_G1748,_G1752),process(_G1752,_G1749),findallterm_from_stream(_G1748,_G1749) process(_G1769,_G1770):- \+_G1769=_G1770,! process(_G1783,_G1784):-write(_G1783),nl Input = (0x8e49350). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # # かたやん印刷所では、いまの時代においてもグーテンベルグ印刷にこだわって印刷をしています。 # グーテンベルグ印刷とは、活版(活字を組み合わせて作った版)で印刷する方法です。(Wikipedia) # # かたやん印刷所の所長かたやんは、使った活字を元の場所に戻さないので、 # いつも活字を入れているボックスはぐちゃぐちゃで、 # ほしい活字をすぐに見つけ出すことができません。 # # そこで見かねた印刷所の副所長エミーは、活字を入れているボックスビデオで撮影し、 # 画像解析し、ボックスのどこにどの活字があるかを解析し、 # ほしい文字列の活字がどこにあるか瞬時にみつけだすプログラミングを作ることにしました。 # # 現状の状態のボックスは以下のようになっています。 # # # 6×6のボックスの中から"PRO, PROGRAMMER"という活字を探し出したいです。 # カンマやスペースは1つの活字としてカウントします。 # ですので、今回は文字13個、カンマ1個、スペース1個の合計15個の活字が必要です。 # 一度使った活字は2回使うことはできません。 # # 活字の場所は、(縦番号,横番号)で表すと以下のような順番で活字を取り出すことができます。 # 縦番号は上から下の方向に、横番号は左から右の方向に、1から数えます。 # 1,4 = P # 2,1 = R # 1,6 = O # 5,2 = , # 5,4 = space # 2,2 = P # 3,4 = R # 4,5 = O # 5,1 = G # 4,3 = R # 1,1 = A # 2,5 = M # 6,1 = M # 2,4 = E # 6,6 = R # # # 上記の例では、例えば"P"という文字が2回でてきますが、(1,4)と(2,2)にある"P"はどちらを先につかってもかまいません。 # また場所の特定は1つのみ記述すればよいです。すべての場所番号を書く必要はありません。 # # 画像解析したボックスのデータはCSVで出力されます。 # ボックスのデータを使ってほしい文字列を作るための活字の在り処を探しだしてください。 # # ■資料 # gutenberg.zip # zipファイルを解凍すると以下のファイルが入っています。 # # gutenberg.csv # このボックスから"STAY HUNGRY, STAY FOOLISH"という活字を取り出してください。 # 文字21個、カンマ1個、スペース3個で、合計25個の活字が必要です。 # # answer.txt # 解答用テキストファイルです。 # # ■解答方法 # 解答用テキストファイル(answer.txt)を完成させ、アップロードしてください。 # ※解答用テキストファイル(answer.txt)以外のファイル形式(zipなど)をアップロードした場合は評価対象外となります。 # '20×20のボックスの生成' :- open('gutenberg.csv',read,Instream), '20×20のボックスの生成'(Instream,_20掛ける20のボックス), close(Instream), assertz('20×20のボックス'(_20掛ける20のボックス)). '20×20のボックスの生成'(Instream,[]) :- at_end_of_stream(Instream),!. '20×20のボックスの生成'(Instream,[L|R]) :- get_line(Instream,Line), split(Line,['\t'],L), '20×20のボックスの生成'(Instream,R). '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス) :- atom_chars(_ある文字列,_文字ならび), '20×20のボックスの中からある文字列を取り出す'(_文字ならび,_20掛ける20のボックス,L), 解の表示(L). '20×20のボックスの中からある文字列を取り出す'([],_20掛ける20のボックス,[]) :- !. '20×20のボックスの中からある文字列を取り出す'([_文字|_残り文字ならび],_20掛ける20のボックス_1,[[_文字,_行目,_列目]|R]) :- ある文字を取り出す(_文字,_20掛ける20のボックス_1,1,_列目,_20掛ける20のボックス_2), '20×20のボックスの中からある文字列を取り出す'(_残り文字ならび,_20掛ける20のボックス_2,R). ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行_2|R_1]) :- nth1(_列目,_行,_文字), 行を更新する(_行,_列目,_行_2),!. ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行|R_2]) :- _行目_2 is _行目 + 1, ある文字を取り出す(_文字,R_1,_行目_2,_列目,R_2). 行を更新する(_行,_列目,_行_2) :- length([_|L1],_列目), append(L1,[_|R],_行), append(L1,[''|R],_行_2),!. 解の表示(L) :- tell('ans.txt'), forall(member([_文字,_行目,_列目],L),writef('%t,%t,%t\n',[_文字,_行目,_列目])), told. get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). :- '20×20のボックスの生成'(_CSVファイル). :- '20×20のボックス'(_20掛ける20のボックス), '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス). % 以下のサイトは # ●Regular Expressionの使用環境 # # # ●検索か置換か? # 置換 # # ●説明 # 複数行の空行を1つの空行にしたい # # ●対象データ # # # # # # ●希望する結果 # 複数行の空行を1つの空行にしたい(_ファイル) :- get_chars(_ファイル,_文字ならび), 複数行の空行を1つの空行にしたい(_行ならび,_複数の空行を1つの空行にした文字ならび), put_chars(_ファイル,_複数の空行を1つの空行にした文字ならび). 複数行の空行を1つの空行にしたい([],[]). 複数行の空行を1つの空行にしたい(['\n','\n'|_残り行ならび],_複数の空行を1つの空行にした行ならび) :- 複数行の空行を1つの空行にしたい(['\n'|_残り行ならび],_複数の空行を1つの空行にした行ならび),!. 複数行の空行を1つの空行にしたい([A|R1],[A|R2]) :- 複数行の空行を1つの空行にしたい(R1,R2),!. get_chars(_ファイル,_文字ならび) :- open(_ファイル,read,Instream), findall(_文字,( at_end_of_stream(Instream),!,fail; get_char(Instream,_文字))), _文字ならび), close(Instream). put_chars(_ファイル,_文字ならび) :- open(_ファイル,write,Outstream), append(_,[_文字|R],_文字ならび), putchar(Outstream,_文字), R = [], close(Outstream). % 以下のサイトは # # シェル経由の他言語インターフェイス shs/3 です。 # shs(Command,_コマンドへの入力ならび,_コマンドからの出力ならび) :- popen(Command,Outstream,Instream), コマンドへの入力(Outstream,_コマンドへの入力ならび), close(Outstream), コマンドからの出力の収集(Instream,_コマンドからの出力ならび), close(Instream). popen(Command,Outstream,Instream) :- open(pipe(Command),write,Outstream), open(pipe(Outstream),read,Instream). コマンドへの入力(Outstream,_コマンドへの入力ならび) :- tell(Outstream), forall(member(_入力行,_コマンドへの入力ならび),writef('%t\n',[_入力行])), told. コマンドからの出力の収集(Instream,[]) :- at_end_of_stream(Instream),!. コマンドからの出力の収集(Instream,[_行|R]) :- get_line(Instream,_行), コマンドからの出力の収集(Instream,R). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,C,[C]) :- at_end_of_stream(Stream),!. get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/854 # ●Regular Expressionの使用環境 # Becky! Internet Mail Ver.2 # # ●検索か置換か? # 検索 # # ●説明 # +0900を含まないものを検索したい # # ●対象データ # +0900 # +0500 # +0630 # # ●希望する結果 # +0500 # +0630 # # よろしくお願いします。 # # '+0900を含まないものを検索したい'(_文字列) :- 行ならび入力(_行ならび), '+0900を含まないものを検索したい'(_行ならび,_文字列). '+0900を含まないものを検索したい'(_行ならび,_文字列) :- member(_文字列,_行ならび), '+0900を含まないものを'(_文字列). '+0900を含まないものを'(_文字列) :- \+(sub_atom(_文字列,_,_,_,'+0900')). 行ならび入力([]) :- at_end_of_stream(user_input),!. 行ならび入力(_行ならび) :- 行を入力して行く(_行ならび) :- 行を入力して行く([_行|_残り行ならび]) :- 行入力(_行), 行ならび入力(_残り行ならび). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/453 # [2] 問題文 標準入力から1行の文字列を受け取って文字の単方向リストをつくれ # abbdeと入力すると→e→d→c→b→a # 標準入力から1行の文字列を受け取って文字の単方向リストをつくれ(_文字の単方向リスト) :- 標準入力から1行の文字列を受け取って文字の単方向リストをつくれ([],_文字の単方向リスト). 標準入力から1行の文字列を受け取って文字の単方向リストをつくれ(L,L) :- at_end_of_stream(user_input),!. 標準入力から1行の文字列を受け取って文字の単方向リストをつくれ(L_1,_文字の単方向リスト) :- get_char(_文字), 標準入力から1行の文字列を受け取って文字の単方向リストをつくれ([_文字|L_1],_文字の単方向リスト). % 以下のサイトは # お題:あるCUIプログラムの標準出力を少しずつ読み込みながら、小文字をすべて大文字に変換して出力する。 # 'あるCUIプログラムの標準出力を少しずつ読み込みながら、小文字をすべて大文字に変換して出力する'(_あるCUIプログラム) :- open(pipe(_あるCUIプログラム),read,Instream), '標準出力を少しずつ読み込みながら、小文字をすべて大文字に変換して出力する'(Instream), close(Instream). '標準出力を少しずつ読み込みながら、小文字をすべて大文字に変換して出力する'(Instream) :- at_end_of_stream(Instream),!. '標準出力を少しずつ読み込みながら、小文字をすべて大文字に変換して出力する'(Instream) :- 小文字をすべて大文字に変換して出力する(Instream). 小文字をすべて大文字に変換して出力する(Instream) :- get_char(Instream,_文字), 小文字を大文字に変換して出力する(文字), '標準出力を少しずつ読み込みながら、小文字をすべて大文字に変換して出力する'(Instream). 小文字を大文字に変換して出力する(文字) :- 小文字を大文字に変換して(_文字,_大文字), 出力する(_文字). 小文字を大文字に変換して(_小文字,_大文字) :- 小文字ならば大文字に変換する(_小文字,_大文字). 大文字に変換する(_文字,_文字) :- 小文字以外は変換しない(_文字). 小文字ならば大文字に変換する(_小文字,_大文字) :- 小文字(_小文字), 大文字に変換する(_小文字,_大文字). 小文字(_小文字) :- _小文字 @>= a, _小文字 @=< z. 大文字に変換する(_小文字,_大文字) :- char_code(_小文字,_小文字コード), _大文字コード is _小文字コード - 32, char_code(_大文字,_大文字コード). 小文字以外は変換しない(_文字) :- \+(小文字(_文字)). 出力する(_文字) :- put_char(_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元: リスト処理 # [2] 問題文(含コード&) http://codepad.org/3DdhcBUM # # /* # # seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 # また、整列する際に要素どうしを比較した回数も表示しなさい。 # # 【実行例】 # # 番号 氏名      得点 # 1021 Machida Masato 100 # 1017 Nonaka Fujio 98 # 1011 Suzuki kenichi 93 # 1019 Fujimoto Kaoru 92 # 1006 kato Ichiro 91 # ・ ・     ・ # ・ ・     ・ # ・ ・     ・ # 1020 Hoshi Izumi 32 # 整列の為の比較回数=132回 # # ※長いので実行結果は途中省略しています。 # ※比較回数はコードによって異なる場合があります。 # # */ 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 また、整列する際に要素どうしを比較した回数も表示しなさい。' :- 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび), リスト処理による挿入法で得点の降順に整列して(_生徒ならび,[],_整列済み生徒ならび,0,_比較回数), 表示しなさい(_整列済み生徒ならび,_比較回数). 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび) :- get_split_lines('seito.dat',[' '],_生徒ならび). リスト処理による挿入法で得点の降順に整列して([[_学籍番号,_姓,_名,_得点]|R1],L1,_整列済み生徒ならび,_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,L1,L2,_比較回数_1,_比較回数_2), リスト処理による挿入法で得点の降順に整列して(R1,L2,_整列済み生徒ならび,_比較回数_2,_比較回数),!. リスト処理による挿入法で得点の降順に整列して([],_整列済み生徒ならび,_整列済み生徒ならび,_比較回数,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],[[_学籍番号,_名,_名,_得点],[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],_比較回数_1,_比較回数) :- 比較回数 is _比較回数_1 + 1, _得点 >= _得点_1,!. 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R1],[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R2],_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,R1,R2,_比較回数_1,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[],[[_学籍番号,_名,_名,_得点]],_比較回数,_比較回数) :- !. 表示しなさい(_整列済み生徒ならび,_比較回数) :- 見出しの表示, append(_,[[_学籍番号,_姓,_名,_得点]|R],_整列済み生徒ならび), 整形して表示する(_学籍番号,_姓,_名,_得点), R = [], writef('整列の為の比較回数=%t回\n',[_比較回数]). 見出しの表示 :- write('番号 氏名      得点\n'). 整形して表示する(_学籍番号,_姓,_名,_得点) :- 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列), 得点を頭部空白3桁に(_得点,_得点文字列), atomic_list_concat([_学籍番号,_姓文字列,_名文字列,_得点文字列],' ',_表示文字列), writef('%t\n',[_表示文字列]). 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列) :- '8桁に'(_姓,_姓文字列), '8桁に'(_名,_名文字列). '8桁に'(_項,_8桁文字列) :- atom_chars(_項,Chars_1), length(L,8), append(L1,L2,L), all(L2,' '), atom_chars(_8桁文字列,L). 得点を頭部空白3桁に(_得点,_得点文字列) :- number_chars(_得点,Chars), length(L,3), append(L0,Chars,L), all(L0,' '), atom_chars(_得点文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,( member(A,Lines1), split(A,Sep,Line)), Lines). get_lines(Instream,end_of_file,_,_,[]) :-!. get_lines(Instream,S,[],_終了検索対象ならび,[S]) :- member(A,_終了検索対象ならび), 検索(S,A),!. get_lines(Instream,S,[],[],[S|R]) :- get_line(Instream,S2), get_lines(Instream,S2,[],[],R),!. get_lines(Instream,S,[],_終了検索対象ならび,[S|R]) :- member(A,_終了検索対象ならび), \+(検索(S,A)), get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), member(B,_終了検索対象ならび), 検索(S,B),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S|R]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), !, get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,_,_開始検索対象ならび,_終了検索対象ならび,X) :- get_line(Instream,S2), get_lines(Instream,S2,_開始検索対象ならび,_終了検索対象ならび,X),!. get_lines(_ファイル,_スタート行,_最終行,X) :- integer(_スタート行), integer(_最終行), 行位置指定選択(_ファイル,_スタート行,_最終行,X). get_lines(_ファイル,_開始検索対象ならび,_終了検索対象ならび,X) :- \+(integer(_開始検索対象ならび)), \+(integer(_終了検索対象ならび)), open(_ファイル,read,Instream), get_line(Instream,S), get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,X), close(Instream),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat, get_line(user_input,Line), (Line = end_of_file , (!) , fail ; true)), Lines). get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_chars(Instream,end_of_file,[]) :- !. get_chars(Instream,_,[]) :- at_end_of_stream(Instream),!. get_chars(Instream,X,[X|R]) :- get_char(Instream,Y), get_chars(Instream,Y,R) . get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists_file(File_1), open(File_1,read,Instream), get_char(Instream,X), get_chars(Instream,X,L), close(Instream),!. get_chars(Instream,L) :- is_stream(_,Instream,_), get_char(Instream,X), get_chars(Instream,X,L),!. get_chars(L) :- findall(U,( repeat, get_char(U), (U = end_of_file , (!) , fail ; true)), L). get_line(X) :- get_line(user_input,X). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,_,[]) :- at_end_of_stream(Instream),!. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), atomic_list_concat(U,A), chars_lines(R,R2). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y) , \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), C number Nl,!. split_5(B,C) :- atomic_list_concat(B,C),!. all([],_). all([V|R],V) :- all(R,V). 検索(_文字列,_副文字列) :- atom_length(_文字列,_文字列の文字数), atom_length(_副文字列,_副文字列の文字数), Max is _文字列の文字数 - _副文字列の文字数, between(0,Max,N), sub_atom(_文字列,N,_副文字列の文字数,_副文字列),!. 行位置指定選択(_ファイル,_選択先頭行,_選択最終行,X) :- wc(_ファイル,[[_行,_,_,_]]), _行数_1 is _行 - _選択先頭行 + 1, _行数_2 is _選択最終行 - _選択先頭行, atomic_list_concat(['tail -',_行数_1,' ',_ファイル,' | head -',_行数_2],S), shs(S,X). wc(F,X) :- exists_file(F1), atomic_list_concat(['wc ',F1],S), sh(S,X),!. wc(F,X) :- atomic_list_concat([F,' | wc'],S), sh(S,X),!. sh(Command,X) :- shs(Command,Y), findall(U,(member(V,Y) , make_list(V,[' ',','],U)),X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,_,[]) :- at_end_of_stream(Instream),!. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元:リスト構造 # [2] 問題文(含コード&amp;リンク): # http://ime.nu/iup.2ch-library.com/i/i0825590-1357830189.gif # # 以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作 成せよ. # リストは1つとし,初期値は「15 4 32 1」である. # ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. # ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. # ・データのソート(降順)を行う関数を作成する. # ・リストの平均値を計算し出力する関数を作成する。 # # ------表示例------ # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : # ------------------ # # ------実行例------- # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 1 # 追加するデータを入力してください : 10 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 4 # リストの平均値 : 12.4 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 3 # リスト : 32 15 10 4 1 # :- dynamic(リスト/1). '以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作成せよ. リストは1つとし,初期値は「15 4 32 1」である. ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. ・データのソート(降順)を行う関数を作成する. ・リストの平均値を計算し出力する関数を作成する。 ------表示例------ 1. データの追加 2. データの削除 3. データのソート(降順) 4. リストの平均値 5. 終了 何を実行しますか : ' :- 'リストは1つとし,初期値は「15 4 32 1」である', メニューを表示, 各項目の機能を実現して結果を表示する. 'リストは1つとし,初期値は「15 4 32 1」である' :- assertz(リスト([15,4,32,1])). メニューを表示 :- write('1. データの追加\n2. データの削除\n3. データのソート(降順)\n4. リストの平均値\n5. 終了\n何を実行しますか : '). メニューを表示 :- メニューを表示. 各項目の機能を実現して結果を表示する :- 機能番号を選択する(_機能番号), 機能を実現して結果を表示する(_機能番号), _機能番号 = 5,!. 機能番号を選択する(_機能番号) :- get_line(Line), '診断:: メニューの選択'(Line,_機能番号),!. 機能番号を選択する(_機能番号) :- 機能番号を選択する(_機能番号). '診断:: メニューの選択'(Line,_機能番号) :- atom_number(Line,_機能番号), integer(_機能番号), between(1,5,_機能番号),!. '診断:: メニューの選択'(Line,_機能番号) :- writef('選択された %t からは適切な機能番号が得られません。再入力をお願いします。\n',[Line]), fail. 機能を実現して結果を表示する(5) :- !. 機能を実現して結果を表示する(1) :- データの追加. 機能を実現して結果を表示する(2) :- データの削除. 機能を実現して結果を表示する(3) :- 'データのソート(降順)'. 機能を実現して結果を表示する(4) :- リストの平均値. データの追加 :- write('追加するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), append(L1,[_データ],L2), assertz(リスト(L2)). データの削除 :- write('削除するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), ならびから削除(_データ,L1,L2), assertz(リスト(L2)). 'データのソート(降順)' :- リスト(L1), 降順整列(L1,L2), atomic_list_concat(L2,' ',S), writef('リスト : %t\n',[S]). リストの平均値 :- リスト(L1), findavg(_データ,( member(_データ,L1)), _平均値), atomic_list_concat(L1,_リスト表示), writef('平均値 : %t\nリスト : %t\n',[_平均値,_リスト表示]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,_,[e,n,d,'_',o,f,'_',f,i,l,e]) :- at_end_of_stream(Stream),!. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. 降順整列([],[]). 降順整列([_軸要素|R1],_降順に整列されたならび) :- 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび), 降順整列(_軸要素に等しいか大きいならび,_整列した軸要素に等しいか大きいならび), 降順整列(_軸要素より小さいならび,_整列した軸要素より小さいならび), append(_整列した軸要素に等しいか大きいならび,[_軸要素|_整列した軸要素より小さいならび],_降順に整列したならび). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R],[_要素|_軸要素に等しいか大きいならび],_軸要素より小さいならび) :- _要素 @>= _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). 降順分割(_軸要素,[_要素|R],_軸要素に等しいか大きいならび,[_要素|_軸要素より小さいならび]) :- _要素 @< _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). findavg(_集約項,_項,_相加平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _相加平均 is _合計値 / _ならびの長さ,!. sum([],0). sum([N|R],S) :- sum(R,S_1), S is N + S_1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/717 # # [1] 授業単元: C演習 # [2] 問題文(含コード&リンク): # (問題文)http://imgur.com/bAeG1 # (途中まで書いたコード)://codepad.org/nwwt2hgU # (使用するテキストファイル、結果含む) # http://s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/joyful.cgi? のNo.396 # :- dynamic(転置索引/2). テキストのダウンロード(_サイトファイル名,_出力ファイル名) :- atomic_list_concat(['w3m -dump ',_サイトのファイル名],S), popen(S,Chars), open(_出力ファイル名,write,Outstream), ファイルに書き込む(Outstream,Chars), close(Outstream). ファイルに書き込む(Outstream,[]). ファイルに書き込む(Outstream,[C|R]) :- put_char(Outstream,C), ファイルに書き込む(Outstream,R). 転置索引を作る(_ファイル名) :- open(_ファイル名,read,Instream), ストリームから転置索引を作る(Instream,0), close(Instream). ストリームから転置索引を作る(Instream,_) :- at_end_of_stream(Instream),!. ストリームから転置索引を作る(Instream,N) :- get_line(Instream,Line), N_2 is N + 1, 語彙を転置索引に登録する(Line,N), ストリームから転置索引を作る(Instream,N_2). 語彙を転置索引に登録する(Line,N) :- split(Line,[' ',',','.',':','(',')'],L), member(_語彙,L), \+(転置索引(_語彙,N)), assertz(転置索引(_語彙,N)), fail. 語彙を転置索引に登録する(_,_). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/937 # # [1] 授業単元:マルチメディア実習 # [2] 問題文(含コード&リンク): # # 1. # 0x01, 0x02, 0x03, ・・・, 0x09, 0x0a, 0x0b, 0x0c の12バイトの内容を持つバイナリファイルを”ex1.bin”というファイル名で作成するCプログラムを書け. # 2.ex1.bin の内容を1バイトずつ読み出して,画面にprintfするCプログラムを書け # 3.ex1.bin をファイル先頭から int が3つ順に記録されたバイナリファイルと見なして読み出し,その3つのintの値を画面にprintfするCプログラムを書け.なぜそのような整数値になったか説明せよ. # 'ex1.bin をファイル先頭から int が3つ順に記録されたバイナリファイルと見なして読み出し,その3つのintの値を画面に表示する' :- open('ex1.bin',read,Instream,[type(binary)]), 'ex1.bin をファイル先頭から int が3つ順に記録されたバイナリファイルと見なして読み出し,その3つのintの値を画面に表示する'(Instream), close(Instream),!. 'ex1.bin をファイル先頭から int が3つ順に記録されたバイナリファイルと見なして読み出し,その3つのintの値を画面に表示する'(Instream) :- at_end_of_stream(Instream),!. 'ex1.bin をファイル先頭から int が3つ順に記録されたバイナリファイルと見なして読み出し,その3つのintの値を画面に表示する'(Instream) :- 'int が3つ順に記録されたバイナリファイルと見なして読み出し'(Instream,N), 'その3つのintの値を画面に表示する'(N), 'ex1.bin をファイル先頭から int が3つ順に記録されたバイナリファイルと見なして読み出し,その3つのintの値を画面に表示する'(Instream),!. 'int が3つ順に記録されたバイナリファイルと見なして読み出し'(Instream,N) :- get_byte(Instream,A), get_byte(Instream,B), get_byte(Instream,C), N is A * 256 * 256 + B * 256 + C,!. 'その3つのintの値を画面に表示する'(N) :- writef('%t\n',[N]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/937 # # [1] 授業単元:マルチメディア実習 # [2] 問題文(含コード&リンク): # # 1. # 0x01, 0x02, 0x03, ・・・, 0x09, 0x0a, 0x0b, 0x0c の12バイトの内容を持つバイナリファイルを”ex1.bin”というファイル名で作成するCプログラムを書け. # 2.ex1.bin の内容を1バイトずつ読み出して,画面にprintfするCプログラムを書け # 3.ex1.bin をファイル先頭から int が3つ順に記録されたバイナリファイルと見なして読み出し,その3つのintの値を画面にprintfするCプログラムを書け.なぜそのような整数値になったか説明せよ. # 'ex1.bin の内容を1バイトずつ読み出して,画面に表示する' :- open('ex1.bin',read,Instream,[type(binary)]), 'ex1.bin の内容を1バイトずつ読み出して,画面に表示する'(Instream), close(Instream),!. 'ex1.bin の内容を1バイトずつ読み出して,画面に表示する'(Instream) :- at_end_of_stream(Instream), write('\n'),!. 'ex1.bin の内容を1バイトずつ読み出して,画面に表示する'(Instream) :- '1バイトずつ読み出して,画面に表示する'(Instream), 'ex1.binの内容を1バイトずつ読み出して,画面に表示する'(Instream). '1バイトずつ読み出して,画面に表示する'(Instream) :- get_byte(Instream,Code), byte_16進数文字列(Code,_16進表示文字列), writef('%x',[_16進表文字列]). byte_16進数文字列(N,_16進文字列) :- N_1 is N // 16, M is N mod 16, '0から15までの整数を1文字の16進数文字列に変換'(N_1,_16進文字列_1), '0から15までの整数を1文字の16進数文字列に変換'(M,_16進文字列_2), atom_concat(_16進文字列_1,_16進文字列_2,_16進文字列). '0から15までの整数を1文字の16進数文字列に変換'(N,_16進文字列) :- N =< 9, atom_number(_16進文字列,N),!. '0から15までの整数を1文字の16進数文字列に変換'(10,'a'). '0から15までの整数を1文字の16進数文字列に変換'(11,'b'). '0から15までの整数を1文字の16進数文字列に変換'(12,'c'). '0から15までの整数を1文字の16進数文字列に変換'(13,'d'). '0から15までの整数を1文字の16進数文字列に変換'(14,'e'). '0から15までの整数を1文字の16進数文字列に変換'(15,'f'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/473 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/rlR3n # # (問題文)ファイルgifts.datからデータを読み込み、 # 構造体のポインタ配列にデータを格納する。この際、利用する分だけ動的に # メモリを確保する。読み込んだ結果は、gifts.datとは別のファイルに出力せよ。 # (ファイル名は自由)また、入力ファイル名を標準入力から指定できるようにせよ。 # # gifts.dat # # JZK-30 jizake_tsumeawase 4500 # BSP-15 Body_soap_set 3000 # BT-200 Bath_towel_set 2500 # TEA-20 koutya_tsumeawase 5000 # # 実行例: # データ数を入力してください:4 # ファイル名を入力してください:gifts.dat # 表示形式変換後ファイルに出力しました 'ファイルgifts.datからデータを読み込む。読み込んだ結果は、表示形式変換後、gifts.datとは別のファイルに出力する' :- データ数を入力してください(_データ数), ファイル名を入力してください(_ファイル名), 'ファイルgifts.datからデータを読み込む。'(_データ数,LL), 表示形式変換後(LL,_項ならび), '読み込んだ結果は、gifts.datとは別のファイルに出力する'(_ファイル名,_項ならび). ファイル名を入力してください(_ファイル名) :- write('出力ファイル名を入力してください: '), get_line(_ファイル名). データ数を入力してください(_データ数) :- 数を得る(データ数,_データ数). 'ファイルgifts.datからデータを読み込む。'(_データ数,LL) :- open('gifts.dat',read,Instream), 'Instreamからデータを読み込む。'(Instream,_データ数,LL), close(Instream). 'Instreamからデータを読み込む。'(Instream,_データ数,[]) :- at_end_of_stream(Instream),!. 'Instreamからデータを読み込む。'(Instream,0,[]) :- !. 'Instreamからデータを読み込む。'(Instream,N,[L|R]) :- get_split_line(Instream,[' '],L), N_1 is N - 1, 'Instreamからデータを読み込む。'(Instream,N_1,R). 表示形式変換後([],[]). 表示形式変換後([L|R1],[P|R2]) :- P =.. [gifts|L], 表示形式変換後(R1,R2). 'gifts.datとは別のファイルに出力する'(_ファイル名,L) :- open(_ファイル名,write,Outstream), 'gifts.datとは別のOustreamに出力する'(Outstream,L), close(Oustream), write('表示形式変換後ファイルに出力しました\n'). 'gifts.datとは別のOustreamに出力する'(Outstream,L) :- append(_,[P|R],L), writef(Outstream,'%t.\n',[P]), R = []. % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/130 # # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し、 # 平均点より20点以上を S # +20点未満+10点以上をA # +10点未満平均点以上をB # 平均点未満-20点以上をC #      -20点未満を F # と評価し、学籍番号とその得点をS〜Fの評価によって分けて出力するプログラムを作成してください。 # # '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し、平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し、学籍番号とその得点をS〜Fの評価によって分けて出力する' :- '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'(_学籍番号_得点ならび), '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し、学籍番号とその得点をS〜Fの評価によって分けて出力する'(_学籍番号_得点ならび). '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'(_学籍番号_得点ならび) :- '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'([],_学籍番号_得点ならび). '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'(LL,LL) :- at_end_of_stream(user_input),!. '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'(LL_1,LL) :- 整数を得る('学籍番号(数字1〜10)',(_学籍番号>=1,_学籍番号=<10),_学籍番号), \+(member([_学籍番号,_],LL_1)), 整数を得る(得点を得る,(_得点>=0,_得点=<100),_得点), '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'([[_学籍番号,_得点]|LL_1],LL). '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'(LL_1,LL) :- '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'(LL_1,LL). '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し、学籍番号とその得点をS〜Fの評価によって分けて出力する'(_学籍番号_得点ならび) :- 平均点を得る(_学籍番号_得点ならび,_平均点), member(_評価,['S','A','B','C','F']), member([_学籍番号,_得点],_学籍番号_得点ならび), '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し'(_得点,_平均点,_評価), writef('評価: %t, 学籍番号: %t 得点: %t\n',[_評価,_学籍番号,_得点]), fail. '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し、学籍番号とその得点をS〜Fの評価によって分けて出力する'(_). '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し'(_得点,_平均点,'S') :- '平均点より20点以上をS'(_得点,_平均点,_). '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し'(_得点,_平均点,'A') :- '+20点未満+10点以上をA'(_得点,_平均点,_). '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し'(_得点,_平均点,'B') :- '+10点未満平均点以上をB'(_得点,_平均点,_). '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し'(_得点,_平均点,'C') :- '平均点未満-20点以上をC'(_得点,_平均点,_). '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し'(_得点,_平均点,'F') :- '-20点未満をF'(_得点,_平均点,_). 平均点を得る(_学籍番号_得点ならび,_平均点) :- findavg(_得点,( member([_,_得点],_学籍番号_得点ならび)), _平均点). '平均点より20点以上をS'(_得点,_平均点,'S') :- _得点 >= _平均点 + 20,!. '+20点未満+10点以上をA'(_得点,_平均点,'A') :- _得点 < _平均点 + 20, _得点 >= _平均点 + 10,!. '+10点未満平均点以上をB'(_得点,_平均点,'B') :- _得点 < _平均点 + 10, _得点 >= _平均点,!. '平均点未満-20点以上をC'(_得点,_平均点,'C') :- _得点 < _平均点, _得点 >= _平均点 - 20,!. '-20点未満をF'(_得点,_平均点,'F') :- _得点 < _平均点 - 20,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/107 # # [1] 授業単元:C言語プログラム # [2] 問題文: # 以下のファイルsdata.txtに入っている商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、 # それらの結果を画面表示するとともに、ファイルodata2.txtに書き込むプログラムを作成せよ。 # 但し、以下の内容のデータファイルsdata.txtをemacsであらかじめ作成しておくこと。 # [sdata.txtの内容](商品名、単価、売り上げ個数) # coffee 250 75 # tea 270 52 # milk 300 22 # juice 350 54 # coke 300 36 # 'ファイルsdata.txtに入っている商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、ファイルodata2.txtに書き込む' :- open('sdata.txt',read,Instream), open('odata2.txt',write,Outstream), 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream), close(Outstream), close(Instream). 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream) :- at_end_of_stream(Instream). 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream) :- '商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め'(Instream,_商品名,_単価,_売り上げ個数,_商品別の売上高), 'それらの結果を画面表示するとともに、Outstreamに書き込む'(Outstream,_商品名,_単価,_売り上げ個数,_商品別の売上高), 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream). '商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め'(Instream,_商品名,_単価,_売り上げ個数,_商品別の売上高) :- get_line(Instream,Line), split(Line,[' '],[_商品名,_単価,_売り上げ個数]), _商品別の売上高 is _単価 * _売上個数. 'それらの結果を画面表示するとともに、Outstreamに書き込む'(Outstream,_商品名,_単価,_売り上げ個数,_商品別の売上高) :- writef('%t %t %t %t\n',[_商品名,_単価,_売り上げ個数,_商品別の売上高]), writef(Outstream,'%t %t %t %t\n',[_商品名,_単価,_売り上げ個数,_商品別の売上高]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/930 # # ・DBMS名とバージョン # SQLite3 # ・テーブルデータ # tbl1 tid(auto), name(text) # tbl2 tid(int), sid(int) # tbl3 sid(auto), tag(text),type(int) # # ざっとこんな感じでnameに対して複数のタグを持っている # といった感じのテーブルに対して、データを入れたいと思っています。 # で、バックアップがCSVで「name,tag...」という形式で大量にあるのですが、 # タグテーブルに無ければ追加、名前テーブルに追記、連結データを追加、 # と手数が思ってた以上に多いので、 # 挿入の手数をもう少し減らせる手段とかありませんか? # 'バックアップがCSV(「name,tag...」)の情報を追加する'(_バックアップCSVファイル) :- open(_バックアップCSVファイル,read,Instream), 'Instreamの情報を追加する'(Instream), close(Instream). 'Instreamの情報を追加する'(Instream) :- at_end_of_stream(Instream). 'Instreamの情報を追加する'(Instream) :- get_line(Instream,Line), split(Line,[','],[_name|_tagならび]), テーブルに追加する(_name,_tagならび), 'Instreamの情報を追加する'(Instream). テーブルに追加する(_name,_tagならび) :- tbl1(_tid,_name), 'tag情報をtbl3とtbl2に追加する'(_tid,_tagならび),!. テーブルに追加する(_name,_tagならび) :- \+(tbl1(_tid,_name)), 新しいtidを取得する(_tid), assertz(tbl1(_tid,_name)), 'tag情報をtbl3とtbl2に追加する'(_tid,_tagならび). 'tag情報をtbl3とtbl2に追加する'(_tid,_tagならび) :- append(_,[_tag|R],_tagならび), 新しいsidを取得する(_sid), assertz(tbl3(_sid,_tag)), assertz(tbl2(_tid,_sid)), R = [],!. 新しいtidを取得する(_tid) :- repeat, _tid is random(99999999) + 1, \+(tbl1(_tid,_)),!. 新しいsidを取得する(_sid) :- repeat, _sid is random(99999999) + 1, \+(tbl3(_sid,_)),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/812 # # [1] 授業単元:c 反復処理 # [2] 問題文(含コード&リンク): # 整数 a をキーボードから入力し,a が素数かどうか判断するプログラムを作成しなさい.(2〜a/2で整数aを割ったときに全ての値で割り切れなければ,aは素数である.) # サイズm(m<=10)の整数型配列変数aをキーボードから受け取り,a[0],a[1],...,a[n-1]のうちの最大値をディスプレイに表示するプログラムを完成しなさい. # '要素数10以下のリスト要素をキーボードから受け取り,最大値をディスプレイに表示する' :- 要素数10以下のリスト要素をキーボードから受け取り(1,L), 最大値をディスプレイに表示する(L). 要素数10以下のリスト要素をキーボードから受け取り(N,[]) :- N > 10,!. 要素数10以下のリスト要素をキーボードから受け取り(_,[]) :- at_end_of_stream(user_input),!. 要素数10以下のリスト要素をキーボードから受け取り(N,[_数|R]) :- 数を得る(数,_数), N_2 is N + 1, 要素数10以下のリスト要素をキーボードから受け取り(N_2,R). 最大値をディスプレイに表示する(L) :- 最大値を(L,_最大値), writef('最大値は %t です\n',[_最大値]). 最大値を([A|R],_最大値) :- 最大値を([A|R],A,_最大値). 最大値を([],_最大値,_最大値). 最大値を([A|R],_現在の最大値,_最大値) :- A @> _現在の最大値, 最大値を(R,A,_最大値). 最大値を([A|R],_現在の最大値,_最大値) :- A @=< _現在の最大値, 最大値を(R,_現在の最大値,_最大値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/573 # # [1] 授業単元: STL # [2] 問題文(含コード&リンク): # 問 二つの値xとyを使用して差を返す関数形式マクロdiff(x,y)を使用し, # キーボードからint型の2つの数値n1とn2を入力した場合に、入力した2つの数値とその差を出力するmain関数のプログラムを作成しなさい。 # 問 四季を表す列挙体seasonを定義し、キーボードから0,1,2,3を入力した場合に、 # それぞれ"Spring", "Summer", "Fall", "Winter"と表示するプログラムを作成しなさい。ただし、enum season {Spring, Summer, Fall, Winter};を使用し、キーボードから0,1,2,3以外の数字が入力された場合には、入力し直す処理を含めなさい。 # 問 数字文字の出現回数の百分率を小数点以下1桁まで求め、 # '*'のグラフと共に表示するmain関数のプログラムを作成しなさい。 # 問 キーボードから入力した行数と空白以外の文字数を求め, # 行数と文字数を表示するmain関数のプログラムを作成しなさい。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。 # 'キーボードから入力した行数と空白以外の文字数を求め,行数と文字数を表示する。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。' :- 'キーボードから入力した'(Lines), '行数と空白以外の文字数を求め'(Lines,_行数,_空白以外の文字数), '行数と文字数を表示する'(_行数,_空白以外の文字数). キーボードから入力した([]) :- at_end_of_stream(user_input). キーボードから入力した([Line|R]) :- get_line(Line), キーボードから入力した(R). 行数と空白以外の文字数を求め(Lines,_行数,_空白以外の文字数) :- length(Lines,_行数), findsum(_一行の中にある空白以外の文字数,( member(_行,Lines), 一行の中にある空白以外の文字数(_行,_一行の中にある空白以外の文字数)), _空白以外の文字数). 一行の中にある空白以外の文字数(Line,_一行の中にある空白以外の文字数) :- count(( sub_atom(Line,_,1,_,_文字), \+(_文字 = ' ')), _一行の中にある空白以外の文字数). '行数と文字数を表示する'(_行数,_空白以外の文字数) :- writef('%t %t\n',[_行数,_空白以外の文字数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/61 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク):違うPCからテキストファイルをダウンロードするプログラムを作れ。 #               サーバでファイルを一行ずつ読み込み送信する。クライアントでは受信をしてファイルに書き込む。 # server :- open_server(Socket,NewSocket), open_server_stream(NewSocket,Instream,Outstream), server_to_client(Insteam,Outstream,Instream_2), close_server_stream(Instream,Outstream), close_server_socket(Socket,NewSocket). open_server(Port,Socket,NewSocket) :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket). open_server_stream(Newsocket,Instream,Outstream) :- open(NewSocket,read,Instream), open(NewSocket,write,Outstream). server_to_client(Insteam,Outstream,Instream_2) :- get_file_name(Instream,File), open(File,read,Instream_2), server_to_client(Instream_2,Outstream), close(Instream_2). get_file_name(Instream,File,Outstream) :- get_line(Instream,Line), sub_atom(Line,0,4,_,'GET '), split(Line,['"'],[_,File|_]), write(Outstream,'OK filename\n\n'). server_to_client(Instream_2,Outstream) :- at_end_of_stream(Instream_2),!. server_to_client(Instream_2,Outstream) :- get_char(Instream_2,Char), put_char(Outstream,Char), server_to_client(Instream_2,Outstream). close_server_stream(Instream,Outstream) :- close(Instream), close(Outstream). close_server_socket(Socket,NewSocket) :- socket_shutdown(Socket), socket_shutdown(NewSocket). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% client(Host,Port,File) :- open_client(Host,Port,Socket), client_server_to_client(Socket,File), close_client(Socket,Instream,Outstream). open_client(Host,Port,Socket,Instream,Outstream) :- socket(internet,stream,Socket), socket_connect(Socket, Host : Port), open(Socket,read,Instream), open(Socket,write,Outstream). client_server_to_clieint(Socket,File,Instream,Outstream) :- writef(Outstream,'%t\n',[File]), clieint_server_to_client(Instream,Outstream,Outstream_2). client_server_to_client(Instream,Outstream,File,Outstream_2) :- open(File,write,Outstream_2), client_セッション_1(Instream,Outstream), client_セッション_2(Instream,Outstream,Outstream_2), close(Outstream_2). client_セッション_2(Instream,Outstream_2) :- at_end_of_stream(Instream),!. client_セッション_2(Instream,Outstream_2) :- get_line(Instream,Line), writef(Outstream_2'%t\n',[Line]), client_セッション_2(Instream,Outstream_2). clieint_セッション_1(Instream,Outstream) :- writef('GET %t\n\n',[File]), get_line(Instream,Line_1), get_line(Instream,''), sub_atom(Line_1,0,4,_,'GET '). close_client(Socket,Instream,Outstream) :- close(Instream), close(Outstream), socket_shutdown(Socket). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/61 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク):違うPCからテキストファイルをダウンロードするプログラムを作れ。 #               サーバでファイルを一行ずつ読み込み送信する。クライアントでは受信をしてファイルに書き込む。 # server :- open_server(Socket,NewSocket), open_server_stream(NewSocket,Instream,Outstream), server_to_client(Insteam,Outstream,Instream_2), close_server_stream(Instream,Outstream), close_server_socket(Socket,NewSocket). open_server(Port,Socket,NewSocket) :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket). open_server_stream(Newsocket,Instream,Outstream) :- open(NewSocket,read,Instream), open(NewSocket,write,Outstream). server_to_client(Insteam,Outstream,Instream_2) :- get_file_name(Instream,File), open(File,read,Instream_2), server_to_client(Instream_2,Outstream), close(Instream_2). get_file_name(Instream,File,Outstream) :- get_line(Instream,Line), sub_atom(Line,0,4,_,'GET '), split(Line,['"'],[_,File|_]), write(Outstream,'OK filename\n\n'). server_to_client(Instream_2,Outstream) :- at_end_of_stream(Instream_2),!. server_to_client(Instream_2,Outstream) :- get_char(Instream_2,Char), put_char(Outstream,Char), server_to_client(Instream_2,Outstream). close_server_stream(Instream,Outstream) :- close(Instream), close(Outstream). close_server_socket(Socket,NewSocket) :- socket_shutdown(Socket), socket_shutdown(NewSocket). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% client(Host,Port,File) :- open_client(Host,Port,Socket), client_server_to_client(Socket,File), close_client(Socket,Instream,Outstream). open_client(Host,Port,Socket,Instream,Outstream) :- socket(internet,stream,Socket), socket_connect(Socket, Host : Port), open(Socket,read,Instream), open(Socket,write,Outstream). client_server_to_clieint(Socket,File,Instream,Outstream) :- writef(Outstream,'%t\n',[File]), clieint_server_to_client(Instream,Outstream,Outstream_2). client_server_to_client(Instream,Outstream,File,Outstream_2) :- open(File,write,Outstream_2), client_セッション_1(Instream,Outstream), client_セッション_2(Instream,Outstream,Outstream_2), close(Outstream_2). client_セッション_2(Instream,Outstream_2) :- at_end_of_stream(Instream),!. client_セッション_2(Instream,Outstream_2) :- get_line(Instream,Line), writef(Outstream_2'%t\n',[Line]), client_セッション_2(Instream,Outstream_2). clieint_セッション_1(Instream,Outstream) :- writef('GET %t\n\n',[File]), get_line(Instream,Line_1), get_line(Instream,''), sub_atom(Line_1,0,4,_,'GET '). close_client(Socket,Instream,Outstream) :- close(Instream), close(Outstream), socket_shutdown(Socket). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/996 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/30Mz7Pbj # このプログラムで何番目の値段をかえるではなく # 名前を聞かれてその名前の値段をかえるプログラムにする。 # # #include # #include # main() # { # struct goods{ # char name[20]; # char price[5]; # }record; # FILE *fp; # int max,size,num; # long top,end,locat,ftell(); # fp=fopen("file1","r+"); # if(fp==NULL){ # printf("open error"); # exit(1); # } # size=sizeof(record); # fseek(fp,0L,2); # end=ftell(fp); # fseek(fp,0L,0); # top=ftell(fp); # max=(end-top)/size; # do{ # printf("rec no?\n"); # scanf("%d",&num); # }while(num<1||num>max); # locat=size*(num-1); # fseek(fp,locat,0); # fread(&record,size,1,fp); # printf("name=%s price=%s\n" # ,record.name,record.price); # printf("Current price\t:%s\n",record.price); # printf("New price?\t:"); # scanf("%s",record.price); # fseek(fp,-size,1); # fwrite(&record,size,1,fp); # fclose(fp); # printf("update....ended\n"); # } 'ファイル内の名前を鍵に指定して値段をかえる'(_ファイル名,_更新対象氏名,_値段) :- 更新対象氏名の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた更新対象氏名), 値段の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた値段), open(_ファイル名,update,InOuttream), '名前を指定して値段をかえる'(InOutstream,_末尾に空白を埋めた対象氏名,_末尾に空白を埋めた値段), close(InOututstream). 更新対象氏名の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた更新対象氏名) :- length(L,20), atom_chars(_更新対象氏名,Chars), append(Chars,L2,L), all(L2,' '), atom_chars(_末尾に空白を埋めた更新対象氏名,L). 値段の末尾に空白を埋める(_値段,_末尾に空白を埋めた値段) :- length(L,5), number_chars(_値段,Chars), append(Chars,L2,L), all(L2,' '), atom_chars(_末尾に空白を埋めた値段,L). '名前を指定して値段をかえる'(InOutstream,_,_) :- at_end_of_stream(InOutstream),!. '名前を指定して値段をかえる'(InOutstream,_更新対象氏名,_値段) :- 氏名を読み更新する(InOutstream,_更新対象氏名,_値段), 価格を更新する(InOutstream), '名前を指定して値段をかえる'(InOutstream,_更新対象氏名,_値段). 氏名を読み更新する(InOutstream,_更新対象氏名,_値段) :- findall(_文字,( between(1,20,N), get_char(InOutstream,_文字)), L), 更新対象氏名の時は価格も更新する(InOutstream,_更新対象氏名,_値段). 更新対象氏名の時は価格も更新する(InOutstream,L,_更新対象氏名,_値段) :- atom_chars(_更新対象氏名,L), writef(InOutstream,'%t',[_更新対象氏名]), 価格を更新する(InOutstream,_値段). 更新対象氏名の時は価格も更新する(InOutstream,L,_更新対象氏名,_値段) :- \+(atom_chars(_更新対象氏名,L)), 価格をそのまま書く(InOutstream). 価格を更新する(InOutstream,_値段) :- writef(InOutstream,'%t',[_値段]). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは リストになっている行データを逆順に表示する([]). リストになっている行データを逆順に表示する([_行|R]) :- リストになっている行データを逆順に表示する(R), writef('%t\n',[_行]). ファイルから行を逆順に収集する(_ファイル名,_逆順に収集された行リスト) :- open(_ファイル名,read,Instream), ファイルから行を逆順に収集する(Instream,[],_逆順に収集された行リスト), close(Instream). ファイルから行を逆順に収集する(Instream,_逆順に収集された行リスト,_逆順に収集された行リスト) :- at_end_of_stream(Instream),!. ファイルから行を逆順に収集する(Instream,_逆順に収集された行リスト_1,_逆順に収集された行リスト) :- get_line(Instream,Line), ファイルから行を逆順に収集する(Instream,[Line|_逆順に収集された行リスト_1],_逆順に収集された行リスト). ファイルから読み取った行を逆順に別ファイルに書き込む(_ファイル名,_別ファイル名) :- open(_ファイル名,read,Instream), open(_別ファイル名,write,Outstream), ファイルから行を逆順に収集する(Instream,Outstream,[],_逆順に収集された行リスト), close(Outstream), close(Instream). ファイルから読み取った行を逆順に別ファイルに書き込む(Instream,Outstream) :- at_end_of_stream(Instream),!. ファイルから読み取った行を逆順に別ファイルに書き込む(Instream,Outstream,_逆順に収集された行リスト_1,_逆順に収集された行リスト) :- get_line(Instream,Line), ファイルから読み取った行を逆順に別ファイルに書き込む(Instream,Outstream), writef(Outstream,'%t\n',[Line]). %%%%% 入力がリスト 出力がリストなのが reverse/2 reverse/3 これは組込述語であることが多い。 reverse(L1,L2) :- reverse(L1,[],L2). reverse([],L,L). reverse([A|R],L1,L) :- reverse(R,[A|L1],L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/943 # # [1] 授業単元: プログラミング入門 # [2] 問題文(含コード&リンク): # # 1 for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。 # 書き出した後で、ファイルからデータを読み込み画面に出力する。 # # # 2 a = 3.1, b = 2.9, c = −1.1, d = 5.3の最大値、最小値を求め画面に出力する # 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。書き出した後で、ファイルからデータを読み込み画面に出力する。' :- 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。', '書き出した後で、ファイルからデータを読み込み画面に出力する。'('data1.txt'). 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。' :- 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき'(_値ならび), 'その値をファイルdata1.txtに書き出す。'(_値ならび). 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき'(_値ならび) :- findall(_値,( for(0.1,V,10.0,0.1), _値 is V ^ 2), _値ならび). for(_値,_値,_限界値,_) :- _値 =< _限界値. for(S,_値,_限界値,_増分) :- S =< _限界値, S_2 is S + _増分, for(S_2,_値,_限界値,_増分). 'その値をファイルdata1.txtに書き出す。'(_値ならび) :- open('data1.txt',write,Outstream), 書き出す(Outstream,_値ならび), close(Outstream). 書き出す(Outstream,[]). 書き出す(Outstream,[_値|R]) :- writef(Outstream,'%t\n',[_値]), 書き出す(Outstream,R). '書き出した後で、ファイルからデータを読み込み画面に出力する。'(_ファイル) :- open(_ファイル,read,Instream), データを読み込み画面に出力する(Instream), close(Instream). データを読み込み画面に出力する(Instream) :- at_end_of_stream(Instream),!. データを読み込み画面に出力する(Instream) :- get_line(Instream,_値), 画面に出力する(_値), データを読み込み画面に出力する(Instream). 画面に出力する(_値) :- writef('%t\n',[_値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/943 # # [1] 授業単元: プログラミング入門 # [2] 問題文(含コード&リンク): # # 1 for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。 # 書き出した後で、ファイルからデータを読み込み画面に出力する。 # # # 2 a = 3.1, b = 2.9, c = −1.1, d = 5.3の最大値、最小値を求め画面に出力する # 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。書き出した後で、ファイルからデータを読み込み画面に出力する。' :- 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。', '書き出した後で、ファイルからデータを読み込み画面に出力する。'('data1.txt'). 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。' :- 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき'(_値ならび), 'その値をファイルdata1.txtに書き出す。'(_値ならび). 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき'(_値ならび) :- findall(_値,( for(0.1,V,10.0,0.1), _値 is V ^ 2), _値ならび). for(_値,_値,_限界値,_) :- _値 =< _限界値. for(S,_値,_限界値,_増分) :- S =< _限界値, S_2 is S + _増分, for(S_2,_値,_限界値,_増分). 'その値をファイルdata1.txtに書き出す。'(_値ならび) :- open('data1.txt',write,Outstream), append(_,[_値|R],_値ならび), writef(Outstream,'%t\n',[_値]), R = [], close(Outstream). '書き出した後で、ファイルからデータを読み込み画面に出力する。'(_ファイル) :- open(_ファイル,read,Instream), データを読み込み画面に出力する(Instream), close(Instream). データを読み込み画面に出力する(Instream) :- at_end_of_stream(Instream),!. データを読み込み画面に出力する(Instream) :- get_line(Instream,_値), 画面に出力する(_値), データを読み込み画面に出力する(Instream). 画面に出力する(_値) :- writef('%t\n',[_値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/943 # # [1] 授業単元: プログラミング入門 # [2] 問題文(含コード&リンク): # # 1 for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。 # 書き出した後で、ファイルからデータを読み込み画面に出力する。 # # # 2 a = 3.1, b = 2.9, c = −1.1, d = 5.3の最大値、最小値を求め画面に出力する # 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。書き出した後で、ファイルからデータを読み込み画面に出力する。' :- 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。', '書き出した後で、ファイルからデータを読み込み画面に出力する。'('data1.txt'). 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。' :- 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき'(_値ならび), 'その値をファイルdata1.txtに書き出す。'(_値ならび). 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき'(_値ならび) :- findall(_値,( for(1,N,100), _値 is (0.1 * N) ^ 2), _値ならび). 'その値をファイルdata1.txtに書き出す。'(_値ならび) :- open('data1.txt',write,Outstream), 書き出す(Outstream,_値ならび), close(Outstream). 書き出す(Outstream,[]). 書き出す(Outstream,[_値|R]) :- writef(Outstream,'%t\n',[_値]), 書き出す(Outstream,R). '書き出した後で、ファイルからデータを読み込み画面に出力する。'(_ファイル) :- open(_ファイル,read,Instream), データを読み込み画面に出力する(Instream), close(Instream). データを読み込み画面に出力する(Instream) :- at_end_of_stream(Instream),!. データを読み込み画面に出力する(Instream) :- get_line(Instream,_値), 画面に出力する(_値), データを読み込み画面に出力する(Instream). 画面に出力する(_値) :- writef('%t\n',[_値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/633 # # [1] 授業単元:プログラミング(C) # [2] 問題文(含コード&リンク): # 配列strに“HelloWorld!”を一文字ずつ配列要素に格納した後、 # 最後の文字を任意数繰り返して表示するようにせよ。 # ※“HelloWorld!”の間には半角スペースは入力しないこと。 # 参考:http://www.dotup.org/uploda/www.dotup.org3018993.png.html # '配列strに“HelloWorld!”を一文字ずつ配列要素に格納した後、最後の文字を任意数繰り返して表示する' :- '"HelloWorld!"を一文字ずつならびに格納した後'(L), 最後の文字を任意数繰り返して表示する(L), '"HelloWorld!"を一文字ずつならびに格納した後'(L) :- write('正確に、"HelloWorld!"と入力しなさい : '), findall(_文字,( repeat, get_char(_文字), ( 改行またはEOF入力で終了する,!,fail; true)), L). 改行またはEOF入力で終了する(_) :- at_end_of_stream(user_input),!. 改行またはEOF入力で終了する('\n'). 最後の文字を任意数繰り返して表示する(L) :- 最後の文字(L,_最後の文字), 任意数(_任意数), 繰り返して表示する(_任意数,_最後の文字). 任意数(_任意数) :- write('何回繰り返しますか : '), get_integer(_任意数). 最後の文字(L,_最後の文字) :- append(_,[_最後の文字],L). 繰り返して表示する(_任意数,_最後の文字) :- between(1,_任意数,N), writef('%t',[_最後の文字]), N = _任意数. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/633 # # [1] 授業単元:プログラミング(C) # [2] 問題文(含コード&リンク): # 配列strに“HelloWorld!”を一文字ずつ配列要素に格納した後、 # 最後の文字を任意数繰り返して表示するようにせよ。 # ※“HelloWorld!”の間には半角スペースは入力しないこと。 # 参考:http://www.dotup.org/uploda/www.dotup.org3018993.png.html # '配列strに“HelloWorld!”を一文字ずつ配列要素に格納した後、最後の文字を任意数繰り返して表示する' :- '"HelloWorld!"を一文字ずつならびに格納した後'(L), 最後の文字を任意数繰り返して表示する(L), '"HelloWorld!"を一文字ずつならびに格納した後'(L) :- write('正確に、"HelloWorld!"と入力しなさい : '), get_char(_文字), '"HelloWorld!"を一文字ずつならびに格納した後'(_文字,L). '"HelloWorld"を一文字ずつならびに格納した後'(_,[]) :- at_end_of_stream(user_input),!. '"HelloWorld"を一文字ずつならびに格納した後'('\n',[]) :- !. '"HelloWorld"を一文字ずつならびに格納した後'(_文字,[_文字|R]) :- get_char(_文字_2), '"HelloWorld"を一文字ずつならびに格納した後'(_文字_2,R). 最後の文字を任意数繰り返して表示する(L) :- 最後の文字(L,_最後の文字), 任意数(_任意数), 繰り返して表示する(_任意数,_最後の文字). 任意数(_任意数) :- write('何回繰り返しますか : '), get_integer(_任意数). 最後の文字(L,_最後の文字) :- append(_,[_最後の文字],L). 繰り返して表示する(_任意数,_最後の文字) :- between(1,_任意数,N), writef('%t',[_最後の文字]), N = _任意数. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/633 # # [1] 授業単元:プログラミング(C) # [2] 問題文(含コード&リンク): # 配列strに“HelloWorld!”を一文字ずつ配列要素に格納した後、 # 最後の文字を任意数繰り返して表示するようにせよ。 # ※“HelloWorld!”の間には半角スペースは入力しないこと。 # 参考:http://www.dotup.org/uploda/www.dotup.org3018993.png.html # '配列strに“HelloWorld!”を一文字ずつ配列要素に格納した後、最後の文字を任意数繰り返して表示する' :- '"HelloWorld!"を一文字ずつならびに格納した後'(L), 最後の文字を任意数繰り返して表示する(L), '"HelloWorld!"を一文字ずつならびに格納した後'(L) :- write('正確に、"HelloWorld!"と入力しなさい : '), get_char(_文字), '"HelloWorld!"を一文字ずつならびに格納した後'(_文字,L). '"HelloWorld"を一文字ずつならびに格納した後'(_,[]) :- at_end_of_stream(user_input),!. '"HelloWorld"を一文字ずつならびに格納した後'('\n',[]) :- !. '"HelloWorld"を一文字ずつならびに格納した後'(_文字,[_文字|R]) :- get_char(_文字_2), '"HelloWorld"を一文字ずつならびに格納した後'(_文字_2,R). 最後の文字を任意数繰り返して表示する(L) :- 最後の文字(L,_最後の文字), 任意数(_任意数), 繰り返して表示する(_任意数,_最後の文字). 任意数(_任意数) :- write('何回繰り返しますか : '), get_integer(_任意数). 最後の文字(L,_最後の文字) :- append(_,[_最後の文字],L). 繰り返して表示する(_任意数,_最後の文字) :- between(1,_任意数,N), writef('%t',[_最後の文字]), N = _任意数. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/517 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/www1.axfc.net/uploader/Sc/so/347163 # # 学生番号 1 2 3 4 5 6 # グループA 35 63 25 62 73 53 # グループB 45 53 81 53 34 45 # グループC 56 76 34 45 67 65 # # 上記のグループ別学生毎の得点データを適当な整数型配列data[4][7]に読み込み、グループ別及び全体の平均点を計算せよ。 # '上記のグループ別学生毎の得点データを読み込み、グループ別及び全体の平均点を計算する' :- '上記のグループ別学生毎の得点データを読み込み'(LL), グループ別及び全体の平均点を計算する(LL,_グループ別平均点ならび,_全体の平均点), グループ別平均点を表示する(_グループ別平均点ならび), 全体の平均点を表示する(_全体の平均点). '上記のグループ別学生毎の得点データを読み込み'([]) :- at_end_of_stream(user_input),!. '上記のグループ別学生毎の得点データを読み込み'([L|R]) :- get_line(Line), split(Line,[' ','\t'],L), '上記のグループ別学生毎の得点データを読み込み'(R). グループ別及び全体の平均点を計算する(LL,_グループ別平均点ならび,_全体の平均点) :- グループ別平均点を計算する(LL,_グループ別平均点ならび), 全体の平均点を計算する(LL,_全体の平均点). グループ別平均点を計算する([_見出し部分|_グループ名付き得点表],_グループ別平均点ならび) :- findall([_グループ,_平均点],( member([_グループ|_得点ならび],_グループ名付き得点表), 相加平均(_得点ならび,_平均点)), _グループ別平均点ならび). 全体の平均点を計算する([_見出し部分|_グループ名付き得点表],_全体の平均点) :- findsum(_得点,( member([_グループ名|_得点ならび],_グループ名付き得点表]), member(_得点,_得点ならび)), _全体の平均点). グループ別平均点を表示する(_グループ別平均点ならび) :- append(_,[[_グループ,_平均点]|R],_グループ別平均点ならび), writef('%t の平均点: %t点\n',[_グループ,_平均点]), R = []. 全体の平均点を表示する(_全体の平均点) :- writef(' 全体の平均点: %t点\n',[_全体の平均点]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/959 # # [1] 授業単元:プログラミングC # [2] 問題文 配列vxの各要素に整数をscanf関数で入力し、5の倍数のみを新たな配列に格納し、これを出力するプログラムを作成せよ。 # 'リストの各要素に整数をで入力し、5の倍数のみを新たなリストに格納し、これを出力する' :- リストの各要素に整数をで入力し(_リスト), 5の倍数のみを新たなリストに格納し(_リスト,_新たなリスト), これを出力する(_新たなリスト). リストの各要素に整数をで入力し(_リスト) :- get_integer(_整数), リストの各要素に整数をで入力し(_整数,_リスト). リストの各要素に整数をで入力し(_,[]) :- at_end_of_stream(user_input),!. リストの各要素に整数をで入力し(_整数,[_整数|R]) :- get_integer(_整数_2), リストの各要素に整数をで入力し(_整数,R). 5の倍数のみを新たなリストに格納し(_リスト,_新たなリスト) :- findall(_5の倍数,( member(_5の倍数,_リスト), 0 is _5の倍数 mod 5), _新たなリスト). これを出力する([]). これを出力する([_要素|R]) :- writef('%t\n',[_要素]), これを出力する(R). get_integer(_整数) :- get_line(Line), 整数入力検査(Line,_整数),!. 整数入力検査(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/929 # # よろしくお願いします # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # ひとつの英文をキーボードから入力し、その単語数と文字数を出力 # するプログラムを作成せよ。 # 'ひとつの英文をキーボードから入力し、その単語数と文字数を出力する' :- get_char(_文字), 'ひとつの英文をキーボードから入力し、その単語数と文字数を'(_文字,[],0,0,_単語数,_文字数), 出力する(_単語数,_文字数). 'ひとつの英文をキーボードから入力し、その単語数と文字数を'(_,_,_単語数,_文字数,_単語数,_文字数) :- at_end_of_stream(user_input),!. 'ひとつの英文をキーボードから入力し、その単語数と文字数を'(_文字,L0,_単語数_1,_文字数_1,_単語数,_文字数) :- 単語数文字数の更新(_文字,L0,_単語数_1,_文字数_1,_単語数_2,_文字数_2), get_char(_次の文字), 'ひとつの英文をキーボードから入力し、その単語数と文字数を'(_次の文字,[_文字|L0],_単語数_2,_文字数_2,_単語数,_文字数). 単語数文字数の更新(_文字,[],_,_,1,1) :- \+(member(_文字,[' ','\n',':',';'])), _文字数_2 is _文字数_1 + 1,!. 単語数文字数の更新(_文字,[_文字_0|_],_単語数_1,_文字数_1,_単語数_2,_文字数_2) :- member(_文字_0,[' ','\n',':',';']), \+(member(_文字,[' ','\n',':',';'])), _単語数_2 is _単語数_1 + 1, _文字数_2 is _文字数_1 + 1,!. 単語数文字数の更新(_文字,[_文字_0|_],_単語数,_文字数_1,_単語数,_文字数_2) :- _文字数_2 is _文字数_1 + 1,!. 出力する(_単語数,_文字数) :- writef('%t %t\n',[_単語数,_文字数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/929 # # よろしくお願いします # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # ひとつの英文をキーボードから入力し、その単語数と文字数を出力 # するプログラムを作成せよ。 # 'ひとつの英文をキーボードから入力し、その単語数と文字数を出力する' :- 'ひとつの英文をキーボードから入力し'(_英文), 'その単語数と文字数を出力する'(_英文). 'ひとつの英文をキーボードから入力し'(_英文) :- write('英文を入力して下さい : '), 'キーボードからEOFになるまで文字ならびを得る'(_文字ならび), concat_atom(_文字ならび,_英文). 'キーボードからEOFになるまで文字ならびを得る'([]) :- at_end_of_stream(user_input),!. 'キーボードからEOFになるまで文字ならびを得る'([_文字|R]) :- get_char(_文字), 'キーボードからEOFになるまで文字ならびを得る'(R). 'その単語数と文字数を出力する'(_英文) :- sPLIT(_英文,[' ',',',':',';','.'],L), 単語数(L,_単語数), 文字数(Line,_文字数), writef('単語数は%t, 文字数は%tです。\n',[_単語数,_文字数]). 単語数([],0). 単語数([A|R],_単語数) :- \+(member(A,[' ',',',':',';','.'])), 単語数(R,_単語数_1), _単語数 is _単語数_1 + 1,!. 単語数([A|R],_単語数) :- member(A,[' ',',',':',';','.']), 単語数(R,_単語数). 文字数(Line,_文字数) :- atom_length(Line,_文字数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/222 # # 154代目の472の者です # 【質問テンプレ】 # [1] 授業単元:プログラム # [2] 問題文(含コード&リンク): # テキストファイルの内容をbuffの二次元配列に格納した後 # 1次元配列のAにbuffの内容を1行ずつ格納していきながら、2次元配列Xと # 1次元配列Yに書き込んでいくプログラムを作れ。 # 要するに # textfileには # XX abcd; # YY efd; # ZZ bcd; # というようになっています。 # 二次元配列Xに # 0 XX # 1 YY # 2 ZZ # というように3文字目のブランクの前の文字列を1行ずつ格納し # Yには # 0 a # 1 b # 2 c # というように3文字目のブランクの次の文字を格納したいのです。ただし、;はいれてはいけません。 # お願いします。 # 'テキストファイルの内容をbuffの二次元配列に格納した後、1次元配列のAにbuffの内容を1行ずつ格納していきながら、2次元配列Xと1次元配列Yに書き込んでいく。ただし、Xの要素は3文字目のブランクの前の文字列、Yの要素は3文字目のブランクの次の文字'(_テキストファイル,_X,_Y) :- 'テキストファイルの内容をbuffの二次元配列に格納した後'(_テキストファイル,_buff), '1次元配列のAにbuffの内容を1行ずつ格納していきながら、2次元配列Xと1次元配列Yに書き込んでいく。ただし、Xの要素は3文字目のブランクの前の文字列、Yの要素は3文字目のブランクの次の文字'(_buff,_X,_Y). 'テキストファイルの内容をbuffの二次元配列に格納した後'(_テキストファイル,_buff) :- open(_テキストファイル,read,Instream), get_Lines(Instream,_buff), close(Instream). get_Lines(Instream,[]) :- at_end_of_stream(Instream),!. get_Lines(Instream,[L|R]) :- get_char(Instream,Char), get_line(Instream,Char,L), get_Lines(Instream,R). get_line(Instream,Char,[Char]) :- at_end_of_stream(Instream),!. get_line(Instream,'\n',[]) :- !. get_line(Instream,Char,[Char|R]) :- get_char(Instream,Char2), get_line(Instream,Char2,R). '1次元配列のAにbuffの内容を1行ずつ格納していきながら、2次元配列Xと1次元配列Yに書き込んでいく。ただし、Xの要素は3文字目のブランクの前の文字列、Yの要素は3文字目のブランクの次の文字'([],[],[]) :- !. '1次元配列のAにbuffの内容を1行ずつ格納していきながら、2次元配列Xと1次元配列Yに書き込んでいく。ただし、Xの要素は3文字目のブランクの前の文字列、Yの要素は3文字目のブランクの次の文字'([_A|R1],_X,_Y) :- 'Xの要素は3文字目のブランクの前の文字列'(_A,_X,R2), 'Yの要素は3文字目のブランクの次の文字'(_A,_Y,R3), '1次元配列のAにbuffの内容を1行ずつ格納していきながら、2次元配列Xと1次元配列Yに書き込んでいく。ただし、Xの要素は3文字目のブランクの前の文字列、Yの要素は3文字目のブランクの次の文字'(R1,R2,R3). 'Xの要素は3文字目のブランクの前の文字列'(_A,_X,R) :- length([_|L0],3), append(L0,[' '|_],_A), _X = [L0|R]. 'Yの要素は3文字目のブランクの次の文字'(_A,_Y,R) :- length([_|L0],3), append(L0,[' '|[_文字|_]],_A), _Y = [_文字|R]. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/200 # # [1] 授業単元: アルゴリズム(ファイルへの書き込み) # [2] 問題文(含コード&リンク):標準入力からgetchar 関数を使って文字を次々と読 # み込み,Ctrl-d で入力が終了するまで入力された文字 # をファイルに書き込むプログラムを作成せよ.以下の実 # 行例のように,最初に書き込むファイルの名前をユーザに入力させること. # [実行例] # 書込みファイル名: intro.txt # ファイルに書き込む内容を入力(Ctrl-d で終了): # Hello! # I’m Taro KOUK. # I was born in Tokyo in 1992. # <--(Ctrl-d で入力終了) # ファイルに書き込みました。 # % cat intro.txt # Hello! # I’m Taro KOUK. # I was born in Tokyo in 1992. # # '標準入力からgetchar 関数を使って文字を次々と読み込み,Ctrl-d で入力が終了するまで入力された文字をファイルに書き込む' :- 書き込みファイル名の取得(_ファイル), open(_ファイル,write,Outstream), '標準入力からgetchar 関数を使って文字を次々と読み込み,Ctrl-d で入力が終了するまで入力された文字をファイルに書き込む'(Outstream), close(Outstream). '標準入力からgetchar 関数を使って文字を次々と読み込み,Ctrl-d で入力が終了するまで入力された文字をファイルに書き込む'(Outstream) :- at_end_of_stream(user_input),!. '標準入力からgetchar 関数を使って文字を次々と読み込み,Ctrl-d で入力が終了するまで入力された文字をファイルに書き込む'(Outstream) :- get_char(user_input,_文字), put_char(Outstream,_文字), '標準入力からgetchar 関数を使って文字を次々と読み込み,Ctrl-d で入力が終了するまで入力された文字をファイルに書き込む'(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/129 # # [1] 授業単元:計算機アルゴリズム(ファイルへの追加書込み) # [2] 問題文(含コード&リンク):一言日記をファイルに書き込むプログラムを作成した # い.以下の要件を満たすプログラムを作成せよ. # 実行例 # 一言日記ファイル名:test.txt # ファイルがありません。新規作成しますか(Yes…1 / # No…0):0 # プログラムを終了します。 # (以下,diary.txt に既に日記が書かれているとする) # % cat diary.txt # 2011 年12 月6 日12 時23 分来週中間テスト # 2011 年12 月13 日10 時35 分これからテスト! # 2011 年12 月16 日9 時40 分風邪ひいた # # 一言日記ファイル名:diary.txt # ファイルが見つかりました。追記しますか(Yes…1 / # No…0):1 # 日記の文字列を入力:プログラミング演習中 # % cat diary.txt # 2011 年12 月6 日12 時23 分来週中間テスト # 2011 年12 月13 日10 時35 分これからテスト! # 2011 年12 月16 日9 時40 分風邪ひいた # 2011 年12 月22 日14 時28 分プログラミング演習中 # # # '一言日記をファイルに書き込む'(_一言日記ファイル) :- exists_file(_一言日記ファイル), write('ファイルが見つかりました。追記しますか(Yes…1\nNo…0):'), get_line(Line), '一言日記をファイルに追記'(Line,_一言日記ファイル),!. '一言日記をファイルに書き込む'(_一言日記ファイル) :- write('ファイルがありません。新規作成しますか(Yes…1\nNo…0):'), get_line(Line), 新規作成書き込み(Line,_一言日記ファイル),!. 新規作成書き込み('0',_) :- !. 新規作成書き込み('1',_一言日記ファイル) :- write('日記の文字列を入力:'), open(_一言日記ファイル,write,Outstream), 'eofになるまで書き込み'(Outstream), close(Outstream). '一言日記をファイルに追記'('0',_) :- !. '一言日記をファイルに追記'('1',_一言日記ファイル) :- write('日記の文字列を入力:'), open(_一言日記ファイル,append,Outstream), 'eofになるまで書き込み'(Outstream), close(Outstream). 'eofになるまで書き込み'(Outstream) :- at_end_of_stream(current_input),!. 'eofになるまで書き込み'(Outstream) :- get_line(Line), writef(Outstream,'%t\n',[Line]), 'eofになるまで書き込み'(Outstream). get_line(Line) :- get_char(Char), get_line(Char,Chars), atom_chars(Line,Chars). get_line('\n',[]) :- !. get_line(Char,[Char|R]) :- get_char(Char2), get_line(Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/749 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/WOUG0 # # 文字列のソートを行うプログラム # 1) ファイル内の単語をソートする # 2) 半角小文字(aからzまで)だけで良いとする # 3) 1単語あたりの文字数は自由に指定してください # 4) ファイルからの読み込み等と、ソートそのものを別の関数として作成すること # 5) 採用したデータ構造について説明すること # 6) ソートのアルゴリズムについて説明すること ファイル内の単語をソートする(_ファイル) :- ファイルからの読み込み(_ファイル,_単語ならび), クイックソートアルゴリズムを用いてオンメモリで文字列のソートを行う(_単語ならび,_整列した単語ならび), ファイルへ書き戻す(_ファイル). ファイルからの読み込み(_ファイル,_単語ならび) :- open(_ファイル,read,Instream), ストリームからの読み込み(Instream,_単語ならび), close(Instream). ストリームからの読み込み(Instream,[]) :- at_end_of_stream(Instream),!. ストリームからの読み込み(Instream,[_単語|R]) :- get_line(Instream,_単語), ストリームからの読み込み(Instream,R). クイックソートアルゴリズムを用いてオンメモリで文字列のソートを行う(_単語ならび,_整列した単語ならび) :- ソート(_単語ならび,_整列した単語ならび). ソート([],[]). ソート(_ならび,_整列済みならび) :- 軸要素は先頭要素とする, _ならび = [_軸要素|R], 分割する(_軸要素,R,_軸要素より小さいならび,_軸要素と等しいか大きいならび), ソート(_軸要素より小さいならび,_整列した軸要素より小さいならび), ソート(_軸要素と等しいか大きいならび,_整列した軸要素と等しいか大きいならび), append(_整列した軸要素より小さいならび,[_軸要素|_整列した軸要素と等しいか大きいならび],_整列済みならび). 分割する(_軸要素,[],[],[]) :- '対象要素がなくなったら第三引数と第四引数の不確定要素を[]に単一化してならびを終止する'. 分割する(_軸要素,[_対象要素|R1],[_対象要素|R2],R3) :- 対象要素が軸要素より小さい場合は(_対象要素,_軸要素), 第三引数にコピー, 分割する(_軸要素,R1,R2,R3). 分割する(_軸要素,[_対象要素|R1],R2,[_対象要素|R3]) :- 対象要素が軸要素と等しいか大きい場合は(_対象要素,_軸要素), 第四引数にコピー, 分割する(_軸要素,R1,R2,R3). 対象要素が軸要素より小さい場合は(_対象要素,_軸要素) :- A @< _軸要素. 対象要素が軸要素と等しいか大きい場合は(_対象要素,_軸要素) :- A @>= _軸要素. ファイルへ書き戻す(_ファイル,_整列された単語ならび) :- open(_ファイル,write,Outstream), append(_,[_単語|R],_整列された単語ならび), writef(Outstream,'%t\n',[_単語]), R = [], close(Outstream). 軸要素は先頭要素とする. '対象要素がなくなったら第三引数と第四引数の不確定要素を[]に単一化してならびを終止する'. 第三引数にコピー. 第四引数にコピー. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/330 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # テキストファイル bmi.txt を用意します # 17人の名前と彼らの身長と体重が記入されています. # $ cat bmi.txt # Ackley,D.H. 181.5 65.1 # Baker,J.E. 185.3 68.3 # Keller,K.S. 175.2 63.4 # Brent,R.P. 174.4 52.8 # Jong,K.A. 186.2 73.4 # Goldberg,D.E. 174.0 60.0 # Forrest,S. 175.5 60.6 # Fletcher,R. 180.3 73.8 # Powell,M.J.D. 170.1 55.9 # Smith,R.E. 178.7 69.6 # Richardson,J. 167.7 51.5 # Martin,F.G. 179.2 65.3 # Wilson,S.W. 185.8 84.4 # Lawler,E.L. 166.5 59.6 # Reed,J. 176.3 58.8 # Holland,J.H. 186.1 70.4 # Jones,W.T. 171.4 63.7 # # C プログラム delcomma.c を書き,以下の要領でコンパイルし,実行モジュール delcomma を生成します. # delcomma は想像通り,delete comma の略です. # 標準入力から受け取った名前の中で,カンマ以下を削除して標準出力に表示するコマンドです. # # '標準入力から受け取った名前の中で,カンマ以下を削除して標準出力に表示する' :- at_end_of_stream(user_input),!. '標準入力から受け取った名前の中で,カンマ以下を削除して標準出力に表示する' :- get_line(user_input,Line), split(Line,[','],[_名前|_]), writef(user_output,'%t\n',[_名前]), '標準入力から受け取った名前の中で,カンマ以下を削除して標準出力に表示する'. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/670 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # #include<stdio.h> # int main(void) # { # int i=0; # char *ptr; # char str[128]; # # ptr = str; # # scanf("%s",&str); # # while(*ptr++){ # i++; # } # # printf("%d\n",i); # } # # 上記の入力したテキストの文字数を表示するプログラムの読み込み部分をファイル処理に変更せよ。 # fgetc() 関数を使用し、コマンドラインにファイル名が指定できるようにすること。 # ただし、ファイル名を指定しない場合は標準入力とする。 # ファイルが見つからなかった時はエラーメッセージを出し、プログラムを終了する。 # 'length系組込述語を使わず入力したテキストの文字数を表示する' :- get_chars(_文字ならび), ならびの文字数を数える(_文字ならび,_文字数), writef('文字数は %t文字です\n',[_文字数]). ならびの文字数を数える([],0). ならびの文字数を数える([_|R],_文字数) :- ならびの文字数を数える(R,_文字数_1), _文字数 is _文字数_1 + 1. 読み込み部分をファイル処理に変更する :- コマンドラインからファイル名を取り出す(_ファイル名), 読み込み部分をファイル処理に変更する(_ファイル名). 読み込み部分をファイル処理に変更する(user_input,_文字数) :- ファイルから読み出しながら文字数を数える(user_input,_文字数). 読み込み部分をファイル処理に変更する(_ファイル名,_文字数) :- open(_ファイル名,read,Instream), ファイルから読み出しながら文字数を数える(Instream,_文字数), close(Instream). ファイルから読み出しながら文字数を数える(Instream,0) :- at_end_of_stream(Instream),!. ファイルから読み出しながら文字数を数える(Instream,_文字数) :- get_char(Instream,_), ファイルから読み出しながら文字数を数える(Instream,_文字数_1), _文字数 is _文字数_1 + 1. コマンドラインからファイル名を取り出す(_ファイル名) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList), ParameterList = [_ファイル名|_],!. コマンドラインからファイル名を取り出す(user_input). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/477 # # [1] アルゴリズム論 # [2] Unixコマンドのgrepを実装したmygrepの作成 #   コマンドライン引数で検索文字列とファイル名をもらい、ファイル内に検索文字列が含まれる行があればその行を出力する #   正規表現に対応させる必要はない # [3] # [3.1]windows xp  # [3.2]gcc  # [3.3]c言語 # [4] 無期限 # [5] strstrは使用禁止 # # よろしくおねがいします # program :- user_paramaters([_検索文字列,_ファイル名]), open(_ファイル名,read,Instream), grep_line(Instream,_検索文字列), close(Instream), halt. grep_line(Instream,_検索文字列) :- at_end_of_stream(Instream),!. grep_line(Instream,_検索文字列) :- get_line(Stream,Line), sub_atom(Line,_,_,_,_検索文字列), writef('%t\n',[Line]), fail. grep_line(Instream,_検索文字列) :- grep_line(Instream,_検索文字列). % 以下のサイトは # # 行読み込み述語 get_line/2,get_line/1 です。 # ここでの焦点は改行なしにいきなりEOFが来た時の処理。 # at_end_of_stream で処理をするのですが、最後の文字として、 # 改行があったのかどうかを返すことはできません。 # % % get_chars/2 : get_chars(_ファイル,_文字リスト) % ファイル全体をリストとして取得します % get_chars(File,Chars) :- open(File,read,Instream), get_chars_1(Instream,Chars), close(Instream). get_chars_1(Instream,[]) :- at_end_of_stream(Instream),!. get_chars_1(Instream,[Char|R]) :- get_char(Instream,Char), get_chars_1(Instream,R). % % get_lines/2 : get_lines(_ファイル名,_行リスト) % ファイル全体を行のリストとして取得します % 第一引数はストリームではなくファイルです % get_lines(File,Lines) :- open(File,read,Instream), get_lines_1(Instream,Lines), close(Instream). get_lines_1(Instream,[]) :- at_end_of_stream(Instream),!. get_lines_1(Instream,[Line|R]) :- get_line(Instream,Line), get_lines_1(Instream,R). % % get_line/2 : get_line(_ストリーム,_行) % 改行がくるまで、アトムとして取得します % get_line(Stream,end_of_file) :- at_end_of_stream(Stream),!. get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,C,[C]) :- at_end_of_stream(Stream),!. get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). % % 標準入力の場合。 % get_line(X) :- current_input(Stream), get_line(Stream,X). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/914 # # [1] 授業単元:プログラム概論 # [2] 問題文(含コード&リンク):ファイルの商品名を順に読み込んで、オーダー #                   の順を出力する関数を作成しなさい. # http://ime.nu/codepad.org/q5G3hxdB ←ここまで作りましたが、"ファイルが見つかりません"と表示されます. # # 'ファイルの商品名を順に読み込んで、オーダーの順を出力する'(_ファイル) :- get_lines(_ファイル,Lines), append(_,[Line|R],Lines), sub_atom(Line,0,20,_,_商品名), writef('%t\n',[_商品名]), R = []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'ファイルの商品名を順に読み込んで、オーダーの順を出力する'(_ファイル) :- open(_ファイル,read,Instream), '商品名を順に読み込んで、オーダーの順を出力する'(Instream), close(Instream). '商品名を順に読み込んで、オーダーの順を出力する'(Instream) :- at_end_of_stream(Instream),!. '商品名を順に読み込んで、オーダーの順を出力する'(Instream) :- get_line(Instream,Line), sub_atom(Line,0,20,_,_商品名), writef('%t\n',[_商品名]), '商品名を順に読み込んで、オーダーの順を出力する'(Instream). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 150代目 #662 # [1] 課題 # [2] .tsv形式のファイルをネット上から呼び出して、一番最後の行を引用して表示するプログラムを教えてください # [3] Mac OS X C++ # [4] 7/16 19時まで # [5] 関数呼び出しまで # 宜しくお願いします。 # '.tsv形式のファイルをネット上から呼び出して、一番最後の行を引用して表示する'(_URL) :- w3c(URL,Lines), 最終行を捜す(Lines,_最終行), writef('%w\n',[_最終行]). 最終行を捜す(Chars,_最終行) :- last(Lines,_最終行). w3c(URL,Lines) :- atomic_list_concat(['w3m -dump ',URL],S), shs(S,Lines). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/616 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # ファイルの中に含まれる文字のエントロピーを計算したい。 # 次のように作りなさい。 # (a)文字をgetchar関数で1文字ずつ読み込み、その文字ciの出現頻度f(ci)をカウントする。 # (b)総文字数Sと出現頻度f(ci)から出現確立P(ci)を計算する関数を作成しなさい。 # P(ci)=1/S*f(ci)…(1) # S=Σf(ci)…(2) # i # (c)出現確立P(ci)からエントロピーHを計算する関数を作成しなさい。 # ただし、0log0=0とみなす。 # H=-ΣP(ci)log2(←底)P(ci)…(3) # fopenを使った場合は加点する。 # ファイル入出力を使わない場合は、リダイレクトを用いて標準入力から読み込む実行例を示すこと。 # また、すべての文字の出現頻度が同じであるファイルを作成し、 その時のエントロピーを示すこと。 # 下記のプログラム参照。 # # 続く # 一文字読み込んで出現頻度を計算する(_ファイル名,_出現頻度ならび,_出現確率ならび) :- open(_ファイル名,read,Instream), repeat, get_char(Instream,_文字), 一文字読み込んで出現頻度を計算する(Instream,_文字,1,[[_文字,1]],_総文字数,_文字の出現頻度ならび,_出現確率ならび), at_end_of_stream(Instream), close(Instream). 一文字読み込んで出現頻度を計算する(Instream,_文字,_総文字数,_文字の出現頻度ならび,_総文字数,_文字の出現頻度ならび,_出現確率ならび) :- 出現確率を計算する(_総文字数,_文字の出現頻度ならび,_文字の出現確率ならび), member([_文字,_出現頻度],_文字の文字の出現頻度ならび2), member([_文字,_出現確率],_出現確率ならび), writef('文字 = %t, 出現頻度 = %t, 出現確率 = %t\n',[_文字,_出現頻度,_出現確率]). 一文字読み込んで出現頻度を計算する(Instream,_,_総文字数1,_文字の出現頻度ならび1,_総文字数,_文字の出現頻度ならび) :- get_char(Instream,_文字), 出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,_文字の出現頻度ならび2), 一文字読み込んで出現頻度を計算する(Instream,_文字,_総文字数2,_文字の出現頻度ならび2,_総文字数,_文字の出現頻度ならび). 出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,_文字の出現頻度ならび2) :- append(L0,[[_文字,_出現頻度1]|R],_文字の出現頻度ならび1), _出現頻度2 is _出現頻度1 + 1, _総文字数2 is _総文字数1 + 1, append(L0,[[_文字,_出現頻度2]|R],_文字の出現頻度ならび2),!. 出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,[[_文字,1]|_文字の出現頻度ならび1]) :- _総文字数2 is _総文字数1 + 1. 出現確率を計算する(_総文字数,[],[]) :- !. 出現確率を計算する(_総文字数,[[_文字,_出現頻度]|R2],[[_文字,_出現確率]|R3]) :- _出現確率 is _出現頻度 / _総文字数, 出現確率を計算する(_総文字数,R2,R2). 出現確率からエントロピーを計算する(_出現確率ならび,_エントロピー) :- 出現確率からエントロピーを計算する(_出現確率ならび,0.0,_エントロピー). 出現確率からエントロピーを計算する([],_エントロピー,_エントロピー) :- !. 出現確率からエントロピーを計算する([[_,_出現確率]|R],_エントロピーの一,_エントロピー) :- _エントロピーのニ is _エントロピーの一 - (log(_出現確率) / log(2) * _出現確率, 出現確率からエントロピーを計算する(R,_エントロピーのニ,_エントロピー). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/616 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # ファイルの中に含まれる文字のエントロピーを計算したい。 # 次のように作りなさい。 # (a)文字をgetchar関数で1文字ずつ読み込み、その文字ciの出現頻度f(ci)をカウントする。 # (b)総文字数Sと出現頻度f(ci)から出現確立P(ci)を計算する関数を作成しなさい。 # P(ci)=1/S*f(ci)…(1) # S=Σf(ci)…(2) # i # (c)出現確立P(ci)からエントロピーHを計算する関数を作成しなさい。 # ただし、0log0=0とみなす。 # H=-ΣP(ci)log2(←底)P(ci)…(3) # fopenを使った場合は加点する。 # ファイル入出力を使わない場合は、リダイレクトを用いて標準入力から読み込む実行例を示すこと。 # また、すべての文字の出現頻度が同じであるファイルを作成し、 その時のエントロピーを示すこと。 # 下記のプログラム参照。 # # 続く # 一文字読み込んで出現頻度を計算する(_ファイル名,_出現頻度ならび,_出現確率ならび) :- open(_ファイル名,read,Instream), repeat, get_char(Instream,_文字), 一文字読み込んで出現頻度を計算する(Instream,_文字,1,[[_文字,1]],_総文字数,_文字の出現頻度ならび,_出現確率ならび), at_end_of_stream(Instream), close(Instream). 一文字読み込んで出現頻度を計算する(Instream,_文字,_総文字数,_文字の出現頻度ならび,_総文字数,_文字の出現頻度ならび,_出現確率ならび) :- 出現確率を計算する(_総文字数,_文字の出現頻度ならび,_文字の出現確率ならび), member([_文字,_出現頻度],_文字の文字の出現頻度ならび2), member([_文字,_出現確率],_出現確率ならび), writef('文字 = %t, 出現頻度 = %t, 出現確率 = %t\n',[_文字,_出現頻度,_出現確率]). 一文字読み込んで出現頻度を計算する(Instream,_,_総文字数1,_文字の出現頻度ならび1,_総文字数,_文字の出現頻度ならび) :- get_char(Instream,_文字), 出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,_文字の出現頻度ならび2), 一文字読み込んで出現頻度を計算する(Instream,_文字,_総文字数2,_文字の出現頻度ならび2,_総文字数,_文字の出現頻度ならび). 出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,_文字の出現頻度ならび2) :- append(L0,[[_文字,_出現頻度1]|R],_文字の出現頻度ならび1), _出現頻度2 is _出現頻度1 + 1, _総文字数2 is _総文字数1 + 1, append(L0,[[_文字,_出現頻度2]|R],_文字の出現頻度ならび2),!. 出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,[[_文字,1]|_文字の出現頻度ならび1]) :- _総文字数2 is _総文字数1 + 1. 出現確率を計算する(_総文字数,[],[]) :- !. 出現確率を計算する(_総文字数,[[_文字,_出現頻度]|R2],[[_文字,_出現確率]|R3]) :- _出現確率 is _出現頻度 / _総文字数, 出現確率を計算する(_総文字数,R2,R2). 出現確率からエントロピーを計算する(_出現確率ならび,_エントロピー) :- 出現確率からエントロピーを計算する(_出現確率ならび,0.0,_エントロピー). 出現確率からエントロピーを計算する([],_エントロピー,_エントロピー) :- !. 出現確率からエントロピーを計算する([[_,_出現確率]|R],_エントロピーの一,_エントロピー) :- _エントロピーのニ is _エントロピーの一 - (log(_出現確率) / log(2) * _出現確率, 出現確率からエントロピーを計算する(R,_エントロピーのニ,_エントロピー). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/601 # # [1] 授業単元: ファイル入出力 # [2] 問題文(含コード&リンク): # ファイルを読み込んで,ファイル中の英小文字を英大文字に,英大文字を英小文字に変換してファイルに書き出すプログラムを作成せよ. # $ cat sample.txt # 1. Software Engineering # # Based on the tenets of software engineering and computing science, # the Department of Software Engineering provides students with # a comprehensive grounding in software development and information # processing. As society becomes increasingly dependent on various # ... 略 ... # # $ 実行例 # 入力ファイル名 > sample.txt # 出力ファイル名 > sample-out.txt # $ cat sample-out.txt # 1. sOFTWARE eNGINEERING # # bASED ON THE TENETS OF SOFTWARE ENGINEERING AND COMPUTING SCIENCE, # THE dEPARTMENT OF sOFTWARE eNGINEERING PROVIDES STUDENTS WITH # A COMPREHENSIVE GROUNDING IN SOFTWARE DEVELOPMENT AND INFORMATION # PROCESSING. aS SOCIETY BECOMES INCREASINGLY DEPENDENT ON VARIOUS # ... 略 ... # 'ファイルを読み込んで,ファイル中の英小文字を英大文字に,英大文字を英小文字に変換してファイルに書き出す'(_入力ファイル,_出力ファイル) :- open(_入力ファイル,read,Instream), open(_出力ファイル,write,Outstream), '英小文字を英大文字に,英大文字を英小文字に変換して書きだす'(Instream,Outstream), close(Outstream), close(Instream),!. '英小文字を英大文字に,英大文字を英小文字に変換して書きだす'(Instream,Outstream) :- at_end_of_stream(Instream),!. '英小文字を英大文字に,英大文字を英小文字に変換して書きだす'(Instream,Outstream) :- get_char(Instream,_文字), 英小文字を英大文字に,英大文字を英小文字に変換して(_文字,_文字2), put_char(Outstream,_文字2), '英小文字を英大文字に,英大文字を英小文字に変換して書きだす'(Instream,Outstream). 英小文字を英大文字に,英大文字を英小文字に変換して(_文字,_文字2) :- _文字 @>= 'a', _文字 @=< 'z', to_upper(_文字,_文字2),!. 英小文字を英大文字に,英大文字を英小文字に変換して(_文字,_文字2) :- _文字 @>= 'A', _文字 @=< 'Z', to_lower(_文字,_文字2),!. 英小文字を英大文字に,英大文字を英小文字に変換して(_文字,_文字). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/297 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/lqKLztNc # # あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示するプログラムkadai12-1.cを作ってみよう。 # kadai12-1.cでは次のようなmain()を定義したとする。 # # #include # #include # # void display_file(FILE *fp); # # int main() { # char INFILENAME[100]; //ファイル名を格納する文字列 # FILE *in_fp; # scanf("%s", INFILENAME); //ファイル名をキーボード入力 # in_fp = fopen(INFILENAME, "r"); //ファイルを開く # if (in_fp == NULL) {//ファイルが開けない場合はin_fpがNULLになる。(ファイルが見付からない時等) # fprintf(stderr, "I cannot open %s\n", INFILENAME);//標準エラー出力にエラーメッセージを出力 # exit(1); # } # # display_file(in_fp); //ファイルの中身を全部画面表示する関数 # fclose(in_fp); //ファイルを閉じる # } # # ○ 上記main関数の中の void display_file(FILE *fp)を以下の仕様を満たすように定義し、kadai12-1.cを完成させなさい。 # 読み込むファイルは上記プリプロセッサで定義されたFILENAMEにある. # これをcat して中身を見ると、 # cat /usr4/yamauchi/yamauchi/data/test.dat # 1.000000 1.136735 # 1.010000 1.137647 # 1.020000 1.137143 # 1.030000 1.137957 # 1.040000 1.142641 # 1.050000 1.153101 # ..... # と数値が1行に2個ずつ列挙されている。これらのデータを読み取って # # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ... # のように1行に1つずつ数値を列挙するように定義しなさい。但し、ファイルポインターがファイルの最後か否かを判定する関数として # int feof(FILE *fp)が準備されている。この使いかたは次で調べよ。 # man feof # すると、使用方法が表示される。 # # 実行例: # gcc kadai112-1.c # ./a.out # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ..... 'あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示する' :- open('test.dat',read,Instream), repeat, get_split_line(Instream,[' '],_実数ならび), 表示する(_実数ならび), at_end_of_stream(Instream), close(Instream). 表示する([]) :- !. 表示する([A|R]) :- number(A), writef('%t\n',[A]), 表示する(R),!. 表示する([A|R]) :- \+(number(A)), 表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/297 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/lqKLztNc # # あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示するプログラムkadai12-1.cを作ってみよう。 # kadai12-1.cでは次のようなmain()を定義したとする。 # # #include # #include # # void display_file(FILE *fp); # # int main() { # char INFILENAME[100]; //ファイル名を格納する文字列 # FILE *in_fp; # scanf("%s", INFILENAME); //ファイル名をキーボード入力 # in_fp = fopen(INFILENAME, "r"); //ファイルを開く # if (in_fp == NULL) {//ファイルが開けない場合はin_fpがNULLになる。(ファイルが見付からない時等) # fprintf(stderr, "I cannot open %s\n", INFILENAME);//標準エラー出力にエラーメッセージを出力 # exit(1); # } # # display_file(in_fp); //ファイルの中身を全部画面表示する関数 # fclose(in_fp); //ファイルを閉じる # } # # ○ 上記main関数の中の void display_file(FILE *fp)を以下の仕様を満たすように定義し、kadai12-1.cを完成させなさい。 # 読み込むファイルは上記プリプロセッサで定義されたFILENAMEにある. # これをcat して中身を見ると、 # cat /usr4/yamauchi/yamauchi/data/test.dat # 1.000000 1.136735 # 1.010000 1.137647 # 1.020000 1.137143 # 1.030000 1.137957 # 1.040000 1.142641 # 1.050000 1.153101 # ..... # と数値が1行に2個ずつ列挙されている。これらのデータを読み取って # # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ... # のように1行に1つずつ数値を列挙するように定義しなさい。但し、ファイルポインターがファイルの最後か否かを判定する関数として # int feof(FILE *fp)が準備されている。この使いかたは次で調べよ。 # man feof # すると、使用方法が表示される。 # # 実行例: # gcc kadai112-1.c # ./a.out # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ..... 'あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示する' :- open('test.dat',read,Instream), 実数を読み込んで表示する(Instream), close(Instream). 実数を読み込んで表示する(Instream) :- at_end_of_stream(Instream),!. 実数を読み込んで表示する(Line) :- get_line(Instream,Line), split(Line,[' '],_実数ならび), 表示する(_実数ならび), 実数を読み込んで表示する(Instream). 表示する([]) :- !. 表示する([A|R]) :- number(A), writef('%t\n',[A]), 表示する(R),!. 表示する([A|R]) :- \+(number(A)), 表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/196 # # [1] 授業単元:システムコール # [2] 問題文(含コード&リンク):http://codepad.org/XAPpvt1n # # コマンドライン引数でファイル名をn個指定し、 ファイル1からファイルn-1まで # の内容を連結し、 その結果をファイルnに書き込むプログラムを書け。 # ただし、標準入力と標準出力を当該のファイルにリダイレクトした状態で # UNIX標準コマンドを実行することで行うこと。 入力ファイルに関して # エラーが発生した場合、 そこで処理を終了せず、残りのファイルの処理を # 続けること。 ただし、以下のオプションをとることができるようにせよ。 # # -a # 書き込む際に、 ` を *' に、 ~ を *^ に、 それぞれ変換する。 # -b # 書き込む際に、 { を *[ に、 } を *] に、 # | (縦棒)を *\ (アスタリスク バックスラッシュ)に、 それぞれ変換する。 # -l # 書き込む際に、 アルファベット小文字を、 対応する大文字の # 前に * (アスタリスク)を添えた二文字に変換する。 # # 注意1 # ファイルをcloseした後に同名のファイルをopenすると、セキュリティ上の # 問題が生じる。出力のリダイレクトで、そのようなことにならないよう # 注意してプログラミングすること 'コマンドライン引数でファイル名をn個指定し、ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む' :- 'オプションならび・ファイル名ならび・出力ファイル名の取得'(_オプションならび,_ファイル名ならび,_出力ファイル名), フィルタの定義(_オプションならび), 'ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む'(_ファイル名ならび,_出力ファイル名). 'オプションならび・ファイル名ならび・出力ファイル名の取得'(_オプションならび,_ファイル名ならび,_出力ファイル名) :- user_parameters(_ユーザパラメータ), append(_オプションまたはファイル名ならび,[_出力ファイル名],_ユーザパラメータ), オプションとファイル名の分離(_オプションまたはファイル名ならび,_オプションならび,_ファイル名ならび),!. オプションとファイル名の分離([],[],[]) :- !. オプションとファイル名の分離([_オプション指定|R1],[_オプション指定|R2],_ファイル名ならび) :- sub_atom(_オプション指定,0,1,_,'-'), オプションとファイル名の分離(R1,R2,_ファイル名ならび), オプションとファイル名の分離([_ファイル名|R1],R2,[_ファイル名|R3]) :- \+(sub_atom(_オプション指定,0,1,_,'-')), オプションとファイル名の分離(R1,R2,R3),!. 'ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む'(_ファイル名ならび,_出力ファイル名) :- open(_出力フィル名,write,Outstream), 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,_ファイル名ならび), close(Outstream). 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,[]) :- !. 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,[_ファイル名|R]) :- open(_ファイル名,read,Instream), フィルタを通しながら出力する(Instream,Outstream), close(Instream), 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,R). フィルタを通しながら出力する(Instream,Outstream) :- at_end_of_stream(Instream),!. フィルタを通しながら出力する(Instream,Outstream) :- get_char(Instream,_文字), フィルタ(_文字,_変換された文字列), writef(Outstream,'%t',[_変換された文字列]), フィルタを通しながら出力する(Instream,Outstream). フィルタの定義(_オプションならび) :- member('-a',_オプションならび), asserta((フィルタ('`','*''') :- !)), asserta((フィルタ('~','*^') :- !)), fail. フィルタの定義(_オプションならび) :- member('-b',_オプションならび), asserta((フィルタ('{','*{') :- !)), asserta((フィルタ('}','*}') :- !)), fail. フィルタの定義(_オプションならび) :- member('-l',_オプションならび), asserta((フィルタ(A,B) :- A @>= 'a', A @=< 'z', to_upper(A,A1), concat_atom(A1,B),!)), fail. フィルタの定義(_) :- assertz((フィルタ(A,A))). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/374 # # [1]授業単元:オペレーティングシステム論 # [2]課題:適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする。 # それをクローズし、そのファイルを開き、すべてのビットを反転させた内容に置換する。 # これを10万回繰り返すプログラムを作成し、HD、SSD、USBフラッシュメモリ等のデバイスの差 # 処理時間がどのくらい変わるかテストするプログラムを作成せよ # [3] OS:Windows IDE:Visual studio 2008 言語:C # [4] 6/15まで # [5] ディスクキャッシュが大きいとディスクに短期間では確実に書き込まれるとは限らないので、ファイルを100個作って1000回 # 繰り返すプログラムにしたほうが良い # とのことです。 # コードだけでなく、実行時間もお願いします。 # # '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする。それをクローズし、そのファイルを開き、すべてのビットを反転させた内容に置換する' :- '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする'(File,Outstream), それをクローズし(Outstream), 'そのファイルを開き、すべてのビットを反転させた内容に置換する'(File). '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする'(File,Outstream) :- tmpnam(File), open(File,write,Outstream,[type(binary)]), for(1,N,100000000), Code is random(256), put_byte(Outstream,Code), N = 100000000,!. それをクローズし(Outstream) :- close(Outstream). 'そのファイルを開き、すべてのビットを反転させた内容に置換する'(File) :- open(File,update,Updatestream,[type(binary)]), repeat, ( at_end_of_stream(Updatestream); get_byte(Updatestream,Byte), Byte1 is Byte - 255, put_byte(Updatestream,Byte1), fail ), close(Updatestream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289816228/621 # # C言語の質問です。自分でも何を言いたいのかわからないくらい初心者なのですが、 # 元々作成してあるファイル(テキストファイル)から、一文字ずつ入力して # スペースが入力されたらタブ文字を入れたテキストを画面に出力し # \nが入力されたら改行し # その他の文字が入力されたらそのまま画面に表示する # というプログラムを作りたいのですがソースプログラムはどのようにすればよいのでしょうか。 # アドバイスよろしくお願いします。 # # '元々作成してあるファイル(テキストファイル)から、一文字ずつ入力してスペースが入力されたらタブ文字を入れたテキストを画面に出力し\\nが入力されたら改行しその他の文字が入力されたらそのまま画面に表示する'(_テキストファイル) :- open(_テキストファイル,read,Instream), get_char(Instream,_文字), '一文字ずつ入力してスペースが入力されたらタブ文字を入れたテキストを画面に出力し\\nが入力されたら改行しその他の文字が入力されたらそのまま画面に表示する'(Instream,_文字), close(Instream),!. '一文字ずつ入力してスペースが入力されたらタブ文字を入れたテキストを画面に出力し\\nが入力されたら改行しその他の文字が入力されたらそのまま画面に表示する'(Instream,end_of_file) :- !. '一文字ずつ入力してスペースが入力されたらタブ文字を入れたテキストを画面に出力し\\nが入力されたら改行しその他の文字が入力されたらそのまま画面に表示する'(Instream,' ') :- 空白を読みとばす(Instream,_次の文字), write('\t'), '一文字ずつ入力してスペースが入力されたらタブ文字を入れたテキストを画面に出力し\\nが入力されたら改行しその他の文字が入力されたらそのまま画面に表示する'(Instream,_次の文字),!. '一文字ずつ入力してスペースが入力されたらタブ文字を入れたテキストを画面に出力し\\nが入力されたら改行しその他の文字が入力されたらそのまま画面に表示する'(Instream,_文字) :- write(_文字), get_char(_次の文字), '一文字ずつ入力してスペースが入力されたらタブ文字を入れたテキストを画面に出力し\\nが入力されたら改行しその他の文字が入力されたらそのまま画面に表示する'(Instream,_次の文字),!. 空白を読みとばす(Instream,end_of_file) :- at_end_of_stream(Instream),!. 空白を読みとばす(Instream,_文字) :- get_char(Instream,_文字), \+(_文字=' '),!. 空白を読みとばす(Instream,_文字) :- 空白を読みとばす(Instream,_文字). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/694 # # [1] 授業単元: プログラミング自由課題 # [2] 問題文(含コード&リンク): ファイルの出力のソート化 # # ファイルの入出力で、ファイルオープンした後に昇順のソートがしたいのですがよくわかりません。 # スケジュール管理表のような感じのプログラムを作りたいので、配列を日程と内容の2つに分けました。 # 「日程」はint型の配列を使用し、1月20日ならば0120のように入力します。「内容」の配列はchar型を使用しました。 # txtは「0120(日程) 2ch書き込み(内容)」のようにし、ここからファイルをオープン後txtに入力してある # データを日程の昇順でソートし、出力したいのですがよくわかりません・・・。 # ファイルをオープンした後に日程の配列を読み込み、それをソート後、日程と内容の配列を関連づければいいのでしょうか? # 'ファイルオープンした後に昇順のソートがしたい'(_txtファイル,_整列されたtxtファイル) :- open(_txtファイル,read,Instream), 日程部分と内容を別に切り出す(Instream,1,_日程ならび,_内容ならび), close(Instream), 日程ならびを整列する(_日程ならび,_整列された日程ならび), open(_整列されたtxtファイル,write,Output), 整列された日程の順序番号を鍵として内容を結合しながら昇順に書き出す(Outstream,_整列された日程部分ならび,_内容ならび), close(Output). 日程部分と内容を別に切り出す。日程には順序番号を付加する(Instram,_,[],[]) :- at_end_of_stream(Instream),!. 日程部分と内容を別に切り出す。日程には順序番号を付加する(Instream,N2,[[_日程,N]|R1],[_内容|R2]) :- get_line(Instream,Line), sub_atom(Line,0,4,RLen,_日程), sub_atom(Line,4,RLen,_,_内容), N2 is N + 1, 日程部分と内容を別に切り出す。日程には順序番号を付加する(Instream,N2,R1,R2). 日程を昇順に整列する([_分割点要素|_整列対象ならび],_整列されたならび) :- 整列の為の分割(_整列対象ならび,_分割点要素,_等しいかより少ない要素ならぴ,_より大きい要素ならび), 日程を昇順に整列する(_等しいかより少ない要素ならぴ,_整列されたならびの一), 日程を昇順に整列する(_より大きい要素ならび,_整列されたならびの二), append(_整列されたならぴの一,[_分割点要素|_整列されたならびの二],_整列されたならび). 日程を昇順に整列する([],[]). 整列の為の分割([],_,[],[]) :- !. 整列の為の分割([_要素|R],_分割点要素,[_要素|R1],R2) :- _要素 @=< _分割点要素, 整列の為の分割(R,_分割点要素,R1,R2),!. 整列の為の分割([_要素|R],_分割点要素,R1,[_要素|R2]) :- _要素 @> _分割点要素, 整列の為の分割(R,_分割点要素,R1,R2),!. 整列された日程の順序番号を鍵として内容を結合しながら昇順に書き出す(Outstream,[],_内容ならび) :- !. 整列された日程の順序番号を鍵として内容を結合しながら昇順に書き出す(Outstream,[[_日程,N]|R],_内容ならび) :- list_nth(N,_内容ならび,_内容), concat_atom([_日程,_内容],Line), write_formatted(Outstream,'%t\n',[Line]), 整列された日程の順序番号を鍵として内容を結合しながら昇順に書き出す(Outstream,R,_内容ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/580 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # # 問題1 テキストファイルのコピーを作るプログラムを作れ  # 問題2 問題1について下記のようにコピー元とコピー先のファイル名を引数で指定できるようにプログラムを変更せよ # # ./a. out <コピー元ファイル名> <コピー先ファイル名> program :- user_parameters(L), L = [_コピー元ファイル,_コピー先ファイル], テキストファイルのコピーを作る(_コピー元ファイル,_コピー先ファイル). テキストファイルのコピーを作る(_コピー元ファイル,_コピー先ファイル) :- 入出力ファイルのオープン(_コピー元ファイル,_コピー先ファイル,Instream,Outstream), 一文字づつコピーする(Instream,Outstream), 入出力ファイルのオープン(Instream,Outstream),!. テキストファイルのコピーを作る(_,_). 入出力ファイルのオープン(_コピー元ファイル,_コピー先ファイル,Instream,Outstream) :- 入力ファイルのオーブン(_コピー元ファイル,Instream), 出力ファイルのオープン(_コピー先ファイル,Outstream),!. 入力ファイルのオーブン(_コピー元ファイル,Instream) :- error_protect(open(_コピー元ファイル,read,Instream),fail),!. 入力ファイルのオーブン(_コピー元ファイル,Instream) :- write_formatted('コピー元ファイル %t はオープンてきません\n',[_コピー元ファイル]), fail. 出力ファイルのオーブン(_コピー先ファイル,Outstream) :- error_protect(open(_コピー先ファイル,write,Outstream),fail),!. 出力ファイルのオーブン(_コピー先ファイル,Outstream) :- write_formatted('コピー先ファイル %t はオープンてきません\n',[_コピー先ファイル]), fail. 一文字づつコピーする(Instream,Outstream) :- at_end_of_stream(Instream),!. 一文字づつコピーする(Instream,Outstream) :- get_char(Instream,Char), put_char(Outstream,Char), 一文字づつコピーする(Instream,Outstream). 入出力ファイルのクローズ(Instream,Outstream) :- close(Instream), close(Outstream),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1292333005/641 # # Cでバイナリファイル内の置き換えについて質問です # # 74 65 73 74 (test) を検索して別の値に変換するつもりですが # どのように処理したらいいでしょうか? # 74 がでてくるまで1バイトずつ読み込んでいくのか # ファイルを全部メモリに読み込んでから検索するのか # バイナリ操作が初めてなのでどうのようにするのがいいのでしょうか # 'バイナリファイル内の置き換え'(_ファイル,_別の値ならび) :- get_bytes(_ファイル,Bytes), '74 65 73 74 (test) を検索して別の値に変換する'(Bytes,_別の値ならび,Bytes2), put_bytes(_ファイル,Bytes2). '74 65 73 74 (test) を検索して別の値に変換する'(Bytes1,_別の値ならび,Bytes1) :- \+(append(L0,[74,65,73,74|R],Bytes1)),!. '74 65 73 74 (test) を検索して別の値に変換する'(Bytes1,_別の値ならび,Bytes2) :- append(L0,[74,65,73,74|R],Bytes1), '74 65 73 74 (test) を検索して別の値に変換する'(R,_別の値ならび,Bytes3), append(L0,_別の値ならび,Bytes3,Bytes2). get_bytes(_ファイル,Bytes) :- open(_ファイル,read,Instream,[type(binary)]), findall(Byte,( repeat,( at_end_of_stream(Instream), !, fail; get_byte(Instream,Byte))), Bytes), close(Instream),!. put_bytes(_ファイル,Bytes) :- open(_ファイル,write,Outstream,[type(binary)]), append(_,[Byte|R],Bytes), put_byte(Outstream,Byte), R = [], close(Outstream),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/178 # # 【質問テンプレ】 # [1] 授業単元:C # [2] 問題文(含コード&リンク): #   行の数が同数である(csv1)と(csv2)を横に連結し(csv3)を作成作成せよ # '行の数が同数である(csv1)と(csv2)を横に連結し(csv3)を作成する'(_csv1,_csv2,_csv3) :- open(_csv1,read,Instream1), open(_csv2,read,Instream2), open(_csv3,write,Outstream), 'Instream1とInstream2を横に連結しInstream3に書き出す'(Instream1,Instream2,Outstream), close(Outstream), close(Instream2), close(Instream1). 'Instream1とInstream2を横に連結しInstream3に書き出す'(Instream1,Instream2,Outstream) :- at_end_of_stream(Instream1), at_end_of_stream(Instream2),!. 'Instream1とInstream2を横に連結しInstream3に書き出す'(Instream1,Instream2,Outstream) :- get_line(Instream1,Line1), get_line(Instream2,Line2), 'Outstreamに連結して書き出す'(Outstream,Line1,Line2), 'Instream1とInstream2を横に連結しInstream3に書き出す'(Instream1,Instream2,Outstream). 'Outstreamに連結して書き出す'(Outstream,Line1,Line2) :- sub_atom(Line1,_,1,0,','), write_formatted(Outstream,'%t%t\n',[Line1,Line2]),!. 'Outstreamに連結して書き出す'(Outstream,Line1,Line2) :- \+(sub_atom(Line1,_,1,0,',')), write_formatted(Outstream,'%t,%t\n',[Line1,Line2]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/611 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/www1.axfc.net/uploader/File/so/55622 ←問題文です # http://ime.nu/www1.axfc.net/uploader/File/so/55623 ←datファイルです # # (1) C言語における各文の基本機能に対する設問。 # (例えば、下記の様なもの) # ・変数の宣言、型 # ・代入文 (四則演算、剰余、演算子等を含む) # ・if文 # ・while文 # ・for文 # ・switch/case文 # # (2) 課題による実際のプログラミング。 # ・hドライブのogawaフォルダ配下のkyuuyo.datからデータを入力し、そのデータを # 金額とした時の金種の一覧を表示するプログラムを作成せよ。 #   但し、kyuuyo.datファイルはint型の複数データが格納されたバイナリファイルとする。 'hドライブのogawaフォルダ配下のkyuuyo.datからデータを入力し、そのデータを金額とした時の金種の一覧を表示するプログラムを作成せよ。但し、kyuuyo.datファイルはint型の複数データが格納されたバイナリファイルとする。' :- 'hドライブのogawaフォルダ配下のkyuuyo.datからデータを入力し'(_金額ならび), write(',給与,一万円,五千円,千 円,五百円,百 円,五十円,十 円,五 円,一 円\n'), 'そのデータを金額とした時の金種の一覧を表示する'(1,_金額ならび,0,_,[0,0,0,0,0,0,0,0,0],_). 'hドライブのogawaフォルダ配下のkyuuyo.datからデータを入力し'(_金額ならび) :- open('h:\\ogawa\\kyuuyo.dat',read,instream,[type(binary)]), データを入力(Instream,L), close(Instream). データを入力(Instream,[]) :- at_end_of_stream(Instream),!. データを入力(Instream,[N|R]) :- '4byteづつ入力する'(Instream,[N1,N2,N3,N4]), N is N1 * 256 * 256 * 256 + N2 * 256 * 256 + N3 * 256 + N4, データを入力(Instream,R). '4byteづつ入力する'(Instream,[]) :- !. '4byteづつ入力する'(Instream,[N|R]) :- get_byte(Instream,N), '4byteづつ入力する'(Instream,R). 'そのデータを金額とした時の金種の一覧を表示する'(_,[],_金額合計,_金額合計,LS,LS) :- 金種表示(' ',_金額合計,LS),!. 'そのデータを金額とした時の金種の一覧を表示する'(N,[_金額|R],_金額合計1,_金額合計,LS1,LS) :- _金額合計2 is _金額合計1 + _金額, 金種計算(_金額,_金種ならび,LS1,LS2), 金種表示(N,_金額,_金種ならび), N2 is N + 1, 'そのデータを金額とした時の金種の一覧を表示する'(N2,R,_金額合計2,_金額合計,LS2,LS). 金種計算(_金額,_金種ならび,LS1,LS) :- 金種計算(_金額,[10000,5000,1000,500,100,50,10,5,1],_金種ならび,LS1,LS). 金種計算(_,[],[],[],[]) :- !. 金種計算(K,[K1|R1],[K2|R2],[S1|R3],[S2|R4]) :- K2 is K // K1, K3 is K mod K1, S2 is S1 + K2, 金種計算(K3,R1,R2,R3,R4). 金種表示(N,_金額,_金種ならび) :- write_formatted('%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t\n',[N,_金額|_金種ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/514 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルに保存された携帯電話データをコマンド選択により処理する # 携帯電話情報管理プログラムを作成せよ # # 右のテキストファイルを左のように書き換える(昇順ソート) # 2 SC-02B docomo 12 118     1 003SH softbank 12 139 # 3 IS03 au 13 138        → 2 SC-02B docomo 12 118 # 1 003SH softbank 12 139     3 IS03 au 13 138 # # 鍵情報(Line,_鍵) :- split(Line,[' '],[_,_,_,_鍵]). 切り出し指定行数(100). 昇順併合整列(_対象ファイル) :- tmpnam(_併合ファイル1), open(_併合ファイル1,read,Instream1), open(_対象ファイル,read,Instream), 昇順併合整列(Instream,Instream1,_併合ファイル1,_整列済みファイル), 整列済みファイルの表示(_整列済みファイル). 昇順併合整列(Instream,Instream1,_併合ファイル,_併合ファイル) :- at_end_of_stream(Instream), close(Instream), close(Instream1). 昇順併合整列(Instream,Instream1,_,_併合ファイル) :- tmpnam(_併合ファイル1), 先頭から指定行の整列(100,Instream,_整列したならび), open(_併合ファイル,write,Outstream), 昇順併合整列(_整列したならび,Instream1,_Outstream), close(Outstream), close(Instream1), open(_併合ファイル1,read,Instream2), 昇順併合整列(Instream,Instream2,_併合ファイル1,_併合ファイル). 昇順併合整列(_整列したならび,_整列ファイル,_併合ファイル) :- open(_整列ファイル,read,Instream), open(_併合ファイル,write,Outstream), get_line(Instream,Line), 昇順併合整列(Instream,Outstream,_整列したならび,Line), close(Outstream), close(Instream). 先頭から指定行の整列(Instream,_整列したならび) :- 切り出し指定行数(_切り出し指定行数), get_line(Insteam,Line), 先頭から指定行の切り出し(100,Instream,Line,_100行), 鍵指定整列(_切り出し指定行数,_整列したならび),!. 先頭から指定行の切り出し(1,Instream,Line,[Line]) :- !. 先頭から指定行の切り出し(_,Instream,end_of_file,[]) :- !. 先頭から指定行の切り出し(N,Instream,Line,[Line|R]) :- get_line(Instream,Line2), N1 is N - 1, 先頭から指定行の切り出し(N,Instream,Line2,R). 昇順併合整列(Instream,Outstream,[],end_of_file) :- !. 昇順併合整列(Instream,Outstream,[],Line) :- write_formatted(Outstream,'%t\n',[Line]), get_line(Instream,Line2), 昇順併合整列(Instream,Outstream,[],Line2),!. 昇順併合整列(Instream,Outstream,[A|R],Line) :- A @>= Line, get_line(Instream,Line2), 昇順併合整列(Instream,Outstream,[A|R],Line2),!. 昇順併合整列(Instream,Outstream,[A|R],Line) :- A @< Line, write_formatted(Outstream,'%t\n',[A]), 昇順併合整列(Instream,Outstream,R,Line),!. 昇順併合(Instream1,Instream2,Outstream) :- get_line(Instream1,Line1), get_line(Instream2,Line2), 昇順併合(Instream1,Instream2,Outstream,Line1,Line2). 昇順併合(Instream1,Instream2,Outstream,Line1,Line2) :- 鍵情報(Line1,_鍵1), 鍵情報(Line2,_鍵2), _鍵1 @=< _鍵2, write_formatted(Outstream,'%t\n',[Line1]), get_line(Instream1,Line), 昇順併合(Instream1,Instream2,Outstream,Line,Line2). 昇順併合(Instream1,Instream2,Outstream,Line1,Line2) :- write_formatted(Outstream,'%t\n',[Line2]), get_line(Instream2,Line), 昇順併合(Instream1,Instream2,Outstream,Line1,Line). 整列済みファイルの表示(_整列済みファイル) :- open(_整列済みファイル,read,Instream), get_line(Instream,Line), 整列済みファイルの表示(Instream,Line), close(Instream). 整列済みファイルの表示(_,end_of_file) :- !. 整列済みファイルの表示(Instream,Line) :- write_formatted('%t\n',[Line]), get_line(Instream,Line2), 整列済みファイルの表示(Instream,Line2). 鍵指定昇順整列([],[]) :- !. 鍵指定昇順整列([A|R],L) :- 鍵指定昇順分割(A,R,_Aより小さい,_Aと等しいか大きい), 鍵指定昇順整列(_Aより小さい,L1), 鍵指定昇順整列(_Aと等しいか大きい,L2), append(L1,[A|L2],L). 鍵指定昇順分割(A,[],[],[]) :- !. 鍵指定昇順分割(A,[_行|R],_Aより小さい,_Aと等しいか大きい) :- 鍵情報(A,_鍵1), 鍵情報(_行,_鍵2), _鍵1 @> _鍵2, 鍵指定昇順分割(A,R,[_行|_Aより小さい],_Aと等しいか大きい). 鍵指定昇順分割(A,[_行|R],_Aより小さい,_Aと等しいか大きい) :- 鍵情報(A,_鍵1), 鍵情報(_行,_鍵2), _鍵1 @=< _鍵2, 鍵指定昇順分割(A,R,_Aより小さい,[_行|_Aと等しいか大きい]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/324 # # [1] 授業単元:C++演習2 # [2] 問題文(含コード&リンク): # 下記の文字列が書かれているinput.datからこれらの文字列を1文字ずつ読み込んで、文字数を表示した上で、output.datというファイルに一文字ずつ書き込むプログラムを作成し、 # 実際に実行し、output.datにOJIRETSU= input.datファイル内の文字列が書き込まれていること確認しなさい。 # '下記の文字列が書かれているinput.datからこれらの文字列を1文字ずつ読み込んで、文字数を表示した上で、output.datというファイルに一文字ずつ書き込むプログラムを作成し、実際に実行し、output.datにOJIRETSU= input.datファイル内の文字列が書き込まれていること確認しなさい。' :- open('input.dat',read,Input), open('output.dat',write,Output), '1文字ずつ読み込んで、文字数を表示した上で、output.datというファイルに一文字ずつ書き込む'(0,Input,Output), close(Output), close(Input),!. '1文字ずつ読み込んで、文字数を表示した上で、output.datというファイルに一文字ずつ書き込む'(M1,Input,Output) :- at_end_of_stream(Input),!. '1文字ずつ読み込んで、文字数を表示した上で、output.datというファイルに一文字ずつ書き込む'(M1,Input,Output) :- \+(at_end_of_stream(Input)), get_char(Input,Char), M2 is M1 + 1, 整数から文字列(6,M2,S2), カーソルをPc桁左へ移動(6), カーソルから行の終わりまでを消去, write_formatted('%t',[S2]), put_char(Output,Char), '1文字ずつ読み込んで、文字数を表示した上で、output.datというファイルに一文字ずつ書き込む'(M2,Input,Output),!. カーソルから行の終わりまでを消去 :- put_code(27),write('[K'). カーソルをPc桁左へ移動(Pc) :- put_code(27),write_formatted('[%tD',[Pc]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 134代目 #358 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10471.txt # # ≪問題と条件≫ # 第1引数に指定したファイルからバイナリーモードで1バイトずつファイルを読み込み、 # ファイルの内容を16進数で示したものを第2引数に指定したファイルに書き込むプログラムを作成せよ。ただし、16バイトごとに改行を入れること。 '第1引数に指定したファイルからバイナリーモードで1バイトずつファイルを読み込み、ファイルの内容を16進数で示したものを第2引数に指定したファイルに書き込む。 ただし、16バイトごとに改行を入れる'(_入力バイナリファイル,_出力16進表示テキストファイル) :- '入力ファイルはバイナリーモード、出力ファイルはテキストモード'(_入力バイナリファイル,_出力16進表示テキストファイル,Input,Output), '1バイトずつファイルを読み込み、16進数で示したもの書き込む。ただし、16バイトごとに改行を入れる'(Input,Output), ストリームを閉じる(Input,Output). '入力ファイルはバイナリーモード、出力ファイルはテキストモード'(_入力バイナリファイル,_出力16進表示テキストファイル,Input,Output) :- '入力ファイルはバイナリーモード、'(_入力バイナリファイル,Input), '出力ファイルはテキストモード'(_出力16進表示テキストファイル,Output). '入力ファイルはバイナリーモード、'(_入力バイナリファイル,Input) :- open(_入力バイナリファイル,read,Input,[type(binary)]). '出力ファイルはテキストモード'(_出力16進表示テキストファイル,Output) :- open(_出力16進表示テキストファイル,write,Output). ストリームを閉じる(Input,Output) :- close(Input), close(Output). '1バイトずつファイルを読み込み、16進数で示したもの書き込む。ただし、16バイトごとに改行を入れる'(Input,Output) :- forall('16バイト分、1バイトずつファイルを読み込み、16進数で示したものを書き込む'(Input,Output), 改行を入れる(Output)). '16バイト分、1バイトずつファイルを読み込み、16進数で示したものを書き込む'(Input,Output) :- findnsols(16,1,'1バイトずつファイルを読み込み、16進数で示したものを書き込む'(Input,Output),_). '1バイトずつファイルを読み込み、16進数で示したものを書き込む'(Input,Output) :- repeat, ( at_end_of_stream(Input),!,fail; '1バイトファイルを読み込み、16進数で示したものを書き込む'(Input,Output)). '1バイトファイルを読み込み、16進数で示したものを書き込む'(Input,Output) :- '1バイトファイルを読み込み、'(Input,_1バイト), '16進数で示したものを書き込む'(Output,_1バイト). '1バイトファイルを読み込み、'(Input,_1バイト) :- get_byte(Input,_1バイト). '16進数で示したものを書き込む'(Output,_1バイト) :- '16進数で示したものを'(_1バイト,_16進数文字列), 書き込む(Output,_16進数文字列). '16進数で示したものを'(_1バイト,_16進数文字列) :- 上位桁の16進数文字列変換(_1バイト,_16進数上位桁文字列), 下位桁の16進数文字列変換(_1バイト,_16進数下位桁文字列), atomic_list_concat([_16進数上位桁文字列,_16進数下位桁文字列,' '],_16進数文字列). 上位桁の16進数文字列変換(_1バイト,_16進数上位桁文字列) :- X is _1バイト // 16, '16進数文字コード'(X,_16進数上位桁文字列). 下位桁の16進数文字列変換(_1バイト,_16進数下位桁文字列) :- Y is _1バイト mod 16, '16進数文字コード'(Y,_16進数下位桁文字列). '16進数文字コード'(15,'F') :- !. '16進数文字コード'(14,'E') :- !. '16進数文字コード'(13,'D') :- !. '16進数文字コード'(12,'C') :- !. '16進数文字コード'(11,'B') :- !. '16進数文字コード'(10,'A') :- !. '16進数文字コード'(N,C) :- atom_number(C,N). 書き込む(Output,_16進数文字列) :- write(Output,_16進数文字列). 改行を入れる(Output) :- write(Output,'\n'). % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(L1,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1) :- shs('ls -N *.txt',L1). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([],_,_). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_テキストファイル名|R1],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_|R1],_指定した科目,_指定した点数) :- 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(R1,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号) :- get_split_lines(_テキストファイル名,[' ',':'],L), member([_指定した科目,_指定した点数],L), 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1279286575/358 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):入力ファイルと出力ファイル名をコマンドラインから入力してコピーするプログラムを作成せよ。 # program :- 入力ファイルと出力ファイル名をコマンドラインから入力してコピーする. 入力ファイルと出力ファイル名をコマンドラインから入力してコピーする :- user_parameters([_入力ファイル,_出力ファイル]), open(_入力ファイル,read,Input,[type(binary)]), open(_出力ファイル,write,Output,[type(binary)]), コピーする(Input,Output), close(Output), close(Input). コピーする(Input,Output) :- 終了(Input),!. コピーする(Input,Output) :- get_byte(Input,C), put_byte(Output,C), コピーする(Input,Output). 終了(Stream) :- at_end_of_stream(Stream). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/293 # # 【 課題 】テキストファイルをあらかじめ作っておいて、その内容を表示しながら # 別のファイルにコピーするプログラムを書け。 # コマンド例(file_a.txtからfile_b.txtへコピーする) # 内容例 # 123456 # 234567 # abcdefg 'テキストファイルをあらかじめ作っておいて、その内容を表示しながら別のファイルにコピーする'(_入力ファイル,_出力ファイル) :- open(_入力ファイル,read,Input), open(_出力ファイル,write,Output), '内容を表示しながら別のファイルにコピーする'(Input,Output), close(Output), close(Input),!. '内容を表示しながら別のファイルにコピーする'(Input,_) :- at_end_of_stream(Input),!. '内容を表示しながら別のファイルにコピーする'(Input,Output) :- 読み込んだ行を表示しながらコピーする(Input,Output). 読み込んだ行を表示しながらコピーする(Input,Output) :- 読み込んだ行を(Input,_行), 表示しながら(_行), コピーする(Output,_行), '内容を表示しながら別のファイルにコピーする'(Input,Output). 読み込んだ行を(Input,_行) :- get_line(Input,_行). get_line(Input,Line) :- read_line_to_codes(Input,Codes), atom_codes(Line,Codes). 表示しながら(_行) :- writef('%t\n',[_行]). コピーする(Output,_行) :- format(Output,'~w\n',[_行]). % 以下のサイトは # 入力ファイルを読み込み、顧客別売上明細書を出力する # # ・支店が変われば、支店合計を印字し改ページをする # ・顧客が変われば、顧客合計を印字し、1行空白を印字する # ・入力ファイルはソートされているものとする # ・入力ファイル、出力ファイルはコマンドライン引数で受け取る # ・20行を超える場合は、改ページする #  ただし、合計出力途中の場合は20行を超えていても出力する # ・金額出力時のカンマ編集をする # # ・例外処理は、コマンドライン引数が正しくない場合、入力・出力ファイルがオープンできない場合、入力ファイルにデータがない場合の4種類 # # ・突合せ処理(コントロールブレイク>)を使用する # # ・入力ファイルの支店コードから売上金額までクラス分けをする # (クラス分けがよく解りませんが、Cの構造体のようなものを使用せよと言われました) # # ・例外処理を書いたメインメソッド、突合せ処理メソッド、ヘッダメソッドの3つに分ける # # 下記の処理をヘッダメソッドとする # ここから # 帳票明細 # 001 東京 支店 出力日6月21日(出力した日)  P.1 # (空白行 1行) # 販売先 販売日 販売金額 # --------------------------------------------------------------- # ここまで # # # # ☆入力ファイル例 # ?支店コード ?支店名 ?販売日 ?販売先コード ?販売先名 ?売上金額 # # # 001 東京 20090601 0001 田中商店  1000 # 001 東京 20090602 0001 田中商店  5000 # 001 東京 20090603 0001 田中商店  10000 # 001 東京 20090601 0002 山田スーパー  3000 # 002 沖縄 20090604 0001 沖縄商店  7000 # ☆出力ファイル例 # # 帳票明細 # # 001 東京 支店 出力日6月21日(出力した日)  P.1 # (空白行 1行) # 販売先 販売日 販売金額 # --------------------------------------------------------------- # 0001 田中商店 6月1日 1,000 # 0001 田中商店 6月2日 5,000 # 0001 田中商店 6月3日 10,000 # ---------------------------------------------------------------- # 販売合計 件数 3 16,000 # (空白行 1行) # 0002 山田スーパー 6月1日 3,000 # ---------------------------------------------------------------- # 販売合計 件数 1 3,000 # (空白行 1行) #    **支店合計 件数 4 19,000 # # # # # 帳票明細 # 002 沖縄 支店 出力日6月21日(出力した日)  P.2 # (空白行 1行) # 販売先 販売日 販売金額 # ---------------------------------------------------------------- # 0001 沖縄商店 6月4日 7,000 # ---------------------------------------------------------------- # 販売合計 件数 1 7,000 # (空白行 1行) #    **支店合計 件数 1 7,000 #    ***総合計 件数 5 26,000 # # # # 入力ファイルを以下のように変更しましょう。 顧客別売上明細書を出力する :- 入力ファイルを読み込む(F1,F2,F3,L1,L2,L3), コントロールブレイク(L1,L2,L3,0,0,0,0,0,0,0). 入力ファイルを読み込む(F1,F2,F3,L1,L2,L3) :- ファイルを全行読み取る(F1,L1), ファイルを全行読み取る(F2,L2), ファイルを全行読み取る(F3,L3). コントロールブレイク([L1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(6,L1,[],L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,L1,L2,L3), write('---------------------------------------------------------------\n'), 改頁制御(_頁1,_頁2,_行1,_行2,L2,L3), 販売先合計表示(_行2,_行3,CX5,SX5), 改頁制御(_頁2,_頁3,_行3,_行4), 支店合計表示(_行4,_行5,CX4,SX4), 改頁制御(_頁3,_頁4,_行5,_行6), 総合計表示(_行3,_,CX3,SX3),!. コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(1,L1,L12,L2,L3), 合計加算(L1,SX1,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,[K|R11],L2,L3), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁1,_行1,CX4,CX5,CX6,SX4,SX5,SX6). コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(2,L1,L12,L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,L1,L2,L3), 販売先合計表示(_頁1,_頁2,_行1,_行2,CX5,SX5), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁2,_行2,CX,0,CX6,SX4,0,SX6). コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(3,L1,L12,L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細印刷(_頁,_頁1,_行,_行1,L1,L2,L3), 販売先合計表示(_頁1,_頁2,_行2,_行3,CX5,SX5), 支店合計表示(_頁2,_頁3,_行4,_行5,CX4,SX4), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁3,0,0,0,CX3,0,0,SX3),!. コントロールブレイク([L1|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(4,L1,_,L2,L3), コントロールブレイク([L1|R1],R2,[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3),!. コントロールブレイク([L1|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(5,L1,_,L2,L3), コントロールブレイク([L1|R1],[L2|R2],R3,_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3). コントロールブレイクパターン(1,L1,L12,L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(売上明細,L12,[KL1,KL11|_]), 鍵項目(支店名,L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. コントロールブレイクパターン(2,L1,L12,L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(売上明細,L12,[KL1,KL12|_]), not(KL11=KL12), 鍵項目(支店名L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. コントロールブレイクパターン(3,L1,L12,_,_) :- 鍵項目(売上明細,L1,[KL1,_|_]), 鍵項目(売上明細,L12,[KL12,_|_]), not(KL1=KL12),!. コントロールブレイクパターン(4,L1,_,L2,_) :- 鍵項目(売上明細,L1,[KL1|_]), 鍵項目(支店名,L2,[KL2|_]), KL1 @> KL2,!. コントロールブレイクパターン(5,L1,_,_,L3) :- 鍵項目(売上明細,L1,[_,KL11|_]), 鍵項目(販売先名,L3,[KL3|_]), KL11 @> KL3,!. コントロールブレイクパターン(6,L1,[],L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(支店名,L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. 鍵項目(売上明細,[_支店コード,_,_販売先コード|_],[_支店コード,_販売先コード]). 鍵項目(支店名,[_支店コード|_],[_支店コード]). 鍵項目(販売先名,[_販売先コード|_],[_販売先コード]). 明細行表示(_頁,_次の頁,0,_次の行,L1,L2,L3) :- 鍵項目(支店名,L2,[_支店コード,_支店名|_]), 今日(_今日), sub_atom(_今日,4,2,_,_月), sub_atom(_今日,6,2,_,_日), 支店名見出し(_支店コード,_支店名,_月,_日,_頁), 明細行表示(_頁,_頁,0,6,L1,L2,L3),!. 明細行表示(_頁,_次の頁,_行,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3) :- _行 > 20, _頁1 is _頁 + 1, 明細行表示(_頁1,_次の頁,1,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3),!. 明細行表示(_頁,_頁,_行,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3) :- _行 < 20, sub_atom(_販売日,4,2,_,_月), sub_atom(_販売日,6,2,_,_日), カンマの挿入(10,_売上金額,_カンマ付き売上金額), write_formatted('%4d %-30s%2d月%2d日 %t\n',[_販売先コード,_販売先名,_月,_日,_カンマ付き販売金額]), _次の行 is _行 + 1,!. 支店合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _頁1 is _頁 + 1, 支店合計表示(_頁1,_次の頁,1,_次の行,_件数,_合計),!. 支店合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計金額,_カンマ付き合計金額), write(' **支店合計 件数 %2d %t\n',[_件数,_カンマ付き合計金額]),!. 販売先合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _頁1 is _頁 + 1, 販売先合計表示(_頁1,_次の頁,1,_次の行,_件数,_合計),!. 販売先合計表示(_頁,_頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計金額,_カンマ付き合計金額), write(' 販売合計 件数 %2d %t\n',[_件数,_カンマ付き合計金額]),!. 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _次の頁 is _頁 + 1, 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計),!. 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計,_カンマ付き合計), write_formatted(' 総合計 %t\n',[_カンマ付き合計]). 帳票明細見出し :- write('\n 帳票明細\n'). 支店名見出し(_支店コード,_支店名,_月,_日,_頁) :- write_formatted('\n%t %t 出力日%2d月%2d日 P.2d\n\n',[_支店コード,_支店名_月,_日,_頁]), write(' 販売先 販売日 販売金額\n'). write('---------------------------------------------------------------\n'). 明細行項目(L1,_支店コード,_販売日,_販売先コード,_売上金額) :- sub_atom(L1,0,3,A1),atom_to_term(A1,_支店コード), sub_atom(L1,3,8,A2),A2 = _販売日, sub_atom(L1,11,6,A3),atom_to_term(A3,_販売先コード), sub_atom(L1,19,8,A4),atom_to_term(A4,_売上金額). 支店名項目(L2,_支店コード,_支店名) :- sub_atom(L2,0,3,A1),atom_to_term(A1,_支店コード), sub_atom(L2,3,10,_支店名). 販売先名項目(L3,_販売先コード,_販売先名) :- sub_atom(L3,0,6,A),atom_to_term(A3,_販売先コード), sub_atom(L3,6,30,_販売先名). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% カンマの挿入(_表示桁数,_数値,_表示文字列) :- number(_数値), number_codes(_数値,Codes), atom_codes(_数値文字列,Codes), カンマの挿入(_表示桁数,_数値文字列,_表示文字列),!. カンマの挿入(_表示桁数,_数値文字列,_表示文字列) :- atom_chars(_数値文字列,_数値文字ならび), 正数部の長さ(_数値文字ならび,_数値桁数), カンマの挿入の二(_数値桁数,_数値文字ならび,_空白のない数値ならび), length(_空白のない数値ならび,_空白のない数値ならびの桁数), _空白数 is _表示桁数 - _空白のない数値ならびの桁数, 空白文字を連結する(_空白数,_空白のない数値ならび,_表示文字列),!. カンマの挿入の二(0,X,X) :- ! . カンマの挿入の二(1,X,X) :- ! . カンマの挿入の二(N,[-|R],[-|R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[ |R],[ |R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[A|R],[A,,|R1]) :- M is N - 1, 0 is M mod 3, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[A|R],[A|R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . 正数部の長さ([],0) :- !. 正数部の長さ([.|_],0) :- !. 正数部の長さ([_|R],N) :- 正数部の長さ(R,M), N is M + 1,!. 空白文字を連結する(N,[_|R],_表示文字列) :- N < 0, M is N + 1, 空白文字を連結する(M,R,_表示文字列),!. 空白文字を連結する(0,_表示文字ならび,_表示文字列) :- 文字列の結合(_表示文字ならび,_表示文字列),!. 空白文字を連結する(N,_表示文字ならび,_表示文字列) :- M is N - 1, 空白文字を連結する(M,[' '|_表示文字ならび],_表示文字列),!. 改頁 :- char_code(C,12), write_formatted('%c',[C]),!. ファイルから全行読み取る(_ファイル,_全行) :- open(_ファイル,read,_ストリーム), ストリームから全行読み取る(_ストリーム,_全行), close(_ストリーム). ストリームから全行読み取る(_ストリーム,[]) :- at_end_of_stream(_ストリーム),!. ストリームから全行読み取る(_ストリーム,_全行) :- ストリームから全行読み取って行く(_ストリーム,_全行). ストリームから全行読み取って行く(_ストリーム,[_行|R]) :- 行入力(_ストリーム,_行), ストリームから全行読み取る(_ストリーム,R). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは get_bytes(_ファイル,Bytes) :- open(_ファイル,read,Instream,[type(binary)]), findall(Byte,( repeat,( at_end_of_stream(Instream), !, fail; get_byte(Instream,Byte))), Bytes), close(Instream),!.