このディレクトリの索引

% 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1245853701/ # [1] 授業単元:C言語実習 # [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin /joyful/img/9658.txt # {5,21,4,14,12}, # {25,20,15,3,7}, # {24,11,6,1,13}, # {16,2,17,19,8}, # {23,18,22,9,10} # # の横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替え(上が小さくな るように) # 結果を出力 # # 結果は # # 5 21 4 14 12 # 25 20 15 3 7 # 24 11 6 1 13 # 16 2 17 19 8 # 23 18 22 9 10 # # のような形で出力 '横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えて出力する'(_ファイル) :- 行列に入力する(_ファイル,_行列1), '横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えてW得点データをバブルソートを用いて国語の得点の大きい順に並び替えよ出力する'(_行列1,_行列2), 出力する(_行列2),!. '横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えて出力する'(_行列1,_行列2) :- 各行を整列する(_行列1,_行列3), 縦の各列を整列する(_行列3,_行列2). 行列に入力する(_ファイル,_行列) :- get_split_lines(_ファイル,['{',',','}'],_行列). 各行を整列する([],[]) :- !. 各行を整列する([_行|R1],[_整列された行|R2]) :- quicksort(_行,_整列された行), 各行を整列する(R1,R2). 縦の各列を整列する(_行列1,_行列2) :- 転置(_行列2,_行列3), 各行を整列する(_行列3,_行列4), 転置(_行列4,_行列2). 出力する(_行列2) :- append(L0,[L|R],_行列2), concat_atom(L,' ',S), writef('%t\n',[S]), R = []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines) . get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat , get_line(Line) , (Line = end_of_file , (!) , fail ; true)), Lines). get_chars(File,L) :- \+(is_stream(_,File,_)), exists(File,read), open(File,read,Input), get_char(Input,X), get_chars(Input,X,L), close(Input),!. get_chars(Input,L) :- is_stream(_,Input,_), get_char(Input,X), get_chars(Input,X,L),!. get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. 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,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). get_line_3(_,'連続','\n',[]) :- !. get_line_3(Instream,_診断,'\r',X) :- get_char(Instream,C2), get_line_3_2(Instream,_診断,C2,X),!. get_line_3(Instream,'終了',end_of_file,[]) :- !. get_line_3(Instream,_診断,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,_診断,C2,R). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). get_chars(L) :- findall(U,( repeat , get_char(U) , (U = end_of_file , (!) , fail ; true)), L). get_line(Instream,_診断,X) :- get_char(Instream,C), get_line_3(Instream,_診断,C,Chars), atom_chars(X,Chars),!. get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. 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,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). get_line_3(_,'連続','\n',[]) :- !. get_line_3(Instream,_診断,'\r',X) :- get_char(Instream,C2), get_line_3_2(Instream,_診断,C2,X),!. get_line_3(Instream,'終了',end_of_file,[]) :- !. get_line_3(Instream,_診断,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,_診断,C2,R). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). get_line_3_2(Instream,'連続','\n',[]) :- !. get_line_3_2(Instream,'連続',C,['\r'|R]) :- \+(C == '\n'), get_line_3(Instream,_診断,C,R),!. split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not 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_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), number(C,Nl),!. split_5(B,C) :- concat_atom(B,C),!. split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42([],[],'',_,[]) :- !. split_42([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. number(A,B) :- number_codes(A,B). numeric_list([],[]) :-!. numeric_list([A|R],[B|R1]) :- digit(A), char_code(A,B), numeric_list(R,R1),!. numeric_list(['.'|R],[46|R1]) :- numeric_list(R,R1),!. numeric_list([-|R],[45|R1]) :- numeric_list(R,R1),!. 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % *** user: quicksort / 2 *** quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Bigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). quicksort([],[]). partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y, partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y, partition(Xs,Y,Ls,Bs). partition([],Y,[],[]). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1245853701/822 # 何人かの学生の3教科(数学、国語、英語)の得点を2次元配列を用いて # 処理するプログラムを作る。 # # (1)科目別の最高点、最低点を表示する。 # (2)各学生の3教科の平均点を表示する。 # (3)各教科の平均点を表示する。 # # ただし Ctrl+zが押されるまで次々と整数値を読み込んでいくものとする。 % テーマ findallを使った集約処理 '何人かの学生の3教科(数学、国語、英語)の得点を2次元配列を用いて 処理するプログラムを作る。 (1 )科目別の最高点、最低点を表示する。 (2)各学生の3教科の平均点を表示する。 (3)各教科の平均点を表示する。 ただし Ctrl+zが押されるまで次々と整数値を読み込んでいくものとする。' :- 'Ctrl+zが押されるまで次々と整数値を読み込んでいく'(_整数行列), '(1 )科目別の最高点、最低点を表示する。 '(_整数行列), '(2)各学生の3教科の平均点を表示する。 '(_整数行列), '(3)各教科の平均点を表示する。 '(_整数行列). 'Ctrl+zが押されるまで次々と整数値を読み込んでいく'(_整数行列) :- findall(_行,( get_split_line([','],_行)), _整数行列). '(1 )科目別の最高点、最低点を表示する。 '(_整数行列) :- 転置(_整数行列,[_学年ならび|LL]), forall(( nth1(_nth1,LL,L), 最高点と最低点を得る(L,_最高点,_最低点)), 表示する('科目番号:%t 最高点:%t 最低点:%t\n',[_nth1,_最高点,_最低点])). 最高点と最低点を得る([A|R],_最高点,_最低点) :- 最高点を得る(R,A,_最高点), 最低点を得る(R,A,_最低点). 最高点を得る([],_最高点,_最高点). 最高点を得る([N|R],_最高点_1,_最高点) :- N > _最高点_1, 最高点を得る(R,N,_最高点). 最高点を得る([N|R],_最高点_1,_最高点) :- N =< _最高点_1, 最高点を得る(R,_最高点_1,_最高点). 最低点を得る([],_最低点,_最低点). 最低点を得る([N|R],_最低点_1,_最低点) :- N < _最低点_1, 最低点を得る(R,N,_最低点). 最低点を得る([N|R],_最低点_1,_最低点) :- N >= _最低点_1, 最低点を得る(R,_最低点_1,_最低点). '(2)各学生の3教科の平均点を表示する。 '(_整数行列) :- forall(( nth1(_nth1,_整数行列,[_|R]), 相加平均(R,_相加平均)), writef('学生:%t 3教科の平均点:%t\n',[_nth1,_相加平均])). '(3)各教科の平均点を表示する。 '(_整数行列) :- 転置(_整数行列,[_学年ならび|LL]), forall(( nth1(_nth1,LL,L), 相加平均(L,_相加平均)), 表示する('科目番号:%t 平均点:%t\n',[_nth1,_相加平均])). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0,M). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). get_split_line(File,Splitter,List) :- get_split_lines(File,Splitter,Lines), member(List,Lines) . get_split_line(Splitters,List) :- get_line(Line), split(Line,Splitters,List). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1('\z',[]) :- !. get_line_1(end_of_file,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). 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), number(C,Nl),!. split_5(B,C) :- atomic_list_concat(B,C),!. split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42([],[],'',_,[]) :- !. split_42([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. numeric_list([],[]) :- !. numeric_list([A|R],[B|R1]) :- digit(A), char_code(A,B), numeric_list(R,R1),!. numeric_list(['.'|R],[46|R1]) :- numeric_list(R,R1),!. numeric_list([-|R],[45|R1]) :- numeric_list(R,R1),!. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1247438792/689 # [2] 問題文(含コード&リンク): POSデータ解析システムを作ってみよう # K氏は、3つのコンビニエンスストア(X店、Y店、Z店)をチェーン店に持つオーナーです。コンビ # ニエンスストアの経営において、売れ筋商品と死に筋商品の的確な把握は死活問題に直結する重要な業務 # です。そこでK氏は、チェーン店に、毎日どんな商品がどれくらい売れたのかといった販売情報を、CS # Vファイルとして送るように指示していました。しかし、送られてくるデータファイルは膨大であり、そ # れらを統合して、全店を通して最も売れた商品はどれで、何が売れていないかを把握することは困難でし # た。つまり、送られてくるデータを適切に活用できないでいました。そこで、K氏はあなたに、こういっ # たことを解決するシステム(POSデータ解析システム)を開発するように頼みました。K氏は、毎日送 # られてくるX、Y、Z店の個別の販売情報を合計した一括データを入手したいそうです。 # <第1ステップ> # まず、あなたは、各店舗から送ってもらうCSV ファイル名を以下のようにするよう、お願いしました。 # X店=data-x.csv Y店=data-y.csv Z店=data-z.csv # また、商品名(全100 品種)は必ず以下の形式で入力するように指示しました。 # 「 Item-00 」から「 Item-99 」までの半角7文字 # さらに、各店から送られてくるレコードのフィールドは、以下の項目にして、売上時刻順に並べてもら # うよう、お願いしました。以下のようなCSV ファイルが送られてくることになります。 # 売上時刻 商品名 売上個数 # 0:12,Item-42,2 # 0:12,Item-03,1 # 0:49,Item-92,3 # ・ # ・ # 23:38,Item-80,1 # また、毎日送られてくるCSVファイルとは別に、単価情報が格納された tanka.csv ファイルを作りま # した。このファイルのレコードのフィールドは、次のようになっていて、商品名順に並んでいます。 # 商品名 単価 # Item-00,150 # Item-01,120 # ・ # Item-99,230 # 最後に、K 氏に提供する統合ファイル(data-all.csv)のレコードの中身は以下のようにして、商品名 # の小さい順にレコードを作りました。 # 商品名 単価 総売上個数 売上高 # ここで、大事なことは、売上情報を統合することです。例えば、単価150 円のItem-23 という商品が、 # X 店では15 個、Y 店では、25 個、Z 店では10 個売れたとすると、以下のようになっているということです。 # Item-23,150,50,7500 # また、全店舗を通して1 個も売れなかった商品情報は載せないことにしました。 # # # <第2ステップ> # K氏から、data-all.csv のレコードの中身を以下のように変更し、レコードを並べる順番も、これまで # の商品名順ではなく、売上順位の高い順にして欲しいと要望がありました。 # 売上順位 商品名 単価 総売上個数 売上高 全売上高にしめる割合(%) # 全売上高とは、全商品の売上高の合計です。全売上高にしめる割合の有効数字は4 桁(10%未満の場合は # 3 桁)にします。例えば、全売上高が100 万円で、該当商品の売上高が12,345 円だとすると、割合(%) # は 1.23 となります。 # 売上順位は、同じ売上高の場合は同一順位とします。 # 例えば、data-all.csv ファイルは次のようになります。 # 1,Item-23,150,50,7500,10.71 # 2,Item-52,240,30,7200,10.28 # 2,Item-53,360,20,7200,10.28 # 4,Item-14,230,30,6900,9.85 # ・ t589_1 :- 基礎情報を得る(TL,XL,YL,ZL), 3つのコンビニエンスストアの情報を集約する第1ステップ(XL,YL,ZL,TL,_集約ならび), _集約情報から統合ファイル出力(_集約ならび). t589_2 :- 基礎情報を得る(TL,XL,YL,ZL), 3つのコンビニエンスストアの情報を集約する第2ステップ(XL,YL,ZL,TL,_集約ならび), 集約情報から金額順位順統合ファイル出力(_集約ならび). 基礎情報を得る(TL,XL,YL,ZL) :- get_split_lines('tanka.csv',[',',' '],TL), get_split_lines('data-x.csv',[',',' '],XL), get_split_lines('data-y.csv',[',',' '],YL), get_split_lines('data-z.csv',[',',' '],ZL),!. '3つのコンビニエンスストアの情報を集約する第1ステップ'(XL,YL,ZL,TL,_集約ならび) :- append(XL,YL,ZL,L1), 売上の存在する商品名を得る(L1,_商品名ならび), findall([_商品名,_単価,_数量,_金額], ( member(_商品名,_商品名ならび), member([_商品名,_単価],TL), 商品合計数量を得る(_商品名,_合計数量), _金額 is _合計数量 * _単価), _集約ならび). '3つのコンビニエンスストアの情報を集約する第2ステップ'(XL,YL,ZL,TL,_集約ならび) :- append(XL,YL,ZL,L1), 売上の存在する商品名を得る(L1,_商品名ならび), findall([_商品名,_単価,_数量,_金額], ( member(_商品名,_商品名ならび), member([_商品名,_単価],TL), 商品合計数量を得る(_商品名,_合計数量), _金額 is _合計数量 * _単価), _集約ならびの一), rsort(_集約ならびの一,_金額合計で整列した集約ならび), 総売上金額を得る(_集約ならびの一,_総売上金額), 順位売上比率付き集約ならび(1,1,_金額合計で整列した集約ならび,_集約ならび). 総売上金額を得る(_集約ならびの一,_総売上金額) :- findsum(_金額合計,member([_金額合計,_,_,_],_集約ならびの一),_総売上金額). 順位売上比率付き集約ならび(_,_,_,[],[]) :- !. 順位売上比率付き集約ならび(M,N,_総売上金額,[[A,B,C,D],[A|R2]|R3],[[M,B,C,D,A,E]|R4]) :- E is A / _総売上金額, N2 is N + 1, 順位売上比率付き集約ならび(M,N2,[[A|R2]|R3],R4). 順位売上比率付き集約ならび(M,N,_総売上金額,[[A,B,C,D]|R3],[[M,B,C,D,A,E]|R4]) :- E is A / _総売上金額, N2 is N + 1, 順位売上比率付き集約ならび(N2,N2,R3,R4). 集約情報から統合ファイル出力(L) :- open('data-all.csv',write,Output), ( member([_商品名,_単価,_数量,_金額],L), concat_atom([_商品名,_単価,_数量,_金額],',',S), writef(Output,'%t\n',[S]), fail; close(Output), ),!. 集約情報から金額順位順統合ファイル出力([]). 集約情報から金額順位順統合ファイル出力([[A,B,C,D,E,F]|R]) :- F2 is round(F * 100.0) / 100, writef_atom(S,'%t,%t,%t,%t,%t,%.2f',[A,B,C,D,E,F2]), writef('%t\n',[S]), 集約情報から金額順位順統合ファイル出力(R). 商品合計数量を得る(_商品名,_合計数量) :- findsum(_数量,member([_,_商品名,_数量],_合計数量). 売上の存在する商品名を得る(L1,_整列してユニークな商品名ならび) :- 商品名のみ選択(L1,L2), sort(L2,_整列してユニークな商品名ならび). 売上の存在する商品名を得る(L1,_商品名ならび), member(_商品名,_商品名ならび), findall([_商品名,_単価,_数量,_金額], ( member([_商品名,_単価],TL), member([_,_商品名,_数量],L1), _金額 is _数量 * _単価), _集約ならび). 売上の存在する商品名を得る(L1,_整列してユニークな商品名ならび) :- 商品名のみ選択(L1,L2), sort(L2,_整列してユニークな商品名ならび). 商品名のみ選択([],[]) :- !. 商品名のみ選択([[_,A,_]|R1],[A|R2]) :- 商品名のみ選択(R1,R2). rsort(L,L2) :- sort(L,L1), reverse(L1,L2). writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1247438792/964 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9898.txt # 課題: # 文字数・単語数・行数を数えるプログラム # 内容: # 指定されたファイルに含まれる、 # ・行数 # ・文字数 # ・文字毎の出現回数 # ・単語数 # ・単語毎の出現回数 # を判定し、ディスプレイ表示させる。 # # 単語については、1単語をどのように判定するかの定義付けをし、 # その定義に従って単語を取り出す。 # 指定ファイル: http://nojiriko.asia/data/You_Raise_Me_Up.txt にコピーさせてもらいました。 t631 :- wc(File,_行数,_文字数,_頻度と文字のならび,_単語数,_頻度と語彙のならび), writef('行数 = %t,文字数 = %t\n',[_行数,_文字数]), 頻度付き文字ならびの表示(_頻度と文字のならび), writef('単語数 = %t,\n',[_単語数]), 頻度付き語彙ならびの表示(_頻度付き語彙ならび),!. wc(File,_行数,_文字数,_頻度と文字のならび,_単語数,_頻度と語彙のならび) :- 行と語彙数の計測(File,_行数,_単語数,_頻度と語彙のならび), 文字数の計測(File,_小文字語ならび,_文字数,_頻度と文字のならび). 行と語彙数の計測(File,_行数,_単語数,_頻度と語彙のならび) :- get_split_lines(File,[' ',':','?','.',',','(',')'],Lines), flat(Lines,Words), to_lowers(Words,Words2), 二分木作成(Words2), 二分木から頻度と値を取り出す(1,_頻度付き語彙ならび), length(Lines,_行数), length(_頻度付き語彙ならび,_単語数),!. 文字数の計測(File,_小文字語ならび,_文字数,_頻度と文字のならび) :- get_chars(File,Chars), length(Chars,文字数), 二分木作成(Chars), 二分木から頻度と値を取り出す(1,_頻度付き文字ならび),!. 頻度付き文字ならびの表示([[_頻度,_文字|R]) :- writef('%t (%t),\n',[_文字,_頻度]), 頻度付き文字ならびの表示(R). 頻度付き語彙ならびの表示([[_頻度,_語彙|R]) :- writef('%t (%t),\n',[_語彙,_頻度]), 頻度付き語彙ならびの表示(R). 二分木作成(_整数ならび) :- abolish(節/5), 二分木作成(_整数ならび,1,1,_). 二分木作成([],_,_,_). 二分木作成([_値|R],_節,_開始節番号,_次の節番号) :- 節作成(_値,_節,_開始節番号,_受取節番号), 二分木作成(R,_節,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- not(節(_節,_,_,_,_)), _下 is _受取節番号+1, _右 is _受取節番号+2, _次の節番号 is _受取節番号+3, assertz(節(_節,_下,_右,1,_値)),!. 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_下,_右,_頻度2,_値2), _値 = _値2, _頻度3 is _頻度2 + 1, retract(節(_節,_下,_右,_頻度2,_値2)), assertz(節(_節,_下,_右,_頻度3,_値2)),!. 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_下,_右,_,_値2), _値 @> _値2, 節作成(_値,_下,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_下,_右,_,_値2), _値 @< _値2 , 節作成(_値,_右,_受取節番号,_次の節番号). 二分木から値と頻度を取り出す(_木の根,_頻度と値ならび) :- findall([_頻度,_値],二分木から値と頻度を取り出す(_木の根,_,頻度,_,_値),_頻度と値ならび). 二分木から頻度と値を取り出す(_木の根,_頻度1,_頻度,_値1,_値) :- 根(_木の根,_下,_,_頻度2,_値2), 二分木から頻度と値を取り出す(_下,_頻度2,_頻度,_値2,_値). 二分木から頻度と値を取り出す(_木の根,_頻度1,_頻度,_値1,_値) :- 根(_木の根,_,_右,_頻度2,_値2), 二分木から頻度と値を取り出す(_右,_,頻度,_,_値). 二分木から頻度と値を取り出す(_木の根,_頻度1,_頻度,_値1,_値) :- not(var(_値1)), not(var(_頻度1)), _頻度1=_頻度, _値1=_値. to_lowers([],[]) :- !. to_lowers([A|R1],[B|R2]) :- to_lower(A,B), to_lowers(R1,R2). flat([],[]) :- ! . flat([A|R],L) :- list(A),!, flat(A,L1), flat(R,L2), append(L1,L2,L). flat([A|R],[A|R1]) :- flat(R,R1). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1250204272/907 # [1] C言語とアルゴリズム # [2] 選択型処理 あるお店では会員制をとっている。会員には一般会員と特別会員があり、 # 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 # 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。 # この店のある日のデータ(data03.dat)が与えられたとき、実行例のような出力が得られるプログラムを作成しなさい。 # ただし、data03.datには以下の形式で会員種別と購入金額が記載されているものとする。 # [会員種別(1桁) 購入金額] # ここで、会員種別は1が一般会員、2が特別会員、3が非会員を表す。 # 会員種別の判定にはswitch文を用い、一般会員は「会」、特別会員は「特」、 # 非会員は「非」と表しなさい。 # # [data03.dat] http://prolog.asia/data/data03.dat # 『実行例』 # 種別  購入金額(円)  支払い金額(円)   # 会     3200        2880    ←一般会員は1割引き # 特     2400        1680    ←特別会員は3割引き # 非     4800        4800    ←非会員は通常割り引かない # 特     6500        4550 # 会     10800 9720 # 特     18200 12740 # 非    21400 20400    ←非会員も購入金額が15000円以上なら1000円引き # 会     890 801 # 会     3900        3510 # 特     6200        4340 # ----------------------------------------- # 合計    78290        65421 ←最後の行に合計を出力すること 'あるお店では会員制をとっている。会員には一般会員と特別会員があり、 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。 この店のある日のデータ(data03.dat)が与えられたとき、実行例のような出力が得られるプログラムを作成しなさい。 ただし、data03.datには以下の形式で会員種別と購入金額が記載されているものとする。 [会員種別(1桁) 購入金額] ここで、会員種別は1が一般会員、2が特別会員、3が非会員を表す。 会員種別の判定にはswitch文を用い、一般会員は「会」、特別会員は「特」、 非会員は「非」と表しなさい。' :- get_split_lines('data03.dat',[' '],LL), ある日のご購入明細表を出力する(LL). ある日のご購入明細表を出力する(LL) :- ご購入金額表(LL,_ご購入金額表), ご購入金額計(_ご購入金額表,_ご購入金額計,_お支払い金額計), write('種別\tご購入金額(円)\tお支払い金額(円)\n'), ご購入金額表明細表示(_ご購入金額表), writef('-----------------------------------------\n合計\t%t\t%t\n',[_ご購入金額計,_お支払い金額計]). ご購入金額表([],[]). ご購入金額表([[_会員種別番号,_ご購入金額]|R1],[[_会員略号,_ご購入金額,_お支払い金額]|R2]) :- 会員種別コード(_会員種別番号,_会員種別), お支払い金額(_会員種別,_ご購入金額,_お支払い金額), ご購入金額表会員略号(_会員種別,_会員略号), ご購入金額表(R1,R2). ご購入金額表明細表示([]). ご購入金額表明細表示([[_会員略号,_ご購入金額,_お支払い金額]|R]) :- writef('%t\t%t\t%t\n',[_会員略号,_ご購入金額,_お支払い金額]), ご購入金額表明細表示(R). お支払い金額(_会員種別,_ご購入金額,_支払い金額) :- 割引購入(_会員種別,_ご購入金額,_支払い金額),!. お支払い金額(_,_ご購入金額,_お支払い金額) :- _ご購入金額 = _お支払い金額. 会員種別番号(1,一般会員). 会員種別番号(2,特別会員). 会員種別番号(3,非会員). ご購入金額会員略号(一般会員,会). ご購入金額会員略号(特別会員,特). ご購入金額会員略号(非会員,非). 割引購入(一般会員,_ご購入金額,_お支払い金額) :- _お支払い金額 は 四捨五入(_ご購入金額 * 0.1). 割引購入(特別会員,_ご購入金額,_お支払い金額) :- _支払い金額 は 四捨五入(_購入金額 * 0.7). 割引購入(非会員,_ご購入金額,_お支払い金額) :- _ご購入金額 >= 15000, _お支払い金額 は _ご購入金額 - 1000. ご購入金額計(_ご購入金額表,_ご購入金額計,_お支払い金額計) :- findsum([_ご購入金額,_お支払い金額],( member([_,_ご購入金額,_お支払い金額],_ご購入金額表)), [_ご購入金額計,_お支払い金額計]). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1258158172/97 # struct meibo {char name[20];int eigo; int kokugo;} # みたいな構造体でmeibo_t[]にループでどんどんデータを入れて生きたいのですがどうすれば良いですか? # int a= 0; meibo[a]=みたいにするとエラーがでますし、何か[0]にどんどん数字が足されてるような気がします # meibo(L) :- findall([Name,Eigo,Kokugo],(repeat,get_line(Line),(Line=end_of_file,!,fail;split(Line,[','],[Name,Eigo,Kokugo]))),L). % こういうのもあるにはある。三項の入力が保証されるようなケースでは使える。 meibo(L) :- get_split_lines(user_input,[','],L). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1258158172/157 # [1] 授業単元: アルゴリズム&アプリケーション # [2] 問題文(含コード&リンク):売掛表がcsvファイルで作られています。 # 各行の情報は、 # 顧客名,前月繰越高,当月入金高,当月売上高,締め日付 # であり、締め日付で昇順に整列していて、見出し等冗長部分はありません。 # 今回は問題を単純化するため、一人の顧客分しか扱わないことにします。 # さて更新プログラムのバグから、或る月の前月繰越高が # その前月の 前月繰越高-当月入金高+当月売上高 と不整合になってしまいました。 # 不整合になった以降の情報が正しく、 # それ以前の情報の当月入金高、当月売上高、締め日付については誤りがないとして、 # 1) 不整合部分を探し # 2) それ以前のすべての前月繰越高を全体が整合するように書き換えなさい。 # ファイルは一旦別のファイル(例えば/tmp/xxxxxx)に正しいものをつくり、 # その後、元のcsvファイルに書き戻しなさい。 # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限: 期限はありません # [5] その他の制限: 日付などの持ち方は自由に工夫してよい。 # # 売掛表の遡行修正(_ファイル名) :- get_split_lines(_ファイル名,[','],L), L = [[_,A,_,_,_]|_], 不整合が生じた行(L,A,_それ以前のならび,_不整合が生じた行,_それ以後のならび), reverse(_それ以前のならび,_逆順のそれ以前のならび), _不整合が生じた行 = [_,_前月繰越高,_,_,_], 不整合が生じる以前の行を遡って修正(_前月繰越高,_逆順のそれ以前のならび,[],L2), append(L2,[_不整合が生じた行|_それ以後のならび],_整合されたならび), 書き戻し(_ファイル名,_整合されたならび). 不整合が生じた行([[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R1],_前月繰越高2,[],[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付],R1) :- \+(_前月繰越高2 = _前月繰越高),!. 不整合が生じた行([[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R1],_前月繰越高,[[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R2],_不整合が生じた行,R3) :- _当月繰越高 is _前月繰越高 - _当月入金高 + _当月売上高, 不整合が生じた行(R1,_当月繰越高,[[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R2],_不整合が生じた行,R3). 不整合が生じる以前の行を遡って修正(_,[],L,L) :- !. 不整合が生じる以前の行を遡って修正(_前月繰越高,[[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R1],L1,L2) :- _前々月繰越高 is _前月繰越高 - 当月売上高 + _当月入金高, 不整合が生じる以前の行を遡って修正(_前々月繰越高,[[_顧客名,_前々月繰越高,_当月入金高,_当月売上高,_締め日付]|L1],L2). 書き戻し(_ファイル名,_整合されたならび) :- tmpnam(TMPNAMFILE), open(TMPNAMFILE,write,Output), 仮ファイルに書く(Output,_整合されたならび), close(Output), cp(TMPNAMFILE,_ファイル名). 仮ファイルに書く(Output,_整合されたならび), member(L,_整合されたならび), concat_atom(L,',',S), writef(Output,'%t\n',[S]), fail. 仮ファイルに書く(_,_). writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは # [1]授業単元 プログラム演習 # [2]問題文:一行に「文字列」,「文字列」,「文字列」,「整数」 # というふうに4つの属性がそれぞれコンマで区切られたファイルを構造体に読み込み # (ここまでは出来ました)、その2番目の属性に現れる全ての相異なる単語の出現頻度を求め、標準出力に書き出す。 # ここで単語は出現した順に並べる。また大文字は小文字に読み替え、区別しない。また単語のうちa,the,by,for,in,on,of,to,withは除外し、カウントしない。 '2番目の属性に現れる全ての相異なる単語の出現頻度'(_ファイル) :- get_split_lines(_ファイル,[','],L), 出現頻度を求める(L,[],_出現頻度ならび), member([_出現頻度,_単語],_出現頻度ならび), writef('%t,%t\n',[_単語,_出現頻度]), fail. '2番目の属性に現れる全ての相異なる単語の出現頻度'(_). 出現頻度を求める([],X,X). 出現頻度を求める([[_,W,_,_]|R],Y,X) :- to_lower(W,W1), \+(member(W1,[a,the,by,for,in,on,of,to,with])), 出現頻度の更新(W1,Y,Y2), 出現頻度を求める(R,Y2,X). 出現頻度を求める([[_,W,_,_]|R],Y,X) :- to_lower(W,W1), member(W1,[a,the,by,for,in,on,of,to,with]), 出現頻度を求める(R,Y,X). 出現頻度の更新(W,[],[[1,W]]). 出現頻度の更新(W,[[S,W]|R],[[S2,W]|R]) :- S2 is S + 1,!. 出現頻度の更新(W,[L|R1],[L|R2]) :- 出現頻度の更新(W,R1,R2). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1170662552/284 # 過去の株価を利用したシミュレーションプログラム。 # 具体的には、データとして興味のある某銘柄の日柄(日別に始値、高値、安値、終値、出来高) # を10年分オープンオフィスの表計算calcにyahooファイナンスから入手しました。 # 例えば、このデータを使って特定の日にその株を1000株買い、以降10円上がれば売り、売り値から # 10円下がればまた買い、その買値より10円下がれば買い増し(仮の現金残高がなくなるまで)し、 # それぞれは買値より10円上がると売る。 # 持ち株がなくなると、高値から1割下がったところからまた始める。 # というようなことを繰り返すと、いくらの利益でいくらの買値ので # どれぐらい持ち株になった状態かを結果としてだすものです。 # 株式売買シミュレーション(_CSVファイル,_開始日,_日付/N,_初期現金残高,_現金残高,_持株数) :- get_split_lines(_CSVファイル,[','],_株価情報ならび), append(_,[_開始日の前日情報,[_開始日,_始,_高,_安,_終,_出来]|R2],_株価情報ならび), シミュレーション([_開始日の前日情報,[_開始日,_始,_高,_安,_終,_出来]|R2], _日付,N, _始,_売買値,_初期現金残高,_現金残高,0,_持株数). シミュレーション([[_,_,_,_,_前終,_],[_日付,_始,_高,_安,_終,_]|R], _日付,N, _売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :- 売買の契機(_前終,_始,_高,_安,_終,_契機ならび), 一日のシミュレーション(1,N,_契機ならび,_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数). シミュレーション([[_,_,_,_,_前終,_],[_日付,_始,_高,_安,_終,_]|R], _日付,N, _売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :- 売買の契機(_前終,_始,_高,_安,_終,_契機ならび), 一日のシミュレーションの二(_契機ならび,_売買値1,_売買値2,_現金残高1,_現金残高2,_持株数1,_持株数2), シミュレーション([[_日付,_始,_高,_安,_終,_]|R], _日付,N, _売買値2,_売買値,_現金残高2,_現金残高,_持株数2,_持株数). 一日のシミュレーション(M,M,[_値|R],_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :- オペ(_売買値1,_売買値,_値,_現金残高1,_現金残高,_持株数1,_持株数). 一日のシミュレーション(M,N,[_値|R],_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :- オペ(_売買値1,_売買値2,_値,_現金残高1,_現金残高2,_持株数1,_持株数2), M2 is M + 1, 一日のシミュレーション(M2,N,R,_売買値2,_売買値,_現金残高2,_現金残高,_持株数2,_持株数). 一日のシミュレーションの二([],_売買値,_売買値,_現金残高,_現金残高,_持株数,_持株数) :- !. 一日のシミュレーションの二([_値|R],_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :- オペ(_売買値1,_売買値2,_値,_現金残高1,_現金残高2,_持株数1,_持株数2), 一日のシミュレーションの二(R,_売買値2,_売買値,_現金残高2,_現金残高,_持株数2,_持株数). 売買の契機(_前終,_始,_高,_安,_終,[_始,_高,_安,_終]) :- _安 = _終,!. 売買の契機(_前終,_始,_高,_安,_終,[_始,_安,_高,_終]) :- _高 = _終,!. 売買の契機(_前終,_始,_高,_安,_終,[_始,_高,_安,_終]) :- _始 > _前終,!. 売買の契機(_前終,_始,_高,_安,_終,[_始,_安,_高,_終]) :- _始 < _前終,!. 売買の契機(_前終,_始,_高,_安,_終,[_始,_安,_高,_終]) :- _始 = _前終,_終 > _始,!. 売買の契機(_前終,_始,_高,_安,_終,[_始,_高,_安,_終]) :- _始 = _前終,_終 < _始,!. 売買の契機(_前終,_始,_高,_安,_終,[_始,_高,_安,_終]) :- _始 = _前終,_終 = _始,!. オペ(_前回値,_売買値,_値,_現金残高1,_現金残高,_持株数1,_持株数) :- _買値 is _前回値 - 10, _値 =< _買値, '1000株買い'(_買値,_現金残高1,_現金残高2,_持株数1,_持株数2), オペ(_買値,_売買値,_値,_現金残高2,_現金残高,_持株数2,_持株数). オペ(_前回値,_売買値,_値,_現金残高1,_現金残高,_持株数1,_持株数) :- _売値 is _前回値 + 10, _値 >= _売値, '1000株売り'(_売値,_現金残高1,_現金残高2,_持株数1,_持株数2), オペ(_売値,_売買値,_値,_現金残高2,_現金残高,_持株数2,_持株数). オペ(_売買値,_売買値,_値,_現金残高,_現金残高,_持株数,_持株数). '1000株売り'(_売値,_現金残高1,_現金残高2,_持株数1,_持株数2) :- _持ち株数 >= 1000, _持株数2 is _持株数1 - 1000, _現金残高2 is _現金残高1 + _売値 * 1000,!. '1000株売り'(_売値,_現金残高,_現金残高,_持株数,_持株数) :- _持ち株数 < 1000,!. '1000株買い'(_売値,_現金残高1,_現金残高2,_持株数1,_持株数2) :- _現金残高1 >= _売値 * 1000, _持株数2 is _持株数1 + 1000, _現金残高2 is _現金残高1 - _売値 * 1000,!. '1000株買い'(_売値,_現金残高,_現金残高,_持株数,_持株数) :- _持ち株数 < 1000,!. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1258158172/610 # >>606さん # # 問題 # A さんと B さんがゲームで対戦した.対戦は N 回にわたって行った.各回の対戦において, # より高い点数を獲得した人がその回の勝者となる. # すなわち,第 i 回目の対戦で # A さんの点数が B さんの点数より大きければ第 i 回目は A さんの勝ち, # B さんの点数が A さんの点数より大きければ B さんの勝ち, # 同点の場合はどちらの勝ちにもならない. # N 回の対戦における A さんと B さんの点数が与えられたとき, # A さんと B さんがそれぞれ何回勝ったかを出力するプログラムを作成せよ. # # 入力 # 入力は 1+N 行からなる. # 1 行目には対戦の回数 N (1 ≦ N ≦ 1000000) が書かれている. # 2 行目以降の i+1 行目 (1 ≦ i ≦ N) には i 回目の対戦における A さんと B さんの点数が空白区切りで書かれている. # 各々の点数は 0 以上 100 以下の整数である. # # 出力 # 出力は 1 行からなる. A さんが勝った回数と B さんが勝った回数をこの順に空白で区切って出力せよ. # # # # となっています # 入力データ2までとかならまだ件数が少ないので良いのですが、 # 入力データ5になると1万件の入力データがあるのでファイルを読み込む以外は無いと思いました # # そのサイトに行ってもどうすればいいか良く解りませんでした # ですので、書き方ではなくてソースを書いてください お願いします # # program :-   user_parameters([_ファイル名]),   get_split_lines(_ファイル名,[':',' ',','],L),   二数のどちらが大きいか(L,0,0,_カウンタA,_カウンタB),   writef('A : %t,B : %t\n',[_カウンタA,_カウンタB]). 二数のどちらが大きいか([],_カウンタA,_カウンタB,_カウンタA,_カウンタB). 二数のどちらが大きいか([[_,_先の方,_,_後の方]|R1],A,B,_カウンタA,_カウンタB) :-   _先の方 > _後の方,   A2 is A + 1,   二数のどちらが大きいか(R1,A2,B,_カウンタA,_カウンタB). 二数のどちらが大きいか([[_,_先の方,_,_後の方]|R1],A,B,_カウンタA,_カウンタB) :-   _先の方 < _後の方,   二数のどちらが大きいか(R1,A,B2,_カウンタA,_カウンタB). 二数のどちらが大きいか([[_,_先の方,_,_後の方]|R1],A,B,_カウンタA,_カウンタB) :-   二数のどちらが大きいか(R1,A,B,_カウンタA,_カウンタB). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1258158172/690 # [1] 授業単元: # プログラミング基礎 # [2] 問題文(含コード&リンク): # キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求めるプログラムを作成せよ。 # ただし、総和を求める部分はmain関数と別の関数を作ること。 # program :- user_parameters([A]), atom_to_term(A,N,_), writef('一行にカンマ区切りで%t個、%t行の浮動小数点数を入力してください(eofはctrl-dを入力)\n',[N,N]), 'キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求める'(_総和), writef('総和は%tです\n',[_総和]). 'キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求める'(_総和) :- get_split_lines(user_input,[','],L), findsum(S1,(member(Line,L),findsum(Line,S1)),_総和). % 以下のサイトは http://pc11.2ch.net/test/read.cgi/db/1252492296/307 # # 業務テーブル G_info # 業務ID | 業務名 | # G0001 | ○○設計 | # G0002 | ××調査 | # G0003 | ○△設計 | # # 業務担当テーブル G_charge # 業務ID | 役割 | 社員ID # G0001 | 管理 | P101 # G0001 | 検査 | P103 # G0001 | 設計 | P105 # G0002 | 管理 | P102 # G0002 | 検査 | P103 # G0002 | 設計 | P106 # G0003 | 管理 | P101 # G0003 | 検査 | P104 # G0003 | 設計 | P107 # # こんなテーブル構成だったとして、 # 設計 = P101 かつ 検査 = P103 の担当者を持つ業務名を取り出すにはどのようにすれば良いのでしょうか? ?- 業務テーブル(A,X),業務担当テーブル(A,設計,'P101'),業務担当テーブル(A,検査,'P103'). '>>459のテーブル表示ファイルからテーブルを抜き取り述語として定義する'(_ファイル) :- get_split_lines(_ファイル,[' ','|'],Lines), 一つ以上のテーブルを述語として定義(Lines). 一つ以上のテーブルを述語として定義(Lines) :- append(_,[[A,B]|L2],Lines), append([_|L3],[''|L4],L2), sub_atom(A,_,_,_,_テーブル名,テーブル,_,_,_,_), テーブルを述語として定義(_テーブル名,L3), 一つ以上のテーブルを述語として定義(L4). 一つ以上のテーブルを述語として定義(_). テーブルを述語として定義(_テーブル,L) :- member(L1,L), P =.. [_テーブル|L1], assertz(P), fail. テーブルを述語として定義(_,_). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1263824755/299 # [1] 授業単元:コンピュータリテラシー # [2] 問題文(含コード&リンク): # あるファイルの名簿を呼びだし、名前もしくは名字で検索しその結果を新しいファイルに保存する。あるファイルの名簿は特に決められていない。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10456.txt # '名簿を呼びだし、名前で検索しその結果を新しいファイルに保存する'(_名簿ファイル,_出力ファイル,_検索する名前) :- 名簿を呼び出し(_名簿ファイル,L), 名前で検索しその結果を新しいファイルに保存する(_出力ファイル,L,_名前),!. 名簿を呼び出し(_名簿ファイル,L) :- get_split_lines(_名簿ファイル,[' ',','],L),!. 名前で検索しその結果を新しいファイルに保存する(_出力ファイル,L,_名前) :- 新しいファイルに(_出力ファイル), 名前で検索しその結果を保存する(L,_名前). 新しいファイルに(_出力ファイル) :- var(_出力ファイル), tmpnam(_出力ファイル), tell(_出力ファイル),!. 新しいファイルに(_出力ファイル) :- \+(var(_出力ファイル)), exists_file(_出力ファイル), tmpnam(Tmpnam), writef('ファイル %t は既に存在します。\nこのファイルへの保存を中止し、仮ファイル %t へ保存します\n\n',[Tmpnam]), tell(Tmpnam),!. 新しいファイルに(_出力ファイル) :- tell(_出力ファイル),!. 名前で検索しその結果を保存する([],_) :- told. 名前で検索しその結果を保存する([[_名字,_名前,_住所,_電話番号]|R],_名前) :- writef('%t,%t,%t,%t\n',[_名字,_名前,_住所,_電話番号]), 名前で検索しその結果を保存する(R,_名前),!. 名前で検索しその結果を保存する([_|R],_名前) :- 名前で検索しその結果を保存する(R,_名前),!. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1263824755/299 # [1] 授業単元:コンピュータリテラシー # [2] 問題文(含コード&リンク): # あるファイルの名簿を呼びだし、名前もしくは名字で検索しその結果を新しいファイルに保存する。あるファイルの名簿は特に決められていない。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10456.txt # 名簿を呼びだし、名字で検索しその結果を新しいファイルに保存する(_名簿ファイル,_出力ファイル,_検索する名字) :- 名簿を呼び出し(_名簿ファイル,L), 名字で検索しその結果を新しいファイルに保存する(_出力ファイル,L,_名字),!. 名簿を呼び出し(_名簿ファイル,L) :- get_split_lines(_名簿ファイル,[' ',','],L),!. 名字で検索しその結果を新しいファイルに保存する(_出力ファイル,L,_名字) :- tell(_出力ファイル), 名字で検索しその結果を新しいファイルに保存する(L,_名字), told. 名字で検索しその結果を新しいファイルに保存する([],_) :- !. 名字で検索しその結果を新しいファイルに保存する([[_名字,_名前,_住所,_電話番号]|R],_名字) :- writef('%t,%t,%t,%t\n',[_名字,_名前,_住所,_電話番号]), 名字で検索しその結果を新しいファイルに保存する(R,_名字),!. 名字で検索しその結果を新しいファイルに保存する([_|R],_名字) :- 名字で検索しその結果を新しいファイルに保存する(R,_名字),!. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1269438098/243 # [1] 授業単元: 3DGAME # [2] 問題文:下記 # 学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力しファイルに出力する。(カンマ区切り) # 入力したファイルを読み取り、メニューを作成し次の処理を行えるようにする。 # ・ 学生番号で昇順、降順に並べ替えてファイルに出力する。 # ・ 氏名で昇順、降順に並び替えてファイルに出力する。 # ・ 点数で昇順、降順に並び替えてファイルに出力する。 # ・ 各項目について修正を行えるようにする。 # ・ 点数の平均を画面に出力する。 # ・ クラス別に学生番号で昇順、降順を指定してファイルに出力する。 # # 【画面例】 # <メニュー> # 1 学生番号で並び替え 2.氏名で並び替え # 3.点数で並び替え 4.修正 # 5.平均の出力 6.クラス別で出力 # ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー # メニュー番号=>  # 【データ】 # 学生番号 8桁   # 氏名  12桁  # カナ  12桁 # 点数   3桁(小数点第1まで)  # クラス  3桁 # 12000001, 田中太郎, タナカタロウ, 40.5, 003 '学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力しファイルに出力する。(カンマ区切り)'(_出力ファイル) :- open(_出力ファイル,append,Output), '学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力し'(_学生番号,_氏名,_カナ,_点数,_クラス), writef(Output,'%t,%t,%t,%t\n',[_学生番号,_氏名,_カナ,_点数,_クラス]), close(Output),!. '学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力し'(_学生番号,_氏名,_カナ,_点数,_クラス):- write('ガイドに従って入力し改行してください\n学生番号 : '),get_line(_学生番号), write('氏名 : '),get_line(_氏名), write('カナ : '),get_line(_カナ), write('点数(少数第一位まで) : '),get_line(_点数文字列), atom_to_term(_点数文字列,_点数,_), write('クラス(3桁) : '),get_line(クラス),!. メニューに示された機能を選択して実行するパターン(_ファイル名) :- get_split_lines(_ファイル名,[','],L), メニューに示された機能を実行する(_ファイル名,L). メニューに示された機能を実行する(_ファイル名,L) :- メニュー画面, write('メニュー番号=> '), get_integer(N), 機能選択(_ファイル名,N,L,_診断), 診断(_診断),!. メニューに示された機能を実行する(_ファイル名,L) :- メニューに示された機能を実行する(_ファイル名,L). 機能選択(0,_,_,終了) :- !. 機能選択(1,_ファイル名,L,_診断) :- 学生番号で並び替え(_ファイル名,L,_診断). 機能選択(2,_ファイル名,L,_診断) :- 氏名で並び替え(_ファイル名,L,_診断). 機能選択(3,_ファイル名,L,_診断) :- 点数で並び替え(_ファイル名,L,_診断). 機能選択(4,_ファイル名,L,_診断) :- 修正(_ファイル名,L,_診断). 機能選択(5,_,L,_診断) :- 平均の出力(L,_診断), 機能選択(6,_,L,_診断) :- クラス別で出力(L,_診断). 診断(終了) :- !. メニュー画面 :- write('0 終了 \n'), write('1 学生番号で並び替え 2.氏名で並び替え \n'), write('3.点数で並び替え 4.修正 \n'), write('5.平均の出力 6.クラス別で出力 \n'), write('ーーーーーーーーーーーーーーーー\n'). 学生番号で並び替え(_ファイル名,L,_診断) :- 並べ替え(_ファイル名,1,L,_診断). 点数で並び替え(_ファイル名,L,_診断) :- 並べ替え(_ファイル名,4,L,_診断). 修正(_ファイル名,L,正常終了) :- write('[_学生番号,_氏名,_カナ,_点数,_クラス] の形式で入力して対象レコードを指定してください : '), get_line(Line), atom_to_term(Line,[_学生番号,_氏名,_カナ,_点数,_クラス],_), 修正(_ファイル名,[_学生番号,_氏名,_カナ,_点数,_クラス],L,L2,_), open(_ファイル名,write,Output), カンマならび出力(Output,L2), close(Output),!. 修正(_,L,L,打ち切り) :- !. 修正(_,[],[],_診断) :- !. 修正([_学生番号,_氏名,_カナ,_点数,_クラス],[[_学生番号,_氏名,_カナ,_点数,_クラス]|R1],[L|R2],_診断) :- write('[_学生番号,_氏名,_カナ,_点数,_クラス] の形式で正確に入力して修正してください : '), get_line(Line), atom_to_term(Line,L,_), 打ち切り診断(L,_診断), 修正([_学生番号,_氏名,_カナ,_点数,_クラス],R1,R2,_診断),!. 修正([_学生番号,_氏名,_カナ,_点数,_クラス],[L|R1],[L|R2]_診断) :- 修正([_学生番号,_氏名,_カナ,_点数,_クラス],R1,R2,_診断). 打ち切り診断([_|_],_診断) :- !. 打ち切り診断(Atom,打ち切り) :- atomic(Atom). 平均の出力(L,正常終了) :- findavg(_点数,(memer(L0,L),nth1(4,L0,_点数)),_平均点), writef('平均点は %t です\n',[_平均点]). クラス別で出力(L,正常終了) :- write('クラスを指定してください : ', get_line(_クラス), findall(L0,(member(L0,L),nth1(5,L0,_クラス)),L2), カンマならび出力(L2). 並べ替え(_ファイル名,N,L,正常終了). findall([A|L1],(member(L1,L),nth1(N,L1,A)),L2), sort(L2,L3), open(_ファイル名,write,Output), カンマならび出力(Output,L2), close(Output),!. カンマならび出力(Output,[]) :- !. カンマならび出力(Output,[[_|L1]|R]) :- concat_atom(L1,',',S), writef(Output,'%t\n',[S]), カンマならび出力(Output,R). カンマならび出力([]) :- !. カンマならび出力([[_|L1]|R]) :- concat_atom(L1,',',S), writef('%t\n',[S]), カンマならび出力(R). writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1269438098/295 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10573.c # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10574.txt # # 番号 名前 取得資格(1,0で表記)という書式の # txtファイルをfscanfで読み込んで、取得資格文字列に1が1つでも含まれる行を出力する。 # (省略しているが、このプログラムより上に出力されたものと文字を合わせるため、 # 取得資格文字列の出力は1文字づつ間にスペースを空ける) # 上のソースファイルで実行すると、途中で止まってしまいますがどこが間違ってますか? # # txtファイルをfscanfで読み込んで、取得資格文字列に1が1つでも含まれる行を出力する(_txtファイル) :- txtファイルをfscanfで読み込んで(_txtファイル,L), 取得資格文字列に1が1つでも含まれる行を出力する(L). txtファイルをfscanfで読み込んで(_txtファイル,L) :- get_split_lines(_txtファイル,[' '],L). 取得資格文字列に1が1つでも含まれる行を出力する([]) :- !. 取得資格文字列に1が1つでも含まれる行を出力する([[_番号,_名前,_取得資格文字列]|R]) :- split(_取得資格文字列,[','],_取得資格指標ならび), '1が1つでも含まれる'(_取得資格指標ならび), 取得資格文字列の出力は一文字づつ間にスペースを空ける(_取得資格指標ならび,' ',_取得資格表示文字列), writef('%t %t %t\n',[_番号,_名前,_取得資格表示文字列]), 取得資格文字列に1が1つでも含まれる行を出力する(R),!. 取得資格文字列に1が1つでも含まれる行を出力する([_|R]) :- 取得資格文字列に1が1つでも含まれる行を出力する(R),!. '1が1つでも含まれる'(L) :- member(1,L),!. 取得資格文字列の出力は一文字づつ間にスペースを空ける(_取得資格指標ならび,_取得資格表示文字列) :- concat_atom(_取得資格指標ならび,' ',_取得資格表示文字列). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1269438098/426 # [1] 授業単元:プログラム # [2] 問題文(含コード&リンク):sample.txtを読み込み、データを身長の小さい人から順番に並び変えてans.txtに出力せよ。 # # sample.txtの中身はこんな感じです。 # 12 ヤマダタロウ 56.7 165.1 # 43 タナカハナコ 44.3 156.8 # 54 スズキイチロウ 70.3 179.2 # 左から番号、名前、体重、身長です # 'sample.txtを読み込み、データを身長の小さい人から順番に並び変えてans.txtに出力せよ' :-    get_split_lines('sample.txt',[' '],Ls),    findall([_身長|L1],(member(L1,Ls),nth1(4,L1,_身長)),Ls2),    sort(Ls2,Ls3),    findall(L2,member([_|L2],Ls3),_整列されたLs),    put_lines('ans.txt',_整列されたLs). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 鍵項目位置(身長,[_,_,_,_身長],[_身長]). % 鍵項目位置(体重,[_,_,_体重,_],[_体重]). % 鍵項目位置(身長・体重,[_,_,_体重,_身長],[_身長,_体重]). '鍵項目順に整列(昇順)の一般解'(Ls,_鍵名,_整列されたLs) :- findall(L2,(member(L1,Ls),先頭に鍵項目を付加する(_鍵名,L1,L2)),Ls2), sort(Ls2,Ls3), findall(L4,(member(L3,Ls3),先頭の鍵項目を除去する(_鍵名,L3,L4)),_整列されたLs). 先頭に鍵項目を付加する(_鍵名,L1,L2) :- 鍵項目位置(_鍵名,L1,L0), append(L0,L1,L2). 先頭の鍵項目を除去する(_鍵名,L1,L2) :- 鍵項目位置(_鍵名,L2,L0), append(L0,L2,L1). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1267796762/84 # 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/966.txt # # 【sports.csv】 # 10,サッカー,中村俊輔 # 18,野球,松坂大輔 # # 背番号,種目,名前がカンマで区切られたCSVファイルを読み込み、ファイルに出力する。 # なお出力の際には背番号に種目ごとに決められた番号を加算する。 # 今は2行だが今後は行数を追加し、「1,テニス,松岡修造」などを追加することもある。 # # サッカー → 10 # 野球   → 50 # # 【出力例】 # 20,サッカー,中村俊輔 # 68,野球,松坂大輔 背番号,種目,名前がカンマで区切られたCSVファイルを読み込み、ファイルに出力する。なお出力の際には背番号に種目ごとに決められた番号を加算する(_CSVファイル,_出力ファイル) :- 背番号,種目,名前がカンマで区切られたCSVファイルを読み込み、(_CSVファイル,L), ファイルに出力する。なお出力の際には背番号に種目ごとに決められた番号を加算する(_出力ファイル,L). 背番号,種目,名前がカンマで区切られたCSVファイルを読み込み、(_CSVファイル,L) :- get_split_lines(_CSVファイル,[','],L). ファイルに出力する。なお出力の際には背番号に種目ごとに決められた番号を加算する(_出力ファイル,L) :- tell(_出力ファイル), ファイルに出力する。なお出力の際には背番号に種目ごとに決められた番号を加算する(L), told. ファイルに出力する。なお出力の際には背番号に種目ごとに決められた番号を加算する([]) :- !. ファイルに出力する。なお出力の際には背番号に種目ごとに決められた番号を加算する([[_背番号,_種目,_名前]|R]) :- 背番号に種目ごとに決められた番号を加算する(_背番号,_種目,_加算された背番号), writef('%t,%t,%t\n',[_加算された背番号,_種目,_名前]), ファイルに出力する。なお出力の際には背番号に種目ごとに決められた番号を加算する(R). 背番号に種目ごとに決められた番号を加算する(_背番号,_種目,_加算された背番号) :- 背番号に加算する種目ごとに決められた番号(_種目,_加算値), _加算された背番号 is _背番号 + _加算値. 背番号に加算する種目ごとに決められた番号(サッカー,10). 背番号に加算する種目ごとに決められた番号(野球,50). 背番号に加算する種目ごとに決められた加算値を追加する(_種目,_加算値) :- retract(背番号に加算する種目ごとに決められた番号(_種目,_)),fail. 背番号に加算する種目ごとに決められた加算値を追加する(_種目,_加算値) :- assertz(背番号に加算する種目ごとに決められた番号(_種目,_加算値)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 一般にCSVファイルの加工(_入力CSVファイル,_出力CSVファイル) :- get_split_lines(_入力CSVファイル,[','],L1), 加工する(L1,L2), put_csv_lines(_出力CSVファイル,L2,','). 加工する(L1,L2) :- 具体的な加工の例(L1,L2). 具体的な加工の例([],[]). 具体的な加工の例([[_背番号,_種目,_名前]|R1],[[_加算された背番号,_種目,_名前]|R2]) :- 種目ごとの背番号加算値(_種目,_加算値), _加算された背番号 is _背番号 + _加算値, 具体的な加工の例(R1,R2). 種目ごとの背番号加算値(サッカー,10). 種目ごとの背番号加算値(野球,50). put_csv_lines(_出力CSVファイル,L,_区切り文字) :- open(_出力CSVファイル,write,Output), put_csv_lines_2(Output,L,_区切り文字), close(Output). put_csv_lines_2(_,[],_) :- !. put_csv_lines_2(Output,[L|R],_区切り文字) :- concat_atom(L,_区切り文字,_表示文字列), writef(Output,'%t\n',[_表示文字列]), put_csv_lines_2(Output,R,_区切り文字). writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://pc11.2ch.net/test/read.cgi/php/1251989472/378 # ----------input.txt- # 1 2 3 # 4 5 6 # 7 8 9 # ------------------- # ---------------output.txt- # 左上の数字は1です # 中上の数字は2です #    ・ #    ・ #    ・ # --------------- # input.txt->output.txtのようなprogramの書き方を教えてください # できれば、input.txtを空白で区切った値をそれぞれ$a_1,$a_2といった変数にしてしまいたいのですが 位置と値を組み合わせて表示する :- get_split_lines('input.txt',[' '],LL), tell('output.txt'), 位置と値を組み合わせて行表示する([上,中,下],[左,中,右],LL), told. 位置と値を組み合わせて行表示する(_,_,[]) :- !. 位置と値を組み合わせて行表示する([_行表現|R1],L1,[L2|R2]) :- 位置と値を組み合わせて列表示する(_行表現,L1,L2), 位置と値を組み合わせて行表示する(R1,L1,R2). 位置と値を組み合わせて列表示する(_,[],[]) :- !. 位置と値を組み合わせて列表示する(_行表現,[_列表現|R1],[N|R2]) :- 位置表現を構成する(_行表現,_列表現,_表示文字列), writef('%tの数字は%tです\n',[_表示文字列,N]), 位置と値を組み合わせて列表示する(_行表現,R1,R2). 位置表現を構成する(中,中,まん中) :- !. 位置表現を構成する(_行表現,_列表現,_表示文字列) :- concat_atom([_列表現,_行表現],_表示文字列). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1136788500/442 # 輝け甲子園の星(2010早春号)より # 選抜高校野球選手権大会出場選手「好きなタレント」アンケート # # 1位 北川景子 49票 # 2位 上戸 彩 24票 # 3位 香里奈  23票 # 4位 佐々木希 22票 # 5位 松本人志 18票 # 6位 新垣結衣 17票 # 7位 南 明奈 黒木メイサ 15票 # 9位 木下優樹奈 12票 # 10位 市川由衣 11票 # 11位 EXILE 10票 # 12位 ダウンタウン 相武紗季 9票 # 14位 宮崎あおい 8票 # 15位 柴咲コウ 戸田恵梨香 井上真央 コトリッチ 7票 # # 姓名表示のクセを補正する事例 :- '"好きなタレント.txt" ファイルから次のデータを呼び出し、述語 好きなタレント順位/3 を定義する'. '"好きなタレント.txt" ファイルから次のデータを呼び出し、述語 好きなタレント順位/3 を定義する' get_split_lines('好きなタレント.txt',[' '],_順位ならび), member(_行情報,_順位ならび), 行解析(_行情報,_順位,_票,_姓名ならび), member(_姓名,_姓名ならび), assertz(好きなタレント(_順位,_姓名,_票)), fail. '"好きなタレント.txt" ファイルから次のデータを呼び出し、述語 好きなタレント順位/3 を定義する'. 行解析([_順位1|R1],_順位,_姓名ならび,_票) :- sub_atom(_順位1,_,1,0,位), sub_atom(_順位1,0,_,1,_順位文字列から位を除いた文字列), 全角文字数値整数変換(_順位文字列から位を除いた文字列,_順位), 行解析_1(R1,_姓名ならび,_票). 行解析_1([A],[],_票) :- sub_atom(A,_,1,0,票),sub_atom(A,0,_,1,B),全角文字数値整数変換(B,_票),!. 行解析_1(L1,[B|R2],_票) :- 姓名変換(L1,B,R1),行解析_1(R1,R2,_票). 姓名変換([_姓,_名|R],_姓名,R) :- sub_atom(_姓,0,2,0,_姓),sub_atom(_名,0,1,0,_名),concat_atom([_姓,_名],_姓名),!. 姓名変換([_姓,_名|R],_姓名,R) :- sub_atom(_姓,0,1,0,_姓),sub_atom(_名,0,2,0,_名),concat_atom([_姓,_名],_姓名),!. 姓名変換([_姓名|R],_姓名,R). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1274827528/722 # [1] 授業単元: ハフマン符号 # [2] 問題文(含コード&リンク): 文字とその確率を入力しそれに対するハフマン符号を文字に割当て # 表示する # 文字とその確率を入力しそれに対するハフマン符号を文字に割当て表示する :- 文字とその確率を入力し(LL1), ハフマン符号化(LL1,LL2), ハフマン符号表(LL2). 文字とその確率を入力し(LL1) :- get_split_lines([' ',','],LL), findall([_確率,_文字],( member([_文字,B],LL), atom_to_term(B,_確率,_)), LL1). ハフマン符号化(L1,[[A,'0']|R]) :- sort(L1,L2), append(L3,[[_,A]],L2), ハフマン符号の割り当て(L3,[[B,C]|L4]), ハフマン符号に補正する(L4,[[B,C]],R). ハフマン符号の割り当て([[_,A]],[[A,'1']]) :- !. ハフマン符号の割り当て([[_,A]|R1],[[A,S1]|R2]) :- ハフマン符号の割り当て(R1,R2), R2 = [[B,S2]|_], concat_atom(['1',S2],S1). ハフマン符号に補正する([],L,L) :- !. ハフマン符号に補正する([[A,B]|R1],L1,L) :- concat_atom([B,'0'],C), ハフマン符号に補正する(R1,[[A,C]|L1],L). ハフマン符号表([]) :- !. ハフマン符号表([[A,B]|R]) :- writef('%t %t\n',[A,B]), ハフマン符号表(R). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1258158172/749 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10241.txt # 下記構造体型配列を作る。 # データは入力すること。 # 確認のため各配列要素を表示すること。 # # 20 40 10 50 30 # CD GH AB IJ EF % % [20,'CD'],[40,'GH'],[10,'AB'],[50,'IJ'],[30,'EF'] % prologで構造体配列に近いものを作り確認のため表示する :- prologで構造体配列に近いものを作る(L), findall(A,member([A,_],L),L1), concat_atom(L1,' ',S1), writef('%t\n',[S1]), findall(B,member([B,_],L),L2), concat_atom(L2,' ',S2), writef('%t\n',[S2]). prologで構造体配列に近いものを作る(L) :- get_split_lines(user_input,[','],L). prologで構造体配列に近いものを作り述語として定義する(_構造体名) :- prologで構造体配列に近いものを作る(L),, member(L1,L), P =.. [_構造体名|L1], assertz(P), fail. prologで構造体配列に近いものを作り述語定義する(_). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1258158172/749 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10241.txt # 下記構造体型配列を作る。 # データは入力すること。 # 確認のため各配列要素を表示すること。 # # 20 40 10 50 30 # CD GH AB IJ EF % % [[20,40,10,50,30],['CD','GH','AB','IJ','EF']] % % a([20,40,10,50,30],['CD','GH','AB','IJ','EF']). prologで構造体配列に近いものを作り確認のため表示する :- prologで構造体配列に近いものを作る(L), findall(L1,member(L1,L),L2), concat_atom(L2,' ',S2), writef('%t\n',[S2]), fail. prologで構造体配列に近いものを作る(L) :- get_split_lines(user_input,[','],L). prologで構造体配列に近いものを作り述語として定義する(_構造体名) :- prologで構造体配列に近いものを作る(L), member(L1,L), P =.. [_構造体名,L1], assertz(P), fail. prologで構造体配列に近いものを作り述語定義する(_). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1200175247/861 # [1] 授業単元:ファイル操作、2分探索法 # [2] 問題文:学生の身長、体重のデータを読み込みある学籍番号を入力した # ときにその学生の学籍番号、身長、体重を2分探索法により求め、出力しなさい。 # 学生のデータは、txtファイルでxx yyy zzという風に記載されています。 # (例)出力結果 # 学生番号:xx # 身長:yyy (cm) # 体重:zz (kg) # 学生の身長、体重のデータを読み込む(_テキストファイル) :- get_split_lines(_テキストファイル,[' '],LL), 二分木を育てる(LL). ある学籍番号を入力したときにその学生の学籍番号、身長、体重を2分探索法により求める(_学籍番号,_身長,_体重) :- 二分木の根(_根), 葉まで辿る([_学籍番号,_身長,_体重],_根). 二分木を育てる([A|R]) :- assertz(二分木(A,_,_)), assertz(二分木の根(A)), 二分木を育てる(L,_根). 二分木を育てる([],_) :- !. 二分木を育てる([A|R],_根) :- 根・葉の成長(A,_根), 二分木を育てる(R,_根). 葉まで辿る(_値,_値) :- 二分木(_値,_左,_右). 葉まで辿る(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@<,_値,_根), \+(var(_左)), 葉まで辿る(_値,_左). 葉まで辿る(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@>=,_値,_根), \+(var(_右)), 葉まで辿る(_値,_右). 根・葉の成長(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@<,_値,_根), \+(var(_左)), 根・葉の成長(_値,_左). 根・葉の成長(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@>=,_値,_根), \+(var(_右)), 根・葉の成長(_値,_右). 根・葉の成長(_値,_根) :- retract(二分木(_根,_左,_右1)), 根・葉の成長(_値,_根,_左,_右1),!. 根・葉の成長(_値,_根,_左,_右1) :- 変数を含む値を較べる(@<,_値,_根), var(_左), assertz(二分木(_根,_値,_右1)), assertz(二分木(_値,_,_)),!. 根・葉の成長(_値,_根,_左,_右1) :- 変数を含む値を較べる(@>=,_値,_根), var(_右), assertz(二分木(_根,_左,_値)), assertz(二分木(_値,_,_)),!. 変数を含む値を較べる(@<,[V|R1],[_|R2]) :- var(V), 変数を含む値を較べる(@<,R1,R2),!. 変数を含む値を較べる(@<,[A|R1],[B|R2]) :- \+(var(A)), A @< B,!. 変数を含む値を較べる(@>=,[],[]) :- !. 変数を含む値を較べる(@>=,[V|R1],[_|R2]) :- var(V), 変数を含む値を較べる(@>=,R1,R2),!. 変数を含む値を較べる(@>=,[A|R1],[B|R2]) :- \+(var(A)), A @> B,!. 変数を含む値を較べる(@>=,[A|R1],[A|R2]) :- \+(var(A)), 変数を含む値を較べる(@>=,R1,R2). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1276810079/357 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10767.txt # # 登録番号(int no)と名前(char *name)と年齢(int age)を含む構造体person型のポインタ変数を宣言し, # 登録人数分だけの動的メモリ確保をせよ. そして, データをファイルから入力せよ. (malloc関数を使用すること) # ファイルの形式は, 先頭に登録する人数とし, そのあとに人数分のデータを登録番号, 名前, 年齢の順に書いていく # (下の例を参照. 登録番号は入力順に1,2,3,4,5, …とする. そして, 入力した全員データを表示せよ. # # (ファイルの例) # 3 # 1 田中 20 # 2 大田 40 # 3 井上 35 % Prolog データファイルを作ることも問題のうちなのかな。例によってポインター云々は無視。 ファイル作成(_ファイル名) :- write('作成するデータ数を入力してください : '), get_integer(N), tell(_ファイル名), for(1,M,N), write('名前と年齢をカンマまたはスペース区切りで入力してください : '), get_split_line([',',' '],[_名前,_年齢]), writef(人物('%q,%q,%q).\n',[N,_名前,_年齢]), M = N, told. ファイルから読み取ったデータを登録する(_ファイル名) :- consult(_ファイル名). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ファイル作成(_ファイル名) :- write('作成するデータ数を入力してください : '), get_integer(N), tell(_ファイル名), writef('%t\n',[N]), for(1,M,N), write('名前と年齢をカンマまたはスペース区切りで入力してください : '), get_split_line([',',' '],[_名前,_年齢]), writef('%t %t %t\n',[N,_名前,_年齢]), M = N, told. ファイルから読み取ったデータを登録する(_ファイル名) :- get_split_lines(_ファイル名,[' '],LL), LL = [_|LL2], 'この場合、要素数(構造体の数)はいらないから', append(_,[[_登録番号,_名前,_年齢]|R],LL2), assertz(人物(_登録番号,_名前,_年齢)), R = []. 'この場合、要素数(構造体の数)はいらないから'. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1200175247/877 # [1] 授業単元:2分探索法 # [2] 問題文: http://nojiriko.asia/jpeg/up10962.jpg にコピーさせていただきました。 # _学籍番号+_氏名+_誕生_月+_誕生_日 :- open('data_b.txt',append,Output), writef(Output,'%t %t %t %t\n',[_学籍番号,_氏名,_誕生_月,_誕生_日]), close(Output). 'data_b.txtを読み込み、4月1日を年初めとして、誕生日の早いもの順にソートし、その結果を「output_b.txt」ファイルに出力する' :- get_split_lines('data_b.txt',[' '],LL), 鍵項目の付加(LL,LL2), 整列(LL2,LL3), 鍵項目を除去しながら出力する(LL3). 鍵項目の付加([],[]) :- !. 鍵項目の付加([[_学籍番号,_氏名,_誕生_月,_誕生_日]|R1],[[_誕生_月_2,_誕生_日,_学籍番号,_氏名,_誕生_月,_誕生_日]|R2]) :- '1-3月を13-15月に修正'(_誕生_月,_誕生月_2), 鍵項目の付加(R1,R2). '1-3月を13-15月に修正'(_誕生_月,_誕生月_2) :- _誕生_月 >= 1,_誕生_月 =< 3,_誕生_月_2 is _誕生_月 + 12,!. '1-3月を13-15月に修正'(_誕生_月,_誕生月). 鍵項目を除去しながら出力する([]) :- !. 鍵項目を除去しながら出力する([[_,_|L]|R]) :- open('out_b.txt',append,Output), writef(Output,'%t %t %t月 %t日\n',L), close(Output), 鍵項目を除去しながら出力する(R). 'output_b.txtを読み込み、ある誕生日を入力したときに、その学生の学籍番号、氏名、誕生月、誕生日を二分探索法により出力する'(_誕生_月,_誕生_日) :- get_split_lines('output_b.txt',[' ',月,日],LL), 二分探索法(LL,_誕生_月,_誕生_日,[_学籍番号,_氏名,_誕生_月,_誕生_日]), writef('%t %t %t %t月%t日\n',[_学籍番号,_誕生_月,_誕生_日]). 二分探索法(LL,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- '1-3月を13-15月に修正'(_誕生_月,_誕生月_0), length(LL,Len), Len0 is Len // 2, append(L0,[[_学籍番号_1,_氏名_1,_誕生_月_1,_誕生_日_1]|L1],LL), length(L0,Len0), '1-3月を13-15月に修正'(_誕生_月_1,_誕生月_10), 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]). 二分探索法(L0,L,L1,_誕生_月,_誕生_日,_誕生_月,_誕生_日,L) :- !. 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- [_誕生_月_0,_誕生_日] @> [_誕生_月_10,_誕生_日_1], 二分探索法(L0,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]). 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- [_誕生_月_0,_誕生_日] @< [_誕生_月_10,_誕生_日_1], 二分探索法(L1,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]). writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1276810079/535 # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):data.txtに書かれている氏名と成績を読み込み、氏名を2次元配列、成績を1次元配列に格納せよ。 # 'data.txtに書かれている氏名と成績を読み込み、氏名を2次元配列、成績を1次元配列に格納する' :- get_split_lines('data.txt',[' '],LL),   '氏名を2次元配列、成績を1次元配列に格納する'(LL,_氏名ならび,_成績ならび), 氏名ならび・成績ならびを格納する(_氏名ならび,_成績ならび). '氏名を2次元配列、成績を1次元配列に格納する'([],[],[]). '氏名を2次元配列、成績を1次元配列に格納する'([[_氏名,_成績]|R1],[_氏名文字ならび|R2],[_成績|R3]) :- atom_chars(_氏名,_氏名文字ならび), '氏名を2次元配列、成績を1次元配列に格納する'(R1,R2,R3). 氏名ならび・成績ならびを格納する(_氏名ならび,_成績ならび) :- assertz(氏名ならび(_氏名ならび)), assertz(成績ならび(_成績ならび)). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1267796762/415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- 指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか(_指定した科目), 指定した点数を得る。点数は整数。(_指定した点数), shs('ls -N *.txt',L1), このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する(L1,_指定した科目,_指定した点数). このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する([_テキストファイル名|R1],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の出席番号を得る(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号), writef('%t\n',[_生徒の出席番号]). このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する([_|R1],_指定した科目,_指定した点数) :- このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する(R1,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の出席番号を得る(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号) :- 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号), open(_テキストファイル名,read,Input), get_split_lines(Input,[' ',':'],L), close(Input), member([_指定した科目,_指定した点数],L). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- replace(_テキストファイル名,'.txt','',_生徒の出席番号). 科目を得る。科目は数学、英語、国語、理科、社会のどれか(_指定した科目) :- write('科目を入力してください : '), get_line(_科目), member(_指定した科目,[数学,英語,国語,理科,社会]),!. 科目を得る。科目は数学、英語、国語、理科、社会のどれか(_指定した科目) :- 科目を得る。科目は数学、英語、国語、理科、社会のどれか(_指定した科目). 指定した点数を得る。点数は整数。(_指定した点数) :- write('点数(整数)を入力してください : '), get_integer(_指定した点数),!. 指定した点数を得る。点数は整数。(_指定した点数) :- 指定した点数を得る。点数は整数。(_指定した点数). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1280653311/72 # C言語の問題なのですが # # 4ケタの番号,名前,名前(フリガナ),都道府県,住所,電話番号 # # といった300人分の名簿データみたいなcsvファイルがあり # それをで4ケタの番号どうりに単純ソートで昇順に表示して # 番号を入力すると2分探索で探索を開始し # 正しい番号を入力すると電話番号を、不正な番号を入力すると # エラー表示が出るプログラムを作成したいのですがわからず困ってます # どなたかよろしくお願いします # (malloc関数は使わずにとの事です) # # '4ケタの番号,名前,名前(フリガナ),都道府県,住所,電話番号といった300人分のcsvファイルがあり、番号を入力すると2分探索で探索を開始し正しい番号を入力すると電話番号を不正な番号を入力するとエラー表示する'(_csvファイル) :- write('検索する4ケタの番号を入力してください : '), get_integer(N), get_split_lines(_csvファイル,[','],L1), '4ケタの番号どうりに単純ソートで昇順にならべる'(L1,L2), lenth(L2,Len), M is Len // 2, nth1(M,L2,L), 2分探索で探索(1,M,Len,L2,N,L,X), writef('%t,%t,%t,%t,%t,%t\n',X). '4ケタの番号,名前,名前(フリガナ),都道府県,住所,電話番号といった300人分のcsvファイルがあり、それを4ケタの番号どうりに単純ソートで昇順に表示'(_csvファイル) :- get_split_lines(_csvファイル,L1), '4ケタの番号どうりに単純ソートで昇順にならべる'(L1,L2), '4ケタの番号どうりに表示'(L2). '4ケタの番号どうりに単純ソートで昇順にならべる'(L1,L2) :- sort(L1,L2),!. '4ケタの番号どうりに表示'([]) :- !. '4ケタの番号どうりに表示'([L|R]) :- concat_atom(L,',',A), writef('%t\n',[A]), '4ケタの番号どうりに表示'(R). 2分探索で探索(_,_,_,_,N,[N|R],[N|R]) :- !. 2分探索で探索(S,M,E,L2,N,[N1|R1],X) :- N1 < N, M2 is (S+M) // 2, nth1(M2,L2,L1), 2分探索で探索(S,M2,M,L2,N,L1,X),!. 2分探索で探索(S,M,E,L2,N,[N1|R1],X) :- N1 > N, M2 is (M+E) // 2, nth1(M2,L2,L1), 2分探索で探索(M,M2,E,L2,N,L1,X),!. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1260532772/827 # 770で一度投稿しましたが問題文に不足が多かったため再度投稿します。 # [1] 授業単元:プログラミング # [2] 問題文:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10362.txt[3] 環境 # 下記の機能を備えた極めて単純なデータベースシステムであるカード型データベースシステムの構築を考える。 # 課題7-1 # 下記のような方針でプログラムを作成せよ。 # # 新しい科目を登録する機能 # すでに登録されている科目を修正(更新)する機能 # 登録科目のソート(並び替え)を行う機能 # 登録科目の一部分のみを検索して取り出し、表示する機能 # 登録科目から、卒業までに必要な単位を計算し、表示する機能 # データベースファイルの仕様 # データベースファイルについては、本格的なデータベースになると、アクセス性や # 安定性など様々な要求を満たす必要があるが、ここでは最も単純なテキストファイルとする。 # さらに、書き込みをfprintfで、読み込みをfscanfで行えるように、 1行中に、 # それぞれの項目(フィールド)がスペースで区切られているようなファイルとする。 # なお、この場合、それぞれの項目はスペースを含んでいけないこととなる。 # 履修科目データベースシステムの例においては、例えば、 # 単位の種類(必修、選択必修など)、単位数、年次、前期か後期か、再履修かどうか、成績の6項目を含むこととする。 # ここで、いくつかの選択肢から選択するものについては、数字で置き換えることとする。 # このような仕様に基づいたファイルの例は以下のようなものになる。ここでは、ファイル名は、"ユーザ名_kamokudb.txt"とする。 # typedef struct _KAMOKU { # char name[MAX_KAMOKU_NAME]; /* 科目名 */ # int tanni_type; /* 必修、選択必修、選択、自由のいずれか */ # int tanni; /* 何単位か */ # int nenji; /* 何年次か */ # int kouki_flag; /* 前期なら0、後期なら1 */ # int sairi_flag; /* 再履修なら1、そうでないなら0 */ # int seiseki; /* 59点以下は不可、-1は未履修であることを示す */ # } KAMOKU; # # KAMOKU kamoku_list[200]; 履修科目データベースシステムを実装し、実行した例を以下に示す。なお、これは一例であって、課題は以下の通りに動作する必要はない。 ****** 単位データベースシステム ****** ユーザー名を入力して下さい:yamada ユーザー yamada は存在しません。データベースを新規に作成しますか? [1] Yes [2] No 番号を選択してください:1 **** 機能選択 **** [1] 科目登録 [2] 科目修正・削除 [3] データベース表示 [4] 必要単位数の表示 [5] 検索 [6] 並び替え [99] プログラム終了 機能を選択してください:1 **** 科目登録 **** 登録する科目を入力します。スペースを含まないローマ字で入力して下さい。 エンターキーのみを入力すると、科目の登録が終了します。 科目名:programming_ennsyuu_2 programming_ennsyuu_2 の情報を入力して下さい。 [1] 必修 [2] 選択必修 [3] 選択 [4] 自由 単位の種類:1 単位数:1 年次:2 [1] 前期 [2] 後期 前期・後期:2 [1] 非再履修 [2] 再履修 再履修:1 成績(-1:未履修):70 programming_ennsyuu_2 の情報を次のように登録します:必修, 1単位, 2年次, 後期, 非再履修, 70点 [1] 登録 [2] 再入力 番号を選択してください:1 programming_ennsyuu_2 の情報を登録しました。 科目名:denki_kairo_ennsyuu : 科目名: 科目登録を終了します。 **** 機能選択 **** : 機能を選択してください:2 **** 科目修正・削除 **** [1] programming_ennsyuu_2 [2] denki_kairo_ennsyuu [3] denki_kairo_kiso [4] digital_shingou_syori : 修正・削除する科目を選択して下さい:2 denki_kairo_ennsyuu の情報を修正して下さい。 最初の単位の種類で、[0] 削除 を選択すると、削除されます。 また、エンターキーを押すと、大括弧内の値が選択されます。 [0] 削除 [1] 必修 [2] 選択必修 [3] 選択 [4] 自由 単位の種類[3]: 単位数[1]: 年次[2]: [1] 前期 [2] 後期 前期・後期[1]: [1] 非再履修 [2] 再履修 再履修[1]: 成績(-1:未履修)[75]:85 denki_kairo_ennsyuu の情報を次のように修正します:選択, 1単位, 2年次, 前期, 非再履修, 85点 [1] 登録 [2] 再入力 番号を選択してください:1 denki_kairo_ennsyuu の情報を修正しました。 : 機能を選択してください:5 **** 検索 **** [1] 科目名 [2] 年次 [3] 前期・後期 [4] 不可の科目 検索したい項目を選択して下さい:2 年次を検索します。 検索対象:2 年次が 2 であるのは以下のものです: denki_kairo_kiso: 選択必修, 2単位, 2年次, 前期, 非再履修, 65点 denki_kairo_ennsyuu: 選択, 1単位, 2年次, 前期, 非再履修, 85点 programming_ennsyuu_1: 必修, 1単位, 2年次, 前期, 非再履修, 75点 programming_ennsyuu_2: 必修, 1単位, 2年次, 後期, 非再履修, 70点 digital_shingou_syori: 必修, 2単位, 2年次, 後期, 非再履修, 30点 : : 機能を選択してください:6 **** 並び替え **** [1] 科目名 [2] 年次 [3] 点数 どの項目で並べ替えるか選択して下さい:3 点数を昇順で並べ替えます。 digital_shingou_syori: 必修, 2単位, 2年次, 前期, 非再履修, 30点 denki_kairo_kiso: 選択必修, 1単位, 2年次, 前期, 非再履修, 65点 programming_ennsyuu_2: 必修, 1単位, 2年次, 後期, 非再履修, 70点 programming_ennsyuu_1: 必修, 1単位, 2年次, 前期, 非再履修, 75点 denki_kairo_ennsyuu: 選択, 1単位, 2年次, 前期, 非再履修, 85点 : : 機能を選択してください:4 **** 必要単位数の表示 **** 卒業に必要な単位数は、合計 62単位 総合基礎部門 計0単位 選択必修科目 0単位 選択科目 0単位 専門教育部門 計62単位 必修科目 12単位 選択必修科目 16単位 選択科目 34単位 : 機能を選択してください:99 プログラムを終了します。 データベースファイル yamada_kamokudb.txt を更新しました。 拡張 上記のプログラムの拡張を考える。例えば、以下のようなものが考えられる。 修得済み単位数や、不可となった科目を表示するなど、上記以外の機能を提供する。 検索において、完全一致のものだけでなく、条件に見合ったものを出力するようにする。 並び替えにおいて、年次だけでなく、年次と前期・後期を考慮した並べ替えをするなど、 他の並び替え方法を提供する。 データベースファイルとして、コンマ区切りのテキストファイルを用いる。 上記では、データファイルにスペース区切りのテキストファイルを用いたが、コンマ区切りのテキストファイル(CSVファイル)が用いられることも多い。この場合、フィールドにスペースが含まれていても問題なく動作する(ただし、コンマが含まれる場合には何らかの対策が必要になる)。 CSVファイルの読み込みのためには、いくつかの方法があるが、fgetsで読み込み、文字','を探す方法などが考えられる。また、strchrという関数が、文字列から特定の文字を含む箇所を取り出すものであるため、 fgetsとこれを組み合わせる方法もある。 構造体の配列を用いるのではなく、構造体へのポインタに対しmallocでメモリ確保する方法を用いる。 この場合、状況に応じてサイズを変えることが可能となる。ただし、確保したメモリは、使わなくなった場合には解放する必要がある。 KAMOKU *kamoku_list = NULL; : int num_list = 200; : kamoku_list = malloc(sizeof(struct _KAMOKU) * num_list); /* これ以降は、200の要素を持つ構造体の配列と同様に使用できる */ : printf("成績:%d\n", kamoku_list[0].seiseki); : free(kamoku_list); その他、既存のデータベースシステム等を参考にして機能を追加する。 履修科目データベースの検索(_検索項目,_検索鍵,_検索データ) :- get_split_lines('ユーザ名_kamokudb.txt',[' '],LL), member(_検索データ,LL), 鍵情報(_検索項目名,_検索データ,_検索鍵). 鍵情報(科目名,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_科目名). 鍵情報(単位の種類,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_単位の種類). 鍵情報(単位数,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_単位数). 鍵情報(年次,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_年次). 鍵情報(後期,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_後期). 鍵情報(前期,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_前期). 鍵情報(再履修,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_再履修). 鍵情報(成績,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_成績). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 鍵情報ソースプログラムの生成(_項目名ならび) :- append(_,[_項目名|R],_項目名ならび), findall(B,(member(A,_項目名ならび),concat_atom(['_',A],B)),L2), concat_atom(L2,',',_項目名ならび文字列), writef('鍵情報(%t,[%t],_%t).\n',[_項目名,_項目名ならび文字列,_項目名]), R = []. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1280653311/552 # [1] 授業単元: 研究 # [2] 問題文(含コード&リンク):口頭の支持のみ # # 処理の内容ですが、CSVファイルの容量が多いため処理量を把握できていません。 # そのためサンプルのような形でお願いします。 # 処理としては、 # CSVファイルの列ごとに、ある固定値をかけるというものです。(よって列によってでかけるものが変わる) # また、何も行わない列もあります。(1部分の列のみに数値をかける)そしてその結果を出力するというものです。 # # もし、この説明で漠然としているようでしたらご指摘お願い致します。 CSVファイルの列ごとに、ある固定値をかける(_列ごとの乗数ならび,_入力CSVファイル,_出力CSVファイル) :- get_split_lines(_入力csvファイル,[',',' '],LL), 列ごとに、ある固定値をかける(_列ごとの乗数ならび,LL1,LL2), CSVファイルとして出力する(_出力CSVファイル,LL2,','). 列ごとに、ある固定値をかける([],[],[]) :- !. 列ごとに、ある固定値をかける([V|R1],[B|R2],[B|R3]) :- var(V), 列ごとに、ある固定値をかける(R1,R2,R3),!. 列ごとに、ある固定値をかける([1|R1],[B|R2],[B|R3]) :- 列ごとに、ある固定値をかける(R1,R2,R3),!. 列ごとに、ある固定値をかける([A|R1],[B|R2],[C|R3]) :- C is A * B, 列ごとに、ある固定値をかける(R1,R2,R3). CSVファイルとして出力する(_出力CSVファイル,LL,_区切り文字) :- findall(S,( member(L,LL), concat_atom(L,_区切り文字,S)), L2), put_lines(_出力CSVファイル,L2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1284632294/419 # すいません。早い回答ありがとうございます # # 【質問テンプレ】 # [1] C言語 # [2] 乱数に数字列が列挙しているtxtファイルから読み込んでint配列の形でソート(どのソートでもよい)を行って別のtxtファイルに書き込む # 現状ではソート,ファイル書き込みの内容はできあがっているがファイルから読み込んでint配列の形にする部分で悩んでいる # # '乱数に数字列が列挙しているtxtファイルから読み込んでint配列の形でソート(どのソートでもよい)を行って別のtxtファイルに書き込む'(_txtファイル,_別のtxtファイル) :- get_split_lines(_txtファイル,[' ',','],LL), 'ソート(どのソートでもよい)を行って'(LL,L2), put_lines(_別のtxtファイル,L2). 'ソート(どのソートでもよい)を行って'([],[]) :- !. 'ソート(どのソートでもよい)を行って'([L1|R1],[S|R2]) :- クイックソート(L1,L2), concat_atom(L2,' ',S), 'ソート(どのソートでもよい)を行って'(R1,R2). クイックソート([],[]) :- !. クイックソート([A|R1],L2) :- クイックソート(A,R1,L2). クイックソート(A,L1,L2) :- 整列のための分割(A,L1,L3,L4), クイックソート(L3,L5), クイックソート(L4,L6), append(L5,[A|L6],L2). 整列のための分割(A,[],[],[]) :- !. 整列のための分割(A,[B|R1],[B|R2],L) :- B @< A, 整列のための分割(A,R1,R2,L),!. 整列のための分割(A,[B|R1],L,[B|R2]) :- B @>= A, 整列のための分割(A,R1,L,R2),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1284632294/521 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # present.datを読み込み、小文字を全て大文字に変換し、以下のような形式[1]でファイルを # 出力するプログラムを作成せよ。また、present.datに自由なデータを6行追加し動作する # ことを確認せよ。またこの際にpriceが空白の行を設け、priceが空白であった場合には # price: xxxxと出力するようにせよ。 # # [1] # code: abc-23 # name: tea_set # price: 2500 # . # . # . # 以下略 # # present.dat # ↓ # ABC-23 Tea_set 2500 # EFG-34 Peach 2000 # HIJ-21 Greep 1500 # # 'present.datを読み込み、小文字を全て大文字に変換し、以下のような形式[1]でファイルを出力する。またこの際にpriceが空白の行を設け、priceが空白であった場合にはprice: xxxxと出力する'(_出力ファイル名) :- get_split_lines('present.dat',[': ',' '],LL1), '形式[1]に変換'(LL1,Lines), put_lines(_出力ファイル,Lines). '形式[1]に変換'([],[]) :- !. '形式[1]に変換'([[code,_code],[name,_name],[price,_price]|R1],[S|R2]) :- to_upper(_code,_code_2), to_upper(_name,_name_2), 'priceが空白であった場合にはprice: xxxxと'(_price,_price_2), concat_atom([_code_2,_name_2,_price_2],' ',S), '形式[1]に変換'(R1,R2). 'priceが空白であった場合にはprice: xxxxと'(_price,_price) :- number(_price),!. 'priceが空白であった場合にはprice: xxxxと'('','XXXX') :- !. % 以下のサイトは 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/1288531658/965 # [1] 授業単元:統計データ解析 # [2] 問題文: # # 【時刻】【降水量】【気温】 # 1 10:00 10 10 # 2 10:30 10 20 # ・ # ・ # 300000 22:30 20 25 # # 上記のテキストデータをそれぞれリストとして読み取り、降水量の最大値と気温の平均値を求めるプログラムを作成せよ。尚、時刻は文字列として読み取ること。 # 'テキストデータをそれぞれリストとして読み取り、降水量の最大値と気温の平均値を求めるプログラムを作成せよ。尚、時刻は文字列として読み取ること。'(_統計データファイル,_最大降水量,_平均気温) :- get_split_lines(_統計データファイル,[' '],LL), findall(_時刻, append(_,[[_,_時刻,_,_]|_],LL), _時刻ならび), findall(_降水量, append(_,[[_,_,_降水量,_]|_],LL), _降水量ならび), findall(_気温, append(_,[[_,_,_,_気温]|_],LL), _気温ならび), 最大値(_降水量ならび,_最大降水量), 相加平均(_気温ならび,_平均気温). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1289816228/96 # 文字で0〜255までのランダムな数字が、区切りにランダムな個数の半角スペースを使って、ずらっと並んでるファイルがあります。これをバイナリデータに変換したいんだけど、何か案はありませんか? # # # '文字で0〜255までのランダムな数字が、区切りにランダムな個数の半角スペースを使って、ずらっと並んでるファイルがあります。これをバイナリデータに変換する'(_入力ファイル,_出力ファイル) :- get_split_lines(_入力ファイル,[' '],LL), flat(LL,L), open(_出力ファイル,write,Outstream,[type(binary)]), append(_,[Code|R],L), put_byte(Outstream,Code), R = [], close(Outstream),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1289913298/570 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # file1.csv(マスタファイル)からデータを読み込みfile2.csv(トランザクションファイル)に記述された内容でデータを更新・追加し、 # 再度file1.csvに保存せよ。 # # file1.csv # 1,Ken Kawakami,kawakami@xxxxx.xx.jp # 2,Toshiyuki Ishikura,ishikura@xxxxx.xx.jp # 3,Yuuta Hayashi,yutahaya@xxxxx.xx.jp # 4,Kazuwo Inoue,inoue@xxxxx.xx.jp # 5,Kinya Nagata,osada@xxxxx.xx.jp # 6,Yuki Hayashi,yukihaya@xxxxx.xx.jp # 7,Yoshiyuki Hihara,hihara@xxx.xx.jp # # file2.csv # 2,,isikura@xxx.xx.xx.jp # 4,Kazuo Inoue, # 5,,nagata@xxxxx.xx.jp # 7,Yoshiyuki Hinohara,hinohara@xxx.xx.jp # 8,Kouki Takahashi,takahashi@xxxxx.xx.jp # 9,airi Saito,saito@xxx.xx.xx.jp # 'file1.csv(マスタファイル)からデータを読み込みfile2.csv(トランザクションファイル)に記述された内容でデータを更新・追加し、再度file1.csvに保存せよ。' :- 'file1.csv(マスタファイル)からデータを読み込み'(LL1), 'file2.csv(トランザクションファイル)に記述された'(LL2), '内容でデータを更新・追加し、'(LL2,LL1,LL3), '再度file1.csvに保存する'(LL3). 'file1.csv(マスタファイル)からデータを読み込み'(LL1) :- get_split_lines('file1.csv',[','],LL1). 'file2.csv(トランザクションファイル)に記述された内容で'(LL2) :- get_split_lines('file2.csv',[','],LL2). '内容でデータを更新・追加し、'([],LL,LL) :- !. '内容でデータを更新・追加し、'([[N|R02]|R2],LL1,LL) :- トランザクションの行指定と合致する行を更新する(N,R02,LL1,LL3), '内容でデータを更新・追加し、'(R2,LL3,LL),!. '内容でデータを更新・追加し、'([[N|R02]|R2],LL1,LL) :- トランザクションの行指定に合致しないがより小さい行とより大きい行があるためその間に挿入する(N,R02,LL1,LL3), '内容でデータを更新・追加し、'(R2,LL3,LL),!. '内容でデータを更新・追加し、'([[N|R02]|R2],LL1,LL) :- トランザクションの行指定より小さい行がないため先頭に挿入する(N,R02,LL1,LL3), append([[N|R02]],LL1,LL3), '内容でデータを更新・追加し、'(R2,LL3,LL),!. '内容でデータを更新・追加し、'([[N|R02]|R2],LL1,LL) :- トランザクションの行指定が現在の最大行を越えているため末尾に挿入する(N,R02,LL1,LL3), '内容でデータを更新・追加し、'(R2,LL3,LL),!. トランザクションの行指定と合致する行を更新する(N,R02,LL1,LL3) :- append(L0,[[N|R01]|R1],LL1), append(L0,[[N|R02]|R1],LL3),!. トランザクションの行指定に合致しないがより小さい行とより大きい行があるためその間に挿入する(N,LL1,LL3) :- append(L0,[[N1|R01]|R1],LL1), N1 > N, max(L0,M), M < N, append(LL0,[[N|R02]|R1],LL3),!. トランザクションの行指定より小さい行がないため先頭に挿入する(N,R02,LL1,LL3) :- append([],[[N1|R01]|R1],LL1), N1 > N, append([[N|R02]],LL1,LL3),!. トランザクションの行指定が現在の最大行を越えているため末尾に挿入する(N,R02,LL1,LL3) :- \+((append(L0,[[N1|R01]|R1],LL1),N1 > N)), append(LL1,[[N|R02]],LL3),!. '再度file1.csvに保存する'(LL3) :- findall(S,( append(_,[L|_],LL3), concat_atom(L,',',S)), LL4), open('file1.csv',write,Outstram), append(_,[Line|R],LL4), writef(Outstream,'%t\n',[Line]), R = [], close(Outstream),!. writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1291471791/937 # 【質問テンプレ】 # [1] 授業単元:画像処理学 # [2] 問題文(含コード&リンク): #   指定されたエクセルのCSVファイルの中にあるデータを読み込み #   それぞれのデータの各列に列の番号の値を加えて #   別のCSVファイルとして出力せよ. 指定されたエクセルのCSVファイルの中にあるデータを読み込みそれぞれのデータの各列に列の番号の値を加えて別のCSVファイルとして出力せよ(_指定されたCSVファイル,_別のCSVファイル) :- get_split_lines(_指定されたCSVファイル,[' ',','],LL), それぞれのデータの各列に列の番号の値を加えて(LL,LL2), put_lines(_別のCSVファイル,LL2). それぞれのデータの各列に列の番号の値を加えて([],[]) :- !. それぞれのデータの各列に列の番号の値を加えて([L1|R1],[L2|R2]) :- findall(_加算された値,( append(L0,[_値|_],L1), length([_|L0],_列の番号), _加算された値 is _値 + _列の番号), L2), それぞれのデータの各列に列の番号の値を加えて(R1,R2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1291471791/956 # 【質問テンプレ】 # [1] 授業単元:画像処理学 # [2] 問題文(含コード&リンク): #   指定されたエクセルファイルの中にあるデータを読み込み #   各列ごとにそれぞれのデータに対し[0,1]区間に正規化し #   別のエクセルファイルとして出力せよ. # '指定されたエクセルファイルの中にあるデータを読み込み各列ごとにそれぞれのデータに対し[0,1]区間に正規化し別のエクセルファイルとして出力せよ.'(_指定されたCSVファイル,_別のCSVファイル) :- get_split_lines(_指定されたCSVファイル,[' ',','],LL), 転置(LL,LL1), 行単位に正規化(LL1,LL2), 転置(LL2,LL3), csvファイルとして出力する(_別のcsvファイル,LL3). 行単位に正規化([],[]) :- !. 行単位に正規化([L1|R1],[L2|R2]) :- 相加平均(L1,_相加平均), 標準偏差(L1,_標準偏差), 正規化(L1,_相加平均,_標準偏差,L2), 行単位に正規化(R1,R2). 正規化([],_,_,[]) :- !. 正規化([A|R1],_相加平均,_標準偏差,[B|R2]) :- B is (_相加平均 - A) / _標準偏差, 正規化(R1,_相加平均,_標準偏差,R2). csvファイルとして出力する(_別のcsvファイル,LL) :- open(_別のcsvファイル,write,Outstream), append(_,[L|R],LL), concat_atom(L,',',S), writef(Outstream,'%t\n',[S]), R = [], close(Outstream). writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1291471791/965 # 【質問テンプレ】 # [1] 授業単元:画像処理学 # [2] 問題文(含コード&リンク): #   正規化されたエクセルファイルの中にあるデータを読み込み #   そのデータをそれぞれx軸の値として #   y = x + a  の式との交点であるy軸の値をそれぞれ #   別のエクセルファイルとして出力せよ. #   a の値は -1〜1 までの値を0.5刻みでランダムにとり #   同じ行では同じ関数を使うものとする. # '正規化されたエクセルファイルの中にあるデータを読み込みそのデータをそれぞれx軸の値として y = x + a の式との交点であるy軸の値をそれぞれ別のエクセルファイルとして出力せよ. a の値は -1〜1 までの値を0.5刻みでランダムにとり同じ行では同じ関数を使うものとする. ' :- '正規化されたエクセルファイルの中にあるデータを読み込み'(_正規化されたCSVファイル,LL), 'そのデータをそれぞれx軸の値として y = x + a の式との交点であるy軸の値に変換'(LL,LL2), 別のCSVファイルに出力する(_別のCSVファイル,LL2). '正規化されたエクセルファイルの中にあるデータを読み込み'(_正規化されたCSVファイル,LL) :- get_split_lines(_正規化されたCSVファイル,[' ',','],LL). 'そのデータをそれぞれx軸の値として y = x + a の式との交点であるy軸の値に変換'([],[]) :- !. 'そのデータをそれぞれx軸の値として y = x + a の式との交点であるy軸の値に変換'([L1|R1],[L2|R2]) :- 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a), findall(Y,( append(_,[X|_],L1), Y is X + _a), L2), 'そのデータをそれぞれx軸の値として y = x + a の式との交点であるy軸の値に変換'(R1,R2). 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a) :- _a is ((random mod 5) - 2) / 2. 別のCSVファイルに出力する(_別のCSVファイル,LL) :- open(_別のCSVファイル,write,Outstream), append(_,[L|R],LL), concat_atom(L,',',S), writef(Outstream,'%t\n',[S]), R = [], close(Outstream). writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1291471791/985 # 帰ってくるのがこの時間帯になるもので遅くなって申し訳ないです # ../test/read.cgi/tech/1291471791/975, ../test/read.cgi/tech/1291471791/978拝見させていただきました # ../test/read.cgi/tech/1291471791/975の41行目 ../test/read.cgi/tech/1291471791/978の42行目の # csv = calloc(1, sizeof(CSV)); # という記述に対して #        'void *' から 'CSV *' に変換できません。 # というエラーが出ます # ../test/read.cgi/tech/1291471791/979さんのは実行の仕方が解らないのでただいま勉強中です # # また../test/read.cgi/tech/1291471791/965の問ですがこれは「正規化された値にランダム数を足す」のではなく # (以下2行は手順を追うための文です) # 正規化された値(範囲は[0,1])と 「関数y=x」の交点の値を別のcsvとして出力します # ここまでだと入力と出力のファイルが同じになります # (ここから本問) # 正規化された値(範囲は[0,1])と 「関数y=x+a」の交点の値を別のcsvとして出力します # a の値は-1〜1 までの値を0.5刻みでランダムにとり # 同じ横列では同じ関数を使って交点をとるものとする # それを縦列数分繰り返して出力するということです # データは横5データ縦250データのデータです # 横列ごとに同一の関数と比較した交点の出力なので # 結果としては正規化されただけのデータと比べて横列では同じ程度の数値の変化になります # 指定されたエクセルのCSVファイルの中にあるデータを読み込みそれぞれのデータの各列に列の番号の値を加えて別のCSVファイルとして出力せよ(_指定されたCSVファイル,_別のCSVファイル) :- get_split_lines(_指定されたCSVファイル,[' ',','],LL), それぞれのデータの各列に関数を適用する(LL,LL2), put_lines(_別のCSVファイル,LL2). それぞれのデータの各列に関数を適用する([],[]) :- !. それぞれのデータの各列に関数を適用する([L1|R1],[L2|R2]) :- 各列に関数を適用する(L1,L2), それぞれのデータの各列に関数を適用する(R1,R2). '各列に関数を適用する'(L1,L2) :- findall(_加算された値,( 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a), append(L0,[_値|_],L1), length([_|L0],_列の番号), _加算された値 is _値 + _a), L2). 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a) :- _a is ((random mod 5) - 2) / 2. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1291471791/985 # 帰ってくるのがこの時間帯になるもので遅くなって申し訳ないです # ../test/read.cgi/tech/1291471791/975, ../test/read.cgi/tech/1291471791/978拝見させていただきました # ../test/read.cgi/tech/1291471791/975の41行目 ../test/read.cgi/tech/1291471791/978の42行目の # csv = calloc(1, sizeof(CSV)); # という記述に対して #        'void *' から 'CSV *' に変換できません。 # というエラーが出ます # ../test/read.cgi/tech/1291471791/979さんのは実行の仕方が解らないのでただいま勉強中です # # また../test/read.cgi/tech/1291471791/965の問ですがこれは「正規化された値にランダム数を足す」のではなく # (以下2行は手順を追うための文です) # 正規化された値(範囲は[0,1])と 「関数y=x」の交点の値を別のcsvとして出力します # ここまでだと入力と出力のファイルが同じになります # (ここから本問) # 正規化された値(範囲は[0,1])と 「関数y=x+a」の交点の値を別のcsvとして出力します # a の値は-1〜1 までの値を0.5刻みでランダムにとり # 同じ横列では同じ関数を使って交点をとるものとする # それを縦列数分繰り返して出力するということです # データは横5データ縦250データのデータです # 横列ごとに同一の関数と比較した交点の出力なので # 結果としては正規化されただけのデータと比べて横列では同じ程度の数値の変化になります # # 問3は問2の拡大版で # 正規化された値と関数y=x+aとの比較を各横列ごとに3回行うということです # セル1-1に対して「y=x+a1との交点」「y=x+a2との交点」「y=x+a3との交点」 の値を # 出力するCSVのセル1-1の位置に a1との解 , a2との解 , a3との解 # とコンマで刻んで出力します # また正規化されたCSVが横5縦250なので横6縦250のところに # 使用したaの値を a1,a2,a3 と出力せよということです # 結果的には # a1解,a2解,a3解 a1解,a2解,a3解 a1解,a2解,a3解 a1解,a2解,a3解 a1解,a2解,a3解 a1,a2,a3 # となります # この横列が250行縦に続きます # # 元データの形(行列が詳しくないもので正しい用語を使えてるかわからないので) # 1 2 3 4 5 # 1 2 3 4 5  横が5つのデータで # 〜〜〜〜〜〜〜〜〜  縦が250個のデータです # 1 2 3 4 5  並み線は147個分省略 # # 指定されたエクセルのCSVファイルの中にあるデータを読み込みそれぞれのデータの各列に列の番号の値を加えて別のCSVファイルとして出力せよ(_指定されたCSVファイル,_別のCSVファイル) :- get_split_lines(_指定されたCSVファイル,[' ',','],LL), length(Ln,3), それぞれのデータの各列に関数をLn回適用する(LL,LL2), put_lines(_別のCSVファイル,LL2). それぞれのデータの各列に関数をLn回適用する(_,[],[]) :- !. それぞれのデータの各列に関数をLn回適用する(Ln,[L1|R1],[L2|R2]) :- 各列に関数を適用する(Ln,L1,L2), それぞれのデータの各列に関数をLn回適用する(Ln,R1,R2). '各列に関数を適用する'([],L,L) :- !. '各列に関数を適用する'([_|Ln],L1,L) :- findall(_加算された値,( 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a), append(L0,[_値|_],L1), length([_|L0],_列の番号), _加算された値 is _値 + _a), L2), '各列に関数を適用する'(Ln,L2,L). 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a) :- _a is ((random mod 5) - 2) / 2. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1294061094/3 # 【質問テンプレ】 # [1] 授業単元:画像処理学 # [2] 問題文(含コード&リンク): #   指定されたエクセルファイル(csv1)の中にあるデータを読み込み #   各列ごとにそれぞれのデータに対し[0,1]区間に正規化し #   別のエクセルファイル(csv2)として出力せよ. #   正規化されたエクセルファイルの中にあるデータを読み込み #   そのデータをそれぞれx軸の値として #   y = x + a  の式との交点であるy軸の値をそれぞれ #   別のエクセルファイルとして出力(csv3)せよ. #   a の値は -1〜1 までの値を0.5刻みでランダムにとり #   同じ行では同じ関数を使うものとする. #   その後そのプログラムに加え #   各行に対し3つずつそれぞれランダムにaを決定した関数との接点を求め出力する. #   また6列目に使用したaの値をa1,a2,a3という形で出力(csv4)せよ. # '指定されたエクセルファイル(csv1)の中にあるデータを読み込み各列ごとにそれぞれのデータに対し[0,1]区間に正規化し別のエクセルファイル(csv2)として出力する'(_指定されたCSVファイル,_別のCSVファイル) :- get_split_lines(_指定されたCSVファイル,[' ',','],LL1), 転置(LL1,LL2), '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'(LL2,LL3), 転置(LL3,LL4), '別のエクセルファイル(csv2)として出力する'(LL4,_別のCSVファイル). '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'([],[]) :- !. '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'([L1|R1],[L2|R2]) :- 相加平均(L1,_相加平均), 標準偏差(L1,_標準偏差), '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'(L1,_相加平均,_標準偏差,L2), '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'(R1,R2). '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'([A|R1],_相加平均,_標準偏差,[B|R2]) :- B is ( A - _相加平均) / _標準偏差, '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'(R1,_相加平均,_標準偏差,R2). '別のエクセルファイル(csv2)として出力する'(_別のCSVファイル,LL) :- open(_別のCSVファイル,write,Outstream), 'CSVファイルとして出力する'(Outstream,LL), close(Outstream). 'CSVファイルとして出力する'(Outstream,[]) :- !. 'CSVファイルとして出力する'(Outstream,[L|R]) :- concat_atom(L,',',S), writef(Outstream,'%t\n',[S]), 'CSVファイルとして出力する'(Outstream,R). writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1294061094/3 # 【質問テンプレ】 # [1] 授業単元:画像処理学 # [2] 問題文(含コード&リンク): #   指定されたエクセルファイル(csv1)の中にあるデータを読み込み #   各列ごとにそれぞれのデータに対し[0,1]区間に正規化し #   別のエクセルファイル(csv2)として出力せよ. #   正規化されたエクセルファイルの中にあるデータを読み込み #   そのデータをそれぞれx軸の値として #   y = x + a  の式との交点であるy軸の値をそれぞれ #   別のエクセルファイルとして出力(csv3)せよ. #   a の値は -1〜1 までの値を0.5刻みでランダムにとり #   同じ行では同じ関数を使うものとする. #   その後そのプログラムに加え #   各行に対し3つずつそれぞれランダムにaを決定した関数との接点を求め出力する. #   また6列目に使用したaの値をa1,a2,a3という形で出力(csv4)せよ. # '正規化されたエクセルファイルの中にあるデータを読み込みそのデータをそれぞれx軸の値として y = x + a  の式との交点であるy軸の値をそれぞれ別のエクセルファイルとして出力(csv3)せよ. a の値は -1〜1 までの値を0.5刻みでランダムにとり同じ行では同じ関数を使うものとする'(_正規化されたCSVファイル,_別のCSVファイル) :- get_split_lines(_正規化されたCSVファイル,[' ',','],LL1), 'そのデータをそれぞれx軸の値として y = x + a  の式との交点であるy軸の値を'(LL1,LL2), '別のエクセルファイル(csv2)として出力する'(_別のCSVファイル,LL2). '別のエクセルファイル(csv2)として出力する'(_別のCSVファイル,LL) :- open(_別のCSVファイル,write,Outstream), 'CSVファイルとして出力する'(Outstream,LL), close(Outstream). 'そのデータをそれぞれx軸の値として y = x + a  の式との交点であるy軸の値を'([],[]) :- !. 'そのデータをそれぞれx軸の値として y = x + a  の式との交点であるy軸の値を'([L1|R1],[L2|R2]) :- 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a), findall(B,( append(_,[A|_],L1), B is A + _a), L2), 'そのデータをそれぞれx軸の値として y = x + a  の式との交点であるy軸の値を'(R1,R2). 'CSVファイルとして出力する'(Outstream,[]) :- !. 'CSVファイルとして出力する'(Outstream,[L|R]) :- concat_atom(L,',',S), writef(Outstream,'%t\n',[S]), 'CSVファイルとして出力する'(Outstream,R). 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a) :- _a is ((random mod 5) - 2) / 2. writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1294061094/14 # 【質問テンプレ】 # [1] 授業単元: Cプログラミング入門2 # [2] 問題文(含コード&リンク): #   ファイル入出力関数を使って偶数個の値が入ったsample.csvから #   偶数行の数値だけを取り出したeven.csvと #   奇数行の数値だけとりだしたodd.csvを作成し #   even.csvからodd.csvの値を引いたdiff.csvを作成しなさい。 # '偶数個の値が入ったsample.csvから偶数行の数値だけを取り出したeven.csvと奇数行の数値だけとりだしたodd.csvを作成しeven.csvからodd.csvの値を引いたdiff.csvを作成しなさい。' :- get_split_lines('sample.csv',[' ',','],LL1), '偶数行の数値だけを取り出したeven.csvと'(LL1), '奇数行の数値だけとりだしたodd.csvを作成し'(LL1), 'even.csvからodd.csvの値を引いたdiff.csvを作成する'. '偶数行の数値だけを取り出したeven.csvと'(LL) :- open('even.csv',write,Outstream1), '偶数行の数値だけを書く'(Outstream1,LL), close(Outstream1). '奇数行の値数値だけをとり出したeven.csvを作成し'(LL) :- open('odd.csv',write,Outstream2), '奇数行の数値だけを書く'(Outstream2,LL), close(Outstream2). '偶数行の数値だけを書く'(Outstream1,LL) :- !. '偶数行の数値だけを書く'(Outstream1,[_,L|R]) :- concat_atom(L,',',S), writef(Outstream,'%t\n',[S]), '偶数行の数値だけを書く'(Outstream1,R). '奇数行の数値だけを書く'(Outstream1,LL) :- !. '奇数行の数値だけを書く'(Outstream1,[L,_|R]) :- concat_atom(L,',',S), writef(Outstream1,'%t\n',[S]), '奇数行の数値だけを書く'(Outstream1,R). 'even.csvからodd.csvの値を引いたdiff.csvを作成する' :- get_split_lines('even.csv',[' ',','],LL1), get_split_lines('odd.csv',[' ',','],LL2), 'LL1からLL2の値を引く'(LL1,LL2,LL3), open('diff.csv',write,Outstream), csvファイルとして書く(Outstream,LL3), close(Outstream). 'LL1からLL2の値を引く'([],[],[]) :- !. 'LL1からLL2の値を引く'([A|R1],[B|R2],[C|R3]) :- C is A - B, 'LL1からLL2の値を引く'(R1,R2,R3). csvファイルとして書く(Outstream,[]) :- !. csvファイルとして書く(Outstream,[L|R]) :- concat_atom(L,',',S), writef(Outstream,'%t\n',[S]), csvファイルとして書く(Outstream,R). writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1294061094/32 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): #   巡回セールスマン問題 #   いくつかの都市と都市間を結ぶ経路があります。全ての都市を一巡するのに最も短い経路を求めるプログラムを作成せよ。 #   TSPのデータファイルはgr17.txtで、数字の部分が都市数です。 #   ファイルの記述の仕方が以下のようになっています。 # #   gr17.txtの例 # #   17   最初の数値は都市数 #   0    第0都市と第0都市との距離が0 #   633 0  第1都市と第0都市との距離が633、第1都市と第1都市との距離が0 #   257 390 0 第2都市と第0、第1、第2都市との距離がそれぞれ257,390,0 #   91 661 228 0 以下同様 #   412 227 169 383 0 # 150 488 112 120 267 0 #      以下略 # #   補足説明として #   ・同じ道を通ってもよい #   ・全ての都市を1回通ればよい(巡回しなくていい) #   ・全探索はなるべく使用しないで深さ優先探索、分子限定法を用いること # # 17 # 0 # 633 0 # 257 390 0 # 91 661 228 0 # 412 227 169 383 0 # 150 488 112 120 267 0 # 80 572 196 77 351 63 0 # 134 530 154 105 309 34 29 0 # 259 555 372 175 338 264 232 249 0 # 505 289 262 476 196 360 444 402 495 0 # 353 282 110 324 61 208 292 250 352 154 0 # 324 638 437 240 421 329 297 314 95 578 435 0 # 70 567 191 27 346 83 47 68 189 439 287 254 0 # 211 466 74 182 243 105 150 108 326 336 184 391 145 0 # 268 420 53 239 199 123 207 165 383 240 140 448 202 57 0 # 246 745 472 237 528 364 332 349 202 685 542 157 289 426 483 0 # 121 518 142 84 297 35 29 36 236 390 238 301 55 96 153 336 0 # # 'いくつかの都市と都市間を結ぶ経路があります。全ての都市を一巡するのに最も短い経路を求めるプログラムを作成せよ。'(_出発都市,_最短経路) :- グラフを読み取る(LL), グラフを作成する(LL,_都市数), findmin([_距離合計,_巡回ならび],( 巡回(_都市数,_出発都市,_巡回ならび,_距離合計)), [_距離合計,_最短経路]). グラフを読み取る(LL) :- get_split_lines('gr17.txt',[' '],LL). グラフを作成する([_都市数|R],_都市数) :- グラフを作成する([],R). グラフを作成する([],_) :- !. グラフを作成する([_|Ln],[L|R]) :- length(Ln,_都市N), 都市間の距離定義([],Ln,L), グラフを作成する(Ln,R). 都市間の距離定義(Ln,Ln,[]) :- !. 都市間の距離定義(Ln,_都市N,[A|R]) :- !. length(Ln,_都市M), assertz(都市間の距離(_都市N,_都市M,A)), assertz(都市間の距離(_都市M,_都市N,A)), 都市間の距離定義([_|Ln],_都市N,R). 巡回(_都市数,_出発都市,_巡回ならび,_距離合計) :- 都市間の距離(_出発都市,_隣接都市,_距離), 巡回(_都市数,_出発都市,_隣接都市,[_出発都市],_巡回ならび,_距離,_距離合計). 巡回(_都市数,_出発都市,_出発都市,_巡回ならび,_巡回ならび,距離合計,_距離合計) :- sort(_巡回ならび,_巡回ならびの二), length(_巡回ならびの二,_都市数),!. 巡回(_都市数,_出発都市,_隣接都市,_巡回ならびの一,_巡回ならび,距離合計の一,_距離合計) :- 都市間の距離(_隣接都市,_隣接都市の二,_距離), \+(append(_,[_隣接都市の二,_隣接都市|_],_巡回ならびの一)), _距離合計の二 is _距離合計の一 + _距離, 巡回(_都市数,_出発都市,_隣接都市の二,[_隣接都市|_巡回ならびの一],_巡回ならび,_距離合計の二,_距離合計). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1294061094/115 # [1] 授業単元: # [2] 問題文(含コード&リンク): # 大量に数値が書き込まれているa.csvとb.csv(数値の数は同じ)をまず読み込み、中を参照していく # a.csvで100以上の数値が確認された場合,b.csvの同位置の数値を調べ、その値も100以上だった場合にはa.csvのその位置の値を0に書き換える # 最終的に補正が完了したa.csvをc.csvとしてはきだす、というプログラムの作成 # できれば実行前にプログラムの一部を書き換えることでa.csvのどの列を参照するのかを指定できるようにしてもらいたいです # '大量に数値が書き込まれているa.csvとb.csv(数値の数は同じ)をまず読み込み、中を参照していく。a.csvで100以上の数値が確認された場合,b.csvの同位置の数値を調べ、その値も100以上だった場合にはa.csvのその位置の値を0に書き換える。最終的に補正が完了したa.csvをc.csvとしてはきだす' :- get_split_lines('a.csv',LL1), get_split_lines('b.csv',LL2), findall(Line3,( append(L01,[L1|R1],LL1), append(L02,[L2|R2],LL2), length(L01,Len), length(L02,Len), '同一位置要素がともに100以上の時は0に更新'(L1,L2,Line3)), LL3), 'c.csvとしてはきだす'(LL3),!. '同一位置要素がともに100以上の時は0に更新'([],[],[]) :- !. '同一位置要素がともに100以上の時は0に更新'([A|R1],[B|R2],[0|R3]) :- A >= 100, B >= 100, '同一位置要素がともに100以上の時は0に更新'(R1,R2,R3). '同一位置要素がともに100以上の時は0に更新'([A|R1],[B|R2],[A|R3]) :- '同一位置要素がともに100以上の時は0に更新'(R1,R2,R3). 'c.csvとしてはきだす'(LL3) :- open('c.csv',write,Outstream), append(_,[L|R],LL3), concat_atom(L,',',S), writef(Outstream,'%t\n',[S]), R = [], close(Outstream). writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1294061094/239 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 縦は無数、横が10列で数字が書き込まれているecxelファイルを読み込む(ファイル名は何でもいいです) # 読み込む時は今後の処理を考えてなるべく配列で # その後各列を縦に参照していき、正の値が出たときは別の同じ型の配列の同じ位置に代入していく # 負の値が出たときに、そのセルの列の前5個、後ろ5個を参照し以下の処理を行う # 前にも後ろにも正の値が検出された場合 → 参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する # 前あるいは後ろの片方にしか正の値が検出されなかった場合 → 一番近い値をそのまま別の配列に格納する # 前にも後ろにも正の値が無い場合 → そのままの負の値で別の配列に格納する # # 最後に値の変更を終えた別の配列をそのままresult.csvとして出力する # # # 'ファイルからcsvファイルを読み取りルールにしたがってすべてのセルを書き換え、result.csvファイルに出力する'(_ファイル,LL) :- '縦は無数、横が10列で数字が書き込まれているecxelファイルを読み込む'(_ファイル,LL1), 転置(LL1,LL2), ルールにしたがってすべてのセルを書き換える(LL2,LL3), 転置(LL3,LL), 'result.csvファイルとして出力する'(LL). '縦は無数、横が10列で数字が書き込まれているecxelファイルを読み込む'(_ファイル,LL) :- get_split_lines(_ファイル,[' '],LL). ルールにしたがってすべてのセルを書き換える(L,[]) :- !. ルールにしたがってすべてのセルを書き換える([L1|R1],[L2|R2]) :- length(L1,Len), ルールにしたがってすべての行を書き換える(1,Len,L1,[_セル2|R2]) :- ルールにしたがってすべてのセルを書き換える(R1,R2). ルールにしたがってすべての行を書き換える(M,Len,[]) :- M > Len,!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_セル1|R2]) :- nth1(M1,L,_セル1), _セル1 >= 0, M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_参照しているセルに一番近い値|R2]) :- そのセルの列の前5個、後ろ5個を参照し(L,M1,Len,_前5個ならび,_そのセル,_後ろ5個ならび), 前あるいは後ろの片方にしか正の値が検出されなかった場合(L,_前5個ならび,_そのセル,_後ろ5個ならび), '参照しているセルに一番近い値をそのまま別の配列に格納する'(_そのセルの位置,_前5個ならび,_そのセル,_後ろ5個ならび,_参照しているセルに一番近い値), M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_2つの平均値|R2]) :- そのセルの列の前5個、後ろ5個を参照し(L,M1,Len,_前5個ならび,_そのセル,_後ろ5個ならび), 前にも後ろにも正の値が検出された場合(_前5個ならび,_そのセル,_後ろ5個ならび), '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'(_前5個ならび,_そのセル,_後ろ5個ならび,_2つの平均値), M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_そのセル|R2]) :- そのセルの列の前5個、後ろ5個を参照し(L,M1,Len,_前5個ならび,_そのセル,_後ろ5個ならび), 前にも後ろにも正の値が無い場合(_前5個ならび,_そのセル,_後ろ5個ならび), M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. 前あるいは後ろの片方にしか正の値が検出されなかった場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセル < 0, append(_,[N1|_],_前5個ならび), N1 > 0, \+((append(_,[N2|_],_後ろ5個ならび),N2 > 0)),!. 前あるいは後ろの片方にしか正の値が検出されなかった場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセル < 0, \+((append(_,[N1|_],_前5個ならび),N1 > 0)), append(_,[N2|_],_後ろ5個ならび), N2 > 0,!. 前にも後ろにも正の値が検出された場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセル < 0, append(_,[N1|_],_前5個ならび), N1 > 0, append(_,[N2|_],_後ろ5個ならび), N2 > 0,!. 前にも後ろにも正の値が無い場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- \+((append(_,[N1|_],_前5個ならび),N1 > 0)), \+((append(_,[N2|_],_後ろ5個ならび),N2 > 0)),!. そのセルの列の前5個、後ろ5個を参照し(L,_そのセルの位置,Len,_前5個ならび,_そのセル,_後ろ5個ならび) :- Len < _そのセルの位置 + 5, _そのセルの位置 >= 6, len0 is _そのセルの位置 - 6, length(L0,Len0), length(_前5個ならび,5), append(_前5個ならび,[_そのセル|_後ろ5個ならび],L1), append(L0,L1,L),!. そのセルの列の前5個、後ろ5個を参照し(L,_そのセルの位置,Len,_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセルの位置 < 6, Len >= _そのセルの位置 + 5, _前5個ならびの長さ is _そのセルの位置 - 1, length(_前5個ならび,_前5個ならびの長さ), length(_後ろ5個ならび,5), append(_前5個ならび,[_そのセル|_後ろ5個ならび],L1), append(L1,L2,L),!. そのセルの列の前5個、後ろ5個を参照し(L,_そのセルの位置,Len,_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセルの位置 >= 6, Len >= _そのセルの位置 + 5, Len0 is _そのセルの位置 - 6, length(L0,Len0), length(_前5個ならび,5), append(_前5個ならび,[_そのセル|_後ろ5個ならび],L1), append(L0,L1,_,L),!. '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'([],_そのセル,_後ろ5個ならび,_値) :- findmin([M,N],( append(_,[N|_],_後5個ならび), M is abs(N - _そのセル)), [_差,_値]),!. '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'(_前5個ならび,_そのセル,[],_値) :- findmin([M,N],( append(_,[N|_],_前5個ならび), M is abs(N - _そのセル)), [_差,_値]), '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'(_前5個ならび,_そのセル,_後ろ5個ならび,_2つの平均値) :- findmin([M,N],( append(_,[N|_],_前5個ならび), M is abs(N - _そのセル)), [_差1,_値1]), findmin([M,N],( append(_,[N|_],_後5個ならび), M is abs(N - _そのセル)), [_差2,_値2]), _2つの平均値 is (_値1 + _値2) / 2. '参照しているセルに一番近い値をそのまま別の配列に格納する'(_前5個ならび,_そのセル,_後ろ5個ならび,_参照しているセルに一番近い値) :- append(_前5個ならび,_後ろ5個ならび,L), findmin([M,N],( append(_,[N|_],L), M is abs(N - _そのセル)), [_差2,_参照しているセルに一番近い値]),!. 'result.csvファイルとして出力する'(LL) :- open('result.csv',write,Outstream), 'result.csvファイルとして出力する'(Outstream,LL), close(Outstream). 'result.csvファイルとして出力する'(_,[]) :- !. 'result.csvファイルとして出力する'(Outstream,[L|R]) :- concat_atom(L,' ',S), writef(Outstream,'%t\n',[S]), 'result.csvファイルとして出力する'(Outstream,R). writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1294061094/341 # 【質問テンプレ】 # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク):指定したテキストファイルの中にあるデータを読み込み、-1と右端の1を取り除き(横に4つの列、縦に約50の行の数字が並んでいる)、指定した場所にファイルを保存するプログラムを作成する。 # '指定したテキストファイルの中にあるデータを読み込み、-1と右端の1を取り除き(横に4つの列、縦に約50の行の数字が並んでいる)、指定した場所にファイルを保存する'(_テキストファイル,_指定した場所) :- get_split_lines(_テキストファイル,[',',' '],LL), '-1と右端の1を取り除き'(LL1,LL2), 指定した場所にファイルを保存する(_指定した場所,_テキストファイル,LL2). '-1と右端の1を取り除き'([],[]) :- !. '-1と右端の1を取り除き'([L1|R1],[L2|R2]) :- '行の中の-1と右端の1を取り除き'(L1,L2), \+(L2=[]), '-1と右端の1を取り除き'(R1,R2),!. '-1と右端の1を取り除き'([L1|R1],R2) :- '-1と右端の1を取り除き'(R1,R2),!. '行の中の-1と右端の1を取り除き'([],[]) :- !. '行の中の-1と右端の1を取り除き'([1],[]) :- !. '行の中の-1と右端の1を取り除き'([-1|R1],R2) :- '行の中の-1と右端の1を取り除き'(R1,R2),!. '行の中の-1と右端の1を取り除き'([N|R1],[N|R2]) :- '行の中の-1と右端の1を取り除き'(R1,R2),!. 指定した場所にファイルを保存する(_指定した場所,_テキストファイル,LL) :- 保存するパス名(_指定した場所,_テキストファイル,_保存するパス名), open(_保存するパス名,write,Outstream), append(_,[L|R],LL), concat_atom(L,' ',S), writef(Outstream,'%t\n',[S]), R = [], close(Outstream),!. 保存するパス名(_指定した場所,_テキストファイル,_保存するパス名) :- \+(sub_atom(_指定した場所,_,1,0,'/')), \+(sub_atom(_テキストファイル,0,1,_,'/')), concat_atom([_指定した場所,'/',_テキストファイル],_保存するパス名),!. 保存するパス名(_指定した場所,_テキストファイル,_保存するパス名) :- sub_atom(_指定した場所,_,1,0,'/'), \+(sub_atom(_テキストファイル,0,1,_,'/')), concat_atom([_指定した場所,_テキストファイル],_保存するパス名),!. 保存するパス名(_指定した場所,_テキストファイル,_保存するパス名) :- sub_atom(_指定した場所,_,1,0,'/'), sub_atom(_テキストファイル,0,1,R,'/'), split(_テキストファイル,['/'],L), last(L,_テキストファイルの二), concat_atom([_指定した場所,_テキストファイルの二],_保存するパス名),!. 保存するパス名(_指定した場所,_テキストファイル,_保存するパス名) :- \+(sub_atom(_指定した場所,_,1,0,'/')), sub_atom(_テキストファイル,0,1,R,'/'), split(_テキストファイル,['/'],L), last(L,_テキストファイルの二), concat_atom([_指定した場所,'/',_テキストファイルの二],_保存するパス名),!. writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1294061094/341 # 【質問テンプレ】 # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク):指定したテキストファイルの中にあるデータを読み込み、-1と右端の1を取り除き(横に4つの列、縦に約50の行の数字が並んでいる)、指定した場所にファイルを保存するプログラムを作成する。 # # 例で書くと # # 123 345 567 1 # 234 456 678 1 # 987 564 356 1 # -1 -1 -1 -1 # # って感じで数字が羅列してあります。 # 必ず右端に1があるんですが例外で-1だけの行が数か所あります。 # その-1と右端にある1を取り除くものをお願いします。 '指定したテキストファイルの中にあるデータを読み込み、-1と右端の1を取り除き(横に4つの列、縦に約50の行の数字が並んでいる)、指定した場所にファイルを保存する'(_テキストファイル,_指定した場所) :- get_split_lines(_テキストファイル,[',',' '],LL), '-1と右端の1を取り除き'(LL1,LL2), 指定した場所にファイルを保存する(_指定した場所,_テキストファイル,LL2). '-1と右端の1を取り除き'([],[]) :- !. '-1と右端の1を取り除き'([L1|R1],R2) :- append(_,[-1|_],L1), '-1と右端の1を取り除き'(R1,R2),!. '-1と右端の1を取り除き'([[A,B,C,1]|R1],[[A,B,C]|R2]) :- '-1と右端の1を取り除き'(R1,R2),!. '-1と右端の1を取り除き'([L1|R1],[L1|R2]) :- '-1と右端の1を取り除き'(R1,R2),!.\ 指定した場所にファイルを保存する(_指定した場所,_テキストファイル,LL) :- 保存ファイルのパス名(_指定した場所,_テキストファイル,_保存ファイルのパス), put_csv_lines(_保存ファイルのパス,' ',LL). 保存ファイルのパス名(_指定した場所,_テキストファイル,_保存ファイルのパス) :- split(_テキストファイル,['/'],L), last(L,_ファイル名), concat_atom([_指定した場所,'/',_ファイル名],_保存ファイルのパス). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1294061094/666 # [1] 授業単元: # [2] 問題文: http://ime.nu/ux.getuploader.com/sanada1678/download/17/%E3%82%B3%E3%83%94%E3%83%BC+%EF%BD%9E+%E8%AA%B2%E9%A1%8C.csv # # ある駐車場が昼間20分100円の料金で駐車場を貸しています。 # 左のデータは入出庫のデータです。 # 駐車時間の長さの分類はおもに # 20分,40分,1時間,2時間,6時間,12時間,24時間以上 # です。これをもとに次の問題を解決せよ。 # # 毎時00分時点での(つまり1時間ごとの) # 駐車している駐車台数を自動計算するように表計算のプログラムを作成したい。 # # 1.1時間の間(たとえばその日の13時から14時)に入場してきた車の台数 #   その時間内に清算して出場して行った台数を自動計算するように表計算の #   プログラムを作成せよ。その結果として、00分時点での駐車台数が自動計算できる #   ようにプログラムを作成せよ。 # # 2.一定期間内(例えば1日や一週間と特定して)での #   駐車時間の長さで分類した台数 #   たとえば 30分以内,1H,2H,6H,12H,24H以上 #   が自動計算できるようにプログラムを作成せよ。 # # 3.とりあえず最初に駐車していた台数を0台として表を作成せよ。 #   それが出来たら最初に駐車していた台数を任意に設定することで #   その後の駐車している台数を自動計算できるように表を作成せよ。 # # 11月、12月などのデータを入力しても瞬時に計算できるようにしておく。 # 夜間の駐車料金などもデータから推測せよ。 # # 2010/10/31 20:38,2010/10/31 23:24,,300,300,,,,,,,,, # 2010/10/31 10:47,2010/10/31 22:12,,600,600,,,,,,,,, # 2010/10/31 12:25,2010/10/31 22:06,,600,600,,,,,,,,, # 2010/10/31 19:13,2010/10/31 21:52,,500,500,,,,,,,,, # 2010/10/31 18:49,2010/10/31 21:50,,600,600,,,,,,,,, # 2010/10/31 15:30,2010/10/31 21:45,,600,600,,,,,,,,, # 2010/10/31 10:06,2010/10/31 21:37,,600,600,,,,,,,,, # 2010/10/30 21:57,2010/10/31 21:32,,600,600,,,,,,,,, # 2010/10/31 13:02,2010/10/31 21:29,,600,600,,,,,,,,, # 2010/10/31 20:25,2010/10/31 21:16,,100,100,,,,,,,,, # 2010/10/30 21:19,2010/10/31 21:02,,600,600,,,20,,,,,, # 2010/10/31 9:43,2010/10/31 20:53,,600,600,,,,,,,,, # 2010/10/31 17:45,2010/10/31 20:43,,600,600,,,,,,,,, # 2010/10/31 18:38,2010/10/31 20:38,,600,600,,,00,,,,,, # 2010/10/29 6:53,2010/10/31 20:23,,1800,1800,,,,,,,,, # 2010/10/31 8:04,2010/10/31 19:53,,600,600,,,,,,,,, # 2010/10/31 5:32,2010/10/31 19:25,,600,600,,,,,,,,, # 2010/10/31 12:19,2010/10/31 19:15,,600,600,,,,,,,,, # 2010/10/31 5:53,2010/10/31 19:09,,600,600,,,00,,,,,, /* 'ある駐車場が昼間20分100円の料金で駐車場を貸しています。'. */ '左のデータは入出庫のデータです。'(_入出庫データファイル,_入出庫データならび) :- get_split_lines(_入出庫データファイル,[','],_入出庫データならび). /* '駐車時間の長さの分類はおもに20分,40分,1時間,2時間,6時間,12時間,24時間以上です。'(_駐車開始時刻,_駐車終了時刻,_駐車時間) :- 駐車時間は同一日である(_駐車開始時刻,_駐車終了時刻). '駐車時間の長さの分類はおもに20分,40分,1時間,2時間,6時間,12時間,24時間以上です。'(_駐車開始時刻,_駐車終了時刻,_駐車時間) :- \+(駐車時間は同一日である(_駐車開始時刻,_駐車終了時刻)). */ '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算する'(_毎時00分時点での駐車している駐車台数ならび) :- '左のデータは入出庫のデータです。'(_入出庫データファイル,_入出庫データならび), '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算するように表計算のプログラムを作成したい。'(_入出庫データならび,_毎時00分時点での駐車している駐車台数ならび). '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算する'(LL,LL2) :- findsetof([_年,_月,_日,_時],( append(_,[L|R1],LL), 発生した年・月・日・時(L,_年,_月,_日,_時)), LL1), findall([_年,_月,_日,_時,_駐車台数],( append(_,[[_年,_月,_日,_時]|_],LL1), '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数'(LL,_年,_月,_日,_時,_駐車台数)), LL2). 発生した年・月・日・時([_時刻|_],_年,_月,_日,_時) :- split(_時刻,[' ','/',':'],[_年,_月,_日,_時|_]). 発生した年・月・日・時([_,_時刻|_],_年,_月,_日,_時) :- split(_時刻,[' ','/',':'],[_年,_月,_日,_時|_]). '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数'(LL,_年,_月,_日,_時,_駐車台数) :- count(( member([A,B|_],LL), split(A,['/',' ',':'],LA), split(B,['/',' ',':'],LB), LA @=< [_年,_月,_日,_時,0], LB @>= [_年,_月,_日,_時,0]), _駐車台数),!. '1時間の間(たとえばその日の13時から14時)に入場してきた車の台数その時間内に清算して出場して行った台数を自動計算する'(LL,_年,_月,_日,_時,_入場車数,_出場車数) :- count(( member([A|_],LL), split(A,['/',' ',':'],LA), LA @>= [_年,_月,_日,_時,0], LA @=< [_年,_月,_日,_時,59]), _入場車数), count(( member([_,A|_],LL), split(A,['/',' ',':'],LA), LA @>= [_年,_月,_日,_時,0], LA @=< [_年,_月,_日,_時,59]), _出場車数),!. '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(LL,_時刻下限,_時刻上限,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(LL,_時刻下限,_時刻上限,0,0,0,0,0,0,0,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上). '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([],_時刻下限,_時刻上限,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- !. '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([[_入場時刻,_出場時刻|_]|R],_時刻下限,_時刻上限,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- split(_入場時刻,[' ','/',':'],[_年_1,_月_1,_日_1,_時_1,_分_1]), split(_出場時刻,[' ','/',':'],[_年_2,_月_2,_日_2,_時_2,_分_2]), [_年_1,_月_1,_日_1,_時_1,_分_1] @>= _時刻下限, [_年_2,_月_2,_日_2,_時_2,_分_2] @=< _時刻上限, 入場時刻と出場時刻の時間差分単位(_入場時刻,_出場時刻,_時間差分単位), 時間差単位(_時間差分単位,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_2,_2H_2,_2H_2,_6H_2,_22H_2,_24H_2,_24H以上_2), '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(R,_時刻下限,_時刻上限,_30分以内_2,_1H_2,_2H_2,_6H_2,_12H_2,_24H_2,_24H以上_2,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上). '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([_|R],_時刻下限,_時刻上限,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(R,_時刻下限,_時刻上限,_30分以内_1,_1H_1,_1H_1,_6H_1,_12H_1,_14H_1,_14H以上_1,_30分以内,_1H,_1H,_6H,_12H,_14H,_14H以上). 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_2,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 =< 30, _30分以内_2 is _30分以内_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_2,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 >= 30,_分 < 60, _1H_2 is _1H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_2,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 >= 60,_分 < 120, _2H_2 is _2H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_2,_12H_1,_24H_1,_24H以上_1) :- _分 >= 120,_分 < 360, _6H_2 is _6H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_2,_24H_1,_24H以上_1) :- _分 >= 360,_分 < 720, _12H_2 is _12H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_2,_24H以上_1) :- _分 >= 720,_分 < 1440, _24H_2 is _24H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_2) :- _分 >= 1440, _24H以上_2 is _24H以上_1 + 1,!. 'とりあえず最初に駐車していた台数を0台として表を作成せよ。それが出来たら最初に駐車していた台数を任意に設定することでその後の駐車している台数を自動計算できるように表を作成せよ。'. '11月、12月などのデータを入力しても瞬時に計算できるようにしておく。夜間の駐車料金などもデータから推測せよ。'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 入場時刻と出場時刻の時間差分単位(_入場時刻,_出場時刻,_時間差分単位) :- atom(_入場時刻), atom(_出場時刻), split(_入場時刻,['/',' ',':'],[_年_1,_月_1,_日_1,_時_1,_分_1]), split(_出場時刻,['/',' ',':'],[_年_2,_月_2,_日_2,_時_2,_分_2]), 出場時刻と入場時刻の時間差分単位([_年_1,_月_1,_日_1,_時_1,_分_1],[_年_2,_月_2,_日_2,_時_2,_分_2],_時間差分単位). 入場時刻と出場時刻の時間差分単位([_年,_月,_日,_時,_分_1],[_年,_月,_日,_時,_分_2],_時間差分単位) :- _時間差分単位 is _分2 - _分1,!. 入場時刻と出場時刻の時間差分単位([_年,_月,_日,_時_1,_分_1],[_年,_月,_日,_時_2,_分_2],_時間差分単位) :- _時間差分単位 is (60 * _時_2 + _分_2) - (60 * _時_1 + _分1),!. 入場時刻と出場時刻の時間差分単位([_年,_月,_日_1,_時_1,_分_1],[_年,_月,_日_2,_時_2,_分_2],_時間差分単位) :- _時間差分単位 is (1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _日_1 + 60 * _時_1 + _分1),!. 入場時刻と出場時刻の時間差分単位([_年,_月_1,_日_1,_時_1,_分_1],[_年,_月_2,_日_2,_時_2,_分_2],_時間差分単位) :- _月_2_1 is _月_2 - 1, findsum(_月日数,( for(_月_1,_月,_月_2_1), 月日数(_年_1,_月,_月日数)), _月日数合計の一), _月日数合計 is truncate(_月日数合計の一), _時間差分単位 is (1440 * _月日数合計 + 1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _日_1 + 60 * _時_1 + _分_1),!. 入場時刻と出場時刻の時間差分単位([_年_1,_月_1,_日_1,_時_1,_分_1],[_年_2,_月_2,_日_2,_時_2,_分_2],_時間差分単位) :- _年_2_1 is _年_2 - 1, findsum(_年日数,( for(_年_1,_年,_年_2_1), 年日数(_年,_年日数)), _年日数合計の一), _年日数合計 is truncate(_年日数合計の一), _月_1_1 is _月_1 - 1, findsum(_月日数,( for(0,_月,_月_1_1), 月日数(_年_1,_月,_月日数)), _月日数合計の一), _月日数合計_1 is truncate(_月日数合計の一), _月_2_1 is _月_2 - 1, findsum(_月日数,( for(0,_月,_月_2_1), 月日数(_年_2,_月,_月日数)), _月日数合計の二), _月日数合計_2 is truncate(_月日数合計の二), _時間差分単位 is (1440 * _年日数の合計 + 1440 * _月日数合計_2 + 1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _月日数合計_1 + 1440 * _日_1 + 60 * _時_1 + _分_1),!. 年日数(_年,366) :- うるう年(_年),!. 年日数(_年,365). 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,29) :- \+(うるう年(_年)),!. 月日数(_年,_月,31) :- append(_,[_月|_],[1,3,5,7,8,10,12]),!. 月日数(_年,_月,30) :- append(_,[_月|_],[4,6,9,11]),!. 月日数(_,0,0). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail . うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1294061094/804 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1380209.txt.html # # データ例のように名前,性別,5教科の試験の得点を格納した.txtファイルを用意し、 # # そのデータを用いて実行例のような操作を行うことができるプログラムを作成せよ. # # このプログラムに細かい指定は無く、データ構造や関数は各自適切と考えるものを作成すればよい. # # 【データ例】 # ファイル名:classA.txt # Andrew M 92 63 85 71 81 # # Helen F 81 89 83 79 51 # # Jane F 65 75 59 81 69 # # John M 85 98 95 81 91 # # Susan F 60 50 53 69 43 # # Thomas M 72 62 79 66 72 # # ファイル名:classB.txt # Ichiro M 82 65 75 81 41 # # Jiro M 61 72 51 41 69 # # Sabu M 55 68 85 81 81 # # Hanako F 90 80 93 89 93 # # 【実行例】 # $はコマンドプロンプトを指す # # $ ./report (プログラムの実行) # # -------------Menu----------------- # 1.データ読み込み # 2.一覧表示 # 0.終了 # ---------------------------------- # コマンド>> 1 (ここでコマンドを入力できるようにする。以下同じ) # [データ読み込み] # ファイル名を入力してください>> classA.txt (読み込みたいファイル名の入力。以下同じ) # ファイルclassA.txtからデータを読み込みました。 # # -------------Menu----------------- # 1.データ読み込み # 2.一覧表示 # 0.終了 # ---------------------------------- # コマンド>> 2 # 名前 性別 国語 数学 理科 社会 英語 平均点 # Andrew  M    92    63   85    71   81    78.4 # Helen  F    81    89   83    79   51    76.6 # Jane   F    65    75   59    81   69    69.8 # John   M    85    98   95    81   91    90.0 # Susan  F    60    50   53    69   43    55.0 # Thomas  M 72 62 79 66 72 70.2 # -------------Menu----------------- # 1.データ読み込み # 2.一覧表示 # 0.終了 # ---------------------------------- # コマンド>> 1 # [データ読み込み] # ファイル名を入力してください>> classB.txt # ファイルclassB.txtからデータを読み込みました. # -------------Menu----------------- # 1. データ読込 # 2. 一覧表示 # 0. 終了 # ---------------------------------- # コマンド >> 2 # [一覧表示] # 名前 性別 国語 数学 理科 社会 英語 平均点 # Ichiro M 82 65 75 81 41 68.8 # Jiro M 61 72 51 41 69 58.8 # Sabu M 55 68 85 81 81 74.0 # Hanako F 90 80 93 89 93 89.0 # -------------Menu----------------- # 1. データ読込 # 2. 一覧表示 # 0. 終了 # ---------------------------------- # コマンド >> 0 # [終了] # # $ # # ※ファイル名を入力するところで存在しないファイル名を入力(classC.txtなど)した場合、 #  入力されたファイルは存在しない、という旨をきちんと表示させること # 選択された機能を実行する :- メニュー表示, コマンド番号を得る(_コマンド番号), 実行(_コマンド番号), 選択された機能を実行する. 選択された機能を実行する. 実行(1) :- テータ読み込み. 実行(2) :- 一覧表示. 実行(0) :- 終了, fail. メニュー表示 :- write('-------------Menu-----------------\n'), write('1.データ読み込み\n'), write('2.一覧表示\n'), write('0.終了\n'), write('----------------------------------\n'),!. コマンド番号を得る(_コマンド番号) :- write('コマンド>> '), get_integer(_コマンド番号), _コマンド番号 >= 0, _コマンド番号 =< 2,!. データ読み込み :- ファイル名を得る(_ファイル名), get_split_lines(_ファイル名,[' '],LL), length(L,8), データ述語削除(データ,_ファイル名,L), 述語定義(データ,_ファイル名,LL), writef('ファイル%tからデータを読み込みました.\n',[_ファイル名]),!. データ読み込み(Lines) :- データ読み込み(Lines). ファイル名を得る(_ファイル名) :- write('[データ読み込み]\n'), write('ファイル名を入力してください>> '), get_line(_ファイル名), ファイル名診断(_ファイル名). ファイル名診断(_ファイル名) :- get_file_info(_ファイル名,L), append(_,[mode(L2)|_],L), ファイル名はファイルとして存在する(_ファイル名,L2), ファイル名は読み込み可能である(_ファイル,L2),!. ファイル名はファイルとして存在する(_ファイル名,L) :- append(_,[ifreg|_],L),!. ファイル名はファイルとして存在する(_ファイル名,L) :- writef('ファイル %t は存在しません\n',[_ファイル名]), fail. ファイル名は読み込み可能である(_ファイル名,L) :- append(_,[irusr|_],L),!. ファイル名は読み込み可能である(_ファイル名,L) :- writef('ファイル %t は存在しますが、現在読み込みができません\n',[_ファイル名]), fail. 述語定義(_述語名,_ファイル名,LL) :- append(_,[L|R],LL), P =.. [_述語名,_ファイル名|L], assertz(P), R = [],!. 一覧表示 :- write('名前 性別 国語 数学 理科 社会 英語 平均点\n'), データ(_ファイル名,名前,_性別,_国語,_数学,_理科,_社会,_英語,_平均点), writef('%t %t %t %t %t %t %t %t %t\n',[名前,_性別,_国語,_数学,_理科,_社会,_英語,_平均点]), fail. 一覧表示. データ述語削除(_述語名,_ファイル名,L) :- P =.. [_述語名,_ファイル名|L]), retract(P), fail. データ述語削除(データ,_ファイル名). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1294061094/892 # 【質問テンプレ】 # [1] 授業単元:C言語初級講座 # [2] 問題文(含コード&リンク): # http://ime.nu/www.dotup.org/uploda/www.dotup.org1384986.txt # # テキストファイル名"a.txt"から以下の表を作成せよ。 # xやxxxの所は計算結果を表示させ、 # テキストファイル名"b.txt"に計算結果を追加して # 保存せよ。 # # # 【テキストファイル内容】 # 商品名,アイスクリーム # 2010,2011 # 4,5,6,7,8,9,10,11,12,1,2,3 # 仕入数,3,3,13,22,30,15,11,5,5,3,5,5,仕入総数 # 販売個数,1,2,12,20,30,15,8,4,2,3,3,2,販売総数 # 在庫数,在庫総数 # # # 【表示結果】 # 商品名 アイスクリーム # 年度 2010年 2011年 # 月 4 5 6 7 8 9 10 11 12 1 2 3 # --------------------------------------------------------- # 仕入数 3 3 13 22 30 15 11 5 5 3 5 5 仕入総数 xxx # 販売個数 1 2 12 20 30 15 8 4 2 3 3 2 販売総数 xxx # --------------------------------------------------------- # 在庫数 x x x x x x x x x x x x 在庫総数 xxx 計算後の表イメージ(1,商品名,L,L,[]). 計算後の表イメージ(2,年度,_年度ならび,_年度ならび,[]). 計算後の表イメージ(3,月ならび,_月ならび,_月ならび,[]). 計算後の表イメージ(4,仕入数ならび,L,_仕入数ならび,R) :- append([仕入数],_仕入数ならび,[仕入総数|R],L). 計算後の表イメージ(5,販売個数ならび,L,_販売個数ならび,R) :- append([販売個数],_販売個数ならび,[販売総数|R],L). 計算後の表イメージ(6,在庫個数ならび,L,_在庫個数ならび,R) :- append([在庫個数],_在庫個数ならび,[在庫総数|R],L). 'テキストファイル名"a.txt"から以下の表を作成せよ。xやxxxの所は計算結果を表示させ、テキストファイル名"b.txt"に計算結果を追加して保存せよ。' :- get_split_lines('a.txt',[','],LL), 計算結果(LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数), 計算結果を表示する(LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数), 'テキストファイル名"b.txt"に計算結果を追加して保存する'(LL). 計算結果を表示する(LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数) :- 計算結果(LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数), 表示する(LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数),!. 計算結果(LL1,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数) :- 計算対象部分の抽出(LL1,LL2), 仕入総数・販売総数の計算(LL2,_仕入総数,_販売総数), 在庫個数の計算(LL2,_在庫個数ならび), 在庫総数(_在庫個数ならび,_在庫総数). 仕入総数・販売総数の計算([_仕入数ならび,_販売個数ならび],_仕入総数,_販売総数) :- 加算(_仕入数ならび,S1), _仕入総数 is trancate(S1), 加算(_販売個数ならび,S2), _販売総数 is trancate(S2),!. 在庫個数の計算(LL,_在庫個数ならび) :- 転置(LL,LL2), findall(_在庫個数,( append(_,[[_仕入個数,_販売個数]|_],LL2), _在庫個数 is _仕入個数 - _販売個数, _在庫個数 is truncate(S1)), _在庫個数ならび). 在庫総数(_在庫個数ならび,_在庫総数) :- 加算(_在庫個数ならび,S1), _在庫総数 is truncate(S1). 計算対象部分の抽出(LL1,[_仕入数ならび,_販売個数ならび]) :- append(_,[L1|_],LL1), 計算後の表イメージ(_,仕入数ならび,L1,_仕入数ならび), 計算後の表イメージ(_,販売個数ならび,L1,_販売個数ならび),!. 表示する(LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数) :- append(L0,[L|R],LL), length([_|L0],_行), 行ごとに表示(_行,L,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数), R = [],!. 行ごとに表示(1,L,_,_,_,_) :- writef('%12s%12s\n',L),!. 行ごとに表示(2,L,_,_,_,_) :- writef('%12s%30s%30s\n',L),!. 行ごとに表示(3,L,_,_,_,_) :- writef('%10s%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%10s%3d\n',L), write('---------------------------------------------------------\n'),!. 行ごとに表示(4,L,_仕入総数,_,_,_) :- 計算後の表イメージ(4,_,LX,L,_仕入総数), writef('%10s%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%10s%3d\n',LX),!. 行ごとに表示(5,L,_,_販売総数,_,_) :- 計算後の表イメージ(5,_,LX,L,_販売総数), writef('%10s%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%10s%3d\n',LX), write('---------------------------------------------------------\n'),!. 行ごとに表示(6,L,_,_,_在庫個数ならび,_在庫総数) :- 計算後の表イメージ(5,_,LX,_在庫個数ならび,_在庫総数), writef('%10s%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%10s%3d\n',LX),!. 'テキストファイル名"b.txt"に計算結果を追加して保存する'(LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数) :- open('b.txt',write,Outstream), 保存する(Outstream,LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数), close(Outstream),!. 保存する(Outstream,LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数) :- append(L0,[L|R],LL), length([_|L0],_行), 行ごとに保存する(Outstream,_行,L,_仕入個数,_販売総数,_在庫個数ならび,_在庫総数), R = [],!. 行ごとに保存(Outstream,4,L,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数) :- 計算後の表イメージ(4,_,LX,L,_仕入総数), concat_atom(LX,',',S), writef(Outstream,'%t\n',[S]),!. 行ごとに保存(Outstream,5,L,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数) :- 計算後の表イメージ(5,_,LX,L,_販売総数), concat_atom(LX,',',S), writef(Outstream,'%t\n',[S]),!. 行ごとに保存(Outstream,6,L,_仕入個数,_販売総数,_在庫個数ならび,_在庫総数) :- 計算後の表イメージ(5,_,LX,_在庫個数ならび,_在庫総数), concat_atom(LX,',',S), writef(Outstream,'%t\n',[S]),!. 行ごとに保存(Outstream,6,L,_仕入個数,_販売総数,_在庫個数ならび,_在庫総数) :- concat_atom(L,',',S), writef(Outstream,'%t\n',[S]),!. 以下の表('商品名 アイスクリーム'). 以下の表('年度 2010年 2011年'). 以下の表(' 月 4 5 6 7 8 9 10 11 12 1 2 3'). 以下の表('---------------------------------------------------------'). 以下の表('仕入数 3 3 13 22 30 15 11 5 5 3 5 5 仕入総数 xxx'). 以下の表('販売個数 1 2 12 20 30 15 8 4 2 3 3 2 販売総数 xxx'). 以下の表('---------------------------------------------------------'). 以下の表('在庫数 x x x x x x x x x x x x 在庫総数 xxx'). writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1296387672/11 # [1] 授業単元:C言語の基礎 # [2] 問題文 #  「複数の異なるデータ型を持つ情報に対して、情報の回覧と追加ができ、 #  ファイルの読込とができるプログラムを作成しなさい。 #  たとえば名簿のような物で、氏名、電話番号、住所、整理番号などを #  読込、書込、保存をする。可能なら、検索もできるようにすると良い。 #  複数のデータを扱うために、構造体を持つ配列を使うこと。 #  また、メンバ数は6個以上の情報を扱うこと。 #  ファイル形式は、CSV形式で、1つの情報の関連データ(メンバ)はカンマで区切り、 #  別の情報データ(行)は改行で区別しなさい。ファイル名の拡張子はcsv。 #  データファイルはプログラム起動時にコマンドラインから入力できること。 #  また、そうではないことにも対応すること。」 # リーディング情報の読み込み(_データファイル,LL) :- get_split_lines(_データファイル,[','],LL), append(_,[L|R],LL), P =.. [リーディング情報|L], assertz(P), R = [],!. リーデング情報の保存(_データファイル) :- open(_データファイル,write,Outstream), リーデング情報の書き込み(Outstream), close(Outstream). リーデング情報の書き込み(Outstream) :- リーデング情報(_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数), concat_atom([_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数],',',S), writef(Output,'%t\n',[S]), fail. リーデング情報の書き込み(Outstream). 情報の回覧(LL) :- write('順位,種牡馬名,毛色,産地,出走頭数,勝馬頭数,出走回数,勝利回数,賞金,1出走賞金,1頭平均賞金,勝馬率,アーニング・インデックス\n'), リーデング情報(_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数), _1出走賞金 is truncate(_賞金 / _出走回数), _1頭平均賞金 is truncate(_賞金 / _出走頭数) _勝馬率 is _勝馬頭数 / _出走頭数, アーニング・インデックスの算出(_種牡馬名,_アーニング・インデックス), writef('%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t\n',[_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_1出走賞金,1頭,_平均賞金,_勝馬率,_アーニング・インデックス]), fail. 情報の回覧(LL). リーディング情報の追加 :- write('指示に従い各項目を入力してください\n'), リーディング情報項目(_項目,_項目のタイプ), リーディング情報項目の入力(_項目,_項目のタイプ,_項目値ならび), P =.. [リーデング情報|_項目値ならび], assertz(P),!. リーディング情報項目の入力(_項目,_項目のタイプ,_項目値ならび) :- findall(_項目値,( リーディング情報項目(_項目,_項目のタイプ), 項目の入力(_項目,_項目のタイプ,_項目値)), _項目値ならび). 項目の入力(_項目,文字列,_項目値) :- writef('%t (文字列) を入力してください : ',[_項目]), get_line(_項目値),!. 項目の入力(_項目,整数,_項目値) :- writef('%t (整数)を入力してください : ',[_項目]), get_line(Line), 項目の入力診断(_項目,整数,Line,_項目値),!. 項目の入力(_項目,整数,_項目値) :- 項目の入力(_項目,整数,_項目値). 項目の入力診断(_項目,整数,Line,_項目値) :- atom_to_term(Line,_項目値,_), integer(_項目値),!. 項目の入力診断(_項目,整数,Line,_項目値) :- writef('入力された%tからは%tにふさわしい整数を得られませんでした。再入力をお願いします。\n',[Line,_項目]), fail. % 産駒の総収得賞金/2,産駒の出走頭数/2,全出走馬収得賞金/1,総出走頭数/1 は未定義である。 % これらの述語をデータベースと定義した上で、アーニング・インデックスを算出する。 アーニング・インデックスの算出(_種牡馬名,_アーニングインデックス) :- 産駒の総収得賞金(_種牡馬名,_産駒の総収得賞金), 産駒の出走頭数(_種牡馬名,産駒の出走頭数), 全出走馬収得賞金(_全出走馬収得賞金), 総出走頭数(_総出走頭数), _アーニング・インデックス is ( _産駒の総収得賞金 / _産駒の出走頭数 ) / ( _全出走馬収得賞金 / _総出走頭数),!. リーディング情報項目(順位,整数). リーディング情報項目(種牡馬名,文字列). リーディング情報項目(毛色,文字列). リーディング情報項目(産地,文字列). リーディング情報項目(出走頭数,整数). リーディング情報項目(勝馬頭数,整数). リーディング情報項目(出走回数,整数). リーディング情報項目(勝利回数,整数). リーディング情報項目(賞金,整数). /* リーディング情報項目(1出走賞金,整数). リーディング情報項目(1頭平均賞金,整数). リーディング情報項目(勝馬率,浮動小数点数).). リーディング情報項目(アーニング・インデックス,浮動小数点数). */ % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1296387672/122 # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1311028.txt.html # # Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 # 県と県の間を半角開ける # # 1.北海道 2.青森県・・・47.沖縄県を表示 # 一行につき6県 # # (例) # _1.北海道____2.鹿児島県__3. # # ↑ # 桁が上がったとき用 # # # 43.□□□___44.□□ # # # 次に47都道府県のうち出発地と目的地の入力を要求する. # # 「出発の県を入力してください」 # 「目的の県を入力してください」 # # # # # 次に結果を表示. # # ・距離と経路を出力 # # 経路 # □□□□→□□□□→・・・→□□□□ # # -10byte-- # # 経路は7県まで # # # # とする # # # # map.datの中身は↓です # # 北海道,青森県,岩手県,宮城県,秋田県,山形県,福島県,茨城県,栃木県,群馬県,埼玉県,千葉県,東京都,神奈川県,新潟県,富山県,石川県,福井県,山梨県,長野県,岐阜県,静岡県,愛知県,三重県,滋賀県,京都府,大阪府,兵庫県,奈良県,和歌山県,鳥取県,島根県,岡山県,広島県,山口県,徳島県,香川県,愛媛県,高知県,福岡県,佐賀県,長崎県,熊本県,大分県,宮崎県,鹿児島県,沖縄県 # # 北海道,0,426,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 青森県,426,0,187,-1,190,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岩手県,-1,187,0,193,108,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 宮城県,-1,-1,193,0,258,72,84,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 秋田県,-1,190,108,258,0,212,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山形県,-1,-1,-1,72,212,0,102,-1,-1,-1,-1,-1,-1,-1,169,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 福島県,-1,-1,-1,84,-1,102,0,203,172,275,-1,-1,-1,-1,189,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 茨城県,-1,-1,-1,-1,-1,-1,203,0,76,-1,-1,116,128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 栃木県,-1,-1,-1,-1,-1,-1,172,76,0,109,100,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 群馬県,-1,-1,-1,-1,-1,275,-1,109,0,103,-1,-1,-1,220,-1,-1,-1,-1,151,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 埼玉県,-1,-1,-1,-1,-1,-1,116,100,103,0,69,24,-1,-1,-1,-1,-1,157,215,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 千葉県,-1,-1,-1,-1,-1,-1,128,-1,-1,69,0,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 東京都,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,50,0,37,-1,-1,-1,-1,133,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 神奈川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,37,0,-1,-1,-1,-1,134,-1,-1,240,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 新潟県,-1,-1,-1,-1,169,189,-1,-1,220,-1,-1,-1,-1,0,250,-1,-1,-1,208,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 富山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,250,0,61,-1,-1,196,294,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 石川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,61,0,83,-1,-1,235,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 福井県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,83,0,-1,-1,160,-1,-1,-1,176,188,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山梨県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,164,-1,126,134,-1,-1,-1,-1,0,162,-1,109,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 長野県,-1,-1,-1,-1,-1,-1,-1,-1,-1,151,220,-1,-1,-1,208,196,-1,-1,162,0,295,271,272,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岐阜県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,294,235,160,-1,295,0,-1,43,113,128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 静岡県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,167,-1,-1,-1,-1,109,271,-1,0,181,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 愛知県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,272,43,181,0,82,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 三重県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,-1,82,0,95,107,-1,-1,91,91,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 滋賀県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,176,-1,-1,128,-1,-1,95,0,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 京都府,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,188,-1,-1,-1,-1,-1,107,14,0,49,75,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 大阪府,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,49,0,45,33,80,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 兵庫県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,75,45,0,-1,-1,180,-1,139,-1,-1,115,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 奈良県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,-1,48,33,-1,0,98,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 和歌山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,-1,-1,-1,-1,98,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 鳥取県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,180,-1,-1,0,128,167,296,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # 島根県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,80,-1,128,0,-1,212,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岡山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,139,-1,-1,167,-1,0,165,-1,-1,70,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 広島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,296,212,165,0,131,-1,-1,190,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山口県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,131,0,250,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 徳島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,-1,-1,-1,-1,-1,-1,250,0,73,191,161,-1,-1,-1,-1,-1,-1,-1,-1 # # 香川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,-1,-1,73,0,156,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 愛媛県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,190,-1,191,156,0,156,-1,-1,-1,-1,-1,-1,-1,-1 # # 高知県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,161,-1,156,0,-1,-1,-1,-1,-1,-1,-1,-1 # # 福岡県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,165,-1,-1,-1,-1,0,61,-1,117,159,-1,-1,-1 # # 佐賀県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,61,0,109,-1,-1,-1,-1,-1 # # 長崎県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,109,0,-1,-1,-1,-1,-1 # # 熊本県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,117,-1,-1,0,218,192,187,-1 # # 大分県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,159,-1,-1,218,0,181,-1,-1 # # 宮崎県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,192,181,0,158,-1 # # 鹿児島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,187,-1,158,0,733 # # 沖縄県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,733,0 # '47都道府県のうち出発地と目的地の入力して最短経路を求めて距離と順路を表示する(ただし経路は7以下とする)' :- 'Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 県と県の間を半角 開ける'(_都道府県名ならび), '47都道府県のうち出発地と目的地の入力する'(_都道府県名ならび,_出発地,_目的地), 最短経路(_出発地,_目的地,_距離,_順路), 距離と経路の表示(_出発地,_目的地,_距離,_順路). '47都道府県のうち出発地と目的地の入力する'(_都道府県名ならび,_出発地,_目的地) :- 出発地を入力する(_都道府県名ならび,_出発地), 目的地を入力する(_都道府県名ならび,_目的地). 出発地を入力する(_都道府県名ならび,_出発地) :- write('出発地の都道府県名番号を入力してください : '), get_line(Line), 出発地を入力診断(Line,_都道府県名ならび,_出発地),!. 出発地を入力する(_都道府県名ならび,_出発地) :- 出発地を入力する(_都道府県名ならび,_出発地). 出発地を入力診断(Line,_都道府県名ならび,_出発地) :- atom_to_term(Line,_出発地番号,_), integer(_出発地番号), _出発地番号 > 1, _出発地番号 =< 47, nth1(_出発地番号,_都道府県名ならび,_出発地),!. 出発地を入力診断(Line,_都道府県名ならび,_出発地) :- writef('入力された %t から適切な出発地を得ることができません。再入力をお願いします。\n',[Line]), fail. 目的地を入力する(_都道府県名ならび,_目的地) :- write('目的地の都道府県名番号を入力してください : '), get_line(Line), 目的地を入力診断(Line,_都道府県名ならび,_目的地), 目的地を入力する(_都道府県名ならび,_目的地) :- 目的地を入力する(_都道府県名ならび,_目的地). 目的地を入力診断(Line,_都道府県名ならび,_目的地) :- atom_to_term(Line,_目的地番号,_), integer(_目的地番号), _目的地番号 > 1, _目的地番号 =< 47,!. 目的地を入力診断(Line,_,_目的地) :- writef('入力された %t から適切な目的地を得ることができません。再入力をお願いします。\n',[Line]), fail. 距離と経路の表示(_出発地,_目的地,_距離,_順路) :- writef('距離は %t,経路は %t',[_距離,_出発地]), append(_,[[A,B]|R],_順路), writef(' -> %t ',[B]), R = [], write('\n'),!. 'Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 県と県の間を半角 開ける'(_都道府県名ならび) :- get_split_lines('Map.dat',[','],LL), 第要素は都道府県名、残りは経路情報(LL,_都道府県名ならび,_経路情報ならび), append(L0,[[_県名|_隣接情報ならび]|R2],_経路情報ならび), 隣接情報の登録(_県名,_都道府県名ならび,_隣接情報ならび), length([_|L0],_都道府県番号), write('%2d.%t ',[_都道府県番号,_県名]), R2 = [], write('\n'). 第一要素は都道府県名、残りは経路情報(LL,_都道府県名ならび,_経路情報ならび) :- LL = [_都道府県名ならび|_経路情報ならび],!. 隣接情報の登録(_都道府県名,_都道府県名ならび,L1) :- abolish(隣接県距離/3), append(L0,[_距離|R],L1), \+(_距離 = (-1)), \+(_距離 = 0), length([_|L0],Nth), nth1(Nth,_都道府県名ならび,_都道府県名2), assertz(隣接県距離(_都道府県名,_件名2,_距離)), fail. 隣接情報の登録(_,_,_). 最短経路(_出発地,_目的地,_距離,_順路) :- findall([_順路,_距離],( 到達(_出発地,_目的地,_距離,[],_順路)), _順路・距離ならび), findmin(_距離,append(_,[[_,_距離]|_],_順路・距離ならび),_最短距離), append(_,[[_順路,_最短距離]|_],_順路距離ならび). 到達(_都道府県名1,_都道府県名2,_距離,_順路1,_順路) :- 隣接県距離(_都道府県名1,_都道府県名2,_距離), append(_順路1,[[_都道府県名1,_都道府県名2]],_順路),!. 到達(_都道府県名1,_都道府県名2,_距離,_順路1,_順路) :- length(_順路1,_経路数), _経路数 < 7, 隣接県距離(_都道府県名1,_都道府県名3,_距離1), この経路は選択されたことがない(_都道府県名1,_都道府県名2), append(_順路1,[[_都道府県名1,_都道府県名3]],_順路2), 到達(_都道府県名1,_都道府県名2,_距離2,_順路2,_順路), _距離 is _距離1 + _距離2. この経路は選択されたことがない(_都道府県名1,_都道府県名2) :- \+(append(_,[[_都道府県名1,_都道府県名3]|_],_順路1)), \+(append(_,[[_都道府県名3,_都道府県名1]|_],_順路1)),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1296387672/271 # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):バブルソート法を使って、map.datに対して交差点名(アルファベット)を # 入力すると、その交差点から直線距離が近い順に、隣接交差点名とその距離の二乗をディスプレイに表示する # プログラムを書きなさい。 # 1 0.0 0.0 H 2 2 4 0 0 # 2 -0.6 0.15 D 3 1 3 11 0 # 3 -0.83 0.0 K 4 2 4 9 10 # 4 -0.6 -0.38 O 3 1 3 5 0 # 5 -0.38 -0.68 M 3 4 6 7 0 # 6 6.0 -0.3 T 1 5 0 0 0 # 7 -0.18 -1.02 U 2 5 8 0 0 # 8 -0.84 -1.58 N 3 7 9 18 0 # 9 -0.9 -0.98 V 2 3 8 0 0 # 10 -0.98 0.51 R 3 3 11 13 0 # 11 -0.78 0.3 P 3 2 10 12 0 # 12 -1.28 0.68 E 2 11 13 0 0 # 13 -1.32 0.53 I 4 10 12 14 15 # 14 -1.8 0.98 C 2 13 20 0 0 # 15 -1.43 -0.15 J 2 13 16 0 0 # 16 -1.73 -0.26 P 3 15 17 0 0 # 17 -1.8 -1.43 W 3 16 18 19 0 # 18 -1.2 -1.73 S 2 8 17 0 0 # 19 -2.48 -1.2 Z 2 17 20 0 0 # 20 -2.33 -0.51 B 3 14 16 19 0 # 'バブルソート法を使って、map.datに対して交差点名(アルファベット)を入力すると、その交差点から直線距離が近い順に、隣接交差点名とその距離の二乗をディスプレイに表示する' :- get_split_lines('map.dat',[','],LL), 交差点名の入力(_交差点名), append(_,[[N,X,Y,_交差点名,_,_,_,_,_]|_],LL), その交差点から直線距離が近い順に隣接交差点名とその距離の二乗を(_整列した直線距離の二乗ならび・交差点名ならび), 表示する(_整列した直線距離の二乗ならび・交差点名ならび). 交差点名の入力(_交差点名) :- write('交差点名を入力してください : '), get_line(_交差点名),!. その交差点から直線距離が近い順に隣接交差点名とその距離の二乗を(LL,_整列した直線距離の二乗ならび・交差点名ならび) :- findall([_直線距離の二乗,_交差点名1],( append(_,[[N1,X1,Y1,_交差点名1,_隣接点1,_隣接点2,_隣接点3,_隣接点4,_隣接点5]|_],LL), \+(_交差点名=_交差点名), 交差点はNと隣接している(N,_隣接点1,_隣接点2,_隣接点3,_隣接点4,_隣接点5), _直線距離の二乗 is (X1-X) ^ 2 + (Y1-Y) ^ 2), _直線距離の二乗ならび・交差点名ならび), バブルソート(_直線距離の二乗ならび・交差点名ならび,_整列した直線距離の二乗ならび・交差点名ならび),!. 交差点はNと隣接している(N,N,_,_,_,_) :- !. 交差点はNと隣接している(N,_,N,_,_,_) :- !. 交差点はNと隣接している(N,_,_,N,_,_) :- !. 交差点はNと隣接している(N,_,_,_,N,_) :- !. 交差点はNと隣接している(N,_,_,_,_,N) :- !. バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一),!, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). 表示する(_整列した直線距離の二乗ならび・交差点名ならび) :- append(_,[[_直線距離の二乗,]|R],_整列した直線距離の二乗ならび・交差点名ならび), writef('%t,%t\n',[_隣接交差点名,_直線距離の二乗]), R = [],!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1296387672/337 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):次の書きこみにまとめます。 # # 地図データmap.dat に対して、出発点の交差点番号をキーボードから入力すると、 # A. 隣接する交差点名と交差点番号および出発点からの距離をディスプレイに表示 # する # B. 表示された交差点の中から次に進む交差点を選択できる # C. 選択された交差点に対して、A. の手順に戻り、順々に道案内する # プログラムを作成しなさい。手順A の距離は、出発点からの直線距離ではなく、 # 経路の累計移動距離を計算すること。また、プログラムを途中で終了させるコマ # ンドも用意すること。 # # # という問題について次のようなソースを書いたのですが、これでは経路の累計移動距離が計算されないため、不十分だと言われました。 # http://ime.nu/codepad.org/1hcQfHlM # 地図データはこちらに上げてあります # http://ime.nu/www1.axfc.net/uploader/Sc/so/202935.dat # どこをどう直せばいいのか、どなたかお願いします # # 1, 0.0, 0.0, A, 2, 2, 4 # 2, -0.6, 0.15, B, 3, 1, 3, 11 # 3, -0.83, 0.0, C, 4, 2, 4, 9, 10 # 4, -0.6, -0.38, D, 3, 1, 3, 5 # 5, -0.38, -0.68, E, 3, 4, 6, 7 # 6, 6.0, -0.3, F, 1, 5 # 7, -0.18, -1.02, G, 2, 5, 8 # 8,-0.84, -1.58, H, 3, 7, 9, 18 # 9, -0.9, -0.98, I, 2, 3, 8 # 10, -0.98, 0.15, J, 3, 3, 11, 13 # 11, -0.78, 0.3, K, 3, 2, 10, 12 # 12, -1.28, 0.68, L, 2, 11, 13 # 13, -1.32, 0.53, M, 4, 10, 12, 14, 15 # 14, -1.8, 0.98, N, 2, 13, 20 # 15, -1.43, -0.15, O, 2, 13, 16 # 16, -1.73, -0.26, P,3, 15, 17, 20 # 17, -1.8, -1.43, Q, 3, 16, 18, 19 # 18, -1.2, -1.73, R, 2, 8, 17 # 19, -2.48, -1.2, S, 2, 17, 20 # 20, -2.33, -0.51, T, 3, 14, 16, 19 交差点を進む(_出発交差点,_移動記録,_移動累積距離) :- 地図データを読み込む(_地図データ), 地図データの登録(_地図データ), 交差点を進む(_出発交差点,0.0,[],_移動記録,_移動累積距離). 交差点を進む(_交差点,_移動記録1,_移動累積距離1,_移動記録,_移動累積距離) :- 隣接交差点を表示する(_交差点), writef('ここまでの移動累積距離は%tです\n',[_移動累積距離1]), write('どの交差点に進みますか ? '), get_line(_隣接交差点), 隣接交差点との距離(_交差点,_隣接交差点,_距離), _移動累積距離2 is _距離 + _移動累積距離1, 交差点を進む(_交差点,[_隣接交差点|_移動記録1],_移動累積距離2,_移動記録,_移動累積距離). 交差点を進む(_交差点,_移動記録,_移動累積距離,_移動記録,_移動累積距離) :- writef('交差点%tは存在しません\nここまでの移動累積距離は%tでした\nプログラムを終了します\n',[_交差点,_累積移動距離]). 隣接交差点を表示する(_交差点) :- findall(_隣接交差点,隣接交差点(_交差点,_隣接交差点),_隣接交差点ならび), \+(_隣接交差点ならび=[]), concat_atom(_隣接交差点ならび,',',_隣接交差点表示), writef('隣接交差点は %t があります\n',[_隣接交差点表示]). 隣接交差点との距離(_交差点,_隣接交差点,_距離) :- 交差点位置(_交差点,X1,Y1), 隣接交差点(_交差点,X2,Y2), _距離 is sqrt((X2 - X1) ^2 + (Y2 - Y1) ^ 2). 地図データを読み込む(_地図データ) :- get_split_lines('map.dat',[','],LL). 地図データの登録(_地図データ) :- 交差点位置の登録(_地図データ), 隣接交差点の登録(_地図データ). 交差点位置の登録(_地図データ) :- abolish(交差点位置/3), append(_,[[_,X,Y,_交差点|_]|R],_交差点データ), assertz(交差点位置(_交差点,X,Y)), R = []. 隣接交差点の登録(_地図データ) :- abolish(隣接交差点/2), append(_,[[_交差点ID,_,_,_交差点|_隣接交差点ならび]|R],_地図データ), 隣接交差点を得る(_地図データ,_隣接交差点IDならび,_隣接交差点), assertz(隣接交差点(_交差点,_隣接交差点)), R = []. 隣接交差点を得る(_地図データ,[_隣接交差点ID|R],_隣接交差点) :- nth1(_隣接交差点ID,_地図データ,[_,_,_,_隣接交差点|_]). 隣接交差点を得る(_地図データ,[_|R],_隣接交差点) :- 隣接交差点を得る(_地図データ,R,_隣接交差点). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/833 # ●正規表現の使用環境 # C # # ●説明 # Apacheのログから一部分を抜き出して検索したい # # ●対象データ # host.ne.jp - - [11/May/2011:12:22:15 +0900] "GET /~akasata/index.xml?gat=tPFnlVCP8aUYq8jjPqA=&BSdebug=AV/w3.3r1.1/ HTTP/1.1" # 200 6703 "https://server.ne.jp/" "Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14" # (以上1行) # ●希望する結果 # 1件目 # host.ne.jp # 2件目 # /~akasata/index.xml # # 以上のような検索を実装しようとして、 # regerror(regcomp(&preg, "(.+) - [^[] \\[.+\\] \"[^\" ]+ ((/~akasata/[^\"]+)\\?g.+)*([^\"]+) [^\" ]+\".+", REG_EXTENDED|REG_NEWLINE), &preg, errbuf, sizeof(errbuf)); # 以下のような正規表現を用いた(Cのエスケープが混じっているため見辛ければすいません)のですが、 # 後ほど検索対象を調べて一部不要な部分があったため # regerror(regcomp(&preg, "(.+) - [^[] \\[.+\\] \"[^\" ]+ ((/~akasata/[^\"]+)\\?g.+) [^\" ]+\".+", REG_EXTENDED|REG_NEWLINE), &preg, errbuf, sizeof(errbuf)); # 以下のように正規表現を変更したところ、同じ結果を返すのにもかかわらず # 実行速度が4倍以上もかかるようになってしまいました。原因かわかる方教えていただけないでしょうか? # # 'Apacheのログから一部分を抜き出して検索したい'(ApacheLog,X) :- get_split_lines(ApacheLog,[' ','"','?'],LL), append(_,[L|R],LL), 選択(L,X). 選択(L,X) :- append(_,['GET',X|_],L). 選択(L,X) :- append(_,[X|_],L), sub_atom(X,0,4,_,http). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301553333/212 # [1]C言語演習 # [2]問題文 # 次の形式のタブ区切りファイルがある。(行数は最大で1000万行とする) # 生徒ID クラス名 国語得点 数学得点 英語得点 # 生徒IDは8桁の0から9で構成される文字列 # クラス名は4桁の0から9で構成される文字列 # 国語得点、数学得点、英語得点は3桁の0から9で構成される文字列とする。 # # (1)各教科の得点の和が同じ生徒達のグループについて、そのグループが何人で何クラスの # 生徒から構成されているかを、得点和毎に表出力せよ # ただし0人で構成されるグループについては出力する必要がない。 # 形式例 # 得点:123 人数:5人 グループ数:4 # 得点:128 人数:3人 グループ数:3 # 得点:214 人数:11人 グループ数:9 # ............ # # (2)それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係と # 同じ生徒をリストアップせよ # ただしあるクラスの2つの教科の平均点が一致している場合はその2つの教科の得点の # 大小関係は不問として出力する。(3つが一致している場合はそのクラスの生徒全員 # がリストアップされることになる # [3] OSはLinux,言語はCです。(C++は不可) # [4] 4/30まで # [5] stdlib.h stdio.h string.hをincludeしても良いがそれ以外は不可だそうです # よろしくお願いします。 # # '各教科の得点の和が同じ生徒達のグループについて、そのグループが何人で何クラスの生徒から構成されているかを、得点和毎に表出力せよ'(_ファイル) :- get_split_lines(_ファイル,['\t'],LL), findall([_得点合計,_クラス名],( append(_,[[_生徒ID,_クラス名,_国語得点,_数学得点,_英語得点]|_],LL), _得点合計 is _国語得点,_数学得点,_英語得点), L1), findsetof(_得点合計,( append(_,[[_得点合計,_]|_,L1)), L2), findsetof([_得点合計,_クラス]( append(_,[[_得点合計,_クラス]|_,L1)), L3), findall([_得点合計,_グループ人数,_クラス数],( append(_,[_得点合計|_],L2), count(append(_,[[_得点合計,_]|_],L1),_グループ人数)), count(append(_,[[_得点合計,_]|_],L3),_クラス数)), _得点合計・グループ人数・クラス数集計ならび), 出力する(_得点合計・グループ人数・クラス数集計ならび). 出力する(_得点合計・グループ人数・クラス数集計ならび) :- append(_,[[_得点合計,_グループ人数,_クラス数]|R],_得点合計・グループ人数・クラス数集計ならび), writef('得点:%t 人数:%t人 グループ数:%t\n',[_得点合計,_グループ人数,_クラス数]), R = [],!. writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301553333/212 # [1]C言語演習 # [2]問題文 # 次の形式のタブ区切りファイルがある。(行数は最大で1000万行とする) # 生徒ID クラス名 国語得点 数学得点 英語得点 # 生徒IDは8桁の0から9で構成される文字列 # クラス名は4桁の0から9で構成される文字列 # 国語得点、数学得点、英語得点は3桁の0から9で構成される文字列とする。 # # (2)それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係と # 同じ生徒をリストアップせよ # ただしあるクラスの2つの教科の平均点が一致している場合はその2つの教科の得点の # 大小関係は不問として出力する。(3つが一致している場合はそのクラスの生徒全員 # がリストアップされることになる # [3] OSはLinux,言語はCです。(C++は不可) # [4] 4/30まで # [5] stdlib.h stdio.h string.hをincludeしても良いがそれ以外は不可だそうです # よろしくお願いします。 # # それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係が同じ生徒をリストアップ(_ファイル) :- get_split_lines(_ファイル,['\t'],LL), findsetof(_クラス,append(_,[[_,_クラス,_,_,_]|_],LL),_クラスならび), findall([_クラス,_パターン],( append(_,[_クラス|_],_クラスならび), パターン(LL,_クラス,_国語平均点,_数学平均点,_英語平均点,_パターン)), _クラス・パターンならび), append(_,[[_ID,_クラス,_国語,_数学,_英語]|R],LL), パターンが一致したら表示(_ID,_クラス,_クラスパターンならび,_国語,_数学,_英語), R = [],!. パターンが一致したら表示(_ID,_クラス,_クラス・パターンならび,_国語,_数学,_英語) :- append(_,[[_クラス,_パターン]|_],_クラス・パターンならび), パターン判断(_パターン,_国語,_数学,_英語), writef('%t\n',[_クラス,_ID]),!. パターンが一致したら表示(_,_,_,_,_,_). パターン(LL,_クラス,_国語平均点,_数学平均点,_英語平均点,_パターン) :- findavg(_国語,append(_,[[_,_クラス,_国語,_,_]|_],LL),_国語平均点), findavg(_数学,append(_,[[_,_クラス,_数学,_,_]|_],LL),_数学平均点), findavg(_英語,append(_,[[_,_クラス,_英語,_,_]|_],LL),_英語平均点), パターン(_パターン,_国語平均点,_数学平均点,_英語平均点). パターン(1,A,B,C) :- A >B,B > C,!. パターン(2,A,B,C) :- A >C,C > B,!. パターン(3,A,B,C) :- B >A,A > C,!. パターン(4,A,B,C) :- B >C,C > A,!. パターン(5,A,B,C) :- C >A,A > B,!. パターン(6,A,B,C) :- C >B,B > A,!. パターン(7,E,E,C) :- \+(E=C),E > C,!. パターン(8,E,E,C) :- \+(E=C),E < C,!. パターン(9,E,B,E) :- \+(E=B),E > B,!. パターン(10,E,B,E) :- \+(E=B),E < B,!. パターン(11,A,E,E) :- \+(E=C),E < A,!. パターン(12,A,E,E) :- \+(E=C),E > A,!. パターン(13,E,E,E). パターン判断(_パターン,A,B,C) :- _パターン < 7, パターン(_パターン,A,B,C),!. パターン判断(7,A,B,C) :- C < A,C < B,!. パターン判断(8,A,B,C) :- C > A,C > B,!. パターン判断(9,A,B,C) :- B < A,B < C,!. パターン判断(10,A,B,C) :- B > A,B > C,!. パターン判断(11,A,E,E) :- A < B,A < C,!. パターン判断(12,A,E,E) :- A > B,A > C,!. パターン判断(13,_,_,_). writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301553333/908 # # # [1] 授業単元:計算機プログラミング # [2] 問題文:http://nojiriko.asia/prolog/org1648258.pdf #         リンク先の問題2 # # 2.下記のような,学生 10 名の 5 科目の成績表がある(表の仕様,値などは各自決めてよい)。 # 成績表 # StudentNo. Electromag. Elec.Cct Computer Math English # E001 70 65 85 90 70 # E002 50 45 55 65 60 # E003 78 90 95 70 85 # E004 90 98 87 85 75 # E005 45 75 62 48 50 # # 個人毎,および科目毎の平均を計算するプログラムを組みなさい。 # ただし,プログラムの設計仕様に次の 2 点を必ず含めること。 # # (1) キーボードなどから点数を入力し,結果をファイルに出力すること(kekka.txt など)。 # ファイル(data.txt など)を読込ませてもよい。ただし,値をプログラムに組み込まないこと! # (2) 平均を求める箇所を関数にすること。 '個人毎,および科目毎の平均を計算する。キーボードなどから点数を入力し(ファイル(data.txt など)を読込ませてもよい),結果をファイルに出力する'(_入力ファイル,_出力ファイル) :- 'キーボードなどから点数を入力し(ファイル(data.txt など)を読込ませてもよい)'(_入力ファイル,_見出し項,_生成表), '個人毎,および科目毎の平均を計算する'(_成績表,_個人毎平均,_個人毎平均を付加した成績表,_科目毎平均), ファイルに出力する(_見出し項,_個人毎平均,_科目毎平均). 'キーボードなどから点数を入力し(ファイル(data.txt など)を読込ませてもよい)'(_入力ファイル,_見出し項,_生成表) :- get_split_lines(_入力ファイル,[' '],LL), LL = [_見出し項|_成績表]. '個人毎,および科目毎の平均を計算する'(_成績表,_個人毎平均,_個人毎平均を付加した成績表,_科目毎平均) :- 個人毎の平均を計算する(_成績表,_個人毎平均,_個人毎平均を付加した成績表), 科目毎の平均を計算する(_成績表,_科目毎平均). 個人毎の平均を計算する(_成績表,_個人毎平均を付加した成績表) :- findall(L,( append(_,[L1|_],_成績表), L1 = [_|_個人成績ならび], avg(_個人成績ならび,_個人毎平均), append(L1,[_個人毎平均],L)), _個人毎平均を付加した成績表). 科目毎の平均を計算する(_成績表,_科目毎平均) :- 転置(_成績表,_転置された成績表), findall(Avg,( append(_,[[_|L]|_],_転置された成績表), avg(L,Avg)), _科目毎平均). ファイルに出力する(_見出し項,_個人毎平均,_科目毎平均) :- open(_出力ファイル,write,Outstream), 見出し項を出力する(Outstream,_見出し項), 個人毎の平均を出力する(Outstream,_個人毎平均), 科目毎の平均を出力する(Outstream,_科目毎平均), close(Outstream). 見出し項を出力する(Outstream,_見出し項) :- append(_見出し項,['Average'],_見出し項のニ), write_formattet(Outstream,'%16t %16t %16t %16t %16t %16t %16t %16t \n',_見出し項のニ),!. 個人毎の平均を出力する(Outstream,_個人毎平均) :- append(_,[L|R],_個人毎平均), writef(Outstream,'%16t %16t %16t %16t %16t %16t %16t %16t \n',L), R = []. 科目毎の平均を出力する(Outstream,_科目毎平均) :- writef(Outstream,'avarage %16t %16t %16t %16t %16t %16t %16t \n',_科目毎平均). writef(Stream,_表示パターン,_値ならび) :- switef(_表示文字列,_表示パターン,_値ならび), write(Stream,_表示文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1305867431/197 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/t6Un18Xw # 上記のファイルを元に40年間の年平均気温の平均より平均気温が低い年を # ファイルkadai05.datへ出力するプログラムkadai05.c を作成せよ。 # # また同様に年平均気温の低い順番に並び替えて、 # ファイルkadai06.datへ出力するプログラムkadai06.c を作成せよ # # 元のファイルで使っているtokyo.datは↓です # http://ime.nu/www.dotup.org/uploda/www.dotup.org1668350.dat # # 1970 15.2 19.3 35.5 8/29 3.4 12/26 11.5 -4.0 1/17 26.9 8/22 # 1971 15.0 19.0 34.4 8/11 3.1 1/3 11.5 -2.2 1/11 26.8 8/6 # 1972 15.7 19.6 35.2 8/8 2.0 2/26 12.2 -2.1 1/7 26.5 8/5 # 1973 15.7 19.9 34.7 7/18 4.0 1/15 11.9 -1.9 2/9 27.6 8/19 # 1974 15.2 19.2 34.2 8/7 2.5 1/21 11.8 -2.7 2/11 26.1 8/12 # 1975 15.6 19.5 35.6 7/18 4.2 1/2 12.2 -2.6 2/18 26.3 7/28 # 1976 15.0 19.0 35.4 8/24 5.0 1/21 11.4 -3.9 1/22 25.6 8/23 # 1977 15.8 19.7 34.9 8/9 2.4 1/23 12.3 -3.8 2/1 27.7 8/5 # 1978 16.1 20.0 36.3 8/22 3.3 1/18 12.6 -2.0 2/3 27.5 8/20 # 1979 16.9 20.6 34.3 7/31 3.5 1/13 13.5 -0.5 1/29 27.4 8/20 # 1980 15.4 19.2 33.0 7/23 3.9 1/13 12.0 -1.2 2/15 26.0 7/23 # 1981 15.0 18.8 34.3 7/17 4.5 2/24 11.6 -3.5 2/27 26.5 8/12 # 1982 16.0 19.5 33.0 8/22 4.0 1/16 12.6 -1.0 2/8 26.6 8/29 # 1983 15.7 19.5 37.1 8/19 6.1 1/22 12.3 -2.4 1/23 27.6 8/80 # 1984 14.9 18.7 38.1 9/3 0.7 1/21 11.6 -3.5 2/9 27.6 8/7 # 1985 15.7 19.3 35.0 9/2 3.9 1/30 12.3 -2.5 1/30 27.1 8/17 # 1986 15.2 18.7 34.6 8/5 2.9 2/11 11.9 -1.6 2/9 26.8 8/30 # 1987 16.3 20.0 37.3 7/24 3.4 2/18 12.8 -0.7 2/2 28.0 7/28 # 1988 15.4 19.0 32.9 8/23 5.0 2/27 12.1 -1.7 2/22 27.1 8/24 # 1989 16.4 19.9 33.5 8/10 5.8 2/24 13.2 0.9 1/28 26.5 8/31 # 1990 17.0 20.6 35.9 8/24 1.5 2/1 13.8 -1.4 1/27 28.8 8/24 # 1991 16.4 19.8 35.6 7/25 4.9 12/27 13.2 -0.8 2/25 27.8 8/30 # 1992 16.0 19.6 35.2 9/3 5.6 2/11 2.7 -0.5 2/1 27.3 9/30 # 1993 15.5 19.0 32.9 8/12 4.3 1/15 12.3 0.7 12/24 25.9 8/23 # 1994 16.9 20.5 39.1 8/3 4.1 2/12 13.5 -2.3 2/14 29.3 8/4 # 1995 16.3 20.1 36.4 8/28 4.6 3/4 13.0 -1.2 1/15 27.8 8/9 # 1996 15.8 19.7 38.7 8/15 2.0 2/17 12.3 -1.5 2/3 28.2 8/16 # 1997 16.7 20.6 37.7 7/5 4.6 2/22 13.2 -2.1 1/22 28.0 8/10 # 1998 16.7 20.5 36.1 7/4 4.2 1/12 13.4 -0.8 1/26 27.4 8/26 # 1999 17.0 20.9 34.8 8/23 6.1 1/8 13.6 -1.4 2/4 27.5 9/10 # 2000 16.9 20.6 37.8 9/2 4.4 2/26 13.6 -0.7 1/28 28.2 9/20 # 2001 16.5 20.4 38.1 7/24 4.4 1/20 13.1 -2.4 1/15 28.2 7/24 # 2002 16.7 20.5 35.8 8/11 3.0 12/9 13.4 -0.3 1/4 28.1 8/10 # 2003 16.0 19.6 34.3 9/13 1.8 1/3 12.8 -0.8 1/16 27.1 8/26 # 2004 17.3 21.3 39.5 7/20 4.3 12/31 13.9 0.2 12/31 29.6 7/21 # 2005 16.2 20.0 36.2 6/28 3.6 3/4 12.8 -0.8 12/19 27.6 8/5 # 2006 16.4 19.9 36.1 7/15 3.9 2/6 13.4 -1.5 2/5 27.5 8/19 # 2007 17.0 20.7 37.5 8/17 6.5 1/20 13.7 0.2 2/25 29.4 8/16 # 2008 16.4 20.1 35.3 8/8 4.5 2/9 13.3 -0.1 2/4 27.6 8/15 # 2009 16.7 20.2 34.2 7/16 5.3 2/27 13.6 0.0 1/13 26.7 7/26 '40年間気温情報ならび'(_40年間気温情報ならび) :- get_split_lines('気温データ',[' '],_40年間気温情報ならび). '40年間年平均気温'(_40年間気温情報ならび,_40年間年平均気温) :- findavg(_年平均気温,( append(_,[[_,_,_年平均気温|_]|_],_40年間気温情報ならび)), _40年間年平均気温). '40年間の年平均気温の平均より平均気温が低い年をファイルkadai05.datへ出力する' :- '40年間気温情報ならび'(_40年間気温情報ならび), '40年間年平均気温'(_40年間気温情報ならび,_40年間年平均気温), tell('kadai05.dat'), append(_,[[_年,_,_年平均気温|_]|R],_40年間気温情報ならび), 出力する(_年,_年平均気温,_40年間年平均気温), R = [], told. '40年間の年平均気温の平均より平均気温が低い年を出力する'(_年,_年平均気温,_40年間年平均気温) :- _年平均気温 < _40年間年平均気温, write('%t年\n',[_年]), fail. '40年間の年平均気温の平均より平均気温が低い年を出力する'(_,_,_). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1305867431/207 # すみません、もう1問お願いします # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 寒暖の差が大きい順番に並び替えて、ファイルkadai07.datへ出力するプログラムkadai07.c を作成せよ。 # 寒暖の差: 最高の最高気温? 最低の最低気温 # '寒暖の差が大きい順番に並び替えて、ファイルkadai07.datへ出力する' :- '寒暖の差が大きい順番に並び替えて、'(_差が大きい順寒暖の差ならび), 'ファイルkadai07.datへ出力する'(_差が大きい順寒暖の差ならび). '40年間気温情報ならび'(_40年間気温情報ならび) :- get_split_lines('気温データ',[' '],_40年間気温情報ならび). '寒暖の差が大きい順番に並び替えて、'(_差が大きい順寒暖の差ならび) :- '40年間気温情報ならび'(_40年間気温情報ならび), '寒暖の差ならび'(_40年間気温情報ならび,_寒暖の差ならび), sort(_寒暖の差ならび,_差が小さい順寒暖の差ならび), reverse(_差が小さい順寒暖の差ならび,_差が大きい順寒暖の差ならび). '寒暖の差ならび'(_40年間気温情報ならび,_寒暖の差ならび) :- findall([_年温度差,_年度],( append(_,[_年気温情報ならび|_],_40年間気温情報ならび), 寒暖の差(_年気温情報ならび,_年度,_年温度差)), _寒暖の差ならび). 寒暖の差(_年気温情報ならび,_年度,_年温度差) :- nth1(1,_年気温情報ならび,_年度), nth1(4,_年気温情報ならび,_年最高気温), nth1(11,_年気温情報ならび,_年最低気温), _年温度差 is _年最高気温 - _年最低気温. 'ファイルkadai07.datへ出力する'(_差が大きい順寒暖の差ならび) :- tell('kadai07.dat'), append(_,[[_寒暖差,_年度]|R],_差が大きい順寒暖の差ならび), writef('%t %t\n',[_年度,_寒暖差]), R = [], told. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1307166756/384 # # [1] 授業単元:2次元配列の利用 # [2] 問題文(含コード&リンク): # 新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示するプログラムを作成しなさい。 # なお、駅番号は、東京が1、新横浜が2、名古屋が3、京都が4、新大阪が5とする。 # 但し、料金を表示してから後で、1を入力すると上記の処理を繰り返し、0を入力するとプログラムを終了するものとする。 #     新大阪 京都  名古屋 新横浜 # 東京  14920 14390 11540  3180 # 新横浜 14600 13660 10910 # 名古屋 6840 6100 # 京都  3240 # :- のぞみ料金表の生成('のぞみ料金表.txt'). 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する :- 出発駅を得る(_出発駅), 到着駅を得る(_到着駅), のぞみ料金(_出発駅,_到着駅,_料金), 料金を表示する(_出発駅,_到着駅,_料金), write('0..終了 1..別の料金を検索する : '), get_line('0'),!. 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する :- 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する. 出発駅を得る(_出発駅) :- 駅番号駅名表示(_駅番号駅名表示), writef('出発駅を番号で選択してください。%t : ',[_駅番号駅名表示]), 駅番号で入力する(_駅番号), 駅番号(_駅番号,_出発駅),!. 出発駅を得る(_出発駅) :- 出発駅を得る(_出発駅). 到着駅を得る(_到着駅) :- 駅番号駅名表示(_駅番号駅名表示), writef('到着駅を番号で選択してください。%t : ',[_駅番号駅名表示]), 駅番号で入力する(_駅番号), 駅番号(_駅番号,_到着駅),!. 到着駅を得る(_到着駅) :- 到着駅を得る(_到着駅). 駅番号駅名表示(_駅番号駅名表示) :- findall(S,( 駅番号(_駅番号,_駅名), concat_atom([_駅番号,'..',_駅名],S)), L), concat_atom(L,' ',_駅番号駅名表示),!. 駅番号で入力する(_駅番号) :- get_line(Line), 駅番号入力診断(Line,_駅番号),!. 駅番号入力診断(Line,_駅番号) :- atom_to_term(Line,_駅番号,_), integer(_駅番号), _駅番号 >= 1, _駅番号 =< 5,!. 駅番号入力診断(Line,_駅番号) :- writef('入力された %t から適切な駅番号が得られません。再入力をお願いします\n',[Line]), fail. 料金を表示する(_出発駅,_到着駅,_料金) :- writef('%t から %t までの料金は %t 円です。\n',[_出発駅,_到着駅,_料金]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% のぞみ料金表の作成(File) :- get_split_lines(File,[' '],Lines), Lines = [_駅名横ならび|R1], findall(_駅名,( append(LL0,[[_駅名|_]|R],R1)), _駅名縦ならび), 駅番号の登録(_駅名縦ならび), findall(_料金ならび,( append(LL0,[[_|_料金ならび]|_],R1)), _料金表), のぞみ料金表の作成(_駅名縦ならび,_駅名横ならび,_料金表). 駅番号の登録(_駅名縦ならび) :- append(_駅名縦ならび,[新大阪],_駅名縦ならびのニ), append(L0,[_駅名|R],_駅名縦ならびのニ), length([_|L0],Len), assertz((駅番号(Len,_駅名) :- !)), R = []. のぞみ料金表の作成([],_,_) :- !. のぞみ料金表の作成([_駅名|R1],_駅名横ならび,[L3|R3]) :- 駅単位料金表(_駅名,_駅名横ならび,L3), のぞみ料金表の作成(R1,_駅名横ならび,R3). 起点駅単位料金登録(_,_,[]) :- !. 起点駅単位料金登録(_駅名,[_駅名2|R2],[_料金|R3]) :- assertz(のぞみ料金(_駅名,_駅名2,_料金)), assertz(のぞみ料金(_駅名2,_駅名,_料金)), 起点駅単位料金表(_駅名,R2,R3). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1307166756/384 # # [1] 授業単元:2次元配列の利用 # [2] 問題文(含コード&リンク): # 新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示するプログラムを作成しなさい。 # なお、駅番号は、東京が1、新横浜が2、名古屋が3、京都が4、新大阪が5とする。 # 但し、料金を表示してから後で、1を入力すると上記の処理を繰り返し、0を入力するとプログラムを終了するものとする。 #     新大阪 京都  名古屋 新横浜 # 東京  14920 14390 11540  3180 # 新横浜 14600 13660 10910 # 名古屋 6840 6100 # 京都  3240 # のぞみ料金表の作成(File) :- get_split_lines(File,[' '],Lines), Lines = [_駅名横ならび|R1], findall(_駅名,( append(LL0,[[_駅名|_]|R],R1)), _駅名縦ならび), 駅番号の登録(_駅名縦ならび), findall(_料金ならび,( append(LL0,[[_|_料金ならび]|_],R1)), _料金表), のぞみ料金表の作成(_駅名縦ならび,_駅名横ならび,_料金表). 駅番号の登録(_駅名縦ならび) :- append(_駅名縦ならび,[新大阪],_駅名縦ならびのニ), append(L0,[_駅名|R],_駅名縦ならびのニ), length([_|L0],Len), assertz((駅番号(Len,_駅名) :- !)), R = []. のぞみ料金表の作成([],_,_) :- !. のぞみ料金表の作成([_駅名|R1],_駅名横ならび,[L3|R3]) :- 駅単位料金表(_駅名,_駅名横ならび,L3), のぞみ料金表の作成(R1,_駅名横ならび,R3). 起点駅単位料金登録(_,_,[]) :- !. 起点駅単位料金登録(_駅名,[_駅名2|R2],[_料金|R3]) :- assertz(のぞみ料金(_駅名,_駅名2,_料金)), assertz(のぞみ料金(_駅名2,_駅名,_料金)), 起点駅単位料金表(_駅名,R2,R3). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1309527259/120 # [1] 問題文(含コード&リンク):このスレで「◆QZaw55cn4cって」から始まる定形の書き込みの # 間隔を調べ、最短書き込み間隔と最長書き込み間隔を表示しなさい。 # [2] 環境 #  [2.1] 言語: C #  [2.2] OS: LINUX #  [2.3] コンパイラ名とバージョン: # [3] 回答希望期限:2011年7月8日 # # 'ログから書き込みの間隔を調べ、最短書き込み間隔と最長書き込み間隔を表示する' :- get_split_lines('http://codepad.org/nYthq5XX',[' ','/',':','.'],LL), findall([A,B,C,D,E,F],( member(L,LL), append(_,[A,B,C,D,E,F,_],L)), LL2), 日付間隔ならびを得る(LL2,_日付間隔ならび), max(_日付間隔ならび,_最長書き込み間隔), min(_日付間隔ならび,_最短書き込み間隔), 表示する(_最長書き込み間隔,_最短書き込み間隔),!. 日付間隔ならびを得る([_],[]) :- !. 日付間隔ならびを得る([[A1,B1,C1,D1,E1,F1],[A2,B2,C2,D2,E2,F2]|R1],[[_何日,_何時間,_何分,_何秒]|R2]) :- count(翌日(A1,B1,C1,A2,B2,C2,_,_,_),Count), 時分秒の補正(Count,D1,E1,F1,D2,E2,F2,_何日,_何時間,_何分,_何秒), 日付間隔ならびを得る([[A2,B2,C2,D2,E2,F2]|R1],R2). 時分秒の補正(Count,D1,E1,F1,D2,E2,F2,_何日,_何時間,_何分,_何秒) :- 秒に変換(D1,E1,F1,_秒1), 秒に変換(D2,E2,F2,_秒2), 時分秒の補正(_秒1,_秒2,Count,_何日,_何時間,_何分,_何秒). 時分秒の補正(_秒1,_秒2,_何日,_何日,_何時間,_何分,_何秒) :- _秒2 @>= _秒1, _秒数 is (_秒2 - _秒1), 秒数から時間の算出(_秒数,_何時間,_何分,_何秒),!. 時分秒の補正(_秒1,_秒2,Count,_何日,_何時間,_何分,_何秒) :- _秒2 < _秒1, _何日 is Count - 1, _秒数 is 38400 + (_秒2 - _秒1), 秒数から時間の算出(_秒数,_何時間,_何分,_何秒). 秒数から時間の算出(_秒数,_何時間,_何分,_何秒) :- _何時間 is _秒数 // 3600, S2 is S1 mod 3600, _何分 is S2 // 60, _何秒 is S2 mod 60,!. 表示する(_最長書き込み間隔,_最短書き込み間隔) :- writef('最長書き込み間隔は %t日 %t時間 %t分 %秒 です。\n',_最長書き込み間隔), writef('最短書き込み間隔は %t日 %t時間 %t分 %秒 です。\n',_最短書き込み間隔),!. % 翌日/9の定義は http://nojiriko.asia/prolog/c150_293.html 参照 % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1308749241/607 # [1]プログラミング言語 # [2]http:// codepad.org/2gG8qIOk # [3.1]window 7 # [3.2]VC2008 # [3.3]C++ # [4]7/14まで # [5]よろしくお願い致します。 # # # 100 100 0.123 0.345 # 100 110 0.256 -0.123 # 100 120 -0.351 0.112 # ・・・・ # などのようなテキストファイル(01.txt)がある。 # これらを # 100.1 100.3 0.123 0.345 # 100.3 109.9 0.256 -0.123 # 99.6 120.1 -0.351 0.112 # ・・・・ # のように # 3列目を1列目に加え、4列目を2列目に加えるようなプログラムを作成せよ。 # (少数第一位まで四捨五入し、加える事) # なお、MFCでボタンを押したら、02.txtファイルが作成される程度の簡単なもので良い '3列目を1列目に加え、4列目を2列目に加える(少数第一位まで四捨五入し、加える事)' :- get_split_lines('01.txt',[' '],LL), findall([_11,_22,_3,_4],( append(_,[[_1,_2,_3,_4]|R],LL), _11 is floor((_1 + _3) * 10) / 10, _22 is floor((_2 + _4) * 10) / 10), LL2), 出力する('02.txt',LL2). 出力する(_ファイル名,LL) :- open(_ファイル名,write,Outstream), append(_,[[_1,_2,_3,_4]|R],LL), writef(Outstream,'%t %t %t %t\n',[_1,_2,_3,_4]), R = [], close(Outstream). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1311089619/512 # [1] 授業単元:ポインタ&配列 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/cr9HeX77 http://ime.nu/codepad.org/KRbWMvrc # [3.1] OS:WindowsXP # [3.2] コンパイラ名とバージョン: Visual Studio 2008 # [3.3] 言語:C # [4] 期限:7/ 27 15:00までです。  # 全く分からなくてほんとに困っています。誰か分かる方宜しくお願いします。 # # テキストがhttp://ime.nu/codepad.org/cr9HeX77で # 問題がhttp://ime.nu/codepad.org/KRbWMvrcです。 # # # テキストをファイルから読み込んで、その行を辞書式順序に並べ替えて # 出力するプログラムを書け. # プログラムは、下記のプログラムを書き直して提示せよ。 # # ヒント:文字列の例題を参考にして,まずテキストを配列に読み込む. # 文字列の配列を渡すとそれをソートする関数を書いて,それを用いればよい. # ファイルから読むためには、入力のリダイレクト(切り替え)を用いる. # そのためには、コマンドプロンプトで # prog< file.txt のように、コマンド名のあとに“<” # とそれに続けてファイル名を与える.英単語のファイルでテストするとよい 'テキストをファイルから読み込んで、その行を辞書式順序に並べ替えて出力する' :- get_split_lines('file.txt',['\n',' ',','],_語彙ならび), 辞書順クイックソート(_語彙ならび,_辞書順に整列した語彙ならび), 出力する(_辞書順に整列した語彙ならび). 辞書順クイックソート([],[]) :- !. 辞書順クイックソート(_ならび1,_ならび2) :- _ならび1 = [A|R], 辞書順クイックソート(A,R,_ならび2). 辞書順クイックソート(A,R,_ならび2) :- 辞書順分割(A,R,L1,R1), 辞書順クイックソート(L1,L2), 辞書順クイックソート(R1,R2), append(L2,[A|R2],_ならび2). 辞書順分割(A,[],[],[]) :- !. 辞書順分割(A,[B|R1],[B|R2],R3) :- 辞書順コード比較(A,B), 辞書順分割(A,R1,2,R3),!. 辞書順分割(A,[B|R1],R2,[B|R3]) :- \+(辞書順コード比較(A,B)), 辞書順分割(A,R1,R2,R3),!. 辞書コード比較(_文字列1,_文字列2) :- atom_to_codes(_文字列1,Codes1), 辞書順用にコード列を変換する(Codes1,_変換されたCodes1), atom_to_codes(_文字列2,Codes2), 辞書順用にコード列を変換する(Codes2,_変換されたCodes2), _変換されたCoode1 @> _変換されたCodes2,!. 辞書順用にコード列を変換する([],[]) :- !. 辞書順用にコード列を変換する([A|R1],[B|R2]) :- A >= 32, A =< 90, B is (A + 32) * 10, 辞書順用にコード列を変換する(R1,R2),!. 辞書順用にコード列を変換する([A|R1],[B|R2]) :- B is A * 10 + 1, 辞書順用にコード列を変換する(R1,R2),!. 辞書順用にコード列を変換する([A|R1],[B|R2]) :- B is A * 10, 辞書順用にコード列を変換する(R1,R2),!. 出力する(_辞書順に整列した語彙ならび) :- open('file.txt',write,Outstream), append(_,[_語彙|R],_辞書順に整列した語彙ならび), writef(Outstream,'%t\n',[_語彙]), R = [], close(Outstream),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1305217361/675 # CSVモジュールを使用してCSVファイルを読み込み。 # 読み込んだファイル全体を指定フィールドでソートする方法を教えてください。 # csvfile = csv.reader(f) # csvfile.sort() # のような書き方をしたら、_csvredaerにそんなメソッドはない、的なエラーです。 # また、sortのkeyの書き方がよく解かりません。 # リスト(ファイル全体)の中のリスト(行)の中のリストのインデックス指定でソート # すればOKのような気がするのですが、書き方が不明です。よろしくお願いします。 'CSVファイルを読み込み。読み込んだファイル全体を指定フィールドでソートする'(_ファイル名,_フィールド位置) :- get_split_lines(_ファイル名,[','],LL), 指定フィールドでソートする(LL,_整列済みならび), ソートキーを剥がしながら出力する(_整列済みならび). 指定フィールドでソートする(LL,_ソートキーが先頭に付加された整列済みならび) :- ソートキーを先頭に付加(LL,LL2), sort(LL2,_ソートキーが先頭に付加された整列済みならび). ソートキーを先頭に付加(_キー位置,[],[]) :- !. ソートキーを先頭に付加(_キー位置,[L1|R1],[[K|L1]|R2]) :- nth1(_キー位置,L1,K), ソートキーを先頭に付加(_キー位置,R1,R2). ソートキーを剥がしながら出力する(_整列済みならび) :- ソートキーを剥がしながら(_整列済みならび,L,R), カンマ区切り文字列に変形(L,_カンマ区切り文字列), writef('%t\n',[_カンマ区切り文字列]), R = []. ソートキーを剥がしながら(_整列済みならび,L,R) :- append(_,[[_付加されたソートキー|L]|R],_整列済みならび). カンマ区切り文字列に変形(L,S) :- concat_atom(L,',',S). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/615 # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # 3 x 3 の行列の値が書かれたファイルを二つ用意する. この 2 つの行列の積を新しいファイルに書き出すプログラムを作成せよ. # (例えば, 行列 A を MatrixA.txt, 行列 B を MatrixB.txt と用意すると, プログラム実行後には行列 A と行列 B の積の値が ファイル MatrixC.txt に書き込まれているようにする.) # '3 x 3 の行列の値が書かれたファイルを二つ用意する. この 2 つの行列の積を新しいファイルに書き出す'(_入力ファイル1,_入力ファイル2,_出力ファイル) :- get_split_lines(_入力ファイル1,[',',' '],LL1), get_split_lines(_出力ファイル2,[',',' '],LL2), 行列の積(LL1,LL2,LL3), 新しいファイルに書きだす(_出力ファイル,LL3). 新しいファイルに書きだす(_出力ファイル,LL3) :- open(_出力ファイル,write,Outstream), append(_,[L|R],LL3), writef(Outstream,'%t,%t,%t\n',L), R = [], close(Outstream). 行列の積(L1,L2,X) :- 置換(L2,L4), 行列の積の一(L1,L4,X) . 行列の積の一([],_,[]) :- !. 行列の積の一([A|R1],L,[S1|R3]) :- 行列の積のニ(A,L,S1), 行列の積の一(R1,L,R3). 行列の積のニ(_,[],[]) :- !. 行列の積のニ(A,[B|R2],[C|R3]) :- 行列の積の三(A,B,C), 行列の積のニ(A,R2,R3). 行列の積の三([],[],0) :- !. 行列の積の三([A|R1],[B|R2],S) :- S1 is A * B, 行列の積の三(R1,R2,S2), S is S1 + S2. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/736 # # ファイル1(テキスト)に # AAA,BBB,CC,DDd,FF # OOO,TTT,FF,AAA,VV # DDD,EEE,GG,SSS,AA # が入っていて、真ん中のCC、FF、GGの部分だけを配列に入れ、 # もうひとつのファイルに配列に入れた部分を # 保存したいのですが、どうしたらいいですか。 # 'ファイル1(テキスト)に AAA,BBB,CC,DDd,FF\\nOOO,TTT,FF,AAA,VV\\nDDD,EEE,GG,SSS,AA\\nが入っていて、真ん中のCC、FF、GGの部分だけを配列に入れ、もうひとつのファイルに配列に入れた部分を保存したい' :- get_split_lines(_ファイル1,[','],LL), '中間要素だけをならびとして'(LL,_中間要素ならび), 'もうひとつのファイルにならびを保存する'(_もうひとつのファイル,_中間要素ならび). '中間要素だけをならびとして'(LL,_中間要素ならび) :- findall(E,( append(_,[L|_],LL), append(L0,[E|R],L), length(L0,Len), length(R,Len)), _中間要素ならび),!. 'もうひとつのファイルにならびを保存する'(_もうひとつのファイル,L) :- open(_もうひとつのファイル,write,Outstream), write(Outstream,L), write(Outstream,'.\n'), close(Outstream). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1322562648/280 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/www1.axfc.net/uploader/Sc/so/298224 # # 以下に与えるファイルdata.datを作業ディレクトリ内に作成し、data.datからデータを読み込み、 # BMIを計算しBMI値を判定し、全員のデータを標準出力に出力し、更に男性のデータをdata2.txtという # 名前のファイルに出力するプログラムを作成せよ。BMI判定は18.5未満なら1、18.5以上25未満なら2、 # 25以上30未満なら3、30以上なら4とする。BMIの計算では関数calc_bmiを各自作成して計算を行うこと。 # 尚、data.dat内のデータは左から名前、性別(M=男性、F=女性)、身長[cm]、体重[kg]を表す # ※data2.datへの出力の際は性別の記入は必要ない # # # data.dat # Andrew M 38 180.5 105.2 # Helen F 23 171.9 65.1 # Jane F 31 172.4 75.4 # John M 19 186.6 78.3 # Susan F 27 168.1 62.7 # Thomas M 43 189.2 65.1 # # # <作成したプログラムの実行結果> # 『標準出力への出力結果』 # 名前 性別 年齢 身長[m] 体重[kg] BMI BMI 判定 # Andrew M 38 1.805000 105.200000 32.289501 4 # Helen F 23 1.719000 65.100000 22.030748 2 # Jane F 31 1.724000 75.400000 25.368619 3 # John M 19 1.866000 78.300000 22.487361 2 # Susan F 27 1.681000 62.700000 22.188713 2 # Thomas M 43 1.892000 65.100000 18.186064 1 # # 『data2.txtへの出力結果』 # Andrew 38 1.805000 105.200000 32.289501 4 # John 19 1.866000 78.300000 22.487361 2 # Thomas 43 1.892000 65.100000 18.186064 1 # 'data.datからデータを読み込み、BMIを計算しBMI値を判定し、全員のデータを標準出力に出力し、更に男性のデータをdata2.txtという名前のファイルに出力する' :- write('名前 性別 年齢 身長[m] 体重[kg] BMI BMI 判定\n'), get_split_lines('data1.txt',[' '],LL), append(_,[[_名前,_性別,_年齢,_身長,_体重]|R],LL), _BMI値 is _体重 / (_身長 * _身長), 'BMI判定'(BMI,_BMI判定), writef('%14r %4r %4r %8r %6r %5r %2r\n',[_名前,_性別,_年齢,_身長,_体重,_BMI値,_BMI判定]), R = []. 'BMI判定'(_BMI値,1) :- _BMI値 < 18.5,!. 'BMI判定'(_BMI値,2) :- _BMI値 >= 18.5, _BMI値 < 25.0,!. 'BMI判定'(_BMI値,3) :- _BMI値 >= 25.0, _BMI値 < 30.0,!. 'BMI判定'(_BMI値,4) :- _BMI値 >= 30.0,!., % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1322562648/441 # [1] 数値解析 # [2] # 123   456   789.012   345.678 # 901   234   567.890   123.456 # 789   12    345.678   901.234 # 567   890   123.456   789.012 # ・・・ # のような適当な値のテキストファイル(q.txt)があり(50×4)、これらのうち3列目と4列目でそれぞれの差を取り、 # 以下のような新しいテキストファイル(a.txt)に出力せよ。 # -221.122   -222.222 # -222.212   777.778 # -222.222   -112.222 # ・・・ # 'テキストファイル(q.txt)があり(50×4)、これらのうち3列目と4列目でそれぞれの差を取り、以下のような新しいテキストファイル(a.txt)に出力せよ。' get_split_lines('q.txt',[' ','\t'],LL), これらのうち3列目と4列目でそれぞれの差を取り(LL,LL1), '新しいテキスト(a.txt)に出力する'(LL1). これらのうち3列目と4列目でそれぞれの差を取り(LL,LL1) :- findall([_差1,_差2],( append(_,[[_,_,A1,B1|_],[_,_,A2,B2|_]|_],LL), _差1 is abs(A2 - A1), _差2 is abs(B2 - B1)), LL1). '新しいテキスト(a.txt)に出力する'(LL1) :- open('a.txt',write,Outstream), append(_,[[A,B]|R],LL1), writef(Outstream,'%8l %8l\n',[A,B]), R = [], close(Outstream). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1322562648/594 # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):0.123,1,12,150...と続く「1.txt」と6,13,25,10...と続く「2.txt」がある。 # 1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし、3.txtに結果を書き込むプログラムを作りなさい。 # '0.123,1,12,150...と続く「1.txt」と6,13,25,10...と続く「2.txt」がある。1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし、3.txtに結果を書き込む' :- '0.123,1,12,150...と続く「1.txt」と'(L1), '6,13,25,10...と続く「2.txt」がある'(L2), '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし、3.txtに結果を書き込む'(L2,L2). '0.123,1,12,150...と続く「1.txt」と'(L1) :- get_split_lines('1.txt',LL1), flat(LL1,L1). '6,13,25,10...と続く「2.txt」がある'(L2) :- get_split_lines('2.txt',LL2), flat(LL2,L2). '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし、3.txtに結果を書き込む'(LL1_2,LL2_2) :- '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'(LL1_2,LL2_2,L3), '3.txtに結果を書き込む'(L3),!. '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'([],[],[]). '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'([V1|R1],[0|R2],[∞|R3]) :- '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'(R1,R2,R3). '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'([V1|R1],[0.0|R2],[∞|R3]) :- '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'(R1,R2,R3). '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'([V1|R1],[V2|R2],[V3|R3]) :- V3 is floor((V1 / V2) * 10) / 10, '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'(R1,R2,R3). '3.txtに結果を書き込む'(L3) :- open('3.txt',write,Outstream), append(_,[Term|R],L3), 書く(Outstream,Term,R), writef(Outstream,'%t,',[Term]), close(Outstream). 書く(Outstream,Term,[]) :- writef(Outstrem,'%t\n',[Term]),!. 書く(Outstream,Term,_) :- writef(Outstream,'%t,',[Term]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1322562648/968 # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # y=2x2乗+3(-10≦x≦10)を刻み幅1で計算し、x、yの組を1行ごとにファイルに書き込むプログラムを作成しなさい。 # # 設問1-2 # 上記設問1-1のプログラムが作成したファイルを読み込んで xとyの値をprintf文で表示するプログラムを作成しなさい。 # 'ファイルを読み込んで xとyの値をprintf文で表示する'(_ファイル) :- get_split_lines(_ファイル,[','],LL), append(_,[[_x,_y]|R],LL), writef('%t,%t\n',[_x,_y]), R = []. 'y=2x2乗+3(-10≦x≦10)を刻み幅1で計算し、x、yの組を1行ごとにファイルに書き込む'(_ファイル) :- 'y=2x2乗+3(-10≦x≦10)を刻み幅1で計算し'(LL), 'x、yの組を1行ごとにファイルに書き込む'(_ファイル,LL). 'y=2x2乗+3(-10≦x≦10)を刻み幅1で計算し'(LL) :- findall([_x,_y],( for(-10,_x,10), _y is 2 * _x * _x + 3), LL). 'x、yの組を1行ごとにファイルに書き込む'(_ファイル,LL) :- open(_ファイル,write,Outstream), 'x、yの組を1行ごとに書きこむ'(Outstream,LL), close(Outstream). 'x、yの組を1行ごとに書きこむ'(Outstream,LL) :- append(_,[[_x,_y]|R],LL), writef(Outstream,'%t,%t\n',[_x,_y]), R = []. % 以下のサイトは 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). ?- 'a##'. http://toro.2ch.net/test/read.cgi/tech/1325685876/155 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/xmcn6oBoをもとに以下の構造体を、 # struct student{ # int num; # char name[10]; # int score; # }; # 構造体のデータ設定は # struct student St[]={{1, "Ichi", 90}, {2, "Ni", 60}, {3, "San", 70},{4, "Yon", 85}, {5, "Go", 80}}; # を用いること。 # また、構造体データの退避用として。同じstudent構造体の変数(ここではtmp)を定義すること # yes. ?- 'a##'. http://toro.2ch.net/test/read.cgi/tech/1309076891/679 # 【 課題 】(1) (0)や、過去の配布プリントやノートを参考にして、httpサーバにアクセスしてhtmlを取って #   来て表示するJavaプログラムを作成せよ。 #   そのプログラムで http://ime.nu/www.infosys.tuis.ac.jp/~ichirou/np/uhoho-?.html にアクセスしてどんな #   内容かを調べよ。(既存WWWブラウザでアクセスしてはならない!) #   Shift-JIS環境の人は uhoho-s.html、JIS環境の人は uhoho-j.html、EUC環境の人は uhoho-e.html # にアクセスすること。Vineを使ってるならEUC #   ヒント: HTTP/1.1 より HTTP/1.0 を使うほうがプログラムしやすいよ〜。 #   仕様:(a) コマンドラインから使用サーバ、ファイル名を入力。全て入力された後に実際に #        サーバと接続して通信させること。 #        あるいはそれらは引数としてプログラムに与えてもよい。 #      (b) HTMLタグを解釈させなくてよい。(つまりHTMLファイルがそのまま表示されて構わない) #      (c) メッセージヘッダのフィールドに書く User-Agent: は好きに命名してよい。 #        例:  User-Agent: HogeBrowser/1.3 (PlayStation) Gakko/20080702 # # こんなかんじ # # (2) 過去の課題01の(1)と同じことを行うJavaプログラムを作成せよ。 #   仕様:(a) コマンドラインから使用メールサーバ、あて先や、自分のメールアドレス、Subject、 #        メール本文を入力。全て入力された後に実際にサーバと接続して通信させること。 #      (b) 表示されるメッセージやインタフェースは各自好きにしてよい。 #      (c) To:やX-Mailer: フィールドをメールヘッダにつけること。 #        X-mailer: には各自好きなメールソフト名をつけてよい。 #        例:    X-mailer: HogegeMailer ver.1.01 powered by Java #      (d) 今回の課題ではサーバからのエラーメッセージが出た場合の処理まで考慮しなくて #        もよい。 #      (e) 日本語に対応しなくてもよい。 # # yes. ?- 'a##'. http://toro.2ch.net/test/read.cgi/tech/1325685876/159 # [1] 授業単元:計算機実習 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/nbsATV4X # # 課題: # ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を # 読み込み、A+〜Dの成績評価を行い、下記の項目を計算して表示するプログラムを # 作成せよ。 # # 表示項目: # 1.全履修者の平均点 # 2.評価の分布(A+〜D評価のそれぞれの人数) # # データファイルの説明: # 学籍番号と試験の点数(100点満点)が、スペース区切りで格納されている # # 要求仕様: # ファイルの行数(=履修者数)が変わっても動作するようにすること。 # ただし配列を使う場合は、履修者数の上限値は150名とする # 補足: # 1.試験の点数は、今回の場合は0.5点刻みである。fscanfなどで得点を読み込む # 際は、整数型でなく実数型(double または float)で処理する必要がある # 2.評価は、A+が90点〜100点、Aが80点以上90点未満(今回は89.5点まで)、Bが # 70点以上80点未満、Cが60点以上70点未満、Dが0点〜60点未満とする # 3.0点は未受験を表すが、今回の課題では受験して0点を取ったとみなす。 # つまり、E評価は行わない # 4.配列や構造体は、使っても使わなくてもよい # # 追加課題: # ・最終評価の平均点で、0点の者を除外して計算したものも表示 # score.txtの内容  # 12X1102 20.5 # 12X1115 85 # 12X1117 90.5 # 12X1117 75.5 # 12X1118 79.5 # 12X1120 68.5 # 12X1121 75 # 12X1303 0 # 12X1304 54.5 # 12X1309 95.5 # 12X1310 65.5 # 12X1311 78.5 # 12X1313 0 # 12X1313 40 # 12X1314 83 # 12X1315 0 # 12X1321 0 # 12X1321 81 # 12X1324 77.5 # 12X1324 90.5 # 12X1326 80 # 12X1601 56 # 12X1604 79.5 # 12X1611 68.5 # 12X1703 61 # 12X1808 0 # 12X1808 74.5 # 12X1811 68.5 # 12X1813 87 # 12X1814 85.5 # 12X1815 74.5 # 12X1816 92.5 # 12X1901 82 # 12X1903 88.5 # 12X1906 91 # 12X1911 84.5 # 12X1912 93.5 # 12X1913 86.5 # 12X1916 73.5 # 12X3117 82 # 12X3118 65.5 # 12X3123 0 # 12X3141 77 # 12X3151 74.5 # 12X3152 80.5 # 12X3159 0 # 12X3164 0 # 12X3167 70 # 12X3305 80 # 12X3315 68 # 12X3326 0 # 12X3326 78 # 12X3328 83 # 12X3329 71.5 # 12X3333 0 # 12X3334 85 # 12X3336 78 # 12X3338 88 # 12X3339 79.5 # 12X3342 88.5 # 12X3345 73.5 # 12X3346 84.5 # 12X3347 81.5 # 12X3353 90.5 # 12X3359 83 # 12X3362 70.5 # 12X3365 82.5 # 12X3368 78 # 12X3372 72.5 # 12X3379 84.5 # 12X3383 88.5 # 12X3384 68 # 12X3387 86.5 # 12X3390 78 # 12X3399 78 # 12X3400 74.5 # 12X3403 87 # 12X3404 79 # 12X3407 64.5 # 12X3604 67.5 # 12X3608 85.5 # 12X3619 75 # 12X3621 61.5 # 12X3628 89 # 12X3703 89 # 12X3707 61 # 12X3708 88 # 12X3731 95 # 12X3733 78 # 12X3739 87 # 12X3807 0 # 12X3809 63.5 # 12X3813 81.5 # 12X3814 0 # 12X3832 89 # 12X3838 82 # 12X3909 85 # 12X3918 87.5 # 12X3920 60 # 12X3922 73.5 # 12X3923 62.5 # 'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み、A+〜Dの成績評価を行い、1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して表示する' :- 'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み'(LL1), 'A+〜Dの成績評価を行い'(LL1,LL2), '1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して'(LL2,_全履修者の平均,_評価の分布), 表示する(_全履修者の平均,_評価の分布). 'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み'(LL1) :- get_split_lines('score.txt',[' '],LL1). 'A+〜Dの成績評価を行い'([],[]). 'A+〜Dの成績評価を行い'([[_学籍番号,_履修者の点数]|R1],[[_学籍番号,_履修者の点数,_評価]|R2]) :- 評価表(_履修者の点数,_評価), 'A+〜Dの成績評価を行い'(R1,R2). 評価表(_履修者の点数,'A+') :- _履修者の点数 >= 90.0. 評価表(_履修者の点数,'A+') :- _履修者の点数 >= 80.0, _履修者の点数 < 90.0. 評価表(_履修者の点数,'A') :- _履修者の点数 >= 80.0, _履修者の点数 < 90.0. 評価表(_履修者の点数,'B') :- _履修者の点数 >= 70.0, _履修者の点数 < 80.0. 評価表(_履修者の点数,'C') :- _履修者の点数 >= 60.0, _履修者の点数 < 70.0. 評価表(_履修者の点数,'D') :- _履修者の点数 < 60.0. '1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して'(LL2,_全履修者の平均,_評価の分布) :- 全履修者の平均点(LL2,_全履修者の平均), 評価の分布(LL2,_評価の分布), 全履修者の平均点(LL2,_全履修者の平均) :- findavg(_履修者の試験の点数,( append(_,[[_,_履修者の試験の点数,_]|_],LL2)), _全履修者の平均). 評価の分布(LL2,_評価の分布) :- 評価の分布(LL2,[[],[],[],[],[]],_評価の分布). 評価の分布([],[L1,L2,L3,L4,L5],_評価の分布) :- ならびの要素数を整数に変換([L1,L2,L3,L4,L5],_評価の分布),!. 評価の分布([[_,_,_評価]|R1],[L1,L2,L3,L4,L5],_評価の分布) :- 分布に加算(_評価,L1,L2,L3,L4,L5,L1_2,L2_2,L3_2,L4_2,L5_2), 評価の分布(R1,[L1_2,L2_2,L3_2,L4_2,L5_2],_評価の分布). ならびの要素数を整数に変換([],[]). ならびの要素数を整数に変換([L|R1],[Len|R2]) :- length(L,Len), ならびの要素数を整数に変換(R1,R2). 分布に加算('A+',L1,L2,L3,L4,L5,[_|L1],L2,L3,L4,L5). 分布に加算('A',L1,L2,L3,L4,L5,L1,[_|L2],L3,L4,L5). 分布に加算('B',L1,L2,L3,L4,L5,L1,L2,[_|L3],L4,L5). 分布に加算('C',L1,L2,L3,L4,L5,L1,L2,L3,[_|L4],L5). 分布に加算('D',L1,L2,L3,L4,L5,L1,L2,L3,L4,[_|L5]). 表示する(_全履修者の平均,_評価の分布) :- writef('全履修者の平均は %t です\n評価の分布\n',[_全履修者の平均]), 評価と分布数(_評価の分布,_評価,_評価の分布数,R), writef('%4r, %4r\n',[_評価,_評価の分布数]), R = []. 評価と分布数(_評価の分布,_評価,_評価の分布数,R) :- append(L0,[_評価|R],['A+','A','B','C','D']), length(L0,Len), length(L0_1,Len), append(L0_1,[_評価の分布数|_],_評価の分布). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1325685876/159 # [1] 授業単元:計算機実習 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/nbsATV4X # # 課題: # ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を # 読み込み、A+〜Dの成績評価を行い、下記の項目を計算して表示するプログラムを # 作成せよ。 # # 表示項目: # 1.全履修者の平均点 # 2.評価の分布(A+〜D評価のそれぞれの人数) # # データファイルの説明: # 学籍番号と試験の点数(100点満点)が、スペース区切りで格納されている # # 要求仕様: # ファイルの行数(=履修者数)が変わっても動作するようにすること。 # ただし配列を使う場合は、履修者数の上限値は150名とする # 補足: # 1.試験の点数は、今回の場合は0.5点刻みである。fscanfなどで得点を読み込む # 際は、整数型でなく実数型(double または float)で処理する必要がある # 2.評価は、A+が90点〜100点、Aが80点以上90点未満(今回は89.5点まで)、Bが # 70点以上80点未満、Cが60点以上70点未満、Dが0点〜60点未満とする # 3.0点は未受験を表すが、今回の課題では受験して0点を取ったとみなす。 # つまり、E評価は行わない # 4.配列や構造体は、使っても使わなくてもよい # # 追加課題: # ・最終評価の平均点で、0点の者を除外して計算したものも表示 # score.txtの内容  # 12X1102 20.5 # 12X1115 85 # 12X1117 90.5 # 12X1117 75.5 # 12X1118 79.5 # 12X1120 68.5 # 12X1121 75 # 12X1303 0 # 12X1304 54.5 # 12X1309 95.5 # 12X1310 65.5 # 12X1311 78.5 # 12X1313 0 # 12X1313 40 # 12X1314 83 # 12X1315 0 # 12X1321 0 # 12X1321 81 # 12X1324 77.5 # 12X1324 90.5 # 12X1326 80 # 12X1601 56 # 12X1604 79.5 # 12X1611 68.5 # 12X1703 61 # 12X1808 0 # 12X1808 74.5 # 12X1811 68.5 # 12X1813 87 # 12X1814 85.5 # 12X1815 74.5 # 12X1816 92.5 # 12X1901 82 # 12X1903 88.5 # 12X1906 91 # 12X1911 84.5 # 12X1912 93.5 # 12X1913 86.5 # 12X1916 73.5 # 12X3117 82 # 12X3118 65.5 # 12X3123 0 # 12X3141 77 # 12X3151 74.5 # 12X3152 80.5 # 12X3159 0 # 12X3164 0 # 12X3167 70 # 12X3305 80 # 12X3315 68 # 12X3326 0 # 12X3326 78 # 12X3328 83 # 12X3329 71.5 # 12X3333 0 # 12X3334 85 # 12X3336 78 # 12X3338 88 # 12X3339 79.5 # 12X3342 88.5 # 12X3345 73.5 # 12X3346 84.5 # 12X3347 81.5 # 12X3353 90.5 # 12X3359 83 # 12X3362 70.5 # 12X3365 82.5 # 12X3368 78 # 12X3372 72.5 # 12X3379 84.5 # 12X3383 88.5 # 12X3384 68 # 12X3387 86.5 # 12X3390 78 # 12X3399 78 # 12X3400 74.5 # 12X3403 87 # 12X3404 79 # 12X3407 64.5 # 12X3604 67.5 # 12X3608 85.5 # 12X3619 75 # 12X3621 61.5 # 12X3628 89 # 12X3703 89 # 12X3707 61 # 12X3708 88 # 12X3731 95 # 12X3733 78 # 12X3739 87 # 12X3807 0 # 12X3809 63.5 # 12X3813 81.5 # 12X3814 0 # 12X3832 89 # 12X3838 82 # 12X3909 85 # 12X3918 87.5 # 12X3920 60 # 12X3922 73.5 # 12X3923 62.5 # 'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み、A+〜Dの成績評価を行い、1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して表示する' :- 'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み'(LL1), 'A+〜Dの成績評価を行い'(LL1,LL2), '1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して'(LL2,_全履修者の平均,_評価の分布), 表示する(_全履修者の平均,_評価の分布). 'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み'(LL1) :- get_split_lines('score.txt',[' '],LL1). 'A+〜Dの成績評価を行い'([],[]). 'A+〜Dの成績評価を行い'([[_学籍番号,_履修者の点数]|R1],[[_学籍番号,_履修者の点数,_評価]|R2]) :- 評価表(_履修者の点数,_評価), 'A+〜Dの成績評価を行い'(R1,R2). 評価表(_履修者の点数,'A+') :- _履修者の点数 >= 90.0. 評価表(_履修者の点数,'A+') :- _履修者の点数 >= 80.0, _履修者の点数 < 90.0. 評価表(_履修者の点数,'A') :- _履修者の点数 >= 80.0, _履修者の点数 < 90.0. 評価表(_履修者の点数,'B') :- _履修者の点数 >= 70.0, _履修者の点数 < 80.0. 評価表(_履修者の点数,'C') :- _履修者の点数 >= 60.0, _履修者の点数 < 70.0. 評価表(_履修者の点数,'D') :- _履修者の点数 < 60.0. '1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して'(LL2,_全履修者の平均,_評価の分布) :- 全履修者の平均点(LL2,_全履修者の平均), 評価の分布(LL2,_評価の分布), 全履修者の平均点(LL2,_全履修者の平均) :- findavg(_履修者の試験の点数,( append(_,[[_,_履修者の試験の点数,_]|_],LL2)), _全履修者の平均). 評価の分布(LL2,[_Ap,_A,_B,_C,_D]) :- 評価の分布(LL2,[[],[],[],[],[]],_Ap,_A,_B,_C,_D). 評価の分布([],[L1,L2,L3,L4,L5],_評価の分布) :- ならびの要素数を整数に変換([L1,L2,L3,L4,L5],_評価の分布),!. 評価の分布([[_,_,_評価]|R1],[L1,L2,L3,L4,L5],_評価の分布) :- 分布に加算(_評価,L1,L2,L3,L4,L5,L1_2,L2_2,L3_2,L4_2,L5_2), 評価の分布(R1,[L1_2,L2_2,L3_2,L4_2,L5_2],_評価の分布). ならびの要素数を整数に変換([],[]). ならびの要素数を整数に変換([L|R1],[Len|R2]) :- length(L,Len), ならびの要素数を整数に変換(R1,R2). 分布に加算('A+',L1,L2,L3,L4,L5,[_|L1],L2,L3,L4,L5). 分布に加算('A',L1,L2,L3,L4,L5,L1,[_|L2],L3,L4,L5). 分布に加算('B',L1,L2,L3,L4,L5,L1,L2,[_|L3],L4,L5). 分布に加算('C',L1,L2,L3,L4,L5,L1,L2,L3,[_|L4],L5). 分布に加算('D',L1,L2,L3,L4,L5,L1,L2,L3,L4,[_|L5]). 表示する(_全履修者の平均,_評価の分布) :- writef('全履修者の平均は %t です\n評価の分布\n',[_全履修者の平均]), 評価と分布数(_評価の分布,_評価,_評価の分布数,R), writef('%4r, %4r\n',[_評価,_評価の分布数]), R = []. 評価と分布数(_評価の分布,_評価,_評価の分布数,R) :- append(L0,[_評価|R],['A+','A','B','C','D']), length(L0,Len), length(L0_1,Len), append(L0_1,[_評価の分布数|_],_評価の分布). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1325685876/204 # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # ttp://www.dotup.org/uploda/www.dotup.org2509145.txt.html # # # 設問1 # 構造体を使って、各自の所有している本のうち5点を textbook[5] で宣言せよ。 # メンバーは少なくとも次のものを含んでいるとする。それぞれのメンバーの型は各自で決めること。 # # ・著者 ・書名 ・出版社 ・発行年 ・定価 # # 設問1-1 # 次の(?)、(?)の機能をもった1つのプログラムを作成せよ。 # (?)5冊の本のメンバーをすべて書き出す機能 # (?)5冊の本の定価の合計を求める機能 # # 但し、あらかじめプログラム「メモ帳」等で作成したファイル「info.txt」から、 # 著者、書名、出版社、発行年、定価を読み込むものとする。 # ファイル「info.txt」には下記のように著者、書名、出版社、発行年、定価が # 記述されているものとする。 # # ファイル「info.txt」の記述例: # 森泰親 制御工学(大学講義シリーズ) コロナ社 2001 2800 # 木村英紀 制御工学の考え方(ブルーバックス) 講談社 2002 880 # … # # ファイルinfo.txt # ttp://www.dotup.org/uploda/www.dotup.org2509138.txt.html # '各自の所有している本のうち5点をで宣言する' :- get_split_lines('info.txt',[' '],LL), append(_,[[_著者,_書名,_出版社,_発行年,_定価]|R],LL), assertz(本(_著者,_書名,_出版社,_発行年,_定価)), R = []. '5冊の本のメンバーをすべて書き出す' :- 本(_著者,_書名,_出版社,_発行年,_定価), writef('%t %t %t %t %t\n',[_著者,_書名,_出版社,_発行年,_定価]), fail. '5冊の本のメンバーをすべて書き出す'. '5冊の本の定価の合計を求める' :- findsum(_定価,( 本(_著者,_書名,_出版社,_発行年,_定価)), _定価の合計), writef('定価の合計は %t です\n',[_定価の合計]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1309076891/727 # 【 課題 】 名前、生年月日、電話番号、メールアドレスと入った一文が複数あるファイルがある。 # このファイルを読み込み生年月日順にソートして表示せよ。 # ただし生年月日は和暦に変換して表示する。 # 【 形態 】1. Javaアプリケーション(main()で開始 # 【 GUI  】4. 制限なし # 【 期限 】1月23日 《必須》 # 【 Ver  】java version "1.6.0_21" # 【 用語 】数学用語、専門用語の意味、説明を書きます。 《あれば必須》 # 【 補足 】ファイルは各自で用意します。 # 例 田中一郎、1887/05/08、123-456-789、tanaka_ichiro@aa.jp # よろしくお願いします。 # # ' 名前、生年月日、電話番号、メールアドレスと入った一文が複数あるファイルがある。このファイルを読み込み生年月日順にソートして表示せよ。ただし生年月日は和暦に変換して表示する。'(_ファイル) :- get_split_lines(_ファイル,['、'],LL), 整列鍵を先頭に付加する(LL,LL1), 整列(LL1,LL2), 西暦和暦変換をしながら表示する(LL2). 整列鍵を先頭に付加する(LL,LL1) :- findall([_生年月日,_名前,_生年月日,_電話番号,_メールアドレス],LL), member([_名前,_生年月日,_電話番号,_メールアドレス],LL)), LL1). 西暦和暦変換をしながら表示する(LL) :- append(_,[[_,_生年月日,_名前,_生年月日,_電話番号,_メールアドレス]|R],LL), 西暦を和暦に変換する(_生年月日,_和暦表示生年月日), concat_atom([_生年月日,_名前,_生年月日,_電話番号,_メールアドレス],'、',_表示行), writef('%t\n',[_表示行]), R = []. 西暦を和暦に変換する(_生年月日,_和暦表示生年月日) :- split(_生年月日,[/],[_年,_月,_日]), 西暦年を和暦年に変換する(_年,_和暦年表示), concat_atom([_和暦年表示,_月,月,_日,_日],_和暦表示生年月日). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1867, _年 < 1912, _和暦年 is 1867 + _年, concat_atom([明治,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1911, _年 < 1926, _和暦年 is 1911 + _年, concat_atom([大正,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1925, _年 < 1989, _和暦年 is 1926 + _年, concat_atom([昭和,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1988, _和暦年 is 1988 + _年, concat_atom([平成,_和暦年,年],_和暦年表示). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1309076891/729 # 【 課題 】<プログラムの仕様> # ・N人の、M科目の成績が書かれたCSVファイルを読み込む # ・平均点、最高点、最低点、度数分布を各科目毎に出力する # ・各科目、総合点のランキングリストを出力する # ・成績の処理結果をテキストファイルに出力する # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】4. 制限なし # 【 期限 】1/26(木) 20:00 # 【 Ver  】java version "1.7.0" # 【 補足 】http://ime.nu/www1.axfc.net/uploader/Sc/so/311237.zip #       上記のリンクが、課題のCSVファイルと、 #       参考資料としてあげられていたCSVファイルの読み込み・書き込みを行うプログラムです。 #       CSVファイルは編集してはならないとのことです。 #       CSVファイルは、左から順番に、 #       「国語」「数学」「英語」「社会」「理科」「美術」「工芸」「書道」「音楽」「体育」の科目で、 #       上から順番に「生徒1」「生徒2」・・・「生徒100」となっております。 #       よろしくお願いいたします。 # '・N人の、M科目の成績が書かれたCSVファイルを読み込む ・平均点、最高点、最低点、度数分布を各科目毎に出力する ・各科目、総合点のランキングリストを出力する ・成績の処理結果をテキストファイルに出力する'(_CSVファイル,_書き込みテキストファイル) :- get_split_lines(_CSVファイル,[','],LL), 転置(LL,_転置LL), '平均点、最高点、最低点、度数分布を各科目毎に集約する'([国語,数学,英語,社会,理科,美術,工芸,書道,音楽,体育],_転置LL,_集約リスト), 総合点のランキングリスト(LL,_総合点のランキングリスト), 出力する(_書き込みテキストファイル,_集約リスト,_総合点のランキングリスト). '平均点、最高点、最低点、度数分布を各科目毎に集約する'([],[],[]). '平均点、最高点、最低点、度数分布を各科目毎に集約する'([_科目|R1],[_列|R2],[[_科目,_平均点,_最高点,_最低点,_度数分布,_ランキングリスト]|R3]) :- 最高点(_列,_最高点), 最低点(_列,_最低点), 平均点(_列,_平均点), 度数分布(_列,_度数分布), 科目毎のランキングリスト(_列,_ランキングリスト), '平均点、最高点、最低点、度数分布を各科目毎に集約する'(R1,R2,R3). 総合点のランキングリスト(LL,_ランキングリスト) :- 総合点集約(1,LL,LL1), sort(LL1,LL2), reverse(LL3,_ランキングリスト). 総合点集約(_,[],[]). 総合点集約(N,[_行|R1],[[_合計点,N]|R2]) :- sum(_行,_合計点), N2 is N + 1, 集合点集約(N2,R1,R2). 度数分布(_列,_度数分布) :- findall(_度数,( member([_点数下限,_点数上限],[[0,19],[20,39],[40,59],[60,79],[80,100]]), count(( member(_点数,_列), _点数 >= _点数下限, _点数 =< _点数上限), _度数分布). 科目毎のランキングリスト(_列,_ランキングリスト), 整列用ランキングリスト(1,_列,_整列用ランキングリスト), sort(_整列用ランキングリスト,_整列済みランキングリスト), reverse(_整列済みランキングリスト,_ランキングリスト). 整列用ランキングリスト(_,[],[]). 整列用ランキングリスト(N,[_得点|R1],[[_得点,N]|R2]) :- N2 is N + 1, 整列用ランキングリスト(N2,R1,R2). 出力する(_書き込みテキストファイル,_集約リスト,_総合点のランキングリスト) :- open(_書き込みテキストファイル,write,Outstream), 科目別項目の書き込み(Outstream,_集約リスト), 総合点のランキングの書き込み(Outstream,_総合点ランキングリスト), close(Outstream). 科目別項目の書き込み(Outstream,_集約リスト) :- append(_,[[_科目,_平均点,_最高点,_最低点,_度数分布,_ランキングリスト]|R],_集約リスト), writef(Outstream,'科目 %t\n',[_科目]), writef(Outstream,'平均点 %4r\n最高点 %4r\n最低点 %4r\n',[_平均点,_最高点,_最低点]), writef(Outstream,'0~19点 %4r\n20~39点 %4r\n40~59点 %4r\n60~79点 %4r\n80~100点 %4r\n',_度数分布), write('%tランキングリスト\n',[_科目]), ランキングリストの書き込み(Outstream,_ランキングリスト), R = []. ランキングリストの書き込み(Outstream,_ランキングリスト) :- ランキングリストの書き込み(Outstream,1,1,_ランキングリスト). ランキングリストの書き込み(Outstream,_,_,[]) :- !. ランキングリストの書き込み(Outstream,_順位,_順位_1,[[_得点,_生徒番号_1],[_得点,_生徒番号_2]|R]) :- writef(Outstream,'%4r 生徒%2l %4r\n',[_順位,_生徒番号_1,_得点]), _順位_2 is _順位_1 + 1, ランキングリストの書き込み(Outstream,_順位,_順位_2,[[_得点,_生徒番号_2]|R]). ランキングリストの書き込み(Outstream,_順位,_順位_1,[[_得点,_生徒番号]|R]) :- write(Outstream,N1,N2,'科目毎ランキング\n'), writef(Outstream,'%4r 生徒%2l %4r\n',[_順位,_生徒番号,_得点]), _順位_2 is _順位_1 + 1, ランキングリストの書き込み(Outstream,_順位_2,_順位_2,R). 総合点のランキングの書き込み(Outstream,_総合点ランキングリスト) :- write('総合点ランキング\n'), ランキングリストの書き込み(Outstream,_総合点ランキングリスト). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1309076891/732 # 【 課題 】超初心者なので理解できない点がありましたらすみません。 # 以下のイベント処理を行うアプレット作成をしたいと思っています。 # (インターフェースは無題.jpgを参照) # # 1、アプレットを起動すると「単語<tab>数字列」の組み合わせが # 格納されているテキストindex.txtを読み込み # 数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する) # をコンポーネントのボタンのラベルに格納していき表示させる。 # (どのボタンのラベルに単語を格納するかは自由) #                                                                                             # 2、ボタンを押すとラベル(単語)に # 対応した数列をindex.txtから検索して見つけ # その数列をテキストファイルに出力する。  #                                                                                                             # 【 形態 】Applet # 【 GUI  】AWTのみ # 【 期限 】1月22日 # 【 Ver  】java version "1.7.0_02" # 【 補足 】なし # 無題.jpg(現在のアプレット) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542721.jpg.html # index.txt(「単語<tab>数字列」の組み合わせが入っているテキストファイル) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542722.txt.html # NounFreq.java(現在のアプレットを表示させているソースコード) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542718.java.html # よろしくお願いします。 # # # # '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する)を表示する' :- '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み'(LL), '数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する)を'(_単語ならび), 表示する(_単語ならび). '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み'(LL) :- get_split_lines('index.txt',[','],LL). '最長〜9位までの単語(二字熟語〜四字熟語に限定する)を'(LL,_単語ならび) :- 要素数で逆順に整列して(LL,LL4), '最長〜9位までの'(LL4,_単語ならび), 単語を表示する(_単語ならび). 要素数で逆順に整列して(LL,LL4) :- findall([_要素数,_単語],( member([_単語|R],LL), length(R,_要素数)), LL2), sort(LL2,LL3), reverse(LL3,LL4). '最長〜9位までの'(LL4,_単語ならび) :- length(L0,9), append(L0,_,LL4). '単語を表示する'(_単語ならび) :- append(_,[[_,_単語]|R],_単語ならび), writef('%t\n',[_単語]), R = []. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1325685876/581 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):ttp://www1.axfc.net/uploader/Sc/so/312148 # # データ例のように名前,性別, 5教科(国語,算数,理科,社会,英語)の試験の # 得点を格納したファイルがある.このデータを用いて実行例のような操作を行うことが # できるプログラムを作成せよ.ただし、構造体を用いてプログラム作成を行うこと # ※データは読み込み毎に上書きされる仕様でかまわない(保存する必要は無い) # # 【データ例】 # データファイル名は classA.txt # Andrew M 92 63 85 71 81 # Helen F 81 89 83 79 51 # Jane F 65 75 59 81 69 # John M 85 98 95 81 91 # Susan F 60 50 53 69 43 # Thomas M 72 62 79 66 72 # # # データファイル名は classB.txt # Ichiro M 82 65 75 81 41 # Jiro M 61 72 51 41 69 # Sabu M 55 68 85 81 81 # Hanako F 90 80 93 89 93 # # # 【実行例】 # ./a.out? # ----------------------- Menu -------------------------- # 1.データ読込 # 2.一覧表示 # 0.終了 # --------------------------------------------------------------- # コマンド >> 1 # [データ読込] # ファイル名を入力してください >> classA.txt # ファイル classA.txtからデータを読み込みました. # ----------------------- Menu -------------------------- # 1.データ読込 # 2.一覧表示 # 0.終了 # --------------------------------------------------------------- # コマンド >> 2 # [一覧表示 ] # 名前 性別 国語 数学 理科 社会 英語 平均点 # Andrew M 92 63 85 71 81 78.4 # Helen F 81 89 83 79 51 76.6 # Jane F 65 75 59 81 69 69.8 # John M 85 98 95 81 91 90.0 # Susan F 60 50 53 69 43 55.0 # Thomas M 72 62 79 66 72 70.2 # # ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ Menu ‐‐‐‐‐‐‐‐‐‐‐‐‐‐ # 1.データ読込 # 2.一覧表示 # 0.終了 # ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ # コマンド >> 0 # プログラムを終了します 操作の選択 :- repeat, メニュー表示, 操作の選択(_コマンド). メニュー表示 :- write('----------------------- Menu --------------------------\n1.データ読込\n2.一覧表示\n0.終了\n----------------------------------------------\n'), 操作の選択(0). 操作の選択(1) :- データの読み込み, fail. 操作の選択(2) :- 一覧表示, fail. コマンドの入力(_コマンド) :- write('コマンド >> '), get_line(_コマンド). 'データ読込' :- write('ファイル名を入力してください : '), get_line(_ファイル名), split(_ファイル名,['Class','.txt'],[_クラス名]), 既存データの削除(_クラス名), 'データ読込'(_ファイル名,_クラス名). 'データ読込'(_ファイル名,_クラス名) :- get_split_lines(_ファイル名,[' '],LL1), append(_,[L|R],LL1), P =.. [試験の得点,_クラス名|L], assertz(P), R = []. 既存データの削除(_クラス名) :- P =.. [試験の得点,_クラス名,_,_,_,_,_,_,_,_], retract(P), fail. 既存データの削除(_). 一覧表示 :- write('名前 性別 国語 数学 理科 社会 英語 平均点\n'), 試験の得点(_クラス,_名前,_性別,_国語,_数学,_理科,_社会,_英語,_平均点), writef('%10l %t %4r %4r %4r %4r %4r',[_名前,_性別,_国語,_数学,_理科,_社会,_英語]), format(' ~1f\n',[_平均点]), fail. 一覧表示. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1325685876/650 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 出席番号、算数、国語、社会の点数(適当で)からできている成績データを # 読み込み、各生徒の3科目の平均点と最高点を算出して、それを各生徒の # データとして加え、3科目の平均点の順番にソートするプログラムを # 選択ソートでかきなさい。 # '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み、各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え、3科目の平均点の順番にソートする'(_成績データファイル,_3科目の平均点の順ならび) :- '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み'(LL), '各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え'(LL,LL2), '3科目の平均点の順番にソートする'(LL2,_3科目の平均点の順ならび). '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み'(LL) :- get_split_lines(_成績データファイル,[','],LL). '各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え'(LL,LL2) :- findall(L2,( member([_出席番号|L],LL), 平均(L,_平均点), 最大値(L,_最高点), append([_出席番号|L],[_平均点,_最高点],L2)), LL2). '3科目の平均点の順番にソートする'(LL2,_3科目の平均点の順ならび) :- '3科目の平均点を鍵として行頭に付加する'(LL2,LL3), 逆順整列(LL3,LL4), '付加した整列鍵を削除する'(LL4,_3科目の平均点の順ならび). '3科目の平均点を鍵として行頭に付加する'(LL2,LL3) :- findall([_平均点|L],( member(L,LL2), append(_,[_平均点,_],L)), LL3). '付加した整列鍵を削除する'(LL4,_3科目の平均点の順ならび) :- findall(L,( member([_|L],LL4)), _3科目の平均点の順ならび). 逆順整列(L1,L2) :- sort(L1,L3), reverse(L3,L2). 平均(L,_平均) :- length(L,Len), sum(L,_合計), _平均 is _合計 / Len. 最大値([A|R],_最大値) :- append(_,[B|R2],R), B @> A, 最大値([B|R2],_最大値),!. 最大値([_最大値|_],_最大値). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1328276597/146 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/gcasKWhG # ハッシュ表を用いて単語とその出現回数を登録し、 # さらに単語の出現回数順にソートするソート関数を作成せよ。 # [3.1] OS:Mac # [3.2] コンパイラ名とバージョン:gcc # [3.3] 言語:C # [4] 期限:2月11日まで # # 基本的な骨格は出来ましたが、ソートの関数が作れませんでした。 # よろしくお願いします。 # # Macのターミナルを利用してテキストファイルを読み込み、単語(基本的に英単語)を登録します。 # # :- dynamic(ハッシュ表/2). 'ハッシュ表を用いて単語とその出現回数を登録し、さらに単語の出現回数順にソートする'(_テキストファイル) :- abolish(ハッシュ表/2), get_split_lines(_テキストファイル,[' ','\n',',','.',':',';'],LL), 平坦化(LL,_語彙ならび), 'ハッシュ表を用いて単語とその出現回数を登録し'(_語彙ならび), 'さらに単語の出現回数順にソートする'(_出現回数順にソートした単語ならび). 'ハッシュ表を用いて単語とその出現回数を登録し'([]). 'ハッシュ表を用いて単語とその出現回数を登録し'([_語彙|R]) :- retract(ハッシュ表(_語彙,_回数)), _更新された回数 is _回数 + 1, asserta(ハッシュ表(_語彙,_更新された回数)), 'ハッシュ表を用いて単語とその出現回数を登録し'(R),!. 'ハッシュ表を用いて単語とその出現回数を登録し'([_語彙|R]) :- asserta(ハッシュ表,_語彙,1), 'ハッシュ表を用いて単語とその出現回数を登録し'(R),!. 'さらに単語の出現回数順にソートする'(_出現回数順にソートした単語ならび) :- findall([_回数,_語彙],( ハッシュ表(_語彙,_回数)), L1), 降順整列(L1,L2), findall(_語彙,( member([_,_語彙],L2)), _出現回数順にソートした単語ならび). 降順整列([],[]). 降順整列([_軸要素|R1],L2) :- 降順分割(_軸要素,R1,_より大きい要素ならび,_等しいかより小さい要素ならび), 降順整列(_より大きい要素ならび,_整列したより大きい要素ならび), 降順整列(_等しいかより小さい要素ならび,_整列した等しいかより小さい要素ならび), append(_整列したより大きい要素ならび,[_軸要素|_整列した等しいかより小さい要素ならび],L2). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R1],[_要素|R2],R3) :- _要素 @> _軸要素, 降順分割(_軸要素,R1,R2,R3). 降順分割(_軸要素,[_要素|R1],R2,[_要素|R3]) :- _要素 @=< _軸要素, 降順分割(_軸要素,R1,R2,R3). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1309076891/855 # 【課題】無題.txtの中の一行に格納されている「浮動小数点型<tab>整数」を使用して「(浮動小数点×整数+.....+最後の行)/(各行の整数値を合計したもの)」を出力するプログラムを作成せよ # 【形態】1. Javaアプリケーション(main()で開始) # 【GUI】4. 制限なし # 【期限】2月9日1時まで # 【Ver】java version "1.6.0_20" # 【 補足 】かなり急な話ですみません。宜しくお願いします。 # 無題.txt # http://ime.nu/www.dotup.org/uploda/www.dotup.org2612395.txt.html # # '無題.txtの中の一行に格納されている「浮動小数点型<tab>整数」を使用して「(浮動小数点×整数+.....+最後の行)/(各行の整数値を合計したもの)」を出力する' :- get_split_lines('無題.txt',['\t',' '],LL), 集計する(LL,0,0,_値), writef('%t / %t = %t\n',[_合計_1,_合計_2,_値]). 集計する([],_合計_1,_合計_2,_値) :- _値 is _合計_1 / _合計_2,!. 集計する([[_浮動小数点数,_整数]|R],_合計_1,_合計_2,_値) :- _合計_1_2 is _合計_1 + _浮動小数点数 * _整数, _合計_2_2 is _合計_2 + _整数, 集計する(R,_合計_1_2,_合計_2_2,_値). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/375 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # ファイル double.txt に複数個の実数が記されている。 # この実数の個数を入力し、それからファイル double.txt に記されている実数を読み込み、 # それらを小さい物から大きい物の順番に並び替えて、ファイル sort.txt に書き出すプログラムを作成しなさい。 # ただしファイル double.txt に記されている実数の個数は50個以下とする # 'ファイル double.txt に複数個の実数が記されている。この実数の個数を入力し、それからファイル double.txt に記されている実数を読み込み、それらを小さい物から大きい物の順番に並び替えて、ファイル sort.txt に書き出す' :- 実数の個数を入力する(_実数の個数), get_split_lines('double.txt',[' ','\n',','],L1), それらを小さい物から大きい物の順番に並び替えて(L1,L2), 'ファイル sort.txt に書き出す'(_実数の個数,L2). 実数の個数を入力する(_実数の個数) :- 整数を得る(実数の個数,_実数の個数). それらを小さい物から大きい物の順番に並び替えて([],[]). それらを小さい物から大きい物の順番に並び替えて([_軸要素|R1],L2) :- 分割(_軸要素,R1,_軸要素より小さい要素ならび,_軸要素と等しいか大きい要素ならび), それらを小さい物から大きい物の順番に並び替えて(_軸要素より小さい要素ならび,_整列した軸要素より小さい要素ならび), それらを小さい物から大きい物の順番に並び替えて(_軸要素と等しいか大きい要素ならび,_整列した軸要素と等しいか大きい要素ならび), append(_整列した軸要素より小さい要素ならび,[_軸要素|_整列した軸要素と等しいか大きい要素ならび],L2). 分割(_,[],[],[]). 分割(_軸要素,[_要素|R1],[_要素|R2],R3) :- _要素 @< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[_要素|R1],R2,[_要素|R3]) :- _要素 @>= _軸要素, 分割(_軸要素,R1,R2,R3). 'ファイル sort.txt に書き出す'(_実数の個数,L) :- length(L0,_実数の個数), append(L0,_,L). open('sort.txt',write,Outstream), 'Outstreamに書き出す'(Outstream,L0), close(Outstream). 'Outstreamに書き出す'(_,[]). 'Outstreamに書き出す'(Outstream,[_要素|R]) :- writef(Outstream,'%t\n',[_要素]), 'Outstreamに書き出す'(Outstream,R). % 整数を得る/2 % get_split_lines/3 % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/399 # [1] 授業単元:C # [2] 問題文(含コード&リンク): # まず学生の人数(100人以下)を入力し、成績結果のファイルseiseki.txtを読み、 # それから国語または数学、英語の点数のどれかに注目した小から大への順番に従ってデータを並べ替えて、 # write.txtに出力するプログラムを作成しなさい。 # 例 # seiseki.txt # No. 国語 数学 英語 # 1  90 80 70 # 2   85 75 65 # 3   80 70 60 # 4   75 65 55 # 5   70 60 50 # # 学生の人数を入力してください。6 # 科目番号を入力してください。 # 1:国語、2:数学、3:英語 # 2 # # write.txt # 5 70 60 50 # 4 75 65 55 # 3 80 70 60 # 2 85 75 65 # 1 90 80 70 # 'まず学生の人数(100人以下)を入力し、成績結果のファイルseiseki.txtを読み、それから国語または数学、英語の点数のどれかに注目した小から大への順番に従ってデータを並べ替えて、write.txtに出力する' :- 'まず学生の人数(100人以下)を入力し'(_学生の人数), '成績結果のファイルseiseki.txtを読み'(_学生の人数,_成績ならび), 'それから国語または数学、英語の点数のどれかに注目'(_注目した科目,_成績ならび,_着目した科目の成績ならび), '小から大への順番に従ってデータを並べ替えて'(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび), 'write.txtに出力する'(_昇順に整列した着目した科目の成績ならび,_成績ならび). 'まず学生の人数(100人以下)を入力し'(_学生の人数) :- 整数を得る(学生の人数,_学生の人数 =< 100,_学生の人数). '成績結果のファイルseiseki.txtを読み'(_学生の人数,_成績ならび) :- get_split_lines('seiseki.txt',[' '],LL), 平坦化(LL,_成績ならび_1), 学生の人数分を切り取る(_学生の人数,_成績ならび_1,_成績ならび). 学生の人数分を切り取る(_学生の人数,_成績ならび_1,_成績ならび) :- length(_成績ならび_1,_要素数), _要素数 >= _学生の人数, length(_成績ならび,_学生の人数), append(_成績ならび,_,_成績ならび_1),!. 学生の人数分を切り取る(_学生の人数,_成績ならび,_成績ならび). 'それから国語または数学、英語の点数のどれかに注目'(_注目した科目,_成績ならび,_注目した科目の成績ならび) :- 注目した科目を選択する(_注目した科目), findall([_注目した科目の成績,_No],( member([_No,_国語,_数学,_英語],_成績ならび), 注目した科目成績を選択する(_注目した科目,[_国語,_数学,_英語],_注目した科目の成績)), _注目した科目の成績ならび). 注目した科目を選択する(_注目した科目) :- write('国語、数学、英語のうち、注目した科目を入力してください : '), get_line(Line), '診断: 注目した科目を選択する'(Line,_注目した科目),!. 注目した科目を選択する(_注目した科目) :- 注目した科目を選択する(_注目した科目). '診断: 注目した科目を選択する'(_注目した科目,_注目した科目) :- member(_注目した科目,[国語,数学,英語]),!. '診断: 注目した科目を選択する'(Line,_注目した科目) :- write('入力された %t は国語、数学、英語のいずれでもありません。再入力をお願いします。\n',[Line]), fail. 注目した科目成績を選択する(国語,[_国語,_数学,_英語],_国語). 注目した科目成績を選択する(数学,[_国語,_数学,_英語],_数学). 注目した科目成績を選択する(英語,[_国語,_数学,_英語],_英語). '小から大への順番に従ってデータを並べ替えて'(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび) :- 整列(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび). 整列([],[]). 整列([_軸要素|_着目した科目の成績ならび],_昇順に整列した着目した科目の成績ならび) :- 分割(_軸要素,_着目した科目の成績ならび,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび), 整列(_軸要素より小さい成績ならび,_整列した軸要素より小さい成績ならび), 整列(_軸要素より大きい成績ならび,_整列した軸要素より大きい成績ならび), append(_整列した軸要素より小さい成績ならび,[_軸要素|_整列した軸要素より大きい成績ならび],_昇順に整列した着目した科目の成績ならび). 分割(_,[],[],[]). 分割(_軸要素,[[_成績,_No]|R1],[[_成績,_No]|_軸要素より小さい成績ならび],_軸要素と等しいか大きい成績ならび) :- _成績 @<_軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 分割(_軸要素,[[_成績,_No]|R1],_軸要素より小さい成績ならび,[[_成績,_No]|_軸要素と等しいか大きい成績ならび]) :- _成績 @>= _軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 'write.txtに出力する'(_昇順に整列した着目した科目の成績ならび,_成績ならび) :- open('write.txt',write,Outstream), 'Outstreamへ出力'(Outstream,_昇順に整列した着目した科目の成績ならび,_成績ならび), close(Outstream). 'Outstreamへ出力'(Outstream,_昇順に整列した着目した科目の成績ならび,_成績ならび) :- append(_,[[_成績,_No]|R],_昇順に整列した着目した科目の成績ならび), member([_No,_国語,_数学,_英語],_成績ならび), writef(Outstream,'%t %t %t %t\n',[_No,_国語,_数学,_英語]), R = []. % 平坦化/2 % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/413 # [1] 授業単元: C言語 # [2] 問題文:http://ime.nu/codepad.org/je2akZ6u # #include # # int main(){ # int num[100]; # int data, i, j; # FILE* FP; # # //データの個数を入力 # printf("データの個数を入力してください。"); # scanf("%d", &data); # # //読み込み # FP = fopen("readFile.txt","r"); # # for(i=0; i&nplt;dat&npgta; i++){ # fscanf(FP,"%d", &num[i]); # } # fclose(FP); # # //書き込み # FP = fopen("writeFile.txt","w"); # for(i=0; i&nplt;data; i++){ # fprintf(FP,"%d ", num[i]); # } # fclose(FP); # return(0); # } # writeFile.txtの表示を # 11 22 33 44 55 # 66 77 88 99 00 # にするにはどうすればいい? # 'データの個数を入力し、readFile.txtを読み、昇順にデータを並べ替えて、writeFile.txtに一行5データずつ出力する' :- 'まずデータの個数を入力し'(_データの個数), 'readFile.txtを読み'(_データの個数,_データならび), '昇順にデータを並べ替えて'(_データならび,_昇順に整列したデータならび), 'ファイルwriteFile.txtに5データ毎に改行して書き込む'(_昇順に整列したデータならび). 'まずデータの個数を入力し'(_学生の人数) :- 整数を得る(データの個数,_データの個数). 'readFile.txtを読み'(_データの個数,_データならび) :- get_split_lines('readFile.txt',[' '],LL), 平坦化(LL,_データならび_1), データの個数分を切り取る(_データの個数,_データならび_1,_データならび). データの個数分を切り取る(_データの個数,_データならび_1,_データならび) :- length(_データならび_1,_要素数), _要素数 >= _データの個数, length(_データならび,_データの個数), append(_データならび,_,_データならび_1),!. データの個数分を切り取る(_,_データならび,_データならび). '昇順にデータを並べ替えて'(_データならび,_昇順に整列したデータならび) :- 整列(_データならび,_昇順に整列したデータならび). 整列([],[]). 整列([_軸要素|_着目した科目の成績ならび],_昇順に整列した着目した科目の成績ならび) :- 分割(_軸要素,_着目した科目の成績ならび,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび), 整列(_軸要素より小さい成績ならび,_整列した軸要素より小さい成績ならび), 整列(_軸要素より大きい成績ならび,_整列した軸要素より大きい成績ならび), append(_整列した軸要素より小さい成績ならび,[_軸要素|_整列した軸要素より大きい成績ならび],_昇順に整列した着目した科目の成績ならび). 分割(_,[],[],[]). 分割(_軸要素,[[_成績,_No]|R1],[[_成績,_No]|_軸要素より小さい成績ならび],_軸要素と等しいか大きい成績ならび) :- _成績 @<_軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 分割(_軸要素,[[_成績,_No]|R1],_軸要素より小さい成績ならび,[[_成績,_No]|_軸要素と等しいか大きい成績ならび]) :- _成績 @>= _軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 'ファイルwriteFile.txtに5データ毎に改行して書き込む'(_整列した得点ならび) :- '得点ならびを頭部零文字列ならびに変換'(_整列した得点ならび,_頭部零文字列ならび), open('writeFile.txt',write,Outstream), 'Outstreamに書き込む'(Outstream,_頭部零文字列ならび), close(Outstream). '5データ毎にOutstreamに書き込む'(_,[]) :- !. '5データ毎にOutstreamに書き込む'(Outstream,_頭部零文字列ならび) :- '5データ毎に'(_得点ならび,A,B,C,D,E,_残りならび), writef(Outstream,'%t %t %t %t %t\n',[A,B,C,D,E]), '5データ毎にOutstreamに書き込む'(Outstream,_残りならび). '5データ毎に'([A,B,C,D,E|_残りならび],A,B,C,D,E,_残りならび) :- !. '5データ毎に'(_得点ならび,A,B,C,D,E,[]) :- append(_得点ならび,L1,[A,B,C,D,E]), all(L1,'00'). '得点ならびを頭部零文字列ならびに変換'([],[]) :- !. '得点ならびを頭部零文字列ならびに変換'([N|R1],[A|R2]) :- 頭部零文字列(2,N,A), '得点ならびを頭部零文字列ならびに変換'(R1,R2). 頭部零文字列(_N桁,_整数,_頭部零文字列) :- length(L,_N桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,'0'), atomic_list_concat(L,_頭部零文字列),!. 頭部零文字列(_N桁,_整数,_頭部零文字列) :- number_chars(_整数,Chars), atomic_list_concat(Chars,_頭部零文字列). % 平坦化/2 % ここでは使っていない'N個組'/2 % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/455 # [1] 授業単元: C言語 # [2] 質問: # datファイルから行列A,ベクトルx,bを読み込みAx=bを解く問題です。 # 以下のようにコードを書いてみたのですが問題が多くコンパイルできません。 # おかしなところが多いと思いますがアドバイスいただけると助かります # http://ime.nu/ideone.com/V7ztM # # input_sp.dat # # 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 # 1.000000 3.000000 3.000000 3.000000 3.000000 3.000000 3.000000 3.000000 3.000000 3.000000 # 1.000000 3.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 # 1.000000 3.000000 5.000000 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 # 1.000000 3.000000 5.000000 7.000000 9.000000 9.000000 9.000000 9.000000 9.000000 9.000000 # 1.000000 3.000000 5.000000 7.000000 9.000000 11.000000 11.000000 11.000000 11.000000 11.000000 # 1.000000 3.000000 5.000000 7.000000 9.000000 11.000000 13.000000 13.000000 13.000000 13.000000 # 1.000000 3.000000 5.000000 7.000000 9.000000 11.000000 13.000000 15.000000 15.000000 15.000000 # 1.000000 3.000000 5.000000 7.000000 9.000000 11.000000 13.000000 15.000000 17.000000 17.000000 # 1.000000 3.000000 5.000000 7.000000 9.000000 11.000000 13.000000 15.000000 17.000000 19.000000 # # 10.000000 28.000000 44.000000 58.000000 70.000000 80.000000 88.000000 94.000000 98.000000 100.000000 # # 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 # 'datファイルから行列A,ベクトルx,bを読み込みAx=bを解く'(_x) :- get_split_lines('input_sp.dat',[' '],LL), append(LL0,[[]|R],LL), '行列Aを得る'(LL0,_A), 'ベクトルbを得る'(R,_b), 'Ax=bを解く'(_A,_b,_x). '行列Aを得る'(LL0,_A) :- findall(L2,( member(L1,LL0), 全要素を数値に変換(L1,L2)), member(_項,L1), _A). 'ベクトルbを得る'([L|_],_b) :- 全要素を数値に変換(L,L1), ベクトルに変換(L1,_b). 全要素を数値に変換([],[]). 全要素を数値に変換([A|R1],[N|R2]) :- atom_number(A,N), 全要素を数値に変換(R1,R2),!. 全要素を数値に変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), 全要素を数値に変換(R1,R2). ベクトルに変換([],[]).) ベクトルに変換([V|R1],[[V]|R2]) :- ベクトルに変換(R1,R2). 'Ax=bを解く'(_A,_b,_x) :- 逆行列(_A,_A_1), '行列の掛算'(_A_1,_b,_x). % 行列の掛算/2 % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/583 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # ttp://codepad.org/HyKUuIuz 課題1 # [問1] あるファイルtest.datの中にテキストで実数が羅列されている。 # この実数を読み込んで表示するプログラムkadai10-1.cを作ってみよう。 # kadai10-1.cでは次のようなmain()を定義したとする # # ttp://codepad.org/kp0BBQjU  課題2 # [問2] 上記プログラムを拡張して、読み込んだデータにある変換を施して # 別のファイルに保存するプログラムkadai10-2.cを作ろう。\ # kadai10-1.cで読み込んだファイルを改めて眺めると、1行に2つの数値が書いてある。 # この各行の2番め(右端)の数値を「2乗したもの」に置き換えて別のファイルに # 保存する関数 void convert_data(FILE *in_fp, FILE *out_fp)を定義し、 # この動作を確認するプログラムkadai10-2.cを作りなさい。 # ただし、void convert_data(FILE *in_fp, FILE *out_fp)はin_fpからデータを読み取って、 # out_fpに書き込むものとする。 # # 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 # ..... # # ヒント: kadai10-2.cのmain()の例:みどりの文字がkadai10-1に新しく加えた部分 'あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示する' :- 'あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで'(_実数ならび), 表示する(_実数ならび). 'あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで'(_実数ならび) :- get_split_lines('test.dat',[' ',','],_実数ならびのならび), 平坦化(_実数ならびのならび,_実数ならび). 表示する(_実数ならび) :- append(_,[_実数|R],_実数ならび), writef('%t\n',[_実数]), R = []. % get_split_lines/3 % 平坦化/2 % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/583 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # ttp://codepad.org/HyKUuIuz 課題1 # [問1] あるファイルtest.datの中にテキストで実数が羅列されている。 # この実数を読み込んで表示するプログラムkadai10-1.cを作ってみよう。 # kadai10-1.cでは次のようなmain()を定義したとする # # ttp://codepad.org/kp0BBQjU  課題2 # [問2] 上記プログラムを拡張して、読み込んだデータにある変換を施して # 別のファイルに保存するプログラムkadai10-2.cを作ろう。\ # kadai10-1.cで読み込んだファイルを改めて眺めると、1行に2つの数値が書いてある。 # この各行の2番め(右端)の数値を「2乗したもの」に置き換えて別のファイルに # 保存する関数 void convert_data(FILE *in_fp, FILE *out_fp)を定義し、 # この動作を確認するプログラムkadai10-2.cを作りなさい。 # ただし、void convert_data(FILE *in_fp, FILE *out_fp)はin_fpからデータを読み取って、 # out_fpに書き込むものとする。 # # 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 # ..... # # ヒント: kadai10-2.cのmain()の例:みどりの文字がkadai10-1に新しく加えた部分 'ファイルtest.datを読み込み各行の2番め(右端)の数値を「2乗したもの」に置き換えて別のファイルtest2.datに保存する' :- get_split_lines('test.dat',[' ',','],LL_1), findall([_第一項,_第二項の二乗],( append(_,[[_第一項,_第二項]|R],LL_1), _第二項の二乗 is _第二項 ^ 2), LL_2), '別のファイルtest2.datに保存する'('test2.dat',LL_2). '別のファイルtest2.datに保存する'('test2.dat',LL) :- open('test2.dat',write,Outstream), append([A,B],LL), writef(Outsteam,'%t %t\n',[A,B]), R = [], close(Outstream). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/737 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/hx5VH # # 試験の各科目の点数を、受験者ごとに「出席番号 体育 美術 英語 数学 社会」の順番でテキストファイルに記録する。なお、出席番号は数字4桁、科目の点数は100点を満点とする。 # #  例: #    0001 55 66 66 77 77 # 0002 44 55 33 44 33 # 0003 33 43 53 53 53 # . # . # # 1,出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をファイルに記録するプログラムの作成。 # なお出力ファイル名はコマンドライン引数で与えることとし、出席番号に数字以外の文字が入力された場合にデータの入力を終了せよ。 # # 2,作成したファイルを読み込み、受験者ごとの合計点、順位を求め「出席番号 合計点 順位」 # の順にファイルに出力するプログラムを作成せよ。出力は成績順に並び替えなくとも良い。ただし、 # 入力ファイル名と出力ファイル名はコマンドライン引数で与えるものとする。 # # ファイル処理について習いました。stdin やFILE構造体、書式付き入出力、 # ブロック単位の入出力(size_t fwrite(const void *ptr, size_t size,size_t nmemb,FILE *stream) ) # などを習いました '作成したファイルを読み込み、受験者ごとの合計点、順位を求め「出席番号 合計点 順位」の順にファイルに出力する'(_入力ファイル,_出力ファイル) :- '作成したファイルを読み込み'(LL), '受験者ごとの合計点、順位を求め'(LL,LL3), '「出席番号 合計点 順位」の順にファイルに出力する'(_出力ファイル,LL3),!. '作成したファイルを読み込み'(LL) :- get_split_lines(_入力ファイル,[' '],LL). '受験者ごとの合計点、順位を求め'(LL,LL3) :- findall([_合計点,_出席番号],( 受験者ごとの(LL,_出席番号,_体育,_美術,_英語,_数学,_社会), 合計点(_体育,_美術,_英語,_数学,_社会,_合計点)), LL1), 順位を求め(LL1,LL3). 受験者ごとの(LL,_出席番号,_体育,_美術,_英語,_数学,_社会) :- member([_出席番号,_体育,_美術,_英語,_数学,_社会],LL). 合計点(_体育,_美術,_英語,_数学,_社会,_合計点) :- _合計点 is _体育 + _美術 + _英語 + _数学 + _社会. 順位を求め(LL1,LL3) :- 合計点の大きい順に(LL1,LL2), 順位を張る(1,LL2,LL3). 合計点の大きい順に(LL1,LL2) :- sort(LL1,LL3), reverse(LL3,LL2). 順位を張る([],[]). 順位を張る(_順位,[[_合計点,_出席番号_1],[_合計点,_出席番号_2]|R1],[[_出席番号_1,_合計点,_順位]|R2]) :- 順位を張る(_順位,[[_合計点,_出席番号_2]|R1],R2),!. 順位を張る(_順位,[[_合計点,_出席番号]|R1],[[_出席番号,_合計点,_順位]|R2]) :- _順位_2 is _順位 + 1, 順位を張る(_順位_2,R1,R2). '「出席番号 合計点 順位」の順にファイルに出力する'(_出力ファイル,LL) :- open(_出力ファイル,write,Outstream), append(_,[[_出席番号,_合計点,_順位]|R],LL), writef(Outstream,'%t %t %t\n',[_出席番号,_合計点,_順位]), R = [], close(Outstream). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/768 # 数字が並んだテキストファイルからいくつかの数字だけを取り出して # 表示したいです. # 例:hoge.txt # 78 3 44 89 # 22 31 44 88 99 53 # 3 4 7 9 9 7 6 # 例えば上記のテキストデータですと, # 各行の最初の2つの数字以降の数字を取り出して # 表示したいです. # なお,読み込むテキストデータは行も列も不定になっています. # 上記のテキストデータは1行目は4列ですが,他の行は4列とは限りません. # なるべく簡単な関数で書けるとありがたいです. # 環境はvisual studio2010で書いてます. # # 初心者ですみません.よろしくお願いします. # '数字が並んだテキストファイルからいくつかの数字だけを取り出して表示する。各行の最初の2つの数字以降の数字を取り出して表示したい'(_テキストファイル) :- get_split_lines(_テキストファイル,[' '],LL), 各行の最初の2つの数字以降の数字を取り出して表示したい(LL,R), R = []. 各行の最初の2つの数字以降の数字を取り出して表示したい(LL,R) :- 各行の最初の2つの数字以降の数字を取り出して(LL,L,R), 表示したい(L). 各行の最初の2つの数字以降の数字を取り出して(LL,L,R) :- append(_,[[_,_|L]|R],LL). 表示したい(L) :- length(L,_要素数), length(L1,_要素数), all(L1,'%t'), atomic_list_concat(L1,' ',_表示パターン), writef(_表示パターン,L). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/784 # [1] 授業単元:C 言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/JrW6n1Q3 # 上記プログラムで作成したファイルを読み込んで中身を次のフォーマットで表示する関数 # void display_b(FILE *in_fp); # を作成し、その動作を確認するプログラムkadai11-2.cを作りなさい。 # ただし、ファイル名はプロトタイプ宣言で指定すること。 # また、出力は以下の出力例に示すフォーマットで画面出力されるものとする。 # # gcc kadai11-2.c # ./a.out # 1.000000 1.292166 # 1.010000 1.294241 # 1.020000 1.293094 # 1.030000 1.294946 # 1.040000 1.305628 # 1.050000 1.329642 # 1.060000 1.368... # 'ファイルを読み込んで中身を整形したフォーマットで表示する' :- フォーマットを推測する(' 1.000000 1.292166',_表示フォーマット), ファイルを読み込んで(LL), get_split_lines('test_bin.dat',LL), 整形したフォーマットで表示する(_表示フォーマット,LL). ファイルを読み込んで(LL) :- get_split_lines('test_bin.dat',[' '],LL). 整形したフォーマットで表示する(_表示フォーマット,[]). 整形したフォーマットで表示する(_表示フォーマット,[_要素ならび|R]) :- writef(_表示フォーマット,_要素ならび), 整形したフォーマットで表示する(_表示フォーマット,R). フォーマットを推測する(_文字列,_表示フォーマット) :- 要素ならびとして取り出す(_文字列,_要素ならび), フォーマット要素を推測する(_要素ならび,_表示フォーマットならび), atomic_list_concat(_表示フォーマットならび,_表示フォーマット). フォーマット要素を推測する([],['\n']) :- !. フォーマット要素を推測する([''|R1],R2) :- フォーマット要素を推測する(R1,R2),!. フォーマット要素を推測する([_要素|R1],[F|R2]) :- 要素は浮動小数点数(_要素,F), フォーマット要素を推測する(R1,R2),!. フォーマット要素を推測する([S|R1],[S|R2]) :- sub_atom(S,0,1,_,' '), フォーマットを推測する(R1,R2),!. フォーマット要素を推測する([S|R1],['%t'|R2]) :- フォーマットを推測する(R1,R2). 要素は浮動小数点数(_要素,F) :- sub_atom(_要素,S,1,_残り文字数,'.'), sub_atom(_要素,0,S,_,_小数点以上文字列), atomic_list_concat(['~',_残り文字数,f],F),!. 要素ならびとして取り出す(_文字列,[S1,S2|R1]) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 'S2は空白に挟まれている'(L1,L2,L3), 要素ならびとして取り出す(S3,R1),!. 要素ならびとして取り出す(_,[]) :- !. 'S2は空白に挟まれている'(L1,L2,L3) :- all(L1,' '), \+(member(' ',L2)), \+((L3 = [A|_],\+(A=' '))),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/976 # [1] 授業単元:C言語演習 # [2] 問題文: # 以下の実験データは、あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。 # 以下のリストの< >の処理をコメントに従って埋め、メッセージ毎の転送時間を出力するプログラムを作成せよ。 # 但し、メッセージ転送時間は、メッセージ発生時刻との差である。 # <実験データ> # メッセージ番号 発生時刻[ミリ秒] 到着時刻[ミリ秒] # 0        0         25 # 1        5         30 # 2        10         38 # 3        15         50 # 4        20         52 # 5        25         55 # 6        30         57 # 7        35         60 # 8        40         65 # 9        45         70 # <リスト> # http://ime.nu/codepad.org/PW5VddGM # #include # struct MESSAGE # { # int gene; # int end; # int delay; # }; # # void delay(struct MESSAGE data[], int i); # # int main(void) # { # struct MESSAGE data[10]; int i; # //<メッセージの発生時刻と到着時刻の値の代入> # for (i=0; i<=9; i++) # { # delay(data, i); # prinff("メッセージ%dの転送時間は%dミリ秒 \n",i, data[i].delay); # } # } # # void delay(struct MESSAGE data[], int i) # { # //<メッセージiの転送時間の計算> # } # '実験データは、あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データファイル) :- 実験データは(_実験データファイル,_実験データ行ならび), 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データ行ならび). 実験データは(_実験データファイル,_実験データ行ならび) :- get_split_lines(_実験データファイル,_実験データ行ならび). 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データ行ならび) :- append(_,[_行文字列|R],_実験データ行ならび), メッセージ毎の転送時間を(_行文字列,_メッセージ番号,_メッセージの転送時間), writef('%t %t\n',[_メッセージ番号,_転送時間]), R = []. メッセージ毎の転送時間を(_行文字列,_メッセージ番号,_メッセージの転送時間) :- split(_行文字列,[' '],[_メッセージ番号,_メッセージの発生時刻,_メッセージの到達時刻]), _メッセージの転送時間 is _メッセージの到達時刻 - _メッセージの発生時刻. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/978 # [1] 授業単元:C言語演習 # [2] 問題文: # ../test/read.cgi/tech/1339338438/976のプログラムを修正して、メッセージ転送時間の平均値を計算するaverage関数を追加し、main関数側で平均メッセージ転送時間も出力するようにせよ。 # '実験データは、あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージの転送時間の平均値を出力する'(_実験データファイル) :- 実験データは(_実験データファイル,_実験データ行ならび), 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データ行ならび). 実験データは(_実験データファイル,_実験データ行ならび) :- get_split_lines(_実験データファイル,_実験データ行ならび). 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージの転送時間の平均値を出力する'(_実験データ行ならび) :- findavg(_転送時間,( member(_行文字列,_実験データ行ならび), メッセージ毎の転送時間(_行文字列,_メッセージの転送時間)), _転送時間の平均値), writef('転送時間の平均値は %t 秒です\n',[_転送時間の平均値]). メッセージ毎の転送時間(_行文字列,_メッセージの転送時間) :- split(_行文字列,[' '],[_メッセージ番号,_メッセージの発生時刻,_メッセージの到達時刻]), _メッセージの転送時間 is _メッセージの到達時刻 - _メッセージの発生時刻. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1342966104/23 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/jE2IX # # あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示するプログラムkadai10-1.cを作ってみよう。 # kadai10-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)を以下の仕様を満たすように定義し、kadai10-1.cを完成させなさい。 # 読み込むファイルはscanfにてキーボード入力するが、このとき、 /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 # すると、使用方法が表示される。 display_file(Instream) :- get_split_lines(Instream,[' '],LL), flat(LL,L), append(_,[V|R],L), writef('%t\n',[V]), R = []. % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1316769778/945 # ・DBMS名とバージョン MySQL 5.1 # ・テーブルデータ # CSVファイル # "犬","シベリアンハスキー" # "猫","マンチカン" # "熊猫","レッサーパンダ" # ・欲しい結果 # インポートして、次のようにしたい、要するに連番をつけたい # ID 動物 種類 # 1 犬 シベリアンハスキー # 2 猫 マンチカン # 3 熊猫 レッサーパンダ # ・説明 # インポートするときにdefaultをつければいいのですが、SQL文で書けないでしょうか。 # 'CSVファイルを連番をつけてインポートする'(_CSVファイル) :- 'CSVファイルを'(_CSVファイル,LL), 連番をつけてインポートする(LL). 'CSVファイルを'(_CSVファイル,LL) :- get_split_lines(_csvファイル,[','],LL). 連番をつけてインポートする(LL) :- append(L0,[L|R],LL), 連番をつけて(L0,L,P), assertz(P), R = []. 連番をつけて(L0,L,P) :- length([_|L0],N), P =.. [テーブル,N|L]. % 課題の文("インポートして、次のようにしたい、要するに連番をつけたい")を % 若干組み替えて、"CSVファイルを連番をつけてインポートする"とした。 % 一般論としては好ましいことではないが、述語定義をしていくうちに、これは % 課題の文に問題があるということになって遡って定義を書き換えることはある。 % Prologは国語だの所以か。 % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1342966104/71 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/TO8Kg 問題です。 # http://ime.nu/ideone.com/ZvUuR 課題を提出したら関数の定義 #              をしろといわれました。 # http://ime.nu/ideone.com/Nd5ir 自分なりにやったのですが #              ここからができませんでしたので #              よろしくお願いします。 # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙するプログラムkadai12.c を書きなさい。ただしファイル名は画面から入力されるものとする(scanf()を使う)。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分からないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)/(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。ただしファイル名は画面から入力されるものとする。' :- '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL), 'BMI値を計算し'(LL,LL1), 'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1). '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL) :- write('データファイル名を入力してください : '), get_line(_データファイル名), get_split_lines(_データファイル名,[' ',','],LL). 'BMI値を計算し'(LL1,LL2) :- findall([_BMI値,_氏名],( member([_氏名,_身長,_体重],LL1), 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値)), LL2). /* 'BMI値を計算し'([],[]). 'BMI値を計算し'([[_氏名,_身長,_体重]|R1],[[_BMI値,_氏名]|R2]) :- 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値), 'BMI値を計算し'(R1,R2). */ 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値) :- _BMI値 is _体重 / _身長 ^ 2. 'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1) :- 'BMI値が大きいもの順に'(LL1,LL3), その人のBMI値および肥満か否かを列挙する(LL3). 'BMI値が大きいもの順に'(LL1,LL3) :- sort(LL1,LL2), reverse(LL2,LL3). その人のBMI値および肥満か否かを列挙する(LL3) :- append(_,[[_BMI値,_氏名]|R],LL3), 'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,_肥満判定), writef('%t は %t。\n',[_氏名,_肥満判定]), R = []. 'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,肥満です) :- _BMI値 > 25.0,!. 'このBMI値が25を越えると、肥満とみなされる。'(_,肥満ではない). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1342966104/238 # [1] 授業単元:C言語プログラム # [2] 問題文: # http://ime.nu/codepad.org/yL0GUnrC # \\次のような家計簿データkakeibo.datがテキストでかかれてあり、中身を見ると \\meat 125 1 \\rice 2000 1 \\juice 110 10 \\となっているものとする。このうち右端は商品名、真ん中は単価、左端は数量を表して \\いる。このようなデータを読み取って使用金額の合計を計算するプログラミングを作り \\たい。以下のプログラムをコンパイルがとおり、目的の動作をするように直接書き込み \\なさい。(どこを補うべきかも考えること)ただし商品名は空欄を含まない文字列とする。 # # #include # #include # # #define FILENAME "kakeibo.dat" # # int goukei(FILE *fp); # # # int main(){ # FILE *fp; # # fp = fopen(FILENAME,"r"); # if(fp==NULL){ # fprintf(stderr,"%s is not found!\n",FILENAME); # exit(1); # } # # printf("goukei = %d\n",goukei(fp)); # } # # int goukei(FILE *fp){ # int sum =0, tanka, suryou, # char str[50]; # while (fscanf()!=EOF){ # } # return ; # } '次のような家計簿データkakeibo.datがテキストでかかれてあり、中身を見ると meat 125 1\\nrice 2000 1\\njuice 110 10\\n となっているものとする。このうち右端は商品名、真ん中は単価、左端は数量を表している。このようなデータを読み取って使用金額の合計を計算する'(_使用金額の合計) :- '家計簿データkakeibo.dat(各行の右端は商品名、真ん中は単価、左端は数量を表している)を読み取って使用金額の合計を計算する'(_使用金額の合計). '家計簿データkakeibo.dat(各行の右端は商品名、真ん中は単価、左端は数量を表している)を読み取って使用金額の合計を計算する'(_使用金額の合計) :- findsum(_使用金額,( '家計簿データkakeibo.dat(各行の右端は商品名、真ん中は単価、左端は数量を表している)を読み取って使用金額の'(_使用金額)), _使用金額の合計). '家計簿データkakeibo.dat(各行の右端は商品名、真ん中は単価、左端は数量を表している)を読み取って使用金額の'(_金額) :- get_split_lines('kakeibo.dat',[' ',','],LL), member([_品物,_単価,_数量],LL), _金額 is _単価 * _数量. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1342966104/463 # 休み中の課題なのですが、わからないので教えて頂きたいです。 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/vb7pZ # # 飲食店の6月分の帳簿データbook-6.datがテキストで書かれてあり、中身を見てみると #  左端から、日付 支出(1)/収入(0) 商品名 単価 数量 #  20120601 1 meat 125 10000 #  20120602 1 rice 2000 10 #  20120603 0 uriage 500 100 #  20120603 1 beer 140 24 # となっているものとする。  ただし、支出は1、収入は0とする。 # このようなデータを読み取って残高を計算するプログラムを作りたい。以下のプログラムをコンパイルが通り、 # 目的の動作をするように直接書き込んで補いなさい。(どこを補うべきかも考えること) # ただし、商品名は空白を含まない文字列とし、繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、 # 入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。 '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って残高を計算する。ただし、商品名は空白を含まない文字列とし、繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_残高表,_残高) :- '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って'(LL), '繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金), 繰越金を付加して残高を計算する(LL,_繰越金,_残高表,_残高). '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って'(LL) :- get_split_lines('book-6.dat',[' ',','],LL). '繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金) :- 整数を得る(繰越金,_繰越金候補), '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金),!. '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金) :- writef('入力された繰越金 %t で間違いありませんか?\n間違いがなければ改行\n間違っていたら 正しい繰越金を入力してください : ',[_繰越金候補]), get_line(Line), 間違いがあるならば何度でも入力しなおす(Line,_繰越金候補,_繰越金),!. 間違いがあるならば何度でも入力しなおす('',_繰越金,_繰越金) :- !. 間違いがあるならば何度でも入力しなおす(Line,_,_繰越金) :- 間違いがある, atom_to_term(Line,_繰越金候補,_), integer(_繰越金候補), '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金). 間違いがある. 繰越金を付加して残高を計算する(LL,_繰越金,[[_日付,0,繰越金,0,0,_繰越金]|_残高表],_残高) :- LL = [[_日付|_]|_], 残高を計算する(LL,_繰越金,_残高表,_残高). 残高を計算する([],_残高,[],_残高). 残高を計算する([[_日付,_支出または収入区分,_商品名,_単価,_数量]|R1],_残高_1,[[_日付,_支出または収入区分,_商品名,_単価,_数量,_残高_2]|R2],_残高) :- 支出または収入区分に従って行の計算(_残高_1,_支出または収入区分,_単価,_数量,_残高_2), 残高を計算する(R1,_残高_2,R2,_残高). 支出または収入区分に従って行の計算(_残高_1,1,_単価,_数量,_残高_2) :- _残高_2 is _残高_1 - _単価 * _数量. 支出または収入区分に従って行の計算(_残高_1,0,_単価,_数量,_残高_2) :- _残高_2 is _残高_1 + _単価 * _数量. % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1343899481/70 # 使用DB:postgresql # # DBにこんなテーブルがあり # name price # りんご 100 # バナナ 200 # みかん 150 # # 手元にこんなCSVデータがあって # りんご,150 # みかん,100 # # CSVのデータを元に一括でUPDATEしたいです。 # name price # りんご 150 # バナナ 200 # みかん 100 # # CSVデータの文字列加工はPHP使うので大体のことは出来ます。 # 最悪1行ずつUPDATEでいいのですが、行数が多いので出来ればSQL発行を1回にしたいです。お願いします。 # # :- dynamic(テーブル/1). 'CSVデータによってテーブルを更新する'(_CSVファイル) :- get_split_lines(_CSVファイル,[','],LL), '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'(LL). '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'([]). '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'([L|R]) :- テーブルを更新する(L), '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'(R). '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'([L|R]) :- テーブルに追加する(L), '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'(R). テーブルを更新する([_1,_2]) :- retract(テーブル(_1,_)), assertz(テーブル(_1,_2)), fail. テーブルを更新する(_). テーブルに追加する([_1,_2]) :- \+(テーブル(_1,_)), assertz(テーブル(_1,_2)). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1349527750/603 # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 lこのtxtファイルを読み取って ファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), ファイル名を削除し(LL,LL1), 右から順に番号を振った上で(LL1,LL2), 要素が0のものを削除し書き換え(LL2,LL3), 書き換えtxtファイルに出力する(LL3). ファイル名を削除し([],[]). ファイル名を削除し([[_|L1]|R1],[L1|R2]) :- ファイル名を削除し(R1,R2). 右から順に番号を振った上で([],[]). 右から順に番号を振った上で([L1|R1],[L2|R2]) :- findall(N-A,( append(_,[A|R],L1), length([_|R],N)), L2), 右から順に番号を振った上で(R1,R2). 要素が0のものを削除し書き換え([],[]). 要素が0のものを削除し書き換え([N-0|R1],R2) :- 要素が0のものを削除し書き換え(R1,R2). 要素が0のものを削除し書き換え([N:A|R1],[N-A|R2]) :- \+(A = 0), 要素が0のものを削除し書き換え(R1,R2). 書き換えtxtファイルに出力する(LL3) :- open('書き換え.txt',write,Outstream), append(_,[L|R],LL3), 行要素を出力する(Ountstream,L), R = [], close(Outstream). 行要素を出力する(Outstream,[]) :- writef(Outstream,'\n'). 行要素を出力する(Outstream,[N:A|R]) :- writef(Outstream,'%t:%t ',[N,A]), 行要素を出力する(Outstream,R). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1349527750/603 # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 lこのtxtファイルを読み取って ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), open('書き換え.txt',write,Outstream), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し(Outstream,LL), close(Outstream). ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し(Outstream,LL) :- append(_,[[_|L]|R],LL), append(L0,[N|R1],L), 要素が0のものを削除し表示する(Outstream,Nth,N), R1 = [], write('\n'), R = []. 要素が0のものを削除し表示する(Outstream,Nth,0) :- !. 要素が0のものを削除し表示する(Outstream,Nth,A) :- writef(Outstream,'%t:%t ',[Nth,A]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1349527750/603 # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 lこのtxtファイルを読み取って ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), open('書き換え.txt',write,Outstream), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,LL), close(Outstream). ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,[]) :- !. ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,[[_|L]|R) :- 一行出力する(Outstream,L), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,R). 一行出力する(Outstream,L) :- append(L0,[N|R1],L), 要素が0のものを削除し出力する(Outstream,L0,N), R1 = [], write('\n'). 要素が0のものを削除し出力する(Outstream,L0,0) :- !. 要素が0のものを削除し出力する(Outstream,L0,A) :- length([_|L0],Nth), writef(Outstream,'%t:%t ',[Nth,A]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1349527750/693 # [1]C/C++プログラミング実習 まとめ  # [2]問題 http://ime.nu/codepad.org/CfJninhf #   問題文中に出てくる histograms.txt # [3]visual studio 2010 # [4]11月19日 10時 # [5]前にここのスレでお世話になりました../test/read.cgi/tech/1349527750/603です。 #   この前の課題を提出した所、今度はまとめとして前の問題の発展問題がだされました。 #   前に頂いたプログラムを改変してみようと思ったのですが、今回の問題が複雑になりすぎてて #   お手上げ状態です。どなたか助けていただけると幸いに思います。 # # /* # histograms.txtという文章ファイルがある。 # このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が # 並んでいて、それらの数字は水平TAB文字によって区切られている。 # このhistograms.txtを自動的に以下の条件のもとに改変して # train.datというファイルとして出力をするプログラムを作れ。 # # 条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。 #     (例 image/0-21C5N550AVL.jpg → 0 #        image/1-19690369.jpg  → 1 #        image/2-24891960.jpg  → 2 #        image/3-12725422.jpg  → 3) # # 条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。 # # 条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、 #     番号:数値?番号:数値?番号:数値?…という形に書き換える #     (例 0  0.0309051 0 0   0.00496689 #      → 2:0.0309051 5:0.00496689 …… ) # # 条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き #              指定した方の名前で出力を行う。 # # */ 'histograms.txtという文章ファイルがある。 このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が 並んでいて、それらの数字は水平TAB文字によって区切られている。 このhistograms.txtを自動的に以下の条件のもとに改変して train.datというファイルとして出力をするプログラムを作れ。 条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。     (例 image/0-21C5N550AVL.jpg → 0        image/1-19690369.jpg  → 1        image/2-24891960.jpg  → 2        image/3-12725422.jpg  → 3) 条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。 条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、     番号:数値?番号:数値?番号:数値?…という形に書き換える     (例 0  0.0309051 0 0   0.00496689      → 2:0.0309051 5:0.00496689 …… ) 条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き              指定した方の名前で出力を行う。' :- 'histograms.txtという文章ファイルがある。このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が並んでいて、それらの数字は水平TAB文字によって区切られている。このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする'. 'histograms.txtという文章ファイルがある。このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が並んでいて、それらの数字は水平TAB文字によって区切られている。このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする' :- 'このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする'. 'このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする' :- 'histograms.txtを項区切りの情報に変換する'(LL0), '条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。'(LL0,LL1), '条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、'(LL1,LL3), '条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。'(LL3,_行ならび), '条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL3). 'histograms.txtを項区切りの情報に変換する'(LL0) :- get_split_lines('histograms.txt',['\t'],LL0). '条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。'(LL0,LL1) :- findall([N|R],( member([File|R],LL0), split(File,['/','-'],[_,N|_])), LL1). '条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、'(LL2,LL3) :- findall([N|L],( member([N|R],LL2), 左から順に番号を振った上で要素が0のものを削除し(R,L)), LL3). 左から順に番号を振った上で要素が0のものを削除し(L1,L) :- findall(Nth:A,( append(L0,[A|_],L1), \+(A = 0), length([_|L0],Nth)), L). '条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。'(LL1,L) :- findall(S,( member(L,LL1), atomic_list_concat(LL1,' ',S)), L). '条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(_行ならび) :- 'train.datかtest.datのどちらのファイル名で出力するかを聞き', 整数を得る('1または2のどちらかの数字',(N>=1,N=<2),N), 指定した方の名前で出力を行う(N,_指定した方の名前). 'train.datかtest.datのどちらのファイル名で出力するかを聞き' :- write('ファイル名を選択します。\n1.. train.dat 2.. test.dat \n'). 指定した方の名前で出力を行う :- 指定した方の名前で(_指定した方の名前), 出力を行う(_指定して方の名前,_行ならび). 指定した方の名前で(_指定した方の名前) :- 整数を得る('1または2',(N == 1;N == 2),N), 指定した方の名前で(N,_指定した方の名前). 指定した方の名前(1,'train.dat'). 指定した方の名前(2,'test.dat'). 出力を行う(_指定した方の名前,_行ならび) :- put_lines(_指定した方の名前,_行ならび). % 以下のサイトは http://anago.2ch.net/test/read.cgi/software/1348064199/191 # aaa,b # 0.1,44 # 0.2,23.1 # 0.5,777.4 # 0.6,-10 # 0.7,999 # 0.8,-496.3 # 0.9,37 # 1.1,0 # 1.2,865 # 1.3,-5 # 1.4,-5955 # 1.6,0 # 1.8,594.3 # 2.1,-459 # # 上記のようなcsvファイルがあります。 # aaaの値がx刻みのbの平均値を出したいのです。 # # たとえばxを0.5とした場合、以下のように平均値を自動的に。 # (xの値は自由に変更できるものでお願いします) # # aaaが0超0.5以下(0.1と0.2と0.5)のbの平均値((44+23.1+777.4)/3=281.5) # aaaが0.5超1以下(0.6と0.7と0.8と0.9)のbの平均値(132.425) # aaaが1超1.5以下(1.1と1.2と1.3と1.4)のbの平均値(-1273.75) # aaaが1.5超2以下(1.6と1.8)のbの平均値(297.15) # aaaが2超2.5以下(2.1)の平均値(-459) # # 'aaa,b 0.1,44 0.2,23.1 0.5,777.4 0.6,-10 0.7,999 0.8,-496.3 0.9,37 1.1,0 1.2,865 1.3,-5 1.4,-5955 1.6,0 1.8,594.3 2.1,-459 上記のようなcsvファイルがあります。 aaaの値がx刻みのbの平均値を出したいのです。 たとえばxを0.5とした場合、以下のように平均値を自動的に。 (xの値は自由に変更できるものでお願いします) aaaが0超0.5以下(0.1と0.2と0.5)のbの平均値((44+23.1+777.4)/3=281.5) aaaが0.5超1以下(0.6と0.7と0.8と0.9)のbの平均値(132.425) aaaが1超1.5以下(1.1と1.2と1.3と1.4)のbの平均値(-1273.75) aaaが1.5超2以下(1.6と1.8)のbの平均値(297.15) aaaが2超2.5以下(2.1)の平均値(-459)'(CSVFILE,_x,_平均値ならび) :- get_split_lines(CSVFILE,[','],LL), 最大値(LL,[_最大値_1,_]), 刻みながら平均値を取る(0,_最大値,_n,_平均値ならび). 刻みながら平均を取る(N,_最大値,_n,_,[]) :- N > _最大値,!. 刻みながら平均を取る(N,_最大値,_n,LL,[[N,N2,_平均]|R]) :- N2 is N + _n, findavg(_bbb,( 刻み範囲のbbbの値を選択する(N,N2,LL,_bbb)), _平均), 刻みながら平均を取る(N2,_最大値,_n,LL,R). 刻み範囲のbbbの値を選択する(N,N2,LL,_bbb) :- member([_aaa,_bbb],LL), _aaa > N, _aaa =< N2. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1354070278/551 # こんにちは。 # 早速ですがtxtファイルに書いてある下記の数値を取り込んで平均点の大きい順に # 上から並び替え、別のtxtファイルに出力するプログラムを作りたいのですが # どうすればいいんでしょうか。 # # ご回答お願いします。 # # 14 # 1001 90 80 70 67 # 1002 60 50 40 60 # 1003 55 30 56 65 # 1004 88 70 77 20 # 1005 60 30 90 30 # 1006 100 0 100 100 # 1007 23 33 21 50 # 1008 65 66 46 98 # 1009 58 87 88 64 # 1010 30 55 63 32 # 1011 65 54 70 77 # 1013 98 89 79 90 # 1014 100 60 95 68 # 1016 30 22 56 30 # # 'txtファイルに書いてある下記の数値を取り込んで平均点の大きい順に上から並び替え、別のtxtファイルに出力する'(_txtファイル,_別のtxtファイル) :- 'txtファイルに書いてある下記の数値を取り込んで'(_txtファイル,LL1), 平均点の大きい順に上から並び替え(LL1,LL2), 別のtxtファイルに出力する(LL2,_別のtxtファイル). 'txtファイルに書いてある下記の数値を取り込んで'(_txtファイル,LL1) :- get_split_lines(_txtファイル,[' '],[_|LL1]). 平均点の大きい順に上から並び替え(LL1,LL2) :- 平均点の(LL1,LL3), 大きい順に上からならび替え(LL3,LL2). 平均点の([],[]). 平均点の([[A|L1]|R1],[[_平均点,A|L1]|R2]) :- 相加平均(L1,_平均点), 平均点の(R1,R2). 大きい順に上からならび替え(LL3,LL2) :- 整列(LL3,LL4), reverse(LL4,LL2). 別のtxtファイルに出力する(_別のtxtファイル,LL2) :- length(LL2,Len), open(_別のtxtファイル,write,Outstream), 出力する(Outstream,[[Len]|LL2]), close(Outstream). 出力する(Outstream,[]). 出力する(Outstream,[[_|L]|R]) :- atomic_list_concat(L,' ',S), writef(Outstream,'%t\n',[S]), 出力する(Outstream,R). % 以下のサイトは 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/227 # [1] 授業単元: 配列の整列 # [2] 問題文(含コード&リンク):字数超えてしまったのでリンク張ります。 # [ http://ime.nu/codepad.org/YCoV3saL ] # # /* # # 2次元配列の整列 # # ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 # # | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | # # これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) # 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合計点で照準に整列して表示する(整列後)。 # # 【実行例】 # # 整列前 # 番号 問1  問2 問3 問4 問5 合計 # 1001 20 30 49 41 90 230 # 1002 50 30 24 0 95 199 # 1003 20 33 55 35 90 233 # 1004 93 55 56 61 90 355 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1025 80 90 52 50 91 363 # 合計 1145 1015 1297 978 2292 # # 整列後 # 番号 問5  問3 問1 問2 問4 合計 # 1025 91 52 80 90 50 363 # 1004 90 56 93 55 61 355 # 1003 90 50 94 50 49 233 # 1004 100 49 70 30 62 311 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1015 90 53 20 20 0 183 # 合計 2292 1297 1145 1015 978 # # ※実行例が長くなってしまうので途中省略しています。 # # */ 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。' :- 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1), '学生ごとの合格点と、問ごと合計点を求めて表示する(整列前)'(LL1,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列), 'さらに、学生の合格点で照準に整列して表示する(整列後)。'(_問いごとの合計点ならび,転置された学生の合格点付き点数行列). 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1) :- get_split_lines('seiseki.dat',[' '],LL1). '学生ごとの合格点と、問ごと合計点を求めて表示する(整列前)'(LL1,LL4,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列) :- '学生ごとの合格点と、'(LL1,_学生の合格点付き点数行列), '問ごと合計点を求めて'(_学生の合格点付き点数行列,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列), 表示する(_学生の合格点付き点数行列,_問いごとの合計点ならび). '学生ごとの合格点と、'([],[]). '学生ごとの合格点と、'([[_学生番号|L1]|R1],[[_学生番号|L2]|R2]) :- sum(L1,_sum), 学生ごとの合格点(L1,0,L2), '学生ごとの合格点と、'(R1,R2). 学生ごとの合格点([],_合計点,[_合計点]). 学生ごとの合格点([A|R1],_合計点_1,[A|R2]) :- _合計点2 is A + _合計点_1, 学生ごとの合格点(R1,R2). 問ごと合計点を求めて(_学生の合格点付き点数行列,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列) :- 転置(_学生の合格点付き点数行列,_転置された学生の合格点付き点数行列), 問ごと合計点(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび). 問ごと合計点([],[]). 問ごと合計点([L1|R1],[S|R2]) :- sum(L1,S), 問ごと合計点(R1,R2). 表示する(_学生の合格点付き点数行列,_問いごとの合計点ならび) :- write('番号 問1  問2 問3 問4 問5 合計\n'), append(_,[L|R],_学生の合格点付き点数行列), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = [], writef(' %5r%5r%5r%5r%5r%5r\n',_問いごとの合計点ならび). '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび) :- '次に、問の合計点の降順に左から右に向かって整列し、'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび,LL_1), 'さらに、学生の合格点で照準に整列して'(LL_1,LL_2), 表示する_2(_問いごとの合計点ならび,LL_2). '次に、問の合計点の降順に左から右に向かって整列し、'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび) :- 順位づけする(_問いごとの合計点ならび,_順位づけされた合計点ならび), findall(L,( between(1,5,N), nth1(N,_順位づけされた合計点ならび,[_,_項目番号]), nth1(_項目番号,_転置された学生の合格点付き点数行列,L)), LL_1), 転置([_学生番号ならび|LL_1],LL_2). 'さらに、学生の合格点で照準に整列して'(LL1,LL2) :- findall([A|L],( member(L,LL1), last(L,A)), LL3), 整列(LL3,LL4), 鍵を切り離して逆順にならび替え(LL4,[],LL2). 鍵を切り離して逆順にならび替え([],LL,LL). 鍵を切り離して逆順にならび替え([[A|L]|R1],L_1,LL) :- 鍵を切り離して逆順にならび替え(R1,[L|L_1],LL). 順位づけする(_問いごとの合計点ならび,_順位づけされた合計点ならび) :- findall([_合計点,_nth1],( between(1,5,_nth1), nth1(_nth1,_問いごとの合計点ならび,_合計点)), LL1), 降順整列(LL1,_順位づけされた合計点ならび). 降順整列(LL1,_順位づけされた合計点ならび) :- 整列(LL1,LL2), reverse(LL2,_順位づけされた合計点ならび). 表示する_2(LL_2,_順位づけられた合計点ならび) :- 見出し表示(_順位づけられた合計点ならび), 行列部分の表示(LL_2), 合計点の表示(_順位づけられた合計点ならび). 見出し表示(_順位づけられた合計点ならび) :- findall(_項目番号,( member([_,_項目番号],_順位づけられた合計点ならび)), _項目番号ならび), writef('番号 %5r%5r%5r%5r%5r%5r合計\n',_項目番号ならび). 行列部分の表示(LL) :- append(_,[L|R],LL), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = []. 合計点の表示(_順位づけられた合計点ならび) :- findall(_合計点,( member([_合計点,_],_順位づけられた合計点ならび)), _合計点ならび), writef(' %5r%5r%5r%5r%5r%5r\n',_合計点ならび). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1357748713/227 # [1] 授業単元: 配列の整列 # [2] 問題文(含コード&リンク):字数超えてしまったのでリンク張ります。 # [ http://ime.nu/codepad.org/YCoV3saL ] # # /* # # 2次元配列の整列 # # ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 # # | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | # # これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) # 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合計点で照準に整列して表示する(整列後)。 # # 【実行例】 # # 整列前 # 番号 問1  問2 問3 問4 問5 合計 # 1001 20 30 49 41 90 230 # 1002 50 30 24 0 95 199 # 1003 20 33 55 35 90 233 # 1004 93 55 56 61 90 355 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1025 80 90 52 50 91 363 # 合計 1145 1015 1297 978 2292 # # 整列後 # 番号 問5  問3 問1 問2 問4 合計 # 1025 91 52 80 90 50 363 # 1004 90 56 93 55 61 355 # 1003 90 50 94 50 49 233 # 1004 100 49 70 30 62 311 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1015 90 53 20 20 0 183 # 合計 2292 1297 1145 1015 978 # # ※実行例が長くなってしまうので途中省略しています。 # # */ 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。' :- 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1), '学生ごとの合格点と、問ごと合計点を求めて表示する'(LL1,LL2), '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(LL2). 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1) :- get_split_lines('seiseki.dat',[' '],LL1). '学生ごとの合格点と、問ごと合計点を求めて表示する'(LL1,LL2) :- '行列を列の合計で降順に整列して列位置を交換し(LL1,LL2), 問いごとの合計を表示する(LL2). 列の合計で降順に整列して列位置を交換し(LL,LL1) :- 転置(LL,_転置されたLL), findall([_合計,_nth1|L],( nth1(_nth1,_転置されたLL,L), sum(L,_合計)), _転置され合計を付加されたLL), 降順バブルソート(_転置され合計と列位置が付加されたLL,_降順に整列された転置され合計と列位置が付加されたLL), 転置(_降順に整列された転置され合計と列位置が付加されたLL,LL1). 問いごとの合計を表示する(LL2) :- between(1,6,_nth), nth0(_nth,LL2,[_合計|_]), atomic_list_concat([問,_nth,' = ',_合計],S), writef(' %t,',[S]), _nth = 6, write('\n'). '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(LL1) :- 列の合計で降順に整列して列位置を交換し(LL1,LL2), 行合計で降順に整列する(LL2,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL), 表示する(_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL). 行合計で降順に整列する(LL1,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL) :- findall([_合計|L2],( member(L,LL1), 要素の合計を最終要素に付加(L,_合計,L2)), LL2), 降順バブルソート(LL2,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL). 要素の合計を最終要素に付加(L1,_合計,L2) :- 要素の合計を最終要素に付加(L1,0,_合計,L2). 要素の合計を最終要素に付加([],_合計,_合計,[_合計]). 要素の合計を最終要素に付加([N|R1],_合計_1,_合計,[N|R2]) :- _合計_2 is _合計 + N, 要素の合計を最終要素に付加(R1,_合計_2,_合計,R2). 表示する(LL2) :- 最終見出しを得る(LL2,_見出し), writef('%t\n',[_見出し]), 行列部分の表示(LL2), 最終合計の表示(LL2). 行列部分の表示(LL) :- append(_,[[_|L]|R],LL), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = []. 最終合計の表示([_最終合計ならび|_]) :- writef(' %5r%5r%5r%5r%5r%5r\n',_最終合計ならび). 合計点の表示(_順位づけられた合計点ならび) :- findall(_合計点,( member([_合計点,_],_順位づけられた合計点ならび)), _合計点ならび), writef(' %5r%5r%5r%5r%5r%5r\n',_合計点ならび). 最終見出しを得る([_,L|_],_最終見出し) :- findall(S,( member(N,L), atomic_list_concat(['問',_nth1,' '],S)), L), atomic_list_concat(['番号 '|L],_最終見出し). 降順バブルソート(L1,L2) :- append(L0,[A,B|R],L1), A @< B, append(L0,[B,A|R],L3), 降順バブルソート(L3,L2),!. 降順バブルソート(L,L). % 以下のサイトは # http://toro.2ch.net/test/read.cgi/tech/1357748713/477 # [1] 授業単元:c++ # [2] 問題文(含コード&リンク):不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、ローマ字名を入力してデータファイル内の情報を検索するプログラムを作成してください。 # 検索の結果として、該当者が居る場合画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。また、該当者が居ない場合はその旨を表示するようにしてください。 # [3] 環境 #  [3.1] OS: windows7 #  [3.2] コンパイラ名とバージョン: Borland C++ 5.5.1 #  [3.3] 言語:C++ # [4] 期限: 2013/2/1 # [5] その他の制限: 入出力の方法、変数、四則演算、分岐、繰り返し、関数、文字の出入力、文字列、構造体、ファイル処理の範囲内でお願い致します。 '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力してデータファイル内の情報を検索するプログラムを作成してください。 検索の結果として、該当者が居る場合画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示するようにしてください。' :- '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_検索結果,_ローマ字名,_漢字名,_番号,_得点), '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(_検索結果,_ローマ字名,_漢字名,_番号,_得点). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_検索結果,_入力されたローマ字名,_漢字名,_番号,_得点) :- ローマ字名を入力して(_入力されたローマ字名), '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_入力されたローマ字名,_検索結果,_漢字名,_番号,_得点). ローマ字名を入力して(_ローマ字名) :- write('検索するローマ字名を入力してください : '), get_line(_ローマ字名). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_入力されたローマ字名,該当者が居る,_漢字名,_番号,_得点) :- get_split_lines('seiseki.txt',[' ',','],LL), member([_入力されたローマ字名,_漢字名,_番号,_得点],LL). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_,該当者が居ない,_,_,_). '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(該当者が居る,_ローマ字名,_漢字名,_番号,_得点) :- '画面にその情報(ローマ字名、漢字名、番号、得点)を表示し'(_ローマ字名,_漢字名,_番号,_得点), 'なおかつその情報が記載された新しいファイル(kekka.txt)が生成される'(_ローマ字名,_漢字名,_番号,_得点). '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(該当者が居ない,_,_,_,_) :- write('該当者はいません\n'). '画面にその情報(ローマ字名、漢字名、番号、得点)を表示し'(_ローマ字名,_漢字名,_番号,_得点) :- writef('%t %t %t %t\n',[_ローマ字名,_漢字名,_番号,_得点]). 'なおかつその情報が記載された新しいファイル(kekka.txt)が生成される'(_ローマ字名,_漢字名,_番号,_得点) :- '新しいファイル(kekka.txt)が生成される'(Outstream), writef(Outstream,'%t %t %t %t\n',[_ローマ字名,_漢字名,_番号,_得点]), close(Outstream). '新しいファイル(kekka.txt)が生成される'(Outstream) :- open('kekka.txt',write,Outstream). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1337692704/676 # 【 課題 】カンマ区切られているtest.txtのx列のみを取り出し移動平均で値を出しなさい。平均をとる範囲は10とする。 # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】提出期限なし # 【 Ver  】java version "1.7.0_21" # 【 補足 】txtははこちらです。よろしくお願いします。 # www.dotup.org/uploda/www.dotup.org4425870.txt.html # # 'カンマ区切られているtest.txtのx列のみを取り出し移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列,_x列の移動平均ならび) :- 'カンマ区切られているtest.txtのx列のみを取り出し'(_x列,_x列ならび), '移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列ならび,_x列の移動平均ならび). 'カンマ区切られているtest.txtのx列のみを取り出し'(_x列,_x列ならび) :- get_split_lines('test.txt',[','],LL), findall(S,( member(L,LL), nth1(_x列,L,S)), _x列ならび). '移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列ならび,_x列の移動平均ならび) :- findall(_単純移動平均,( 単純移動平均(_x列ならび,10,_単純移動平均)), _x列の移動平均ならび). 単純移動平均(_データならび,_サンプル数,_単純移動平均) :- length(L1,_サンプル数), append(L0,L1,_データならび), 相加平均(L1,_単純移動平均).