このディレクトリの索引

% 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #48 # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/5oepZpDW # #include # double heikin(int a[]); # # int main(void) # { # int data[5],i; # double ave; # for (i=0;i<=4;i++) # { # printf("data[%d]= ",i); # scanf("%d",&data[i]); # } # ave=heikin(data); # printf("heikin=%f \n",ave); # return 0; # } # # double heikin(int a[]) # { # int i,k=0; # for(i=0;i<=4;i++) # { # k=k+a[i]; # } # return((double)k/5); # } # 上記のプログラムに5人の得点(10点満点)を受け取ると、合格者数を戻すgoukaku関数を追加せよ、但し6点以上で合格とする。 # そして5人のテストの得点を整数型配列data[5]の要素にそれぞれ入力すると # 5人の平均点に加えて合格者数も出力するプログラムをheikin関数およびgoukaku関数を利用して作成しなさい。 # '5人の得点(10点満点)を受け取ると、合格者数を戻す述語を定義する。但し6点以上で合格とする。そして5人のテストの得点を入力すると5人の平均点に加えて合格者数も出力する。' :- '5人の得点(10点満点)を受け取ると'(_5人の得点ならび), 平均点を出力する(_5人の得点ならび), '6点以上を取った合格者数を出力する'(_5人の得点ならび). 平均点を出力する(_5人の得点ならび) :- 平均点を戻す(_5人の得点ならび,_平均点), writef('平均点 = %w 点\n',[_平均点]). 平均点を戻す(_5人の得点ならび,_平均点) :- sum_list(_5人の得点ならび,_合計点), _平均点 is _合計点 / 5. '6点以上を取った合格者数を出力する'(_5人の得点ならび) :- '6点以上を取った合格者数を戻す'(_5人の得点ならび,_合格者数), writef('合格者数 = %w 人\n',[_合格者数]). '5人の得点(10点満点)を受け取ると'(_5人の得点ならび) :- findall(_得点,( between(1,5,_), 得点を受け取る(_得点)),_5人の得点ならび). 得点を受け取る(_得点) :- 行入力(_行), '診断: 得点を受け取る'(_行,_得点),!. 得点を受け取る(_得点) :- 得点を受け取る(_得点). '診断: 得点を受け取る'(_行,_得点) :- 行文字列を解析して0から10の範囲の得点を得る(_行,_得点),!. '診断: 得点を受け取る'(_行,_得点) :- writef('入力された %w からは適切な得点が得られません。再入力をお願いします。\n',[_行]), fail. 行文字列を解析して0から10の範囲の得点を得る(_行,_得点) :- 行文字列を解析して(_行,_得点), '0から10の範囲の得点を得る'(_得点). 行文字列を解析して(_行,_得点) :- read_term_from_atom(_行,_得点,[]). '0から10の範囲の得点を得る'(_得点) :- integer(_得点), member(_得点,[0,1,2,3,4,5,6,7,8,9,10]). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). '6点以上を取った合格者数を戻す'(_5人の得点ならび,_合格者数) :- findall(_,( '6点以上で合格とする'(_5人の得点ならび)),L), length(L,_合格者数). '6点以上で合格とする'(_5人の得点ならび) :- member(_得点,_5人の得点ならび), _得点 >= 6. % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒の成績を管理するプログラムを作成する。 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 内容は 数学:70 英語:80 国語:75 理科:80 社会:60 となっている このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(_テキストファイル名ならび), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(_テキストファイル名ならび,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(_テキストファイル名ならび) :- shs('ls -N *.txt',_テキストファイル名ならび). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する([],_,_) :- !. 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(_テキストファイル名,_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の場合は出席番号を表示して行く(_テキストファイル名,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の場合は出席番号を表示して行く([_テキストファイル名|R],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の場合は出席番号を表示する([_テキストファイル名|R],_指定した科目,_指定した点数), 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(R,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の場合は出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数) :- forall(指定した科目で指定した点数の(_テキストファイル名,_指定した科目,_指定した点数), 生徒の出席番号を表示する(_テキストファイル名)). 指定した科目で指定した点数の(_テキストファイル名,_指定した科目,_指定した点数) :- get_split_lines(_テキストファイル名,[' ',':'],_行ならび), member([_指定した科目,_指定した点数],_行ならび). 生徒の出席番号を表示する(_テキストファイル名) :- 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(L1,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1) :- shs('ls -N *.txt',L1). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([],_,_). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_テキストファイル名|R1],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_|R1],_指定した科目,_指定した点数) :- 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(R1,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号) :- get_split_lines(_テキストファイル名,[' ',':'],L), member([_指定した科目,_指定した点数],L), 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 137代目 #936 # お手上げです。頑張ったのですが、できませんでした。 # 申し訳ないですけどお願いします。 # # 問題 # # 複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力するプログラムを作成せよ. # # 【実行例】 # # 何個の文字列を入力しますか?:4 # 入力文字列[1]:Computer # 入力文字列[2]:Science # 入力文字列[3]:Tarou # 入力文字列[4]:Tanaka # # 繋ぎ合わせる順番: # 2 # 4 # 3 # 1 # # 結果:ScienceTanakaTarouComputer # '複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する' :- '複数の文字列を読み込み,'(_複数の,_入力文字列ならび), 'さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する'(_複数の,_入力文字列ならび). '複数の文字列を読み込み,'(_複数の,_入力文字列ならび) :- 複数の(_複数の), findall(_行,( 文字列を読み込み(_複数の,_行)),_入力文字列ならび). 複数の(_複数の) :- 整数を得る('何個の文字列を入力しますか?: ',true,_複数の), writef('文字列を%w行連続して入力してください\n',[_複数の]). 文字列を読み込み(_複数の,_行) :- between(1,_複数の,_), 行入力(_行). 'さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する'(_複数の,_入力文字列ならび) :- 'さらに,それらの文字列を繋ぎ合わせる順番を入力し'(_複数の,_取り出し順ならび), 結果を出力する(_入力文字列ならび,_取り出し順ならび). 'さらに,それらの文字列を繋ぎ合わせる順番を入力し'(_複数の,_取り出し順ならび) :- write('入力した文字列を繋ぎ合わせる順番を入力してください\n'), それらの文字列を繋ぎ合わせる順番を入力し(_複数の,_取り出し順ならび). それらの文字列を繋ぎ合わせる順番を入力し(_複数の,_取り出し順ならび) :- findall(_番目,( 順番を入力し(_複数の,_番目)),_取り出し順ならび). 順番を入力し(_複数の,_番目) :- between(1,_複数の,_), 整数を得る(_番目). 整数を得る(_番目) :- 整数を得る('',true,_番目). 結果を出力する(_入力文字列ならび,_取り出し順ならび) :- 結果を(_入力文字列ならび,_取り出し順ならび,_指定した順番の文字列ならび), 出力する(_指定した順番の文字列ならび). 結果を(_入力文字列ならび,_取り出し順ならび,_指定した順番の文字列ならび) :- findall(_文字列,( 指定順に取り出す(_入力文字列ならび,_取り出し順ならび,_文字列)),_指定した順番の文字列ならび). 指定順に取り出す(_入力文字列ならび,_取り出し順ならび,_文字列) :- member(_番目,_取り出し順ならび), nth1(_番目,_入力文字列ならび,_文字列). 出力する(_指定した順番の文字列ならび) :- 文字列を指定した順番に繋ぎ合わせて(_指定した順番の文字列ならび,_表示文字列), writef('繋ぎ合わせた文字列は: %w\n',[_表示文字列]). 文字列を指定した順番に繋ぎ合わせて(_指定した順番の文字列ならび,_表示文字列) :- atomic_list_concat(_指定した順番の文字列ならび,_表示文字列). 整数を得る(_催促文,_条件,_整数) :- 以下の入力に失敗した場合は再入力する, '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 以下の入力に失敗した場合は再入力する :- repeat. '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- call(_条件). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは :- use_module(library(socket)). :- op(800,xfx,(::)). :- op(850,fx,(!)). (! _目標) :- (keizo97:6013 :: _目標). _ホスト:_ポート :: _目標 :- クライアント(_ホスト,_ポート,findall(_目標,_目標,_目標ならび)), 全解を取り出す(_目標,_目標ならび). クライアント(_ホスト,_ポート, _項) :- 項にfindallを被せて目標として送信する(_ホスト,_ポート,_項,_ソケット,In,Out), ホストから情報受信(In,_行2), 受信情報の評価(_項,_行2,_項2,In,Out). 受信情報の評価(_項,_行2,_項2,In,Out) :- catch(read_term_from_atom(_行2,_項2,[]),E,(ストリームを閉じる(In,Out),fail)), ストリームを閉じる(In,Out), 送信項と受信項の単一化(_項,_項2). ホストから情報受信(In,_行2) :- '% end_of_file行までの表示'(In), 行入力(In,_行2). '% end_of_file行までの表示'(In) :- 行入力(In,_行), '% end_of_file行までの表示'(In,_行). '% end_of_file行までの表示'(In,'% end_of_file') :- !. '% end_of_file行までの表示'(In,_行) :- '% end_of_file行が来るまで表示して行く'(In,_行). '% end_of_file行が来るまで表示して行く'(In,_行) :- format('~w\n',[_行]), 行入力(in,_行2), '% end_of_file行までの表示'(In,_行2). 項にfindallを被せて目標として送信する(_ホスト,_ポート,_項,_ソケット,In,Out) :- サーバと接続する(_ホスト, _ポート,_ソケット), tcp_open_socket(_ソケット, In, Out), 情報を送信する(Out,_項). サーバと接続する(_ホスト, _ポート,_ソケット) :- tcp_socket(_ソケット), tcp_connect(_ソケット, _ホスト:_ポート). 全解を取り出す(P,L) :- member(P,L). 行入力(In,_行) :- read_line_to_codes(In,Codes), atom_codes(_行,Codes). エラー情報の送信(Out,_エラー情報) :- writef('%w\n',[_エラー情報]), format(Out,'~%w\n',[_エラー情報]). 情報を送信する(Out,_項) :- format(Out,'%w\n',[_項]), flush_output(Out). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは :- use_module(library(socket)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(_ポート) :- tcpソケットの準備(_ソケット,_ポート), 接続されたらソケットを開く(_ソケット, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(_ソケット,_ポート) :- tcp_socket(_ソケット), tcp_bind(_ソケット, _ポート), tcp_listen(_ソケット, 5). 接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out) :- tcp_accept(AcceptFd, _ソケット, _Peer), tcp_open_socket(_ソケット, In, Out). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out), 一行読み出し項に変換(In,_項), インタプリタの実行(_ソケット,In,Out,_項). インタプリタの実行(_ソケット,In,Out,_項) :- 親タスクで実行(In,Out,_項), 小タスクで実行(_ソケット,In,Out,_項). 親タスクで実行(In,Out,_項) :- 項は親タスクで実行するべきもの(_項), 親タスクで実行(In,Out,_項), fail. 親タスクで実行(_,_,_項) :- 項は子タスクで実行するべきもの(_項). 項は親タスクで実行するべきもの(_項) :- _項 = findall(_,exec(_),_). 項は子タスクで実行するべきもの(_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項) :- catch(_項,_エラー情報,エラー発生時はfail扱い), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(_ソケット,In,Out,_項) :- tell(Out), thread_create(項を実行して結果を返す(In, Out, _項),_,[]). 項を実行して結果を返す(In, Out, _項) :- 目標評価(In, Out, _項), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 目標評価(In, Out, _項) :- catch(_項,_エラー情報,エラー情報の送信(Out,_エラー情報),!. 目標評価(In, Out, _項) :- _項=false. 一行読み出し項に変換(In,_項,_エラー情報) :- 行入力(In,_行), 行を解析して項を得る(_行,_項,_エラー情報). 行を解析して項を得る(_行,_項,_エラー情報) :- catch(read_term_from_atom(_行,_項,[]),_エラー情報,_項 = false). 行入力(In,_行) :- read_line_to_codes(In,Codes), atom_codes(_行,Codes). エラー情報の送信(Out,_エラー情報) :- format('~w\n',[_エラー情報]), format(Out,'~w\n',[_エラー情報]). 情報を送信する(Out,_項) :- write(Out,'% end_of_file\n'), 項書き出す(Out,_項). 項を書き出す(Out,_項) :- format(Out,'~w\n',[_項]), flush_output(out). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). エラー発生時はfail扱い :- fail. % 以下のサイトは :- use_module(library(socket)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(_ポート) :- tcpソケットの準備(_ソケット,_ポート), 接続されたらソケットを開く(_ソケット, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(_ソケット,_ポート) :- tcp_socket(_ソケット), tcp_bind(_ソケット, _ポート), tcp_listen(_ソケット, 5). 接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out) :- tcp_accept(AcceptFd, _ソケット, _Peer), tcp_open_socket(_ソケット, In, Out). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out), 一行読み出し項に変換(In,_項), インタプリタの実行(_ソケット,In,Out,_項). インタプリタの実行(_ソケット,In,Out,_項) :- 親タスクで実行(In,Out,_項), 小タスクで実行(_ソケット,In,Out,_項). 親タスクで実行(In,Out,_項) :- 項は親タスクで実行するべきもの(_項), 親タスクで実行(In,Out,_項), fail. 親タスクで実行(_,_,_項) :- 項は子タスクで実行するべきもの(_項). 項は親タスクで実行するべきもの(_項) :- _項 = findall(_,exec(_),_). 項は子タスクで実行するべきもの(_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項) :- catch(_項,_エラー情報,エラー発生時はfail扱い), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(_ソケット,In,Out,_項) :- thread_create(項を実行して結果を返す(In, Out, _項),_,[]). 項を実行して結果を返す(In, Out, _項) :- ( catch(_項,_エラー情報,エラー情報の送信(Out,_エラー情報)); _項=false),!, 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 一行読み出し項に変換(In,_項,_エラー情報) :- 行入力(In,_行), 行を解析して項を得る(_行,_項,_エラー情報). 行を解析して項を得る(_行,_項,_エラー情報) :- catch(read_term_from_atom(_行,_項,[]),_エラー情報,_項 = false). 行入力(In,_行) :- read_line_to_codes(In,Codes), atom_codes(_行,Codes). エラー情報の送信(Out,_エラー情報) :- format('~w\n',[_エラー情報]), format(Out,'~w\n',[_エラー情報]). 情報を送信する(Out,_項) :- 項を文字列に変換する(_項,_文字列), 書き出す(Out,_文字列). 書き出す(Out,_文字列) :- format(Out,'~w\n',[_文字列]), flush_output(Out). 項を文字列に変換する(_項,_文字列) :- swritef(String,'%t',[_項]), string_to_atom(String,_文字列). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). エラー発生時はfail扱い :- fail. % 以下のサイトは :- use_module(library(socket)). :- op(800,xfx,(::)). :- op(850,fx,(!)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(Port) :- tcpソケットの準備(Socket,Port), 接続されたらソケットを開く(Socket, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(Socket,Port) :- tcp_socket(Socket), tcp_bind(Socket, Port), tcp_listen(Socket, 5). 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out) :- tcp_accept(AcceptFd, Socket, _Peer), tcp_open_socket(Socket, In, Out). 一行読み出し項に変換(In,Line,_項,E1) :- 行入力(In,Line), catch(read_term_from_atom(Line,_項,[]),E1,_項 = false). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out), 一行読み出し項に変換(In,Line,_項,E1), 親タスクで実行(In,Out,_項), 小タスクで実行(Socket,In,Out,_項). 親タスクで実行(In,Out,_項) :- 親タスクで実行(In,Out,_項,E), fail. 親タスクで実行(In,Out,_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項,E) :- _項 = findall(_,exec(_),_), catch(_項,E,fail), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(Socket,In,Out,_項) :- thread_create(項を実行して結果を返す(In, Out, _項),_,[]). 項を実行して結果を返す(In, Out, _項) :- ( catch(_項,E2,エラー情報の送信(Out,E2)); _項=false),!, 情報を送信する(Out,_項), ストリームを閉じる(In,Out). クライアント(Host, Port, _項) :- 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd), 行入力(ReadFd,Line2), catch(read_term_from_atom(Line2,_項2,[]),E,(ストリームを閉じる(ReadFd,WriteFd),fail)), ストリームを閉じる(ReadFd,WriteFd), 送信項と受信項の単一化(_項,_項2). 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd) :- サーバと接続する(Host, Port,Socket), tcp_open_socket(Socket, ReadFd, WriteFd), 情報を送信する(WriteFd,_項). サーバと接続する(Host, Port,Socket) :- tcp_socket(Socket), tcp_connect(Socket, Host:Port). (! P) :- (keizo97:6013 :: P). Network:Port :: P :- クライアント(Network,Port,findall(P,P,L)), 全解を取り出す(P,L). 全解を取り出す(P,L) :- member(P,L). 行入力(In,Line) :- read_line_to_codes(In,Codes), atom_codes(Line,Codes). エラー情報の送信(Out,E) :- write(E),nl, writeq(Out,E), write(Out,'\n'). 情報を送信する(Out,_項) :- 項を文字列に変換する(_項,_文字列), 書き出す(Out,_文字列). 書き出す(Out,_文字列) :- write(Out,_文字列), write(Out,'\n'), flush_output(Out). 項を文字列に変換する(_項,_文字列) :- swritef(String,'%t',[_項]), string_to_atom(String,_文字列). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは :- use_module(library(socket)). :- op(800,xfx,(::)). :- op(850,fx,(!)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(Port) :- tcpソケットの準備(Socket,Port), 接続されたらソケットを開く(Socket, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(Socket,Port) :- tcp_socket(Socket), tcp_bind(Socket, Port), tcp_listen(Socket, 5). 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out) :- tcp_accept(AcceptFd, Socket, _Peer), tcp_open_socket(Socket, In, Out). 一行読み出し項に変換(In,Line,_項,E1) :- 行入力(In,Line), catch(read_term_from_atom(Line,_項,[]),E1,_項 = false). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out), 一行読み出し項に変換(In,Line,_項,E1), 親タスクで実行(In,Out,_項), 小タスクで実行(Socket,In,Out,_項). 親タスクで実行(In,Out,_項) :- 親タスクで実行(In,Out,_項,E), fail. 親タスクで実行(In,Out,_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項,E) :- _項 = findall(_,exec(_),_), catch(_項,E,fail), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(Socket,In,Out,_項) :- fork(Pid), ( Pid == child -> 項を実行して結果を返す(In, Out, _項), ストリームを閉じる(In,Out), halt; tcp_close_socket(Socket) ). 項を実行して結果を返す(In, Out, _項) :- ( catch(_項,E2,エラー情報の送信(Out,E2)); _項=false),!, 情報を送信する(Out,_項). クライアント(Host, Port, _項) :- 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd), 行入力(ReadFd,Line2), catch(read_term_from_atom(Line2,_項2,[]),E,(ストリームを閉じる(ReadFd,WriteFd),fail)), ストリームを閉じる(ReadFd,WriteFd), 送信項と受信項の単一化(_項,_項2). 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd) :- サーバと接続する(Host, Port,Socket), tcp_open_socket(Socket, ReadFd, WriteFd), 情報を送信する(WriteFd,_項). サーバと接続する(Host, Port,Socket) :- tcp_socket(Socket), tcp_connect(Socket, Host:Port). (! P) :- (keizo97:6013 :: P). Network:Port :: P :- クライアント(Network,Port,findall(P,P,L)), 全解を取り出す(P,L). 全解を取り出す(P,L) :- member(P,L). 行入力(In,Line) :- read_line_to_codes(In,Codes), atom_codes(Line,Codes). エラー情報の送信(Out,E) :- write(E),nl, writeq(Out,E), write(Out,'\n'). 情報を送信する(Out,_項) :- 項を文字列に変換する(_項,_文字列), 書き出す(Out,_文字列). 書き出す(Out,_文字列) :- write(Out,_文字列), write(Out,'\n'), flush_output(Out). 項を文字列に変換する(_項,_文字列) :- swritef(String,'%t',[_項]), string_to_atom(String,_文字列). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 167代目 #309 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&amp;リンク):入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返すプログラム。 # [3] 環境 #  [3.1] OS:Windows #  [3.2] コンパイラ名とバージョン:Visual C++ 2010 #  [3.3] 言語:C++ # [4] 期限:4月18日 '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す' :- '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(0). '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和) :- 入力した奇数の和が20を超えるまで(_入力した奇数の和),!. '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和_1) :- '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1). 入力した奇数の和が20を超えるまで(_入力した奇数の和) :- _入力した奇数の和 > 20. '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1) :- '入力した数が奇数の場合表示する。'(_入力した奇数の和_1). '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1) :- '奇数でない場合はなにもしない。'(_入力した奇数の和_1). '入力した数が奇数の場合表示する。'(_入力した奇数の和_1) :- '入力した数が奇数の場合'(_入力した数), 表示する(_入力した数), _入力した奇数の和_2 is _入力した数 + _入力した奇数の和_1, '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和_2). '入力した数が奇数の場合'(_入力した数) :- 入力した数が(_入力した数), 奇数の場合(_入力した数). '奇数でない場合はなにもしない。'(_入力した奇数の和) :- '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和). 入力した数が(_入力した数) :- 整数を得る('整数を入力して下さい: ',true,_入力した数),!. 奇数の場合(_入力した数) :- 1 is _入力した数 mod 2. 表示する(_入力した数) :- writef('%w\n',[_入力した数]). 整数を得る(_催促文,_条件,_整数) :- write(_催促文), 行を得る(_行), 整数入力検査(_行,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 行を得る(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 整数入力検査(_行,_条件,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査と条件検査(_行,_整数,_条件). 整数検査と条件検査(_行,_整数,_条件) :- 整数検査(_行,_整数), 条件検査(_行,_条件). 整数検査(_行,_整数) :- integer(_整数),!. 整数検査(_整数) :- writef('入力された行 %w から整数は得られません。\n',[_行]), fail. 条件検査(_行,_条件) :- call(_条件),!. 条件検査(_行,_条件) :- writef('入力された行 %w からは、条件 %w が真になりません。\n',[_行,_条件]), fail. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #880 # [1]授業単元:C言語 # [2]問題文 # マインスイーパのような爆弾ゲームプログラムを作成する。 # 1. マス目を8× 8に設定する。 # 2. 爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)。 # 3.まだ指定していないマス目には数字の0の代わりに記号'-'を表示する。 # 4.爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を # 表示する(最小で0、最大で8)。 # 5. 爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字 # の'x'を表示し、"Bomb!"と表示して終了する。 # # [3]環境 # [3.1]windows7 # [3.2]gcc # [3.3]C/C++ # [4]7月20日 # よろしくお願いします。 # マインスイーパ :- 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面). 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面) :- 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面), '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_平坦なならびで表現された盤面). マインスイーパ(_平坦なならびで表現された盤面) :- 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面),!. マインスイーパ(_平坦なならびで表現された盤面) :- マインスイーパを継続する(_平坦なならびで表現された盤面). 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面) :- 度数((member(A,_平坦なならびで表現された盤面),atom(A)),64), write('あなたの勝ちです。\n'). マインスイーパを継続する(_平坦なならびで表現された盤面) :- '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置), マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置) :- 爆弾を隠して盤面を表示する(_平坦なならびで表現された盤面), マス目を選択させる(_行位置,_列位置). マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面),!. マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面), 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面) :- 平坦化した位置に変換(_行位置,_列位置,_nth1), nth1(_nth1,_平坦なならびで表現された盤面,0). 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面) :- 爆弾は周囲にいくつあるか(_nth1,_平坦なならびで表現された盤面,_個数), writef('周囲に爆弾は %w 個あります\n',[_個数]),!. '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 得点は(_平坦なならびで表現された盤面,_得点), 爆弾が置かれたすべてのマス目に小文字のxを表示し(_平坦なならびで表現された盤面), writef('\n Bomb! \n\n\n あなたの得点は %t です\n',[_得点]). 得点は(_平坦なならびで表現された盤面,_得点) :- 度数((member(A,_平坦なならびで表現された盤面),\+(var(A)),A==0),_得点). 爆弾が置かれたすべてのマス目に小文字のxを表示し([]) :- !. 爆弾が置かれたすべてのマス目に小文字のxを表示し(L) :- 爆弾が置かれたすべてのマス目に小文字のxを表示して行く(L). 爆弾が置かれたすべてのマス目に小文字のxを表示して行く([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾が置かれたすべてのマス目に小文字のxを表示し(R). 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 行末まで表示する(A,R). 行末まで表示する(A,R) :- 爆弾を含むマス目表示文字(A,_表示文字), 爆弾を含むマス目表示(R,_表示文字). 爆弾を含むマス目表示(R,_表示文字) :- writef('%w',[_表示文字]), R = [], write('\n'). マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]). 爆弾を含むマス目表示文字(V,'-') :- var(V),!. 爆弾を含むマス目表示文字('x','x') :- !. 爆弾を含むマス目表示文字(_,0). 爆弾を隠して盤面を表示する([]). 爆弾を隠して盤面を表示する([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を隠して盤面を表示する(R). 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 爆弾を隠して行末まで表示する(A,R). 爆弾を隠して行末まで表示する(A,R) :- 爆弾を隠すマス目表示文字(A,_表示文字), 爆弾を隠すマス目表示(_表示文字,R). 爆弾を隠すマス目表示(_表示文字,R) :- writef('%w',[_表示文字]), R = [], write('\n'). 爆弾を隠すマス目表示文字(V,'-') :- var(V),!. 爆弾を隠すマス目表示文字('x','-') :- !. 爆弾を隠すマス目表示文字(_,0). 平坦化した位置に変換(_行位置,_列位置,_nth1) :- _nth1 is (_行位置-1) * 8 + _列位置. 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面) :- length(_平坦なならびで表現された盤面,64). '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(L) :- 爆弾は10個にし(Lp), 同じマス目に重ならないようにランだけに配置する(Lp,L). 爆弾は10個にし(Lp) :- length(Lp,10). 同じマス目に重ならないようにランだけに配置する([],L) :- !. 同じマス目に重ならないようにランだけに配置する([_|R1],L) :- 同じマス目に重ならないようにランダムに一個爆弾を設置する(L), 同じマス目に重ならないようにランだけに配置する(R1,L). 同じマス目に重ならないようにランダムに一個爆弾を設置する(L) :- ランダムに(L,_nth0), 同じマス目に重ならないように一個爆弾を設置する(_nth0,L),!. ランダムに(L,_nth0) :- repeat, _nth0 is random(64). 同じマス目に重ならないように一個爆弾を設置する(_nth0,L) :- 同じマス目に重ならないように(_nth0,L,V), 一個爆弾を設置する(V). 同じマス目に重ならないように(_nth0,L,V) :- nth0(_nth0,L,V), var(V). 一個爆弾を設置する(x). 爆弾は周囲にいくつあるか(N,L,_個数) :- 度数(周囲の八箇所の中で爆弾があるのは(N,L),_個数). 周囲の八箇所の中で爆弾があるのは(N,L) :- 周辺の八箇所の中で(N,_nth1), '_nth1には爆弾がある'(_nth1,L). 周辺の八箇所の中で(N,_nth1) :- member(_式,[N-9,N-8,N-7,N-1,N,N+1,N+7,N+8,N+9]), _nth1 is _式. '_nth1には爆弾がある'(_nth1,L) :- nth1(_nth1,L,V), 変数ではなく爆弾がある(V). 変数ではなく爆弾がある(V) :- 変数ではなく(V), V = x. 変数ではなく(V) :- \+(var(V)). マス目を選択させる(_行位置,_桁位置) :- 整数を得る('マス目の行位置(1-8) ',between(1,8,_行位置),_行位置), 整数を得る('マス目の桁位置(1-8) ',between(1,8,_桁位置),_桁位置),!. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数),!. 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- catch(_条件,E,fail),!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数). 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- _条件,!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 - 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]-R[i] (ただし、j>i とする) の最大値を求めてください。' :- 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび), 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび) :- 時系列数を得る(_時系列数), 時刻tに於ける価格ならびを得る(_時系列数,_時刻tに於ける価格ならび). 時刻tに於ける価格ならびを得る(_時系列数,_時刻tに於ける価格ならび) :- findall(_価格,( 時刻tに於ける価格(_時系列数,_価格)),_時刻tに於ける価格ならび). 時刻tに於ける価格(_時系列数,_価格) :- between(1,_時系列数,_t), 価格を得る(_価格). 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大価格差,( 為替差の利益(_時刻tに於ける価格ならび,_時刻tの投資に対する最大価格差)),_最大の為替差の利益). 為替差の利益(_時刻tに於ける価格ならび,_時刻tの投資に対する最大価格差) :- append(_,[_時刻tの価格|_その後の価格ならび],_時刻tに於ける価格ならび), 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差). 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差) :- findmax(_時刻tの価格との価格差,( 時刻tの投資に対する価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差)),_時刻tの投資に対する最大価格差). 時刻tの投資に対する価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差) :- member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格. 時系列数を得る(_時系列数) :- 数を得る(_時系列数). 価格を得る(_価格) :- 数を得る(_価格). 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). 数を得る(_数) :- 行入力(_行), 数入力検査(_行,_数). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 数入力検査(_行,_数) :- read_term_from_atom(_行,_数,[]), number(_数). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 134代目 #154 # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/www.acm-japan.org/past-icpc/domestic2008/problems/all_ja.html # 等しい合計点 # # 太郎と花子はそれぞれカードを何枚か持っている. # 各カードには点数が書かれている.太郎のカードと花子のカードを 1 枚ずつ交換して, # それぞれの持つカードの合計点数が等しくなるようにしたい. # どのカードとどのカードを交換したらよいか. # # ただし,カードを交換しなくても合計点数が等しい場合でも,必ずカードの交換を行うものとする. # Input # 入力は,いくつかのデータセットからなる.各データセットは次の形式で与えられ # # n m # s1 # s2 # ... # 各データセットの最初の行は空白ひとつで区切られたふたつの数 n と m を含み, # n は太郎のカードの枚数,m は花子のカードの枚数を表す.続く n+m 行には, # 各カードの点数が 1 行にひとつずつ並ぶ. # 最初の n 個の点数 (s1 から sn まで) は太郎のカードの点数, # 残りの m 個の点数 (sn+1 から sn+m まで) は花子のカードの点数を表す. # n および m は 100 以下の正の整数とし,カードの点数は 0 以上 100 以下の整数値とする. # # 入力の終わりは,空白ひとつで区切られたふたつの 0 を含む 1 行で示される. '太郎の手札と花子の手札を 1 枚ずつ交換して,それぞれの持つ手札の合計点数が等しくなるようにしたい' :- 太郎と花子の手札を読み込む(_太郎の手札ならび,_花子の手札ならび), '太郎の手札と花子の手札を 1 枚ずつ交換して,それぞれの持つ手札の合計点数が等しくする'(_太郎の手札ならび,_花子の手札ならび,_太郎の手札から抜いた手札,_花子の手札から抜いた手札). 太郎と花子の手札を読み込む(_太郎の手札ならび,_花子の手札ならび) :- '行を入力し、空白を区切りに太郎の手札の枚数と花子の手札の枚数を得る'(_太郎の手札の枚数,_花子の手札の枚数), '点数を入力し、太郎と花子に分配する'(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札ならび,_花子の手札ならび). '行を入力し、空白を区切りに太郎の手札の枚数と花子の手札の枚数を得る'(_太郎の手札の枚数,_花子の手札の枚数) :- 行を文字コードとして読み取る(_文字コードならび), '空白のコードを区切りに、文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(_文字コードならび,_太郎の手札の枚数,_花子の手札の枚数). '空白を区切りに太郎の手札の枚数と花子の手札の枚数を得る'(_太郎の手札の枚数,_花子の手札の枚数) :- 行を文字コードとして読み取る(_文字コードならび), '空白のコードを区切りに、文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(_文字コードならび,_太郎の手札の枚数,_花子の手札の枚数). 行を文字コードとして読み取る(_文字コード) :- get_line_to_codes(user_input,_文字コード). 整数を得る(_整数) :- 行を得る(_行), 行を整数に変換する(_行,_整数). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). 行を得る(_行) :- get_line_to_codes(user_input,_文字コードならび), atom_codes(_行,文字コードならび). '空白のコードを区切りに、文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(_文字コードならび,_太郎の手札の枚数,_花子の手札の枚数) :- '空白のコードを区切りに、'(_文字コードならび,L1,L2), '文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(L1,L2,_太郎の手札の枚数,_花子の手札の枚数). '空白のコードを区切りに、'(_文字コードならび,L1,L2) :- append(L1,[32|L2],_文字コードならび). '文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(L1,L2,_太郎の手札の枚数,_花子の手札の枚数) :- number_codes(_太郎の手札の枚数,L1), number_codes(_花子の手札の枚数,L2). '点数を入力し、太郎と花子に分配する'(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札,_花子の手札) :- 太郎と花子の手札を読み込む(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札,_花子の手札). 太郎と花子の手札を読み込む(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札,_花子の手札) :- 太郎の手札を読み込む(_太郎の手札の枚数,_太郎の手札), 花子の手札を読み込む(_花子の手札の枚数,_花子の手札),!. 太郎の手札を読み込む(_太郎の手札の枚数,_太郎の手札) :- findnsols(_整数,_太郎の手札の枚数,( 連続して整数を読み込む(_整数)),_太郎の手札). 花子の手札を読み込む(_花子の手札の枚数,_花子の手札) :- findnsols(_整数,_花子の手札の枚数,( 連続して整数を読み込む(_整数)),_花子の手札). 連続して整数を読み込む(_整数) :- repeat, 整数を得る(_整数). '太郎の手札と花子の手札を 1 枚ずつ交換して,それぞれの持つ手札の合計点数が等しくする'(_太郎の手札,_差し替える太郎の手札,_花子の手札,_差し替える花子の手札,_等しい合計) :- '太郎の手札と花子の手札を 1 枚ずつ交換して'(_太郎の手札,_花子の手札,_差し替える太郎の手札,_差し替える花子の手札,_差し替えた太郎の手札,_差し替えた花子の手札), 合計点数が等しい(_差し替えた太郎の手札,_差し替えた花子の手札,_等しい合計). '太郎の手札と花子の手札を 1 枚ずつ交換して'(_太郎の手札,_花子の手札,_太郎の手札から抜いた手札,_花子の手札から抜いた手札,_差し替えた太郎の手札,_差し替えた花子の手札) :- select(_太郎の手札から抜いた手札,_太郎の手札ならび,_花子の手札から抜いた手札,_差し替えた太郎の手札ならび), select(_花子の手札から抜いた手札,_花子の手札,_太郎の手札から抜いた手札,_差し替えた花子の手札). 合計点数が等しい(_差し替えた太郎の手札,_差し替えた花子の手札,_等しい合計) :- sum_list(_差し替えた太郎の手札,_等しい合計), sum_list(_差し替えた花子の手札,_等しい合計). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/505 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): #  キーボードから正負の整数をデタラメに入力し、整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ # 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数の和,_5つの正の整数の平均) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'([],_5つの正の整数ならび), 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均). 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび,_正の整数ならび) :- 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび),!. 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび). 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび) :- length(_正の整数ならび,5). 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数), '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2), 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_2,_正の整数ならび). 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 整数を入力する(_整数),!. 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数). 整数を入力する(_整数) :- 行入力(_行), '診断 :: 整数'(_行,_整数). '診断 :: 整数'(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2) :- _整数 >= 0, append(_正の整数ならび_1,[_整数],_正の整数ならび_2). '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_1) :- _整数 < 0. 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均) :- sum_list(_5つの正の整数ならび,_5つの正の整数の和), _5つの正の整数の平均 is floor((_5つの正の整数の和 / 5) * 10 + 0.5) / 10. 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 143代目 #7 # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した三つの整数値の平均値を求めるプログラムを作成しなさい。 # ただし、平均値を求める関数 float ave(int a,int b) # を利用すること。 % % ave()の代わりに述語 二項平均/3 を使うこととする。 % キーボードから入力した三つの整数値の平均値を求める :- 三つの整数値を得る(_整数の一,_整数の二,_整数の三), 三項平均を二項平均だけから求める(100,_整数の一,_整数の二,_整数の三,_平均値), 平均値表示(_平均値). 三つの整数値を得る(_整数の一,_整数の二,_整数の三) :- キーボードから入力した整数値(_整数の一), キーボードから入力した整数値(_整数の二), キーボードから入力した整数値(_整数の三). 三項平均を二項平均だけから求める(N,_平均値の一,_平均値の二,_平均値の三,_平均値) :- '終了条件::三つの平均値が一致した時か、Nが0に至った時'(N,_平均値の一,_平均値の二,_平均値の三,_平均値),!. 三項平均を二項平均だけから求める(N,_整数の一,_整数の二,_整数の三,_平均値) :- '終了条件に達するまで、三項平均を二項平均だけから求める'(N,_整数の一,_整数の二,_整数の三,_平均値). '終了条件::三つの平均値が一致した時か、Nが0に至った時'(_,_平均値,_平均値,_平均値,_平均値). '終了条件::三つの平均値が一致した時か、Nが0に至った時'(0,_平均値,_,_,_平均値). '終了条件に達するまで、三項平均を二項平均だけから求める'(N,_整数の一,_整数の二,_整数の三,_平均値) :- 三項の組合せに対して二項平均を取る(_整数の一,_整数の二,_整数の三,_二項平均の一,_二項平均の二,_二項平均の三), succ(N_1,N), 三項平均を二項平均だけから求める(N_1,_二項平均の二,_二項平均の三,_二項平均の一,_平均値). 三項の組合せに対して二項平均を取る(_整数の一,_整数の二,_整数の三,_二項平均の一,_二項平均の二,_二項平均の三) :- 二項平均(_整数の一,_整数の二,_二項平均の一), 二項平均(_整数の一,_整数の三,_二項平均の二), 二項平均(_整数の二,_整数の三,_二項平均の三). 二項平均(_第一項,_第二項,_二項平均) :- _二項平均 is (_第一項 + _第二項) / 2. 平均値表示(_平均値) :- writef('平均値は %t です。\n',[_平均値]). キーボードから入力した整数値(_整数) :- write('整数を入力してください : '), 行入力(Line), キーボードから入力した整数値診断(Line,_整数),!. キーボードから入力した整数値(_整数) :- キーボードから入力した整数値(_整数). キーボードから入力した整数値診断(Line,_整数) :- read_term_from_atom(Line,_整数,[]), integer(_整数),!. キーボードから入力した整数値診断(Line,_整数) :- writef('入力された %t からは整数は得られません。再入力をお願いします。\n',[Line]), fail. 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/456 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10195.txt # # 今回はナップサック問題について考えプログラムを作成する。N個の荷物があって、個々の荷物の重さをWi、値段をPiとする。但しiは1からNの整数を意味する。 # 袋には最大Wの重さまで入れられるとすると、最大でいくら分を入れることができるか?という問題。 # データファイルは、始めの一行に荷物の個数Nが書かれており、次に重さが整数でN行分書かれている。その次の行からN行分、それぞれの荷物の価値が書かれているとする。 # 下のデータファイルの場合は、3個の荷物があり、重みは10、20、13、で # それぞれの値段は23、23、10という状況を表す。 # ------------------- # 3 # 10 # 20 # 13 # 23 # 23 # 10 # ------------------- # 荷物の重みと値段はともに、1から100までの乱数で与えることとする。 # void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている # ファイル名のファイルを開き、そこにデータを記録する。void_read_data_file(char*file)という関数を呼ぶと、文字列変数fileによって名前が指定されたファイルを開き、大域変数の荷物の重み配列W[]と値段配列[]\\\\\にデータを入力する。 '荷物の重みと値段はともに、1から100までの乱数で与えることとする。 void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている ファイル名のファイルを開き、そこにデータを記録する。'(_ファイル名,N) :- ファイル名のファイルを開き(_ファイル名), 'そこにデータを記録する。'(N), ファイルを閉じる. ファイル名のファイルを開き(_ファイル名) :- tell(_ファイル名). 'そこにデータを記録する。'(N) :- writef('%w\n',[N]), forall((between(1,N,_),X is random(100) + 1),writef('%w\n',[X])), forall((between(1,N,_),Y is random(100) + 1),writef('%w\n',[Y])). ファイルを閉じる :- told. ナップサック問題(_ファイル名,N,_許容最大重量,_詰めることのできる最高合計金額) :- データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび), findmax(_合計価格,詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_,_合計価格),_詰めることのできる最高合計金額). データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび) :- データファイルから読み出す(_ファイル名,N,_整数ならび), 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび). データファイルから読み出す(_ファイル名,N,L1) :- see(_ファイル名), get_integer(N), get_integers(L1), seen. 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび) :- length(_重さならび,N), length(_価格ならび,N), append(_重さならび,_価格ならび,_整数ならび). 詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_集合,_合計価格) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格). 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格) :- 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合), 集合の合計価格(_集合,_価格ならび,_合計価格). 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合) :- member(_集合,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合) :- '集合の重量合計は'(_集合,_重さならび,_合計重量), _合計重量 =< _許容最大重量. '集合の重量合計は'(_集合,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_集合), nth1(_要素,_重さならび,Wi)),_合計重量). 集合の合計価格(_集合,_価格ならび,_合計価格) :- findsum(Pi,( member(_要素,_集合), nth1(_要素,_価格ならび,Pi)),_合計価格). get_integers(L) :- findall(I,(repeat,get_line(Line),(Line=end_of_file,!,fail;read_term_from_atom(Line,I,[]))),L),!. 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). get_integer(N) :- get_line(Line), read_term_from_atom(Line,N,[]). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #812 # [1] 授業単元:c 反復処理 # [2] 問題文(含コード&リンク): # 整数 a をキーボードから入力し,a が素数かどうか判断するプログラムを作成しなさい.(2〜a/2で整数aを割ったときに全ての値で割り切れなければ,aは素数である.) # サイズm(m<=10)の整数型配列変数aをキーボードから受け取り,a[0],a[1],...,a[n-1]のうちの最大値をディスプレイに表示するプログラムを完成しなさい. # '整数 a をキーボードから入力し,a が素数かどうか判断する' :- '整数 a をキーボードから入力し'(_a), 'a が素数かどうか判断する'(_a,_素数かどうかの判断), writef('%t は %t\n',[_a,_素数かどうかの判断]). '整数 a をキーボードから入力し'(_a) :- 整数を得る('整数 a',_a). 'a が素数かどうか判断する'(_a,素数である) :- _除数になりうる最大値 is _a // 2, 'a が素数かどうか判断する'(2,_除数になりうる最大値,_a),!. 'a が素数かどうか判断する'(_,素数ではない). 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_) :- _除数 > _除数になりうる最大値. 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_a) :- 'a が除数で割り切れない限り除数を1ずつ加算して行って判断する'(_除数,_除数になりうる最大値,_a). 'a が除数で割り切れない限り除数を1ずつ加算して行って判断する'(_除数,_除数になりうる最大値,_a) :- 'a が除数で割り切れない限り'(_a,_除数), 除数を1ずつ加算して(_除数,_次の除数), 'a が素数かどうか判断する'(_次の除数,_除数になりうる最大値,_a). 'a が除数で割り切れない限り'(_a,_除数) :- \+(0 is _a mod _除数). 除数を1ずつ加算して(_除数,_次の除数) :- succ(_除数,_次の除数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 164代目 #833 # お願いします。 # [1] 情報処理演習 # [2] 自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力するプログラムを作 # 成せよ. #  [3.1] Linux #  [3.2] コンパイラ名とバージョン:visual studio 2010 #  [3.3] C言語 # [4] 指定なし # [5] 特になし # # '自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力する' :- '自然数n > 0 を入力として,'(_n), 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数),!. '自然数n > 0 を入力として,'(_n) :- 整数を得る('0より大きい自然数',_n > 0,_n). 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数), 出力する(_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を'(_n,L), 一つ(L,_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を'(_n,L) :- findall(_その自明でない約数,'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数),L). 'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数) :- _n_1 is _n - 1, between(2,_n_1,_その自明でない約数), 0 is _n mod _その自明でない約数. 一つ([H|T],_その自明でない約数) :- length([H|T],Len), _乱数 is random(Len), nth0(_乱数,[H|T],_その自明でない約数). 出力する(_その自明でない約数) :- writef('%t\n',[_その自明でない約数]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 164代目 #833 # お願いします。 # [1] 情報処理演習 # [2] 自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力するプログラムを作 # 成せよ. #  [3.1] Linux #  [3.2] コンパイラ名とバージョン:visual studio 2010 #  [3.3] C言語 # [4] 指定なし # [5] 特になし # # '自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力する' :- '自然数n > 0 を入力として,'(_n), 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数),!. '自然数n > 0 を入力として,'(_n) :- 整数を得る('0より大きい自然数',_n > 0,_n). 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数), 出力する(_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を'(_n,L), 一つ(L,_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を'(_n,L) :- findall(_その自明でない約数,'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数),L). 'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数) :- _n_1 is _n - 1, between(2,_n_1,_その自明でない約数), 0 is _n mod _その自明でない約数. 一つ([H|T],_その自明でない約数) :- length([H|T],Len), _乱数 is random(Len), nth0(_乱数,[H|T],_その自明でない約数). 出力する(_その自明でない約数) :- writef('%t\n',[_その自明でない約数]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典 :: CodeIQ q1565 # 【問題】 # できるだけ多くの人数で、肩車をしようと思います。 #      # # 肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。 # # # 【例】 # 一行ごとに、身長と体重のセットが与えられます。次の例は、5人の身長と体重を表しています。 # 166 71 # 178 84 # 176 94 # 174 85 # 174 65 # # # この中から肩車をする人間を選ぶと、身長と体重が # (166, 71) # (174, 85) # (176, 94) # の3人が最大人数になります。 # # ※身長と体重共に、上の人が下の人“より小さい”場合に肩車が許されるとしていますので、 #  (174, 85)の上に(174, 65)が乗ることはできません。 'できるだけ多くの人数で、肩車をしようと思います。      肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_最大人数) :- 身長と体重のセットを得る(_身長と体重のセット), 'できるだけ多くの人数で、肩車をしようと思います。'(_身長と体重のセット,_最大人数). 身長と体重のセットを得る(_身長と体重のセット) :- 行を得る(_行,_終了状態), 身長と体重のセットを得る(_終了状態,_行,_身長と体重のセット). 身長と体重のセットを得る(入力終了,_,[]) :- !. 身長と体重のセットを得る(_,_行,_身長体重ならび) :- 入力終了になるまで行入力を続ける(_,_行,_身長体重ならび). 入力終了になるまで行入力を続ける(_,_行,[[_身長,_体重]|_残りの行ならび]) :- read_term_from_atom(_行,(_身長,_体重),[]), 行を得る(_次の行,_終了状態), 身長と体重のセットを得る(_終了状態,_次の行,_残りの行ならび). 'できるだけ多くの人数で、肩車をしようと思います。'(_人間ならび,_最大人数) :- findall(_肩車人数,( 肩車人数(_人間ならび,_肩車人数)),_肩車人数ならび), max_list(_肩車人数ならび,_最大人数). 肩車人数(_人間ならび,_肩車人数) :- select(_取りだされた人間,_人間ならび,_残りの人間ならび), 肩車を重ねる(_取りだされた人間,_残りの人間ならび,_肩車重ね), length(_肩車重ね,_肩車人数). 肩車を重ねる(_自分,_人間ならび,[_自分|_肩車重ね]) :- 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね). 肩車を重ねる(_一番上の人間,_,[_一番上の人間]). 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね) :- select(_上の人間,_人間ならび,_残りの人間ならび), '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_上の人間,_自分), 肩車を重ねる(_上の人間,_残りの人間ならび,_肩車重ね). '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'([_上の人間の身長,_上の人間の体重],[_自分の身長,_自分の体重]) :- _上の人間の身長 @< _自分の身長, _上の人間の体重 @< _自分の体重. 行を得る(_行,_終了状態) :- get_char(_文字), 行を得る(_文字,_文字ならび,_終了状態), atomic_list_concat(_文字ならび,_行). 行を得る(_入力文字,[],_終了状態) :- 入力文字が改行文字またはend_of_fileの時停止する(_入力文字,_終了状態),!. 行を得る(_文字,_行ならび,_終了状態) :- 行を得るために文字入力を続ける(_文字,_行ならび,_終了状態). 入力文字が改行文字またはend_of_fileの時停止する('\n',改行終了). 入力文字が改行文字またはend_of_fileの時停止する(end_of_file,入力終了). 行を得るために文字入力を続ける(_文字,[_文字|_残りの文字ならび],_終了状態) :- get_char(_次の文字), 行を得る(_次の文字,_残りの文字ならび,_終了状態). % 以下のサイトは # 出典 :: CodeIQ q1565 # 【問題】 # できるだけ多くの人数で、肩車をしようと思います。 #      # # 肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。 # # # 【例】 # 一行ごとに、身長と体重のセットが与えられます。次の例は、5人の身長と体重を表しています。 # 166 71 # 178 84 # 176 94 # 174 85 # 174 65 # # # この中から肩車をする人間を選ぶと、身長と体重が # (166, 71) # (174, 85) # (176, 94) # の3人が最大人数になります。 # # ※身長と体重共に、上の人が下の人“より小さい”場合に肩車が許されるとしていますので、 #  (174, 85)の上に(174, 65)が乗ることはできません。 'できるだけ多くの人数で、肩車をしようと思います。      肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_最大人数) :- 身長と体重のセットを得る(_身長と体重のセット), 'できるだけ多くの人数で、肩車をしようと思います。'(_身長と体重のセット,_最大人数). 身長と体重のセットを得る(_身長と体重のセット) :- 行を得る(_行,_終了状態), 身長と体重のセットを得る(_終了状態,_行,_身長と体重のセット). 身長と体重のセットを得る(入力終了,_,[]) :- !. 身長と体重のセットを得る(_,_行,_身長体重ならび) :- 入力終了になるまで行入力を続ける(_,_行,_身長体重ならび). 入力終了になるまで行入力を続ける(_,_行,[[_身長,_体重]|_残りの行ならび]) :- read_term_from_atom(_行,(_身長,_体重),[]), 行を得る(_次の行,_終了状態), 身長と体重のセットを得る(_終了状態,_次の行,_残りの行ならび). 'できるだけ多くの人数で、肩車をしようと思います。'(_人間ならび,_最大人数) :- findall(_肩車人数,( 肩車人数(_人間ならび,_肩車人数)),_肩車人数ならび), max_list(_肩車人数ならび,_最大人数). 肩車人数(_人間ならび,_肩車人数) :- select(_取りだされた人間,_人間ならび,_残りの人間ならび), 肩車を重ねる(_取りだされた人間,_残りの人間ならび,_肩車重ね), length(_肩車重ね,_肩車人数). 肩車を重ねる(_自分,_人間ならび,[_自分|_肩車重ね]) :- 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね). 肩車を重ねる(_一番上の人間,_,[_一番上の人間]). 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね) :- select(_上の人間,_人間ならび,_残りの人間ならび), '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_上の人間,_自分), 肩車を重ねる(_上の人間,_残りの人間ならび,_肩車重ね). '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'([_上の人間の身長,_上の人間の体重],[_自分の身長,_自分の体重]) :- _上の人間の身長 @< _自分の身長, _上の人間の体重 @< _自分の体重. 行を得る(_行,_終了状態) :- get_char(_文字), 行を得る(_文字,_文字ならび,_終了状態), atomic_list_concat(_文字ならび,_行). 行を得る(_入力文字,[],_終了状態) :- 入力文字が改行文字またはend_of_fileの時停止する(_入力文字,_終了状態),!. 行を得る(_文字,_行ならび,_終了状態) :- 行を得るために文字入力を続ける(_文字,_行ならび,_終了状態). 入力文字が改行文字またはend_of_fileの時停止する('\n',改行終了). 入力文字が改行文字またはend_of_fileの時停止する(end_of_file,入力終了). 行を得るために文字入力を続ける(_文字,[_文字|_残りの文字ならび],_終了状態) :- get_char(_次の文字), 行を得る(_次の文字,_残りの文字ならび,_終了状態). % 以下のサイトは # 出典 :: CodeIQ q1385 言語不問:通分と約分を実装しよう # # 小学生が分数を学ぶときに、最初に躓くのが「通分」です。 # # 分母の異なる分数の足し算や引き算を行うとき、先に通分を行っておく必要があります。 # # また、計算した結果、「約分」できる場合は、可能な限り簡単な分数にしないと正解になりません。 # # 【問題】 # # では、入力される二つの分数について足し算を行った時に、 # # 正しい答えを出力するプログラムを作り、 # # 問1〜問5の標準入力に対して、出力内容を答えてください。 # # ※分母が1の時には整数として出力してください。 # # ■例 # # 例1) # # 【標準入力】 # # 5/6 # # 1/10 # # 【標準出力】 # # 14/15 # # 例2) # # 【標準入力】 # # 1/3 # # 2/3 # # 【標準出力】 # # 1 # # ■問1〜5 # # 問1) # # 1/3 # # 2/7 # # 問2) # # 2/8 # # 3/5 # # 問3) # # 3/10 # # 1/6 # # 問4) # # 3/4 # # 5/8 # # 問5) # # 2/5 # # 2/3 # # 【解答方法】 # # 解答用テキストファイルanswer_q1385.txtをダウンロードし、必要事項をご記入ください。 # # 必須事項がすべて記入されていることをご確認いただいた後、テキストファイルのままアップロードしてください。 # # 【注意】 # # ・ご提出いただいたプログラムは個別に実行テストを行いますので、 # #  解答用テキストファイルに書かれた解答が正解していても最高評価になるとは限りません。 # # ・プログラミング言語は不問ですが、古すぎる実行環境・特殊な設備を要する実行環境では採点できない場合がございます。 # # ・使用する言語は1解答につき必ず1種類でお願いします。 # #  どうしても複数の言語を用いる場合は、解答に「メインの言語名」を明記してください。 # '問1〜問5の標準入力に対して、出力内容を答えてください。 ■問1〜5 問1) 1/3 2/7 問2) 2/8 3/5 問3) 3/10 1/6 問4) 3/4 5/8 問5) 2/5 2/3' :- between(1,5,N), '入力される二つの分数について足し算を行った時に、正しい答えを出力する', N = 5. '入力される二つの分数について足し算を行った時に、正しい答えを出力する' :- 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2), 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _加算された分母), 約分(_加算された分子 / _加算された分母,_約分された分子 / _約分された分母), 答えを出力する(_約分された分子 / _約分された分母). 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _通分された分母) :- 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _通分された分母,_通分された分子_2 / _通分された分母), _加算された分子 is _通分された分子_1 + _通分された分子_2,!. 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2) :- 入力される分数(_分子_1 / _分母_1), 入力される分数(_分子_2 / _分母_2). 入力される分数(_分子 / _分母) :- 行入力(_行), read_term_from_atom(_行,_分子 / _分母,[]). 行入力(_行) :- get_char(_先読み文字), 行ならびを得る(_先読み文字,_行ならび), atom_chars(_行,_行ならび). 行ならびを得る('\n',[]) :- !. 行ならびを得る(_先読み文字,[_先読み文字|R]) :- get_char(_次の文字), 行ならびを得る(_次の文字,R). 答えを出力する(_約分された分子 / _約分された分母) :- writef('%t\n',[_約分された分子 / _約分された分母]). 約分(_分子 / _分母,X) :- 最大公約数で分子分母を割って約分する(_分子,_分母,_分子_1,_分母_1), 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子_2,_分母_2), 分母が1の時は整数に変形(_分子_2,_分母_2,X). 最大公約数で分子分母を割って約分する(_分子_1,_分母_1,_分子,_分母) :- 最大公約数(_分子_1,_分母_1,_最大公約数), _分子 is _分子_1 // _最大公約数, _分母 is _分母_1 // _最大公約数. 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子,_分母) :- 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母),!. 負数の場合のマイナス符号は分子側に付ける(_分子,_分母,_分子,_分母). 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母) :- _分母_1 =< 0, _分子 is _分子_1 * -1, _分母 is _分母_1 * -1. 分母が1の時は整数に変形(_分子,1,_分子) :- !. 分母が1の時は整数に変形(_分子,1.0,_分子) :- !. 分母が1の時は整数に変形(_分子,_分母,_分子 / _分母). 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _最小公倍数,_通分された分子_2 / _最小公倍数) :- 最小公倍数([_分母_1,_分母_2],_最小公倍数), _通分された分子_1 is _分子_1 * (_最小公倍数 // _分母_1), _通分された分子_2 is _分子_2 * (_最小公倍数 // _分母_2). 最大公約数([_整数],_整数). 最大公約数([_整数|R],_最大公約数) :- 最大公約数(R,_最大公約数_2), 二つの整数の最大公約数(_整数,_最大公約数_2,_最大公約数). 二つの整数の最大公約数(M,N,X) :- 二つの整数の絶対値をとる(M,N,M_2,N_2), 最大公約数をユークリッドの互除法で求める(M_2,N_2,Y), 負数解の可能性も探る(M,M_2,N,N_2,Y,X). 負数解の可能性も探る(M,M_2,N,N_2,Y,X) :- setof(X,[M,M_2,N,N_2,Y,X] ^ 負数解の可能性(M,M_2,N,N_2,Y,X),L), member(X,L). 負数解の可能性(M,M_2,_,_,Y,X) :- X is Y * (M // M_2). 負数解の可能性(_,_,N,N_2,Y,X) :- X is Y * (N // N_2). 二つの整数の絶対値をとる(M,N,M_2,N_2) :- M_2 is abs(M), N_2 is abs(N). 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最小公倍数(_整数_1,_整数_2,_最小公倍数) :- 二つの整数の最小公倍数(_整数_1,_整数_2,_最小公倍数). 最小公倍数(_整数ならび,_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(_整数ならび,_最小公倍数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数],_整数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数|R],_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(R,_最小公倍数_1), 二つの整数の最小公倍数(_整数,_最小公倍数_1,_最小公倍数). 二つの整数の最小公倍数(A,B,X) :- 二つの整数の最大公約数(A,B,_最大公約数), X is A * B // _最大公約数. % 以下のサイトは # 出典 :: CodeIQ q1347 # # 3人の几帳面な男たちがいました。 # ジェシー「みかんをたくさん頂いたんだ。みんなで分けようYO!」 # ダニエル「イイネ!…ええと、みかんは全部で30個あるみたいだから、ひとり10個ずつならきちんと分けられるNE!」 # ジョゼフ「それだけじゃダメだYO!みかんは一つひとつ大きさが違うんだから、その辺も考えてきっちり分けNIGHT!」 # # # 【問題】 # # 30個のみかんがあります。3人で10個ずつ分けようと思いますが、不公平にならないよう、みかんの重さの合計が均一になるように分けてください。たとえば、次のような重さのみかん6個 # 101g # 103g # 110g # 105g # 114g # 112g # # を、3人で2つずつ分ける場合、重さの合計が等しくなるように分けると # (101g, 114g) # (103g, 112g) # (105g, 110g) # # のように、合計が215グラムになるように分けることができます。 # # みかんの重さのデータを標準入力から読み込み、それを重さの合計・個数ともに3等分するプログラムを書いてください。 # # # 【入力】 # # 入力はテキストファイルで用意されています。これを標準入力から読み込んでください。 # 入力ファイルの1行目には、みかんの個数Nが与えられます。 # 2行目以降のN行分が、みかんの重さ(正の整数)です。 # # # 【出力】 # # 標準出力に、3等分したみかんのグループを出力してください。 # 1行につき1グループ、計3行を出力します。それ以外は出力しないでください。 # 分け方が複数ある場合、その中の1種類だけを出力してください。 # # # 【入出力例】 # # - sample1.in.txt # 6 # 101 # 103 # 110 # 105 # 114 # 112 # # - sample1.out.txt # (101, 114) # (103, 112) # (105, 110) # # # # - sample2.in.txt # 12 # 147 # 105 # 99 # 116 # 105 # 119 # 93 # 132 # 123 # 95 # 101 # 82 # # - sample2.out.txt # (82, 105, 105, 147) # (93, 95, 119, 132) # (99, 101, 116, 123) '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル) :- '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計), 配分した候補を得て(_みかんの重さならび,_一人あたりの重さ合計,_重複を許す配分した候補), 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補). '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計) :- 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび), sum_list(_みかんの重さならび,_みかんの重さの合計), _一人あたりの重さ合計 is _みかんの重さの合計 // 3. 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび) :- see(_入力ファイル), 先頭行から行数を得る(_みかんの個数), 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび), seen. 先頭行から行数を得る(_行数) :- 整数入力(_行数). 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび) :- findall(_みかんの重さ,( between(1,_みかんの個数,_), 整数入力(_みかんの重さ)),_みかんの重さならび). 配分した候補を得て(_みかんの重さならび,_合計目標,_重複を許す配分した候補) :- findall(LL,同量に配分する(_みかんの重さならび,_合計目標,[],LL),_重複を許す配分した候補). 同量に配分する([],_,LL,LL). 同量に配分する(_みかんの重さならび,_合計目標,LL1,LL) :- 組み合計を得る(_みかんの重さならび,_合計目標,[],L,_残りみかんの重さならび), forall(member(L1,LL1),L1 @>= L), 同量に配分する(_残りみかんの重さならび,_合計目標,[L|LL1],LL). 組み合計を得る(_残りみかんの重さならび,_合計目標,L,L,_残りみかんの重さならび) :- sum_list(L,_合計目標). 組み合計を得る(_みかんの重さならび_1,_合計目標,L1,L,_残りみかんの重さならび) :- select(_一個,_みかんの重さならび_1,_残りみかんの重さならび_2), forall(member(A,L1),A @>= _一個), 組み合計を得る(_残りみかんの重さならび_2,_合計目標,[_一個|L1],L,_残りみかんの重さならび). 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補) :- 重複なく昇順に整列する(_重複を許す配分した候補,_候補リスト), 一行ずつ出力する(_出力ファイル,_候補リスト). 重複なく昇順に整列する(L1,L2) :- 重複なく昇順に整列する(L1,[],L2). 重複なく昇順に整列する([],L,L). 重複なく昇順に整列する([_軸要素|L1],L2,L3) :- 重複のない昇順分割(_軸要素,L1,LS,LB), 重複なく昇順に整列する(LS,[_軸要素|L3_2],L3), 重複なく昇順に整列する(LB,L2,L3_2). 重複のない昇順分割(_,[],[],[]). 重複のない昇順分割(_軸要素,[A|R1],[A|R2],R3) :- A @< _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[A|R1],R2,[A|R3]) :- A @> _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[_軸要素|R1],R2,R3) :- 重複のない昇順分割(_軸要素,R1,R2,R3). 一行ずつ出力する(_出力ファイル,_候補リスト) :- tell(_出力ファイル), forall(member(_三人分のみかんの重さならび,_候補リスト),配分候補ならびを三行で出力する(_三人分のみかんの重さならび)), told. 配分候補ならびを三行で出力する(_三人分のみかんの重さならび) :- forall(member(_みかんの重さならび,_三人分のみかんの重さならび),( 表示パターンのつくり(_みかんの重さならび,_表示パターン), writef(_表示パターン,_みかんの重さならび))). 表示パターンのつくり(_みかんの重さならび,_表示パターン) :- length(_みかんの重さならび,_要素数), findall('%t',between(1,_要素数,_),_表示パターンならび), atomic_list_concat(_表示パターンならび,',',_表示パターン_1), atomic_list_concat(['(',_表示パターン_1,')\n'],_表示パターン). 整数入力(_整数) :- 行入力(_行), read_term_from_atom(_行,_整数,[]). 行入力(_行) :- get_char(_文字), 行の文字ならび(_文字,_行の文字ならび), atom_chars(_行,_行の文字ならび). 行の文字ならび(end_of_file,[]) :- !. 行の文字ならび('\n',[]) :- !. 行の文字ならび(_文字,[_文字|R]) :- get_char(_次の文字), 行の文字ならび(_次の文字,R). ユーザパラメータならび(_ユーザパラメータならび) :- current_prolog_flag(argv,_ユーザパラメータならび). program :- ユーザパラメータならび([_入力ファイル,_出力ファイル]), '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル). :- program,halt. % 以下のサイトは % [1] 授業単元:C言語演習課題 % http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9422.txt % 問題 % 年と月を「YYYY/MM」と入力し、入力された月のカレンダーを表示しなさい。 % % 1752年10月以前、及び10000年1月以降はエラーを返す。 % % 出力形式は以下のとおり % ・1行目は該当月の1日が月曜日でなければ、前月の最終月曜日から表示。 % ・該当月の最終日が日曜日でなければ、翌月の第1日曜日まで表示。 % ・6行目の表示が必要ない場合は表示しない。 % % うるう年判定は以下のとおり % ・年が4で割り切れる年はうるう年。 % ・年が100で割り切れる年はうるう年でない。 % ・年が400で割り切れる年はうるう年である。 % % [出力例] % 年月日を入力:2009/07 % % 月 火 水 木 金 土 日 % 29 30 01 02 03 04 05 % 06 07 08 09 10 11 12 % 13 14 15 16 17 18 19 % 20 21 22 23 24 25 26 % 27 28 29 30 31 01 02 課題のカレンダー(_年/_月) :- not((_年/_月 >= 1752/10,_年/_月 =< 10000/1)), write('エラー: 入力された年月は範囲を逸脱しています\n'),!. 課題のカレンダー(_年/_月) :- _年/_月 @=< 2009/6,!, 曜日検索(_日付,_曜日,2009/6/13,土曜), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー(_年/_月) :- _年/_月 @>= 2009/6,!, 曜日検索(2009/6/13,土曜,_日付,_曜日), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー表示(_年/_月/_日,月曜) :- 日付候補を得る(_年/_月/_日,_年/_月/_日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 課題のカレンダー表示(_年/_月/_日,_曜日) :- not(_曜日=月曜), 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日), 日付候補を得る(_年/_月/_日,_前週の月曜日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日) :- 曜日検索(_前週の月曜日,_前週の曜日,_年/_月/_日,_曜日), _前週の曜日 = 月曜,!. 日付候補を得る(_年/_月/_日,_起点日付,_曜日,_日付整数ならび) :- findall(_日付,( 曜日(_起点日付,_曜日,_日付2,_),(_日付2=_年2/_月2/7,_年2/_月2 @> _年/_月,!,fail;true)),_日付整数ならび). 課題のカレンダー週表示(_日付整数ならび) :- n個組(7,_日付整数ならび,_7個組), 月曜から日曜までヘッドゼロサプライで表示(_7個組). 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t\n',[_日文字列]),!. 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日|R]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t ',[_日付文字列]), 月曜から日曜までヘッドゼロサプライで表示(R). 課題のカレンダー見出し表示 :- write_formatted('月 火 水 木 金 土 日\n'). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). '曜日'(_日付,_曜日,_日付,_曜日) :- ! . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @> _日付2, '前日・今日'(_日付3,_曜日3,_日付1,_曜日1), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @< _日付2, '前日・今日'(_日付1,_曜日1,_日付3,_曜日3), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/550 # # [1] 授業単元: Ruby演習 [2] 問題文、http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9426.txt # Rubyの問題がわかりません 助けてください # # (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい # # p wday["sunday"] #=> "日曜日" # p wday["monday"] #=> "月曜日" # p wday["saturday"] #=> "土曜日" # # (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい # # (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ い。 # 「sunday」は日曜日のことです。 # 「monday」は月曜日のことです。 # # (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正 規表現で定義するなら「/\uff3cs+/」)で区切られた文字列をハッシュに変換するメソ ッドstr2hashを定義してください。 # # p str2hash("bule 青 white 白\uff3cnred赤"); # #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"} :- op(450,xfx,(=>)). % (1) wday({ "sunday" => "日曜日","monday" => "月曜日","saturday" #=> "土曜日"}). % (2) hash_count(Hashname,Count) :- functor(P,Hashname,1), call(P), arg(1,P,H), count(H,Count). count(','(A,B),Count) :- count(B,Count2), Count is Count2 + 1. count(A,1). % (3) ?- each(wday.A=>B),write_formatted('「%t」は%tのことです。\n',[A,B]),fail;true. each(Hashname.Key=>Value) :- functor(P,Hashname,1), arg(1,P,V), each(V,Key=>Value). each(','(Key=>Value,B),Key=>Value). each(','(_,B),Key=>Value) :- each(B,Key=>Value). each(Key=>Value,Key=>Value). % (4) str2hash(Atom,Hash) :- split(Atom,[' ','\t','\n'],L), findall(U,n個組(2,L,U),L2), hashを成長させる(L2,Hash). hashを成長させる([A,B],{ A=>B }) :- !. hashを成長させる([[A,B]|R], { (A=>B,R2) }) :- hashを成長させる(R,{ R2 }). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/103 # # 【質問テンプレ】 # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9753.txt # 2.入力された年月の1日が何曜日かを調べる。 #   曜日のチェックはZellerの公式を使用する。Zellerの公式は、 #    #   曜日を表す値=(y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ (( 13 * m ) + 8 ) / 5 ] + d ) % 7 # #           ※ 上記の公式中の y は年、 m は月、 d は日を表し、 #             []はその数を越えない最大の整数を表す。(例: [13.6]は13になる) # #   で、曜日を表す値は次のようになっている。 # #     日曜日 = 0, 月曜日 = 1, 火曜日 = 2, 水曜日 = 3, # # 木曜日 = 4, 金曜日 = 5, 土曜日 = 6, # #   ※但し、1月と2月は前年の13月14月として計算するものとする。 % (1) 年月の入力 年月入力処理(_年,_月) :- 年入力処理(_年), 月入力処理(_月). % (2) 曜日計算 :- op(450,xfx,が),op(500,xfx,であり),op(600,xfx,ならば),op(450,xfx,は). 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は (Y + Y // 4 - Y // 100 + Y // 400 + ((( 13 * M ) + 8 ) // 5 ) + D ) mod 7). 曜日計算処理(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値), 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値を得る'(_年,1,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,13,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,2,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,14,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値) :- _年=Y,_月=M,_日=D, 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は _Zellerの公式), _曜日を表す値 is _Zellerの公式,!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % (3) カレンダー表示 カレンダー表示 :- 年月入力処理(_年,_月), 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,1,_曜日を表す整数値), カレンダー表示データ編集(_年,_月,_曜日を表す整数値,_カレンダー表示文字列ならび), 要素に空白を挿入して全行表示(_カレンダー表示文字列ならび). カレンダー表示データ編集(_年,_月,_各月1日の曜日を表す整数値,_カレンダー表示文字列ならび) :- 年月文字列編集処理(_年,_月,_年月文字列), 月日数(_年,_月,_月日数), findall(S,for(1,N,_月日数),ヘッドゼロサプレス(2,N,S)),_表示日ならび), Length is _月日数 + _各月1日の曜日を表す整数値, M is (7 - (Length mod 7)), '7個組ならび'(Length,M,_表示日ならび,_7個組ならび), 見出しならび(_年月文字列,_見出しならび), append(_見出しならび,_7個組ならび,_カレンダー表示文字列ならび). 見出しならび(_年月文字列,[[_年月文字列],[日,月,火,水,木,金,土]]). '7個組ならび'(Length,0,_表示日ならび,_7個組ならび) :- length(L0,Length), すべての要素が(L0,' '), append(L0,_表示日ならび,L), '7個組'(L,_7個組ならび),!. '7個組ならび'(Length,M,_表示日ならび,_7個組ならび) :- not(M=0), length(L0,Length), すべての要素が(L0,' '), length(L2,M), すべての要素が(L2,' '), append(L0,_表示日ならび,L2,L), '7個組'(L,_7個組ならび),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,28) :- not(うるう年(_年)),!. 月日数(_,_月,30) :- member(_月,[4,6,9,11]). 月日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). % (4) 基礎述語の定義 年入力処理(_年) :- write('表示したいカレンダーは西暦何年 ? '), get_line(_行), 年入力処理の二(_行,_年), 年入力検査(_年),!. 年入力処理(_年) :- 年入力処理(_年). 年入力処理の二(_行,_年) :- atom_to_term(_行,_年), integer(_年),!. 年入力処理の二(_行,_年) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 年入力検査(_年) :- _年 >= 1583, _年 =< 3999,!. 年入力検査(_年) :- write_formatted('この年を表す整数%tは不正です\n',[_年]), fail. 月入力処理(_月) :- write('月は ? '), get_line(_行), 月入力処理の二(_行,_月), 月入力検査(_月),!. 月入力処理(_月) :- 月入力処理(_月). 月入力処理の二(_行,_月) :- atom_to_term(_行,_月,_), integer(_月),!. 月入力処理の二(_行,_月) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 月入力検査(_月) :- _月 >= 1, _月 =< 12,!. 月入力検査(_月) :- write_formatted('この月を表す整数%tは不正です\n',[_月]), fail. 日付文字列編集処理(_年,_月,_日,_日付文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), ヘッドゼロサプライ(2,_日,_日文字列), concat_atom([_年文字列,_月文字列,_日文字列],_日付文字列). 年月文字列編集処理(_年,_月,_年月文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), concat_atom([_年文字列,_月文字列],_年月文字列). ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). ヘッドゼロサプレス(N桁,_整数,_ヘッド空白整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプレス_1(N桁,_数字ならび,_ヘッド空白整数文字ならび), concat_atom(_ヘッド空白整数文字ならび,_ヘッド空白整数文字列),!. ヘッドゼロサプレス_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプレス_1(N桁,L,[' '|R]) :- M桁 is N桁 - 1, ヘッドゼロサプレス_1(M桁,L,R). 要素に空白を挿入して全行表示([]) :- !. 要素に空白を挿入して全行表示([L|R]) :- concat_atom(L,' ',_表示行), write_formatted('%t\n',[_表示行]), 要素に空白を挿入して全行表示(R). すべての要素が([],_). すべての要素が([V|R],V) :- すべての要素が(R,V). '7個組'([],[]) :- !. '7個組'([A,B,C,D,E,F,G|R1]),[[A,B,C,D,E,F,G]|R2]) :- '7個組'(R1,R2). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. not(P) :- \+(P). append([],L1,L2,L) :- append(L1,L2,L) . append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R) . concat_atom([],'') :- !. concat_atom([A],A) :- !. concat_atom([A|R],S) :- concat_atom(R,S1), atom_concat(A,S1,S). concat_atom([],_,'') :- !. concat_atom([A],_,A) :- !. concat_atom([A|R],_区切り文字列,S) :- concat_atom(R,_区切り文字列,S1), atom_concat(A,_区切り文字列,S2), atom_concat(S2,S1,S). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/157 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9762.txt # # 正数による正方行列のうち、全ての行、列、斜め列の合計が同じであり、 # かつ2回以上使用される数字が存在しないものを魔方陣という。 # 下図に示すa,bに数値を設定したときに、1〜9の整数によって構成される魔方陣を # 出力するプログラムを作成せよ。 # 但し、魔方陣が作成不可能な(a,b)の組み合わせが設定された場合は、「Impossible」 # と出力するとする。 # # la_lb_l__l # l__l__l__l # l__l__l__l # 魔方陣(N枡,A,B,_行列) :- 魔方陣のための行列の生成(N枡,_行列), _行列 = [[A,B|_],_,_], 行の合計が全て一致する(_行列,S), 列の合計が全て一致する(_行列,S), 正方行列の斜め要素の合計が一致する(_行列,S). 魔方陣のための行列の生成(N枡,_行列) :- N2 is N枡 ^ 2, findall(M,for(1,M,N2),NL),!, 順列(NL,N2,_順列数字ならび), findall(_N個組,n個組(N枡,_順列数字ならび,_N個組),_行列). 行の合計が全て一致する([],S) :- !. 行の合計が全て一致する([_行|R],S) :- 魔方陣の加算(_行,0,S), 行の合計が全て一致する(R,S). 列の合計が全て一致する(_行列,S) :- 行列の転置(_行列,_転置行列), 列の合計が全て一致する(_転置行列,S),!. 正方行列の斜め要素の合計が一致する(_正方行列,S) :- length(_行列,Len), 左上から右下方向の合計(1,Len,_正方行列,0,S), 右上から左下方向の合計(1,Len,_正方行列,0,S),!. 左上から右下方向の合計(M,N,_,S,S) :- M > N,!. 左上から右下方向の合計(M,N,_行列,S1,S) :- list_nth(M,_行列,_行), list_nth(M,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 左上から右下方向の合計(M2,N,_行列,S2,S),!. 右上から左下方向の合計(M,N,_,S,S) :- M > N,!. 右上から左下方向の合計(M,N,_行列,S1,S) :- M1 is N - M + 1, list_nth(M1,_行列,_行), list_nth(M1,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 右上から左下方向の合計(M2,N,_行列,S2,S),!. n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. 魔方陣の加算([],X,X) :- !. 魔方陣の加算([A|R],Y,X) :- Z is A + Y, 魔方陣の加算(R,Z,X). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/566 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 番号と点数を配列に初期化して、それらを # 5段階にランク付けをして、受験番号・ランクを表示するプログラムを作成。 # ランク付けをする部分を関数Rankとして、番号と評価を表示する部分を関数Outputとすること。 # なお、ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 # 60〜79点をB、80〜100点をAとする。 # ただし、受験者の数は、50人以下とする。 # 番号と点数は、以下の配列を使用すること。 # 番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10}; # 点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100}; # '問題文の5段階にランク付け'('ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 60〜79点をB、80〜100点をAとする。 '). 番号の定義文('番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10};'). 点数の定義文('点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100};'). 'ランクならびの生成'(_ランクならび) :- '問題文の5段階にランク付け'(_ランク定義文), ランクの定義文解析(_ランク定義文,_ランクならび). 番号ならびの生成(_番号ならび) :- 番号の定義文(_番号の定義文), 番号の定義文解析(_番号の定義文,_番号ならび). 点数ならびの生成(_点数ならび) :- 点数の定義文(_点数の定義文), 点数の定義文解析(_点数の定義文,_点数ならび). '5段階にランク付けをして、受験番号・ランクを表示する' :- ランクならびの生成(_ランクならび), 番号ならびの生成(_番号ならび), 点数ならびの生成(_点数ならび), '5段階にランク付けをして、受験番号・ランクを表示する'(_番号ならび,_点数ならび,_ランクならび). '5段階にランク付けをして、受験番号・ランクを表示する'([],[],_). '5段階にランク付けをして、受験番号・ランクを表示する'([_番号|R1],[_点数|R2],_ランクならび) :- append(_,[[_点数下限,_点数上限,_ランク]|_],_ランクならび), _点数 >= _点数下限, _点数 =< _点数上限, writef('受験番号:%t ランク:%t\n',[_番号,_ランク]), '5段階にランク付けをして、受験番号・ランクを表示する'(R1,R2,_ランクならび). ランクの定義文解析(_ランク定義文,_ランクならび) :- 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文), split(_半角数字変換されたランク定義文,[' ','。','、','〜','点を','とする'],L), n個組(3,L,_ランクならび). 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文) :- atom_chars(_ランク定義文,Chars), findall(_文字_1, append(_,[_文字|_],Chars), 全角数字ならば半角数字に変換(_文字,_文字_1)), Chars2), atom_chars(_半角数字変換されたランク定義文,Chars2). 全角数字ならば半角数字に変換([_全角数字|R1],[_半角数字|R2]) :- 全角数字半角数字変換(_全角数字,_半角数字), 全角数字ならば半角数字に変換(R1,R2). 全角数字ならば半角数字に変換([_文字|R1],[_文字|R2]) :- \+(全角数字半角数字変換(_文字,_)), 全角数字ならば半角数字に変換(R1,R2). 全角数字半角数字変換(0,0). 全角数字半角数字変換(1,1). 全角数字半角数字変換(2,2). 全角数字半角数字変換(3,3). 全角数字半角数字変換(4,4). 全角数字半角数字変換(5,5). 全角数字半角数字変換(6,6). 全角数字半角数字変換(7,7). 全角数字半角数字変換(8,8). 全角数字半角数字変換(9,9). 番号の定義文解析(_番号の定義文,_番号ならび) :- split(_番号の定義文,['=',',',';'],[_|_番号ならび]). 点数の定義文解析(_点数の定義文,_点数ならび) :- split(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは % % SWI-Prolog のコマンド引数の内、ユーザパラメータ部分をリストに得る。 % user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/348 # # [1] C言語演習 # # [2] argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 # 但し、第一引数だけは別の配列(ary)に格納はしないこと。 # 例)argv:./test a b c d e f # 例)ary :./test b c d e f # # [3.1] redhat # [3.3] C言語 # [4] 本日中 # [5] 制限:なし # わかる方どうかよろしくお願いします。 # # 'argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 但し、第一引数だけは別の配列(ary)に格納はしないこと'(UserParameterList) :- user_parameters([_|UserParameterList]),!. user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/425 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 与えた文字列を指定した回数繰り返す文字列に変換するプログラムを作成しなさい。 # ただし、main関数を以下のように宣言し、実行時に引数をとれるようにする。 # 第一引数は繰り返し回数とし、第二引数は繰り返される文字列とする。 # すなわち、./prog 3 "ABC"と実行した場合は、ABCABCABCとなる文字列が作られる。 # 作られた文字列は、表示すること。必要に応じて、数字を数値に変換する関数atoi()を使用してもよい。 # その際は、#include<stdlib.h>を加えること。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc,char*argv[]){ # /** argc:引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:引数**/ # x=atoi(argv[1]);/*atoiの使用例*/ # return(0); # } # program :- 与えた文字列を指定した回数繰り返す文字列に変換する. 与えた文字列を指定した回数繰り返す文字列に変換する :- user_parameters([_回数文字列,_文字列]), atom_to_term(_回数文字列,_回数,_), length(Ln,_回数), append(_,[_|R],Ln), write(_文字列), R = []. user_parameters(A) :- current_prolog_flag(argv, B), append(_, [--|A], B). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/639 # # [1] C言語演習 # [2] argvで入力された引数 "123:456:78:90" の様な文字列を ":" 区切りで # 別の配列へ順に格納せよ。(strchr関数を使いなさい) # 上記の例では、[0]=123,[1]=456,[2]=78,[3]=90となる。 # 尚、::の連続もありで、"12:34::90" は [0]=12,[1]=34,[2]=null,[3]=90となる。 # # 下の様に処理しているが、スマートに行きません。。。 # p = NULL; # p = strchr(str, ':'); # while (p != NULL) { # printf("length %d\n", strlen(str)-strlen(p)); # p++; # p = strchr(p, ':'); # } # 'argvで入力された引数 "123:456:78:90" の様な文字列を ":" で区切り、プログラム引数述語のリスト引数とする' :- user_parameters([_引数文字列]), split(_引数文字列,[':'],L), assertz(プログラム引数(L)). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/682 # # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(0,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,1,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,0,1,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,1,0,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,0,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(0,1,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,1,1,'NG') :- !. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/699 # # ../test/read.cgi/tech/1311089619/682について内容が不足していたので再投稿します。 # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # [3] フラグ・判定にビット演算を使用してください。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する。判定はビット演算を使う' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'OK') :- 0 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'NG') :- 1 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/453 # # 【 課題 】コマンドラインから入力された点数を集計するプログラムを作成。 #       ソースファイルにコードを追加して、以下の実行結果になるように。 # # 実行結果  #       java CalcMain 69 88 70 45 95 33 #       高得点順: 95点 , 88点 , 70点 , 69点 , 45点 , 33点 #       科目数:6科目 #       合計点:400点 #       平均点: 66.666664点 #        CalcMainクラスはmain()メソッドを持つ。 #        Calculationクラスは、合計点の計算をするgetTotal()メソッド、平均点の計算をするgetAve()メソッド、並び替え処理を行うsort()メソッドを持つ。 #        コマンドライン引数から受け取った不特定数の数値(点数)について、降順並び替え表示、科目数、合計点、平均点の表示を行う。 #        sort()メソッドの並び替え処理には「バブルソート」を使用する # # #       ソースファイル #       http://ime.nu/www.dotup.org/uploda/www.dotup.org2249012.java.html # # http://ime.nu/www.dotup.org/uploda/www.dotup.org2249060.java # # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11月14日まで # 【 Ver  】java version "1.6.0_22" # 【 用語 】 # 【 補足 】よろしくお願いします。 # # 'コマンドラインから入力された点数を集計するプログラムを作成。ソースファイルにコードを追加して、以下の実行結果になるように。' :- コマンドラインから入力された点数(_コマンドラインから入力された点数ならび), 高得点順に表示(_コマンドラインから入力された点数ならび), 科目数と合計点と平均点の表示(_コマンドラインから入力された点数ならび). コマンドラインから入力された点数(_コマンドラインから入力された点数ならび) :- current_prolog_flag(argv,_コマンドライン), append(_,['--'|_コマンドラインから入力された点数ならび],_コマンドライン]). 高得点順に表示(L) :- バブルソート降順(L,L2), concat_atom(L2,',',_表示文字列), writef('高得点順: %t\n',[_表示文字列]). 科目数の表示(L,_科目数) :- length(L,_科目数), writef('科目数: %t\n',[_科目数]), 科目数と合計点と平均点の表示(L) :- length(L,_科目数), sum(L,_合計点), _平均点 is _合計点 / _科目数. writef('科目数: %t\n合計点: %t\n平均点: %t\n',[_科目数,_合計点,_平均点]). バブルソート降順(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一), !, バブルソート降順(_対象ならびの一,_整列済みならび). バブルソート降順(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 降順交換(R1,R2). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/670 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # #include<stdio.h> # int main(void) # { # int i=0; # char *ptr; # char str[128]; # # ptr = str; # # scanf("%s",&str); # # while(*ptr++){ # i++; # } # # printf("%d\n",i); # } # # 上記の入力したテキストの文字数を表示するプログラムの読み込み部分をファイル処理に変更せよ。 # fgetc() 関数を使用し、コマンドラインにファイル名が指定できるようにすること。 # ただし、ファイル名を指定しない場合は標準入力とする。 # ファイルが見つからなかった時はエラーメッセージを出し、プログラムを終了する。 # 'length系組込述語を使わず入力したテキストの文字数を表示する' :- get_chars(_文字ならび), ならびの文字数を数える(_文字ならび,_文字数), writef('文字数は %t文字です\n',[_文字数]). ならびの文字数を数える([],0). ならびの文字数を数える([_|R],_文字数) :- ならびの文字数を数える(R,_文字数_1), _文字数 is _文字数_1 + 1. 読み込み部分をファイル処理に変更する :- コマンドラインからファイル名を取り出す(_ファイル名), 読み込み部分をファイル処理に変更する(_ファイル名). 読み込み部分をファイル処理に変更する(user_input,_文字数) :- ファイルから読み出しながら文字数を数える(user_input,_文字数). 読み込み部分をファイル処理に変更する(_ファイル名,_文字数) :- open(_ファイル名,read,Instream), ファイルから読み出しながら文字数を数える(Instream,_文字数), close(Instream). ファイルから読み出しながら文字数を数える(Instream,0) :- at_end_of_stream(Instream),!. ファイルから読み出しながら文字数を数える(Instream,_文字数) :- get_char(Instream,_), ファイルから読み出しながら文字数を数える(Instream,_文字数_1), _文字数 is _文字数_1 + 1. コマンドラインからファイル名を取り出す(_ファイル名) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList), ParameterList = [_ファイル名|_],!. コマンドラインからファイル名を取り出す(user_input). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/613 # # 明日までの課題です。 # まったくわかりません。 # # キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力するプログラムを書きなさい。 # なお、プログラムは次の要件を満たすこと。 # # 1.キーボードからの入力は、Enter(return)キーを2回連続して入力すると終了する # 2.入力終了後、画面に入力した行数を表示する # 3.コマンドラインからプログラムを起動後、入力する文字列に各自の氏名(ローマ字表記)を含めた場合、入力処理終了後、各自の氏名を含む行は何行目にあり、その行の文字列が何であるか表示する。 # 氏名が入力データに含まれていない場合には、含まれていなかったことを表示する # # よろしくお願いします。 # # program :- 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する' :- user_parameters([_ファイル名]), open(_ファイル名,write,Outstream), get_line(Line), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,[]), close(Outstream). 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,'',Ln) :- length(Ln,_行数), writef('行数は %t です\n',[_行数]),!. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,Ln) :- writef(Outstream,'%t\n',[Line]), get_line(Line_2), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line_2,[_|Ln] user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/59 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # main関数を以下のように宣言し、実行時に引数を取れるようにする。 # 引数がすべて得点であるとして、その平均値を # 求めるプログラムを作成しなさい。 # すなわち、 # ./prog 50 70 90 と実行した場合は、70と表示される。 # 必要に応じて、数字を数値に変換する関数atoi()や # atof()を使用してもよい。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc, char *argv[] ) { # /** argc: 引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:実数 **/ # x = atof( argv[1] ); /* atofの使用例 */ # return(0); # } # # ※ 配列のサイズなど、定数は必ず#defineを利用すること. # ※ 表示や入力を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わないこと. # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月15日 # よろしくお願いします! # # program :- user_parameters(_ユーザパラメータならび), プログラム引数を整数ならびに変換(_ユーザパラメータならび,_整数ならび), avg(整数ならび,_相加平均), writef('%t\n',[_相加平均]). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). プログラム引数を整数ならびに変換([],[]). プログラム引数を整数ならびに変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), integer(N), プログラム引数を整数ならびに変換(R1,R2). プログラム引数を整数ならびに変換([_|R1],R2) :- プログラム引数を整数ならびに変換(R1,R2). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/642 # # [1] 授業単元:C言語演習 # [2] 問題文: # 実行ファイル名をmultiとして、multiに続いて2つの正の整数を入力すると、小さい方の整数から大きい方の整数までの積を出力するプログラムを作成せよ。 # 但し、入力時には小さい方の整数、大きいほうの整数の順で入力されるものとする。 # <入力例>$./multi 3 6 # <計算結果>360 # program :- user_parameters([_引数1,_引数2]), 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2), user_parameters(ParametersList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2) :- atom_number(_引数1,N1), atom_number(_引数2,N2), 小さい方の整数と大きい方の整数(N1,N2,_小さい方の整数,_大きい方の整数), 小さい方の整数から大きい方の整数までの積を(_小さい方の整数,_大きい方の整数,_積), 出力する(_積). 小さい方の整数と大きい方の整数(N1,N2,N1,N2) :- N1 =< N2. 小さい方の整数と大きい方の整数(N1,N2,N2,N1) :- N1 > N2. 小さい方の整数から大きい方の整数までの積を(N,N,N). 小さい方の整数から大きい方の整数までの積を(N,_大きい方の整数,_積) :- N < _大きい方の整数, N1_2 is N1 + 1, 小さい方の整数から大きい方の整数までの積を(N_2,_大きい方の整数,_積_2), _積 is _積_2 * N. 出力する(_積) :- writef('%t\n',[N]). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/786 # # C言語 # gcc # Linux # 問題:cat関数を作りなさい。ただし、fgets,fputsを用いること。です。 # # 明日のお昼までにお願いします。 # # cat :- user_parameters([]), get_code(user_input,Code), ストリームから読み取り書き出す(user_input,Code),!. cat :- user_parameters(L), append(_,[File|R],L), ファイルを書き出す(File), R = [],!. ファイルを書き出す(File) :- open(File,read,Instream), get_code(Instream,Code), ストリームから読み取り書き出す(Instream,Code), close(Instream). ストリームから読み取り書き出す(_,-1) :- !. ストリームから読み取り書き出す(Instream,Code_1) :- put_code(Code_1), get_code(Instream,Code_2), ストリームから読み取り書き出す(Instream,Code_2). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % % SWI-Prologの起動は % # swipl -t cat -f プログラムファイル名 -- ファイル1 ファイル名2 ... % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/907 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のようにmain関数を定義し、mainの引数を合計するプログラムsumを作成せよ。ただし、引数の数は未定であり、実行時に決定されるものとする。 # int main(int argc, char *argv[]) # main :- 利用者引数ならび(_利用者引数ならび), findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値ならび), sum(_数値ならび,_合計), writef('%t\n',[_合計]). sum([],0). sum([_数値|R],_合計) :- sum(R,_合計_1), _合計 is _数値 + _合計_1. 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). % % # swipl --quiet -f c161_907.html -g main -- 33.0 25.1 38.4 % 96.5 % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/957 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク): # コマンド行から複数の数値を受け取りその平均値を出力するプログラムを # 作成し、プログラムリストと実行結果を示せ。ヒント:受け取った文字列を # double型に変換するには、関数double atof(const char *nPtr)を使う。 # この関数を使うには<stdlib.h>のインクルードが必要である。 # #include <stdio.h> # #include <stdlib.h> # int main(void) # { # char str[]="1.41421356"; # double x; # x = atof(str); # } # 'コマンド行から複数の数値を受け取りその平均値を出力する' :- 利用者引数ならび(_利用者引数ならび), 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび), 相加平均(_数値引数ならび,_相加平均), writef('平均値は %t です\n',[_相加平均]). 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび) :- findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値引数ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0e+00,M). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/576 # 西暦何年かを入力するとその年に月曜日が何回あるか数え # 52回なら1を、53回なら0を出力するプログラムお願いします… # # 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします # (0を入力したら終わりです) # # 入力できるのは1989〜5000です # # '西暦何年かを入力するとその年に月曜日が何回あるか数え 52回なら1を、53回なら0を出力するプログラムお願いします… 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします (0を入力したら終わりです) 入力できるのは1989〜5000です' :- '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_西暦ならび). '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび) :- findall(_西暦,( '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('西暦(1989~5000)を入力して下さい',_西暦), ( _西暦=0,!,fail;true)),_西暦ならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([]). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([_西暦|_残りならび]) :- 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_1または0), 出力する(_西暦,_1または0), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_残りならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- 'その年に月曜日が何回あるか数え'(_西暦,_月曜日の回数), '52回なら1を、53回なら0を'(_月曜日の回数,_0または1). 'その年に月曜日が何回あるか数え'(_西暦,_月曜日の回数) :- findall(1,( 日付と曜日の生成(_西暦,1,1,_年,_月,_日,月曜), ( \+(_年 = _西暦),!,fail;true)),L), length(L,_月曜日の回数). '52回なら1を、53回なら0を'(52,1). '52回なら1を、53回なら0を'(53,0). 出力する(_西暦,_1または0) :- writef('%t年 %t\n',[_西暦,_1または0]). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- writef('%t ',[_催促文]), get_line(_入力行), '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦). '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('0',0) :- !. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦) :- read_term_from_atom(_入力行,_西暦,[]), integer(_西暦), between(1889,5000,_西暦),!. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_) :- writef('入力された文字列"%t"から1899年から5000年範囲の西暦が得られませんでした\n再入力をお願いします\n',[_入力行]), fail. get_line(Line) :- read_line_to_codes(user_input,Codes), atom_codes(Line,Codes). '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). '日付と曜日の生成'(_起点年月日文字列,_年月日文字列,_曜日) :- 年月日文字列から整数年月日を得る(_起点年月日文字列,_起点年,_起点月,_起点日), '日付と曜日の生成'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日), 整数から文字列(4,_年,_年文字列), 整数から文字列(2,_月,_月文字列), 整数から文字列(2,_日,_日文字列), atomic_list_concat([_年文字列,_月文字列,_日文字列],_年月日文字列). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- _翌日の月 is _月 + 1, '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月),!. '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。' :- ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列為替価格ならび), 最大の為替差の利益(_ある通貨の時系列為替価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列価格ならび) :- 時系列数を得る(_時系列数), findall(_価格,( 価格を得る(_時系列数,_価格)), _ある通貨の時系列価格ならび). 時系列数を得る(_時系列数) :- 整数を得る(_時系列数). 価格を得る(_時系列数,_価格) :- between(1,_時系列数,_t), 整数を得る(_価格). 最大の為替差の利益(_ある通貨の時系列価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大利益,( 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益)), _最大の為替差の利益). 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益) :- append(_,[_時刻tの価格|_その後の価格ならび],_ある通貨の時系列価格ならび), 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益). 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益) :- findmax(_時刻tの価格との価格差,( 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差)), _時刻tの投資に対する最大利益). 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差) :- member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格. 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % % 整数を入力する場合の一般型 % 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ # '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ' :- '9―3÷1/3+1=?', 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?' :- '全角文字を半角文字にしながら/をrdivに÷を/に置換する'('9―3÷1/3+1',_置換された半角式文字列), '/(実は÷)の演算子結合度をrdiv(実は/)の400より強くする', 置換された半角式文字列を解釈実行する(_置換された半角式文字列,_はてな), 式を復元して表示する('9―3÷1/3+1=',_はてな). '全角文字を半角文字にしながら/をrdivに÷を/に置換する'('9―3÷1/3+1',_置換された半角式文字列) :- 'ここだけの文字列置換(=?は除去される)'('9―3÷1/3+1=?',_置換された半角式文字列). '/(実は÷)の演算子結合度をrdiv(実は/)の400より強くする' :- op(401,yfx,(/)). 置換された半角式文字列を解釈実行する(_置換された半角式文字列,_はてな) :- read_term_from_atom(_置換された半角式文字列,_式,[]), _はてな is _式. 'ここだけの文字列置換(=?は除去される)'(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの置換('9','9'). ここだけの置換('―','-'). ここだけの置換('3','3'). ここだけの置換('÷','/'). ここだけの置換('/',' rdiv '). ここだけの置換('+','+'). ここだけの置換('1','1'). ここだけの置換('=',''). ここだけの置換('?',''). ここだけの置換('2','2'). ここだけの置換('4','4'). ここだけの置換('5','5'). ここだけの置換('6','6'). ここだけの置換('7','7'). ここだけの置換('8','8'). ここだけの置換('0','0'). 式を復元して表示する(_表示文字列_1,_はてな) :- '_はてなを全角数字に置換する'(_はてな,_はてな全角文字列), writef('%t%t\n',[_表示文字列_1,_はてな全角文字列]). '_はてなを全角数字に置換する'(_はてな,_はてな全角数字文字列) :- number_chars(_はてな,_はてな数字ならび), 半角文字ならびを全角文字ならびに変換する(_はてな数字ならび,_はてな全角数字ならび), atomic_list_concat(_はてな全角数字ならび,_はてな全角数字文字列). 半角文字ならびを全角文字ならびに変換する(_はてな数字ならび,_はてな全角数字ならび) :- findall(_全角数字,( member(_半角数字,_はてな数字ならび), ここだけの置換(_全角数字,_半角数字)),_はてな全角数字ならび). 尾崎さんならPrologで解きそうだ. % 以下のサイトは # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ' :- '9―3÷1/3+1=?', 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?' :- op(401,yfx,(/)), ここだけの文字列置換('9―3÷1/3+1=?',_置換された文字列), read_term_from_atom(_置換された文字列,_式 = ?,[]), X is _式, '?を全角数字の解に置換して表示する'('9―3÷1/3+1=%t\n',X). ここだけの文字列置換(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの文字置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの文字置換('9','9'). ここだけの文字置換('―','-'). ここだけの文字置換('3','3'). ここだけの文字置換('÷','/'). ここだけの文字置換('/',' rdiv '). ここだけの文字置換('+','+'). ここだけの文字置換('1','1'). ここだけの文字置換('=','='). ここだけの文字置換('?',' ? '). ここだけの文字置換('2','2'). ここだけの文字置換('4','4'). ここだけの文字置換('5','5'). ここだけの文字置換('6','6'). ここだけの文字置換('7','7'). ここだけの文字置換('8','8'). ここだけの文字置換('0','0'). '?を全角数字の解に置換して表示する'(_表示パターン,X) :- '?を全角数字の解に置換して'(X,_解文字列), writef(_表示パターン,[_解文字列]). '?を全角数字の解に置換して'(X,_解文字列) :- number_chars(X,Chars), findall(_全角数字,( member(_数字,Chars), ここだけの文字置換(_全角数字,_数字)),_解文字ならび), atomic_list_concat(_解文字ならび,_解文字列). 尾崎さんならPrologで解きそうだ. % 以下のサイトは # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ'(X) :- '9―3÷1/3+1=?'(X), 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?'(X) :- op(401,yfx,(/)), ここだけの文字列置換('9―3÷1/3+1=?',_置換された文字列), read_term_from_atom(_置換された文字列,_式,[]), X is _式. ここだけの文字列置換(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの文字置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの文字置換('9','9'). ここだけの文字置換('―','-'). ここだけの文字置換('3','3'). ここだけの文字置換('÷','/'). ここだけの文字置換('/',' rdiv '). ここだけの文字置換('+','+'). ここだけの文字置換('1','1'). 尾崎さんならPrologで解きそうだ. % 以下のサイトは 標準入力から整数を得る(_催促文言,_検査述語,_整数) :- 催促文言を表示して標準入力から整数を得て検査述語を実行する(_催促文言,_検査述語,_整数),!. 標準入力から整数を得る(_催促文言,_検査述語,_整数) :- 標準入力から整数を得る(_催促文言,_検査述語,_整数). 催促文言を表示して標準入力から整数を得て検査述語を実行する(_催促文言,_検査述語,_整数) :- 催促文言を表示して標準入力から整数を得て(_催促文言,_整数), 検査述語を実行する(_検査述語). 催促文言を表示して標準入力から整数を得て(_催促文言,_整数) :- 催促文言を表示して(_催促文言), 標準入力から整数を得る(_整数). 催促文言を表示して(_催促文言) :- 催促文言の編集(_催促文言,_編集された催促文言), writef('%tを入力してください : ',[_編集された催促文言]). 催促文言の編集(表示しない,'') :- !. 催促文言の編集(_催促文言,_編集された催促文言) :- atom_concat(_催促文言,'を入力して下さい : ',_編集された催促文言). 検査述語を実行する(_検査述語) :- _検査述語. 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- 入力文字列から整数が得られる(_文字列,_整数),!. 整数入力検査(_文字列,_) :- 入力文字列から整数が得られない(_文字列,_). 入力文字列から整数が得られる(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[valiables(_入力された変数),valiable_names(_入力された変数名)]),E,fail), integer(_整数). 入力文字列から整数が得られない(_文字列,_) :- writef('入力された文字列 %t からは整数が得られません。再入力をお願いします: \n',[_文字列]), fail. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # 問題文 # 高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k−1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 # # 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べたいと思いました。 # # 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # N # A1 # A2 # : # AN # 1 行目には、硬貨の種類数 N(1≦N≦50) が、1 行で与えられる。 # 2 行目から N 行では、高橋君が各硬貨を何枚持っているかが与えられる。 このうち i(1≦i≦N) 行目では、 i 番目の硬貨を、高橋君が何枚持っているかを表す整数 Ai(0≦Ai≦50000)が与えられる。 # 出力 # 高橋君が払える金額の種類数を、 1000000007 で割った余りを 1 行で出力せよ。出力の末尾は改行をいれること。 # # 入力例1 # 2 # 2 # 1 # 出力例1 # 5 # 払える金額は、1 円, 2 円, 10 円, 11 円, 12 円の 5 通りとなります。 # # 0 円は含まないことに注意してください。 # # 入力例2 # 2 # 32 # 3 # 出力例2 # 62 # 1 円から 62 円の 62 通りの金額を支払うことが出来ます。 # # 入力例3 # 4 # 12 # 3 # 7 # 34 # 出力例3 # 12039 # 入力例4 # 10 # 1234 # 2 # 857 # 3858 # 1 # 5000 # 32 # 4 # 1 # 857 # 出力例4 # 969347336 # 1000000007 で割った余りを出力してください。 # '高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k‐1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べた いと思いました。 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるた め、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。' :- 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_種類別枚数ならび), 最大何通り(_種類別枚数ならび,_最大何通り), 最大可能性から重複を差し引く(_種類別枚数ならび,_最大何通り,_何通り), '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り). 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび) :- 標準入力から整数を得る(_何種類), findall([M,_整数],( between(1,_何種類,N), succ(M,N), 標準入力から整数を得る(_整数)), _枚数ならび). 最大何通り(_種類別枚数ならび,_最大何通り) :- 最大何通り(_種類別枚数ならび,1,_最大何通り). 最大何通り([],_最大何通り,_最大何通り). 最大何通り([[_,0]|R]],_最大何通り,_最大何通り) :- 最大何通り(R,_最大何通り,_最大何通り),!. 最大何通り([[A,B]|R],N,_最大何通り) :- N_2 is B * N, 最大何通り(R,N_2,_最大何通り). 最大可能性から重複を差し引く(_種類別枚数ならび,_最大何通り,_何通り) :- findsum(_差し引き数,( append(L1,[[_種類,_枚数]|L2],_種類別枚数ならび), 差し引き数(_種類,_枚数,L1,_差し引き数)), _重複差し引き数), _何通り is _最大何通り - _重複差し引き数. 差し引き数(_種類_1,_枚数_1,L1,_差し引き数)) :- findsum(_差し引き数_3,( member([_種類,_枚数],L1), _差し引き数_1 is _枚数_1 // (_種類_1 // _種類), _差し引き数_2 is _枚数 // (_種類_1 // _種類), 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_3)), _差し引き数). 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_1) :- _差し引き数_1 =< _差し引き数_2,!. 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_2). '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- writef('%t何通り\n',[_何通り]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- _何通り >= 1000000007, _何通りを1000000007で割った余り is _何通り mod 1000000007, writef('%t何通り\n',[_何通りを1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # 高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k−1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 # # 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べたいと思いました。 # # 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # N # A1 # A2 # : # AN # 1 行目には、硬貨の種類数 N(1≦N≦50) が、1 行で与えられる。 # 2 行目から N 行では、高橋君が各硬貨を何枚持っているかが与えられる。 このうち i(1≦i≦N) 行目では、 i 番目の硬貨を、高橋君が何枚持っているかを表す整数 Ai(0≦Ai≦50000)が与えられる。 # 出力 # 高橋君が払える金額の種類数を、 1000000007 で割った余りを 1 行で出力せよ。出力の末尾は改行をいれること。 # # 入力例1 # 2 # 2 # 1 # 出力例1 # 5 # 払える金額は、1 円, 2 円, 10 円, 11 円, 12 円の 5 通りとなります。 # # 0 円は含まないことに注意してください。 # # 入力例2 # 2 # 32 # 3 # 出力例2 # 62 # 1 円から 62 円の 62 通りの金額を支払うことが出来ます。 # # 入力例3 # 4 # 12 # 3 # 7 # 34 # 出力例3 # 12039 # 入力例4 # 10 # 1234 # 2 # 857 # 3858 # 1 # 5000 # 32 # 4 # 1 # 857 # 出力例4 # 969347336 # 1000000007 で割った余りを出力してください。 # '高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k‐1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べた いと思いました。 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるた め、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。' :- 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび), 硬貨の合計金額種類(_枚数ならび,_何通り), '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り). 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび) :- 標準入力から整数を得る(_何種類), findall(_整数,( between(1,_何種類,_), 標準入力から整数を得る(_整数)), _枚数ならび). 硬貨の合計金額種類(_枚数ならび,_何通り) :- findall(_合計金額,合計金額(0,_枚数ならび,0,_合計金額),L1), sort(L1,L2), length(L2,_何通り). 合計金額(N,[],_合計金額,_合計金額). 合計金額(N,[_枚数|R],_合計金額_1,_合計金額) :- '1から枚数分を増やして合計金額を非決定性に計算していく'(N,_枚数,_ご金額金額_1,_合計金額_2), succ(N,N_2), 合計金額(N_2,R,_合計金額_2,_合計金額). '1から枚数分を増やして合計金額を非決定的に計算していく'(N,_枚数,_合計金額_1,_合計金額_2) :- between(1,_枚数,M), _合計金額_2 is _合計金額_1 + 10 ^ N * M. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- writef('%t種類\n',[_種類]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- _種類 >= 1000000007, _種類を1000000007で割った余り is _種類 mod 1000000007, writef('%t種類\n',[_種類を1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 11 で割り切れる数には、奇数桁の数の和と、偶数桁の数の和を比べると、差が 11 の倍数になっている、という性質があります。この際、一の位を 1 桁目、十の位を 2 桁目、というように、小さい数字から数えていくことに注意してください。 # # 例えば、 7392 という数字について、偶数桁に存在する数字は、 2 桁目の 9 と、 4 桁目の 7 であり、その和は 16です。 奇数桁に存在する数字は、 1 桁目の 2 と、 3 桁目の 3 であり、この和は 5 です。 16 と 5 の差は 11 であり、上記の性質を満たします。 # # あなたは、 与えられた整数が、 11 の倍数であるかどうか調べたいです。そのため、偶数桁の数の和と、奇数桁の数の和を求めようと思っています。この 2 つの値を出力するプログラムを書いてください。 'あなたは、 与えられた整数が、 11 の倍数であるかどうか調べたいです。そのため、偶数桁の数の和と、奇数桁の数の和を求めようと思っています。この 2 つの値を出力するプログラムを書いてください。' :- 標準入力から整数を得る(_与えられた整数), '偶数桁の数の和と、奇数桁の数の和を求めよう'(_与えられた整数,0,0,_偶数桁の和,_奇数桁の和), 出力する(_与えられた整数,_奇数桁の和,_偶数桁の和). '偶数桁の数の和と、奇数桁の数の和を求めよう'(0,S_1,S_2,S_1,S_2) :- !. '偶数桁の数の和と、奇数桁の数の和を求めよう'(N,S_1_1,S_2_1,S_1,S_2) :- D is N // 10, S_2_2 is S_2_1 + N mod 10, '偶数桁の数の和と、奇数桁の数の和を求めよう'(D,S_2_2,S_1_1,S_2,S_1). 出力する(_偶数桁の和,_奇数桁の和) :- writef('%t %t\n',[_偶数桁の和,_奇数桁の和]). 標準入力から整数を得る(_整数) :- 標準入力から数字ならびを得る(_数字ならび), 数字ならびを整数に変換する(_数字ならび,_整数). 標準入力から数字ならびを得る(_数字ならび) :- findall(_数字,( 一文字入力(_数字),(改行またはEOF(_数字),!,fail;'10進数字'(_数字))), _数字ならび). 一文字入力(_文字) :- get_char(_文字). 一文字入力(_文字) :- 一文字入力(_文字). 改行またはEOF('\n'). 改行またはEOF(end_of_file). '10進数字'(_数字) :- member(_数字,['0','1','2','3','4','5','6','7','8','9','-','+','.']). 数字ならびを整数に変換する(_数字ならび,_整数) :- atom_chars(_数字文字列,_数字ならび), catch(read_term_from_atom(_数字文字列,_整数,[]),E,fail). integer(_整数). % 以下のサイトは # サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 # # 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 # # この対面にある、底面に書かれた数字を出力してください。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # 1 行目には、サイコロの上の面に書かれている数字を表す 1 つの整数 A(1≦A≦6) が与えられる。 # 出力 # サイコロの底の面に書かれている数字を 1 行で出力せよ。出力の末尾には改行をいれること。 # # 入力例1 # 6 # 出力例1 # 1 # 6 の裏に書かれている数字は 1 です。 # # 入力例2 # 3 # 出力例2 # 4 # :- dynamic(対面にある数字/2). 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 この対面にある、底面に書かれた数字を出力してください。' :- 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。', '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A), 'この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字), 出力してください(_対面にある底面に書かれた数字). 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。' :- ' 1 から 6 までの数字が一つずつ書かれており、'(_1から6までの数字), 対面の和が 7 になるように作られています。'(_1から6までの数字). ' 1 から 6 までの数字が一つずつ書かれており、'(_1から6までの数字) :- between(1,6,_1から6までの数字). '対面の和が 7 になるように作られています。'(_1から6までの数字) :- '対面の和が 7 に'(_1から6までの数字,_対面にある数字), 'なるように作られています。'(_1から6までの数字,_対面にある数字). '対面の和が 7 に'(_1から6までの数字,_対面にある数字) :- length(L1,_1から6までの数字), length(_対面の和を表すならび,7), append(L1,L2,_対面の和を表すならび), length(L2,_対面にある数字). 'なるように作られています。'(_1から6までの数字,_対面にある数字) :- assertz(対面にある数字(_1から6までの数字,_対面にある数字)). '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A) :- 標準入力から整数を得る(_A). 'この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字) :- 対面にある数字(_A,_対面にある底面に書かれた数字). 出力してください(_対面にある底面に書かれた数字) :- writef('%t\n',[_対面にある底面に書かれた数字]). 標準入力から整数を得る(_A) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 # # 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 # # この対面にある、底面に書かれた数字を出力してください。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # 1 行目には、サイコロの上の面に書かれている数字を表す 1 つの整数 A(1≦A≦6) が与えられる。 # 出力 # サイコロの底の面に書かれている数字を 1 行で出力せよ。出力の末尾には改行をいれること。 # # 入力例1 # 6 # 出力例1 # 1 # 6 の裏に書かれている数字は 1 です。 # # 入力例2 # 3 # 出力例2 # 4 # 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 この対面にある、底面に書かれた数字を出力してください。' :- '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A), 'このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字), 出力してください(_対面にある底面に書かれた数字). '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A) :- 標準入力から整数を得る(_A). 'このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字) :- length(L1,_A), length(L2,_対面にある底面に書かれた数字), length(_対面の和を表すならび,7), append(L1,L2,_対面の和を表すならび). 出力してください(_対面にある底面に書かれた数字) :- writef('%t\n',[_対面にある底面に書かれた数字]). 標準入力から整数を得る(_A) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0.0,200.0,_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), read_term_from_atom(_身長文字列,_身長,[]), read_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重) :- 収束条件を満たす(_体重_下,_体重_上,_体重),!. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下_1,_体重_上_1,_身長,_BMI,_体重) :- '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重). 収束条件を満たす(_体重_下,_体重_上,_体重) :- (_体重_上 - _体重_下) < 0.1, _体重 is (_体重_上 + _体重_下) / 2. '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上) :- '新しい体重とその時のBMIを計算する'(_体重_下_1,_体重_上_1,_身長,_BMI_2,_体重_2), '次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体重_上). '新しい体重とその時のBMIを計算する'(_体重_下,_体重_上,_身長,_BMI_2,_体重_2) :- _体重_2 is (_体重_下 + _体重_上) / 2, _BMI_2 is _体重_2 / ((_身長 / 100) ^ 2). '次の体重の計算区間を得る'(_体重_下,_,_体重_2,_BMI,_BMI_2,_体重_下,_体重_2) :- _BMI_2 =< _BMI,!. '次の体重の計算区間を得る'(_体重_下,_体重_上,_体重_2,_BMI,_BMI_2,_体重_2,_体重_上). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % これはsplitをわかりやすいように簡略化した定義です。 % より完全なsplit/3の定義はこちらをご覧ください % split(_文,_区切り語ならび,_区切られた語ならび) :- 区切り語ならびの変形(_区切り語ならび,SeparatersL), atom_chars(_文,_文字ならび), split_list_1(_文字ならび,SeparatersL,_区切られた語ならび). sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_list([],SeparatersL,[]). split_list(L1,SeparatersL,[L2|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), split_list(R2,SeparatersL,R). split_list(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list(R2,SeparatersL,X). split_list_1([],SeparatersL,[]). split_list_1(L1,SeparatersL,[A|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), atom_chars(A,L2), split_list_1(R2,SeparatersL,R). split_list_1(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list_1(R2,SeparatersL,X). split_list_2([],_,[],[]). split_list_2(L1,SeparatersL,[],R) :- member(L2,SeparatersL), append(L2,R,L1). split_list_2([A|R1],SeparatersL,[A|R2],R) :- \+((member(L2,SeparatersL),append(L2,_,[A|R1]))), split_list_2(R1,SeparatersL,R2,R). 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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), catch(atom_chars(C,NL),_,fail),!. 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([],[],'',_,[]) :- !. 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),!. number(A,B) :- number_codes(A,B). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/811 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # :午前:午後:夜間 # 月曜:診療:診療:診療 # 火曜:休診:診療:診療 # 水曜:休診:診療:休診 # 木曜:診療:診療:診療 # 金曜:診療:診療:診療 # 土曜:診療:休診:休診 # 日曜:休診:休診:休診 # *表の時間外も休診とする # 上記のような病院の診療スケジュールがある # その表をもとに、曜日と時間が入力されるので、 # 診療時間(診療)であれば、Practiceと表示、 # 診療時間外(休診)であれば、is closedと表示すること # 午前:09:00-12:00 # 午後:14:00-17:00 # 夜間:18:00-20:00 # 曜日の入力値 # 月曜:0 火曜:1 水曜:2 # 木曜:3 金曜:4 土曜:5 # 日曜:6 # 実行例) # 0 10:00 入力 # Practice 出力 # 2 18:30 入力 # is closed 出力 # 5 10:30 入力 # Practice 出力 # [月曜:診療:診療:診療]. [火曜:休診:診療:診療]. [水曜:休診:診療:休診]. [木曜:診療:診療:診療]. [金曜:診療:診療:診療]. [土曜:診療:休診:休診]. [日曜:休診:休診:休診]. [午前:09:00-12:00]. [午後:14:00-17:00]. [夜間:18:00-20:00]. 曜日の入力値(月曜,0). 曜日の入力値(火曜,1). 曜日の入力値(水曜,2). 曜日の入力値(目曜,3). 曜日の入力値(金曜,4). 曜日の入力値(土曜,5). 曜日の入力値(日曜,6). ':午前:午後:夜間 月曜:診療:診療:診療 火曜:休診:診療:診療 水曜:休診:診療:休診 木曜:診療:診療:診療 金曜:診療:診療:診療 土曜:診療:休診:休診 日曜:休診:休診:休診 *表の時間外も休診とする 上記のような病院の診療スケジュールがある その表をもとに、曜日と時間が入力されるので、 診療時間(診療)であれば、Practiceと表示、 診療時間外(休診)であれば、is closedと表示すること 午前:09:00-12:00 午後:14:00-17:00 夜間:18:00-20:00 曜日の入力値 月曜:0 火曜:1 水曜:2 木曜:3 金曜:4 土曜:5 日曜:6'(_曜日の入力値,_時間の入力値) :- '診療時間(診療)であれば、Practiceと表示、診療時間外(休診)であれば、is closedと表示すること'(_曜日の入力値,_時間の入力値). '診療時間(診療)であれば、Practiceと表示、診療時間外(休診)であれば、is closedと表示すること'(_曜日の入力値,_時間の入力値) :- read_term_from_atom(_時間の入力値,_時:_分,[]), 曜日の入力値(_曜日,_曜日の入力値), '診療/休診判定'(_曜日,_時,_分,_判定), '診療時間(診療)であれば、Practiceと表示、診療時間外(休診)であれば、is closedと表示すること'(_判定). '診療/休診判定'(_曜日,_時,_分,_判定) :- 時間(_時,_分,_時間), '診療/休診判定'(_曜日,_時間,_判定). '診療/休診判定'(_曜日,午前,_判定) :- [_曜日,_判定,_,_]. '診療/休診判定'(_曜日,午後,_判定) :- [_曜日,_,_判定,_]. '診療/休診判定'(_曜日,夜間,_判定) :- [_曜日,_,_,_判定]. '診療/休診判定'(_曜日,時間外,休診). 時間(_時,_分,_時間) :- [_時間:_時下限:_点下限-_時上限:_分上限], [_時,_分] @>= [_時下限,_分下限], [_時,_分] @=< [_時上限,_分上限],!. 時間(_時,_分,時間外). '診療時間(診療)であれば、Practiceと表示、診療時間外(休診)であれば、is closedと表示すること'(診療) :- write('Practice\n'). '診療時間(診療)であれば、Practiceと表示、診療時間外(休診)であれば、is closedと表示すること'(休診) :- write('is closed\n'). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/745 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 1)変数名 kokugo,shakai,rika を整数型で宣言する。(国語、社会、理科) # 変数名 goukei,heikinを整数型で宣言する。(合計、平均) # 2)「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。 # 3)3科目の合計を求める。 # 4)enumを使うこと # '「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。' :- forall(科目の点数を入力する(_科目,_点数),assertz(成績(_科目,_点数))). 科目の点数を入力する(_科目,_点数) :- 科目と催促文を得る(_科目,_催促文), 整数を得る(_催促文,integer(_点数),_点数). 科目と催促文を得る(_科目,_催促文) :- member(_科目,[国語,社会,理科]), swritef(_催促文,'%tの点数=',[_科目]). '3科目の合計を求める。'(_合計) :- findsum(_点数,成績(_,_点数),_合計). '3科目の平均を求める。'(_平均) :- findavg(_点数,成績(_,_点数),_平均). findsum(A,_目標,_合計) :- findall(A,_目標,_解ならび), sum_list(_解ならび,_合計). findavg(A,_目標,_相和平均) :- findall(A,_目標,_解ならび), 相和平均(_解ならび,_相和平均). 相和平均([_標本|R],_相和平均) :- length([_標本|R],_標本数), sum_list([_標本|R],_合計), _相和平均 is _合計 / _標本数. 整数を得る(_催促文,_条件,_整数) :- write(_催促文), 行を得る(_行), 整数入力検査(_行,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 行を得る(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 整数入力検査(_行,_条件,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査と条件検査(_行,_整数,_条件). 整数検査と条件検査(_行,_整数,_条件) :- 整数検査(_行,_整数), 条件検査(_行,_条件). 整数検査(_行,_整数) :- integer(_整数),!. 整数検査(_整数) :- writef('入力された行 %w から整数は得られません。\n',[_行]), fail. 条件検査(_行,_条件) :- call(_条件),!. 条件検査(_行,_条件) :- writef('入力された行 %w からは、条件 %w が真になりません。\n',[_行,_条件]), fail. % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは # [1] 小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 # その答えが100になるものを見つける)を解くプログラムを作成しなさい。プログラムはint型の変数を用い、 # 複数のクラスを定義して作成すること。 # 例 1+2+3‐4+5+6+78+9=100 # ' 小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解くプログラムを作成しなさい。プログラムはint型の変数を用い、 複数のクラスを定義して作成すること。 例 1+2+3‐4+5+6+78+9=100 '(_式) :- '小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解く'(_式). '小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解く'(_式) :- '数字の間に+や‐といった算術記号を入れて'([_1,_2,_3,_4,_5,_6,_7,_8]), atomic_list_concat([1,_1,2,_2,3,_3,4,_4,5,_5,6,_6,7,_7,8,_8,9],S), read_term_from_atom(S,_式,[]), 100 is _式. '数字の間に+や‐といった算術記号を入れて'([]). '数字の間に+や‐といった算術記号を入れて'([A|R]) :- member(A,[+,-,'']), '数字の間に+や‐といった算術記号を入れて'(R). % 以下のサイトは # [1] 小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 # その答えが100になるものを見つける)を解くプログラムを作成しなさい。プログラムはint型の変数を用い、 # 複数のクラスを定義して作成すること。 # 例 1+2+3‐4+5+6+78+9=100 # ' 小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解くプログラムを作成しなさい。プログラムはint型の変数を用い、 複数のクラスを定義して作成すること。 例 1+2+3‐4+5+6+78+9=100 '(_式) :- '小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解く'(_式). '小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解く'(_式) :- L = [+,-,''], member(_1,L), member(_2,L), member(_3,L), member(_4,L), member(_5,L), member(_6,L), member(_7,L), member(_8,L), atomic_list_concat([1,_1,2,_2,3,_3,4,_4,5,_5,6,_6,7,_7,8,_8,9],S), read_term_from_atom(S,_式,[]), 100 is _式. % 以下のサイトは # # append/4からappend/nまでを一気に定義してしまう、 'append/4から/nの定義'/1 。 # append/nの定義、 'append/nの定義'/1 。 # 'append/4からappend/nの定義'(_n) :- between(4,_n,M), 'abolish_append/n'(M), 'append/nの定義'(M), _n = M. 'append/nの定義'(_n) :- 'L2からLnまで'(_n,_L2_Ln), 'L2からLn_1まで'(_n,_L2_Ln_1), 'L1からLnまで'(_n,_L1_Ln), 'append/nの定義'(_n,_L2_Ln,_L2_Ln_1,_L1_Ln). 'append/nの定義'(_n,_L2_Ln,_L2_Ln_1,_L1_Ln) :- 'append/nの第一節の定義'(_n,_L2_Ln), 'append/nの第二節の定義'(_n,_L2_Ln_1,_L1_Ln). 'append/nの第一節の定義'(_n,_L2_Ln) :- format(atom(S1),'append([],~w) :-~n append(~p).~n',[_L2_Ln,_L2_Ln]), read_term_from_atom(S1,Clause_1,[variables(_変数ならび),variable_names(_変数名ならび)]), assertz(Clause_1). 'append/nの第二節の定義'(_n,_L2_Ln_1,_L1_Ln) :- format(atom(S2),'append([U|L1],~w,[U|L~p]) :-~n append(~w).\n',[_L2_Ln_1,_n,_L1_Ln]), read_term_from_atom(S2,Clause_2,[variables(_変数ならび),variable_names(_変数名ならび)]), assertz(Clause_2). 'L2からLnまで'(_n,_L2_Ln) :- findall(A,( between(2,_n,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L2_Ln). 'L2からLn_1まで'(_n,_L2_Ln_1) :- _m is _n - 1, findall(A,( between(2,_m,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L2_Ln_1). 'L1からLnまで'(_n,_L1_Ln) :- findall(A,( between(1,_n,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L1_Ln). 'abolish_append/n'(_n) :- abolish(append,_n). % 以下のサイトは # 出典: プログラムのお題スレ Part4 #38 # # 標準入力から与えられたフォーマットを元に年齢を求めて出力せよ # 標準入力から以下の形式で与えられます # YYYY/MM/dd # # 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。 '標準入力から与えられたフォーマットを元に年齢を求めて出力せよ 標準入力から以下の形式で与えられます YYYY/MM/dd 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。' :- '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日), '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢), 出力せよ(_年齢). '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日) :- get_line(_文字列), read_term_from_atom(_文字列,_年/_月/_日,[]). '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢) :- date(date(_今日_年,_今日_月,_今日_日)), 誕生日の前日(_今日_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日), '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). 誕生日の前日(_年,_月,1,_前日_年,_前日_月,_前日_日) :- 誕生日の前月と月末日を得る(_年,_月,1,_前日_年,_前日_月,_前日_日). 誕生日の前日(_年,_月,_日,_年,_月,_前日_日) :- \+(_日 = 1), succ(_前日_日,_日). 誕生日の前月と月末日を得る(_誕生日の年,1,1,_誕生日の前年,12,31) :- succ(_誕生日の前年,_誕生日の年). 誕生日の前月と月末日を得る(_年,3,1,_年,2,_誕生日の前月末日) :- '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,_誕生日の前月末日). 誕生日の前月と月末日を得る(_年,_誕生日の月,1,_年,_誕生日の前月,30) :- '誕生日の前月が小の月(2月を除く)'(_誕生日の月,_誕生日の前月). 誕生日の前月と月末日を得る(_年,_誕生日の月,1,_年,_誕生日の前月,31) :- '誕生日の前月が大の月(12月を除く)'(_誕生日の月,_誕生日の前月). '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,29) :- うるう年(_年). '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,28) :- \+(うるう年(_年)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. '誕生日の前月が小の月(2月を除く)'(_誕生日の月,_誕生日の前月) :- succ(_誕生日の前月,_誕生日の月), member(_誕生日の前月,[4,6,9,11]). '誕生日の前月が大の月(12月を除く)'(_誕生日の月,_誕生日の前月) :- succ(_誕生日の前月,_誕生日の月), member(_誕生日の前月,[1,3,5,7,8,10]). '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 < _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年 - 1. まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 < _誕生日の前日の日, _年齢 is _誕生日の前日_年 - _年 - 1. 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 > _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年. 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 >= _誕生日の前日_日, _年齢 is _誕生日の前日_年 - _年. 出力せよ(_年齢) :- writef('%t歳です\n',[_年齢]). % 以下のサイトは # 出典: プログラムのお題スレ Part4 #38 # # 標準入力から与えられたフォーマットを元に年齢を求めて出力せよ # 標準入力から以下の形式で与えられます # YYYY/MM/dd # # 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。 '標準入力から与えられたフォーマットを元に年齢を求めて出力せよ 標準入力から以下の形式で与えられます YYYY/MM/dd 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。' :- '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日), '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢), 出力せよ(_年齢). '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日) :- get_line(_文字列), read_term_from_atom(_文字列,_年/_月/_日,[]). '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢) :- date(date(_今日_年,_今日_月,_今日_日)), 誕生日の前日(_今日_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日), '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). 誕生日の前日(_年,1,1,_前日_年,12,31) :- succ(_前日_年,_年),!. 誕生日の前日(_年,3,1,_年,2,29) :- うるう年(_年),!. 誕生日の前日(_年,3,1,_年,2,28) :- \+(うるう年(_年)),!. 誕生日の前日(_年,_月,1,_年,_前日_月,31) :- member(_月,[2,4,6,9,11]), succ(_前日_月,_月),!. 誕生日の前日(_年,_月,1,_年,_前日_月,30) :- member(_月,[5,7,8,10,12]), succ(_前日_月,_月),!. 誕生日の前日(_年,_月,_日,_年,_月,_前日_日) :- succ(_前日_日,_日). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 > _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 < _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年 - 1. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 >= _誕生日の前日_日, _年齢 is _誕生日の前日_年 - _年. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 < _誕生日の前日の日, _年齢 is _誕生日の前日_年 - _年 - 1. 出力せよ(_年齢) :- writef('%t歳です\n',[_年齢]). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #935 # # W=横の長さ、H=縦の長さ # 2<=W<=1000、2<=H<=1000 # 箱の枠は「+」、箱の中は「@」で出力しなさい # # 入力は以下の形式で標準入力から与えられます # W H # # 例 # --------------------- # 2 2 # ++ # ++ # --------------------- # 10 4 # ++++++++++ # +@@@@@@@@+ # +@@@@@@@@+ # ++++++++++ '# W=横の長さ、H=縦の長さ 2<=W<=1000、2<=H<=1000 箱の枠は「+」、箱の中は「@」で出力しなさい 入力は以下の形式で標準入力から与えられます W H' :- 標準入力からWとHを得る(W,H), split(Line,[' '],[W,H]), 全体像(W,H,_全体像), 全体像を描画する(_全体像). 標準入力からWとHを得る(W,H) :- read_line_to_codes(Codes,[]), 中間の32を一個のの44に置き換える(Codes,Codes2), string_to_atom(Codes2,Atom), read_term_from_atom(Atom,(W,H,[]). 中間の32を一個のカンマに置き換える(Codes,Codes2) :- append(L1,L2,L3,Codes), all(L2,32), \+(member(32,L1)), \+(member(32,L2)), append(L1,[44|L3],Codes2). 全体像(W,H,_全体像) :- findall(L,( between(1,H,_), findall(_,( between(1,W,_)), L)), _全体像), 全体像(_全体像). 全体像(_全体像) :- append([_第一行],_中間行ならび,[_最終行],_全体像), all(_第一行,'+'), all(_最終行,'+'), '内側は先頭要素と最後の要素が+、中間要素は@となる'(_中間行ならび). '内側は先頭要素と最後の要素が+、中間要素は@となる'([]). '内側は先頭要素と最後の要素が+、中間要素は@となる'([L|R]) :- '先頭要素と最後の要素が+、中間要素は@となる'(L), '内側は先頭要素と最後の要素が+、中間要素は@となる'(R). '先頭要素と最後の要素が+、中間要素は@となる'(L) :- append(['+'],L2,['+'],L), all(L2,'@'),!. 全体像を描画する([]). 全体像を描画する([L|R]) :- atom_chars(_行表示,L), writef('%t\n',[_行表示]), 全体像を描画する(R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all([]). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([A|L1],L2,L3,[A|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは 行は前半の文字列と後半の数値で構成される(_行,_前半の文字列,_後半の数値) :- sub_atom(_行,0,Len,_,_前半の文字列), 文字列は数字とピリオドを含まない(_前半文字列), sub_atom(_行,Len,_,0,_後半の数字文字列), 文字列は数字かピリオドだけで構成されている(_後半の数字文字列), read_term_from_atom(_後半の数字文字列,_後半の数値,[]). 文字列は数字とピリオドを含まない(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),\+(数字かピリオド(_文字))). 文字列は数字かピリオドだけで構成されている(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),数字かピリオド(_文字)). 数字かピリオド('0'). 数字かピリオド('1'). 数字かピリオド('2'). 数字かピリオド('3'). 数字かピリオド('4'). 数字かピリオド('5'). 数字かピリオド('6'). 数字かピリオド('7'). 数字かピリオド('8'). 数字かピリオド('9'). 数字かピリオド('0'). 数字かピリオド('.'). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 167代目 #309 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&amp;リンク):入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返すプログラム。 # [3] 環境 #  [3.1] OS:Windows #  [3.2] コンパイラ名とバージョン:Visual C++ 2010 #  [3.3] 言語:C++ # [4] 期限:4月18日 '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す' :- '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(0). '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和) :- 入力した奇数の和が20を超えるまで(_入力した奇数の和),!. '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和_1) :- '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1). 入力した奇数の和が20を超えるまで(_入力した奇数の和) :- _入力した奇数の和 > 20. '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1) :- '入力した数が奇数の場合表示する。'(_入力した奇数の和_1). '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1) :- '奇数でない場合はなにもしない。'(_入力した奇数の和_1). '入力した数が奇数の場合表示する。'(_入力した奇数の和_1) :- '入力した数が奇数の場合'(_入力した数), 表示する(_入力した数), _入力した奇数の和_2 is _入力した数 + _入力した奇数の和_1, '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和_2). '入力した数が奇数の場合'(_入力した数) :- 入力した数が(_入力した数), 奇数の場合(_入力した数). '奇数でない場合はなにもしない。'(_入力した奇数の和) :- '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和). 入力した数が(_入力した数) :- 整数を得る('整数を入力して下さい: ',true,_入力した数),!. 奇数の場合(_入力した数) :- 1 is _入力した数 mod 2. 表示する(_入力した数) :- writef('%w\n',[_入力した数]). 整数を得る(_催促文,_条件,_整数) :- write(_催促文), 行を得る(_行), 整数入力検査(_行,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 行を得る(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 整数入力検査(_行,_条件,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査と条件検査(_行,_整数,_条件). 整数検査と条件検査(_行,_整数,_条件) :- 整数検査(_行,_整数), 条件検査(_行,_条件). 整数検査(_行,_整数) :- integer(_整数),!. 整数検査(_整数) :- writef('入力された行 %w から整数は得られません。\n',[_行]), fail. 条件検査(_行,_条件) :- call(_条件),!. 条件検査(_行,_条件) :- writef('入力された行 %w からは、条件 %w が真になりません。\n',[_行,_条件]), fail. % 以下のサイトは # 出典: http://toro.2ch.net/test/read.cgi/tech/1392388003/167 # 文字列(string型)の先頭から数字として有効な文字数を返す関数ってどうやって作れば良いですか? # 例 # "126AB"→3 # "-(1+2)"→0 # "-9.25ABC"→5 '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_文字数,_先頭から数字として有効な文字列,_数値) :- atom_length(_文字列,_長さ), '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_長さ,_文字数,_先頭から数字として有効な文字列,_数値). '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_文字数,_文字数,_先頭から数字として有効な文字列,_数値) :- '文字列の先頭から数字として有効な文字列・文字数・数値'(_文字列,_文字数,_先頭から数字として有効な文字列,_数値),!. '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_文字数,_先頭から数字として有効な文字列) :- _文字数 > 0, _文字数_1 is _文字数 - 1, '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_文字数_1,_先頭から数字として有効な文字列). '文字列の先頭から数字として有効な文字列・文字数・数値'(_文字列,_文字数,_先頭から数字として有効な文字列,_数値) :- _文字数 > 0, sub_atom(_文字列,0,_文字数,_,_先頭から数字として有効な文字列), catch(read_term_from_atom(_先頭から数字として有効な文字列,_数値,[]),_,fail), number(_数値),!. % 以下のサイトは # 出典: http://toro.2ch.net/test/read.cgi/tech/1392388003/167 # 文字列(string型)の先頭から数字として有効な文字数を返す関数ってどうやって作れば良いですか? # 例 # "126AB"→3 # "-(1+2)"→0 # "-9.25ABC"→5 文字列の先頭から数字として有効な文字数を得る(_文字列,_先頭から数字として有効な文字数) :- atom_length(_文字列,_長さ), 文字列の先頭から数字として有効な文字数を得る(_文字列,_長さ,_先頭から数字として有効な文字数). 文字列の先頭から数字として有効な文字数を得る(_文字列,_先頭から数字として有効な文字数,_先頭から数字として有効な文字数) :- 文字列の先頭から数字として有効な文字数(_文字列,_先頭から数字として有効な文字数),!. 文字列の先頭から数字として有効な文字数を得る(_文字列,_文字数,_先頭から数字として有効な文字数) :- _文字数 > 0, _文字数_1 is _文字数 - 1, 文字列の先頭から数字として有効な文字数を得る(_文字列,_文字数_1,_先頭から数字として有効な文字数). 文字列の先頭から数字として有効な文字数(_文字列,_先頭から数字として有効な文字数) :- _先頭から数字として有効な文字数 > 0, sub_atom(_文字列,0,_先頭から数字として有効な文字数,_,_副文字列), catch(read_term_from_atom(_副文字列,_項,[]),_,fail), number(_項),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列の先頭から数字として有効な文字列を切り出す(_文字列,_先頭から数字として有効な文字列) :- sub_atom(_文字列,0,Len,R,_先頭から数字として有効な文字列), (catch(read_term_from_atom(_先頭から数字として有効な文字列,_項,[]),_,fail),number(_項)), succ(Len,Len2), \+((sub_atom(_文字列(0,Len2,_,_副文字列2),catch(read_term_from_atom(_副文字列2,_項,[]),_,fail)),!. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/541 # 質問です教えてください # # データベース = access # テーブル名 = T_DATA # # SQLで取得したい結果は、KEYごとに日数を取得したいのですが # 重複する日数はカウントから除外したいです。 # どんなSQLを書けばいいですか? # # ・キーは、日数=5日 # ・キーは、日数=1日 # # ---------------------------------- # キー, 開始日, 終了日 # ---------------------------------- # 1, 2014/01/01, 2014/01/01 |→ 日数=1日 # 1, 2014/01/02, 2014/01/02 |→ 日数=1日 # 1, 2014/01/02, 2014/01/02 |→ 日数=0日(重複) # 1, 2014/01/03, 2014/01/03 |→ 日数=1日 # 1, 2014/01/04, 2014/01/05 |→ 日数=2日、合計=5日 # --- # 2, 2014/01/01, 2014/01/01 |→ 日数=1日 # 2, 2014/01/01, 2014/01/01 |→ 日数=0日(重複)、合計=1日 # # ↓これだと重複がカウントされてしまいます。 # SELECT # キー # ,SUM(DATEDIFF('d', 開始日, 終了日)+1) AS 日数 # FROM # T_DATA # GROUP BY # キー # 'データベース = access テーブル名 = T_DATA SQLで取得したい結果は、KEYごとに日数を取得したいのですが 重複する日数はカウントから除外したいです。'(_キーごとの日数) :- setof(_キー,[_キー,_開始日,_終了日] ^ 'T_DATA'(_キー,_開始日,_終了日),_キーならび), findall([_キー,_日数],( member(_キー,_キーならび), キーの日数を得る(_キー,_日数)), _キーごとの日数). キーの日数を得る(_キー,_日数) :- findall(_日,( 'T_DATA'(_キー,_開始日,_終了日), 整数構造に変換(_開始日,_終了日,_開始日整数構造,_終了日整数構造), 範囲の日を引出す(_開始日整数構造,_終了日整数構造,_日)), L1), 重複日を取り除いた日数(L1,_日数). 整数構造に変換(_開始日,_終了日,_開始日整数構造,_終了日整数構造) :- read_term_from_atom(_開始日,_開始日整数構造), read_term_from_atom(_終了日,_終了日整数構造). 範囲の日を引出す(_終了日,_終了日,_終了日) :- !. 範囲の日を引出す(_日,_終了日,_日). 範囲の日を引出す(_日_1,_終了日,_日) :- 翌日(_日_1,_翌日), 範囲の日を引出す(_翌日,_終了日,_日). 翌日(_年/12/_31,_翌年/1/1) :- _翌年 is _年 + 1,!. 翌日(_年/_月/_日,_年/_翌月/1) :- 月末日(_年/_月/_日), _翌月 is _月 + 1,!. 翌日(_年/_月/_日,_年/_月/_翌日の日) :- _翌日の日 is _日 + 1,!. 月末日(_年/2/29) :- うるう年(_年),!. 月末日(_年/2/28) :- \+(うるう年(_年)),!. 月末日(_年/_月/30) :- member(_月,[4,6,9,11]),!. 月末日(_年/_月/31) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 重複日を取り除いた日数(L1,_日数) :- sort(L1,L2), length(L2,_日数). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/990 # お題:円周率の歴史の長さからみれば出来立てほやほやのBBPの式を使って # 円周率を小数点以下15桁まで求める。 #   ∞ # π=Σ(4/(8*k+1)-1/(4*k+2)-1/(8*k+5)-1/(8*k+6))/(16^k) #   k=0 # # '円周率の歴史の長さからみれば出来立てほやほやのBBPの式を使って円周率を小数点以下15桁まで求める。'(_円周率) :- 'BBPの式'(_円周率_1), sformat(S,'~15f',[_円周率_1]), read_term_from_atom(S,_円周率,[]). 'BBPの式'(_円周率) :- findsum(A,( between(0,20,_k), A is (4/(8*_k+1)-1/(4*_k+2)-1/(8*_k+5)-1/(8*_k+6))/(16^_k)), _円周率). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/885 # 夜分遅くに申し訳ございません… # 本日9時提出の課題を今になって気づいたのですが、私の頭ではさっぱりわからないのでお助け下さい… # # [1]プログラミングC # [2] 問題文(含コード&リンク): # 問1:以下の実行結果に示すような、3つの実数を入力した後、最大値と最小値の差を求めるプログラムを作成せよ。 # ※例 # 3つの整数を入力してください。 # na=12 # nb=65 # nc=44 # 65と12の差は53です。 # # 問2:以下の文字列(programming_jissyu)が配列に格納されているとする。 # この文字列を任意の位置で2つ分割して表示するプログラムを作成せよ。 # ※例 # 難文字目で分割しますか:11 # 文字列の前半 # programming # 文字列の後半 # _jissyu # '問1:以下の実行結果に示すような、3つの整数を入力した後、最大値と最小値の差を求めるプログラムを作成せよ。 ※例 3つの整数を入力してください。 na=12 nb=65 nc=44 65と12の差は53です。' :- '3つの整数を入力した後、'(_3つの整数), 最大値と最小値の差(_3つの整数,_最大値,_最小値,_最大値と最小値の差), writef('%tと%tの差は%tです。',[_最大値,_最小値,_最大値と最小値の差]). '3つの整数を入力した後、'(_3つの整数) :- write('3つの整数を入力してください。\n'), findall(_整数,( member(A,[na,nb,nc]), writef('%t=',[A]), 整数を得る(_整数)), _3つの整数). 最大値と最小値の差(_3つの整数,_最大値,_最小値,_最大値と最小値の差) :- 最大値(_3つの整数,_最大値), 最小値(_3つの整数,_最小値), _最大値と最小値の差 is _最大値 - _最小値. 最大値(_整数ならび,_最大値) :- select(N,_整数ならび,R), forall(member(M,R),M =< N). 最小値(_整数ならび,L_最小値) :- select(N,_整数ならび,R), forall(member(M,R),M >= N). 整数を得る(_整数) :- 一行読み込む(Line), '診断: 整数を得る'(Line,_整数),!. 整数を得る(_整数) :- 整数を得る(_整数). '診断: 整数を得る'(Line,_整数) :- read_term_from_atom(Line,_整数,[]), integer(_整数),!. '診断: 整数を得る'(Line,_整数) :- writef('入力された値"%t"から整数は得られません。再入力をお願いします。\n',[Line]), fail. 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/745 # [2] キーボードから読み込む、実数の3乗を求めて表示するプログラム(floatを用いて) # 'キーボードから実数を読み込む、実数の3乗を求めて表示する' :- キーボードから実数を読み込む(_実数), 実数の3乗を求めて(_実数,_実数の3乗), 表示する(_実数,_実数の3乗). キーボードから実数を読み込む(_実数) :- get_line(_行), 実数入力検査(_行,_実数),!. キーボードから実数を読み込む(_実数) :- キーボードから実数を読み込む(_実数). 実数入力検査(_行,_実数) :- read_term_from_atom(_行,_実数,[]), float(_実数),!. 実数入力検査(_行,_実数) :- writef('入力された%tは実数ではありません。再入力をお願いします。\n',[_行]), fail. 実数の3乗を求めて(_実数,_実数の3乗) :- _実数の3乗 is _実数 ^ 3. 表示する(_実数,_実数の3乗) :- writef('%t ^ 3 = %t\n',[_実数,_実数の3乗]). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/576 # 西暦何年かを入力するとその年に月曜日が何回あるか数え # 52回なら1を、53回なら0を出力するプログラムお願いします… # # 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします # (0を入力したら終わりです) # # 入力できるのは1989〜5000です # # '西暦何年かを入力するとその年に月曜日が何回あるか数え 52回なら1を、53回なら0を出力するプログラムお願いします… 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします (0を入力したら終わりです) 入力できるのは1989〜5000です' :- '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_西暦ならび). '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび) :- findall(_西暦,( '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('西暦(1989~5000)を入力して下さい',_西暦),( _西暦=0,!,fail;true)),_西暦ならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([]). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([_西暦|_残りならび]) :- 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1), writef('%t年 %t\n',[_西暦,_0または1]), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_残りならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,_0または1). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,_0または1). うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,0) :- うるう年(_西暦), '1月1日が日曜か月曜の時は'(_西暦),!. うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,1) :- うるう年(_西暦). '1月1日が日曜か月曜の時は'(_西暦) :- 'Zellerの公式を用いて曜日を得る'(_西暦,1,1,_曜日を表す値,_曜日), member(_曜日,[日曜,月曜]). うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,0) :- \+(うるう年(_西暦)), 'Zellerの公式を用いて曜日を得る'(_西暦,1,1,_曜日を表す値,月曜),!. うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,1) :- \+(うるう年(_西暦)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- writef('%t ',[_催促文]), get_line(_入力行), '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦). '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('0',0) :- !. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦) :- read_term_from_atom(_入力行,_西暦,[]), integer(_西暦), between(1989,5000,_西暦),!. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_) :- writef('入力された文字列"%t"から1899年から5000年範囲の西暦が得られませんでした\n再入力をお願いします\n',[_入力行]), fail. get_line(Line) :- get_line(user_input,Line). get_line(Instream,Line) :- get_char(Instream,C), get_line_1(Instream,C,Chars), atom_chars(Line,Chars) . get_line_1(_,'\n',[]) :- !. get_line_1(_,end_of_file,[]) :- !. get_line_1(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_1(Instream,C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/658 # 任意精度整数モジュールを使ってバグ修正したかったが、 # 諸事情でそれもできなかったので出題の意図を縮小して訂正。 # # お題:1から10000までの整をすべて足せ。 # すべて足したら、その合計を表示せよ。 # # 回答例: Objective Caml version 3.08.1 # let sum1to n = # let rec f sum n = # if n = 0 then sum # else f (sum + n) (n - 1) in # f 0 n;; # print_int (sum1to 10000);; # ↓ # 50005000 # # '1から10000までの整数をすべて足せ。すべて足したら、その合計を表示せよ。' :- '1から10000までの整数をすべて足せ。'(_合計), 'すべて足したら、その合計を表示せよ。'(_合計). '1から10000までの整数をすべて足せ。'(_合計) :- findall(N,between(1,10000,N),_1から10000までのならび), atomic_list_concat(_1から10000までのならび,'+',_式文字列), read_term_from_atom(_式文字列,_式,[]), _合計 is _式. 'すべて足したら、その合計を表示せよ。'(_合計) :- writef('その合計は%t\n',[_合計]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/561 # n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。 # がわかりませぬ。どなたか教えてください。 # # 'n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。' :- 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数), 'それらの平均と標準偏差を出力する'(_n個,_n個の実数). 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数) :- length(_n個の実数,_n個), findall(_個々の実数,( 個々の実数(_n個の実数,_個々の実数), 実数を得る(_個々の実数)), _n個の実数). 'それらの平均と標準偏差を出力する'(_n個,_n個の実数) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差), writef('平均  = %t\n標準偏差 = %t\n',[_n個の実数の平均,_n個の実数の標準偏差). 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均) :- sum_list(_n個の実数,_n個の実数の合計), _n個の実数の平均 is _n個の実数の合計 / _n個. 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), findsum(_個々の実数と平均の差の二乗,( 個々の実数(_n個の実数,_個々の実数), _個々の実数と平均の差の二乗 is (_個々の実数 - _n個の実数の平均) ^ 2), _個々の実数と平均の差の二乗の合計), _n個の実数の標本の分散 is _個々の実数と平均の差の二乗の合計 / _n個, _n個の実数の標準偏差 is sqrt(_n個の実数の標本の分散). 個々の実数(_n個の実数,_個々の実数) :- nth1(_,_n個の実数,_個々の実数). 実数を得る(_個々の実数) :- get_line(Line), read_term_from_atom(Line,_実数,[]), 実数診断(Line,_実数),!. 実数を得る(_個々の実数) :- 実数を得る(_個々の実数). 実数診断(Line,_実数) :- float(_実数),!. 実数診断(Line,_実数) :- writef('入力された %t から実数が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/505 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): #  キーボードから正負の整数をデタラメに入力し、整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ # 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数の和,_5つの正の整数の平均) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'([],_5つの正の整数ならび), 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均). 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび,_正の整数ならび) :- 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび),!. 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび). 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび) :- length(_正の整数ならび,5). 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数), '正の整数のみを配列に格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2), 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_2,_正の整数ならび). 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 行入力(_行), '診断 :: 整数'(_行,_整数),!. 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数). '診断 :: 整数'(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). '正の整数のみを配列に格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2) :- _整数 >= 0, append(_正の整数ならび_1,[_整数],_正の整数ならび_2). '正の整数のみを配列に格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_1) :- _整数 < 0. 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均) :- sum_list(_5つの正の整数ならび,_5つの正の整数の和), _5つの正の整数の平均 is floor((_5つの正の整数の和 / 5) * 10 + 0.5) / 10. 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/423 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 問題(戻り値がある場合の引数あり) # 円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 # ただし、main関数で円錐の半径rと高さhの入力と計算された円錐の体積の表示を行い、 # 円錐の体積の計算はtaisekiという関数で行うこと。 # また、円周率は3.14を使用すること。 # # ../test/read.cgi/tech/1381909900/422に続きます # '円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 ただし、主述語で円錐の半径rと高さhの入力と計算された円錐の体積の表示を行い、 円錐の体積の計算は体積という述語で行うこと。 また、円周率は3.14を使用すること。' :- 数を得る(円錐の半径r,_円錐の半径r), 数を得る(円錐の高さh,_円錐の高さh), '円錐の体積の計算と表示は体積という述語で行うこと。 また、円周率は3.14を使用すること。'(_円錐の半径r,_円錐の高さh,_円錐の体積), writef('半径%t,高さ%t の円錐の体積は %t\n',[_円錐の半径r,_円錐の高さh,_円錐の体積]). '円錐の体積の計算は体積という関数で行うこと。 また、円周率は3.14を使用すること。'(_円錐の半径r,_円錐の高さh,_円錐の体積) :- _円周率 = 3.14, 体積(_円錐の半径r,_円錐の高さh,_円周率,_円錐の体積). 体積(_円錐の半径r,_円錐の高さh,_円周率,_円錐の体積) :- _円錐の体積 is _円周率 * _円錐の半径r * _円錐の半径r * _円錐の高さh / 3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). n個の数を得る(_n,_催促文,_数ならび) :- length(_数ならび,_n), findall(_数,( 部分ならび(_数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 数を得る(_催促文,_数)), _数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # お題: 任意の数の自然数を与えた時、それらの自然数を四則演算した結果が、 # 期待した自然数になる式を全て列挙するコードを作成しなさい。 # ただし、式中の乗除算は加減算より先に計算するものとする。 # また数の並びは変更出来ず、括弧は使わないものとする。 # # 例: 1 5 3 6 : 10 # # 1 * 5 / 3 * 6 # 1 + 5 * 3 - 6 # # 1 5 3 6 7 : 10 # -> # 1 + 5 + 3 - 6 + 7 '任意の数の自然数を与えた時、それらの自然数を四則演算した結果が、 期待した自然数になる式を全て列挙するコードを作成しなさい。 ただし、式中の乗除算は加減算より先に計算するものとする。 また数の並びは変更出来ず、括弧は使わないものとする。'(_自然数ならび,_期待した自然数,_式) :- findall(X,( append(_,[_自然数|R],_自然数ならび), 自然数と変数を交互に(_自然数,R,X)), _自然数の間に変数が挿入されたならび), 変数に演算子を当て嵌める(_自然数の間に変数が挿入されたならび), 式を計算する(_自然数の間に変数が挿入されたならび,_期待した自然数,_式). 自然数と変数を交互に(_自然数,[],_自然数) :- !. 自然数と変数を交互に(_自然数,_,_自然数). 自然数と変数を交互に(_自然数,_,_). 変数に演算子を当て嵌める(_自然数の間に変数が挿入されたならび) :- 変数のみ取り出して(_自然数の間に変数が挿入されたならび,_変数ならび), 変数に演算子を当て嵌める(_変数ならび). 変数のみ取り出して(_自然数の間に変数が挿入されたならび,_変数ならび) :- findall(_変数,( member(_変数,_自然数の間に変数が挿入されたならび), var(_変数)), _変数ならび). 変数に演算子を当て嵌める([]). 変数に演算子を当て嵌める([_変数|R]) :- member(_演算子,[+,-,*,//]), 変数に演算子を当て嵌める(R). 式を計算する(_自然数の間に変数が挿入されたならび,_期待した自然数,_式) :- 一旦文字列に変換して(_自然数の間に変数が挿入されたならび,_式文字列), 文字列から式を生成する(_式文字列,_式), _期待した自然数 is _式,!. 一旦文字列に変換して(_自然数の間に変数が挿入されたならび,_式文字列) :- atomic_list_concat(_自然数の間に変数が挿入されたならび,_式文字列). 文字列から式を生成する(_式文字列,_式) :- read_term_from_atom(_式文字列,_式,[]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/772 # # 今朝急に友人から依頼されたのですが、javaしか経験したことがなく、C++なんて今まで触れたことすらないのでどなたかお助け下さい。 # 一応ウィンドウ画面については作れたのですが・・・。 # # [1] 授業単元: 課題 # [2] 問題文: # 1:数値a,b を入力し,a+b,a−b,a*b,a/b を計算するプログラムを作成して # ください。 #   注:数値は小数点以下を含むものとし,変数の型宣言をDouble としてください。 # # :- op(450,xfy,'+'). :- op(450,xfy,'−'). :- op(450,xfy,'*'). :- op(450,xfy,'/'). '数値a,b を入力し,a+b,a−b,a*b,a/b を計算するプログラムを作成してください。 注:数値は小数点以下を含むものとし,変数の型宣言をDouble としてください。' :- '数値a,b を入力し'(_数値a,_数値b), 'a+b,a−b,a*b,a/b を計算する'(_数値a,_数値b). '数値a,b を入力し'(_数値a,_数値b) :- 数を入力する(数値a,_数値a), 数を入力する(数値b,_数値b). 'a+b,a−b,a*b,a/b を計算する'(_数値a,_数値b) :- 'a+b,a−b,a*b,a/bの計算式を得る'(_数値a,_数値b,R,_式文字列), 計算して表示する(_式文字列,_数値a,_数値b), R = []. 'a+b,a−b,a*b,a/bの計算式を得る'(_数値a,_数値b,R,_式文字列) :- split('a+b,a−b,a*b,a/b',[,],L), append(_,[_式文字列|R],L). 計算して表示する(_式文字列,_数値a,_数値b) :- atom_to_term(_式文字列,_式,_), 計算する(_式,_数値a,_数値b,_計算結果), 表示する(_式文字列,_計算結果). 計算する(_ + _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a + _数値b. 計算する(_ − _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a - _数値b. 計算する(_ * _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a * _数値b. 計算する(_ / _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a / _数値b. 表示する(_式文字列,_計算結果) :- writef('%t = %t\n',[_式文字列,_計算結果]). % 以下のサイトは # # キーボードからNを入力し、Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を表示しなさい # 'キーボードからNを入力し、Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を表示しなさい' :- 'キーボードからNを入力し、'(_N), 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を表示しなさい'(_N). 'キーボードからNを入力し、'(_N) :- 整数を得る('N',_N > 2,_N). 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を計算して、表示しなさい'(_N) :- 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を計算して、'(_N,_式表示文字列,_Sum), 表示しなさい(_Sum,_式表示文字列). 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を計算して、'(_N,_式表示文字列,_Sum) :- '1の4乗 + 2の4乗 + ... + Nの4乗 を'(_N,_式文字列,_式表示文字列), 計算して(_式文字列,_Sum). '1の4乗 + 2の4乗 + ... + Nの4乗 を'(_N,_式文字列,_式表示文字列) :- findall([_4乗項文字列,_4乗表示文字列],( between(1,_M,_N), atomic_list_concat([_M,の4乗],_4乗表示文字列), atomic_list_concat([_M,' ^ ',4],_4乗項文字列)), LL), 式文字列と式表示文字列を分離(LL,_式文字列,_式表示文字列). 式文字列と式表示文字列を分離(LL,_式文字列,_式表示文字列) :- 転置(LL,[L1,L2]), atomic_list_concat(L1,' + ',_式文字列), atomic_list_concat(L2,' + ',_式表示文字列). 計算して(_式文字列,_Sum) :- atom_to_term(_式文字列,_式,_), _Sum is _式. 表示しなさい(_Sum,_式表示文字列) :- writef('%t = %t\n',[_Sum,_式文字列]). % 以下のサイトは # # キーボードからNを入力し、Sum = 14 + 24 + ... + N4 を表示しなさい # 'キーボードからNを入力し、Sum = 14 + 24 + ... + N4 を表示しなさい' :- 'キーボードからNを入力し、'(_N), 'Sum = 14 + 24 + ... + N4 を表示しなさい'(_N). 'キーボードからNを入力し、'(_N) :- 整数を得る('N',_N > 2,_N). 'Sum = 14 + 24 + ... + N4 を計算して、表示しなさい'(_N) :- 'Sum = 14 + 24 + ... + N4 を計算して、'(_N,_式文字列,_Sum), 表示しなさい(_Sum,_式文字列). 'Sum = 14 + 24 + ... + N4 を計算して、'(_N,_式文字列,_Sum) :- '14 + 24 + ... + N4 を'(_N,_式文字列), 計算して(_式文字列,_Sum). '14 + 24 + ... + N4 を'(_N,_式文字列) :- findall(_計算の対象となる整数,( between(1,_M,_N), _計算の対象となる整数 is 10 * _M + 4), _計算の対象となる整数ならび), atomic_list_concat(_計算の対象となる整数ならび,' + ',_式文字列). 計算して(_式文字列,_Sum) :- atom_to_term(_式文字列,_式,_), _Sum is _式. 表示しなさい(_Sum,_式文字列) :- writef('%t = %t\n',[_Sum,_式文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/855 # # [1]C言語初級課題 # [2]次のコードは、キーボードから0から9までの4つの数を # 受け取って小さい順から書き出すプログラムの未完成版である。 # コードを完成させなさい。fgetsでキーボードから文字列を受け取り、 # それをatoi関数で整数に変換し、0から9までの範囲にあるか確認し、 # 範囲にない場合は再入力を促し再入力させること。 # # #include <stdio.h> # #inckude <stdlib.h> # int main(void){ # char s[1024];//fgets関数に与える文字列バッファ # char *t;//fgets戻り値格納用 # int n;//atoi関数の戻り値格納用 # { # //この部分にコードを追加してコードを完成させてください。 # return(0); # } # [3] Windows 7/Microsoft SDK/C言語 # [4]5/31まで # [5]簡単な課題だそうですが、手こずってます。どうかよろしくお願いします。 # # 'キーボードから0から9までの4つの数を受け取って小さい順から書き出す。キーボードから文字列を受け取り、それをatoi関数で整数に変換し、0から9までの範囲にあるか確認し、範囲にない場合は再入力を促し再入力させること' :- キーボードから0から9までの4つの数を受け取って(_4つの数ならび), 小さい順から書き出す(_4つの数ならび),!. キーボードから0から9までの4つの数を受け取って([]) :- !. キーボードから0から9までの4つの数を受け取って([_整数|R]) :- キーボードから文字列を受け取り(_文字列), 整数に変換し(_文字列,_整数), キーボードから0から9までの4つの数を受け取って(R). キーボードから0から9までの4つの数を受け取って(L) :- キーボードから0から9までの4つの数を受け取って(L). キーボードから文字列を受け取り(_文字列) :- write('0から9の範囲の整数を入力して下さい : '), get_line(_文字列). 整数に変換し(_文字列,_整数) :- atom_to_term(_文字列,_整数,_), integer(_整数), 0から9までの範囲にあるか確認し(_整数),!. 0から9までの範囲にあるか確認し(_整数) :- _整数 >= 0, _整数 =< 9,!. 0から9までの範囲にあるか確認し(_整数) :- write('受け取った%tは0から9の範囲にありません。再入力をお願いします。\n'), fail. 小さい順から書き出す([]) :- write('\n'). 小さい順から書き出す(L) :- 最小値(L,A,L1), writef('%t ',[_最小値]), 小さい順から書き出す(L1). 最小値(L,A,L1) :- append(L0,[A|R],L), \+((member(B,L0),B @< A)), \+((member(C,R),C @< A)), append(L0,R,L1),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/855 # # [1]C言語初級課題 # [2]次のコードは、キーボードから0から9までの4つの数を # 受け取って小さい順から書き出すプログラムの未完成版である。 # コードを完成させなさい。fgetsでキーボードから文字列を受け取り、 # それをatoi関数で整数に変換し、0から9までの範囲にあるか確認し、 # 範囲にない場合は再入力を促し再入力させること。 # # #include <stdio.h> # #inckude <stdlib.h> # int main(void){ # char s[1024];//fgets関数に与える文字列バッファ # char *t;//fgets戻り値格納用 # int n;//atoi関数の戻り値格納用 # { # //この部分にコードを追加してコードを完成させてください。 # return(0); # } # [3] Windows 7/Microsoft SDK/C言語 # [4]5/31まで # [5]簡単な課題だそうですが、手こずってます。どうかよろしくお願いします。 # # 'キーボードから0から9までの4つの数を受け取って小さい順から書き出す。キーボードから文字列を受け取り、それをatoi関数で整数に変換し、0から9までの範囲にあるか確認し、範囲にない場合は再入力を促し再入力させること' :- キーボードから0から9までの4つの数を受け取って(_4つの数ならび), 小さい順から書き出す(_4つの数ならび),!. キーボードから0から9までの4つの数を受け取って([]) :- !. キーボードから0から9までの4つの数を受け取って([_整数|R]) :- キーボードから文字列を受け取り(_文字列), 整数に変換し(_文字列,_整数), キーボードから0から9までの4つの数を受け取って(R). キーボードから0から9までの4つの数を受け取って(L) :- キーボードから0から9までの4つの数を受け取って(L). キーボードから文字列を受け取り(_文字列) :- write('0から9の範囲の整数を入力して下さい : '), get_line(_文字列). 整数に変換し(_文字列,_整数) :- atom_to_term(_文字列,_整数,_), integer(_整数), 0から9までの範囲にあるか確認し(_整数),!. 0から9までの範囲にあるか確認し(_整数) :- _整数 >= 0, _整数 =< 9,!. 0から9までの範囲にあるか確認し(_整数) :- write('受け取った%tは0から9の範囲にありません。再入力をお願いします。\n'), fail. 小さい順から書き出す([]) :- write('\n'). 小さい順から書き出す(L) :- 最小値(L,A,L1), writef('%t ',[_最小値]), 小さい順から書き出す(L1). 最小値(L,A,L1) :- append(L0,[A|R],L), \+((member(B,L0),B @< A)), \+((member(C,R),C @< A)), append(L0,R,L1),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/835 # # お願いします。 # [1] 授業単元:情報処理演習 # [2] 問題文:3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表 # 示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表 # 示するようにすること. # '3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表示するようにすること.' :- '3 つの整数a, b, s を入力として'(_a,_b,_s), 'ax + by = s を満たす整数x, y を一組求めて'(_a,_b,_s,_x,_y), それらを表示する(_a,_b,_s,_x,_y),!. '3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表示するようにすること.'(_a,_b,_s) :- 'ただし、望みの整数x, y が存在しないときは, その旨を表示する'. '3 つの整数a, b, s を入力として'(_a,_b,_s) :- 整数を得る('ax+by=s のa',true,_a), 整数を得る('ax+by=s のb',true,_b), 整数を得る('ax+by=s のs',true,_s). 'ax + by = s を満たす整数x, y を一組求めて'(_a,_b,_s,_x,_y) :- _a_1 is _a * -1, _b_1 is _b * -1, for(_a_1,_x,_a), for(_b_1,_y,_b), _s is _a * _x + _b * _y. それらを表示する(_a,_b,_s,_x,_y) :- write(' ax + by = s\n'), writef('%t*%t + %t*%t = %t\n',[_a,_x,_b,_y,_s]). 'ただし, 望みの整数x, y が存在しないときは, その旨を表示する' :- writef('望みのx,yが存在しません。\n'). for(S,N,E) :- E >= S, for_2(S,N,E). for(S,N,E) :- E < S, for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(S,N,E) :- N is S. for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(S,N,E) :- N is S. for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' :- '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(1,0,1). '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_,_) :- _数 > 100,!. '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2,_fib_1_2,_fib_2_2), _数_2 is _数_1 + 1, '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_2,_fib_1_2,_fib_2_2). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2,_fib_1_2,_fib_2_2) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_2_2,_fib_2_2,Fib), '素数のときは ''Prime'' と'(_数,Prime), '出力する'(_数_1,Fib,Prime),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_2_2,_数_1,'Fib') :- _数_1 is _fib_1 + _fib_2,!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_1,_fib_2,''). '素数のときは ''Prime'' と'(_数,'Prime') :- 素数である(_数),!. '素数のときは ''Prime'' と'(_,''). '出力する'(_数_1,'','') :- write('%t ',[_数_1]),!. '出力する'(_数_1,Fib,Prime) :- write('%t%t ',[Fib,Prime]). % このプログラムの骨組みは %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 素数である(1) :- !. 素数である(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,_n,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' '100以下のフィボナッチ数列を得る'(_100以下のフィボナッチ数ならび), '100以下の素数を得る'(_100以下の素数ならび), between(1,100,_数), 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L), 'Nが100になるまで出力する'(N,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,L), '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,L), それ以外の場合は数を(_数,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,['Fib',_,_]) :- member(_数,_100以下のフィボナッチ数ならび),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_,_,['',_,_]). '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,[_,'Prime',_]) :- member(_数,_100以下の素数ならび),!. '素数のときは ''Prime'' と'(_,_,[_,'',_]). それ以外の場合は数を(_数,['','',_数]) :- !. それ以外の場合は数を(_,[_,_,'']). '100以下のフィボナッチ数列を得る'(L) :- '100以下のフィボナッチ数列'([1,0],L). '100以下のフィボナッチ数列'([B,A|R],L) :- C is A + B, C =< 100, '100以下のフィボナッチ数列'([C,B,A|R],L),!. '100以下のフィボナッチ数列'(L,L). '100以下の素数を得る'(L) :- findall(N,( between(1,100,N), 素数である(N)), L). 素数である(1) :- !. 素数である(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,_n,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. 'Nが100になるまで出力する'(N,L) :- atomic_list_concat(L,_表示文字列), writef('%t ',[_表示文字列]), N = 100. % 以下のサイトは # 数式が全部文字に置き換えられたモノから数式に戻して計算する関数を作りたいと思います。 # 例えば、[ Kazu 0.1, Tasu, Kazu 2.1, Hiku, Kazu 3.0, Kake, Kazu 2.9, Waru, Kazu 0.9]があって、 # これを戻すと 0.1 + 2.1 - 3.0 * 2.9 / 0.9 -> -7.46 みたいに結果をだしたい。 :- op(200,fx,kazu). :- op(200,fx,tasu). :- op(200,fx,hiku). :- op(200,fx,kake). :- op(200,fx,waru). '数式が全部文字に置き換えられたモノから数式に戻して計算する関数を作りたいと思います。 例えば、[ Kazu 0.1, Tasu, Kazu 2.1, Hiku, Kazu 3.0, Kake, Kazu 2.9, Waru, Kazu 0.9]があって、 これを戻すと 0.1 + 2.1 - 3.0 * 2.9 / 0.9 -> -7.46 みたいに結果をだしたい。'(L,_式,_結果) :- 数式が全部文字に置き換えられたモノから数式に戻して計算する(L,_式,_結果). 数式が全部文字に置き換えられたモノから数式に戻して計算する(L,_式,_結果) :- 演算子を置換する(_ならび,_演算子を置換されたならび), atomic_list_concat(_演算子を置換されたならび,' ',_式文字列), atom_to_term(_式文字列,_式,_), _結果 is _式. 演算子を置換する([],[]). 演算子を置換する([kazu _値|R1],[_値|R2]) :- 演算子を置換する(R1,R2). 演算子を置換する([_演算子文字列 _値|R1],[_演算子,_値|R2]) :- '演算子文字列・演算子'(_演算子文字列,_演算子), 演算子を置換する(R1,R2). '演算子文字列・演算子'(tasu,+). '演算子文字列・演算子'(hiku,-). '演算子文字列・演算子'(kake,*). '演算子文字列・演算子'(waru,/). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/140 # # [1] 授業単元: Cプロ # [2] 問題文(含コード&リンク): # 3行3列の行列aを入力後、余因子行列で行列値|a|を求める # '3行3列の行列aを入力後、余因子行列で行列値|a|を求める' :- '3行3列の行列aを入力'(_a), '余因子行列で行列値|a|を求める'(_a,_行列式_aの値), writef('行列値|a|は%tです。\n',[_行列式_aの値]). '3行3列の行列aを入力'(_a) :- length(_a,3), findall(L,( nth1(_nth1,_a,L), length(L,3), '3列入力する'(_nth1,1,L)), _a). '3列入力する'(_,_,[]). '3列入力する'(_行位置,_列位置,[V|R]) :- writef('列入力[%t][%t] : ',[_行位置,_列位置]), get_line(Line), atom_to_term(Line,V,_), _列位置_2 is _列位置 + 1, '3列入力する'(_行位置,_列位置_2,R). '余因子行列を使って逆行列を得る'(_n,_正方行列,_逆行列) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値), 余因子行列(_n,_正方行列,_余因子行列), 転置(_余因子行列,_転置された余因子行列), 行列のすべての要素に値を掛ける(1,_n,_転置された余因子行列,1 / _行列式の値,_逆行列). 行列のすべての要素に値を掛ける(_行目,_n,LL,_,LL) :- _行目 > _n,!. 行列のすべての要素に値を掛ける(_行目,_n,LL1,_乗数 / _除数,LL2) :- '行基本変形'(_乗数 / _除数 # _行目,LL1,LL3), _行目_2 is _行目 + 1, 行列のすべての要素に値を掛ける(_行目_2,_n,LL3,_乗数 / _除数,LL2). '余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :- 余因子行列(_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], '二つのならびの積の和'(_aの第一行,_余因子行列の第一行,_行列式_aの値). '二つのならびの積の和'([],[],0). '二つのならびの積の和'([A|R1],[B|R2],S) :- '二つのならびの積の和'(R1,R2,S_1), S is S_1 + A * B. 余因子行列(_正方行列,_余因子行列) :- length(_正方行列,_n), 余因子行列(_n,_正方行列,_余因子行列). 余因子行列(_n,_正方行列,_余因子行列) :- length(_余因子行列,_n), findall(L,( nth1(_i,_余因子行列,L), 余因子行列の要素が余因子である(_n,_正方行列,_i,L)), _余因子行列). 余因子行列の要素が余因子である(_n,_正方行列,_i,L) :- length(L,_n), findall(_余因子,( nth1(_j,L,_余因子), 余因子(_n,_正方行列,_i,_j,_余因子)), L). 行列式の値(1,[[_]],1) :- !. 行列式の値(2,_正方行列,_行列式の値) :- 二つの対角要素の積の差を得る(_n,_正方行列,_行列式の値),!. 行列式の値(_n,_正方行列,_行列式の値) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値). 余因子(_n,_正方行列,_i,_j,_余因子) :- 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子). 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) :- '正方行列からi行j列を取り除いた行列式の値'(_n,_正方行列,_i,_j,_n_1次正方行列の行列式の値), 'i,jから乗数を得る'(_i,_j,_乗数), _余因子 is _乗数 * _n_1次正方行列の行列式の値. '正方行列からi行j列を取り除いた行列式の値'(_n,_正方行列,_i,_j,_n_1次正方行列の行列式の値) :- '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), _n_1 is _n - 1, 行列式の値(_n_1,_n_1次正方行列,_n_1次正方行列の行列式の値). '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列) :- '第何行を取り除く'(_正方行列,_i,_第i行が取り除かれた行列), 転置(_第i行が取り除かれた行列,_転置された第i行が取り除かれた行列), '第何行を取り除く'(_転置された第i行が取り除かれた行列,_j,_転置された第i行第j列が取り除かれた行列), 転置(_転置された第i行第j列が取り除かれた行列,_n_1次正方行列). '第何行を取り除く'(_正方行列,_第何行,_第i行が取り除かれた行列) :- append(L0,[L|R],_正方行列), length([_|L0],_第何行), append(L0,R,_第i行が取り除かれた行列). 二つの対角要素の積の差を得る(0,[],1) :- !. 二つの対角要素の積の差を得る(1,[[N]],N) :- !. 二つの対角要素の積の差を得る(_n,_正方行列,_二つの対角要素の積の差) :- 二つの対角要素の積を得る(_正方行列,_右下がり対角要素の積,_右上がり対角要素の積), _二つの対角要素の積の差 is _右下がり対角要素の積 - _右上がり対角要素の積. 二つの対角要素の積を得る(_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- 二つの対角要素を得る(_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), 対角要素の掛算(_右下がり対角要素ならび,_右下がり対角要素の積), 対角要素の掛算(_右上がり対角要素ならび,_右上がり対角要素の積). 二つの対角要素を得る(_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- 右下がり対角要素ならび(_正方行列,_右下がり対角要素ならび), 右上がり対角要素ならび(_正方行列,_右上がり対角要素ならび). 右下がり対角要素ならび(_正方行列,_右下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), nth1(_nth1,L,V)), _右下がり対角要素ならび). 右上がり対角要素ならび(_正方行列,_右上がり対角要素ならび) :- reverse(_正方行列,_行を逆転した正方行列), 右下がり対角要素ならび(_行を逆転した正方行列,_右上がり対角要素ならび). 左下がり対角要素ならび(_正方行列,_左下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), length([_|R],_nth1), append(_,[V|R],L)), _左下がり対角要素ならび),!. 左上がり対角要素ならび(_正方行列,_左上がり対角要素ならび) :- reverse(_正方行列,_行を逆転した正方行列), 左下がり対角要素ならび(_行を逆転した正方行列,_左上がり対角要素ならび). 'i,jから乗数を得る'(_i,_j,(-1)) :- 1 is (_i + _j) mod 2,!. 'i,jから乗数を得る'(_i,_j,1) :- 0 is (_i + _j) mod 2,!. 対角要素の掛算([],1). 対角要素の掛算([A|R],X) :- 対角要素の掛算(R,Y), X is A * Y. 'n次正方行列の要素を行・列順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_i行), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_j列), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). % 以下のサイトは # [1] 授業単元: プログラミング  # [2] 問題文(含コード&リンク):入力仕様を、入力座標は最大2桁までの整数を # 最大10件までとし、入力範囲のチェックと、最大件数のチェックを行うプログラムの # 作成。 # [3] 環境 #  [3.1] OS: xp #  [3.2] コンパイラ名とバージョン: MSC Ver.5.1 #  [3.3] 言語: C # [4] 期限: 今週中 # [5] その他の制限: 出来れば、各所にコメントを入れて下さい。 # どういうプログラムなのか自分でも把握したいのと、コードの勉強も兼ねて。 # # よろしくお願いします。 '入力仕様を、入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(_入力座標ならび,_桁数最大件数範囲で修正した入力座標ならび) :- '座標をX,Y最大2桁、(X,Y) の空白区切り形式で最大10件まで一行で入力する'(_座標ならび文字列), split(_座標ならび文字列,[' '],L1), 座標ならびに変換(L,_入力座標ならび), 最大件数のチェック(_入力座標ならび,_最大件数を超えた部分を除外した入力座標ならび), 入力範囲のチェック(_最大件数を超えた部分を除外した入力座標ならび,_桁数最大件数範囲で修正した入力座標ならび). '座標をX,Y最大2桁、(X,Y) の空白区切り形式で最大10件まで一行で入力する'(_座標ならび文字列) :- write('座標をX,Y最大2桁、(X,Y) の空白区切り形式で最大10件まで一行で入力する : '), get_line(_座標ならび文字列). 最大件数のチェック(L,L) :- length(L,_要素数), _要素数 =< 10,!. 最大件数のチェック(L1,L) :- length(L1,_要素数), length(L,10), append(L,_,L1), writef('要素数が%tで最大件数10件を超えています。\n',[_要素数]). 座標ならびに変換([],[]). 座標ならびに変換([_座標ならび文字列|R1],[[X,Y]|R2]) :- atom_to_term(_座標ならび文字列,(X,Y),_), 座標ならびに変換(R1,R2). 入力範囲のチェック([],[]). 入力範囲のチェック([[X,Y]|R1],[[X,Y]|R2]) :- 'X,Yが2桁の範囲'(X,Y), 入力範囲のチェック(R1,R2),!. 入力範囲のチェック([[X,Y]|R1],R2) :- writef('入力範囲にエラーがありました (%t,%t) \n',[X,Y]), 入力範囲のチェック(R1,R2). 'X,Yが2桁の範囲'(X,Y) :- '2桁の範囲'(X), '2桁の範囲'(Y). '2桁の範囲'(X) :- X < 100,!. '2桁の範囲'(X) :- X < 100.0. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/587 # # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):キーボードより本体価格と税率を入力し、その税込価格を #                表示するプログラムを作成せよ。 # #                任意の数値xを小数点以下第n位で四捨五入する作れ(nは任意) # 'キーボードより本体価格と税率を入力し、その税込価格を 表示するプログラムを作成せよ。 任意の数値xを小数点以下第n位で四捨五入する作れ(nは任意)'(_小数点以下第n位で四捨五入) :- 'キーボードより本体価格と税率を入力し'(_本体価格,_税率), その税込み価格を表示する(_小数点以下第n位で四捨五入,_本体価格,_税率). 'キーボードより本体価格と税率を入力し'(_本体価格,_税率) :- 数を得る(本体価格,_本体価格 >= 0.0,_本体価格), 数を得る(税率,_税率 >= 0.0,_税率),!. その税込み価格を表示する(_小数点以下第n位で四捨五入,_本体価格,_税率) :- V is 10 ^ (_小数点以下第n位で四捨五入 - 1), _税込み価格 is floor(_本体価格 * (1 + _税率) * V + 0.5) / V, writef('%w\n',[_税込み価格]). 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). n個の数を得る(_n,_催促文,_数ならび) :- length(_数ならび,_n), findall(_数,( 部分ならび(_数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 数を得る(_催促文,_数)), _数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/609 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。
ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 # 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 # すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。 # 【条件】 
前半の「和を求める」繰返しは while 文、後半の「積を求める」繰返しは do-while 文を使用して作成すること。 # 【実行例】
=加算処理= # 
値:6
 # 値:8 # 
値:12
 # 値:0 # 
合計は26です。 # 
=積算処理= # 
値:2 # 
値:6 # 
値:3 # 
値:3 # 
値:0
 # 積算値は108です。 # 問題2 繰返し処理を用いて、m ÷ nの計算をするプログラム(商を求める)を作成しなさい。 
ただし、演算に割り算記号 / を使ってはいけません。また、mとnはキーボードから入力してください。 # 【ヒント】 
・割り算をするとは、mからnを何回引くことができたか?を調べることと等価です 。元の数mが正の間、nを引くことができた回数が、割り算の商となります。 # この回数を、 繰返し処理を使って数えさせてください。 
・繰返し条件は、「mからnを引いた結果が正の値の間」繰り返し、商を1ずつ増やしていきます。 # 負の値になったら、繰返しを終了します。 # '問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。 ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、 後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。' :- 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数ならび), '前半の処理では、キーボードから入力した数値の加算合計の表示を'(_整数ならび), '後半の処理ではキーボードから入力した数値の積算値の表示を'(_整数ならび). 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数ならび) :- 整数を得る('整数(0の入力で終了)',true,_整数), 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数,_整数ならび). 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(0,[]) :- !. 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数,[_整数|R]) :- 整数を得る('整数(0の入力で終了)',true,_整数_1), 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数_1,R). '前半の処理では、キーボードから入力した数値の加算合計の表示を'(_整数ならび) :- atomic_list_concat(_整数ならび,' + ',_加算対象文字列), atom_to_term(_加算対象文字列,_加算式,_), _加算合計 is _加算式, writef('%t = %t\n',[_加算対象文字列,_加算合計]). '後半の処理ではキーボードから入力した数値の積算値の表示を'(_整数ならび) :- atomic_list_concat(_整数ならび,' * ',_積算対象文字列), atom_to_term(_積算対象文字列,_積算式,_), _数値の積算値 is _積算式, writef('%t = %t\n',[_積算対象文字列,_数値の積算値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/609 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。
ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 # 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 # すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。 # 【条件】 
前半の「和を求める」繰返しは while 文、後半の「積を求める」繰返しは do-while 文を使用して作成すること。 # 【実行例】
=加算処理= # 
値:6
 # 値:8 # 
値:12
 # 値:0 # 
合計は26です。 # 
=積算処理= # 
値:2 # 
値:6 # 
値:3 # 
値:3 # 
値:0
 # 積算値は108です。 # 問題2 繰返し処理を用いて、m ÷ nの計算をするプログラム(商を求める)を作成しなさい。 
ただし、演算に割り算記号 / を使ってはいけません。また、mとnはキーボードから入力してください。 # 【ヒント】 
・割り算をするとは、mからnを何回引くことができたか?を調べることと等価です 。元の数mが正の間、nを引くことができた回数が、割り算の商となります。 # この回数を、 繰返し処理を使って数えさせてください。 
・繰返し条件は、「mからnを引いた結果が正の値の間」繰り返し、商を1ずつ増やしていきます。 # 負の値になったら、繰返しを終了します。 # '問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。 ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、 後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。' :- 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数ならび), '前半の処理では、キーボードから入力した数値の加算合計の表示を'(_整数ならび), '後半の処理ではキーボードから入力した数値の積算値の表示を'(_整数ならび). 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数ならび) :- findall(_整数,( 整数を得る('整数(0の入力で終了)',true,_整数), ( _整数 = 0,!,fail; true)), _整数ならび). '前半の処理では、キーボードから入力した数値の加算合計の表示を'(_整数ならび) :- atomic_list_concat(_整数ならび,' + ',_加算対象文字列), atom_to_term(_加算対象文字列,_加算式,_), _加算合計 is _加算式, writef('%t = %t\n',[_加算対象文字列,_加算合計]). '後半の処理ではキーボードから入力した数値の積算値の表示を'(_整数ならび) :- atomic_list_concat(_整数ならび,' * ',_積算対象文字列), atom_to_term(_積算対象文字列,_積算式,_), _数値の積算値 is _積算式, writef('%t = %t\n',[_積算対象文字列,_数値の積算値]). % 以下のサイトは うるう年は何回来るか(_年起点,_年終点,_うるう年の回数) :- count(( between(_年起点,_年終点,_年), うるう年(_年)), _うるう年の回数). 'ある日から後の年のある日は何日目か(起点日と終点日はそれぞれ日数に含める)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はそれぞれ日数に含める, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2. 'ある日から後の年のある日は何日目か(起点日と終点日はともに日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 2. 'ある日から後の年のある日は何日目か(起点日と終点日のどちらかは日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 1. ある年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- うるう年は何回来るか(_年起点,_年終点,_うるう年の回数), '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目). '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目) :- _何日目 is _うるう年の回数 + 365 * (_年終点 - _年起点 + 1). 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- _翌年 is _年起点 + 1, ある年の元旦から後の年の大晦日は何日目か(_翌年,_年終点,_何日目). ある年の元旦から後の年のある日は何日目か(_年起点,_年終点,_月終点,_日終点,_何日目) :- _前年 is _年終点 - 1, ある年の元旦から後の年の大晦日は何日目か(_年起点,_前年,_何日目_1), ある年月日はその年の元旦から何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _何日目_1 + _何日目_2. ある年月日はその年の元旦から何日目か(_年,_月,_日,_元旦から何日) :- 月日数ならび(_年,_月日数ならび), _前月 is _月 - 1, length(L0,_月), append(L0,_,_月日数ならび), sum(L0,_前月末日までの日数), _元旦から何日 is _前月末日までの日数 + _日. 大晦日は何日目か(_年,_月,_日,_大晦日は何日目) :- 月日数ならび(_年,_月日数ならび), 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_翌月の一日から大晦日は何日目), 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数), _大晦日は何日目 is _今日を含めて今月の末日までの日数 + _翌月の一日から大晦日は何日目. 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_何日目) :- length(L0,_月), append(L0,_翌月からの月日数ならび,_月日数ならび), sum(_翌月からの月日数ならび,_何日目). 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _今日を含めて今月の末日までの日数 is _今月の日数 - _日 + 1. 明日から今月末日までの日数(_年,_月,_日,_月日数ならび,_明日から今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _明日から今月の末日までの日数 is _今月の日数 - _日. 月日数ならび(_年,[31,29,31,30,31,30,31,31,30,31,30,31]) :- うるう年(_年),!. 月日数ならび(_年,[31,28,31,30,31,30,31,31,30,31,30,31]). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 起点日と終点日はそれぞれ日数に含める. 起点日と終点日はともに日数に含めない. % 以下のサイトは 加算器型相加平均(_累計,_相加平均) :- 加算器型相加平均([],0,_累計,_相加平均). 加算器型相加平均(Ln,_累計_1,_累計,_相加平均) :- 数を得る(_数), _累計_2 is _累計_1 + _数, 加算器型相加平均_1(Ln,_累計_2,_累計,_相加平均). 加算器型相加平均_1(Ln,_累計,_累計,_相加平均) :- length([_|Ln],Len), _相加平均 is _累計 / Len. 加算器型相加平均_1(Ln,_累計_2,_累計,_相加平均) :- 加算器型相加平均([_|Ln],_累計_2,_累計,_相加平均). 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). n個の数を得る(_n,_催促文,_数ならび) :- length(_数ならび,_n), findall(_数,( 部分ならび(_数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 数を得る(_催促文,_数)), _数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/345 # # [1] 授業単元: #     計算機概論 # [2] 問題文(含コード&amp;リンク): #     キーボードから入力された自然数が素数であるかを調べるプログラムを作りなさい。 #     ただし、0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること。 # 'キーボードから入力された自然数が素数であるかを調べるプログラムを作りなさい。 ただし、0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること。' :- 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数), 素数であるかを調べる(_入力された自然数). 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数) :- write('自然数を入力してください : '), get_line(Line), '診断 :: 自然数入力'(Line,_入力された自然数),!. 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数) :- 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数). '診断 :: 自然数入力'(Line,_入力された自然数) :- atom_to_term(Line,_入力された自然数,_), integer(_入力された自然数), _入力された自然数 > 0,!. '診断 :: 自然数入力'(Line,_) :- writef('入力された %t から自然数を得ることができません。再入力をお願いします。\n',[Line]), fail. 素数であるかを調べる(1) :- write('プログラムを終了します\n'),!. 素数であるかを調べる(X) :- ウィルソンの定理による素数判定(X), write('素数です\n'),!. 素数であるかを調べる(_) :- write('素数ではありません\n'). ウィルソンの定理による素数判定(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,N,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/392 # # (1)C言語 # (2)問題:キーボードから正の整数を入力するとその桁数を表示するプログラムを作成せよ。 # (3)windows7 visual studio2010 # (4)期限:12月20日 # (5)よろしくお願いします。 # # 'キーボードから正の整数を入力するとその桁数を表示する' :- 'キーボードから正の整数を入力すると'(_正の整数), 'その桁数を表示する'(_正の整数). 'キーボードから正の整数を入力すると'(_正の整数) :- 整数を得る(正の整数,_正の整数 > 0,_正の整数). 'その桁数を表示する'(_正の整数) :- number_chars(_正の整数,Chars), length(Chars,_その桁数), writef('%t桁です\n',[_その桁数]). 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. get_line(Line) :- read_line_to_codes(user_input,Codes), atom_codes(Line,Codes). % 以下のサイトは # 出典:: http://toro.2ch.net/read.cgi/tech/1354393458/2 # # # お題:摂氏温度入力で華氏温度表示。 # 摂氏温度入力で華氏温度表示 :- 摂氏温度入力で(_摂氏温度), 華氏温度表示(_摂氏温度). 摂氏温度入力で(_摂氏温度) :- write('摂氏温度を入力してください : '), 一行の読み込み(Line), '診断: 摂氏温度入力'(Line,_摂氏温度),!. 摂氏温度入力で(_摂氏温度) :- 摂氏温度入力で(_摂氏温度). '診断: 摂氏温度入力'(Line,_摂氏温度) :- atom_to_term(Line,_摂氏温度,_), number(_摂氏温度),!. '診断: 摂氏温度入力'(Line,_) :- writef('摂氏温度は整数または実数ですが、入力された %t からは数値情報が得られません。再入力をお願いします。\n',[Line]), fail. 華氏温度表示(_摂氏温度) :- _華氏温度 is 9 * _摂氏温度 / 5 + 32, writef('華氏温度は %t です。\n',[_華氏温度]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/70 # # [1] c言語 # [2] () キーボードから0 以上100以下の整数を入力し, # (1) 0以上10未満 # (2) 10 以上20未満 # (3) 20 以上30未満 # ..... # (10) 90 以上100 未満 # (11) 100 # の11 段階に分類して頻度を調べるプログラムを作成せよ.ただし,負の値が入力された場合 # にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面 # 表示して頻度には数えないこと. # # ()整数値を要素にもつk 行m 列行列A とm 行n 列行列B を宣言し,それらの要素をキーボー # ドから入力してA×B を算出するプログラムを作成せよ.ただし,k,m,n はk≠m,m≠n,k≧2, # m≧2,n≧2 を満たす任意の値をプログラム内で各自設定してよい.ただし,A×B の値を画面 # 表示する前に,k 行n列行列C に値を代入しておくこと. # # ' キーボードから0 以上100以下の整数を入力し, (1) 0以上10未満 (2) 10 以上20未満 (3) 20 以上30未満 ..... (10) 90 以上100 未満 (11) 100 の11 段階に分類して頻度を調べるプログラムを作成せよ.ただし,負の値が入力された場合 にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと.' :- 頻度ならびの初期化(0,_頻度ならびの初期状態), 'キーボードから0 以上100以下の整数を入力し,11 段階に分類して頻度を調べる.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと'(_頻度ならびの初期状態,_頻度ならび,継続), 現在の頻度の表示(_頻度ならび). 頻度ならびの初期化(100,[[100,101,0]]) :- '100の場合だけは範囲指定にならないが、ここでは101未満として形式的に一致させる',!. 頻度ならびの初期化(N,[[N,N_2,0]|R]) :- N_2 is N + 10, 頻度ならびの初期化(N_2,R). '100の場合だけは範囲指定にならないが、ここでは101未満として形式的に一致させる'. 'キーボードから0 以上100以下の整数を入力し,11 段階に分類して頻度を調べる.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと'(_,_頻度ならび,_頻度ならび,終了) :- !. 'キーボードから0 以上100以下の整数を入力し,11 段階に分類して頻度を調べる.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと'(_入力された整数,_頻度ならび_1,_頻度ならび,_) :- 現在の頻度の表示(_頻度ならび_1), ' キーボードから0 以上100以下の整数を入力する.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示する.'(_入力された整数), 頻度ならびの更新(_入力された整数,_頻度ならび_1,_頻度ならび_2,_状態_2), 'キーボードから0 以上100以下の整数を入力し,ただし,負の値が入力された場合にはプログラムを終了し,11 段階に分類して頻度を調べる.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと'(_入力された整数,[],_頻度ならび,_状態_2). ' キーボードから0 以上100以下の整数を入力する.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示する.'(_整数) :- write('0 以上100以下の整数を入力してください : '), get_line(Line), '診断::整数入力'(Line,_整数),!. ' キーボードから0 以上100以下の整数を入力する.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示する.'(_整数) :- ' キーボードから0 以上100以下の整数を入力する.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示する.'(_整数). '診断::整数入力'(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), _整数 < 101,!. '診断::整数入力'(Line,_整数) :- writef('入力された%tからは0以上100以下の整数が得られません。再入力をお願いします。\n',[Line]), fail. 頻度ならびの更新(_入力された整数,_頻度ならび_1,_頻度ならび_2,継続) :- between(0,100,_入力された整数), 頻度ならびの更新(_入力された整数,_頻度ならび_1,_頻度ならび_2),!. 頻度ならびの更新(N,_頻度ならび,_頻度ならび,終了) :- N < 0,!. 頻度ならびの更新(_入力された整数,_頻度ならび_1,_頻度ならび_2) :- append(L0,[[_範囲以上,_範囲未満,_頻度_1]|R],_頻度ならび_1), _入力された整数 >= _範囲以上, _入力された整数 < _範囲未満, _頻度_2 is _頻度_1 + 1, append(L0,[[_範囲以上,_範囲未満,_頻度_2]|R],_頻度ならび_2). 頻度ならびの初期化(100,[[100,101,0]]) :- !. 頻度ならびの初期化(N,[[N,N_2,0]|R]) :- N_2 is N + 10, 頻度ならびの初期化(N_2,R). 現在の頻度の表示([[100,101,_頻度]]) :- writef('%t 頻度=%t\n',[_頻度]),!. 現在の頻度の表示([[_範囲以上,_範囲未満,_頻度]|R]) :- writef('%t 以上 %t 未満 頻度=%t\n',[_範囲以上,_範囲未満,_頻度]), 現在の頻度の表示(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/543 # # [1] c言語 # [2] 問題文: # 円柱の半径と高さを入力すると、表面積と体積を計算するプログラムを作成せよ。 # 入力される数値として、浮動小数点数値に対応すること。 # 作業内容と考察もお願いします。 # '円柱の半径と高さを入力すると、表面積と体積を計算するプログラムを作成せよ。 入力される数値として、浮動小数点数値に対応すること。' :- '円柱の半径と高さを入力すると、表面積と体積を計算するプログラムを作成せよ。入力される数値として、浮動小数点数値に対応すること。'(_表面積,_体積), writef('円柱の 表面積は %t, 体積は %t です。\n',[_表面積,_体積]). '円柱の半径と高さを入力すると、表面積と体積を計算するプログラムを作成せよ。入力される数値として、浮動小数点数値に対応すること。'(_表面積,_体積) :- '円柱の半径と高さを入力すると(入力される数値として、浮動小数点数値に対応すること)'(_円柱の半径,_円柱の高さ), '表面積と体積を計算する'(_円柱の半径,_円柱の高さ,_表面積,_体積), '円柱の半径と高さを入力すると(入力される数値として、浮動小数点数値に対応すること)'(_円柱の半径,_円柱の高さ) :- '円柱の半径の入力(入力される数値として、浮動小数点数値に対応すること)'(_円柱の半径), '円柱の高さの入力(入力される数値として、浮動小数点数値に対応すること)'(_円柱の高さ). '円柱の半径の入力(入力される数値として、浮動小数点数値に対応すること)'(_円柱の半径) :- write('円柱の半径を入力してください : '), get_line(Line), 円柱の半径入力診断(Line,_円柱の半径),!. '円柱の半径(入力される数値として、浮動小数点数値に対応すること)入力診断'(Line,_円柱の半径) :- atom_to_term(Line,_円柱の半径,_), 円柱の半径は整数か実数かのどちらか(_円柱の半径), _円柱の半径 > 0,!. '円柱の半径(入力される数値として、浮動小数点数値に対応すること)入力診断'(Line,_円柱の半径) :- writef('入力された %t からは適切な円柱の半径としての値が取れません。\n再入力をお願いします。\n',[Line]), fail. 円柱の半径は整数か実数かのどちらか(_円柱の半径) :- integer(_円柱の半径). 円柱の半径は整数か実数かのどちらか(_円柱の半径) :- float(_円柱の半径). '円柱の高さの入力(入力される数値として、浮動小数点数値に対応すること)'(_円柱の高さ) :- write('円柱の高さを入力してください : '), get_line(Line), '円柱の高さ(入力される数値として、浮動小数点数値に対応すること)入力診断'(Line,_円柱の高さ),!. '円柱の高さ(入力される数値として、浮動小数点数値に対応すること)入力診断'(Line,_円柱の高さ) :- atom_to_term(Line,_円柱の高さ,_), 円柱の高さは整数か実数かのどちらか(_円柱の高さ), _円柱の高さ > 0,!. '円柱の高さ(入力される数値として、浮動小数点数値に対応すること)入力診断'(Line,_円柱の高さ) :- writef('入力された %t からは適切な円柱の高さとしての値が取れません。\n再入力をお願いします。\n',[Line]), fail. 円柱の高さは整数か実数かのどちらか(_円柱の高さ) :- integer(_円柱の高さ). 円柱の高さは整数か実数かのどちらか(_円柱の高さ) :- float(_円柱の高さ). '表面積と体積を計算する'(_円柱の半径,_円柱の高さ,_表面積,_体積) :- 表面積を計算する(_円柱の半径,_円柱の高さ,_表面積), 体積を計算する(_円柱の半径,_円柱の高さ,_体積). 表面積を計算する(_円柱の半径,_円柱の高さ,_表面積) :- '表面積は上面、底面、側面の合計である'(_円柱の半径,_円柱の高さ,_表面積). '表面積は上面、底面、側面の合計である'(_円柱の半径,_円柱の高さ,_表面積) :- _上面の面積 is _円柱の半径 * _円柱の半径 * pi, _底面の面積 is _円柱の半径 * _円柱の半径 * pi, 側面の面積は円柱の円の周囲の長さに高さを乗じたもの(_円柱の半径,_円柱の高さ,_側面の面積), _表面積 is _上面の面積 + _底面の面積 + _側面の面積. 側面の面積は円柱の円の周囲の長さに高さを乗じたもの(_円柱の半径,_円柱の高さ,_側面の面積) :- _円柱の円の周囲の長さ is _円柱の半径 * 2 * pi, _側面の面積 is _円柱の周囲の長さ * _円柱の高さ. 体積を計算する(_円柱の半径,_円柱の高さ,_体積) :- 円柱の体積は上面の面積に高さを乗じたもの(_円柱の半径,_円柱の高さ,_体積). 円柱の体積は上面の面積に高さを乗じたもの(_円柱の半径,_円柱の高さ,_体積) :- _上面の面積 is _円柱の半径 * _円柱の半径 * pi, _体積 is _上面の面積 * _円柱の高さ. % 以下のサイトは # [1] プログラミング # [2] 50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求めるプログラムを作成せよ. # # 次のような出力が得られることを確認せよ (表示形式は各自工夫せよ). # o 310円 → 50円×3枚+80円×2枚+120円×0枚 # o 390円 → 50円×3枚+80円×0枚+120円×2枚, 50円×3枚+80円×3枚+120円×0枚 # [3] 環境 #  [3.1] winXP sp2 #  [3.2] cygwin #  [3.3] C # [4] 2006年10月23日23時59分 # [5] 途中までやったんで埋める形でお願いします # 途中までやったぶんは次書きます '50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求めて、これを表示する. ' :- 'キーボードから金額 t を入力し'(_金額t), '50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求める'(_金額t,_切手枚数の組合せならび), 組合せを表示する(_金額t,_切手枚数の組合せならび). '50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求める. '(_金額t,_切手枚数の組合せならび) :- setof([_50円切手の枚数,_80円切手の枚数,_120円切手の枚数], [_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数] ^ 組合せ合計が金額tと一致する(_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数)),_切手枚数の組合せならび). 'キーボードから金額 t を入力し'(_金額t) :- 整数を得る('金額t ',_金額t > 0,_金額t). 組合せ合計が金額tと一致する(_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数) :- 組合せ合計が金額tと一致する(_L,_金額t), 組合せ枚数を数える(L,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数). 組合せ合計が金額tと一致する(_L,_金額t) :- between(1,12,N), 組合せ([50,50,50,50,80,80,80,80,120,120,120],N,L), sum_list(L,_金額t), 組合せ枚数を数える(L,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数) :- 度数(member(50,L),_50円切手の枚数), 度数(member(80,L),_80円切手の枚数), 度数(member(120,L),_120円切手の枚数). 組合せを表示する(_,[]) :- write('切手の組合せは作れません\n'). 組合せを表示する(_金額t,_切手枚数の組合せならび) :- forall(append(_,[[_50円切手の枚数,_80円切手の枚数,_120円切手の枚数]|R],_切手枚数の組合せならび), writef('%w -> 50円切手×%w枚+80円切手×%w枚+120円切手×%w枚\n',[_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数])). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R2]) :- 'Nを1減らして残り要素の組合せ'(R1,N,R2). 組合せ([_|R1],N,R2) :- 'Nはそのままで残り要素の組合せ'(R1,N,R2). 'Nを1減らして残り要素の組合せ'(R1,N,R2) :- N > 1, succ(N_1,N), 組合せ(R1,N_1,R2). 'Nはそのままで残り要素の組合せ'(R1,N,R2) :- N > 1, 組合せ(R1,N,R2). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典:: http://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 + _単価 * _数量. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #880 # [1]授業単元:C言語 # [2]問題文 # マインスイーパのような爆弾ゲームプログラムを作成する。 # 1. マス目を8× 8に設定する。 # 2. 爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)。 # 3.まだ指定していないマス目には数字の0の代わりに記号'-'を表示する。 # 4.爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を # 表示する(最小で0、最大で8)。 # 5. 爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字 # の'x'を表示し、"Bomb!"と表示して終了する。 # # [3]環境 # [3.1]windows7 # [3.2]gcc # [3.3]C/C++ # [4]7月20日 # よろしくお願いします。 # マインスイーパ :- 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面). 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面) :- 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面), '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_平坦なならびで表現された盤面). マインスイーパ(_平坦なならびで表現された盤面) :- 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面),!. マインスイーパ(_平坦なならびで表現された盤面) :- マインスイーパを継続する(_平坦なならびで表現された盤面). 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面) :- 度数((member(A,_平坦なならびで表現された盤面),atom(A)),64), write('あなたの勝ちです。\n'). マインスイーパを継続する(_平坦なならびで表現された盤面) :- '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置), マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置) :- 爆弾を隠して盤面を表示する(_平坦なならびで表現された盤面), マス目を選択させる(_行位置,_列位置). マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面),!. マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面), 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面) :- 平坦化した位置に変換(_行位置,_列位置,_nth1), nth1(_nth1,_平坦なならびで表現された盤面,0). 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面) :- 爆弾は周囲にいくつあるか(_nth1,_平坦なならびで表現された盤面,_個数), writef('周囲に爆弾は %w 個あります\n',[_個数]),!. '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 得点は(_平坦なならびで表現された盤面,_得点), 爆弾が置かれたすべてのマス目に小文字のxを表示し(_平坦なならびで表現された盤面), writef('\n Bomb! \n\n\n あなたの得点は %t です\n',[_得点]). 得点は(_平坦なならびで表現された盤面,_得点) :- 度数((member(A,_平坦なならびで表現された盤面),\+(var(A)),A==0),_得点). 爆弾が置かれたすべてのマス目に小文字のxを表示し([]) :- !. 爆弾が置かれたすべてのマス目に小文字のxを表示し(L) :- 爆弾が置かれたすべてのマス目に小文字のxを表示して行く(L). 爆弾が置かれたすべてのマス目に小文字のxを表示して行く([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾が置かれたすべてのマス目に小文字のxを表示し(R). 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 行末まで表示する(A,R). 行末まで表示する(A,R) :- 爆弾を含むマス目表示文字(A,_表示文字), 爆弾を含むマス目表示(R,_表示文字). 爆弾を含むマス目表示(R,_表示文字) :- writef('%w',[_表示文字]), R = [], write('\n'). マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]). 爆弾を含むマス目表示文字(V,'-') :- var(V),!. 爆弾を含むマス目表示文字('x','x') :- !. 爆弾を含むマス目表示文字(_,0). 爆弾を隠して盤面を表示する([]). 爆弾を隠して盤面を表示する([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を隠して盤面を表示する(R). 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 爆弾を隠して行末まで表示する(A,R). 爆弾を隠して行末まで表示する(A,R) :- 爆弾を隠すマス目表示文字(A,_表示文字), 爆弾を隠すマス目表示(_表示文字,R). 爆弾を隠すマス目表示(_表示文字,R) :- writef('%w',[_表示文字]), R = [], write('\n'). 爆弾を隠すマス目表示文字(V,'-') :- var(V),!. 爆弾を隠すマス目表示文字('x','-') :- !. 爆弾を隠すマス目表示文字(_,0). 平坦化した位置に変換(_行位置,_列位置,_nth1) :- _nth1 is (_行位置-1) * 8 + _列位置. 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面) :- length(_平坦なならびで表現された盤面,64). '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(L) :- 爆弾は10個にし(Lp), 同じマス目に重ならないようにランだけに配置する(Lp,L). 爆弾は10個にし(Lp) :- length(Lp,10). 同じマス目に重ならないようにランだけに配置する([],L) :- !. 同じマス目に重ならないようにランだけに配置する([_|R1],L) :- 同じマス目に重ならないようにランダムに一個爆弾を設置する(L), 同じマス目に重ならないようにランだけに配置する(R1,L). 同じマス目に重ならないようにランダムに一個爆弾を設置する(L) :- ランダムに(L,_nth0), 同じマス目に重ならないように一個爆弾を設置する(_nth0,L),!. ランダムに(L,_nth0) :- repeat, _nth0 is random(64). 同じマス目に重ならないように一個爆弾を設置する(_nth0,L) :- 同じマス目に重ならないように(_nth0,L,V), 一個爆弾を設置する(V). 同じマス目に重ならないように(_nth0,L,V) :- nth0(_nth0,L,V), var(V). 一個爆弾を設置する(x). 爆弾は周囲にいくつあるか(N,L,_個数) :- 度数(周囲の八箇所の中で爆弾があるのは(N,L),_個数). 周囲の八箇所の中で爆弾があるのは(N,L) :- 周辺の八箇所の中で(N,_nth1), '_nth1には爆弾がある'(_nth1,L). 周辺の八箇所の中で(N,_nth1) :- member(_式,[N-9,N-8,N-7,N-1,N,N+1,N+7,N+8,N+9]), _nth1 is _式. '_nth1には爆弾がある'(_nth1,L) :- nth1(_nth1,L,V), 変数ではなく爆弾がある(V). 変数ではなく爆弾がある(V) :- 変数ではなく(V), V = x. 変数ではなく(V) :- \+(var(V)). マス目を選択させる(_行位置,_桁位置) :- 整数を得る('マス目の行位置(1-8) ',between(1,8,_行位置),_行位置), 整数を得る('マス目の桁位置(1-8) ',between(1,8,_桁位置),_桁位置),!. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数),!. 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- catch(_条件,E,fail),!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/745 # # 問題 # 1が連続しない2進数を1から小さい順に1000個求めよ。 # 例 # 10 => OK # 110 => NG # 10101 =>OK # 11011 =>NG # # '1が連続しない2進数を1から小さい順に1000個求めよ。'(_1000個の数ならび) :- findall(_10進数,( '1が連続しない2進数を1から小さい順に'([1],1,_度数,_ビットならび), ( _度数 > 1000,!,fail; 'ビットならびを10進数に変換'(_ビットならび,_10進数))), _1000個の数ならび). '1が連続しない2進数を1から小さい順に'([1|L],_度数,_度数,[1|L]). '1が連続しない2進数を1から小さい順に'([1|L],_度数_1,_度数,_ビットならび) :- _度数_2 is _度数_1 + 1, '1が連続しない2進数を1から小さい順に'([0,1|L],_度数_2,_度数,_ビットならび). '1が連続しない2進数を1から小さい順に'([0|L],_度数_1,_度数,_ビットならび) :- member(N,[1,0]), '1が連続しない2進数を1から小さい順に'([N,0|L],_度数_1,_度数,_ビットならび). 'ビットならびを10進数に変換'(L,_10進数) :- atomic_list_concat([0,b|L],_二進数表示), atom_to_term(_二進数表示,_10進数,_). % 以下のサイトは # 出典:: 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) ) # などを習いました '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をファイルに記録する'(_ファイル) :- open(_ファイル,write,Outstream), 出席番号を標準入力から入力(_最初の出席番号), '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_最初の出席番号), close(Outstream). '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(_,end_of_file) :- !. '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_出席番号) :- 各科目の点数を標準入力から入力(_各科目の点数ならび), 上記のフォーマットにあわせて受験者の成績をOutstreamに出力(Outstream,_出席番号,_各科目の点数ならび), 出席番号を標準入力から入力(_次の出席番号), '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_次の出席番号). 出席番号を標準入力から入力(_出席番号) :- get_line(Line), '診断: 出席番号を標準入力から入力'(Line,_出席番号),!. '診断: 出席番号を標準入力から入力'(Line,_出席番号) :- write('出席番号を入力してください(終了する時はend_of_file) : '), atom_to_term(Line,_出席番号整数,_), integer(_出席番号整数), 頭部零文字列(4,_出席番号整数,_出席番号),!. '診断: 出席番号を標準入力から入力'(_,end_of_file). 各科目の点数を標準入力から入力(_各科目の点数ならび) :- findall(_点数,( member(_科目,[体育,美術,英語,数学,社会]), 整数を得る(_科目,(_点数>=0,_点数=<100),_点数)), _各科目の点数ならび). 上記のフォーマットにあわせて受験者の成績をOutstreamに出力(Outstream,_出席番号,_各科目の点数ならび) :- atomic_list_concat([_出席番号|_各科目の点数ならび],' ',_表示行文字列), writef(Outstream,'%t\n',[_表示行文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/745 # # 問題 # 1が連続しない2進数を1から小さい順に1000個求めよ。 # 例 # 10 => OK # 110 => NG # 10101 =>OK # 11011 =>NG # # '1が連続しない2進数を1から小さい順に1000個求めよ。' :- '1が連続しない2進数を1から小さい順に1000個求めよ。'([1],1). '1が連続しない2進数を1から小さい順に1000個求めよ。'([1|L],_度数) :- atomic_list_concat([0,b|[1|L]],S), atom_to_term(S,X,_), writef('%t: %t=%t\n',[_度数,X,S]), _度数 = 1000,!. '1が連続しない2進数を1から小さい順に1000個求めよ。'([1|L],_度数_1) :- _度数_2 is _度数_1 + 1, '1が連続しない2進数を1から小さい順に1000個求めよ。'([0|[1|L]],_度数_2). '1が連続しない2進数を1から小さい順に1000個求めよ。'([0|L],_度数) :- member(N,[1,0]), '1が連続しない2進数を1から小さい順に1000個求めよ。'([N|[0|L]],_度数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/625 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/www.fluid.cse.nagoya-u.ac.jp/~ishihara/c/ #    7/6の課題 # 9.1 ニュートン法 # # f(x)=0の解を求めるアルゴリズム. # # x=x0を初期値(近似値)として,x=x0におけるy=f(x)の接線:y-f(x0)=f'(x0)(x-x0)と # x軸との交点 x=x1=x0-f(x0)/f'(x0)を新しい近似値とする。 # 反復回数上限(1000). f(X,Y) :- Y is 2 * X * X - 7 * X + 6. df(X,Y) :- Y is 4 * X - 7. 'f(x)=0の解を求める' :- 数を得る(初期値x0,_初期値), ニュートン法(_初期値,_反復回数,_収束解), writef('収束解 = %t\n',[_収束解]). 'f(x)=0の解を求める' :- write('収束しません\n'). ニュートン法(_初期値,_反復回数,_収束解) :- 反復回数上限(_反復回数上限), f(_初期値,Y1), df(_初期値,Y2), X_0 is _初期値 - Y1 / Y2, ニュートン法(1,_反復回数上限,X_0,Y1,_反復回数,_収束解). ニュートン法(_反復回数,_反復回数上限,_,_,_) :- _反復回数 > _反復回数上限,!,fail. ニュートン法(_反復回数,_,X,Y,_反復回数,X) :- abs(Y) < 1.0e-09. ニュートン法(_反復回数_1,_反復回数上限,X_1,Y,_反復回数,X) :- f(X_1,Y1), df(X_1,Y2), X_2 is X_1 - Y1 / Y2, _反復回数_2 is _反復回数_1 + 1, ニュートン法(_反復回数_2,_反復回数上限,X_2,Y1,_反復回数,X). 数を得る(A,N) :- writef('%w : ',[A]), 行を得る(_行), read_term_from_atom(_行,N,[]). 行を得る(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 数を得る % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #573 # [1] 授業単元: STL # [2] 問題文(含コード&リンク): # 問 二つの値xとyを使用して差を返す関数形式マクロdiff(x,y)を使用し, # キーボードからint型の2つの数値n1とn2を入力した場合に、入力した2つの数値とその差を出力するmain関数のプログラムを作成しなさい。 # 問 四季を表す列挙体seasonを定義し、キーボードから0,1,2,3を入力した場合に、 # それぞれ"Spring", "Summer", "Fall", "Winter"と表示するプログラムを作成しなさい。ただし、enum season {Spring, Summer, Fall, Winter};を使用し、キーボードから0,1,2,3以外の数字が入力された場合には、入力し直す処理を含めなさい。 # 問 数字文字の出現回数の百分率を小数点以下1桁まで求め、 # '*'のグラフと共に表示するmain関数のプログラムを作成しなさい。 # 問 キーボードから入力した行数と空白以外の文字数を求め, # 行数と文字数を表示するmain関数のプログラムを作成しなさい。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。 # 四季(0,春). 四季(1,夏). 四季(2,秋). 四季(3,冬). '四季述語を定義し、キーボードから0,1,2,3を入力した場合に、それぞれ 春,夏,秋,冬 と表示する。0,1,2,3以外の数字が入力された場合には、入力し直す' :- 'キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_数字), 'それぞれ 春,夏,秋,冬 と表示する。'(_数字). 'キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_数字) :- キーボードから入力(_入力), '診断: キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_入力,_数字),!. 'キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_数字) :- 'キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_数字). '診断: キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_入力,_数字) :- '0,1,2,3を入力した'(_入力,_数字),!. '診断: キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_入力,_数字) :- '0,1,2,3以外の数字が入力された'(_入力,_), fail. キーボードから入力(_入力) :- read_line_to_codes(user_input,Codes), atom_codes(_入力,Codes). '0,1,2,3を入力した'(_入力,_数字) :- read_term_from_atom(_入力,_数字,[variable_names(_),variables(_)]), member(_数字,[0,1,2,3]). '0,1,2,3以外の数字が入力された'(_入力,_) :- \+('キーボードから0,1,2,3を入力した'(_入力,_数字)). 'それぞれ 春,夏,秋,冬 と表示する。'(_数字) :- 四季(_数字,_春_夏_秋_冬), writef('%t\n',[_春_夏_秋_冬]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/652 # # 問題 # 整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。 # 例 # n=15のとき # 1+2+3+4+5+6+7+8+9+(1+0)+(1+1)+(1+2)+(1+3)+(1+4)+(1+5) = 66 # # '整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。'(_n,_集計値) :- 一桁ずつ四項に分解した加算文字列ならび(_n,_一桁ずつ四項に分解した加算文字列ならび), atomic_list_concat(_一桁ずつ四項に分解した加算式文字列ならび,'+',_評価式文字列), atom_to_term(_評価式文字列,_評価式,_), _集計値 is _評価式. 一桁ずつ四項に分解した加算文字列ならび(_n,_一桁ずつ四項に分解した加算式文字列ならび) :- findall(_一桁ずつ四項に分解した加算式文字列,( between(1,_n,_整数), number_chars(_整数,_一桁ずつ四項に分解した数字ならび), atomic_list_concat(_一桁ずつ四項に分解した数字ならび,'+',_一桁ずつ四項に分解した加算式文字列)), _一桁ずつ四項に分解した加算式文字列ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/652 # # 問題 # 整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。 # 例 # n=15のとき # 1+2+3+4+5+6+7+8+9+(1+0)+(1+1)+(1+2)+(1+3)+(1+4)+(1+5) = 66 # % % どうせなら '1+2+3+4+5+6+7+8+9+(1+0)+(1+1)+(1+2)+(1+3)+(1+4)+(1+5)'を生成して % それを利用して!計算したいものだ。 % '整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。'(_n,_集計値) :- 一桁ずつに分解した加算文字列ならび(_n,_一桁ずつに分解した加算文字列ならび), atomic_list_concat(_一桁ずつに分解した加算式文字列ならび,'+',_評価式文字列), atom_to_term(_評価式文字列,_評価式,_), _集計値 is _評価式. 一桁ずつに分解した加算文字列ならび(_n,_一桁ずつに分解した加算式文字列ならび) :- findall(_一桁ずつに分解した加算式文字列,( between(1,_n,_整数), number_chars(_整数,_一桁ずつに分解した数字ならび), '二桁以上の時は括弧で括ってプラス演算子を挿入する'(_n,_一桁ずつに分解した数字ならび,_一桁ずつに分解した加算式文字列)), _一桁ずつに分解した加算式文字列ならび). '二桁以上の時は括弧で括ってプラス演算子を挿入する'(_n,_一桁ずつに分解した数字ならび,_一桁ずつに分解した加算式文字列) :- _n < 10, atomic_list_concat(_一桁ずつに分解した数字ならび,'+',_一桁ずつに分解した加算式文字列). '二桁以上の時は括弧で括ってプラス演算子を挿入する'(_n,_一桁ずつに分解した数字ならび,_一桁ずつに分解した括弧で括られた加算式文字列) :- _n >= 10, atomic_list_concat(_一桁ずつに分解した数字ならび,'+',_一桁ずつに分解した加算式文字列), atomic_list_concat(['(',_一桁ずつに分解した加算式文字列,')'],_一桁ずつに分解した括弧で括られた加算式文字列). % 以下のサイトは # 出典:: 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/362 # # 再帰関数を使わず、nの階乗を求めるプログラムを教えて下さい。 # '再帰関数を使わず、nの階乗を求める'(_n,_nの階乗) :- nの階乗を表す式文字列(_n,_式文字列), 式文字列を解析して式を評価する(_式文字列,_nの階乗). nの階乗を表す式文字列(_n,_式文字列) :- length(L,_n), findall(M,( append(L0,[_|_],L), length([_|L0],M)), L2), atomic_list_concat(L2,'*',_式文字列). 式文字列を解析して式を評価する(_式文字列,_nの階乗) :- atom_to_term(_式文字列,_式,_), _nの階乗 is _式. % length/2 も append/3 も atomic_list_concat/3 も再帰述語ですから % これは解答にはなっていません。 % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #164 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # n人の点数を読み込み、その中央値を求めたい。 # そこで、次の関数を 作成しなさい。 # *標準入力から読み込んだ点数を配列に代入する関数。 # ただし、呼び出し時には人数は与えられず、負の点数が入力されたら、 # その直前までの点数を返すものとする。また、人数を関数の返却値で返す。 # 例.85, 58, 90, 65, 45, -1 のときは、5名の点数を配列に入れ、 # 関数自身は人数の5を返却する。 # *配列の中身を昇順に並べ替える関数。ここで、配列のi番目とj番目の要 # 素の値を入れ替えるには、次のように行う。 # int temp = ary[i]; # ary[i] = ary[j]; # ary[j] = temp; # * 配列から中央値を返却する関数。 # 中央値は、データ数が奇数個のときは、 1番目から数えて(n+1)/2番目の # データであり、偶数個のときは、n/2番目とn/2+1番目のデータの平均値でる。 # 例.50, 70, 90のときは、中央値は70であり、50, 70, 80, 90のときは、 中 # 央値は75である。 # 適切な実行例を作成し、上記の関数が正しく動作することを示しなさい。 # 'n人の点数を読み込み、その中央値を求めたい。そこで、次の関数を作成しなさい。 *標準入力から読み込んだ点数を配列に代入する関数。ただし、呼び出し時には人数は与えられず、負の点数が入力されたら、その直前までの点数を返すものとまた、人数を関数の返却値で返す。'(_人数,_中央値) :- 整数を得る(人数,_人数), '人数分の点数を入力する。ただし、負の点数が入力されたら、その直前の点数を返す'(_人数,_点数ならび), 中央値(_点数ならび,_中央値). '人数分の点数を入力する。ただし、負の点数が入力されたら、その直前の点数を返す'(_人数,_点数ならび) :- findall(_人数,_点数,( 整数を得る(点数,_点数), ( _点数 < 0,!,fail;true)),_点数ならび),!. 中央値(_標本ならび,_中央値) :- 整列して中央値を得る(_標本ならび,_中央値). 整列して中央値を得る(_標本ならび,_中央値) :- 重複要素を残す整列(_標本ならび,_整列した標本ならび), 中央値を得る(_整列した標本ならび,_中央値). 中央値を得る(_整列した標本ならび,_中央値) :- length(_整列した標本ならび,_要素数), _要素数の半分 is _要素数 // 2, 中央値を得る(_整列した標本ならび,_要素数,_要素数の半分,_中央値). 中央値を得る(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- '標本数が奇数の時は中央順位、偶数の時は中央二値の平均値'(_整列した標本ならび,_要素数,_要素数の半分,_中央値). '標本数が奇数の時は中央順位、偶数の時は中央二値の平均値'(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 標本数が奇数の時は中央順位(_整列した標本ならび,_要素数,_要素数の半分,_中央値). '標本数が偶数の時は中央順位、偶数の時は中央二値の平均値'(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 標本数が偶数の時は中央二値の平均値(_整列した標本ならび,_要素数,_要素数の半分,_中央値). 標本数が奇数の時は中央順位(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 奇数(_要素数), 中央順位(_中央値). 中央順位(_整列した標本ならび,_要素数の半分,_中央値) :- length(L1,_要素数の半分), length(L2,_要素数の半分), append(L1,[_中央値|L2],_整列した標本ならび). 標本数が偶数の時は中央二値の平均値(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 偶数(_要素数), 中央二値(_整列した標本ならび,_要素数の半分,_中央値_1,_中央_2), _中央値 is (_中央値_1 + _中央値_2) / 2. 中央二値(_整列した標本ならび,_要素数の半分,_中央値_1,_中央_2) :- length([_|L1],_要素数の半分), length([_|L2],_要素数の半分), append(L1,[_中央値1,_中央値2|L2],_整列した標本ならび). 奇数(_奇数) :- 1 is _奇数 mod 2. 偶数(_偶数) :- 0 is _偶数 mod 2. 重複要素を残す整列([],[]) :- !. 整列(_対象ならび,_整列したならび) :- _対象ならび = [_軸要素|_残り対象ならび], 重複要素を残す整列(_軸要素,_残り対象ならび,_整列したならび). 重複要素を残す整列(_軸要素,_軸要素を除いた対象ならび,_整列したならび) :- 分割(_軸要素,_軸要素を除いた対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび), 重複要素を残す整列(_軸要素に等しいかより小さい要素のならび,_整列した軸要素に等しいかより小さい要素のならび), 重複要素を残す整列(_軸要素より大きい要素のならび,_整列した軸要素より大きい要素のならび), append(_軸要素に等しいかより小さい要素のならび,[_軸要素|_整列した軸要素より大きい要素のならび],_整列したならび). 分割(_軸要素,[],[],[]). 分割(_軸要素,[_要素|_残り対象ならび],[_要素|_軸要素に等しいかより小さい要素のならび],_軸要素より大きい要素のならび) :- _要素 @=< _軸要素, 分割(_軸要素,_残り対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび). 分割(_軸要素,[_要素|_残り対象ならび],_軸要素に等しいかより小さい要素のならび,[_要素|_軸要素より大きい要素のならび]) :- _要素 @> _軸要素, 分割(_軸要素,_残り対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび). 整数を得る(_催促文字列,_整数) :- 行入力して整数に変換する(_催促文字列,_整数),!. 整数を得る(_催促文字列,_整数) :- 整数を得る(_催促文字列,_整数). 行入力して整数に変換する(_催促文字列,_整数) :- 行入力(_催促文字,_行), 整数検査(_行,_整数). 行入力(_催促文字,_行) :- writef('%w ',[_催促文字]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 整数検査(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). % 以下のサイトは # # 質問付き入力の一般型を示す。 # n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 整数を得る(_催促文,_整数ならび) :- list(_催促文), length(_催促文,Len), length(_整数ならび,Len), 整数を得る(_整数) :- 整数を得る('',true,_整数). 整数を得る(_催促文ならび,_整数ならび) :- list(_催促文ならび), findall(_整数,( 部分ならび(_催促文ならび,_,_,_,1,[_催促文],_,_), 整数を得る(_催促文,_整数)), _整数ならび),!. 整数を得る(_催促文,_整数) :- 整数を得る(_催促文,true,_整数). 整数を得る(_催促文,_整数を含む制約,_整数) :- writef('%tを入力してください : ',[_催促文]), get_line(Line), '診断: 整数を得る'(Line,_催促文,_整数を含む制約,_整数),!. 整数を得る(_催促文,_整数を含む制約,_整数) :- 整数を得る(_催促文,_整数を含む制約,_整数). '診断: 整数を得る'(Line,_,_整数を含む制約,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), call(_整数を含む制約),!. '診断: 整数を得る'(Line,_催促文,_整数を含む制約,_整数) :- writef('入力された %t からは %t が得られません。再入力をお願いします。\n',[_整数,_催促文]), fail. n個の数を得る(_n,_催促文,_数ならび) :- length(_数ならび,_n), findall(_数,( 部分ならび(_数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 数を得る(_催促文,_数)), _数ならび). 数を得る(_数) :- 数を得る('',true,_数). 数を得る(_催促文ならび,_数ならび) :- list(_催促文ならび), findall(_数,( 部分ならび(_催促文ならび,_,_,_,1,[_催促文],_,_), 整数を得る(_催促文,_数)), _数ならび),!. 数を得る(_催促文,_数) :- 数を得る(_催促文,true,_数). 数を得る(_催促文,_数を含む制約,_数) :- writef('%tを入力してください : ',[_催促文]), get_line(Line), '診断: 数を得る'(Line,_催促文,_数を含む制約,_数),!. 数を得る(_催促文,_数を含む制約,_数) :- 数を得る(_催促文,_数を含む制約,_数). '診断: 数を得る'(Line,_,_数を含む制約,_数) :- atom_to_term(Line,_数,_), 数値(_数), call(_数を含む制約),!. '診断: 数を得る'(Line,_催促文,_数を含む制約,_数) :- writef('入力された %t からは %t が得られません。再入力をお願いします。\n',[_数,_催促文]), fail. 数値(_数) :- number(_数),!. 数値(_分子/_分母) :- integer(_分子), integer(_分母), \+(_分母=0). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/118 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): キーボードから底面の半径と高さを入力したときの円柱の体積を計算するプログラムを作成しなさい # キーボードから底面の半径と高さを入力したときの円柱の体積を計算する(_円柱の体積) :- キーボードから底面の半径と高さを入力したときの円柱の体積を計算する(_,_,_円柱の体積). キーボードから底面の半径と高さを入力したときの円柱の体積を計算する(_底面の半径,_高さ,_円柱の体積) :- キーボードから底面の半径と高さを入力したときの(_底面の半径,_高さ), 円柱の体積を計算する(_底面の半径,_高さ,_円柱の体積). キーボードから底面の半径と高さを入力したときの(_底面の半径,_高さ) :- 底面の半径の入力(_底面の半径), 高さの入力(_高さ). 底面の半径の入力(_底面の半径) :- write('底面の半径を入力してください : '), get_line(Line), '診断: 底面の半径の入力(Line,_底面の半径),!. 底面の半径の入力(_底面の半径) :- 底面の半径の入力(_底面の半径). '診断: 底面の半径の入力'(Line,_底面の半径) :- atom_to_term(Line,_底面の半径,_), number(_底面の半径), _底面の半径 >= 0.0,!. '診断: 底面の半径の入力'(Line,_底面の半径) :- writef('入力された %t からは底面の半径が得られません。再入力をお願いします。\n',[Line]), fail. 高さの入力(_高さ) :- write('高さを入力してください : '), get_line(Line), '診断: 高さの入力(Line,_高さ),!. 高さの入力(_高さ) :- 高さの入力(_高さ). '診断: 高さの入力'(Line,_高さ) :- atom_to_term(Line,_高さ,_), number(_高さ), _高さ >= 0.0,!. '診断: 高さの入力'(Line,_高さ) :- writef('入力された %t からは高さが得られません。再入力をお願いします。\n',[Line]), fail. 円柱の体積を計算する(_底面の半径,_高さ,_円柱の体積) :- 円柱の体積は底面の面積に高さを掛けたものである(_底面の半径,_高さ,_円柱の体積). 円柱の体積は底面の面積に高さを掛けたものである(_底面の半径,_高さ,_円柱の体積) :- 底面の面積(_底面の半径,_底面の面積), _円柱の体積 is _底面の面積 * _高さ. 底面の面積(_底面の半径,_底面の面積) :- _底面の面積 is _底面の半径 * _底面の半径 * pi. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/118 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): キーボードから底面の半径と高さを入力したときの円柱の体積を計算するプログラムを作成しなさい # キーボードから底面の半径と高さを入力したときの円柱の体積を計算する(_円柱の体積) :- キーボードから底面の半径と高さを入力したときの円柱の体積を計算する(_,_,_円柱の体積). キーボードから底面の半径と高さを入力したときの円柱の体積を計算する(_底面の半径,_高さ,_円柱の体積) :- キーボードから底面の半径と高さを入力したときの(_底面の半径,_高さ), 円柱の体積を計算する(_底面の半径,_高さ,_円柱の体積). キーボードから底面の半径と高さを入力したときの(_底面の半径,_高さ) :- 底面の半径の入力(_底面の半径), 高さの入力(_高さ). 底面の半径の入力(_底面の半径) :- write('底面の半径を入力してください : '), get_line(Line), '診断: 底面の半径の入力(Line,_底面の半径),!. 底面の半径の入力(_底面の半径) :- 底面の半径の入力(_底面の半径). '診断: 底面の半径の入力'(Line,_底面の半径) :- atom_to_term(Line,_底面の半径,_), number(_底面の半径), _底面の半径 >= 0.0,!. '診断: 底面の半径の入力'(Line,_底面の半径) :- writef('入力された %t からは底面の半径が得られません。再入力をお願いします。\n',[Line]), fail. 高さの入力(_高さ) :- write('高さを入力してください : '), get_line(Line), '診断: 高さの入力(Line,_高さ),!. 高さの入力(_高さ) :- 高さの入力(_高さ). '診断: 高さの入力'(Line,_高さ) :- atom_to_term(Line,_高さ,_), number(_高さ), _高さ >= 0.0,!. '診断: 高さの入力'(Line,_高さ) :- writef('入力された %t からは高さが得られません。再入力をお願いします。\n',[Line]), fail. 円柱の体積を計算する(_底面の半径,_高さ,_円柱の体積) :- _円柱の体積 is _底面の半径 * _底面の半径 * pi * _高さ. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/109 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # テストを受験した学生の人数をまず入力し、それから各学生達のテストの点数を次々に入力して配列に格納したうえで、 # 0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示するプログラムを作成しなさい。 # ただしテストを受験する学生の人数は10人以下とする。 # 'テストを受験した学生の人数をまず入力し、それから各学生達のテストの点数を次々に入力して配列に格納したうえで、0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示するプログラムを作成しなさい。ただしテストを受験する学生の人数は10人以下とする。' :- 'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数), 'それから各学生達のテストの点数を次々に入力して配列に格納したうえで、'(_各学生たちのテストの点数の格納されたならび), '0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示する'(_各学生たちのテストの点数の格納されたならび). 'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数) :- write('テストを受験した学生の人数(10人以下)を入力してください : '), get_line(Line), '診断: テストを受験した学生の人数'(Line,_学生の人数),!. 'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数) :- 'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数). '診断: テストを受験した学生の人数'(Line,_学生の人数) :- atom_to_term(Line,_学生の人数,_), integer(_学生の人数), _学生の人数 >= 0, _学生の人数 =< 10. 'それから各学生達のテストの点数を次々に入力して配列に格納したうえで、'(_学生の人数,_各学生たちのテストの点数の格納されたならび) :- length(_各学生たちのテストの点数の格納されたならび,_学生の人数), findall(_点数,( 各学生達のテストの点数を次々に入力して(_各学生たちのテストの点数の格納されたならび,_点数)), _各学生たちのテストの点数の格納されたならび). 各学生達のテストの点数を次々に入力して(_各学生たちのテストの点数の格納されたならび,_点数) :- append(Ln,[_|_],_各学生たちのテストの点数の格納されたならび), length([_|Ln],_何番目), writef('%t番目の点数 : ',[_何番目]), get_integer(_点数). '0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示する'(_各学生たちのテストの点数の格納されたならび) :- '80点未満のランクの表示'(A,B,_各学生たちのテストの点数の格納されたならび), '80点以上 100点以下の表示'(_各学生たちのテストの点数の格納されたならび). '80点未満のランクの表示'(_各学生たちのテストの点数の格納されたならび) :- append(_,[[A,B]|R],[[A,B],[[0,20],[20,40],[40,60],[60,80]]), ランク範囲の人数(A,B,_各学生たちのテストの点数の格納されたならび,_人数)), writef('%t点以上 %t点未満 %t 人\n',[A,B,_人数]), R = []. ランク範囲の人数(A,B,_各学生たちのテストの点数の格納されたならび,_人数) :- count(( member(_点数,_各学生たちのテストの点数の格納されたならび), _点数 >= A, _点数 < B), _人数). '80点以上 100点以下の表示'(_各学生たちのテストの点数の格納されたならび) :- count(( member(_点数,_各学生たちのテストの点数の格納されたならび), _点数 >= 80, _点数 =< 100), _人数), writef('80点以上 100点以下 %t 人\n',[_人数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/102 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 商品の種類の数をまず入力し、それから各商品の価格と 購入した個数を入力して、合計金額を計算して表示するプログラムを作成しなさい。 # それぞれの商品番号に対して、単価と個数の2つの要素を持つような 2次元配列を使ってプログラムを作成しなさい。 # ただし商品の種類の数は100以下とする。 # '商品の種類の数をまず入力し、それから各商品の価格と購入した個数を入力して、合計金額を計算して表示する。それぞれの商品番号に対して、単価と個数の2つの要素を持つような2次元配列を使ってプログラムを作成しなさい。ただし商品の種類の数は100以下とする。' :- '商品の種類の数をまず入力し(ただし商品の種類の数は100以下とする)'(_商品の種類の数), 'それから各商品の価格と購入した個数を入力して、それぞれの商品番号に対して、単価と個数の2つの要素を持つような_各商品の価格と購入した個数ならびを生成する'(_商品の種類の数,_各商品の価格と購入した個数ならび), 合計金額を計算して表示する(_各商品の価格と購入した個数のならび). '商品の種類の数をまず入力し(ただし商品の種類の数は100以下とする)'(_商品の種類の数) :- write('商品の種類の数を設定してください : '), get_line(Line), '診断: 商品の種類の数'(Line,_商品の種類の数),!. '商品の種類の数をまず入力し(ただし商品の種類の数は100以下とする)'(_商品の種類の数) :- '商品の種類の数をまず入力し(ただし商品の種類の数は100以下とする)'(_商品の種類の数). '診断: 商品の種類の数'(Line,_商品の種類の数) :- atom_to_term(Line,_商品の種類の数,_), integer(_商品の種類の数), _商品の種類の数 > 0,!. '診断: 商品の種類の数'(Line,_商品の種類の数) :- writef('入力された %t からは適切な商品の種類の数が得られません。再入力をお願いします。\n',[Line]), fail. 'それから各商品の価格と購入した個数を入力して、それぞれの商品番号に対して、単価と個数の2つの要素を持つような_各商品の価格と購入した個数ならびを生成する'(_商品の種類の数,_各商品の価格と購入した個数ならび) :- length(_各商品の価格と購入した個数ならび,_商品の種類の数), findall([_商品番号,_商品価格,_購入した個数],( append(_,[_|_],_各商品の価格と購入した個数ならび), 商品の価格と購入した個数を入力して(_商品番号,_商品価格,_購入した個数)), _各商品の価格と購入した個数ならび). 商品の価格と購入した個数を入力して(_商品番号,_商品価格,_購入した個数) :- 商品番号の入力(_商品番号), 商品価格の入力(_商品番号,_商品価格), 購入した個数の入力(_商品番号,_購入した個数). 商品番号の入力(_商品番号) :- get_line(_商品番号). 商品価格の入力(_商品番号,_商品価格) :- writef('商品番号%tの商品価格を入力してください : ',[_商品番号]), get_line(Line), '診断: 商品価格の入力'(Line,_商品価格),!. 商品価格の入力(_商品番号,_商品価格) :- 商品価格の入力(_商品番号,_商品価格). '診断: 商品価格の入力'(Line,_商品価格) :- atom_to_term(Line,_商品価格,_), number(_商品価格), _商品価格 >= 0.0,!. '診断: 商品価格の入力'(Line,_商品価格) :- writef('入力された %t からは適切な商品価格が得られません。再入力をお願いします。\n',[Line]), fail. 購入した個数の入力(_商品番号,_購入した個数) :- writef('商品番号%tの購入した個数を入力してください : ',[_商品番号]), get_line(Line), '診断: 購入した個数の入力'(Line,_購入した個数),!. 購入した個数の入力(_商品番号,_購入した個数) :- 購入した個数の入力(_商品番号,_購入した個数). '診断: 購入した個数の入力'(Line,_購入した個数) :- atom_to_term(Line,_購入した個数,_), number(_購入した個数), _購入した個数 >= 0.0,!. '診断: 購入した個数の入力'(Line,_購入した個数) :- writef('入力された %t からは適切な購入した個数が得られません。再入力をお願いします。\n',[Line]), fail. 合計金額を計算して表示する(_各商品の価格と購入した個数のならび) :- 合計金額を計算して(_各商品の価格と購入した個数のならび,_合計金額), 表示する(_合計金額). 合計金額を計算して(_各商品の価格と購入した個数のならび,_合計金額) :- findsum(_金額,( member([_,_商品の価格,_購入した個数],_各商品の価格と購入した個数のならび), _金額 is _商品価格 * _購入した個数), _合計金額). 表示する(_合計金額) :- writef('合計金額は %t です\n',[_合計金額]). % 以下のサイトは 分数の計算と表示 :- 分数を2項読み込む([一,分子,一,分母,二,分子,二,分母],[_分子_1,_分母_1,_分子_2,_分母_2]), _答え仮分数分子 is _分子_1 * _分母_2 + _分子_2 * _分母_1, _答え仮分数分母 is _分母_1 * _分母_2, 最大公約数(_答え仮分数分子,_答え仮分数分母,_最大公約数), _答え仮分数分子_2 is _答え仮分数分子 // _最大公約数, _答え仮分数分母_2 is _答え仮分数分母 // _最大公約数, 帯分数(_答え仮分数分子_2,_答え仮分数分母_2,_答え整数部分, _答え分子,_答え分母), 分数計算表示(_分子_1,_分子_2,_答え分子,_答え整数部分,_分母_1,_分母_2,_答え分母). 分数を2項読み込む([],[]). 分数を2項読み込む([A,B|R1],[C|R2]) :- writef('第%t項の%tを整数で入力してください : ',[A,B]), get_integer(C), 分数を2項読み込む(R1,R2). 分数計算表示(_分子_1,_分子_2,_答え分子,_整数部分,_分母_1,_分母_2,_答え分母) :- _整数部分 >= 1, \+(_答えの分子=0), writef(' %2r %2r %2r \n',[_分子_1,_分子_2,_答え分子]), writef('---- + ---- =%2r---- \n',[_整数部分]), writef(' %2r %2r %2r \n',[_分母_1,_分母_2,_答え分母]). 分数計算表示(_分子_1,_分子_2,_答え分子,_整数部分,_分母_1,_分母_2,_答え分母) :- _整数部分 >= 1, 答えの分子=0, writef(' %2r %2r\n',[_分子_1,_分子_2]), writef('---- + ---- = %2r \n',[_整数部分]), writef(' %2r %2r\n',[_分母_1,_分母_2]). 分数計算表示(_分子_1,_分子_2,_答え分子,_整数部分,_分母_1,_分母_2,_答え分母) :- _整数部分 = 0, writef(' %2r %2r %2r \n',[_分子_1,_分子_2,_答え分子]]), write('---- + ---- = ---- \n'), writef(' %2r %2r %2r \n',[_分母_1,_分母_2,_答え分子]]). 帯分数(_仮分数分子,_仮分数分母,_帯分数整数部分, _帯分数分子,_帯分数分母) :- _帯分数整数部分 is _仮分数分子 // _仮分数分母, _帯分数分子 is _仮分数分子 mod _仮分数分母. _帯分数分母 = _仮分数分母. % 行列の掛算の中での分数 行列の掛算(L1,L2,X) :- 転置(L2,L4), 行列の掛算_1(L1,L4,X). 行列の掛算_1([],_,[]) :-!. 行列の掛算_1([A|R1],L,[S1|R3]) :- 行列の掛算_2(A,L,S1), 行列の掛算_1(R1,L,R3). 行列の掛算_2(_,[],[]) :-!. 行列の掛算_2(A,[B|R2],[C|R3]) :- 行列の掛算_3(A,B,C), 行列の掛算_2(A,R2,R3). 行列の掛算_3([],[],0) :-!. 行列の掛算_3([A|R1],[B|R2],S) :- 分数を含む掛算(A,B,S1), 行列の掛算_3(R1,R2,S2), 分数を含む加算(S1,S2,S),!. 分数を含む加算(A1 / A2,B1 / B2,C) :- S1 is A1 * B2 + A2 * B1, S2 is A2 * B2, 約分(S1 / S2,C),!. 分数を含む加算(A1 / A2,B,C) :- S1 is A1 + A2 * B, 約分(S1 / A2,C),!. 分数を含む加算(A,B1 / B2,C) :- S1 is B1 + B2 * A, 約分(S1 / B2,C),!. 分数を含む加算(A,B,C) :- C is A + B. 分数を含む掛算(A1 / A2,B1 / B2,C) :- S1 is A1 * B1, S2 is A2 * B2, 約分(S1 / S2,C),!. 分数を含む掛算(A1 / A2,B,C) :- S1 is A1 * B, 約分(S1 / A2,C),!. 分数を含む掛算(A,B1 / B2,C) :- S1 is B1 * A, 約分(S1 / B2,C),!. 分数を含む掛算(A,B,C) :- C is A * B. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % get_numberのなかでの分数 get_number(_数値) :- get_line(Line), get_number_診断(Line,_数値),!. get_number(_数値) :- get_number(_数値). get_number_診断(Line,_数値,_) :- atom_to_term(Line,_数値,_), 数値か(_数値),!. get_number_診断(Line,_数値,_) :- writef('入力された %t からは数値が得られません。再入力をお願いします。\n',[Line]), fail. 数値か(_分子/_分母) :- integer(_分子), integer(_分母),!. 数値か(_数値) :- number(_数値). % '1/3 + 3/5 + 7/9 + 9/11 + 11/13+..........+95/97 + 97/99 を合計する' :- 分子ならび(_分子ならび), 分母ならび(_分母ならび), 分子(_分子ならび,_分母ならび,_分子), 分母(_分母ならび,_分母), _合計 is _分子 / _分母, writef('合計は %t です\n',[_合計]). 分子([N],_分母ならび,_分子) :- '重複のないならびからNを取り除く'(N,_分母ならび,L), 全てを掛ける([N|L],_分子),!. 分子([N|R1],_分母ならび,_分子) :- '重複のないならびからNを取り除く'(N,_分母ならび,L), 全てを掛ける(L,_分子_1), 分子式(R1,_分母ならび,_分子_2), _分子 is _分子_1 + _分子_2. 分子ならび(_分子ならび) :- findall(N,( for(1,N,97), 1 is N mod 2), _分子ならび). 分母([X],X) :- !. 分母([A|R],_分母) :- 分母(R,_分母_1) _分母 is A * _分母_1. 分母ならび(_分母ならび) :- findall(N,( for(3,N,99), 1 is N mod 2), _分母ならび). '重複のないならびからNを取り除く'(N,L,R) :- append(L0,[N|R1],L), append(L0,R1,R),!. % 分数の加算 分数の加算(_分子1/_分母1,_分子2/_分母2,_分子/_分母) :- A is _分母1 * _分母2, B is _分子1 * _分母2 + _分子2 * _分母1, 約分(B/A,_分子/_分母). 約分(B/A,_分子/_分母) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C. % 荷重移動平均 加重移動平均(_データならび,_サンプル数,_加重移動平均) :- reverse(_データならび,_反転したデータならび), length(L0,_サンプル数), append(L0,L1,_反転したデータならび), _分母 is _サンプル数 * (_サンプル数 + 1) / 2, 加重移動平均分子の計算(_サンプル数,L0,_分子), _加重移動平均 is _分子 / _分母,!. 加重移動平均分子の計算(_,[],0) :- !. 加重移動平均分子の計算(N,[A|R],S) :- N1 is N - 1, V is A * N, 加重移動平均分子の計算(N1,R,S1), S is S1 + V. % '2,3,4,5,6の数が書かれたカードが1枚ずつ、合計5枚ある。これらのカードを無作為に横一列に並べたとき、どのi=1,2,3,4,5に対しても左からi番目のカードに書かれた数がi以上となる確率を求める'(_確率) :- '左からi番目のカードに書かれた数がi以上の度数'(1,2,0,0,_分子,_分母), \+(_分母 = 0), _確率 is _分子 / _分母,!. '左からi番目のカードに書かれた数がi以上の度数'(5,_カード,X,Y,X,Y) :- _カード > 6,!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード > 6, _i2 is _i + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i2,2,_分子2,_分母2,_分子,_分母),!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード >= _i, _分子2 is _分子1 + 1, _分母2 is _分母1 + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子2,_分母2,_分子,_分母),!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード >= _i, _分母2 is _分母1 + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母2,_分子,_分母),!. '2,3,4,5,6の数が書かれたカードが1枚ずつ、合計5枚ある。これらのカードを無作為に横一列に並べたとき、どのi=1,2,3,4,5に対しても左からi番目のカードに書かれた数がi以上となる確率を求める'(_確率) :- '左からi番目のカードに書かれた数がi以上の度数'(1,2,0,0,_分子,_分母), \+(_分母 = 0), _確率 is _分子 / _分母,!. '左からi番目のカードに書かれた数がi以上の度数'(5,_カード,X,Y,X,Y) :- _カード > 6,!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード > 6, _i2 is _i + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i2,2,_分子2,_分母2,_分子,_分母),!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード >= _i, _分子2 is _分子1 + 1, _分母2 is _分母1 + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子2,_分母2,_分子,_分母),!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード >= _i, _分母2 is _分母1 + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母2,_分子,_分母),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/64 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク):身長(cm)と体重(kg)が、(170,85), (165,65), (180,78), #             (195,80), (188,72)の学生がいる。このデータを配列変数に保存し,身長 #             を入力すると体重を検索するプログラムを作成せよ。 #              該当する身長の学生がいない場合は「みつかりません。」を表示し #             繰り返しを終了せよ。 #             ここで,次のように配列宣言を行う。 #             int shincho[ ] = { 170, 165, 180, 195, 188, 0}; #             int taiju[ ] = { 85, 65, 78, 80, 72, 0}; # # データの最後は,データの個数である 5 を用いず、身長データが0になった # とき繰り返しを終了する方法を考えること。 # ヒント:for( i=0 ; shincho[i] != 0 ; i++)を使用する。 # # '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し,身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。' :- '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し'(_身長_体重ならび), '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび). '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し'(_身長_体重ならび) :- length(_身長_体重ならび,5), findall([_身長,_体重],( append(Ln,[_|_],_身長_体重ならび), 身長と体重の入力(Ln,_身長,_体重)), _身長体重ならび). 身長と体重の入力(Ln,_身長,_体重) :- length([_|Ln],N人目), writef('%t人目の 身長 : ',[N人目]), get_integer(_身長), write(' 体重 : '), get_integer(_体重). '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび) :- '身長を入力すると'(_身長), '体重を検索する'(_身長_体重ならび,_身長,_体重), writef('身長 %t の人の 体重は %t です。\n',[_身長,_体重]), '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび). '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび) :- writef('見つかりません\n'). '身長を入力すると'(_身長) :- write('身長を入力してください : '), get_line(Line), '診断: 身長を入力すると'(Line,_身長),!. '身長を入力すると'(_身長) :- '身長を入力すると'(_身長). '診断: 身長を入力すると'(Line,_身長) :- atom_to_term(Line,_身長,_), integer(_身長),!. '診断: 身長を入力すると'(Line,_身長) :- writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]), fail. '体重を検索する'(_身長_体重ならび,_身長,_体重) :- member([_身長,_体重],_身長_体重ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/49 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/5oepZpDW # 上記のプログラムに5人の得点(10点満点)を受け取ると、5人の得点の偏差値を戻すhensachi関数を追加せよ。 # そして5人のテストの得点を整数型配列data[5]の各要素それぞれ入力すると、5人の得点の平均点に加えて偏差値も出力するプログラムをheikin関数およびhensachi関数を利用して作成しなさい。 # '5人の得点(10点満点)を受け取ると、5人の得点の偏差値を戻す'(_5人の得点の偏差値) :- '5人の得点(10点満点)を受け取ると'(_5人の得点ならび), '5人の得点の偏差値を戻す'(_5人の得点ならび,_5人の得点の偏差値). '5人の得点(10点満点)を受け取ると'(_5人の得点ならび) :- length(_5人の得点ならび,5), findall(_得点,( append(Ln,[_|_],_5人の得点ならび), '得点(10点満点)を受け取る'(Ln,_得点)), _5人の得点ならび). '得点(10点満点)を受け取る'(Ln,_得点) :- length([_|Ln],_何人目), writef('%t人目の得点(10点満点)を入力してください : ',[_何人目]), get_line(Line), '診断: 得点(10点満点)を受け取る'(Line,_得点),!. '得点(10点満点)を受け取る'(Ln,_得点) :- '得点(10点満点)を受け取る'(Ln,_得点). '診断: 得点(10点満点)を受け取る'(Line,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 >= 0, _得点 =< 10,!. 偏差値(_標本値,_算術平均,_標準偏差,_偏差値) :- _偏差値 is 10 * (_標本値 - _算術平均) / _標準偏差 + 50. 偏差値(_標本ならび,_偏差値ならび) :- 平均値(_標本ならび,_平均値), 標準偏差(_標本ならび,_標準偏差), findall(_偏差値,( member(_値,_標本ならび), 偏差値(_値,_平均値,_標準偏差,_偏差値)), _偏差値ならび). 標準偏差(_標本ならび,V) :- length(_標本ならび,N), 平均値(_標本ならび,M), 標準偏差(_標本ならび,N,M,0.0,V). 標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!. 標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 標準偏差(R,N,M,S2,V). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/59 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # main関数を以下のように宣言し、実行時に引数を取れるようにする。 # 引数がすべて得点であるとして、その平均値を # 求めるプログラムを作成しなさい。 # すなわち、 # ./prog 50 70 90 と実行した場合は、70と表示される。 # 必要に応じて、数字を数値に変換する関数atoi()や # atof()を使用してもよい。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc, char *argv[] ) { # /** argc: 引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:実数 **/ # x = atof( argv[1] ); /* atofの使用例 */ # return(0); # } # # ※ 配列のサイズなど、定数は必ず#defineを利用すること. # ※ 表示や入力を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わないこと. # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月15日 # よろしくお願いします! # # program :- user_parameters(_ユーザパラメータならび), プログラム引数を整数ならびに変換(_ユーザパラメータならび,_整数ならび), avg(整数ならび,_相加平均), writef('%t\n',[_相加平均]). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). プログラム引数を整数ならびに変換([],[]). プログラム引数を整数ならびに変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), integer(N), プログラム引数を整数ならびに変換(R1,R2). プログラム引数を整数ならびに変換([_|R1],R2) :- プログラム引数を整数ならびに変換(R1,R2). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #48 # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/5oepZpDW # #include # double heikin(int a[]); # # int main(void) # { # int data[5],i; # double ave; # for (i=0;i<=4;i++) # { # printf("data[%d]= ",i); # scanf("%d",&data[i]); # } # ave=heikin(data); # printf("heikin=%f \n",ave); # return 0; # } # # double heikin(int a[]) # { # int i,k=0; # for(i=0;i<=4;i++) # { # k=k+a[i]; # } # return((double)k/5); # } # 上記のプログラムに5人の得点(10点満点)を受け取ると、合格者数を戻すgoukaku関数を追加せよ、但し6点以上で合格とする。 # そして5人のテストの得点を整数型配列data[5]の要素にそれぞれ入力すると # 5人の平均点に加えて合格者数も出力するプログラムをheikin関数およびgoukaku関数を利用して作成しなさい。 # '5人の得点(10点満点)を受け取ると、合格者数を戻す述語を定義する。但し6点以上で合格とする。そして5人のテストの得点を入力すると5人の平均点に加えて合格者数も出力する。' :- '5人の得点(10点満点)を受け取ると'(_5人の得点ならび), 平均点を出力する(_5人の得点ならび), '6点以上を取った合格者数を出力する'(_5人の得点ならび). 平均点を出力する(_5人の得点ならび) :- 平均点を戻す(_5人の得点ならび,_平均点), writef('平均点 = %w 点\n',[_平均点]). 平均点を戻す(_5人の得点ならび,_平均点) :- sum_list(_5人の得点ならび,_合計点), _平均点 is _合計点 / 5. '6点以上を取った合格者数を出力する'(_5人の得点ならび) :- '6点以上を取った合格者数を戻す'(_5人の得点ならび,_合格者数), writef('合格者数 = %w 人\n',[_合格者数]). '5人の得点(10点満点)を受け取ると'(_5人の得点ならび) :- findall(_得点,( between(1,5,_), 得点を受け取る(_得点)),_5人の得点ならび). 得点を受け取る(_得点) :- 行入力(_行), '診断: 得点を受け取る'(_行,_得点),!. 得点を受け取る(_得点) :- 得点を受け取る(_得点). '診断: 得点を受け取る'(_行,_得点) :- 行文字列を解析して0から10の範囲の得点を得る(_行,_得点),!. '診断: 得点を受け取る'(_行,_得点) :- writef('入力された %w からは適切な得点が得られません。再入力をお願いします。\n',[_行]), fail. 行文字列を解析して0から10の範囲の得点を得る(_行,_得点) :- 行文字列を解析して(_行,_得点), '0から10の範囲の得点を得る'(_得点). 行文字列を解析して(_行,_得点) :- read_term_from_atom(_行,_得点,[]). '0から10の範囲の得点を得る'(_得点) :- integer(_得点), member(_得点,[0,1,2,3,4,5,6,7,8,9,10]). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). '6点以上を取った合格者数を戻す'(_5人の得点ならび,_合格者数) :- findall(_,( '6点以上で合格とする'(_5人の得点ならび)),L), length(L,_合格者数). '6点以上で合格とする'(_5人の得点ならび) :- member(_得点,_5人の得点ならび), _得点 >= 6. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/28 # # 以下の問題が分かりませんので、教えて頂けたら助かります。 # # [1] 授業単元:C言語 # # [2] 問題文: # http://ime.nu/codepad.org/hPrPD1Dw # 文字制限で入れれなかったため、上記のリンクで問題文を書きました。 # ファイル形式は無視してください。 # # [問1] 前回と同様に国語と数学の2科目のテストの成績を処理するプログラムを作る。 # 今回はそれぞれの科目の期末テストが合格か否かを判定したい。 # つまり前回の構造体に合格かどうかを格納する変数も必要だ。そのため、対応する # 名前のメンバーを構造体に増やす必要がある。しかし、メンバーが増えすぎると # 構造体が煩雑になって見た目にわかりにくくなることは否めない。 # そこで、今回はもっとスマートな汎用性の高いデータ構造の構築を目指そう。 # すなわち、構造体をもう1つ用意して # # struct each_score { # ??? ???; //点数 # ??? ???; //合格・不合格 # }; # # struct SEISEKI { # char name[50]; # struct each_score kokugo; # struct each_score sugaku; # }; # # としてみよう。 # 見た目にはstruct SEISEKIのメンバーの数には変わりがないことが分かるだろうか。 # しかし、そのメンバーの型がstruct each_scoreとなっていて、それぞれが # 点数のみならず、合格・不合格の情報を格納できるというわけである。 # # struct each_score の「??? ???」部分を補った上で、 # それぞれの成績がborderlineで表される成績を上回っているか否かを判定し、 # 合格・不合格を表すメンバーに1(合格の意味)もしくは0(不合格の意味)の値を # 代入して3人の学生の合否データを含めた記録を作ろう。3人の成績データを # 格納するデータ構造は、配列を利用して次のように定義できる。 # # struct SEISEKI score[3]; # # ついては、各人の成績データから合否判定をして合格・不合格情報をデータ構造に書きこむ関数 # void check_score(int borderline, struct SEISEKI *a) /* 引数aの前に'*'が付いていることに注意されたい */ # を定義して、その動作を確認する(すべての人の成績を入力し、データ構造に書きこみ、合否判定をして全結果を表示する)プログラムkadai8-1.cを作りなさい。 # 但し、ボーダーラインは60点とする。(必ず上記の型通りのcheck_scoreを定義し、引数borderlineを使用するようにプログラムを書きなさい) # # また、結果の表示を行うために、前回の課題同様に表示用の関数 # void print_score(struct SEISEKI a); # を作りなおして、使用するように。今回は合格・不合格も表示する。 # # ただし、答えの入力は前回と全く同じで、 # ex. 入力例: # yamauchi 60 70 yamada 30 90 tougou 70 80 # # 表示はつぎのフォーマットで行うようにせよ。 # 最終出力の例: # name: yamauchi # kokugo 60 : accept # sugaku 70 : accept # name: yamada # kokugo 30 : rejection # sugaku 90 : accept # name: tougou # kokugo 70 : accept # sugaku 80 : accept 合否閾値(国語,73). 合否閾値(数学,80). '国語と数学の2科目のテストの成績を入力して、それぞれの科目の期末テストが合格か否かを判定する'(_入力する人数,_試験種類) :- abolish(テスト成績/5), 国語と数学の成績入力して(_入力する人数,_氏名,_国語点数,_数学点数,_残り人数), 合格か否かを判定する(_国語点数,_数学点数,_国語の判定,_数学の判定), '氏名・点数・判定結果をテスト成績述語として定義する'(_氏名,_試験種類,国語,_国語点数,_国語の判定,_数学の点数,_数学の判定), _残り人数 = 0. 国語と数学の成績入力して(_入力する人数,_氏名,_国語点数,_数学点数,_残り人数) :- '何番目の入力・残り人数'(_何番目,_残り人数), 氏名と国語と数学の点数の入力(_何番目,_氏名,_国語点数,_数学点数). '何番目の入力・残り人数'(_何番目,_入力後の残り人数) :- length(L,_入力する人数), append(Ln,[_|R],L), length(Ln,_何番目), length(R,_入力後の残り人数). 氏名と国語と数学の点数の入力(_何番目,_氏名,_国語点数,_数学点数) :- writef('%t 番目の入力 : 氏名を入力してください : ',[_何番目]), 氏名の入力(_氏名), 国語点数の入力(_国語点数), 数学点数の入力(_数学点数). 氏名の入力(_氏名) :- get_line(_氏名). 国語点数の入力(_国語点数) :- get_line(Line), 国語点数の入力診断(Line,_国語点数),!. 国語点数の入力(_国語点数) :- 国語点数の入力(_国語点数). 国語点数の入力診断(Line,_国語点数) :- atom_to_term(Line,_国語点数,_), integer(_国語点数), _国語点数 >= 0, _国語点数 =< 100,!. 国語点数の入力診断(Line,_国語点数) :- 再入力指示(Line,国語). 数学点数の入力(_数学点数) :- get_line(Line), 数学点数の入力診断(Line,_数学点数),!. 数学点数の入力(_数学点数) :- 数学点数の入力(_数学点数). 数学点数の入力診断(Line,_数学点数) :- atom_to_term(Line,_数学点数,_), integer(_数学点数), _数学点数 >= 0, _数学点数 =< 100,!. 数学点数の入力診断(Line,_数学点数) :- 再入力指示(Line,数学). 再入力指示(Line,_科目) :- writef('入力された %t からは適切な%t点数が得られません。再入力をお願いします。\n',[Line,_科目]), fail. 合格か否かを判定する(_国語点数,_数学点数,_国語の判定,_数学の判定) :- 合格か否かを判定する(国語,_国語点数,_国語の判定), 合格か否かを判定する(数学,_数学点数,_数学の判定). 合格か否かを判定する(_科目,_点数,合格) :- 合否閾値(_科目,_下限値), _点数 >= _下限値,!. 合格か否かを判定する(_,_,不合格). '氏名・点数・判定結果をテスト成績述語として定義する'(_氏名,_試験種類,国語,_国語点数,_国語の判定,_数学の点数,_数学の判定) :- assertz(テスト成績(_氏名,_試験種類,国語,_国語点数,_国語の判定)), assertz(テスト成績(_氏名,_試験種類,数学,_数学点数,_数学の判定)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/28 # # 以下の問題が分かりませんので、教えて頂けたら助かります。 # # [1] 授業単元:C言語 # # [2] 問題文: # http://ime.nu/codepad.org/hPrPD1Dw # 文字制限で入れれなかったため、上記のリンクで問題文を書きました。 # ファイル形式は無視してください。 # # [問1] 前回と同様に国語と数学の2科目のテストの成績を処理するプログラムを作る。 # 今回はそれぞれの科目の期末テストが合格か否かを判定したい。 # つまり前回の構造体に合格かどうかを格納する変数も必要だ。そのため、対応する # 名前のメンバーを構造体に増やす必要がある。しかし、メンバーが増えすぎると # 構造体が煩雑になって見た目にわかりにくくなることは否めない。 # そこで、今回はもっとスマートな汎用性の高いデータ構造の構築を目指そう。 # すなわち、構造体をもう1つ用意して # # struct each_score { # ??? ???; //点数 # ??? ???; //合格・不合格 # }; # # struct SEISEKI { # char name[50]; # struct each_score kokugo; # struct each_score sugaku; # }; # # としてみよう。 # 見た目にはstruct SEISEKIのメンバーの数には変わりがないことが分かるだろうか。 # しかし、そのメンバーの型がstruct each_scoreとなっていて、それぞれが # 点数のみならず、合格・不合格の情報を格納できるというわけである。 # # struct each_score の「??? ???」部分を補った上で、 # それぞれの成績がborderlineで表される成績を上回っているか否かを判定し、 # 合格・不合格を表すメンバーに1(合格の意味)もしくは0(不合格の意味)の値を # 代入して3人の学生の合否データを含めた記録を作ろう。3人の成績データを # 格納するデータ構造は、配列を利用して次のように定義できる。 # # struct SEISEKI score[3]; # # ついては、各人の成績データから合否判定をして合格・不合格情報をデータ構造に書きこむ関数 # void check_score(int borderline, struct SEISEKI *a) /* 引数aの前に'*'が付いていることに注意されたい */ # を定義して、その動作を確認する(すべての人の成績を入力し、データ構造に書きこみ、合否判定をして全結果を表示する)プログラムkadai8-1.cを作りなさい。 # 但し、ボーダーラインは60点とする。(必ず上記の型通りのcheck_scoreを定義し、引数borderlineを使用するようにプログラムを書きなさい) # # また、結果の表示を行うために、前回の課題同様に表示用の関数 # void print_score(struct SEISEKI a); # を作りなおして、使用するように。今回は合格・不合格も表示する。 # # ただし、答えの入力は前回と全く同じで、 # ex. 入力例: # yamauchi 60 70 yamada 30 90 tougou 70 80 # # 表示はつぎのフォーマットで行うようにせよ。 # 最終出力の例: # name: yamauchi # kokugo 60 : accept # sugaku 70 : accept # name: yamada # kokugo 30 : rejection # sugaku 90 : accept # name: tougou # kokugo 70 : accept # sugaku 80 : accept 国語合否閾値(73). 数学合否閾値(80). '国語と数学の2科目のテストの成績を入力して、それぞれの科目の期末テストが合格か否かを判定する'(_入力する人数,_試験種類) :- abolish(テスト成績/5), 国語と数学の成績入力して(_入力する人数,_氏名,_国語点数,_数学点数,_残り人数), 合格か否かを判定する(_国語点数,_数学点数,_国語の判定,_数学の判定), '氏名・点数・判定結果をテスト成績述語として定義する'(_氏名,_試験種類,国語,_国語点数,_国語の判定,_数学の点数,_数学の判定), _残り人数 = 0. 国語と数学の成績入力して(_入力する人数,_氏名,_国語点数,_数学点数,_残り人数) :- length(L,_入力する人数), append(Ln,[_|R],L), length(Ln,_何番目), 氏名と国語と数学の点数の入力(_何番目,_氏名,_国語点数,_数学点数), length(R,_残り人数). 氏名と国語と数学の点数の入力(_何番目,_氏名,_国語点数,_数学点数) :- writef('%t 番目の入力 : 氏名を入力してください : ',[_何番目]), get_line(_氏名), 国語点数の入力(_国語点数), 数学点数の入力(_数学点数). 国語点数の入力(_国語点数) :- get_line(Line), 国語点数の入力診断(Line,_国語点数),!. 国語点数の入力(_国語点数) :- 国語点数の入力(_国語点数). 国語点数の入力診断(Line,_国語点数) :- atom_to_term(Line,_国語点数,_), integer(_国語点数), _国語点数 >= 0, _国語点数 =< 100,!. 国語点数の入力診断(Line,_国語点数) :- 再入力指示(Line,国語). 数学点数の入力(_数学点数) :- get_line(Line), 数学点数の入力診断(Line,_数学点数),!. 数学点数の入力(_数学点数) :- 数学点数の入力(_数学点数). 数学点数の入力診断(Line,_数学点数) :- atom_to_term(Line,_数学点数,_), integer(_数学点数), _数学点数 >= 0, _数学点数 =< 100,!. 数学点数の入力診断(Line,_数学点数) :- 再入力指示(Line,数学). 再入力指示(Line,_科目) :- writef('入力された %t からは適切な%t点数が得られません。再入力をお願いします。\n',[Line,_科目]), fail. 合格か否かを判定する(_国語点数,_数学点数,_国語の判定,_数学の判定) :- 国語が合格か否かを判定する(_国語点数,_国語の判定), 数学が合格か否かを判定する(_数学点数,_数学の判定). 国語が合格か否かを判定する(_国語点数,合格) :- 国語合否閾値(_下限値), _国語点数 >= _下限値,!. 国語が合格か否かを判定する(_国語点数,不合格). 数学が合格か否かを判定する(_数学点数,合格) :- 数学合否閾値(_下限値), _数学点数 >= _下限値,!. 数学が合格か否かを判定する(_数学点数,不合格). '氏名・点数・判定結果をテスト成績述語として定義する'(_氏名,_試験種類,国語,_国語点数,_国語の判定,_数学の点数,_数学の判定) :- assertz(テスト成績(_氏名,_試験種類,国語,_国語点数,_国語の判定)), assertz(テスト成績(_氏名,_試験種類,数学,_数学点数,_数学の判定)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/994 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # まずテストを受けた生徒の人数を入力し、 # それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して # 2次元の配列に格納したうえで、生徒別の合計点・平均点と科目別の合計点・平均点とを # 小数点以下まで計算して表示するプログラムを作成しなさい。 # ただしテストを受ける生徒の人数は20人以下とする。 # 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)、それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して2次元の配列に格納したうえで、生徒別の合計点・平均点と科目別の合計点・平均点とを小数点以下まで計算して表示する。' :- 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数), 'それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して2次元の配列に格納したうえで'(_生徒の人数,_生徒の二次元得点ならび), '生徒別の合計点・平均点と科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび). 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数) :- get_line(Line), '診断: 生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(Line,_生徒の人数),!. 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数) :- 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数). '診断: 生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(Line,_生徒の人数) :- atom_to_term(Line,_生徒の人数), ただしテストを受ける生徒の人数は20人以下(_生徒の人数),!. '診断: 生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(Line,_生徒の人数) :- writef('入力された %t からは20人以下の生徒数が得られません。再入力をお願いします。\n',[Line]), fail. ただしテストを受ける生徒の人数は20人以下(_生徒の人数) :- integer(_生徒の人数), _生徒の人数 > 0, _生徒の人数 =< 20. 'それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して2次元の配列に格納したうえで'(_生徒の人数,_生徒の二次元得点ならび) :- length(_生徒の二次元得点ならび,_生徒の人数), findall([_国語の点数,_数学の点数,_英語の点数],( append(Ln,[_|_],_生徒の二次元得点ならび), '国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数)), _生徒の二次元得点ならび). '国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数) :- length([_|Ln],_何番目), writef('%t番目の生徒の国語・数学・英語の点数をカンマ区切りで入力してください : ',[_何番目]), get_line(Line), '診断: 国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,Line,_国語の点数,_数学の点数,_英語の点数),!. '国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数) :- '国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数). '診断: 国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,Line,_国語の点数,_数学の点数,_英語の点数) :- split(Line,[',',' '],[_国語の点数,_数学の点数,_英語の点数]), '0〜100点の整数値'(_国語の点数), '0〜100点の整数値'(_数学の点数), '0〜100点の整数値'(_英語の点数),!. '0〜100点の整数値'(_国語の点数) :- integer(_点数), _点数 >= 0, _点数 =< 100. '生徒別の合計点・平均点と科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび) :- '生徒別の合計点・平均点を小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび), '科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび), '生徒別の合計点・平均点を小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび) :- append(Ln,[_生徒の得点ならび|R],_生徒の二次元得点ならび), length([_|Ln],_何番目), sum(_生徒の得点ならび,_生徒の合計点), _生徒の平均点 is _生徒の合計点 / 3, writef('%t番目の生徒の合計点は %t, 平均点は %t です。\n',[_生徒の合計点,_生徒の平均点]), R = []. '科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび) :- 転置(_生徒の二次元得点ならび,[_国語の得点ならび,_数学の得点ならび,_英語の得点ならび]), 国語の合計点と平均点を表示する(_生徒の人数,_国語の得点ならび), 数学の合計点と平均点を表示する(_生徒の人数,_数学の得点ならび), 英語の合計点と平均点を表示する(_生徒の人数,_英語の得点ならび). 国語の合計点と平均点を表示する(_生徒の人数,_国語の得点ならび) :- sum(_国語の得点ならび,_国語の合計点), _国語の平均点 is _国語の合計点 / _生徒の人数, writef('国語の合計点は %t, 国語の平均点は %t です\n',[_国語の合計点,_国語の平均点]). 数学の合計点と平均点を表示する(_生徒の人数,_数学の得点ならび) :- sum(_数学の得点ならび,_数学の合計点), _数学の平均点 is _数学の合計点 / _生徒の人数, writef('数学の合計点は %t, 数学の平均点は %t です\n',[_数学の合計点,_数学の平均点]). 英語の合計点と平均点を表示する(_生徒の人数,_英語の得点ならび) :- sum(_英語の得点ならび,_英語の合計点), _英語の平均点 is _英語の合計点 / _生徒の人数, writef('英語の合計点は %t, 英語の平均点は %t です\n',[_英語の合計点,_英語の平均点]). % sum/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/978 # # [1] 授業単元:2次元配列 # [2] 問題文(含コード&リンク): # 新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。 # 出発駅と到着駅をそれぞれ駅番号で入力し,料金を表示するプログラムを作成しなさい。 # なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする。 # 但し、料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了するものとする。 #       新大阪  京都 名古屋 新横浜  # 東京 14,920 14,390 11,540 3,180 # 新横浜 14,600 13,660 10,910 # 名古屋 6,840 6,100 # 京都 3,240 # # % 駅番号/2 と 新幹線のぞみ料金/3 の定義 駅番号(東京,1). 駅番号(新横浜,2). 駅番号(名古屋,3). 駅番号(京都,4). 駅番号(新大阪,5). 新幹線のぞみ料金(東京,新大阪,14920). 新幹線のぞみ料金(東京,京都,14390). 新幹線のぞみ料金(東京,名古屋,11540). 新幹線のぞみ料金(東京,新横浜,3180). 新幹線のぞみ料金(新横浜,新大阪,14600). 新幹線のぞみ料金(新横浜,京都,13600). 新幹線のぞみ料金(新横浜,名古屋,10910). 新幹線のぞみ料金(名古屋,新大阪,6840). 新幹線のぞみ料金(名古屋,京都,6100). 新幹線のぞみ料金(京都,新大阪,3340). '新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。出発駅と到着駅をそれぞれ駅番号で入力し,料金を表示する。なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする。但し、料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了するものとする。' :- repeat, 出発駅と到着駅をそれぞれ駅番号で入力し(_出発駅,_到着駅), 料金を表示する(_出発駅,_到着駅), '料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了する'. 出発駅と到着駅をそれぞれ駅番号で入力し(_出発駅,_到着駅) :- 出発駅を駅番号で入力(_出発駅番号), 到着駅を駅番号で入力(_出発駅番号,_到着駅番号), 駅番号(_出発駅,_出発駅番号), 駅番号(_到着駅,_到着駅番号),!. 出発駅を駅番号で入力(_出発駅番号) :- 駅番号候補の選択([],_駅番号候補), 駅名メニュー表示(出発,_駅番号候補,_駅名メニュー表示), writef('%t\n',[_駅名ニュー表示]), 駅番号の入力(_駅番号候補,_出発駅番号),!. 到着駅を駅番号で入力(_出発駅番号,_到着駅番号) :- 駅番号候補の選択([_出発駅番号],_駅番号候補), 駅名メニュー表示(到着,_駅番号候補,_駅名メニュー表示), writef('%t\n',[_駅名メニュー表示]), 駅番号の入力(_駅番号候補,_到着駅番号),!. 駅番号候補の選択(_回避駅番号ならび,_駅番号候補) :- findall(_駅番号,( 駅番号(_,_駅番号), \+(member(_駅番号,_回避駅番号ならび))), _駅番号候補). 駅名メニュー表示(_出発か到着,_駅番号候補,_駅名メニュー表示) :- 駅名メニュー表示(_駅番号候補,_表示駅名ならび), atomic_list_concat([_出発か到着,'駅を駅番号で入力します。 0..最初から入力し直し '|_表示駅名ならび],_駅名メニュー表示). 駅名メニュー表示(_駅番号候補,_表示駅名ならび) :- findall(_表示駅名,( 駅番号(_,_駅番号), 駅番号候補にある駅番号の時は表示駅名を選択(_駅番号,_回避駅番号,_表示駅名)), _表示駅名ならび). 駅番号候補にある駅番号の時は表示駅名を選択(_駅番号,_駅番号候補,_表示駅名) :- member(_駅番号,_駅番号候補), 駅番号(_駅名,_駅番号), atomic_concat_list([_駅番号,'..',_駅名,' '],_表示駅名). 駅番号の入力(_駅番号候補,_駅番号) :- write('駅番号を入力してください : '), get_line(Line), 駅番号の入力診断(Line,_駅番号),!. 駅番号の入力(_駅番号候補,_駅番号) :- 駅番号の入力(_駅番号候補,_駅番号). 駅番号の入力診断(Line,_駅番号候補,_駅番号) :- atom_to_term(Line,_駅番号,_), 駅番号は妥当(_駅番号,_駅番号候補),!. 駅番号の入力診断(Line,_,_) :- writef('入力された %t からは適切な駅番号が得られません。再入力をお願いします。\n',[Line]), fail. 駅番号は妥当(0,_) :- '駅番号0の時はここでは一旦成功裡に終わる。駅番号がないから最終的には、述語「出発駅と到着駅をそれぞれ駅番号で入力し」で失敗して出発駅からの入れ直しとなる',!. 駅番号は妥当(_駅番号,_駅番号候補) :- integer(_駅番号), 駅番号(_,_駅番号), 駅番号は駅番号候補にある(_駅番号,_駅番号候補). 駅番号は駅番号候補にある(_駅番号,_駅番号候補) :- member(_駅番号,_駅番号候補),!. 駅番号は駅番号候補にある(_駅番号,_) :- writef('駅番号%tは既に出発駅に使われています\n',[_駅番号]), fail. 料金を表示する(_出発駅,_到着駅) :- 料金を(_出発駅,_到着駅,_料金), 表示する(_料金). 料金を(_出発駅,_到着駅,_料金) :- 新幹線のぞみ料金(_出発駅,_到着駅,_料金),!. 料金を(_出発駅,_到着駅,_料金) :- 新幹線のぞみ料金(_到着駅,_出発駅,_料金). 表示する(_料金) :- writef('料金は %t 円です\n',[_料金]). '料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了する' :- write('選択してください。 1.. 処理の繰り返し 0.. 終了 : '), get_integer(_処理番号), _処理番号 = 0. '駅番号0の時はここでは一旦成功裡に終わる。駅番号がないから最終的には、述語「出発駅と到着駅をそれぞれ駅番号で入力し」で失敗して出発駅からの入れ直しとなる'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/978 # # [1] 授業単元:2次元配列 # [2] 問題文(含コード&リンク): # 新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。 # 出発駅と到着駅をそれぞれ駅番号で入力し,料金を表示するプログラムを作成しなさい。 # なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする。 # 但し、料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了するものとする。 #       新大阪  京都 名古屋 新横浜  # 東京 14,920 14,390 11,540 3,180 # 新横浜 14,600 13,660 10,910 # 名古屋 6,840 6,100 # 京都 3,240 # # % 駅番号/2 と 新幹線のぞみ料金/3 の定義 駅番号(東京,1). 駅番号(新横浜,2). 駅番号(名古屋,3). 駅番号(京都,4). 駅番号(新大阪,5). 新幹線のぞみ料金(東京,新大阪,14920). 新幹線のぞみ料金(東京,京都,14390). 新幹線のぞみ料金(東京,名古屋,11540). 新幹線のぞみ料金(東京,新横浜,3180). 新幹線のぞみ料金(新横浜,新大阪,14600). 新幹線のぞみ料金(新横浜,京都,13600). 新幹線のぞみ料金(新横浜,名古屋,10910). 新幹線のぞみ料金(名古屋,新大阪,6840). 新幹線のぞみ料金(名古屋,京都,6100). 新幹線のぞみ料金(京都,新大阪,3340). '新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。出発駅と到着駅をそれぞれ駅番号で入力し,料金を表示する。なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする。但し、料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了するものとする。' :- repeat, 出発駅と到着駅をそれぞれ駅番号で入力し(_出発駅,_到着駅), 料金を表示する(_出発駅,_到着駅), '料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了する'. 出発駅と到着駅をそれぞれ駅番号で入力し(_出発駅,_到着駅) :- 出発駅を駅番号で入力(_出発駅番号), 駅番号(_出発駅,_出発駅番号), 到着駅を駅番号で入力(_出発駅番号,_到着駅番号), 駅番号(_到着駅,_到着駅番号),!. 出発駅を駅番号で入力(_出発駅番号) :- 駅名メニュー表示(出発,[],_駅名メニュー表示), writef('%t\n',[_駅名ニュー表示]), 駅番号の入力([],_出発駅番号),!. 到着駅を駅番号で入力(_出発駅番号,_到着駅番号) :- 駅名メニュー表示(到着,[_出発駅番号],_駅名メニュー表示), writef('%t\n',[_駅名メニュー表示]), 駅番号の入力(_出発駅番号,_到着駅番号),!. 駅名メニュー表示(_出発か到着,_回避駅番号ならび,_駅名メニュー表示) :- 駅名メニュー表示(_回避駅番号ならび,_表示駅名ならび), atomic_list_concat([_出発か到着,'駅を駅番号で入力します。 0..最初から入力し直し '|_表示駅名ならび],_駅名メニュー表示). 駅名メニュー表示(_回避駅番号ならび,_表示駅名ならび) :- findall(_表示駅名,( 駅番号(_,_駅番号), 回避駅番号ならびにない駅番号の時は表示駅名を選択(_駅番号,_回避駅番号,_表示駅名)), _表示駅名ならび). 回避駅番号ならびにない駅番号の時は表示駅名を選択(_駅番号,_回避駅番号ならび,_表示駅名) :- \+(member(_駅番号,_回避駅番号ならび)), 駅番号(_駅名,_駅番号), atomic_concat_list([_駅番号,'..',_駅名,' '],_表示駅名). 駅番号の入力(_回避駅番号ならび,_駅番号) :- write('駅番号を入力してください : '), get_line(Line), 駅番号の入力診断(Line,_駅番号),!. 駅番号の入力(_回避駅番号ならび,_駅番号) :- 駅番号の入力(_回避駅番号ならび,_駅番号). 駅番号の入力診断(Line,_回避駅番号ならび,_駅番号) :- atom_to_term(Line,_駅番号,_), '駅番号は整数で回避駅番号ならびにない'(_駅番号,_回避駅番号ならび),!. 駅番号の入力診断(Line,_,_) :- writef('入力された %t からは適切な駅番号が得られません。再入力をお願いします。\n',[Line]), fail. '駅番号は整数で回避駅番号ならびにない'(0,_) :- '駅番号0の時はここでは一旦成功裡に終わる。駅番号がないから最終的には、述語「出発駅と到着駅をそれぞれ駅番号で入力し」で失敗して出発駅からの入れ直しとなる',!. '駅番号は整数で回避駅番号ならびにない'(_駅番号,_回避駅番号ならび) :- integer(_駅番号), 駅番号(_,_駅番号), その駅番号は回避駅番号ならびにない(_駅番号,_回避駅番号ならび). その駅番号は回避駅番号ならびにない(_駅番号,_回避駅番号ならび) :- \+(member(_駅番号,_回避駅番号ならび)),!. その駅番号は回避駅番号ならびにない(_駅番号,_回避駅番号ならび) :- writef('駅番号%tは既に使われています\n',[_駅番号]), fail. 料金を表示する(_出発駅,_到着駅) :- 料金を(_出発駅,_到着駅,_料金), 表示する(_料金). 料金を(_出発駅,_到着駅,_料金) :- 新幹線のぞみ料金(_出発駅,_到着駅,_料金),!. 料金を(_出発駅,_到着駅,_料金) :- 新幹線のぞみ料金(_到着駅,_出発駅,_料金). 表示する(_料金) :- writef('料金は %t 円です\n',[_料金]). '料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了する' :- write('選択してください。 1.. 処理の繰り返し 0.. 終了 : '), get_integer(_処理番号), _処理番号 = 0. '駅番号0の時はここでは一旦成功裡に終わる。駅番号がないから最終的には、述語「出発駅と到着駅をそれぞれ駅番号で入力し」で失敗して出発駅からの入れ直しとなる'. % 以下のサイトは % *** user: 項複写変数指定付き / 7 *** 項複写変数指定付き(M,N,P,P1,VL,VLX,VLX) :- M > N, !. 項複写変数指定付き(M,N,P,P1,VL,VL1,VLX) :- arg(M,P,T), arg(M,P1,T1), 項複写変数指定付き(T,T1,VL,VL1,VL2), M1 is M + 1, 項複写変数指定付き(M1,N,P,P1,VL,VL2,VLX), !. % *** user: 項複写変数指定付き / 5 *** 項複写変数指定付き(P,P1,VL,VL1,VLX) :- struct(P), functor(P,F,A), functor(P1,F,A), 項複写変数指定付き(1,A,P,P1,VL,VL1,VLX), !. 項複写変数指定付き(P,P1,VL,VL1,VL2) :- var(P), member(V,VL), P == V, append(VL1,[P1],VL2), !, !. 項複写変数指定付き(P,P1,VL,VL1,VL1) :- var(P), member(V,VL), \+(P == V), !. 項複写変数指定付き(P,P1,VL,VL1,VL1) :- \+(var(P)), atom_to_term(P,Q,_), \+(P == Q), swritef(P2,'%q',[P]), atom_to_term(P2,P1,_), !. 項複写変数指定付き(P,P,VL,VL1,VL1). % *** user: 項複写変数指定付き / 4 *** 項複写変数指定付き(P,P1,VL,VLX) :- 項複写変数指定付き(P,P1,VL,[],VLY), reverse(VLY,VLX). % *** user: 項複写表示 / 4 *** 項複写表示(M,N,P,P1) :- M > N, !. 項複写表示(M,N,P,P1) :- arg(M,P,T), arg(M,P1,T1), 項複写表示(T,T1), M1 is M + 1, 項複写表示(M1,N,P,P1), !. % *** user: 項複写表示 / 2 *** 項複写表示(P,P1) :- struct(P), functor(P,F,A), functor(P1,F,A), 項複写表示(1,A,P,P1), !. 項複写表示(P,P) :- var(P), !. 項複写表示(P,P) :- integer(P),!. 項複写表示(P,P) :- real(P),!. 項複写表示(P,P1) :- \+(var(P)), swritef(S1,'%t',[P]), swritef(P1,'%q',[P]), \+(S1 = P1), swritef(P1,'%q',[P]), !. 項複写表示(P,P). % *** user: 項複写印像 / 5 *** 項複写印像(M,N,P,L,P1) :- M > N, !. 項複写印像(M,N,P,L,P1) :- arg(M,P,T), arg(M,P1,T1), 項複写印像(T,L,T1), M1 is M + 1, 項複写印像(M1,N,P,L,P1). % *** user: 項複写印像 / 3 *** 項複写印像(P,L,P1) :- struct(P), functor(P,F,A), functor(P1,F,A), 項複写印像(1,A,P,L,P1), !. 項複写印像(P,L,P1) :- var(P), 印像ならび(L,L1), sprintf('%q',[P],S1), member(P1 = S1,L1), !. 項複写印像(P,_,P). % *** user: 項複写 / 4 *** 項複写(M,N,P,P1) :- M > N, !. 項複写(M,N,P,P1) :- arg(M,P,T), arg(M,P1,T1), 項複写(T,T1), M1 is M + 1, 項複写(M1,N,P,P1), !. % *** user: 項複写 / 2 *** 項複写(P,P1) :- struct(P), functor(P,F,A), functor(P1,F,A), 項複写(1,A,P,P1), !. 項複写(P,P1) :- var(P), !. 項複写(P,P1) :- \+(var(P)), parse_atom(P,1,Q,_), \+(P == Q), sprintf(%q,[P],P1), !. 項複写(P,P). % *** user: '印像ならび' / 2 *** 印像ならび([],[]) :- !. 印像ならび([A = B|R],[A = C|R1]) :- swritef(C,'%q',[B]), 印像ならび(R,R1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/959 # # [1] 授業単元: c言語演習 # [2] 問題文(含コード&リンク): 整数nを入力し、以下のようなサイズnの"Z型の図形"を"*"で表示するプログラムを作成しなさい、ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了するようにしなさい。 # # [実行例] # # 3 ←nの入力 # n=3 # *** # * # *** # 4 # n=4 # **** # * # * # **** # 0 ←データの終わり(2以下の値) #   ← n=0は表示しない # # '整数nを入力し、以下のようなサイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。' :- '整数nを入力する'(_整数n), 'サイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。'(_整数n). '整数nを入力する'(_整数n) :- write('図形を表示するためのnの値を入力してください : '), get_line(Line), 整数n入力診断(Line,_整数n),!. '整数nを入力する'(_整数n) :- '整数nを入力する'(_整数n). 整数n入力診断(Line,_整数n) :- atom_to_term(Line,_整数n,_), integer(_整数n),!. 整数n入力診断(Line,_整数n) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 'サイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。'(_整数n) :- _整数n =< 2, write('2以下が入力されました。終了します。\n'),!. 'サイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。'(_整数n) :- 図形を描く(_整数n,_図形), 図形を表示する(_図形). 図形を描く(_整数n,_図形) :- writef('n = %t\n',[_整数n]), '斜めの*を描く'(_整数n,_図形), '最初の行と最後の行は全部*、中間部分の変数を空白に変換する'(_図形),!. '斜めの*を描く'(_整数n,_図形) :- findall(L,( length(L,_整数n), append(_,[*|_],L)), _図形1), reverse(_図形1,_図形). '最初の行と最後の行は全部*、中間部分の変数を空白に変換する'(_図形) :- append([L1],_中間部分,[L2],_図形), 中間部分の変数を空白に変換する(_中間部分), all(L1,*), all(L2,*). 中間部分の変数を空白に変換する([]). 中間部分の変数を空白に変換する([L|R]) :- 変数を空白に変換する(L), 中間部分の変数を空白に変換する(R). 変数を空白に変換する([]). 変数を空白に変換する([' '|R]) :- 変数を空白に変換する(R),!. 変数を空白に変換する([_|R]) :- 変数を空白に変換する(R). 図形を表示する([]). 図形を表示する([L|R]) :- atomic_list_concat(L,S), writef('%t\n',[S]), 図形を表示する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/937 # # [1] 授業単元: コンピュータプログラミング # [2] 問題文(含コード&リンク): # 2つの多次元ベクトルX,Yの和を出力する関数を作りたい。 # X={x1, x2, ..., xN}, Y={y1, y2, ...,yN}でこの二つの配列の値の和をポインターとして # 出力する関数 int *add(int *address1, int * address2, int length)を定義し、 # その動作を確認するプログラムkadai7-1.cを作りなさい。ただしlengthは2つの配列の長さを表すものとする。 # ただし、 # int a[2], b[2]; # scanf("%d %d %d %d", &(a[0]), &(a[1]),&(b[0]),&(b[1])); # で配列の値をセットするものとして、答えは以下で出力されるものとする。 # printf("c = %d %d\n", c[0], c[1]); # '2つの多次元ベクトルX,Yの和を出力する関数'([],[],[]). '2つの多次元ベクトルX,Yの和を出力する関数'([[_X_1]|R1],[[_Y_1]|R2],[[_Z_1]|R3]) :- _Z_1 is _X_1 + _Y_1, '2つの多次元ベクトルX,Yの和を出力する関数'(R1,R2,R3). ベクトルを読み取る(_n次元,_ベクトル) :- length(_ベクトル,_n次元), findall([_数値],( append(_,[_|_],_ベクトル), get_number(_数値)), _ベクトル). get_number(_数値) :- get_line(Line), get_number_診断(Line,_数値),!. get_number(_数値) :- get_number(_数値). get_number_診断(Line,_数値,_) :- atom_to_term(Line,_数値,_), 数値か(_数値),!. get_number_診断(Line,_数値,_) :- writef('入力された %t からは数値が得られません。再入力をお願いします。\n',[Line]), fail. 数値か(_分子/_分母) :- integer(_分子), integer(_分母),!. 数値か(_数値) :- number(_数値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/927 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # n次元ベクトル(x_1, x_2,..., x_n)^Tのp-ノルムを求めるプログラムを # 配列を利用して作成しなさい. # pを入力し、1,2,...,p-ノルムの値をすべてprintfで出力すること. # p、n次元、ベクトルの成分は全てscanfで任意に読み込むようにすること。 # 絶対値と巾乗を計算する関数 fabs(), pow()を使用してよい。 # ただし、未学習のポインタやライブラリ関数以外の関数は使用してはならない。 # 'n次元ベクトル(x_1, x_2,..., x_n)^Tのp-ノルムを求める。p、n次元、ベクトルの成分は全て任意に読み込む。1,2,...,p-ノルムの値をすべて出力する' :- 'p、n次元、ベクトルの成分は全てscanfで任意に読み込む'(_T,_n次元,_n次元ベクトル), 'n次元ベクトル(x_1, x_2,..., x_n)^Tのp-ノルムを求める'(_n次元ベクトル,_T,_p_ノルム), '1,2,...,p-ノルムの値をすべて出力する'(_n次元ベクトル,_n次元,_T,_p_ノルム). 'p、n次元、ベクトルの成分は全て任意に読み込む'(_T,_n次元,_n次元ベクトル) :- 'pを読み込む'(_T), 'n次元を読み込む'(_n次元), 'n次元ベクトルを読み込む'(_n次元,_n次元ベクトル). 'pを読み込む'(_T) :- write('pを入力してください : '), get_line(Line), 'pの読み込み診断'(Line,_T),!. 'pを読み込む'(_T) :- 'pを読み込む'(_T). 'pの読み込み診断'(Line,_T) :- atom_to_term(Line,_T,_), integer(_T),!. 'pの読み込み診断'(Line,_T) :- writef('入力された %t はpの値としては適切ではありません。再入力をお願いします。\n',[Line]), fail. 'n次元を読み込む'(_n次元) :- write('n次元を入力してください : '), get_line(Line), 'n次元の読み込み診断'(Line,_n次元),!. 'n次元を読み込む'(_n次元) :- 'n次元を読み込む'(_n次元). 'n次元の読み込み診断'(Line,_n次元) :- atom_to_term(Line,_n次元,_), integer(_n次元), _n次元 > 0,!. 'n次元の読み込み診断'(Line,_n次元) :- writef('入力された %t から適切な次元数が得られません。再入力をお願いします。\n',[Line]), fail. 'n次元ベクトルを読み込む'(_n次元,_n次元ベクトル) :- length(_n次元ベクトル,_n次元), findall([X],( append(L0,[_|_],_n次元ベクトル), length([_|L0],_n個目), ベクトル値の入力(_n個目,X)), _n次元ベクトル). 'n次元ベクトル(x_1, x_2,..., x_n)^Tのp-ノルムを求める'(_n次元ベクトル,_T,_p_ノルム) :- 'n次元ベクトル(x_1, x_2,..., x_n)^Tのp-ノルムを求める'(_n次元ベクトル,_T,0,_p_ノルム). 'n次元ベクトル(x_1, x_2,..., x_n)^Tのp-ノルムを求める'([],_T,S,_p_ノルム) :- _p_ノルム is S ^ (1 / _T). 'n次元ベクトル(x_1, x_2,..., x_n)^Tのp-ノルムを求める'([[X]|R],_T,S_1,_p_ノルム) :- S_2 is S_1 + abs(X) ^ _T, 'n次元ベクトル(x_1, x_2,..., x_n)^Tのp-ノルムを求める'(R,_T,S_2,_p_ノルム). '1,2,...,p-ノルムの値をすべて出力する'(_n次元ベクトル,_T,_p_ノルム) :- writef('%t次元ベクトル\n\n',[_n次元]), '1,2,...,の値をすべて出力する'(1,_n次元ベクトル,_n次元,_T,_p_ノルム), writef('\n%tのp_ノルムは %t です\n',[_T,_p_ノルム]). '1,2,...,の値をすべて出力する'(_n次元ベクトル) :- append(L0,[[_値]|R],_n次元ベクトル), length([_|L0],N), writef('%t: %t\n',[N,_値]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/909 # # [1] 授業単元:繰り返し処理 # [2] 問題文(含コード&リンク): # キーボードから整数 a, bの値を読み込み, # aからbまでカウントアップするプログラムをfor文を用いて作成しなさい。 # ただし,読み込んだa, bの値がa > bの場合には、 # 「カウントアップできません。」と表示して終了すること。 # 'キーボードから整数 a, bの値を読み込み,aからbまでカウントアップするプログラムをfor文を用いて作成しなさい。ただし,読み込んだa, bの値がa > bの場合には、「カウントアップできません。」と表示して終了すること。'(_n) :- 'キーボードから整数 a, bの値を読み込み'(_a,_b), 'aからbまでfor文を用いてカウントアップする。ただし,読み込んだa, bの値がa > bの場合には、「カウントアップできません。」と表示して終了する'(_a,_b,_n). 'キーボードから整数 a, bの値を読み込み'(_a,_b) :- 'キーボードから整数_aの値を読み込み'(_a), 'キーボードから整数_bの値を読み込み'(_b). 'キーボードから整数_aの値を読み込み'(_a) :- write('_aの値を入力してください : '), 'キーボードから整数値を読み込み'(_a). 'キーボードから整数_bの値を読み込み'(_b) :- write('_bの値を入力してください : '), 'キーボードから整数値を読み込み'(_b). 'キーボードから整数値を読み込み'(_整数値) :- get_line(Line), 整数値の読み込み診断(Line,_整数値),!. 'キーボードから整数値を読み込み'(_整数値) :- 'キーボードから整数値を読み込み'(_整数値). 整数値の読み込み診断(Line,_整数値) :- atom_to_term(Line,_整数値,_), integer(_整数値),!. 整数値の読み込み診断(Line,_整数値) :- writef('入力された %t からは整数値が得られません。再入力をお願いします。\n',[Line]), fail. 'aからbまでfor文を用いてカウントアップする。ただし,読み込んだa, bの値がa > bの場合には、「カウントアップできません。」と表示して終了する'(_a,_b,_n) :- \+('読み込んだa, bの値がa > bの場合には'(_a,_b)), for(_a,_n,_b). 'aからbまでfor文を用いてカウントアップする。ただし,読み込んだa, bの値がa > bの場合には、「カウントアップできません。」と表示して終了する'(_a,_b,_n) :- '読み込んだa, bの値がa > bの場合には'(_a,_b), '「カウントアップできません。」と表示して終了する'. for(S,S,E) :- S =< E. for(S,N,E) :- S < E, S_2 is S + 1, for(S_2,N,E). '読み込んだa, bの値がa > bの場合には'(_a,_b) :- _a > _b. '「カウントアップできません。」と表示して終了する' :- '「カウントアップできません。」と表示して', 終了する. '「カウントアップできません。」と表示して' :- write('カウントアップできません。\n'). 終了する. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/802 # # [1] 授業単元:if else # [2] 問題文(含コード&リンク): # 三角形の3辺の長さ a,b,c をfloat型で入力し, # 直角三角形,鈍角三角形,鋭角三角形のどれであるかを判定するプログラムを作成しなさい。 # なお、if文をよういること # '三角形の3辺の長さをfloat型で入力し,直角三角形,鈍角三角形,鋭角三角形のどれであるかを判定する'(_判定) :- '三角形の3辺の長さfloat型で入力し'(_辺_1,_辺_2,_辺_3), '直角三角形,鈍角三角形,鋭角三角形のどれであるかを判定する'(_辺_1,_辺_2,_辺_3,_判定). '三角形の3辺の長さをfloat型で入力し'(_辺_1,_辺_2,_辺_3) :- write('三角形の3 辺の長さを浮動小数点数で入力してください。 '), findall(_辺,( append(Ln,[_|_],[_,_,_]), length([_|Ln],_n), 辺の長さの入力(_n,_辺)), [_辺_1,_辺_2,_辺_3]). 辺の長さの入力(_n,_辺) :- writef('辺[%t] : ',[_n]), get_line(Line), 辺の長さの入力診断(Line,_辺),!. 辺の長さの入力(_n,_辺) :- 辺の長さの入力(_n,_辺). 辺の長さの入力診断(Line,_辺) :- atom_to_term(Line,_辺,_), float(_辺), _辺 > 0.0,!. 辺の長さの入力診断(Line,_辺) :- writef('入力された %t からは三角形の辺にあたる情報が得られません。再入力をお願いします。\n',[Line]), fail. '直角三角形,鈍角三角形,鋭角三角形のどれであるかを判定する'(_辺_1,_辺_2,_辺_3,_判定) :- '二つの短辺と長辺に分ける'([_辺_1,_辺_2,_辺_3],[_短辺_1,_短辺_2],_長辺), '直角三角形、鈍角三角形、鋭角三角形の判定'(_短辺_1,_短辺_2,_長辺,_判定). '二つの短辺と長辺に分ける'([_長辺|R],R,_長辺) :- \+((member(_辺,R),_辺 > _長辺)),!. '二つの短辺と長辺に分ける'([_辺|R1],[_辺|R2],_長辺) :- '二つの短辺と長辺に分ける'(R1,R2,_長辺). '直角三角形、鈍角三角形、鋭角三角形の判定'(_短辺_1,_短辺_2,_長辺,直角三角形) :- (_長辺 * _長辺) =:= (_短辺_1 * _短辺_1) + (_短辺_2 * _短辺_2),!. '直角三角形、鈍角三角形、鋭角三角形の判定'(_短辺_1,_短辺_2,_長辺,鋭角三角形) :- (_長辺 * _長辺) < (_短辺_1 * _短辺_1) + (_短辺_2 * _短辺_2),!. '直角三角形、鈍角三角形、鋭角三角形の判定'(_短辺_1,_短辺_2,_長辺,鈍角三角形) :- (_長辺 * _長辺) > (_短辺_1 * _短辺_1) + (_短辺_2 * _短辺_2),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/793 # # {1] 授業単元:プログラミング言語演習 # [2] 問題文: # 1リットルのペットボトルに1杯ずつ水を入れるたびにその入れた量を加算し、ペットボトルの許容量を超えたことを表示しなさい。 # ペットボトルの許容量は1000mlとする。 # # 実行例↓  (適当な数字を入れていきます) # # 水の量を入力してください # 580 # 1杯目の量=580ml,合計580ml # 水の量を入力してください # 310 # 2杯目の量=310ml,合計890ml # 水の量を入力してください # 220 # 3杯目の量=220ml,合計1110ml # 許容量オーバー 3杯目で一杯になりましあ。 # # '1リットルのペットボトルに1杯ずつ水を入れるたびにその入れた量を加算し、ペットボトルの許容量を超えたことを表示する。ペットボトルの許容量は1000mlとする。' :- write('水の量を入力してください : '), get_integer(_水の量), '1リットルのペットボトルに1杯ずつ水を入れるたびにその入れた量を加算し、ペットボトルの許容量を超えたことを表示する'(1,_水の量,_水の量). '1リットルのペットボトルに1杯ずつ水を入れるたびにその入れた量を加算し'(N,_水の量,_ペットボトルの中身の水の量) :- ペットボトルの許容量1000mlを超えた(_ペットボトルの中身の水の量), writef('%t杯目の水の量は %t ml,ペットボトルの中身の水の量は %t ml\n',[N,_水の量,_ペットボトルの中身の水の量]), write('許容量オーバー %t杯目で一杯になりました。\n',[N]),!. '1リットルのペットボトルに1杯ずつ水を入れるたびにその入れた量を加算し'(N,_一杯の水の量_1,_ペットボトルの中身の水の量_1) :- writef('%t杯目の水の量は %t ml,ペットボトルの中身の水の量は %t ml\n',[N,_水の量_1,_ペットボトルの中身の水の量_1]), '1杯ずつ水を入れるたびに'(_一杯の水の量_2), その入れた量を加算し(_一杯の水の量_2,_ペットボトルの中身の水の量_1,_ペットボトルの中身の水の量_2), _ペットボトルの中身の水の量_2 is _ペットボトルの中身の水の量_1 + _一杯の水の量, '1リットルのペットボトルに1杯ずつ水を入れるたびにその入れた量を加算し'(N_2,_水の量_2,_ペットボトルの中身の水の量_2). ペットボトルの許容量1000mlを超えた(_ペットボトルの中身の水の量) :- _ペットボトルの中身の水の量 > 1000. '1杯ずつ水を入れるたびに'(_一杯の水の量) :- get_line(Line), '診断: 1杯ずつ水を入れるたびに'(Line,_一杯の水の量),!. '1杯ずつ水を入れるたびに'(_一杯の水の量) :- '1杯ずつ水を入れるたびに'(_一杯の水の量). '診断: 1杯ずつ水を入れるたびに'(Line,_一杯の水の量) :- atom_to_term(Line,_一杯の水の量,_), integer(_一杯の水の量), _一杯の水の量 > 0,!. '診断: 1杯ずつ水を入れるたびに'(Line,_一杯の水の量) :- writef('入力された %t からは適切な水の量が得られません。再入力をお願いします。\n',[Line]), fail. その入れた量を加算し(_一杯の水の量,_ペットボトルの中身の水の量_1,_ペットボトルの中身の水の量_2) :- _ペットボトルの中身の水の量_2 is _ペットボトルの中身の水の量_1 + _一杯の水の量. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/755 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):http://ime.nu/uproda.2ch-library.com/533330Hsq/lib533330.png # '実数を入力してsin(x)の近似値を無限級数展開を利用して求める'(_sin_x_の近似値) :- '実数を入力して'(_実数), 'sin(x)の近似値を無限級数展開を利用して求める'(1,_実数,0.0,_sin_x_の近似値). '実数を入力して'(_実数) :- write('実数を入力しなさい : '), get_line(Line), 実数入力診断(Line,_実数),!. '実数を入力して'(_実数) :- '実数を入力して'(_実数). 実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 実数入力診断(Line,_実数) :- writef('入力された %t からは実数が得られません。再入力をお願いします。\n',[Line]), fail. 'sin(x)の近似値を無限級数展開を利用して求める'(_,_v,_sin_x_の近似値,_sin_x_の近似値) :- _v < 1e-10,!. 'sin(x)の近似値を無限級数展開を利用して求める'(_k,_v_1,_x_1,_x) :- _i is (2 * _k - 1), 階乗(_i,_j), 符号の決定(_k,_1またはマイナス1), _v_2 is (_1またはマイナス1 * _v_1 ^ (2 * _k - 1)) / _j, _x_2 is _x_1 + _v_2, _k_2 is _k + 1, 'sin(x)の近似値を無限級数展開を利用して求める'(_k_2,_v_2,_x_2,_x). 符号の決定(_k,-1) :- 1 is (_k + 1) mod 2,!. 符号の決定(_k,1) :- 0 is (_k + 1) mod 2,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1336071926/952 # # 年齢と性別を入力しどのグループに属すか表示するプログラムで聞きたいんですけど # グループは4つあり、性別は、男性は0、女性は1で表す。 # ※if文のネストを使用する # Aは20歳未満男性 # Bは20歳未満女性 # Cは20歳以上男性 # Dは20歳以上女性のやりかたがわからないです。 # # '年齢と性別(男性は0、女性は1)を入力し、Aは20歳未満男性 Bは20歳未満女性 Cは20歳以上男性 Dは20歳以上女性の 4つのどのグループに属すか表示する。' :- '年齢と性別(男性は0、女性は1)を入力し'(_年齢,_性別), 'Aは20歳未満男性 Bは20歳未満女性 Cは20歳以上男性 Dは20歳以上女性の 4つのどのグループに属すか表示する'(_年齢,_性別). '年齢と性別(男性は0、女性は1)を入力し'(_年齢,_性別) :- 年齢を入力し(_年齢), '性別(男性は0、女性は1)を入力し'(_性別). 年齢を入力し(_年齢) :- write('年齢を入力してください : '), get_line(Line), 年齢入力診断(Line,_年齢),!. 年齢を入力し(_年齢) :- 年齢を入力し(_年齢). 年齢入力診断(Line,_年齢) :- atom_to_term(Line,_年齢,_), integer(_年齢), _年齢 >= 0.!. 年齢入力診断(Line,_年齢) :- writef('入力された %t からは適切な年齢が得られません。再入力をお願いします。\n',[Line]), fail. '性別(男性は0、女性は1)を入力し'(_性別) :- write('性別(男性は0、女性は1)を入力してください : '), get_line(Line), '性別(男性は0、女性は1)入力診断'(Line,_性別),!. '性別(男性は0、女性は1)を入力し'(_性別) :- '性別(男性は0、女性は1)を入力し'(_性別). '性別(男性は0、女性は1)入力診断'(Line,_性別) :- atom_to_term(Line,_性別,_), 入力は0か1(_性別),!. '性別(男性は0、女性は1)入力診断'(Line,_性別) :- writef('入力された %t からは適切な性別が得られません。再入力をお願いします。\n',[Line]), fail. 入力は0か1(0). 入力は0か1(1). 'Aは20歳未満男性 Bは20歳未満女性 Cは20歳以上男性 Dは20歳以上女性の 4つのどのグループに属すか表示する'(_年齢,_性別) :- 'Aは20歳未満男性 Bは20歳未満女性 Cは20歳以上男性 Dは20歳以上女性の 4つのどのグループに属すか'(_年齢,_性別,_グループ), 表示する(_年齢,_性別,_グループ). 'Aは20歳未満男性 Bは20歳未満女性 Cは20歳以上男性 Dは20歳以上女性の 4つのどのグループに属すか'(_年齢,0,'A') :- _年齢 < 20. 'Aは20歳未満男性 Bは20歳未満女性 Cは20歳以上男性 Dは20歳以上女性の 4つのどのグループに属すか'(_年齢,1,'B') :- _年齢 < 20. 'Aは20歳未満男性 Bは20歳未満女性 Cは20歳以上男性 Dは20歳以上女性の 4つのどのグループに属すか'(_年齢,0,'C') :- _年齢 >= 20. 'Aは20歳未満男性 Bは20歳未満女性 Cは20歳以上男性 Dは20歳以上女性の 4つのどのグループに属すか'(_年齢,1,'D') :- _年齢 >= 20. 表示する(_年齢,_性別,_グループ) :- 性別表示(_性別,_性別表示), writef('入力された 年齢は %t,\n入力された 性別は %t\nグループ判定は %t です\n',[_年齢,_性別表示,_グループ]). 性別表示(0,男性). 性別表示(1,女性). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/677 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/SZCwaCYd # で入力した整数のうち2つ以上同じ値があった場合、 # 「同じ値です」と表示するには、どんなif文書けばいい? # # #include # int main(){ # int a, b, c, t; # scanf("%d", &a); # scanf("%d", &b); # if(a > b){ # t = a; # a = b; # b = t; # } # scanf("%d", &c); # if(b > c){ # if(a > c){ # temp = a; # a = c; # c = t; # } # t = b; # b = c; # c = t; # } # printf("%d %d %d\n", a, b, c); # return 0; # } # '3つのデータを整列しながら入力する'(_a,_b,_c) :- 'scanf("%d", &a);scanf("%d", &b);'(_a,_b), 'if(a > b){t = a;a = b;b = t;}'(_a,_b,A1,B1), 'scanf("%d", &c);'([_a,_b],_c), 'if(b > c){if(a > c){t = a;a = c;c = t;}t = b;b = c;c = t;}'(A1,B1,_c,A,B,C), 'printf("%d %d %d\n", a, b, c);'(A,B,C). 'scanf("%d", &a);scanf("%d", &b);'(_a,_b) :- 'scanf("%d", &a);'(_a), 'scanf("%d", &b);'([_a],_b). 'scanf("%d", &a);'(_a) :- get_line(Line), '診断: scanf("%d", &a);'(Line,_a),!. 'scanf("%d", &a);'(_a) :- 'scanf("%d", &a);'(_a). '診断: scanf("%d", &a);'(Line,_a) :- atom_to_term(Line,_a,_), 整数診断(Line,_a),!. 'scanf("%d", &b);'(_a,_b) :- get_line(Line), '診断: scanf("%d", &b);'(Line,_a,_b),!. 'scanf("%d", &b);'(_a,_b) :- 'scanf("%d", &b);'(_a,_b). '診断: scanf("%d", &b);'(Line,_a,_b) :- atom_to_term(Line,_b,_), 整数診断(Line,_b), 重複診断([_a],_b),!. 'if(a > b){t = a;a = b;b = t;}'(_a,_b,_b,_a) :- _a > _b,!. 'if(a > b){t = a;a = b;b = t;}'(_a,_b,_a,_b). 'scanf("%d", &c);'(L,_c) :- get_line(Line), '診断: scanf("%d", &c);'(Line,L,_c),!. 'scanf("%d", &c);'(L,_c) :- 'scanf("%d", &c);'(L,_c). '診断: scanf("%d", &c);'(Line,L,_c) :- atom_to_term(Line,_c,_), 整数診断(Line,_c), 要素重複診断(L,_c),!. 整数診断(Line,_c) :- integer(_c),!. 整数診断(Line,_c) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 要素重複診断(L,_c) :- \+(member(_c,L)),!. 要素重複診断(L,_c) :- writef('要素が重複しています。再入力をお願いします。\n'). 'if(b > c){if(a > c){t = a;a = c;c = t;}t = b;b = c;c = t;}'(_a,_b,_c,A,C,B) :- _b > _c, 'if(a > c){t = a;a = c;c = t;}'(_a,_c,A,C1), 't = b;b = c;c = t;'(_b,C1,C,B),!. 'if(b > c){if(a > c){t = a;a = c;c = t;}t = b;b = c;c = t;}'(_a,_b,_c,_a,_b,_c). 'if(a > c){t = a;a = c;c = t;}'(_a,_c,_c,_a) :- _a > _c,!. 'if(a > c){t = a;a = c;c = t;}'(_a,_c,_a,_c). 't = b;b = c;c = t;'(_b,C1,C1,_b). 'printf("%d %d %d\n", a, b, c);'(_a,_b,_c) :- writef('%t %t %t\n',[_a,_b,_c]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/684 # # 【質問テンプレ】 # [1] 授業単元:C言語プログラミング # [2] 問題文: # キーボードから正の整数を1つ入力し、その数が素数かを判定するプログラムをbreak文・for文等を利用して作成しなさい # ヒント:素数を文章で表すなら、「1とその数以外の数では割り切れない数」である # 'キーボードから正の整数を1つ入力し、その数が素数かを判定する' :- 'キーボードから正の整数を1つ入力し'(_正の整数), その数が素数かを判定する(_正の整数). 'キーボードから正の整数を1つ入力し'(_正の整数) :- write('正の整数を1つ入力してください : '), get_line(Line), 正の整数入力診断(Line,_正の整数),!. 'キーボードから正の整数を1つ入力し'(_正の整数) :- 'キーボードから正の整数を1つ入力し'(_正の整数). 正の整数入力診断(Line,_正の整数) :- atom_to_term(Line,_正の整数,_), integer(_正の整数), _正の整数 >= 0,!. 正の整数入力診断(Line,_正の整数) :- writef('入力された %t からは正の整数が得られません。再入力をお願いします。\n',[Line]), fail. その数が素数かを判定する(_正の整数) :- _判定上限値 is _正の整数 // 2, for(2,N,_判定上限値), 0 is _正の整数 mod N, write('素数です\n'),!. その数が素数かを判定する(_正の整数) :- write('素数ではありません。\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/681 # # [1] 授業単元:計算機プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/www.fluid.cse.nagoya-u.ac.jp/~ishihara/c/Sec5kadai0.html # # # 以下のテンプレートを用いて,N×N行列AとBをキーボードから入力し, # 行列A,行列B,及び行列AとBの積C=ABを出力するプログラムを完成せよ。 'N×N行列AとBをキーボードから入力し,行列A,行列B,及び行列AとBの積C=ABを出力する' :- 'N×N行列AとBをキーボードから入力し'(_N,_A,_B), '行列A,行列B,及び行列AとBの積C=ABを出力する'(_A,_B). 'N×N行列AとBをキーボードから入力し'(_N,_A,_B) :- 'N×N行列Aを入力する'(_N,_A), 'N×N行列Bを入力する'(_N,_B). 'N×N行列Aを入力する'(_N,_A) :- 正方行列を入力する(_N,A). 'N×N行列Bを入力する'(_N,_B) :- 正方行列を入力する(_N,B). 正方行列の入力(_N,_A) :- length(_A,_N), findall(_行,( append(L0,[_行|_],_A), length([_|L0],_行目), 正方行要素の入力(_行目,_N,_行)), _A). 正方行要素の入力(_行目,_N,_行) :- length(_行,_N), findall(_要素,( append(L0,[_|_],_行), length([_|L0],_要素目), 要素入力(_行目,_要素目,_要素)), _行). 要素入力(_行目,_要素目,_要素) :- writef('第%t行%t列 : ',[_行目,_要素目]), get_line(Line), 要素入力診断(Line,_要素),!. 要素入力(_行目,_要素目,_列) :- 要素入力(_行目,_要素目,_列). 要素入力診断(Line,_要素) :- atom_to_term(Line,_要素,_), number(_要素),!. 要素入力診断(Line,_要素) :- atom_to_term(Line,A/B, number(_要素),!. '行列A,行列B,及び行列AとBの積C=ABを出力する'(_A,_B) :- '行列Aを出力する'(_A), '行列Bを出力する'(_B), '行列AとBの積C=ABを出力する'(_A,_B). '行列Aを出力する'(_A) :- 行列を出力する(_A). '行列Bを出力する'(_B) :- 行列を出力する(_B). '行列AとBの積C=ABを出力する'(_A,_B) :- '行列AとBの積C=ABを'(_A,_B,_C), '行列Cを出力する'(_C). '行列Cを出力する'(_C) :- 行列を出力する(_C). 行列を出力する(_行列) :- append(_,[_行|R],_行列), writef('%t\n',[_行]), R = []. '行列AとBの積C=ABを'(_A,_B,_C) :- 行列の掛算(_A,_B,_C). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/663 # # [2]水の量(L)を入力し、その水に含まれる水素および酸素の原子の数を表示するプログラムを作成せよ。 # アボガドロ定数は6.02×10^23、水の分子量は18,水の重さは1ml=1gとしてよく、 # 入力される数値として浮動小数点数値に対応すること表示は指数表現で行う。 # # [3.1]windows # [3.3]c/c++ # [4]今日中 # よろしくお願いします。 # '水の量(L)を入力し、その水に含まれる水素および酸素の原子の数を表示するプログラムを作成せよ。 アボガドロ定数は6.02×10^23、水の分子量は18,水の重さは1ml=1gとしてよく、 入力される数値として浮動小数点数値に対応すること表示は指数表現で行う。' :- '水の量(L)を入力し'(_水の量), 'その水に含まれる水素および酸素の原子の数を表示する'(_水の量,_水素の原子数,_酸素の原子数). '水の量(L)を入力し'(_水の量) :- write('水の量(L)を入力してください : '), 行入力と終了状態(_行,_), 水の量の入力診断(_行,_水の量),!. '水の量(L)を入力し'(_水の量) :- '水の量(L)を入力し'(_水の量). 水の量の入力診断(_行,_水の量) :- read_term_from_atom(_行,_水の量,[]), number(_水の量), _水の量 > 0.0,!. 水の量の入力診断(_行,_水の量) :- writef('入力された水の量は適切でありません。再入力をお願いします。\n'). 'その水に含まれる水素および酸素の原子の数を表示する'(_水の量,_水素の原子数,_酸素の原子数) :- アボガドロ数(_アボガドロ数), _分子の総数 is _アボガドロ数 * _水の量 * 1000 * (1 / 1), 水の分子量(_分子量,_酸素原子量,_水素原子量), 水素および酸素の原子の数を(_分子の総数,_分子量,_酸素原子量,_水素原子量,_酸素原子の数,_水素原子の数), 表示する(_水の量,_分子の総数,_酸素原子の数,_水素原子の数). アボガドロ数(602000000000000000000000). 水の分子量(_分子量,_酸素原子量,_水素原子量) :- _分子量 = 18, _酸素原子量 = 16, _水素原子量 = 2. 水素および酸素の原子の数を(_分子の総数,_分子量,_酸素原子量,_水素原子量,_酸素原子の数,_水素原子の数) :- _酸素原子の数 is _分子の総数 * _酸素原子量 // _分子量, _水素原子の数 is _分子の総数 * _水素原子量 // _分子量. 表示する(_水の量,_分子の総数,_酸素原子の数,_水素原子の数) :- writef('水の量=%t\n分子の総数=%t\n酸素原子の数=%t\n水素原子の数=%t\n',[_水の量,_分子の総数,_酸素原子の数,_水素原子の数]). 行入力と終了状態(_行,_終了状態) :- get_char(_先読み文字), 文字ならび行入力と終了状態(_先読み文字,_文字ならび,_終了状態), atom_chars(_行,_文字ならび). 文字ならび行入力と終了状態('\n',[],正常終了) :- !. 文字ならび行入力と終了状態(end_of_file,[],end_of_file) :- !. 文字ならび行入力と終了状態(_先読み文字,[_先読み文字|R],_状態) :- get_char(_文字), 文字ならび行入力と終了状態(_文字,R,_状態). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/641 # # [2] 問題 # # 1. 等加速度直線運動を考える。初速度(m/s) と等加速度(m/s2) を入力すると、100m 先の地点に到達す # るまでの時間(s)、およびその時の速度(m/s) を表示するプログラムを作成せよ。入力される数値と # して、浮動小数点数値に対応すること。 # s秒後の速度(_初速度,_等加速度,_S,_s秒後の速度) :- s秒後の速度 is _初速度 + _等加速度 * _S. s秒後の進んだ距離(_初速度,_等加速度,_S,_s秒後に進んだ距離) :- s秒後の速度(_初速度,_等加速度,_S,_s秒後の速度), _s秒後の進んだ距離 is _初速度 * _s + (_s秒後の速度 * _s) / 2. '等加速度直線運動を考える。初速度(m/s)と等加速度(m/s2)を入力すると、100m先の地点に到達するまでの時間(s)、およびその時の速度(m/s)を表示するプログラムを作成せよ。入力される数値として、浮動小数点数値に対応すること。' :- '初速度(m/s)と等加速度(m/s^2)を入力すると'(_初速度,_等加速度), '100m 先の地点に到達するまでの時間(m/s)、およびその時の速度(m/s)を'(_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度), 表示する(_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度). '100m 先の地点に到達するまでの時間(m/s)、およびその時の速度(m/s)を'(_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度) :- '100m先に到達する時間と到達した時の速度'(_初速度,_等加速度,0.000,_100m先に到達する時間,_100m先に到達した時の速度). '100m先に到達する時間と到達した時の速度'(_初速度,_等加速度,_s,_s,_100m先に到達した時の速度) :- s秒後の進んだ距離(_初速度,_等加速度,_S,_s秒後に進んだ距離), _s秒後に進んだ距離 >= 100.0, s秒後の速度(_初速度,_等加速度,_s,_100m先に到達した時の速度),!. '100m先に到達する時間と到達した時の速度'(_初速度,_等加速度,_s,_100m先に到達する時間,_100m先に到達した時の速度) :- _s_2 is _s + 0.001, '100m先に到達する時間と到達した時の速度'(_初速度,_等加速度,_s_2,_100m先に到達する時間,_100m先に到達した時の速度). '初速度(m/s)と等加速度(m/s^2)を入力すると'(_初速度,_等加速度) :- '初速度(m/s)を入力する'(_初速度), '等加速度(m/s^2)を入力する'(_等加速度). '初速度(m/s)を入力する'(_初速度) :- write('初速度(m/s)を入力してください : '), get_line(Line), 初速度入力診断(Line,_初速度),!. '初速度(m/s) を入力する'(_初速度) :- '初速度(m/s) を入力する'(_初速度). 初速度入力診断(Line,_初速度) :- atom_to_term(Line,_初速度,_), integer(_初速度),!. 初速度入力診断(Line,_初速度) :- atom_to_term(Line,_初速度,_), float(_初速度),!. 初速度入力診断(Line,_初速度) :- writef('入力された %t からは適切な整数または浮動小数点数が得られません。再入力をお願いします。\n',[Line]), fail. '等加速度(m/s^2)を入力する'(_等加速度) :- write('等加速度(m/s^2)を入力してください : '), get_line(Line), 等加速度入力診断(Line,_等加速度),!. '等加速度(m/s)を入力する'(_等加速度) :- '等加速度(m/s) を入力する'(_等加速度). 等加速度入力診断(Line,_等加速度) :- atom_to_term(Line,_等加速度,_), integer(_等加速度),!. 等加速度入力診断(Line,_等加速度) :- atom_to_term(Line,_等加速度,_), float(_等加速度),!. 等加速度入力診断(Line,_等加速度) :- writef('入力された %t からは適切な整数または浮動小数点数が得られません。再入力をお願いします。\n',[Line]), fail. 表示する(_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度) :- writef('初速度 = %t, 等加速度 = %t の時、100m先に到達する時間は %t, 100m先に到達した時の速度は %t です。\n',[_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/456 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # 100点満点の試験を10人分整数型配列data[10]に入力すると、得点の高い順に出力されるプログラムを作成。 # '100点満点の試験の点数を10人分入力し、得点の高い順に出力する' :- '100点満点の試験の点数を10人分入力し'(_10人分の点数ならび), 得点の高い順に出力する(_10人分の点数ならび). '100点満点の試験の点数を10人分入力し'(_10人分の点数ならび) :- '10人分'(_10人分の点数ならび), findall(_点数,( append(L1,[_点数|_],_10人分の点数ならび), '100点満点の試験の点数を入力'(L1,_点数)), _10人分の点数ならび). '10人分'(_10人分の点数ならび) :- length(_10人分の点数ならび,10). '100点満点の試験の点数を入力'(Ln,_点数) :- length([_|Ln],_何人目),- writef('%t人目の点数を入力してください : ',[_何人目]), get_line(Line), '100点満点の試験の点数を入力診断'(Line,_点数),!. '100点満点の試験の点数を入力'(Ln,_点数) :- '100点満点の試験の点数を入力'(Ln,_点数). '100点満点の試験の点数を入力診断'(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), '100点満点の'(_点数),!. '100点満点の試験の点数を入力診断'(Line,_点数) :- writef('入力された %t からは適切な試験の点数が得られません。\n再入力をお願いします。\n',[Line]), fail. '100点満点の'(_点数) :- _点数 >= 0, _点数 =< 100,!. 得点の高い順に出力する(_点数ならび) :- 得点の高い順に(_点に数ならび,_大きい順に整列された点数ならび), 出力する(_大きい順整列された点数ならび). 出力する([_点数]) :- writef('%t\n',[_点数]),!. 出力する([_点数|R]) :- writef('%t ',[_点数]), 出力する(R). 得点の高い順に([],[]). 得点の高い順に(L1,L2) :- L1 = [_軸要素|R1], 得点の高い順に(_軸要素,R1,L2). 得点の高い順に(_軸要素,L1,L2) :- 得点の高い順に分割(_軸要素,L1,_軸要素に等しいかより大きいならび,_軸要素より小さいならび), 得点の高い順に(_軸要素に等しいかより大きいならび,_整列された軸要素に等しいかより大きいならび), 得点の高い順に(_軸要素より小さいならび,_整列された軸要素より小さいならび), append(_整列された軸要素に等しいかより大きいならび,[_軸要素|_整列された軸要素より小さいならび). 得点の高い順に分割(_軸要素,[],[],[]). 得点の高い順に分割(_軸要素,[A|R1],[A|R2],R3) :- A @>= _軸要素, 得点の高い順に分割(_軸要素,R1,R2,R3). 得点の高い順に分割(_軸要素,[A|R1],R2,[A|R3]) :- A @< _軸要素, 得点の高い順に分割(_軸要素,R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/456 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # 100点満点の試験を10人分整数型配列data[10]に入力すると、得点の高い順に出力されるプログラムを作成。 # '100点満点の試験の点数を10人分入力し、得点の高い順に出力する' :- '100点満点の試験の点数を10人分入力し'(_10人分の点数ならび), 得点の高い順に出力する(_10人分の点数ならび). '100点満点の試験の点数を10人分入力し'(_10人分の点数ならび) :- '10人分'(_10人分の点数ならび), findall(_点数,( append(L1,[_点数|_],_10人分の点数ならび), '100点満点の試験の点数を入力'(L1,_点数)), _10人分の点数ならび). '10人分'(_10人分の点数ならび) :- length(_10人分の点数ならび,10). '100点満点の試験の点数を入力'(Ln,_点数) :- length([_|Ln],_何人目),- writef('%t人目の点数を入力してください : ',[_何人目]), get_line(Line), '100点満点の試験の点数を入力診断'(Line,_点数),!. '100点満点の試験の点数を入力'(Ln,_点数) :- '100点満点の試験の点数を入力'(Ln,_点数). '100点満点の試験の点数を入力診断'(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), '100点満点の'(_点数),!. '100点満点の試験の点数を入力診断'(Line,_点数) :- writef('入力された %t からは適切な試験の点数が得られません。\n再入力をお願いします。\n',[Line]), fail. '100点満点の'(_点数) :- _点数 >= 0, _点数 =< 100,!. 得点の高い順に出力する(_点数ならび) :- 降順整列(_点数ならび,_大きい順に整列された点数ならび), 出力する(_大きい順に整列された点数ならび). 出力する([_点数]) :- writef('%t\n',[_点数]),!. 出力する([_点数|R]) :- writef('%t ',[_点数]), 出力する(R). 降順整列([],[]). 降順整列(L1,L2) :- L1 = [_軸要素|R1], 降順整列(_軸要素,R1,L2). 降順整列(_軸要素,L1,L2) :- 降順分割(_軸要素,L1,_軸要素に等しいかより大きいならび,_軸要素より小さいならび), 降順整列(_軸要素に等しいかより大きいならび,_整列された軸要素に等しいかより大きいならび), 降順整列(_軸要素より小さいならび,_整列された軸要素より小さいならび), append(_整列された軸要素に等しいかより大きいならび,[_軸要素|_整列された軸要素より小さいならび). 降順分割(_軸要素,[],[],[]). 降順分割(_軸要素,[A|R1],[A|R2],R3) :- A @>= _軸要素, 降順分割(_軸要素,R1,R2,R3). 降順分割(_軸要素,[A|R1],R2,[A|R3]) :- A @< _軸要素, 降順分割(_軸要素,R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/456 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # 100点満点の試験を10人分整数型配列data[10]に入力すると、得点の高い順に出力されるプログラムを作成。 # '100点満点の試験の点数を10人分入力し、得点の高い順に出力する' :- '100点満点の試験の点数を10人分入力し'(_10人分の点数ならび), 得点の高い順に出力する(_10人分の点数ならび). '100点満点の試験の点数を10人分入力し'(_10人分の点数ならび) :- '10人分'(_10人分の点数ならび), findall(_点数,( append(L1,[_点数|_],_10人分の点数ならび), '100点満点の試験の点数を入力'(L1,_点数)), _10人分の点数ならび). '10人分'(_10人分の点数ならび) :- length(_10人分の点数ならび,10). '100点満点の試験の点数を入力'(Ln,_点数) :- length([_|Ln],_何人目),- writef('%t人目の点数を入力してください : ',[_何人目]), get_line(Line), '100点満点の試験の点数を入力診断'(Line,_点数),!. '100点満点の試験の点数を入力'(Ln,_点数) :- '100点満点の試験の点数を入力'(Ln,_点数). '100点満点の試験の点数を入力診断'(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), '100点満点の'(_点数),!. '100点満点の試験の点数を入力診断'(Line,_点数) :- writef('入力された %t からは適切な試験の点数が得られません。\n再入力をお願いします。\n',[Line]), fail. '100点満点の'(_点数) :- _点数 >= 0, _点数 =< 100,!. 得点の高い順に出力する([_点数]) :- writef('%t\n',[_点数]),!. 得点の高い順に出力する(_点数ならび) :- max(_点数ならび,_選択された点数), select(_選択された点数,_点数ならび,_選択された点数を取り除いた点数ならび), writef('%t ',[_選択された点数]), 得点の高い順に出力する(_選択された点数を取り除いた点数ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/423 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # 100点満点の試験の学生10人の得点データをキーボードから # 整数型配列data[10]に入力すると、最高点とその要素番号が出力されるプログラムを作成。 # 同点はないものとする。 # '100点満点の試験の学生10人の得点データをキーボードから入力すると、最高点とその要素番号が出力されるプログラムを作成。同点はないものとする。' :- '100点満点の試験の学生10人の得点データをキーボードから入力すると'([],_学生10人の得点データ), '最高点とその要素番号が出力される'(_学生10人の得点データ). '100点満点の試験の学生10人の得点データをキーボードから入力すると'(_学生10人の得点データ) :- length(_学生10人の得点データ,10), findall(_得点,( append(L0,[_得点|R],_学生10人の得点データ), '100点満点の得点の入力'(L0,_得点)), _学生10人の得点データ). '最高点とその要素番号が出力される'(_学生10人の得点データ) :- max(_学生10人の得点データ,_最高点), nth1(_要素番号,_学生10人の得点データ,_最高点), writef('最高点 = %t点, その要素番号(1起点) = %t\n',[_最高点,_要素番号]). '100点満点の得点(同点はないものとする)の入力'(L,L) :- length(L,10),!. '100点満点の得点(同点はないものとする)の入力'(_既に入力された得点ならび,L) :- length([_|_既に入力された得点ならび],_何人目), writef('%t人目の得点を入力してください : ',[_何人目]), get_line(Line), '100点満点の得点(同点はないものとする)の入力診断'(Line,_既に入力された得点ならび,_得点), append(_既に入力された得点ならび,[_得点],_入力された得点を加えたならび), '100点満点の得点(同点はないものとする)の入力'(_入力された得点を加えたならび,L),!. '100点満点の得点の入力'(_既に入力された得点ならび,L) :- '100点満点の得点の入力'(_既に入力された得点ならび,L). '100点満点の得点(同点はないものとする)の入力診断'(Line,_既に入力された得点ならび,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 =< 100,!, 同点はないものとする(_得点,_既に入力された得点ならび). '100点満点の得点(同点はないものとする)の入力診断'(Line,_得点) :- writef('入力された%tからは適切な得点が得られません。再入力をお願いします。\n',[Line]), fail. 同点はないものとする(_得点,_既に入力された得点ならび) :- \+(member(_得点,_既に入力された得点ならび)),!. 同点はないものとする(_得点,_既に入力された得点ならび) :- writef('得点%tは既に入力されています。別の得点を入力しなおしてください。\n',[_得点]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/423 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # 100点満点の試験の学生10人の得点データをキーボードから # 整数型配列data[10]に入力すると、最高点とその要素番号が出力されるプログラムを作成。 # 同点はないものとする。 # '100点満点の試験の学生10人の得点データをキーボードから入力すると、最高点とその要素番号が出力されるプログラムを作成。同点はないものとする。' :- '100点満点の試験の学生10人の得点データをキーボードから入力すると'(_学生10人の得点データ), '最高点とその要素番号が出力される'(_学生10人の得点データ). '100点満点の試験の学生10人の得点データをキーボードから入力すると'(_学生10人の得点データ) :- length(_学生10人の得点データ,10), findall(_得点,( append(L0,[_得点|R],_学生10人の得点データ), '100点満点の得点の入力'(L0,_得点)), _学生10人の得点データ). '最高点とその要素番号が出力される'(_学生10人の得点データ) :- max(_学生10人の得点データ,_最高点), nth1(_要素番号,_学生10人の得点データ,_最高点), writef('最高点 = %t点, その要素番号(1起点) = %t\n',[_最高点,_要素番号]). '100点満点の得点の入力'(L0,_得点) :- length([_|L0],_何人目), writef('%t人目の得点を入力してください : ',[_何人目]), get_line(Line), '100点満点の得点の入力診断'(Line,_得点),!. '100点満点の得点の入力'(L0,_得点) :- '100点満点の得点の入力'(L0,_得点). '100点満点の得点の入力診断'(Line,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 =< 100,!. '100点満点の得点の入力診断'(Line,_得点) :- writef('入力された%tからは適切な得点が得られません。再入力をお願いします。\n',[Line]), fail. % % この一般的な入力プログラムはこの課題には適さない。 % バックトラックしての入力はこれまでどのような入力があったかを % 検査することができない。 % この課題では同点はないものとするという条件があり、これを入力時に % 検査する為には再帰的な制御、すなわち集約が必要になる。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/398 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 配列・文字列 # 数字で入力した数を数値に変換するプログラムを作成せよ。 # すなわち,入力を文字列"1234"として受け取り,整数に変換し、値1234にする。 # 負の数-1234にも対応すること。 小数12.34に対応した場合は加点する。 # 実行結果には、000, 0123や数字以外の文字を含む場合も入れること。 # 例えば、"12a34"は12に変換してよい。 # ※無限ループ、ポインタ等は使用不可 # 数字で入力した数を数値に変換する(_文字列,_整数値) :- atom_to_term(_文字列,_整数値,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/341 # # [1] 授業単元: 計算機プログラミング # [2] 問題文(含コード&リンク): http://ime.nu/www.fluid.cse.nagoya-u.ac.jp/~ishihara/c/Sec4kadai.html # 6x(1-x)を0から1まで台形則を用いて数値積分するプログラムを作成せよ。 # # なお、台形則の分割数はnとし、nは入力できるようにすること。 # func(_x,_y) :- _y is 6 * _x * (1 - _x). '6x(1-x)を0から1まで台形則を用いて数値積分する。なお、台形則の分割数はnとし、nは入力できるようにすること。'(S) :- '台形則の分割数はnとし、nは入力できるようにする'(_n), 台形公式による積分(_n,0,1,S). '台形則の分割数はnとし、nは入力できるようにする'(_n) :- write('分割数(整数)を入力してください : '), get_line(Line), '台形則の分割数はnの入力診断'(Line,_n),!. '台形則の分割数はnとし、nは入力できるようにする'(_n) :- '台形則の分割数はnとし、nは入力できるようにする'(_n). '台形則の分割数はnの入力診断'(Line,_n) :- atom_to_term(Line,_n,_), integer(_n), _n > 0,!. '台形則の分割数はnの入力診断'(Line,_n) :- writef('入力された %t からは分割数を得られませんでした。再入力をお願いします。\n',[Line]), fail. 台形公式による積分(_分割数,X0,Xn,S) :- _分割数 > 1, 0 is _分割数 mod 2, Xn > X0, 台形則(_分割数,X0,Xn,S). 台形則(N,X0,Xn,X) :- _間隔 is (Xn-X0) / N, 台形則(1,_分割数,_間隔,X0,Xn,0.0,S), func(X0,F0), func(Xn,Fn), X is (F0 + Fn + S + S ) * _間隔 * 0.5. 台形則(N,_分割数,_,_,_,X,X) :- N > _分割数,!. 台形則(N,_分割数,_間隔,X0,Xn,Y,X) :- U is _間隔 * N + X0, func(U,F), Y2 is Y + F, N2 is N + 1, 台形則(N2,_分割数,_間隔,X0,Xn,Y2,X). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/334 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/4r1e9DdC # 上記のransuu関数を用いて、以下のような数当てゲームプログラムを作成せよ。 # このプログラムはmain関数とransuu関数からなるプログラム。 # 1) 1から100までの整数乱数を1つ発生させる。 # 2) 利用者に1から100までのある整数を入力してもらう。 # 3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。 # 4) 数を当てることができなかった場合には、もう一度数を入力してもらう。 # 5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。 # 数当てゲームプログラム :- '1) 1から100までの整数乱数を1つ発生させる。'(_1から100までの整数乱数), 数当てゲームプログラム([],_1から100までの整数乱数,_). 数当てゲームプログラム(_試行回数,_1から100までの整数乱数,_診断) :- \+(var(_診断)), '5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。'(_試行回数,_診断),!. 数当てゲームプログラム(_試行回数,_1から100までの整数乱数,_) :- '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数), '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_1から100までの整数乱数,_利用者が入力する1から100までの整数), '4) 数を当てることができなかった場合には、もう一度数を入力してもらう。'(_診断,_利用者が入力する1から100までのある整数), 数当てゲームプログラム([_|_試行回数],_1から100までの整数乱数,_診断), '1) 1から100までの整数乱数を1つ発生させる。'(_1から100までの整数乱数) :- _1から100までの整数乱数 is random(100) + 1. '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数) :- write('1から100までの整数を入力してください : '), get_line(Line), '1から100までの整数入力診断'(Line,_利用者が入力する1から100までのある整数),!. '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数) :- '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数). '1から100までの整数入力診断'(Line,_利用者が入力する1から100までのある整数) :- atom_to_term(Line,_利用者が入力する1から100までのある整数,_), integer(_利用者が入力する1から100までのある整数), _利用者が入力する1から100までのある整数 >= 1, _利用者が入力する1から100までのある整数 =< 100,!. '1から100までの整数入力診断'(Line,_利用者が入力する1から100までのある整数) :- writef('入力された %t からは1から100までの整数が得られません。\n',[Line]), fail. '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_数,_数) :- write('当り\n'). '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_発生した乱数,_入力した数) :- _発生した乱数 > _入力した数, write('もっと大きい\n'). '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_発生した乱数,_入力した数) :- _発生した乱数 < _入力した数, write('もっと小さい\n'). '4) 数を当てることができなかった場合には、もう一度数を入力してもらう。'(当り,_) :- !. '4) 数を当てることができなかった場合には、もう一度数を入力してもらう。'(_診断,_利用者が入力する1から100までのある整数) :- \+(_診断 = 当り), fail. 'もう一度数を入力してもらう。'(_利用者が入力する1から100までのある整数) :- '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数). '5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。'(_,当り) :- write('あなたの勝ち\n'),!. '5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。'([_,_,_,_,_,_],_) :- write('あなたの負け\n'),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/285 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # 円の半径rを受け取ると、rからこの半径の円の周囲の長さlと面積sを計算するcircle関数を作成。 # そしてmain関数でrを入力すると、circle関数でlとsが計算され、その結果をmain関数で出力するプログラムを作成しなさい。 # main :- 円の半径の入力(_円の半径r), 'circle関数'(_円の半径r,_周囲の長さl,_面積s), writef('円の半径 %t, 周囲の長さ %t, 面積 %t\n',[_円の半径r,_周囲の長さl,_面積s]). 円の半径の入力(_円の半径r) :- get_line(Line), 円の半径の入力診断(Line,_円の半径r),!. 円の半径の入力(_円の半径r) :- 円の半径の入力(_円の半径r). 円の半径の入力診断(Line,_円の半径r) :- atom_to_term(Line,_円の半径r,_), number(_円の半径), _円の半径 >= 0.0,!. 円の半径の入力診断(Line,_円の半径r) :- writef('入力された %t からは円の半径が得られません。再入力をお願いします。\n',[Line]), fail. 'circle関数'(_円の半径r,_周囲の長さl,_面積s) :- _周囲の長さl is 2 * _円の半径r * pi, _面積s is _円の半径r * _円の半径r * pi. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/232 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # 預金高a、年利r、年数nを受け取ると、利子(複利)を含めたn年後の預金高を返すyokin関数を作成。 # そして預金高a、年利r、年数nを入力すると1年後からn年後までの利子を含めた預金高を計算し、出力するプログラムを # main関数からyokin関数を呼び出す形で作成しなさい。 # 但し、利子は複利で加算されるとし、年利rは百分率で入力する。 # '預金高a、年利r、年数nを受け取ると、利子(複利)を含めたn年後の預金高を返す'(_a,_r,_n,_利子を含めたn年後の預金高) :- _利子を含めたn年後の預金高 is truencate(_a * (1 + _r) ^ (_n - 1)). '預金高a、年利r、年数nを入力すると1年後からn年後までの利子を含めた預金高を計算し、出力する' :- '預金高a、年利r、年数nを入力すると'(_a,_r,_n), '1年後からn年後までの利子を含めた預金高を計算し、出力する'(_a,_r,_n). '預金高a、年利r、年数nを入力すると'(_a,_r,_n) :- 預金高aを入力する(_a), 年利rを入力する(_r), 年数nを入力する(_n),!. 預金高aを入力する(_a) :- write('預金高aを入力してください : '), get_integer(_a), _a >= 0,!. 預金高aを入力する(_a) :- 預金高aを入力する(_a). 年利rを入力する(_r) :- write('年利rを100分率で入力してください : '), get_line(Line), 年利rを入力診断(Line,_r),!. 年利rを入力する(_r) :- 年利rを入力する(_r). 年利rを入力診断(Line,_r) :- atom_to_term(Line,_r,_), number(_r), _r >= 0.0,!. 年利rを入力診断(Line,_r) :- writef('入力された %t からは年利rとして適切な値が得られません。\n',[Line]), fail. 預金高aを入力する(_a) :- write('預金高aを入力してください : '), get_integer(_a),!. 預金高aを入力する(_a) :- 預金高aを入力する(_a). '1年後からn年後までの利子を含めた預金高を計算し、出力する'(_a,_r,_n) :- '1年後からn年後までの利子を含めた預金高を計算し'(_a,_r,_n,_利子を含めたn年後の預金高), 出力する(_a,_r,_n,_利子を含めたn年後の預金高). '1年後からn年後までの利子を含めた預金高を計算し'(_a,_r,_n,_1年後からn年後までの利子を含めた預金高ならび) :- findall([_n年後,_利子を含めたn年後の預金高],( for(1,_n年後,_n), '預金高a、年利r、年数nを受け取ると、利子(複利)を含めたn年後の預金高を返す'(_a,_r,_n,_利子を含めたn年後の預金高)), _1年後からn年後までの利子を含めた預金高ならび). 出力する(_a,_r,_n,_利子を含めたn年後の預金高ならび) :- writef('預金高a = %t、年利r = %t、年数n = %t\n',[_a,_r,_n]), append(_,[[_n年後,_利子を含めたn年後の預金高]|R],_利子を含めたn年後の預金高ならび), writef('%t年後の利子を含めた預金高は %t\n',[_n年後,_利子を含めたn年後の預金高]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/216 # # [1] 授業単元:プログラミング # [2] 問題文: # 国語、数学、英語の得点を受け取ると、その合計点を返すgoukei関数と3教科の合計点を受け取ると # それが200点以上の場合にはA、150点以上200点未満の場合にはB、150点未満の場合にはCを返すhyouka関数を作成せよ。 # そして国語、数学、英語の得点を入力し、その合計点と成績を出力するプログラムをmain関数からgoukei関数およびhyouka関数を呼び出す形で作成しなさい。 # # '国語、数学、英語の得点を入力し、その合計点と成績を出力する' :- '国語、数学、英語の得点を入力し'(_国語,_数学,_英語), 'その合計点と成績を出力する'(_国語,_数学,_英語). '国語、数学、英語の得点を入力し'(_国語,_数学,_英語) :- 国語の点数の入力(_国語), 数学の点数の入力(_数学), 英語の点数の入力(_英語). 国語の点数の入力(_国語) :- write('国語の点数を入力してください : '), 点数を入力する(_国語),!. 国語の点数の入力(_国語) :- 国語の点数の入力(_国語). 数学の点数の入力(_数学) :- write('数学の点数を入力してください : '), 点数を入力する(_数学). 数学の点数の入力(_数学) :- 数学の点数の入力(_数学). 英語の点数の入力(_英語) :- write('英語の点数を入力してください : '), 点数を入力する(_英語). 英語の点数の入力(_英語) :- 英語の点数の入力(_英語). 点数を入力する(_点数) :- get_line(Line), 点数を入力診断(Line,_点数),!. 点数を入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0, _点数 =< 100,!. 点数を入力診断(Line,_点数) :- writef('入力された %t からは適切な点数が得られません。再入力をお願いします。\n',[Line]), fail. 'その合計点と成績を出力する'(_国語,_数学,_英語) :- '国語、数学、英語の得点を受け取ると、その合計点を返す'(_国語,_数学,_英語,_合計点), 評価(_合計点,_評価), writef('国語 = %t点\n数学 = %t点\n英語 = %t点\n合計点 = %t点\n評価 = %t',[_国語,_数学,_英語,_合計点,_評価]). '国語、数学、英語の得点を受け取ると、その合計点を返す'(_国語,_数学,_英語,_合計点) :- _合計点 is _国語 + _数学 + _英語. 評価(_3教科の合計点,_評価) :- '3教科の合計点を受け取るとそれが200点以上の場合にはA、150点以上200点未満の場合にはB、150点未満の場合にはCを返す'(_3教科の合計点,_評価). '3教科の合計点を受け取るとそれが200点以上の場合にはA、150点以上200点未満の場合にはB、150点未満の場合にはCを返す'(_3教科の合計点,'A') :- '3教科の合計点を受け取るとそれが200点以上の場合には'(_3教科の合計点),!. '3教科の合計点を受け取るとそれが200点以上の場合にはA、150点以上200点未満の場合にはB、150点未満の場合にはCを返す'(_3教科の合計点,'B') :- '3教科の合計点を受け取るとそれが150以上200点未満の場合には'(_3教科の合計点),!. '3教科の合計点を受け取るとそれが200点以上の場合にはA、150点以上200点未満の場合にはB、150点未満の場合にはCを返す'(_3教科の合計点,'C') :- '3教科の合計点を受け取るとそれが150未満の場合には'(_3教科の合計点),!. '3教科の合計点を受け取るとそれが200点以上の場合には'(_3教科の合計点) :- _3教科の合計点 >= 200. '3教科の合計点を受け取るとそれが150以上200点未満の場合には'(_3教科の合計点) :- _3教科の合計点 >= 150, _3教科の合計点 < 200. '3教科の合計点を受け取るとそれが150未満の場合には'(_3教科の合計点) :- _3教科の合計点 < 150. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/211 # # 1] 授業単元:プログラミング演習 # [2] 問題文: # 購入金額1万円以上になると送料500円が無料になり、購入金額3万円以上になると送料無料、代金1割引になる。 # 単価5千円の品物Aと、単価3千円の品物Bの購入数をそれぞれ入力すると、値段を返すnedan関数を作成。 # そして品物Aと品物Bを入力すると代金を計算し、出力するプログラムをmain関数からnedan関数を呼び出す形で作成しなさい。 # '購入金額1万円以上になると送料500円が無料になり、購入金額3万円以上になると送料無料、代金1割引になる。'(_購入金額,_送料,_代金) :- _購入金額 < 10000, _送料 = 500, _代金 is _購入金額 + _送料. '購入金額1万円以上になると送料500円が無料になり、購入金額3万円以上になると送料無料、代金1割引になる。'(_購入金額,_送料,_代金) :- _購入金額 >= 10000, \+(_購入金額 >= 30000), _送料 = 0, _代金 is _購入金額 + _送料. '購入金額1万円以上になると送料500円が無料になり、購入金額3万円以上になると送料無料、代金1割引になる。'(_購入金額,_送料,_代金) :- _購入金額 >= 30000, _送料 = 0, 代金1割引になる(_購入金額,_代金). 代金1割引になる(_購入金額,_代金) :- '1割引'(_1割引), _代金 is truncate(_購入金額 * _1割引). '1割引'(_1割引) :- _1割引 is 1 - 0.1. '品物Aと品物Bを入力すると代金を計算し、出力するプログラムをmain関数からnedan関数を呼び出す形で作成しなさい。' :- 値段(_品物Aの単価,_品物Aの購入数,_品物Bの単価,_品物Bの購入数,_値段), '購入金額1万円以上になると送料500円が無料になり、購入金額3万円以上になると送料無料、代金1割引になる。'(_値段,_送料,_代金), 出力する([[品物A,_品物Aの単価,_品物Aの購入数],[品物B,_品物Bの単価,_品物Bの購入数]],_値段,_送料,_代金). 値段(_品物Aの単価,_品物Aの購入数,_品物Bの単価,_品物Bの購入数,_値段) :- 品物の単価と購入数の入力('品物A',_品物Aの単価,_品物Aの購入数), 品物の単価と購入数の入力('品物B',_品物Bの単価,_品物Bの購入数), _値段 is _品物Aの単価 * _品物Aの購入数 + _品物Bの単価 * _品物Bの購入数. 品物の単価と購入数の入力(_品物,_品物の単価,_品物の購入数) :- 品物の名前(_品物), 品物の単価(_品物の単価), 品物の購入数(_品物の購入数). 品物の名前(_品物) :- write('品物を入力してください : '), get_line(_品物),!. 品物の単価(_品物の単価) :- write('単価を入力してください : '), get_line(Line), 品物の単価入力診断(Line,_品物の単価),!. 品物の単価(_品物の単価) :- 品物の単価(_品物の単価). 品物の単価入力診断(Line,_品物の単価) :- atom_to_term(Line,_品物の単価,_), number(_品物の単価), _品物の単価 >= 0,!. 品物の単価入力診断(Line,_品物の単価) :- writef('入力された %t からは適切な単価が得られません。再入力をお願いします。\n',[Line]), fail. 品物の購入数(_品物の購入数) :- write('購入数を入力してください : '), get_line(Line), 品物の購入数入力診断(Line,_品物の購入数),!. 品物の購入数(_品物の購入数) :- 品物の購入数(_品物の購入数). 品物の購入数入力診断(Line,_品物の購入数) :- atom_to_term(Line,_品物の購入数,_), number(_品物の購入数), _品物の購入数 >= 0,!. 品物の購入数入力診断(Line,_品物の購入数) :- writef('入力された %t からは適切な購入数が得られません。再入力をお願いします。\n',[Line]), fail. 出力する(_商品名_単価_購入金額ならび,_購入金額,_送料,_代金) :- append(_,[[_商品名,_単価,_購入金額]|R],_商品名_単価_購入金額ならび), writef('%8c %8r %8r\n',[_商品名,_単価,_購入金額]), R = [], writef('\n購入金額合計は %t円\n 送料は %8r円\n 代金は %8r円\n',[_購入金額,_送料,_代金]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/189 # # 1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/kGj9u7Sm # #include # typedef int (*f)(int); # int charge1(int x) # { # return 3000 + 1200 * x; # } # int charge2(int x) # { # return 5000 + 600 * x; # } # int charge3(int x) # { # return 7000 + 300 * x; # } # int main(void) # { # f func[] = { charge1, charge2, charge3 }; # int hour, i; # for (hour = 1; hour <= 10; hour++) { # printf("%d時間利用の場合\n", hour); # for (i = 0; i < 3; i++) { # printf("サービス%d:%d円\n", i + 1, func[i](hour)); # } # putchar('\n'); # } # return 0; # } # # 利用時間x分を入力すると、上記にあるプログラムのサービスのうち、最も安いサービスの名称とその料金を計算し出力するプログラムを関数charge1、 charge2、 charge3を利用して作成しなさい。 # charge1(_x,_charge) :- _charge is 3000 + 1200 * _x. charge2(_x,_charge) :- _charge is 5000 + 600 * _x. charge3(_x,_charge) :- _charge is 7000 + 300 * _x. '利用時間x時間を入力すると、上記にあるプログラムのサービスのうち、最も安いサービスの名称とその料金を計算し出力するプログラムを関数charge1、 charge2、 charge3を利用して作成しなさい。'(_x,_サービス名,_最小charge) :- 利用時間x時間を入力すると(_x), '上記にあるプログラムのサービスのうち、最も安いサービスの名称とその料金を計算し'(_x,_最も安いサービスの名称,_料金), 出力する(_x,_料金,_最も安いサービスの名称). 利用時間x時間を入力すると(_x) :- write('利用時間x時間を入力してください : '), get_line(Line), 利用時間x時間の入力診断(Line,_x),!. 利用時間x時間を入力すると(_x) :- 利用時間x時間を入力すると(_x). 利用時間x時間の入力診断(Line,_x) :- atom_to_term(Line,_x,_), integer(_x), _x >= 0,!. 利用時間x時間の入力診断(Line,_x) :- writef('入力された %t からは適切な利用時間が得られませんでした。再入力をお願いします。\n',[Line]), fail. '上記にあるプログラムのサービスのうち、最も安いサービスの名称とその料金を計算し'(_x,_最も安いサービスの名称,_料金) :- charge1(_x,_charge1), charge2(_x,_charge2), charge3(_x,_charge3), findmin([_charge,_サービス名],( member([_charge,_サービス名],[[_charge1,charge1],[_charge2,charge2],[_charge3,charge3]])), [_料金,_最も安いサービスの名称]). 出力する(_x,_料金,_最も安いサービスの名称) :- writef('%t時間 %t円 %t\n',[_x,_料金,_最も安いサービスの名称]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/188 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # #include <stdio.h> # # int main(void) # { # int a, b, c; /* 整数変数a,b,cの宣言 */ # # printf("身長を入力してください"); # scanf("%d", &a); # printf("体重を入力してください"); # scanf("%d", &b); # # printf( "%d-%dは %d\n", a,b,c); /* 表示 */ # return 0; # } # こちらのコードを少し変えて # 身長と体重の変数(どちらも倍精度実数変数)を宣言。身長と体重を入力し、画面に表示する。身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。 # 【実行結果例】 # 身長を入力してください(cm)?170.5 # 体重を入力してください(cm)?65.5 # 身長は170.5で、体重は65.5です。 # '身長と体重を入力し、画面に表示する。身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。' :- '身長と体重を入力し'(_身長,_体重), '画面に表示する。身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。'(_身長,_体重). '画面に表示する。身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。'(_身長,_体重) :- '適宜コメントを'(_身長,_体重,_コメント), '身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。'(_身長,_体重,_コメント). '適宜コメントを'(_身長,_体重,_コメント) :- 'BMI値の計算判定'(_身長,_体重,_BMI値,_BMI値判定), atomic_list_concat(['BMI値は',_BMI値,' 判定は ',_BMI値判定,' です'],_コメント). '身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。'(_身長,_体重,_コメント) :- format('身長 ~1f 体重~1f',[_身長,_体重]), writef(' コメントは %t\n',[_コメント]). '身長と体重を入力し'(_身長,_体重) :- 身長の入力(_身長), 体重の入力(_体重). 身長の入力(_身長) :- get_line(Line), 身長の入力診断(Line,_身長),!. 身長の入力(_身長) :- 身長の入力(_身長). 身長の入力診断(Line,_身長) :- atom_to_term(Line,_身長,_), number(_身長), _身長 >= 0.0, _身長 =< 250.0,!. 身長の入力診断(Line,_身長) :- writef('入力された %t からは適切な身長が得られません。再入力をお願いします。\n',[Line]), fail. 体重の入力(_体重) :- write('体重を入力してください : '), get_line(Line), 体重の入力診断(Line,_体重),!. 体重の入力(_体重) :- 体重の入力(_体重). 体重の入力診断(Line,_体重) :- atom_to_term(Line,_体重,_), number(_体重), _体重 >= 0.0, _体重 =< 250.0,!. 体重の入力診断(Line,_体重) :- writef('入力された %t からは適切な体重が得られません。再入力をお願いします。\n',[Line]), fail. 'BMI値の計算判定'(_身長,_体重,_BMI値,_BMI値判定) :- 'BMI値の計算'(_身長,_体重,_BMI値), 'BMI値の判定'(_BMI値,_BMI値の判定). 'BMI値の計算'(_身長,_体重,_BMI値) :- _身長 > 3, _BMI値 is _体重 / (_身長 ^ 2). 'BMI値の判定'(_BMI値,やせています) :- _BMI値 < 20.0,!. 'BMI値の判定'(_BMI値,普通です) :- _BMI値 >= 20.0, _BMI値 < 20.0,!. 'BMI値の判定'(_BMI値,やや肥満です) :- _BMI値 >= 24.0, _BMI値 < 26.5,!. 'BMI値の判定'(_BMI値,肥満です) :- _BMI値 >= 26.5,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/151 # # [1] 授業単元:プログラミング # [2] 問題文: # y=1+(1/x)+(1/x)^2+(1/x)^3+...+(1/x)^N # # ただしNとxはキーボードから次で入力するものとする。 # scanf("%f %d", &x, &N); # 答えは以下で出力されるものとする。 # printf("answer = %f\n", answer); # # 'y=1+(1/x)+(1/x)^2+(1/x)^3+...+(1/x)^N ただしNとxはキーボードから入力する。答えは以下で出力されるものとする。printf("answer = %f\n", answer);' :- 'Nとxはキーボードから入力する'(N,_x), 'y=1+(1/x)+(1/x)^2+(1/x)^3+...+(1/x)^N'(0,N,_x,0,_y), '答えは以下で出力されるものとする。writef("answer = %f\n",[_y])'(_y). 'y=1+(1/x)+(1/x)^2+(1/x)^3+...+(1/x)^N'(M,N,_x,_y,_y) :- M > N,!. 'y=1+(1/x)+(1/x)^2+(1/x)^3+...+(1/x)^N'(M,N,_x,_y_1,_y) :- _y_2 is _y_1 + (1 / _x) ^ M, M_2 is M + 1, 'y=1+(1/x)+(1/x)^2+(1/x)^3+...+(1/x)^N'(M_2,N,_x,_y_2,_y). 'Nとxはキーボードから入力する'(N,_x) :- 'Nの入力'(N), '_xの入力'(_x). 'Nの入力'(N) :- write('N : '), get_integer(N),!. 'Nの入力'(N) :- 'Nの入力'(N). '_xの入力'(_x) :- write('x (<1) : '), get_line(Line), '_xの入力診断'(Line,_x),!. '_xの入力'(_x) :- '_xの入力'(_x). '_xの入力診断'(Line,_x) :- atom_to_term(Line,_x,_), _x > 0.0, _x < 1.0,!. '_xの入力診断'(Line,_x) :- writef('入力された %t からは1以下の適切な数が得られません。\n',[Line]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/150 # # [1] 授業単元:プログラミング # [2] 問題文: # y=1+x+x^2+x^3+...+x^N ただし |x|<1 # # を計算する関数 float func1(float x, int N) を定義してその動作を確認するプログラムkadai3-1.cを書きなさい。 # ただしNとxはキーボードから次で入力するものとする。 # scanf("%f %d", &x, &N); # 答えは以下で出力されるものとする。printf("answer = %f\n", answer); # 'y=1+x+x^2+x^3+...+x^N ただし |x|<1 Nとxはキーボードから次で入力するものとする。答えは以下で出力されるものとする。printf("answer = %f\n", answer);' :- 'Nとxはキーボードから入力する'(N,_x), 'y=1+x+x^2+x^3+...+x^N ただし |x|<1 '(0,N,_x,0,_y), '答えは以下で出力されるものとする。writef("answer = %f\n",[_y])'(_y). 'y=1+x+x^2+x^3+...+x^N ただし |x|<1 '(M,N,_x,_y,_y) :- M > N,!. 'y=1+x+x^2+x^3+...+x^N ただし |x|<1 '(M,N,_x,_y_1,_y) :- _y_2 is _y_1 + _x ^ M, M_2 is M + 1, 'y=1+x+x^2+x^3+...+x^N ただし |x|<1 '(M_2,N,_x,_y_2,_y). 'Nとxはキーボードから入力する'(N,_x) :- 'Nの入力'(N), '_xの入力'(_x). 'Nの入力'(N) :- write('N : '), get_integer(N),!. 'Nの入力'(N) :- 'Nの入力'(N). '_xの入力'(_x) :- write('x (<1) : '), get_line(Line), '_xの入力診断'(Line,_x),!. '_xの入力'(_x) :- '_xの入力'(_x). '_xの入力診断'(Line,_x) :- atom_to_term(Line,_x,_), _x > 0.0, _x < 1.0,!. '_xの入力診断'(Line,_x) :- writef('入力された %t からは1以下の適切な数が得られません。\n',[Line]), fail. '答えは以下で出力されるものとする。printf("answer = %f\n",[_y])'(_y) :- writef('answer = %t\n',[_y]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/144 # # [1] 授業単元:プログラム設計応用 # [2] 問題文:入力した点数の合計(gokei)を表示 # 人数は3、点数は80、70、60と入力し、最終的に「3名の合計点は210です。」と # 表示させるために、【___】に当てはまる式を答えよ # # #include <stdio.h> # main() # { #  int n, ten, i, 【______】; #  printf("人数を入力:"); #  scanf("%d",&n); #  for(i=1;i<=n;i++){ #   printf("点数を入力:"); #   scanf("%d",&ten); #   if(ten>=80) #    printf("点数は %d 点です。合格です。\n",ten); #   else #    printf("点数は %d 点です。不合格です。\n",ten); #   【______】 #  } #  【______】; # } #   # # 「合格者は2名で合計点は170です。不合格者は2名で合計点は80です。」 # と表示させるためにはどう書き換えたらいいのでしょうか。 # # ちなみに # # 合格者人数 g_n # 合格者合計 g_gokei # 不合格者人数 f_n # 不合格者合計 f_gokei # # と、指定するとします。 # '入力した点数の合計を表示。人数は3、点数は80、70、60と入力し、最終的に「3名の合計点は210です。」と表示させる' :- 入力した点数の合計(_人数,_合格者人数,_合格者合計,_不合格者人数,_不合格者合計,_入力した点数の合計), 表示(_人数,_合格者人数,_合格者合計,_不合格者人数,_不合格者合計,_入力した点数の合計). 入力した点数の合計(_人数,_合格者人数,_合格者合計,_不合格者人数,_不合格者合計,_入力した点数の合計) :- 人数は(_人数), 点数は(_人数,_合否付き点数ならび), 点数の合計(_合否付き点数ならび,_合格者人数,_合格者合計,_不合格者人数,_不合格者合計,_入力した点数の合計). 人数は(_人数) :- write('入力する人数は : '), get_line(Line), 入力する人数診断(Line,_人数),!. 人数は(_人数) :- 人数は(_人数). 入力する人数診断(Line,_人数) :- atom_to_term(Line,_人数,_), integer(_人数), _人数 > 0,!. 入力する人数診断(Line,_人数) :- writef('入力された %t からは適切な人数が得られません。再入力をお願いします。\n',[Line]), fail. 点数は(_人数,_点数ならび) :- length(_点数ならび,_人数), findall([_点数,_判定],( append(L0,[_|_],_点数ならび), 点数入力([_|L0],_点数), 合否判定(_点数,_判定)), _点数ならび). 点数入力(Ln,_点数) :- length(Ln,N), writef('%t人目の点数 : ',[N]), get_line(Line), 点数入力診断(Line,_点数),!. 点数入力(Ln,_点数) :- 点数入力(Ln,_点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0,!. 点数入力診断(Line,_点数) :- writef('入力した %t からは点数が得られません。再入力をお願いします。\n',[Line]), fail. 合否判定(_点数,合格) :- _点数 >= 80. 合否判定(_点数,不合格) :- _点数 < 80. 点数の合計(_合否付き点数ならび,_合格者人数,_合格者合計,_不合格者人数,_不合格者合計,_入力した点数の合計). 点数の合計([],0,0,0,0,0). 点数の合計([[_点数,合格]|R],_合格者人数,_合格者合計,_不合格者人数,_不合格者合計,_入力した点数の合計) :- 点数の合計(R,_合格者人数_1,_合格者合計_1,_不合格者人数,_不合格者合計,_入力した点数の合計_1), 点数と人数を加算する(_点数,_合格者人数_1,_合格者合計_1,_合格者人数,_合格者合計). 点数の合計([[_点数,不合格]|R],_合格者人数,_合格者合計,_不合格者人数,_不合格者合計,_入力した点数の合計) :- 点数の合計(R,_合格者人数,_合格者合計,_不合格者人数_1,_不合格者合計_1,_入力した点数の合計_1), 点数と人数を加算する(_点数,_不合格者人数_1,_不合格者合計_1,_入力した点数の合計_1,_不合格者人数,_不合格者合計,_入力した点数の合計). 点数と人数を加算する(_点数,_人数_1,_点数の合計_1,_入力した点数の合計_1,_人数,_点数の合計,_入力した点数の合計) :- _人数 is _人数_1 + 1, _点数の合計 is _点数の合計_1 + _点数, _入力した点数の合計 is _入力した点数の合計_1 + _点数,!. 表示(_人数,_合格者人数,_合格者合計,_不合格者人数,_不合格者合計,_入力した点数の合計) :- writef('%t名の合計点は%tです。\n\n',[_人数,_入力した点数の合計]), writef('合格者人数 %t\n合格者合計 %t\n不合格者人数 %t\n不合格者合計 %t\n',[_合格者人数,_合格者合計,_不合格者人数,_不合格者合計]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/144 # # [1] 授業単元:プログラム設計応用 # [2] 問題文:入力した点数の合計(gokei)を表示 # 人数は3、点数は80、70、60と入力し、最終的に「3名の合計点は210です。」と # 表示させるために、【___】に当てはまる式を答えよ # # #include <stdio.h> # main() # { #  int n, ten, i, 【______】; #  printf("人数を入力:"); #  scanf("%d",&n); #  for(i=1;i<=n;i++){ #   printf("点数を入力:"); #   scanf("%d",&ten); #   if(ten>=80) #    printf("点数は %d 点です。合格です。\n",ten); #   else #    printf("点数は %d 点です。不合格です。\n",ten); #   【______】 #  } #  【______】; # } #   # '入力した点数の合計を表示。人数は3、点数は80、70、60と入力し、最終的に「3名の合計点は210です。」と表示させる' :- 入力した点数の合計(_人数,_入力した点数の合計), 表示(_人数,_入力した点数の合計). 入力した点数の合計(_人数,_入力した点数の合計) :- 人数は(_人数), 点数は(_人数,_点数ならび), 点数の合計(_点数ならび,_入力した点数の合計). 人数は(_人数) :- write('入力する人数は : '), get_line(Line), 入力する人数診断(Line,_人数),!. 人数は(_人数) :- 人数は(_人数). 入力する人数診断(Line,_人数) :- atom_to_term(Line,_人数,_), integer(_人数), _人数 > 0,!. 入力する人数診断(Line,_人数) :- writef('入力された %t からは適切な人数が得られません。再入力をお願いします。\n',[Line]), fail. 点数は(_人数,_点数ならび) :- length(_点数ならび,_人数), findall(_点数,( append(L0,[_|_],_点数ならび), 点数入力([_|L0],_点数)), _点数ならび). 点数入力(Ln,_点数) :- length(Ln,N), writef('%t人目の点数 : ',[N]), get_line(Line), 点数入力診断(Line,_点数),!. 点数入力(Ln,_点数) :- 点数入力(Ln,_点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0,!. 点数入力診断(Line,_点数) :- writef('入力した %t からは点数が得られません。再入力をお願いします。\n',[Line]), fail. 点数の合計([],0). 点数の合計([_点数|R],_点数の合計) :- 点数の合計(R,_点数の合計の一), _点数の合計 is _点数の合計の一 + _点数. 表示(_人数,_入力した点数の合計) :- writef('%t名の合計点は%tです。\n',[_人数,_入力した点数の合計]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/132 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # double func(double x,double y, double z) # { # double sum; # sum=x+y+z; # return sum; # } # 上記のfunc関数を利用して3つの実数を入力すると、それらの合計値を計算するプログラムをmain関数からfunc関数を呼び出す形で作成しなさい。 # :- op(700,xfx,は). 関数定義(func(_x,_y,_z),_値) :- _値 is _x + _y + _z. _値 は _関数 :- 関数定義(_関数,_値),!. _値 は _関数 :- _値 is _関数. '上記のfunc関数を利用して3つの実数を入力すると、それらの合計値を計算する'(_合計値) :- '3つの実数を入力すると'(_実数_1,_実数_2,_実数_3), それらの合計値を計算する(_実数_1,_実数_2,_実数_3,_合計値). それらの合計値を計算する(_実数_1,_実数_2,_実数_3,_3つの実数の合計値) :- _3つの実数の合計値 は func(_実数_1,_実数_2,_実数_3). '3つの実数を入力すると'(_実数_1,_実数_2,_実数_3) :- 'n番目の実数を入力'(1,_実数_1), 'n番目の実数を入力'(2,_実数_2), 'n番目の実数を入力'(3,_実数_3). 'n番目の実数を入力'(_n,_実数) :- writef('%番目の実数を入力してください : ',[_n]), get_line(Line), 'n番目の実数を入力診断'(Line,_実数),!. 'n番目の実数を入力'(_n,_実数) :- 'n番目の実数を入力'(_n,_実数). 'n番目の実数を入力診断'(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 'n番目の実数を入力診断'(Line,_実数) :- writef('入力された %t からは実数値が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/959 # # [1] 授業単元:プログラミングC # [2] 問題文 配列vxの各要素に整数をscanf関数で入力し、5の倍数のみを新たな配列に格納し、これを出力するプログラムを作成せよ。 # 'リストの各要素に整数をで入力し、5の倍数のみを新たなリストに格納し、これを出力する' :- リストの各要素に整数をで入力し(_リスト), 5の倍数のみを新たなリストに格納し(_リスト,_新たなリスト), これを出力する(_新たなリスト). リストの各要素に整数をで入力し(_リスト) :- get_integer(_整数), リストの各要素に整数をで入力し(_整数,_リスト). リストの各要素に整数をで入力し(_,[]) :- at_end_of_stream(user_input),!. リストの各要素に整数をで入力し(_整数,[_整数|R]) :- get_integer(_整数_2), リストの各要素に整数をで入力し(_整数,R). 5の倍数のみを新たなリストに格納し(_リスト,_新たなリスト) :- findall(_5の倍数,( member(_5の倍数,_リスト), 0 is _5の倍数 mod 5), _新たなリスト). これを出力する([]). これを出力する([_要素|R]) :- writef('%t\n',[_要素]), これを出力する(R). get_integer(_整数) :- get_line(Line), 整数入力検査(Line,_整数),!. 整数入力検査(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/896 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 1からNまでの値の中で3の倍数の和を求めるプログラムkadai2.cを書きなさい。但しNはキーボードから入力するものとして,出力は以下で出力されるものとする。 # printf("sum = %d\n", answer); # # '1からNまでの値の中で3の倍数の和を求める。ただしNはキーぼどから入力するものとする' :- 'Nはキーぼどから入力する'(N), '1からNまでの値の中で3の倍数の和を求める'(N,_1からNまでの値の中で3の倍数の和), writef('1から%tまでの値の中で3の倍数の和=%t\n',[_1からNまでの値の中で3の倍数の和]). '1からNまでの値の中で3の倍数の和を求める'(N,_1からNまでの値の中で3の倍数の和) :- findsum(M,( for(1,M,N), 0 is M mod 3), _1からNまでの値の中で3の倍数の和). 'Nはキーぼどから入力する'(N) :- write('0より大きい整数 N を入力して下さい : '), get_line(Line), 整数入力検査(Line,N),!. 'Nはキーぼどから入力する'(N) :- 'Nはキーぼどから入力する'(N). 整数入力検査(Line,N) :- atom_to_term(Line,N,_), integer(N), N > 0,!. 整数入力検査(Line,N) :- writef('入力された %t からは適切な N が得られません。再入力をお願いします。\n',[Line]), fail. findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0). sum([N|R],Sum) :- sum(R,Sum_1), Sum is Sum_1 + N. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/895 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # [問1] 1からNまでの平均値を求めるプログラムkadai1.cを書きなさい。ただしNはキーぼどから入力するものとし、出力は以下で出力されるものとする。 # printf("average = %f\n", answer); # '1からNまでの平均値を求める。ただしNはキーぼどから入力するものとする' :- 'Nはキーぼどから入力する'(N), findavg(M,for(1,M,N),_相加平均), writef('平均値 = %t\n',[_相加平均]). 'Nはキーぼどから入力する'(N) :- write('0より大きい整数 N を入力して下さい : '), get_line(Line), 整数入力検査(Line,N),!. 'Nはキーぼどから入力する'(N) :- 'Nはキーぼどから入力する'(N). 整数入力検査(Line,N) :- atom_to_term(Line,N,_), integer(N), N > 0,!. 整数入力検査(Line,N) :- writef('入力された %t からは適切な N が得られません。再入力をお願いします。\n',[Line]), fail. findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. sum([],0). sum([N|R],S) :- sum(R,Sum_1), Sum is Sum_1 + N. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 156代目 #881 # 昨日宿題で出された問題です。よろしくお願いします。 # 解説無しでここから試験が出るようなので難しさに焦っています。 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、 # 式の値がちょうど 100 となる例を挙げよ(10とおりだけ書け)。 # # たとえば、 #  1 + 2 * 3 * 4 * 5 + 6 * 7 - 8 * 9 = 91 # というような計算をする。ただし、この例では式の値が91となるので答えではない。 # # '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、式の値がちょうど 100 となる例を挙げよ'(_式) :- '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'([1,V1,2,V2,3,V3,4,V4,5,V5,6,V6,7,V7,8,V8,9]), '式の値がちょうど 100 となる例を挙げよ'([1,V1,2,V2,3,V3,4,V4,5,V5,6,V6,7,V7,8,V8,9],_式). '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'([_]). '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'(L) :- '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて行く'(L). '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて行く'([N,_演算子|R]) :- member(_演算子,[+,-,*]), '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'(R). '式の値がちょうど 100 となる例を挙げよ'(L,_式) :- 式の(L,_式), '値がちょうど 100 となる'(_式). 式の(L,_式) :- atomic_list_concat(L,_式文字列), read_term_from_atom(_式文字列,_式,[]). '値がちょうど 100 となる'(_式) :- 100 is _式. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/881 # # 昨日宿題で出された問題です。よろしくお願いします。 # 解説無しでここから試験が出るようなので難しさに焦っています。 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、 # 式の値がちょうど 100 となる例を挙げよ(10とおりだけ書け)。 # # たとえば、 #  1 + 2 * 3 * 4 * 5 + 6 * 7 - 8 * 9 = 91 # というような計算をする。ただし、この例では式の値が91となるので答えではない。 # # '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、式の値がちょうど 100 となる例を挙げよ'(_式) :- '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'([1,V1,2,V2,3,V3,4,V4,5,V5,6,V6,7,V7,8,V8,9]), atomic_list_concat([1,V1,2,V2,3,V3,4,V4,5,V5,6,V6,7,V7,8,V8,9],_式表示), atom_to_term(_式表示,_式,_), 100 is _式. '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'([_]). '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'([N,_演算子|R]) :- member(_演算子,[+,-,*]), '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/881 # # 昨日宿題で出された問題です。よろしくお願いします。 # 解説無しでここから試験が出るようなので難しさに焦っています。 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、 # 式の値がちょうど 100 となる例を挙げよ(10とおりだけ書け)。 # # たとえば、 #  1 + 2 * 3 * 4 * 5 + 6 * 7 - 8 * 9 = 91 # というような計算をする。ただし、この例では式の値が91となるので答えではない。 # # '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、式の値がちょうど 100 となる例を挙げよ'(_式) :- FL = [+,-,*], member(V1,FL), member(V2,FL), member(V3,FL), member(V4,FL), member(V5,FL), member(V6,FL), member(V7,FL), member(V8,FL), atomic_list_concat([1,V1,2,V2,3,V3,4,V4,5,V5,6,V6,7,V7,8,V8,9],_式表示), atom_to_term(_式表示,_式,_), 100 is _式. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/881 # # 昨日宿題で出された問題です。よろしくお願いします。 # 解説無しでここから試験が出るようなので難しさに焦っています。 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、 # 式の値がちょうど 100 となる例を挙げよ(10とおりだけ書け)。 # # たとえば、 #  1 + 2 * 3 * 4 * 5 + 6 * 7 - 8 * 9 = 91 # というような計算をする。ただし、この例では式の値が91となるので答えではない。 # # '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、式の値がちょうど 100 となる例を挙げよ'(_式) :- '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'(1,L), atomic_list_concat(L,_式表示), atom_to_term(_式表示,_式,_), 100 is _式. '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'(9,[9]). '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'(N,[N,_演算子|R]) :- N < 9, member(_演算子,[+,-,*]), N_2 is N + 1, '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'(N_2,R). % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/868 # # #include <time.h> # #include <stdio.h> # #include <stdlib.h> # # int main(void) # { # int no; # int ans; # srand(time(NULL)); # ans=rand()%10; # printf("0〜9の整数を当ててください"); # do{ # printf("いくつですか"); # scanf("%d",&no); # if(no>ans) # printf("もっと小さい\n"); # else if(no<ans) # printf("もっと大きい\n"); # }while(no!=ans); # printf("当たりです\n"); # return(0); # } # # っていう0〜9の数字を当てるハイ&ローのプログラムなんだけど # これに残りの入力できる回数を追加したいんだけど残り回数=nokoriとして # 入力できる回数をkai=10とした場合のプログラムを教えてください # # 入力できる回数(3). '0〜9の数字を当てるハイ&ロー'(_目標数字,_結果) :- _目標数字 is random(10), 入力できる回数(_入力できる回数), 数字入力(_入力できる回数,_数字), '0〜9の数字を当てるハイ&ロー'(_入力できる回数,_数字,_目標数字,_結果). '0〜9の数字を当てるハイ&ロー'(0,_,_,'入力する権利を失いました。あなたの負けです') :- !. '0〜9の数字を当てるハイ&ロー'(_,_目標数字,_目標数字,'当たりましたです') :- !. '0〜9の数字を当てるハイ&ロー'(N,_数字,_目標数字,_結果) :- 判定を表示して次の数字を得る(_数字,_目標数字,N,N_1,_次の数字), '0〜9の数字を当てるハイ&ロー'(N_1,_次の数字,_目標数字,_結果). 判定を表示して残り回数と次の数字を得る(_数字,_目標数字,_入力できる回数,_残り回数,_次の数字) :- 判定(_数字,_目標数字,_判定), writef('%t\n',[_判定]), _残り回数 is _入力できる回数 - 1, 数字入力(_残り回数,_次の数字). 判定(_数字,_目標数字,大き過ぎるようです) :- _数字 > _目標数字. 判定(_数字,_目標数字,小さ過ぎるようです) :- _数字 < _目標数字. 数字入力(_残り回数,_数字) :- writef('数字を入力してください。残り回数[%t] : ',[_残り回数]), get_line(Line), 数字入力診断(Line,_数字),!. 数字入力(_残り回数,_数字) :- 数字入力(_残り回数,_数字). 数字入力診断(Line,_数字) :- atom_to_term(Line,_数字,_), integer(_数字), _数字 >= 0, _数字 =< 9,!. 数字入力診断(Line,_数字) :- writef('入力された%tからは適切な数字[0~9]が得られません。再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/647 # # #インデントが崩れる場合は http://ime.nu/pastebin.com/26BkXDHs をみてください。 # # -- # -- 商品テーブルと、 # -- # create table items ( # id serial primary key, # name varchar(255) not null, # price integer not null -- 単価 # ); # # -- # -- 販売テーブルがあるとする。 # -- # create table sales ( # id serial primary key, # item_id integer not null references items(id), # count integer not null default 1, -- 個数 # total integer not null, -- 単価 * 個数 # created_at timestamp not null default current_datetime # ) # # -- # -- 日付を指定して、その日の商品別販売金額合計を大きい順に表示したい。 # -- どういうSQLを書けばいいの? # -- こんなかんじで書けたらいいんだけど。 # -- # select items.id, items.name # from items, # (select item_id, sum(total) as sum_total # from sales # where date(created_at) = '2012-04-01' # group by item_id) as totals # where items.id = totals.item_id # order by totals.sum_total desc; # # '日付を指定して、その日の商品別販売金額合計を大きい順に表示したい' :- '日付を指定して、'(_日付), その日の商品別販売金額合計を(_日付,L1), 大きい順に表示する(L1). '日付を指定して、'(_日付) :- write('日付を8桁の整数で入力して下さい : '), get_line(Line), '日付を指定して、の診断'(Line,_日付),!. '日付を指定して、'(_日付) :- '日付を指定して、'(_日付). '日付を指定して、の診断'(Line,_日付) :- atom_to_term(Line,_8桁の整数,_), '8桁の整数'(_8桁の整数), '8桁の整数から日付を得る'(_8桁の整数,_日付),!. '日付を指定して、の診断'(Line,_日付) :- writef('入力された %t からは日付が得られませんでした。再入力をお願いします\n',[Line]), fail. '8桁の整数'(_8桁の整数) :- integer(_8桁の整数), _8桁の整数 >= 10000000, _8桁の整数 =< 99999999. '8桁の整数から日付を得る'(_8桁の整数,_日付) :- swritef(_日付文字列,'%t',[_8桁の整数]), sub_atom(_日付文字列,0,4,_,_年), sub_atom(_日付文字列,4,2,_,_月), sub_atom(_日付文字列,6,2,_,_日), atomic_list_concat([_年,'-',_月,'-',_日],_日付),!. その日の商品別販売金額合計を(_日付,L1) :- findsetof(_id,( sales(_id,_item_id,_count,_total,_日付)), L), findall([_total,_id],( append(_,[_id|R],L), 商品の販売合計(_日付,_id,_合計金額)), L1). 商品の販売合計(_日付,_id,_合計金額) :- findsum(_total,( sales(_id,_item_id,_count,_total,_日付)), _合計金額). 大きい順に表示する(L1) :- 大きい順に(L1,L2), 表示する(L2). 大きい順に(L1,L2) :- sort(L1,L3), reverse(L3,L2). 表示する(_日付,[]). 表示する(_日付,[[_合計金額,_id]|R]) :- items(_id,_name,_price), writef('%t %t %20l %10r\n',[_日付,_id,_name,_合計金額]), 表示する(_日付,R). % 以下のサイトは 'その月の最終日(整数)'(_,1,31). 'その月の最終日(整数)'(_年,2,29) :- うるう年(_年). 'その月の最終日(整数)'(_年,2,28) :- \+(うるう年(_年)). 'その月の最終日(整数)'(_,3,31). 'その月の最終日(整数)'(_,4,30). 'その月の最終日(整数)'(_,5,31). 'その月の最終日(整数)'(_,6,30). 'その月の最終日(整数)'(_,7,31). 'その月の最終日(整数)'(_,8,31). 'その月の最終日(整数)'(_,9,30). 'その月の最終日(整数)'(_,10,31). 'その月の最終日(整数)'(_,11,30). 'その月の最終日(整数)'(_,12,31). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは その月の最終日(_,'01','31'). その月の最終日(_年,'02','29') :- うるう年(_年). その月の最終日(_年,'02','28') :- \+(うるう年(_年)). その月の最終日(_,'03','31'). その月の最終日(_,'04','30'). その月の最終日(_,'05','31'). その月の最終日(_,'06','30'). その月の最終日(_,'07','31'). その月の最終日(_,'08','31'). その月の最終日(_,'09','30'). その月の最終日(_,'10','31'). その月の最終日(_,'11','30'). その月の最終日(_,'12','31'). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/638 # # mysql 5.5.10 # # table hogehoge # inputdate data1 data2 data3 # 2012-02-16 ssssss wwwww yyyyyy # 2012-02-17 xxxxxx xxxxx xxxxx # 2012-02-18 null aaaaa vvvvv # 2012-02-19 null null null # 2012-02-20 null null null # 2012-02-21 null null null # 2012-02-22 xxxxxx ccccc fffff # # とある時に、指定日の前日のデータが欲しい # 例でいうなら # data1について、 # 2012-02-17を指定することによって2012-02-16のssssssを、 # 2012-02-22の日付を指定して2012-02-17のxxxxxxが得られ # るようにしたいのですが。 # # よろしくお願いします # 指定日の前日のデータが欲しい(_指定日,_指定日の前日,_data1,_data2,_data3) :- 指定日の前日(_指定日,_指定日の前日), hogehoge(_指定日の前日,_data1,_data2,_data3). 指定日の前日(_指定日,_指定日の前日) :- 指定日から年取得(_指定日,_年), 指定日から月取得(_指定日,_月), 指定日から日取得(_指定日,_日), 指定日の前日(_年,_月,_日,_指定日の前日). 指定日の前日(_年,'01','01',_指定日の前日) :- 前年(_年,_前年), atomic_list_concat([_前年,-,'12',-,'31'],_指定日の前日),!. 指定日の前日(_年,_月,'01',_指定日の前日) :- member(_月,['05','07','08','10','12']), 前月(_月,_前月), atomic_list_concat([_年,-,_前月,-,'30'],_指定日の前日),!. 指定日の前日(_年,_月,'01',_指定日の前日) :- member(_月,['02','04','06','09','11']), 前月(_月,_前月), atomic_list_concat([_年,-,_前月,-,'31'],_指定日の前日),!. 指定日の前日(_年,'03','01',_指定日の前日) :- atom_to_term(_年,_年整数,_), うるう年(_年整数), atomic_list_concat([_年,-,'02',-,'29'],_指定日の前日),!. 指定日の前日(_年,'03','01',_指定日の前日) :- atom_to_term(_年,_年整数,_), \+(うるう年(_年整数)), atomic_list_concat([_年,-,'02',-,'28'],_指定日の前日),!. 指定日の前日(_年,_月,_日,_指定日の前日) :- 二桁日文字列の前日文字列(_日,_前日文字列), atomic_list_concat([_年,-,_月,-,_前日文字列],_指定日の前日). 指定日から年取得(_指定日,_年) :- sub_atom(_指定日,0,4,_,_年). 指定日から月取得(_指定日,_月) :- sub_atom(_指定日,5,2,_,_月). 指定日から日取得(_指定日,_日) :- sub_atom(_指定日,8,2,_,_日). 前年(_年,_前年) :- atom_to_term(_年,_年整数), _前年整数 is _年整数 - 1, swritef(_前年,'%t',[_前年整数]). 前月('12','11'). 前月('11','10'). 前月('10','09'). 前月('09','08'). 前月('08','07'). 前月('07','06'). 前月('06','05'). 前月('05','04'). 前月('04','03'). 前月('03','02'). 前月('02','01'). 二桁日文字列の前日文字列('31','30'). 二桁日文字列の前日文字列('30','29'). 二桁日文字列の前日文字列('29','28'). 二桁日文字列の前日文字列('28','27'). 二桁日文字列の前日文字列('27','26'). 二桁日文字列の前日文字列('26','25'). 二桁日文字列の前日文字列('25','24'). 二桁日文字列の前日文字列('24','23'). 二桁日文字列の前日文字列('23','22'). 二桁日文字列の前日文字列('22','21'). 二桁日文字列の前日文字列('21','20'). 二桁日文字列の前日文字列('20','19'). 二桁日文字列の前日文字列('19','18'). 二桁日文字列の前日文字列('18','17'). 二桁日文字列の前日文字列('17','16'). 二桁日文字列の前日文字列('16','15'). 二桁日文字列の前日文字列('15','14'). 二桁日文字列の前日文字列('14','13'). 二桁日文字列の前日文字列('13','12'). 二桁日文字列の前日文字列('12','11'). 二桁日文字列の前日文字列('11','10'). 二桁日文字列の前日文字列('10','09'). 二桁日文字列の前日文字列('09','08'). 二桁日文字列の前日文字列('08','07'). 二桁日文字列の前日文字列('07','06'). 二桁日文字列の前日文字列('06','05'). 二桁日文字列の前日文字列('05','04'). 二桁日文字列の前日文字列('04','03'). 二桁日文字列の前日文字列('03','02'). 二桁日文字列の前日文字列('02','01'). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/770 # # 1番目:1から20までの整数を入力してください:7 # 2番目:2から20までの整数を入力してください:11 # 3番目:2から20までの整数を入力してください:12 # 4番目:13から20までの整数を入力してください:20 # もういちど最初からやり直してください。 # 1番目:1から20までの整数を入力してください:7 # 2番目:8から20までの整数を入力してください:11 # 3番目:12から20までの整数を入力してください:1 # 3番目:12から20までの整数を入力してください:12 # 4番目:13から20までの整数を入力してください:17 # 5番目:18から20までの整数を入力してください:19 # 7 11 12 17 19 # % % この問題には以下の質問をぶつけてあります。 % >>770 % 二行目、三行目の範囲下限が何故2なのかわからない。8,12ではないのか? '1から範囲を狭めながら19までの数列を得て表示する' :- '1から範囲を狭めながら19までの数列を得る'(1,1,_1から19までの数列), '1から19までの数列を表示する'(_1から19までの数列),!. '1から範囲を狭めながら19までの数列を得る'(_,20,[]). '1から範囲を狭めながら19までの数列を得る'(N,_から,[X|R]) :- '20までの数値入力'(N,_から,X), _から_2 is _から + 1, N_2 is N + 1, '1から範囲を狭めながら19までの数列を得る'(N_2,_から_2,R). '1から範囲を狭めながら19までの数列を得る'(_,_,L) :- もういちど最初からやりなおす(L). もういちど最初からやりなおす(L) :- write('もういちど最初からやり直してください。\n'), '1から範囲を狭めながら19までの数列を得る'(1,1,L). '20までの整数入力'(N,_から,X) :- writef('%t番目:%tから20までの整数を入力してください:',[N,_から]), '20までの整数入力'(_から,X),!. '20までの整数入力'(N,_から,X) :- '20までの整数入力'(N,_から,X). '20までの整数入力'(_から,X) :- get_line(Line), '20までの整数入力診断'(Line,_から,X). '20までの整数入力診断'(Line,_から,X) :- atom_to_term(Line,X,_), integer(X), X >= _から, X < 20. '1から19までの数列を表示する'(L) :- concat_atom(L,' ',_表示文字列), writef('%t\n',[_表示文字列]). % % get_line/1 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/734 # # [1]C言語(やさしいC 輪講) # [2]問題文: # 次のコードは、コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力するプログラムです。 # ([1])〜([11])内を埋めてコードを完成させなさい。 # #include <stdio.h> # #include <stdlib.h> # static int readNumber(char *msg,int min,int max,int m1,int m2,int m3,int m4){ # char console[256],([1]);([2]) result; # for(;;){ # printf("%s",msg); # t=fgets( ([3]),stdin); # if(t==NULL)([5]); # result=atoi(([3])); # if(result<([6]))([5]);if(result>([7]))([5]); # if(m1==result){ # printf("その数は使われています\n"); # ([5]); # } # ([8]) # return result; # } # } # int main(void){ # int m; # m=readNumber("1個目:1以上20以下の整数を入力してください:",([9]),([10]),0,0,0,0); # ([11]) # return 0; # } # [3] Windows Vistaですがコンパイラとかよくわかりません。 # [4] 4月の最初のゼミまで(3年次・4年次と連続履修です) # [5]ローカル変数はステートメントが始まる前にすべて宣言しなければならないと注意を受けました。よろしくお願いします。 # # 'コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力する' :- 'コンソールから入力された異なる5個の1から20までの数を'([],_異なる5個の1から20までの数), 大きい順に並べ替えて出力する(_異なる5個の1から20までの数). 'コンソールから入力された異なる5個の1から20までの数を'(L,[]) :- length(L,5),!. 'コンソールから入力された異なる5個の1から20までの数を'(L,[_1から20までの数|R]) :- 'コンソールから入力された異なる1から20までの数'(L,_1から20までの数), 'コンソールから入力された異なる5個の1から20までの数を'([_1から20までの数|L],R). 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- write('異なる1から20までの数を入力して下さい : '), コンソールから入力された(Line), '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数),!. 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数). コンソールから入力された(Line) :- get_line(Line). '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数) :- atom_to_term(Line,_数,_), '異なる'(_数,L), '1から20までの数'(Line,_数),!. '異なる'(_数,L) :- \+(member(_数,L)),!. '異なる'(_数,L) :- writef('入力された数%tは既に入力済みです。再入力をお願いします。\n',[_数]), fail. '1から20までの数'(Line,_数) :- 数(_数), '1から20までの'(_数),!. '1から20までの'(_数) :- _数 >= 1, _数 =< 20,!. '1から20までの'(_数) :- writef('入力された数%tは1から20の範囲にありません。再入力をお願いします。\n',[_数]), fail. 数(_,_数) :- number(_数),!. 数(Line,_数以外の項) :- writef('入力された %t からは数が得られません。再入力をお願いします\n',[Line]), fail. 大きい順に並べ替えて出力する(_異なる5個の1から20までの数) :- 大きい順に並べ替えて(_異なる5個の1から20までの数,_大きい順に整列したならび), 出力する(_大きい順に整列したならび). 大きい順に並べ替えて(L1,L2) :- 大きい順に並べ替えて(L1,[],L2). 大きい順に並べ替えて([],L,L). 大きい順に並べ替えて([A|R],L1,L) :- 大きい順の挿入(A,L1,L2), 大きい順に並べ替えて(R,L2,L). 大きい順の挿入(A,[],[A]). 大きい順の挿入(A,[B|R1],[A,B|R1]) :- A >= B,!. 大きい順の挿入(A,[B|R1],[B|R2]) :- 大きい順の挿入(A,R1,R2). 出力する(_大きい順に整列したならび) :- swritef(_表示する数列,'%t,%t,%t,%t,%t\n',_大きい順に整列したならび), writef('%t\n',[_表示する数列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/734 # # [1]C言語(やさしいC 輪講) # [2]問題文: # 次のコードは、コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力するプログラムです。 # ([1])〜([11])内を埋めてコードを完成させなさい。 # #include <stdio.h> # #include <stdlib.h> # static int readNumber(char *msg,int min,int max,int m1,int m2,int m3,int m4){ # char console[256],([1]);([2]) result; # for(;;){ # printf("%s",msg); # t=fgets( ([3]),stdin); # if(t==NULL)([5]); # result=atoi(([3])); # if(result<([6]))([5]);if(result>([7]))([5]); # if(m1==result){ # printf("その数は使われています\n"); # ([5]); # } # ([8]) # return result; # } # } # int main(void){ # int m; # m=readNumber("1個目:1以上20以下の整数を入力してください:",([9]),([10]),0,0,0,0); # ([11]) # return 0; # } # [3] Windows Vistaですがコンパイラとかよくわかりません。 # [4] 4月の最初のゼミまで(3年次・4年次と連続履修です) # [5]ローカル変数はステートメントが始まる前にすべて宣言しなければならないと注意を受けました。よろしくお願いします。 # # 'コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力する' :- 'コンソールから入力された異なる5個の1から20までの数を'([],_異なる5個の1から20までの数), 大きい順に並べ替えて出力する(_異なる5個の1から20までの数). 'コンソールから入力された異なる5個の1から20までの数を'(L,[]) :- length(L,5),!. 'コンソールから入力された異なる5個の1から20までの数を'(L,[_1から20までの数|R]) :- 'コンソールから入力された異なる1から20までの数'(L,_1から20までの数), 'コンソールから入力された異なる5個の1から20までの数を'([_1から20までの数|L],R). 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- write('異なる1から20までの数を入力して下さい : '), コンソールから入力された(Line), '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数),!. 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数). コンソールから入力された(Line) :- get_line(Line). '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数) :- atom_to_term(Line,_数,_), 異なる(_数,L), '1から20までの数'(Line,_数),!. 異なる(_数,L) :- \+(member(_数,L)),!. 異なる(_数,L) :- writef('入力された数%tは既に入力済みです。再入力をお願いします。\n',[_数]), fail. '1から20までの数'(Line,_数) :- 数(_数), '1から20までの'(_数),!. '1から20までの'(_数) :- _数 >= 1, _数 =< 20,!. '1から20までの'(_数) :- writef('入力された数%tは1から20の範囲にありません。再入力をお願いします。\n',[_数]), fail. 数(_,_数) :- number(_数),!. 数(Line,_数以外の項) :- writef('入力された %t からは数が得られません。再入力をお願いします\n',[Line]), fail. 大きい順に並べ替えて出力する(_異なる5個の1から20までの数) :- 大きい順に並べ替えて(_異なる5個の1から20までの数,_大きい順に整列したならび), 出力する(_大きい順に整列したならび). 大きい順に並べ替えて(_異なる5個の1から20までの数,_大きい順に整列したならび) :- sort(_異なる5個の1から20までの数,_整列したならび), reverse(_整列したならび,_大きい順に整列したならび). 出力する(_大きい順に整列したならび) :- swritef(_表示する数列,'%t,%t,%t,%t,%t\n',_大きい順に整列したならび), writef('%t\n',[_表示する数列]). /* 大きい順に並べ替えて(L1,L2) :- 大きい順に並べ替えて(L1,[],L2). 大きい順に並べ替えて([],L,L). 大きい順に並べ替えて([A|R],L1,L) :- 大きい順の挿入(A,L1,L2), 大きい順に並べ替えて(R,L2,L). 大きい順の挿入(A,[],[A]). 大きい順の挿入(A,[B|R1],[A,B|R1]) :- A >= B,!. 大きい順の挿入(A,[B|R1],[B|R2]) :- 大きい順の挿入(A,R1,R2). */ % 以下のサイトは # # localtime/8 localtime/9 を定義する # localtime(_年,_月,_日,_曜日,_累計日数,_時,_分,_秒) :- get_time(Time), グリニッヂ時と地域時間の差(_グリニッヂ時との時間差), _地域秒 is truncate(Time) + _グリニッヂ時との時間差, localtime(_地域秒,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒). localtime(_地域秒,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒) :- localtime(1970,0,_地域秒,L), last(L,[_年,_開始秒]), _当年累秒数 is _地域秒 - _開始秒, '_年,_月,_日,_曜日,_累計日数,_時,_分,_秒を計算する'(_当年累秒数,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒),!. localtime(_年,_開始秒,_現在秒,[]) :- _開始秒 > _現在秒,!. localtime(_年,_開始秒,_現在秒,[[_年,_開始秒]|R]) :- 年間秒(_年,_年間秒), _開始秒_2 is _開始秒 + _年間秒, _年_2 is _年 + 1, localtime(_年_2,_開始秒_2,_現在秒,R). 月初めの年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- うるう年(_年), うるう年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数). 月初めの年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- \+(うるう年(_年)), うるう年でない年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数). うるう年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- 月初めの累積日数(_年,_月,[0,31,29,31,30,31,30,31,31,30,31,30],_月初めの累積日数), nth1(_月,[31,29,31,30,31,30,31,31,30,31,30,31,31],_月日数), _月初めの年初来の累秒数 is 86400 * _月初めの累積日数, _月末の年初来の累秒数 is _月初めの年初来の累秒数 + 86400 * _月日数. うるう年でない年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- 月初めの累積日数(_年,_月,[0,31,28,31,30,31,30,31,31,30,31,30],_月初めの累積日数), nth1(_月,[31,28,31,30,31,30,31,31,30,31,30,31,31],_月日数), _月初めの年初来の累秒数 is 86400 * _月初めの累積日数, _月末の年初来の累秒数 is _月初めの年初来の累秒数 + 86400 * _月日数. 月初めの累積日数(_年,_月,_0から始まる月日数ならび,_月初めの累積日数) :- findsum(_日数,( between(1,_月,N), nth1(N,_0から始まる月日数ならび,_日数)), _月初めの累積日数_1), _月初めの累積日数 is truncate(_月初めの累積日数_1). '_年,_月,_日,_曜日,_累計日数,_時,_分,_秒を計算する'(_当年累秒数,_年,_月,_日,_曜日を表す値,_累計日数,_時,_分,_秒) :- '当年累積秒と月初めの年初来の累積秒と月末の年初来の累積秒から_月を得る'(_当年累秒数,_年,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数,_月), '_当年累積秒と_月初めの年初来の累積秒から_月,_日,_時,_分,_秒,を求める'(_当年累秒数,_月初めの年初来の累秒数,_月,_日,_時,_分,_秒), _累計日数 is _月初めの累積日数 + _日, 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日),!. '当年累積秒と月初めの年初来の累積秒と月末の年初来の累積秒から_月を得る'(_当年累秒数,_年,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数,_月) :- between(1,12,_月), 月初めの年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数), _当年累秒数 >= _月初めの年初来の累秒数, _当年累秒数 =< _月末の年初来の累秒数,!. '_当年累積秒と_月初めの年初来の累積秒から_月,_日,_時,_分,_秒,を求める'(_当年累秒数,_月初めの年初来の累秒数,_月,_日,_時,_分,_秒) :- _今月に入っての累秒数 is _当年累秒数 - _月初めの年初来の累秒数, '_秒数から _日,_時,_分,_秒を求める'(_今月に入っての累秒数,_日,_時,_分,_秒),!. '_秒数から _日,_時,_分,_秒を求める'(_秒数,_日,_時,_分,_秒) :- 商ならびと剰余ならび(_秒数,[86400,3600,60],[_日_1,_時,_分],[_,_,_秒]), _日 is _日_1 + 1. うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 年間秒(_年,31536000) :- \+(うるう年(_年)),!. 年間秒(_年,31622400) :- うるう年(_年). グリニッヂ時と地域時間の差((32400)). 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 'Zellerの公式で使う曜日を表す値'(_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年月日,_曜日) :- atom(_年月日), atom(_曜日), '曜日'(_年月日,V), !, V = _曜日 . 'Zellerの公式を用いて曜日を得る'(_年月日,_曜日) :- atom(_年月日), var(_曜日), '8桁文字列で表された年月日を整数の年・月・日に分解'(_年月日,_年整数,_月整数,_日整数), 'Zellerの公式を用いて曜日を得る'(_年整数,_月整数,_日整数,_曜日を表す値,_曜日),!. 'Zellerの公式で使う曜日を表す値'(0,'日曜'). 'Zellerの公式で使う曜日を表す値'(1,'月曜'). 'Zellerの公式で使う曜日を表す値'(2,'火曜'). 'Zellerの公式で使う曜日を表す値'(3,'水曜'). 'Zellerの公式で使う曜日を表す値'(4,'木曜'). 'Zellerの公式で使う曜日を表す値'(5,'金曜'). 'Zellerの公式で使う曜日を表す値'(6,'土曜'). '8桁文字列で表された年月日を整数の年・月・日に分解'(_年月日,_年整数,_月整数,_日整数) :- atom_to_term(_年月日,_年月日整数,_), 商ならびと剰余ならび(_年月日整数,[10000,100],[_年整数,_月整数],[_,_日整数]). 商ならびと剰余ならび(_,[],[],[]). 商ならびと剰余ならび(_被除数,[_除数|R2],[_商|R3],[_剰余|R4]) :- 商と剰余(_被除数,_除数,_商,_剰余), 商ならびと剰余ならび(_剰余,R2,R3,R4). 商と剰余(_被除数,_除数,_商,_剰余) :- _商 is _被除数 // _除数, _剰余 is _被除数 mod _除数. findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/908 # # 【 課題 】ttp://www.dotup.org/uploda/www.dotup.org2712711.txt.html # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】3/8 0:00 # 【 Ver  】java version "1.7.0_02-ea" # 【 補足 】3/8が提出期限なので、それまでにどうかお願いいたします。 # # # 専門学校での課題です。 # 課題1については自力でできたのですが、ところどころわからないので、課題1から3をお願いします # # 課題2. # クラスHumanを作りなさい。フィールドは名前、身長、体重の3つとする。 そして、身長と体重が整数でも少数点でも設定できるようにメソッドを作ること。また、初期化時も整数でも少数点でも設定できるようにすること。さらにそのフィールドの値を表示するメソッドも持つこと(表示は小数点表示で統一してよい) # そして、そのクラスHumanをテストするクラスHumanTestを作り、実際にインスタンスを2つ作って、値を設定し、その値を表示するmainメソッドを作りなさい。 # プロジェクト名は「kadai2」、クラス名は「HumanTest」とする。 # データベース構造('Human',1,名前). データベース構造('Human',2,身長). データベース構造('Human',3,体重). フィールドの値を表示する(_関係名) :- フィールド名ならびを得る(_関係名,_フィールド名ならび), 'Human'(_名前,_身長,_体重), 併合する(_フィールド名ならび,[_名前,_身長,_体重],L), writef('Human:: %t=%t, %t=%t, %t=%t\n',L), fail. フィールドの値を表示する(_). '節を定義する'(_関係名) :- フィールド値の入力(_関係名,_フィールド名_フィールド値ならび), フィールド値の切り出し(_フィールド名_フィールド値ならび,_フィールド値ならび), P =.. [_関係名|_フィールド値ならび], assertz(P). フィールド値の切り出し([],[]). フィールド値の切り出し([[_,_フィールド値]|R1],[_フィールド値|R2]) :- フィールド値の切り出し(R1,R2). フィールド名ならびを得る(_関係名,_フィールド名ならび) :- findall([Nth,_フィールド名],( データベース構造(_関係名,Nth,_フィールド名)), L1), sort(L1,L2), フィールド名の切り出し(L2,_フィールド名ならび). フィールド名の切り出し([],[]). フィールド名の切り出し([[_,_フィールド名]|R1],[_フィールド名|R2]) :- フィールド名の切り出し(R1,R2). フィールド値の入力(_関係名,L,_フィールド名_フィールド値ならび) :- findall([_フィールド名,_フィールド値],( member([_,_フィールド名],L), フィールド値の入力(_関係名,_フィールド名,_フィールド値)), _フィールド名_フィールド値ならび). フィールド値の入力(名前,_名前) :- get_line(_名前). フィールド値の入力(身長,_身長) :- get_line(Line), 身長入力検査(Line,_身長),!. フィールド値の入力(体重,_体重) :- get_line(Line), 体重入力検査(Line,_体重),!. フィールド値の入力(_フィールド名,_値) :- フィールド値の入力(_フィールド名,_値). 身長入力検査(Line,_身長) :- atom_to_term(Line,_身長), number(_身長), _身長 > 0,!. 身長入力検査(Line,_身長) :- writef('入力された %t は身長を表しません。再入力をお願いします。\n',[Line]), fail. 体重入力検査(Line,_体重) :- atom_to_term(Line,_体重), number(_体重), _体重 > 0,!. 体重入力検査(Line,_体重) :- writef('入力された %t は体重を表しません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/478 # # [1] 授業単元: プログラミング実習 # [2] 問題文: 構造体の型の成績をqsortを用いて # 点数を高いものから順に並び替えよ # 動作例: # student[1]:76 # student[2]:65 # student[3]:82 #   ・ #   ・ # ------------------------ # 成績順にソートしました。 # ------------------------ # student[3]:82 # student[1]:76 # student[2]:65 #   ・ #   ・ #   ・ # # '成績をqsortを用いて点数を高いものから順に並び替えよ' :- 成績の入力(L1), qsort(L1,L2), 点数の高いものから順に表示(L2,L1). qsort([_軸要素|R1],L2) :- 分割(_軸要素,R1,_軸要素より大きい要素ならび,_軸要素より小さい要素ならび), qsort(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), qsort(_軸要素より小さい要素ならび,_整列した軸要素より小さい要素ならび), append(_整列した軸要素より大きい要素ならび,[_軸要素|_整列した軸要素より小さい要素ならび],L2). 成績の入力(L1) :- findall(_成績,( append(L0,_,_), length([_|L0],Nth), writef('student[%t]:',[Nth]), get_line(Line), ( Line='',!,fail; 入力を成績に変換(Line,_成績))), L1). 分割([],[],[])., 分割(_軸要素,[A|R1],[A|_軸要素より大きい要素ならび],_軸要素より小さい要素ならび) :- A @> _軸要素, 分割(_軸要素,R1,_軸要素より大きい要素ならび,_軸要素より小さい要素ならび),!. 分割(_軸要素,[A|R1],_軸要素より大きい要素ならび,[A|_軸要素より小さい要素ならび]) :- A @< _軸要素, 分割(_軸要素,R1,_軸要素より大きい要素ならび,_軸要素より小さい要素ならび),!. 入力を成績に変換(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績), _成績 >= 0, _成績 =< 100. 点数の高いものから順に表示(L2,L1) :- append(_,[_点数|R],L2), append(L0,[_点数|_],L1), length([_|L0],Nth), writef('student[%t]:%t\n',[Nth,_点数]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/309 # # 1から5の間の自然数を10個入力する。このとき入力された数の個数を棒グラフで次のように表示させる。 # 例: 1の入力が4回、2では2回、3では3回、4では0回、5では1回の場合 # * # * * # * * * # * * * * # 1 2 3 4 5 # という感じです。全くできないので助けてください # '1から5の間の自然数を10個入力する。このとき入力された数の個数を棒グラフで次のように表示させる' :- '1から5の間の自然数を10個入力する'(L), 横方向棒グラフを作る(L,LL1), 転置(LL1,LL2), 棒グラフ表示(LL2). '1から5の間の自然数を10個入力する'(L) :- length(L,10), findall(N,( append(L0,[N|_],L), '1から5の間の自然数を'(L0,N)), L). '1から5の間の自然数を'(L0,_自然数分の星ならび) :- length([_|L0],M), concat_atom([M,'1から5の間の自然数([',M,'/10] : '],_催促文), '1から5の間の自然数を'(_催促文,M,N),!. '1から5の間の自然数を'(_催促文,M,N) :- writef('%t',[_催促文]), get_line(Line), '1から5の間の自然数入力診断'(Line,N),!. '1から5の間の自然数を'(_催促文,M,N) :- '1から5の間の自然数を'(_催促文,M,N). '1から5の間の自然数入力診断'(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 1, N =< 5,!. '1から5の間の自然数入力診断'(Line,N) :- writef('入力された%tからは1から5の間の自然数が得られません\n',[Line]), fail. 横方向棒グラフを作る([],[]). 横方向棒グラフを作る([N|R1],[L|R2]) :- length(L,5), length(L1,N), all(L1,'*'), append(L0,L1,L), all(L0,' '), 横方向棒グラフを作る(R1,R2). 棒グラフ表示(LL) :- append(_,[L|R],LL), concat_atom(L,' ',_行表示文字列), writef('%t\n',[_行表示文字列]), R = [], write('1 2 3 4 5\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/306 # # [1] 授業単元:C # [2] n個の数の総和 # n個の数の総和を求める。総和が限界数を超えた時には計算を打ち切り、その時の総和を表示する。 # 総和の限界(1000). 'n個の数の総和を求め表示する。総和が限界数を超えた時には計算を打ち切り、その時の総和を表示する' :- 'n個の数'(_n,L), 総和の限界(_総和の限界), 総和を求める。総和が限界数を超えた時には計算を打ち切る'(L,_総和の限界,_加算対象数値ならび,_総和), 総和を表示する(_加算対象数値ならび,_総和,_総和の限界). 'n個の数'(_n,L) :- length(L,_n), findall(N,( m個目の数(L,N)), L). m個目の数(L,N) :- append(L0,[N|_],L), length([_|L0],_m個目), swritef(_催促,'%t/%t個目の数字 : ',[_m個目,_n]), 催促付き整数入力(_催促,N). 催促付き整数入力(_催促,N) :- writef('%t : ',[_催促]), get_line(Line), 整数入力検査(Line,N),!. 催促付き整数入力(_催促,N) :- get_integer(_催促,N). 整数入力検査(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数入力検査(Line,N) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '総和を求める。総和が限界数を超えた時には計算を打ち切る'(L,_総和の限界,_加算対象数値ならび,_総和) :- '総和を求める。総和が限界数を超えた時には計算を打ち切る'(L,_総和の限界,_加算対象数値ならび,0,_総和). '総和を求める。総和が限界数を超えた時には計算を打ち切る'([],_総和の限界,[],_総和,_総和). '総和を求める。総和が限界数を超えた時には計算を打ち切る'(_,_総和の限界,[],_総和,_総和) :- _総和 > _総和の限界,!. '総和を求める。総和が限界数を超えた時には計算を打ち切る'([N|R1],_総和の限界,[N|R2],_総和1,_総和) :- _総和2 is _総和1 + N, '総和を求める。総和が限界数を超えた時には計算を打ち切る'(R1,_総和の限界,R2,_総和2,_総和). 総和を表示する(_加算対象数値ならび,_総和,_総和の限界) :- _総和 > _総和の限界, concat_atom(_加算対象数値ならび,'+',_加算対象項文字列), writef('(総和の限界=%t) %t=%t\n',[_総和の限界,_加算対象項文字列,_総和]),!. 総和を表示する(_加算対象数値ならび,_総和,_総和の限界) :- concat_atom(_加算対象数値ならび,'+',_加算対象項文字列), writef('%t=%t\n',[_加算対象項文字列_総和]),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/167 # # [1] 情報科学入門 # [2] (1)1から1000までの間に、3と7の倍数の値がいくつ含まれているのか求めるプログラムを書け。 #    (2)キーボードから西暦年を入力し、その年がサッカーワールドカップ開催年かどうかを判定するプログラムを作成せよ。 # 第一回ワールドカップ開催年(1930). 前回ワールドカップ開催年(2010). 'キーボードから西暦年を入力し、その年がサッカーワールドカップ開催年かどうかを判定する' :- 第一回ワールドカップ開催年(_第一回ワールドカップ開催年), 前回ワールドカップ開催年(_前回ワールドカップ開催年), キーボードから西暦年を入力し(_西暦), その年がサッカーワールドカップ開催年かどうかを判定する(_西暦,_第一回ワールドカップ開催年,_前回ワールとカップ開催年,_判定), writef('入力された %t年は%t。\n',[_西暦,_判定]). キーボードから西暦年を入力し(_西暦) :- write('西暦年を入力して下さい : '), get_line(Line), 西暦年入力検査(Line,_西暦年),!. キーボードから西暦年を入力し(_西暦) :- キーボードから西暦年を入力し(_西暦). 西暦年入力検査(Line,_西暦年) :- atom_to_term(Line,_西暦年,_), integer(_西暦年),!. 西暦年入力検査(Line,_西暦年) :- writef('入力された %t は整数でありません。整数を入力して下さい。\n',[Line]), fail. その年がサッカーワールドカップ開催年かどうかを判定する(_西暦,_第一回ワールドカップ開催年,_,第一回ワールドカップが開催されるより前です) :- _西暦 < _第一回ワールドカップ開催年,!. その年がサッカーワールドカップ開催年かどうかを判定する(_西暦,_第一回ワールドカップ開催年,_,開催年に当たりますがまだ開催されていません) :- _西暦 > _前回ワールドカップ開催年, 0 is (_西暦 - _第一回ワールドカップ開催年) mod 4,!. その年がサッカーワールドカップ開催年かどうかを判定する(_西暦,_第一回ワールドカップ開催年,_前回ワールドカップ開催年,開催される予定のない年です) :- _西暦 > _前回ワールドカップ開催年, 0 is (_西暦 - _第一回ワールドカップ開催年) mod 4,!. その年がサッカーワールドカップ開催年かどうかを判定する(_西暦,_第一回ワールドカップ開催年,_前回ワールドカップ開催年,開催されました) :- _西暦 =< _前回ワールドカップ開催年, 0 is (_西暦 - _第一回ワールドカップ開催年) mod 4,!. その年がサッカーワールドカップ開催年かどうかを判定する(_西暦,_第一回ワールドカップ開催年,_前回ワールドカップ開催年,開催されていません) :- _西暦 =< _前回ワールドカップ開催年, \+(0 is (_西暦 - _第一回ワールドカップ開催年) mod 4),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/151 # # [1] 授業単元:プログラミング演習 # [2]複数の人の名前と体重、身長を質問してBMI値を計算して、「名前、体重、身長、BMI値、判定結果(やせている、普通、肥満、等)」をファイルに保存しなさい。 # 人数は最初に質問して入力させること。 # 実行の結果作成されたファイルは、メモ帳などで開いて内容を確認すること。 # BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。 # 身長と体重は小数点以下まで扱えるものとする。 # # BMI値=体重(kg)/(身長(m))^2 # '複数の人の名前と体重、身長を質問してBMI値を計算して、「名前、体重、身長、BMI値、判定結果(やせている、普通、肥満、等)」をファイルに保存しなさい。 人数は最初に質問して入力させること。'(_保存ファイル名) :- 人数は質問して入力(_人数), '複数の人の名前と体重、身長を質問して'(_人数,_名前_身長_体重ならび), 'BMI値を計算して、「名前、体重、身長、BMI値、判定結果(やせている、普通、肥満、等)」をファイルに保存'(_保存ファイル名,_名前_身長_体重ならび). 人数は質問して入力(_人数) :- write('対象人数を入力して下さい : '), get_integer(_人数). '複数の人の名前と体重、身長を質問して'(_人数,_名前_身長_体重ならび) :- length(_名前_身長_体重ならび,_人数), findall([_名前,_身長,_体重],( '名前・身長・体重を得る'(_名前,_身長,_体重), append(_,[[_名前,_身長,_体重]|_],_名前_身長_体重ならび)), _名前_身長_体重ならび). '名前・身長・体重を得る'(_名前,_身長,_体重) :- 名前を得る(_名前), 身長を得る(_身長), 体重を得る(_体重). 名前を得る(_名前) :- write('名前を入力して下さい : '), get_line(_名前). 身長を得る(_身長) :- write('身長を入力して下さい : '), get_line(Line), 身長入力診断(Line,_身長),!. 身長を得る(_身長) :- 身長を得る(_身長). 身長入力診断(Line,_身長) :- atom_to_term(Line,_身長,_), number(_身長), _身長 > 0, _身長 =< 240.0,!. 身長入力診断(Line,_) :- writef('入力された %t からは適切な身長が得られませんでした。再入力をお願いします。\n',[Line]), fail. 体重を得る(_体重) :- write('体重を入力して下さい : '), get_line(Line), 体重入力診断(Line,_体重),!. 体重を得る(_体重) :- 体重を得る(_体重). 体重入力診断(Line,_体重) :- atom_to_term(Line,_体重,_), number(_体重), _体重 > 0, _体重 =< 250.0,!. 体重入力診断(Line,_体重) :- writef('入力された %t からは適切な体重が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'BMI値を計算して、「名前、体重、身長、BMI値、判定結果(やせている、普通、肥満、等)」をファイルに保存'(_保存ファイル名,_名前_身長_体重ならび) :- open(_保存ファイル名,write,Outstream), append(_,[[_名前,_身長,_体重]|R],_名前_身長_体重ならび), 'BMI値の計算判定'(_身長,_体重,_BMI値,_BMI値判定), writef(Outstream,'%t,%t,%t,%t,%t\n',[_名前,_身長,_体重,_BMI値,_BMI値判定]), R = [], close(Outstram). 'BMI値の計算判定'(_身長,_体重,_BMI値,_BMI値判定) :- 'BMI値の計算'(_身長,_体重,_BMI値), 'BMI値の判定'(_BMI値,_BMI値の判定). 'BMI値の計算'(_身長,_体重,_BMI値) :- _身長 > 3, _BMI値 is _体重 / ((_身長 / 100) ^ 2). 'BMI値の計算'(_身長,_体重,_BMI値) :- _身長 =< 3, _BMI値 is _体重 / (_身長 ^ 2). 'BMI値の判定'(_BMI値,_BMI値の判定) :- 'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,_BMI値の判定). 'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,やせています) :- 'BMI値が20未満なら'(_BMI値),!. 'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,普通です) :- 'BMI値が20〜24未満なら'(_BMI値),!. 'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,やや肥満です) :- 'BMI値が24〜26.5未満なら'(_BMI値),!. 'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,肥満です) :- 'BMI値が26.5以上なら'(_BMI値),!. 'BMI値が20未満なら'(_BMI値) :- _BMI値 < 20.0. 'BMI値が20〜24未満なら'(_BMI値) :- _BMI値 >= 20.0, _BMI値 < 24. 'BMI値が24〜26.5未満なら'(_BMI値) :- _BMI値 >= 24.0, _BMI値 < 26.5. 'BMI値が26.5以上なら'(_BMI値) :- _BMI値 >= 26.5. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/588 # # [1] プログラミング # [2] 営業キロを入力したら料金を表示するプログラムを作りなさい。なお、営業キロは小数点以下はすべて切り上げで計算されます。 #   営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。 # [3] Linux C言語 # [4] 期限:2012年1月25日 # [5] 構造体の使用は無し、運賃と距離は配列を使用する。 # # 一応途中まで作ってみましたが、dis[0]のときfare[0]の値は出ますがそれ以外が出ません。。。助けてください。 # # #include<stdio.h> # int main(void){ # int fare[100]; # int dis[100]; # int j; # float n; # # fare[0]=140; fare[1]=180; fare[2]=190; # fare[3]=230; fare[4]=320; fare[5]=400; # fare[6]=480; fare[7]=570; fare[8]=650; # fare[9]=710; fare[10]=820; fare[11]=950; # fare[12]=1110; fare[13]=1280; fare[14]=1450; # fare[15]=1620; fare[16]=1890; fare[17]=2210; # fare[18]=2520; fare[19]=2940; fare[20]=3260; # fare[21]=3570; fare[22]=3890; fare[23]=4310; # fare[24]=4620; fare[25]=4940; fare[26]=5250; # fare[27]=5460; fare[28]=5780; fare[29]=6090; # fare[30]=6300; fare[31]=6620; fare[32]=6830; # fare[33]=7140; fare[34]=7350; fare[35]=7670; # fare[36]=7980; fare[37]=8190; fare[38]=8510; # fare[39]=8720; fare[40]=9030; fare[41]=9350; # fare[42]=9560; fare[43]=9870; fare[44]=10190; # fare[45]=10500; fare[46]=10820; fare[47]=11030; # fare[48]=11340; fare[49]=11600; fare[50]=11970; # fare[51]=12290; fare[52]=12600; fare[53]=12810; # fare[54]=13130; fare[55]=13440; fare[56]=13760; # fare[57]=14070; fare[58]=14390; fare[59]=14600; # fare[60]=14910; # # dis[0]=3; dis[1]=6; dis[2]=10; # dis[3]=15; dis[4]=20; dis[5]=25; # dis[6]=30; dis[7]=35; dis[8]=40; # dis[9]=45; dis[10]=50; dis[11]=60; # dis[12]=70; dis[13]=80; dis[14]=90; # dis[15]=100; dis[16]=120; dis[17]=140; # dis[18]=160; dis[19]=180; dis[20]=200; # dis[21]=220; dis[22]=240; dis[24]=260; # dis[24]=280; dis[25]=300; dis[26]=320; # dis[27]=340; dis[28]=360; dis[29]=380; # dis[30]=400; dis[31]=420; dis[32]=440; # dis[33]=460; dis[34]=480; dis[35]=500; # dis[36]=520; dis[37]=540; dis[38]=560; # dis[39]=580; dis[40]=600; dis[41]=640; # dis[42]=680; dis[43]=720; dis[44]=760; # dis[45]=800; dis[46]=840; dis[47]=880; # dis[48]=920; dis[49]=960; dis[50]=1000; # dis[51]=1040; dis[52]=1080; dis[53]=1120; # dis[54]=1160; dis[55]=1200; dis[56]=1240; # dis[57]=1280; dis[58]=1320; dis[59]=1360; # dis[60]=1400; # 営業キロならび([3,6,10,15,20,25,30,35,40,45,50,60,70,80,90,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380,400,420,440,460,480,500,520,540,560,580,600,640,680,720,760,800,840,880,920,960,1000,1040,1080,1120,1160,1200,1240,1280,1320,1360,1400]). 料金ならび([140,180,190,230,320,400,480,570,650,710,820,950,1110,1280,1450,1620,1890,2210,2520,2940,3260,3570,3890,4310,4620,4940,5250,5460,5780,6090,6300,6620,6830,7140,7350,7670,7980,8190,8510,8720,9030,9350,9560,9870,10190,10500,10820,11030,11340,11600,11970,12290,12600,12810,13130,13440,13760,14070,14390,14600]). '営業キロを入力したら料金を表示するプログラムを作りなさい。 なお、営業キロは小数点以下はすべて切り上げで計算されます。営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。' :- 営業キロならびは昇順である(_営業キロならび), 料金ならびは昇順である(_料金ならび), 営業キロはキーボードからの入力とし(_営業キロ), 料金を表示する(_営業キロ,_営業キロならび,_料金ならび). 営業キロはキーボードからの入力とし(_営業キロ) :- write('営業キロを入力して下さい : '), get_line(Line), 営業キロ入力診断(Line,_営業キロ),!. 営業キロはキーボードからの入力とし(_営業キロ) :- 営業キロはキーボードからの入力とし(_営業キロ). 営業キロ入力診断(Line,_営業キロ) :- atom_to_term(Line,_営業キロ), integer(_営業キロ), _営業キロ > 0,!. 営業キロ入力診断(Line,_営業キロ) :- writef('入力された %t から適切な営業キロが得られませんでした。再入力をお願いしす。\n',[Line]), fail. 料金を表示する(_入力営業キロ,_営業キロならび,_料金ならび) :- 料金を計算する(_入力営業キロ,_営業キロならび,_料金ならび,_料金), writef('%t 円です。\n',[_料金]). 料金を計算する(_入力営業キロ,_営業キロならび,_料金ならび,14910) :- _入力営業キロ >= 1400,!. 料金を計算する(_入力営業キロ,[_営業キロ|_],[_料金|_],_料金) :- _営業キロ > _入力営業キロ,!. 料金を計算する(_入力営業キロ,[_|R1],[_|R2],_料金) :- 料金を計算する(_入力営業キロ,R1,R2,_料金). 営業キロならびは昇順である(_営業キロならび) :- 営業キロならび(_営業キロならび_1), 営業キロならびは昇順である(_営業キロならび_1,_営業キロならび). 営業キロならびは昇順である(_営業キロならび,_営業キロならび) :- 昇順検査(_営業キロならび),!. 営業キロならびは昇順である(_営業キロならび_1,_営業キロならび) :- 整列(_営業キロならび_1,_営業キロならび). 料金ならびは昇順である(_料金ならび) :- 料金ならびは昇順である(_料金ならび_1), 料金ならびは昇順である(_料金ならび_1,_料金ならび). 料金ならびは昇順である(_料金ならび,_料金ならび) :- 昇順検査(_料金ならび),!. 料金ならびは昇順である(_料金ならび_1,_料金ならび) :- 整列(_料金ならび_1,_料金ならび),!. 昇順検査([_]) :- !. 昇順検査([A,B|R]) :- B @>= A, 昇順検査([B|R]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/588 # # [1] プログラミング # [2] 営業キロを入力したら料金を表示するプログラムを作りなさい。なお、営業キロは小数点以下はすべて切り上げで計算されます。 #   営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。 # [3] Linux C言語 # [4] 期限:2012年1月25日 # [5] 構造体の使用は無し、運賃と距離は配列を使用する。 # # 一応途中まで作ってみましたが、dis[0]のときfare[0]の値は出ますがそれ以外が出ません。。。助けてください。 # # #include<stdio.h> # int main(void){ # int fare[100]; # int dis[100]; # int j; # float n; # # fare[0]=140; fare[1]=180; fare[2]=190; # fare[3]=230; fare[4]=320; fare[5]=400; # fare[6]=480; fare[7]=570; fare[8]=650; # fare[9]=710; fare[10]=820; fare[11]=950; # fare[12]=1110; fare[13]=1280; fare[14]=1450; # fare[15]=1620; fare[16]=1890; fare[17]=2210; # fare[18]=2520; fare[19]=2940; fare[20]=3260; # fare[21]=3570; fare[22]=3890; fare[23]=4310; # fare[24]=4620; fare[25]=4940; fare[26]=5250; # fare[27]=5460; fare[28]=5780; fare[29]=6090; # fare[30]=6300; fare[31]=6620; fare[32]=6830; # fare[33]=7140; fare[34]=7350; fare[35]=7670; # fare[36]=7980; fare[37]=8190; fare[38]=8510; # fare[39]=8720; fare[40]=9030; fare[41]=9350; # fare[42]=9560; fare[43]=9870; fare[44]=10190; # fare[45]=10500; fare[46]=10820; fare[47]=11030; # fare[48]=11340; fare[49]=11600; fare[50]=11970; # fare[51]=12290; fare[52]=12600; fare[53]=12810; # fare[54]=13130; fare[55]=13440; fare[56]=13760; # fare[57]=14070; fare[58]=14390; fare[59]=14600; # fare[60]=14910; # # dis[0]=3; dis[1]=6; dis[2]=10; # dis[3]=15; dis[4]=20; dis[5]=25; # dis[6]=30; dis[7]=35; dis[8]=40; # dis[9]=45; dis[10]=50; dis[11]=60; # dis[12]=70; dis[13]=80; dis[14]=90; # dis[15]=100; dis[16]=120; dis[17]=140; # dis[18]=160; dis[19]=180; dis[20]=200; # dis[21]=220; dis[22]=240; dis[24]=260; # dis[24]=280; dis[25]=300; dis[26]=320; # dis[27]=340; dis[28]=360; dis[29]=380; # dis[30]=400; dis[31]=420; dis[32]=440; # dis[33]=460; dis[34]=480; dis[35]=500; # dis[36]=520; dis[37]=540; dis[38]=560; # dis[39]=580; dis[40]=600; dis[41]=640; # dis[42]=680; dis[43]=720; dis[44]=760; # dis[45]=800; dis[46]=840; dis[47]=880; # dis[48]=920; dis[49]=960; dis[50]=1000; # dis[51]=1040; dis[52]=1080; dis[53]=1120; # dis[54]=1160; dis[55]=1200; dis[56]=1240; # dis[57]=1280; dis[58]=1320; dis[59]=1360; # dis[60]=1400; # 料金表([[3,140],[6,180],[10,190],[15,230],[20,320],[25,400],[30,480],[35,570],[40,650],[45,710],[50,820],[60,950],[70,1110],[80,1280],[90,1450],[100,1620],[120,1890],[140,2210],[160,2520],[180,2940],[200,3260],[220,3570],[240,3890],[260,4310],[280,4620],[300,4940],[320,5250],[340,5460],[360,5780],[380,6090],[400,6300],[420,6620],[440,6830],[460,7140],[480,7350],[500,7670],[520,7980],[540,8190],[560,8510],[580,8720],[600,9030],[640,9350],[680,9560],[720,9870],[760,10190],[800,10500],[840,10820],[880,11030],[920,11340],[960,11600],[1000,11970],[1040,12290],[1080,12600],[1120,12810],[1160,13130],[1200,13440],[1240,13760],[1280,14070],[1320,14390],[1360,14600]]). '営業キロを入力したら料金を表示するプログラムを作りなさい。 なお、営業キロは小数点以下はすべて切り上げで計算されます。営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。' :- 料金表は昇順にならんでいる(_料金表), 営業キロはキーボードからの入力とし(_営業キロ), 料金を表示する'(_営業キロ,_料金表). 料金表は昇順にならんでいる(_料金表) :- 料金表(_料金表), 昇順検査(_料金表),!. 料金表は昇順にならんでいる(_料金表) :- 料金表(_料金表_1), 整列(_料金表_1,_料金表). 営業キロはキーボードからの入力とし(_営業キロ) :- write('営業キロを入力して下さい : '), get_line(Line), 営業キロ入力診断(Line,_営業キロ),!. 営業キロはキーボードからの入力とし(_営業キロ) :- '営業キロはキーボードからの入力とし'(_営業キロ). 営業キロ入力診断(Line,_営業キロ) :- atom_to_term(Line,_営業キロ), integer(_営業キロ), _営業キロ > 0,!. 営業キロ入力診断(Line,_営業キロ) :- writef('入力された %t から適切な営業キロが得られませんでした。再入力をお願いしす。\n',[Line]), fail. 料金を表示する(_営業キロ,_料金表) :- 料金を計算する(_入力営業キロ,_料金表,_料金), writef('%t 円です。\n',[_料金]). 料金を計算する(_入力営業キロ,_,14910) :- _入力営業キロ >= 1400,!. 料金を計算する(_入力営業キロ,[[_営業キロ,_料金]|_],_料金) :- _営業キロ > _入力営業キロ,!. 料金を計算する(_入力営業キロ,[_|R],_料金) :- 料金を計算する(_入力営業キロ,R,_料金). 昇順検査([_]) :- !. 昇順検査([A,B|R]) :- B @>= A, 昇順検査([B|R]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/588 # # [1] プログラミング # [2] 営業キロを入力したら料金を表示するプログラムを作りなさい。なお、営業キロは小数点以下はすべて切り上げで計算されます。 #   営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。 # [3] Linux C言語 # [4] 期限:2012年1月25日 # [5] 構造体の使用は無し、運賃と距離は配列を使用する。 # # 一応途中まで作ってみましたが、dis[0]のときfare[0]の値は出ますがそれ以外が出ません。。。助けてください。 # # #include<stdio.h> # int main(void){ # int fare[100]; # int dis[100]; # int j; # float n; # # fare[0]=140; fare[1]=180; fare[2]=190; # fare[3]=230; fare[4]=320; fare[5]=400; # fare[6]=480; fare[7]=570; fare[8]=650; # fare[9]=710; fare[10]=820; fare[11]=950; # fare[12]=1110; fare[13]=1280; fare[14]=1450; # fare[15]=1620; fare[16]=1890; fare[17]=2210; # fare[18]=2520; fare[19]=2940; fare[20]=3260; # fare[21]=3570; fare[22]=3890; fare[23]=4310; # fare[24]=4620; fare[25]=4940; fare[26]=5250; # fare[27]=5460; fare[28]=5780; fare[29]=6090; # fare[30]=6300; fare[31]=6620; fare[32]=6830; # fare[33]=7140; fare[34]=7350; fare[35]=7670; # fare[36]=7980; fare[37]=8190; fare[38]=8510; # fare[39]=8720; fare[40]=9030; fare[41]=9350; # fare[42]=9560; fare[43]=9870; fare[44]=10190; # fare[45]=10500; fare[46]=10820; fare[47]=11030; # fare[48]=11340; fare[49]=11600; fare[50]=11970; # fare[51]=12290; fare[52]=12600; fare[53]=12810; # fare[54]=13130; fare[55]=13440; fare[56]=13760; # fare[57]=14070; fare[58]=14390; fare[59]=14600; # fare[60]=14910; # # dis[0]=3; dis[1]=6; dis[2]=10; # dis[3]=15; dis[4]=20; dis[5]=25; # dis[6]=30; dis[7]=35; dis[8]=40; # dis[9]=45; dis[10]=50; dis[11]=60; # dis[12]=70; dis[13]=80; dis[14]=90; # dis[15]=100; dis[16]=120; dis[17]=140; # dis[18]=160; dis[19]=180; dis[20]=200; # dis[21]=220; dis[22]=240; dis[24]=260; # dis[24]=280; dis[25]=300; dis[26]=320; # dis[27]=340; dis[28]=360; dis[29]=380; # dis[30]=400; dis[31]=420; dis[32]=440; # dis[33]=460; dis[34]=480; dis[35]=500; # dis[36]=520; dis[37]=540; dis[38]=560; # dis[39]=580; dis[40]=600; dis[41]=640; # dis[42]=680; dis[43]=720; dis[44]=760; # dis[45]=800; dis[46]=840; dis[47]=880; # dis[48]=920; dis[49]=960; dis[50]=1000; # dis[51]=1040; dis[52]=1080; dis[53]=1120; # dis[54]=1160; dis[55]=1200; dis[56]=1240; # dis[57]=1280; dis[58]=1320; dis[59]=1360; # dis[60]=1400; # 料金(3,140). 料金(6,180). 料金(10,190). 料金(15,230). 料金(20,320). 料金(25,400). 料金(30,480). 料金(35,570). 料金(40,650). 料金(45,710). 料金(50,820). 料金(60,950). 料金(70,1110). 料金(80,1280). 料金(90,1450). 料金(100,1620). 料金(120,1890). 料金(140,2210). 料金(160,2520). 料金(180,2940). 料金(200,3260). 料金(220,3570). 料金(240,3890). 料金(260,4310). 料金(280,4620). 料金(300,4940). 料金(320,5250). 料金(340,5460). 料金(360,5780). 料金(380,6090). 料金(400,6300). 料金(420,6620). 料金(440,6830). 料金(460,7140). 料金(480,7350). 料金(500,7670). 料金(520,7980). 料金(540,8190). 料金(560,8510). 料金(580,8720). 料金(600,9030). 料金(640,9350). 料金(680,9560). 料金(720,9870). 料金(760,10190). 料金(800,10500). 料金(840,10820). 料金(880,11030). 料金(920,11340). 料金(960,11600). 料金(1000,11970). 料金(1040,12290). 料金(1080,12600). 料金(1120,12810). 料金(1160,13130). 料金(1200,13440). 料金(1240,13760). 料金(1280,14070). 料金(1320,14390). 料金(1360,14600). '営業キロを入力したら料金を表示するプログラムを作りなさい。 なお、営業キロは小数点以下はすべて切り上げで計算されます。営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。' :- '営業キロはキーボードからの入力とし'(_営業キロ), '料金を表示する'(_営業キロ,_料金). '営業キロはキーボードからの入力とし'(_営業キロ) :- write('営業キロを入力して下さい : '), get_line(Line), 営業キロ入力診断(Line,_営業キロ),!. '営業キロはキーボードからの入力とし'(_営業キロ) :- '営業キロはキーボードからの入力とし'(_営業キロ). 営業キロ入力診断(Line,_営業キロ) :- atom_to_term(Line,_営業キロ), integer(_営業キロ), _営業キロ > 0,!. 営業キロ入力診断(Line,_営業キロ) :- writef('入力された %t から適切な営業キロが得られませんでした。再入力をお願いしす。\n',[Line]), fail. 料金を表示する(_営業キロ,_料金) :- 料金を計算する(_入力営業キロ,_料金), writef('%t 円です。\n',[_料金]). 料金を計算する(_入力営業キロ,14910) :- _入力営業キロ >= 1400,!. 料金を計算する(_入力営業キロ,_料金) :- findall([_営業キロ,_金額],( 料金(_営業キロ,_料金), _入力営業キロ < _営業キロ), LL), min(LL,[_営業キロ,_料金]). % 料金/2述語の節の順序は必ずしも営業キロ数の小さい順であるとは % 言えない。それでこういうプログラムとなる。 % 小さい順だとするためには、最初にその検査が必要だろう。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/526 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):このスレの../test/read.cgi/tech/1325685876/464と同じ質問ですhttp://ime.nu/2ch.ac.la/read.php/tech/1201083176/ # # 「8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い、 # それらのデータをクイックソートし身長の低い順に氏名、学籍番号、身長を # 画面に出力するプログラムを作成せよ」という問題がでました。 '8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い、それらのデータをクイックソートし身長の低い順に氏名、学籍番号、身長を画面に出力するプログラムを作成せよ' :- '8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い'(_入力されたならび), '整列の鍵項目(身長)を先頭に付加する'(_入力されたならび,_鍵の付加されたならび), 整列(_鍵の付加されたならび,_整列されたならび), '身長の低い順に氏名、学籍番号、身長を画面に出力する'(_整列されたならび). '8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い'(_入力されたならび) :- length(_入力されたならび,8), findall([_氏名,_学籍番号,_身長],( append(_,[L|_],_入力されたならび), '氏名・学籍番号・身長を得る'(_氏名,_学籍番号,_身長)), _入力されたならび). '氏名・学籍番号・身長を得る'(_氏名,_学籍番号,_身長) :- 催促付き入力('氏名を入力してください : ',_氏名), 催促付き入力('学籍番号を入力してください : ',_学籍番号), 催促付き入力('身長を入力してください : ',_身長文字列), atom_to_term(_身長文字列,_身長,_). '整列の鍵項目(身長)を先頭に付加する'(_入力されたならび,_鍵の付加されたならび) :- findall([_身長,_氏名,_学籍番号,_身長],( member([_氏名,_学籍番号,_身長],_入力されたならび)), _鍵の付加されたならび). 整列([],[]). 整列([_軸要素|R1],_整列されたならび) :- 分割(_軸要素,R1,_軸要素より小さい要素ならび,_軸要素と等しいか大きい要素ならび), 整列(_軸要素より小さい要素ならび,_整列した軸要素より小さい要素ならび), 整列(_軸要素と等しいか大きい要素ならび,_整列した軸要素と等しいか大きい要素ならび), append(_整列した軸要素より小さい要素ならび,[_軸要素|_整列した軸要素と等しいか大きい要素ならび],_整列されたならび). 分割(_,[],[],[]). 分割(_軸要素,[A|R1],[A|R2],R3) :- A @< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[A|R1],R2,[A|R3]) :- A @>= _軸要素, 分割(_軸要素,R1,R2,R3). '身長の低い順に氏名、学籍番号、身長を画面に出力する'(_整列されたならび) :- append(_,[[_身長,_氏名,_学籍番号,_身長]|R],_整列されたならび), writef('%t, %t, %t\n',[_氏名,_学籍番号,_身長]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/194 # # [1] 授業単元:C言語入門 # [2] 問題文: http://ime.nu/codepad.org/hsA7qgRQ # # 課題1 # # ロボットへコマンド(数字)を送ることを考える.コマンドは,送信した数字が2の倍数か,3の倍数か,5の倍数かによって次の動作をするものとロボットに解釈させる. # 2の倍数の時: Up (腕を上げる) # 3の倍数の時: Go (前進する) # 5の倍数の時: !! (電撃する) # マイナスの数: Error(エラー) # それ以外の時: No (何もしない)入力されたコマンドによっては,例えば15のように3の倍数でもあり,5の倍数でもあるような数がある.その場合には両方の動作を同時に実行するものとする.このようなコマンド解釈プログラムを作成せよ. # このプログラムでは,送信される数字は前回同様にキーボードから読み込む.ただし整数(int)として入力するものとする. # そしてコマンドの内容次第で,ロボットの動作をUp, Go, !!として画面に表示すること.同時に実行する場合には,必ずUp,Go,!!の順番に表示するものとする. # # 実行例 # 実行開始 # 15 ←コマンドとしてキーボードから15を入力 # Go!! ←ロボットの動作として結果を表示.(前進と電撃を同時に実行) # # # ヒントとして,出力としては次のようなものが考えられる. # Up # UpGo # UpGo!! # Go # Go!! # !! # Error # No # 'ロボットへコマンド(数字)を送る'(_ロボット) :- write('コマンド(整数)を入力してください\n'), コマンドを得る(_コマンド), ロボットへコマンドを送る(_ロボット,_コマンド). コマンドを得る(_コマンド) :- get_line(Line), コマンド診断(Line,_コマンド). コマンドを得る(_コマンド) :- コマンドを得る(_コマンド). コマンド診断(Line,_コマンド) :- atom_to_term(Line,_コマンド), integer(_コマンド),!. ロボットへコマンドを送る(_ロボット,0) :- !. ロボットへコマンドを送る(_ロボット,_コマンド) :- _ロボット :: ロボット(_コマンド), fail. %%%%%% ロボット (サーバー) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ロボット(_コマンド) :- コマンドを解釈して実行する(_コマンド), fail. ロボット(_). コマンドを解釈して実行する(_コマンド) :- '2の倍数の時: Up (腕を上げる)'(_コマンド). コマンドを解釈して実行する(_コマンド) :- '3の倍数の時: Go (前進する)'(_コマンド). コマンドを解釈して実行する(_コマンド) :- '5の倍数の時: !! (電撃する)'(_コマンド). コマンドを解釈して実行する(_コマンド) :- 'マイナスの数: Error(エラー)'(_コマンド). コマンドを解釈して実行する(_コマンド) :- 'それ以外の時: No (何もしない)'(_コマンド). '2の倍数の時: Up (腕を上げる)'(N) :- '2の倍数の時'(N), 腕を上げる. '3の倍数の時: Go (前進する)'(N) :- '3の倍数の時'(N), 前進する. '5の倍数の時: !! (電撃する)'(N) :- '5の倍数の時'(N), 電撃する. 'マイナスの数: Error(エラー)'(N) :- 'マイナスの数'(N), エラー. 'それ以外の時: No (何もしない)'(_). '2の倍数の時'(N) :- 0 is N mod 2. '3の倍数の時'(N) :- 0 is N mod 3. '5の倍数の時'(N) :- 0 is N mod 5. 'マイナスの数'(N) :- N < 0. 腕を上げる :- write('Up'). 前進する :- write('Go'). 電撃する :- write('!!'). エラー :- write('Error'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/194 # # [1] 授業単元:C言語入門 # [2] 問題文: http://ime.nu/codepad.org/hsA7qgRQ # # 課題2 # # 物体が自由落下するとき初速度0とすると時刻t, そのtの瞬間の速度v, t秒間の落下距離yの関係は次のようになる. # v = gt # y = gt2/2.0 # ただしgは重力加速度で9.8m/s2とする. # 最初に目的落下距離ylimitをキーボードから入力するようにしておく.そして0.1秒おきのvとyを計算して目的落下距離を越えた時点の速度vを表示せよ.なお目的落下距離をマイナスの数としたときはerrorと表示すること. # # 実行例 # 実行開始 # 100.0 ←キーボードから100m落下させたいと入力 # 45.080000 ←100m落下したときの速度として毎秒45mを表示 # # '最初に目的落下距離ylimitをキーボードから入力するようにしておく.そして0.1秒おきのvとyを計算して目的落下距離を越えた時点の速度vを表示せよ' :- '最初に目的落下距離ylimitをキーボードから入力するようにしておく'(_目的落下距離), 'そして0.1秒おきのvとyを計算して目的落下距離を越えた時点の速度vを表示せよ'(0.0,0.0,_目的落下距離,_速度), writef('目的な落下距離を越えた時点の速度Vは %t です。\n',[_速度]). '最初に目的落下距離ylimitをキーボードから入力するようにしておく'(_目的落下距離) :- writef('目的落下距離を入力して下さい : '), get_line(Line), 目的落下距離入力診断(Line,_目的落下距離),!. '最初に目的落下距離ylimitをキーボードから入力するようにしておく'(_目的落下距離) :- '最初に目的落下距離ylimitをキーボードから入力するようにしておく'(_目的落下距離). 目的落下距離入力診断(Line,_目的落下距離) :- atom_to_term(Line,_目的落下距離,_), number(_目的落下距離), _目的落下距離 >= 0.0,!. 目的落下距離入力診断(Line,_目的落下距離) :- write('error\n'), fail. 'そして0.1秒おきのvとyを計算して目的落下距離を越えた時点の速度vを表示せよ'(_落下距離,_目的落下距離,_経過秒数,_速度) :- _落下距離 > _目的落下距離, _速度 is 9.8 * _経過秒数,!. 'そして0.1秒おきのvとyを計算して目的落下距離を越えた時点の速度vを表示せよ'(_,_目的落下距離,_経過秒数_1,_速度_1,_速度) :- _落下距離 =< _目的落下距離, _落下距離_2 is 9.8 * (_経過秒数_1 * _経過秒数_1) / 2.0, _経過秒数_2 is _経過秒数_1 + 0.1, 'そして0.1秒おきのvとyを計算して目的落下距離を越えた時点の速度vを表示せよ'(_落下距離_2,_目的落下距離,_経過秒数_2,_速度). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/194 # # [1] 授業単元:C言語入門 # [2] 問題文: http://ime.nu/codepad.org/hsA7qgRQ # 課題3 # # キーボードからintの整数を入力する.入力された整数と,整数9699690との最大公約数を表示するプログラムを作成せよ.ただし整数9699690よりも大きい数が入力された場合はerrorと表示すること.マイナスの数を入力された場合は正の数として計算すること. # また,次の関数プロトタイプにしたがう自作の関数gcdを使うようにプログラムすること # # int gcd(int m, int x); //m>xとしてmとxの最大公約数を求めて返す関数 # このgcdを使うとmain関数は次のようにできる. # # int main(void) # { # int m,n,g; # m=9699690; # scanf("%d", &n); # g = gcd( m, n); # printf("%d\n",g); # } # 関数gcdの本体定義部分を自分で追加して全体としてプログラムを完成させること. # # 実行例 # 実行開始 # 60 ←キーボードから60と入力 # 30 ←9699690との最大公約数30を表示 # # ヒント # 最大公約数を求める有名なアルゴリズムとして,ユークリッドの互除法がある.二つの整数a,b(a>bとする)の最大公約数dを求める. # # ?Step 1. もしb=0であればd=|a|として終了 # ?Step 2. aをbで割った余りをrとする # ?Step 3. a=b, b=rとして、Step 1.へ # # # 'キーボードからintの整数を入力する.入力された整数と,整数9699690との最大公約数を表示する' :- 整数を入力する(_整数), 最大公約数をユークリッドの互除法で求める(9699690,_整数,_最大公約数), writef('最大公約数は %t です\n',[_最大公約数]). 整数を入力する(_整数) :- write('整数を入力して下さい : ), get_line(Line), 整数を入力する(Line,_整数),!. 整数を入力する(_整数) :- 整数を入力する(_整数). 整数を入力する(Line,_整数) :- atom_to_term(Line,_整数_1,_), integer(_整数), 整数入力検査(_整数_1,_整数),!. 整数を入力する(Line,_) :- writef('入力された %t からは適切な整数が得られません。再入力をお願いします\n',[Line]), fail. 整数入力検査(_整数_1,_整数) :- 9699690 > _整数_1, write('error\n'),!, fail. 整数入力検査(_整数_1,_整数) :- _整数_1 < 0, _整数 is abs(_整数_1),!. 整数入力検査(_整数,_整数) :- _整数 > 0,!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/903 # # [1] 授業単元:計算機アルゴリズムファイルへの書き込み # [2] 問題文(含コード&リンク):以下の実行例のように、キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数) # を次々と読み込んで、そのデータをファイルに書きこむプログラムを作成せよ。 # # 以下の要件を満たすとする # ・書きこむのファイル名をユーザに入力させる # ・同じ名前の友人の情報がすでに入力されたかどうかは確認しなくても良い。 # ・同じ名前のファイルはすでに存在する場合には、内容を上書きするものとする。 # ・作成されたファイルの中身は以下の実行例(catコマンドの結果)のようにするものとする。 # ・以下の実行例のように,1人文のデータを入力するごとに「続けますか(yse...1/NO...0:)」のように表示を促し1が入力されたら処理を続けるプログラムとする。 # # [5] その他の制限:[実行例] # 書きこむファイル名:friends.txt # 友人の名前:Goro # 誕生日(yyyymmdd):19911001 # 続けますか?(yes...1/NO...0):1 # 友人の名前:Taro # 誕生日(yyyymmdd):19890505 # 続けますか?(yes...1/NO...0):1 # 友人の名前:Akira # 誕生日(yyyymmdd):19920222 # 続けますか?(yes...1/NO...0):0 # # %cat freinds.txt # Goro 19911001 # Taro 19890505 # Akira 19920222 # 宜しくお願いします。 # 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで、そのデータをファイルに書きこむ'(_ファイル) :- 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_名前_生年月日ならび), 'そのデータをファイルに書きこむ'(_ファイル,_名前_生年月日ならび). 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_名前_生年月日ならび) :- 友人の名前を読み込む(_友人の名前), 生年月日を読み込む(_生年月日), 続行するか終了するか問う(_答え), 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_答え,_友人の名前,_生年月日,_名前_生年月日ならび). 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(0,[]). 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_,_友人の名前,_生年月日,[[_友人の名前,_生年月日]|R]) :- 友人の名前を読み込む(_友人の名前_2), 生年月日を読み込む(_生年月日_2), 続行するか終了するか問う(_答え), 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_答え,_友人の名前_2,_生年月日_2,R). 友人の名前を読み込む(_友人の名前) :- write('友人の名前:'), get_line(_友人の名前). 生年月日を読み込む(_生年月日) :- write('誕生日(yyyymmdd):'), get_line(_生年月日). 続行するか終了するか問う(_答え) :- write('続けますか?(yes...1/NO...0):'), get_line(Line), 続行するか終了するか診断(Line,_答え),!. 続行するか終了するか問う(_答え) :- 続行するか終了するか問う(_答え). 続行するか終了するか診断(Line,_答え) :- atom_to_term(Line,_答え,_), integer(_答え), _答え >= 0, _答え =< 1,!. 続行するか終了するか診断(Line,_答え) :- fail. 'そのデータをファイルに書きこむ'(_ファイル,_名前_生年月日ならび) :- open(_ファイル,write,Outstream), append(_,[[_友人の名前,_生年月日]|R],_名前_生年月日ならび), writef('%t %t\n',[_友人の名前,_生年月日]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/779 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # キーボードから整数値を受け取り、その数値に該当する月の略称("Jan", "Feb",・・・)を表示するプログラムを作成しなさい。 # なお、月の略称はポインタ配列「 char *month[ ]={"Jan.", "Feb.", "Mar.", "Apr.", "May.", "Jun.", "Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."};」で定義するものとする。 # 'キーボードから整数値を受け取り、その数値に該当する月の略称("Jan", "Feb",・・・)を表示する。なお、月の略称はポインタ配列「 char *month[ ]={"Jan.", "Feb.", "Mar.", "Apr.", "May.", "Jun.", "Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."};」で定義するものとする。' :- 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値), 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値). 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値) :- get_line(Line), キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値),!. 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値) :- 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値). キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値) :- atom_to_term(Line,_キーボードから受け取った整数値,_), integer(_キーボードから受け取った整数値),!. キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値) :- writef('入力された %t からは月数に相当する数値が得られません。再入力をお願いします。\n',[Line]), fail. 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値) :- 数値に該当するピリオド付き月の略称ストリング(_キーボードから受け取った整数値,_ピリオド付き月の略称ストリング), append(L1,[_],_ピリオド付き月の略称ストリング), string_to_atom(L1,_その数値に該当する月の略称), writef('キーボードから受け取った数字 %t(月),該当する月の略称 %t\n',[_キーボードから受け取った整数値,_その数値に該当する月の略称]),!. 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値,_) :- writef('キーボードからの入力 %t に該当する月は存在しません。\n',[_キーボードから受け取った整数値,[_キーボードから受け取った整数値]). 数値に該当する月の略称ストリング(1,"Jan."). 数値に該当する月の略称ストリング(2,"Feb."). 数値に該当する月の略称ストリング(3,"Mar."). 数値に該当する月の略称ストリング(4,"Apr."). 数値に該当する月の略称ストリング(5,"May."). 数値に該当する月の略称ストリング(6,"Jun."). 数値に該当する月の略称ストリング(7,"Jul."). 数値に該当する月の略称ストリング(8,"Aug."). 数値に該当する月の略称ストリング(9,"Sep."). 数値に該当する月の略称ストリング(10,"Oct."). 数値に該当する月の略称ストリング(11,"Nov."). 数値に該当する月の略称ストリング(12,"Dec."). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/779 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # キーボードから整数値を受け取り、その数値に該当する月の略称("Jan", "Feb",・・・)を表示するプログラムを作成しなさい。 # なお、月の略称はポインタ配列「 char *month[ ]={"Jan.", "Feb.", "Mar.", "Apr.", "May.", "Jun.", "Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."};」で定義するものとする。 # 'キーボードから整数値を受け取り、その数値に該当する月の略称("Jan", "Feb",・・・)を表示する。なお、月の略称はポインタ配列「 char *month[ ]={"Jan.", "Feb.", "Mar.", "Apr.", "May.", "Jun.", "Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."};」で定義するものとする。' :- 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値), 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値). 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値) :- get_line(Line), キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値),!. 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値) :- 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値). キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値) :- atom_to_term(Line,_キーボードから受け取った整数値,_), integer(_キーボードから受け取った整数値),!. キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値) :- writef('入力された %t からは月数に相当する数値が得られません。再入力をお願いします。\n',[Line]), fail. 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値) :- 数値に該当するピリオド付き月の略称ストリング(_キーボードから受け取った整数値,_ピリオド付き月の略称ストリング), append(L1,[_],_ピリオド付き月の略称ストリング), string_to_atom(L1,_その数値に該当する月の略称), writef('キーボードから受け取った数字 %t(月),該当する月の略称 %t\n',[_キーボードから受け取った整数値,_その数値に該当する月の略称]),!. 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値,_) :- writef('キーボードからの入力 %t に該当する月は存在しません。\n',[_キーボードから受け取った整数値,[_キーボードから受け取った整数値]). 数値に該当する月の略称ストリング(1,"Jan."). 数値に該当する月の略称ストリング(2,"Feb."). 数値に該当する月の略称ストリング(3,"Mar."). 数値に該当する月の略称ストリング(4,"Apr."). 数値に該当する月の略称ストリング(5,"May."). 数値に該当する月の略称ストリング(6,"Jun."). 数値に該当する月の略称ストリング(7,"Jul."). 数値に該当する月の略称ストリング(8,"Aug."). 数値に該当する月の略称ストリング(9,"Sep."). 数値に該当する月の略称ストリング(10,"Oct."). 数値に該当する月の略称ストリング(11,"Nov."). 数値に該当する月の略称ストリング(12,"Dec."). % 以下のサイトは # http://www.ioi-jp.org/joi/2011/2012-yo/2012-yo-t1/2012-yo-t1.html # 問題 # 1    ランチ (Lunch) # 問題 # # JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが # 好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと # 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を # 引いた金額が代金となる. # # ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの # 代金の最小値を求めるプログラムを作成せよ. # # 入力 # # 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. # 1 行目の整数は 1 つ目のパスタの値段である. # 2 行目の整数は 2 つ目のパスタの値段である. # 3 行目の整数は 3 つ目のパスタの値段である. # 4 行目の整数は 1 つ目のジュースの値段である. # 5 行目の整数は 2 つ目のジュースの値段である. # ただし,与えられる入力データにおいては全てのパスタとジュースの値段は # 100 円以上 2000 円以下であることが保証されている. # # 出力 # # その日のセットメニューの代金の最小値を 1 行で出力せよ. # # 入出力例 # # 入力例 1 入力例 2 # 800 1999 # 700 1999 # 900 100 # 198 189 # 330 100 # # 出力例 1 出力例 2 # 848 150 # # # 入出力例 1 では,2 つ目のパスタと 1 つ目のジュースを組み合わせた場合の 700 + 198 - 50 = 848 がその日のセットメニューの代金の最小値である. # # 入出力例 2 では,3 つ目のパスタと 2 つ目のジュースを組み合わせた場合の 100 + 100 - 50 = 150 がその日のセットメニューの代金の最小値である. # # ※各入出力例のデータは,右クリック等によりファイルに保存して利用可能です. # program :- 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める'. 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める' :- '3書類のパスタと2種類のジュースの価格を得る'(_3種類のパスタの価格,_2種類のジュースの価格), 最小値を探しだす(_セットメニューの代金,( セットメニューを代金を得る(_3種類のパスタの価格,_2種類のジュースの価格,_セットメニューの代金)), _その日のセットメニューの代金の最小値), writef('%t\n',[_その日のセットメニューの代金の最小値]). '3書類のパスタと2種類のジュースの価格を得る'(_3種類のパスタの価格,_2種類のジュースの価格) :- '3種類のパスタの価格を得る'(_3種類のパスタの価格), '2種類のジュースの価格を得る'(_2種類のジュースの価格). '3種類のパスタの価格を得る'(_3種類のパスタの価格) :- length(_3種類のパスタの価格,3), findall(_パスタの価格,( append(_,[_パスタの価格|_],_3種類のパスタの価格), 整数入力(_パスタの価格)), _3種類のパスタの価格). '2種類のジュースの価格を得る'(_2種類のジュースの価格) :- length(_2種類のジュースの価格,2), findall(_ジュースの価格,( % _パスタの価格となっていた 12/23訂正 append(_,[_ジュースの価格|_],_2種類のジュースの価格), 整数入力(_ジュースの価格)), _2種類のジュースの価格). 最小値を探しだす(_対象となる値,_副目標,_最小値) :- findall(_対象となる値,_副目標,L), 最小値(L,_最小値). 最小値(L,_最小値) :- append(L1,[_最小値|L2],L), \+((append(_,[A|_],L1),A @< _最小値)), \+((append(_,[B|_],L2),B @< _最小値)),!. セットメニューを代金を得る(_3種類のパスタの価格,_2種類のジュースの価格,_セットメニューの代金) :- append(_,[_パスタの価格|_],_3種類のパスタの価格), append(_,[_ジュースの価格|_],_2種類のジュースの価格), _セットメニューの代金 is _パスタの価格 + _ジュースの価格 - 50. 整数入力(N) :- get_line(Line), 整数入力診断(Line,N),!. 整数入力(N) :- 整数入力(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数入力診断(Line,N) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. get_line(Line) :- get_char(Char), get_line_2(Char,Chars), atom_chars(Line,Chars). get_line_2(end_of_file,[]) :- !. get_line_2('\n',[]) :- !. get_line_2(Char,[Char|R]) :- get_char(Char2), get_line_2(Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/743 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/uhaD9 # # キーボードから5 個の整数を入力し,最大値,最小値,平均値を計算するプログラムを,以下の条件に従って作成せよ. # 1) キーボードからn個の整数を入力して配列arrayに格納する関数 # 「void input( int *array,int n)」を作成すること. # 2) n 個の要素からなる配列array に対して,最大値を算出して返す関数 # 「int max( int *array, int n )」を作成すること. # 3) n 個の要素からなる配列array に対して,最小値を算出して返す関数 # 「int min( int *array, int n )」を作成すること. # 4) n 個の要素からなる配列array に対して,平均値を算出して返す関数 # 「double avg( int *array, int n )」を作成すること. # 5) main関数では,1)~4)の関数をすべて呼び出すこと. program :- 'キーボードからn個の整数を入力してならびに格納する'(5,_ならび), 'ならびの最大値を返す'(_ならび,_最大値), 'ならびの最小値を返す'(_ならび,_最小値), 'ならび要素の平均値を返す'(_ならび,_平均値), writef('ならび要素は%t\n最大値は%t\n最小値は%t\n平均値は%t\n',[_ならび,_最大値,_最小値,_平均値]). 'キーボードからn個の整数を入力してならびに格納する'(_n,_ならび) :- length(_ならび,_n), findall(_整数,( append(_,[_整数|_],_ならび), 整数入力(_整数)), _ならび). 整数入力(_整数) :- write('整数を入力して下さい : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数入力(_整数) :- 整数入力(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]), fail. 'ならびの最大値を返す'(_ならび,_最大値) :- max(_ならび,_最大値). 'ならびの最小値を返す'(_ならび,_最小値) :- min(_ならび,_最小値). 'ならび要素の平均値を返す'(_ならび,_平均値) :- avg(_ならび,_平均値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/743 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/uhaD9 # # キーボードから5 個の整数を入力し,最大値,最小値,平均値を計算するプログラムを,以下の条件に従って作成せよ. # 1) キーボードからn個の整数を入力して配列arrayに格納する関数 # 「void input( int *array,int n)」を作成すること. # 2) n 個の要素からなる配列array に対して,最大値を算出して返す関数 # 「int max( int *array, int n )」を作成すること. # 3) n 個の要素からなる配列array に対して,最小値を算出して返す関数 # 「int min( int *array, int n )」を作成すること. # 4) n 個の要素からなる配列array に対して,平均値を算出して返す関数 # 「double avg( int *array, int n )」を作成すること. # 5) main関数では,1)~4)の関数をすべて呼び出すこと. program :- 'キーボードからn個の整数を入力してならびに格納する'(5,_ならび), 'ならびの最大値を返す'(_ならび,_最大値), 'ならびの最小値を返す'(_ならび,_最小値), 'ならび要素の平均値を返す'(_ならび,_平均値), writef('ならび要素は%t\n最大値は%t\n最小値は%t\n平均値は%t\n',[_ならび,_最大値,_最小値,_平均値]). 'キーボードからn個の整数を入力してならびに格納する'(_n,_ならび) :- length(_ならび,_n), findall(_整数,( append(_,[_整数|_],_ならび), 整数入力(_整数)), _ならび). 整数入力(_整数) :- write('整数を入力して下さい : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数入力(_整数) :- 整数入力(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]), fail. 'ならびの最大値を返す'(_ならび,_最大値) :- append(L1,[_最大値|L2],_ならび), \+((member(A,L1),B @> _最大値)), \+((member(B,L2),A @> _最大値)),!. 'ならびの最小値を返す'(_ならび,_最小値) :- append(L1,[_最小値|L2],_ならび), \+((member(A,L1),B @< _最小値)), \+((member(B,L2),A @< _最小値)),!. 'ならび要素の平均値を返す'(_ならび,_平均値) :- sum(_ならび,_合計), length(_ならび,_要素数), _平均値 is _合計 / _要素数. sum([],0). sum([V|R],Sum) :- sum(R,Sum_1), Sum is Sum_1 + V. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/625 # # [1] 授業単元:アルゴリズム(構造体) # [2] 問題文(含コード&リンク):メンバとして学籍番号("C0110999"のような文字列) ,5 科目の点数(int 型整数の配列) ,平均点(double 型)をもつ構造体score を宣言し,score 型 # 構造体へのポインタsc を引数としてメンバの値を設定する関数void set_score_and_calc_ave(struct score *sc)を作成しプログラムを完成させよ。 #  ただし,構造体score と関数set_score_and_calc_ave については以下の要件を満たようにせよ。 # [以下の要件] # ・構造体の宣言において,5 科目の点数のメンバは5つのメンバを用意するのではなく,1 つのint 型配列とすること。 # ・平均点のメンバについては,入力された5 科目の点数から関数set_score_and_calc_ave 内で平均点を計算して設定すること # ・関数set_score_and_calc_ave 内で,ユーザに学籍番号と5 科目の点数を入力させること.その際,0〜100 の範囲の点数が入力されたかどうかのチェックも行わせる。 # 以下の実行例のように関数の動作を確認できるmain関数も作成せよ # [実行例]: y#     学籍番号を入力してください:A12557 # 5 科目の点数(0〜100)を入力してください。 # 科目1 の点数:101 # 0 以上100 以下の点数を入力してください:-1 # 0 以上100 以下の点数を入力してください:0 # 科目2 の点数:100 # 科目3 の点数:88 # 科目4 の点数:77 # 科目5 の点数:66 # データを設定しました。 # 学籍番号:A12557 平均点:66.2 点 # 科目1: 0 点 # 科目2:100 点 # 科目3: 88 点 # 科目4: 77 点 # 科目5: 66 点 # 'ユーザに学籍番号と5 科目の点数を入力させること.その際,0〜100 の範囲の点数が入力されたかどうかのチェックも行わせる。' :- 'ユーザに学籍番号と5 科目の点数を入力させること'(_学籍番号,_5科目の点数), '平均点のメンバについては,入力された5 科目の点数から平均点を計算して設定する'(_5科目の点数,_平均点), 成績を設定する(_学籍番号,_5科目の点数,_平均点). 成績を設定する(_学籍番号,_5科目の点数,_平均点) :- append([_学籍番号|_5科目の点数],[_平均点],L), P =.. [成績|L], asserta(P), write('データを設定しました。 \n'), 設定内容の表示. 'ユーザに学籍番号と5 科目の点数を入力させること'(_学籍番号,_5科目の点数) :- ユーザに学籍番号を入力される(_学籍番号), '5科目の点数を入力させる'(_5科目の点数). ユーザに学籍番号を入力される(_学籍番号) :- write('学籍番号を入力して下さい : '), get_line(_学籍番号). '5科目の点数を入力させる'(_5科目の点数) :- length(_5科目の点数,5), write('5 科目の点数(0〜100)を入力してください。 '), findall(_点数,( append(L0,[_点数|_],_5科目の点数), '点数を入力する'(L0,_点数)), _5科目の点数). 点数を入力する(L0,_点数) :- length([_|L0],_n番目), write('科目%t の点数 : '), 点数を入力する(_点数). 点数を入力する(_点数) :- get_integer(_点数), 点数範囲が妥当(_点数),!. 点数を入力する(_点数) :- 点数を入力する(_点数). 点数範囲が妥当(_点数) :- _点数 >= 0, _点数 =< 100,!. 点数範囲が妥当(_点数) :- write('0 以上100 以下の点数を入力してください: '), fail. get_integer(_integer) :- get_line(Line), get_integer_test(Line,_integer),!. get_integer_test(Line,_integer) :- atom_to_term(Line,_integer,_), integer(_integer). '平均点のメンバについては,入力された5 科目の点数から平均点を計算して設定する'(_5科目の点数) :- 相加平均(_5科目の点数,_平均点). 設定内容の表示 :- 成績(_学籍番号,_科目1の点数,_科目2の点数,_科目3の点数,_科目5の点数,_科目5の点数,平均点), writef('学籍番号: %t 平均点: %t\n科目1: %3r\n科目2: %3r\n科目3 %3r\n科目4: %3r\n科目5: %3r\n',[_学籍番号,_平均点,_科目1の点数,_科目2の点数,_科目3の点数,_科目5の点数,_科目5の点数]),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/562 # # [1] プログラミング実習応用 # [2] ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み、 # x,yそれぞれの平均値(重心)を計算して、画面上に表示するプログラムを作成せよ # □"tmp.csv"は「関数y=x^3-xのグラフを描くため、定義域[-2,2]に対するyの値を0.1刻みで計算し、 # 結果をファイルに出力する」というプログラムで作ったファイルで、もう用意してあります。 # □コンパイラの標準外の仕様による異常終了を避けるため、変数の宣言部分にダミーの変数を追加する。例えば、"double dummy=0.0;"(変数名や値は変えてよい) # 'ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み、x,yそれぞれの平均値(重心)を計算して、画面上に表示する' :- 'ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み'(_x座標ならび,_y座標ならび), 'x,yそれぞれの平均値を計算して'(_x座標ならび,_y座標ならび,_xの平均,_yの平均), 画面上に表示する(_xの平均,_yの平均). 'ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み'(_x座標ならび,_y座標ならび) :- get_chars('tmp.csv',Chars), 座標の組(Chars,_x座標ならび,_y座標ならび). 座標の組(Chars,[V|_座標ならび_1],_座標ならび_2) :- 座標の組(Chars,L,_座標ならび_2,_座標ならび_1), 実数に変換(L,V). 座標の組([],[],[],[]) :- !. 座標の組([],L,[V],[]) :- 実数に変換(L,V),!. 座標の組([_区切り記号|R1],[],[V|_座標ならび_1],_座標ならび_2) :- member(_区切り記号,[' ','\t',',','\n','(',')']), 座標の組(R1,L,_座標ならび_2,_座標ならび_1), 実数に変換(L,V),!. 座標の組([A|R1],[A|R2],_座標ならび_1,_座標ならび_2) :- \+(member(A,[' ','\t',',','\n','(',')'])), 座標の組(R1,R2,_座標ならび_1,_座標ならび_2),!. 座標の組([_|R1],L,_座標ならび_1,_座標ならび_2) :- 座標の組(R1,L,_座標ならび_1,_座標ならび_2). 実数に変換([],_) :- !,fail. 実数に変換(_実数数字ならび,_実数値) :- concat_atom(_実数数字ならび,_文字列), atom_to_term(_文字列,_実数値,_). 'x,yそれぞれの平均値を計算して'(_x座標ならび,_y座標ならび,_xの平均,_yの平均) :- 相加平均(_x座標ならび,_xの平均), 相加平均(_y座標ならび,_yの平均). 相加平均(_値ならび,_相加平均) :- length(_値ならび,_標本数), 相加平均(_値ならび,_標本数,0,_相加平均). 相加平均([],_標本数,_合計,_相加平均) :- _相加平均 is _合計 / _標本数,!. 相加平均([V|R],_標本数,_合計_1,_相加平均) :- _合計_2 is _合計_1 + V, 相加平均(R,_標本数,_合計_2,_相加平均). 画面上に表示する(_xの平均,_yの平均) :- writef('座標の組の平均(重心)は (%t,%t) です。\n',[_xの平均,_yの平均]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/556 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 氏名、体重、身長の入力を受けつけ、ファイル # に書き込むプログラムをかけ。 # '氏名、体重、身長の入力を受けつけ、ファイルに書きこむ'(_ファイル) :- '氏名、体重、身長の入力を受けつけ'(_氏名,_体重,_身長), ファイルに書きこむ(_ファイル,_氏名,_体重,_身長). '氏名、体重、身長の入力を受けつけ'(_氏名,_体重,_身長) :- 氏名の入力(_氏名), 体重の入力(_体重), 身長の入力(_身長). 氏名の入力(_氏名) :- get_line(_氏名). 体重の入力(_体重) :- get_line(Line), 体重入力診断(Line,_体重),!. 体重の入力(_体重) :- 体重の入力(_体重). 体重入力診断(Line,_体重) :- atom_to_term(Line,_体重,_), number(_体重), _体重 > 0,!. 体重入力診断(Line,_体重) :- writef('入力された %t からは適切な体重が得られません。再入力をお願いします。\n'), fail. 身長の入力(_身長) :- get_line(Line), 身長入力診断(Line,_身長),!. 身長の入力(_身長) :- 身長の入力(_身長). 身長入力診断(Line,_身長) :- atom_to_term(Line,_身長,_), number(_身長), _身長 > 0,!. 身長入力診断(Line,_身長) :- writef('入力された %t からは適切な身長が得られません。再入力をお願いします。\n'), fail. ファイルに書きこむ(_ファイル,_氏名,_体重,_身長) :- open(_ファイル,write,Outstream), writef(Outstrem,'氏名は %q \n体重は %t Kg\n身長は %t cm\n',[_氏名,_体重,_身長]), close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/593 # # 【 課題 】ttp://edu.net.c.dendai.ac.jp/ad1/2011/kadai.html # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】1/10 20:00まで # 【 Ver  】java version "1.6.0_21" # 【 補足 】課題2をお願いします # <課題1> # 通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、 # また円レートを設定すると、等価な円オブジェクトを返します。 # # <課題2> # 順序木を利用し、キーの値で値を整列するデータ構造を作成することを考えます。 # そのためには、java.util.Map を実装し、 java.util.AbstractMap を継承し、 # 最小限のプログラムで動作させます。 まず、文字列をキーとして、整数値を # 整列するような TDUMap3 を目標とします。 完成した後、Generics を利用した # 任意の型のキーと値を使用できる TDUMap を作成します。 '通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、また円レートを設定すると、等価な円オブジェクトを返します。'(_値,_通貨記号,_円レート,_円) :- '値を入れると'(_値), '通貨記号を含めて表示し'(_値,_通貨記号を含む表示), '円レートを設定すると'(_通貨記号を含む表示,_円レート), '等価な円オブジェクトを返す'(_値,_円レート,_円). '通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、また円レートを設定すると、等価な円オブジェクトを返します。'(_値,_通貨記号,_円レート,_円) :- '通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、また円レートを設定すると、等価な円オブジェクトを返します。'(_値,_通貨記号,_円レート,_円). '値を入れると'(_値) :- write('値を入力して下さい : '), get_line(Line), '値入力診断'(Line,_値). '値を入れると'(_値) :- '値を入れると'(_値). '値入力診断'(Line,_値) :- atom_to_term(Line,_値,_), number(_値), _値 >= 0. 通貨記号を含めて表示し(_値) :- 通貨(_通貨記号), concat_atom([_通貨記号,_値],_通貨記号を含む表示), writef('%t : ',[_通貨記号を含む表示]). '円レートを設定すると'(_通貨記号を含む表示,_円レート) :- writef('%t 円レートを入力して下さい : ',[_痛か木子を含む表示]), get_line(Line), '円レート入力診断'(Line,_円レート),!. '円レートを設定すると'(_通貨記号を含む表示,_円レート) :- '円レートを設定すると'(_通貨記号を含む表示,_円レート). '円レート入力診断'(Line,_円レート) :- atom_to_term(Line,_円レート,_), number(_円レート), _円レート >= 0,!. '等価な円オブジェクトを返す'(_値,_円レート,_円) :- _円 is _値 * _円レート. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/312 # # access2000で # # NEN | TUKI # 23 | 11 # ってデータがあったら # # 平成23年12月31日のように常に次月末日を返したいのですが # どのようなクエリになりますか? # '平成23年12月31日のように常に次月末日を返す'(_次月末日) :- 年月(_NEN,_TUKI), '平成23年12月31日のように常に次月末日を返す'(_NEN,_TUKI,_次月末日). '平成23年12月31日のように常に次月末日を返す'(_NEN,12,_次月末日) :- _NEN_2 is _NEN + 1, concat_atom([平成,_NEN_2,年,1,月,31,日],_次月末日),!. '平成23年12月31日のように常に次月末日を返す'(_NEN,_TUKI,_次月末日) :- member(_TUKI,[2,4,6,7,9,11]), _TUKI_2 is _TUKI + 1, concat_atom([平成,_NEN,年,_TUKI_2,月,31,日],_次月末日),!. '平成23年12月31日のように常に次月末日を返す'(_NEN,_TUKI,_次月末日) :- member(_TUKI,[3,5,8,10]), _TUKI_2 is _TUKI + 1, concat_atom([平成,_NEN,年,_TUKI_2,月,30,日],_次月末日),!. '平成23年12月31日のように常に次月末日を返す'(_NEN,1,_次月末日) :- _西暦年 is _NEN + 1988, うるう年(_西暦年), concat_atom([平成,_NEN,年,2,月,29,日],_次月末日),!. '平成23年12月31日のように常に次月末日を返す'(_NEN,1,_次月末日) :- _西暦年 is _NEN + 1988, \+(うるう年(_西暦年)), concat_atom([平成,_NEN,年,2,月,28,日],_次月末日),!. うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 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/1322562648/172 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 前日商品別に在庫を登録したファイル "zaiko.txt" と # 当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し、 # 新たな在庫ファイル "zaiko_new.txt" を出力するプログラムを作成せよ。 # ファイルの各レコード(行)は次の形式であり、ひとつの商品に対してひとつのレコードとする。 # # 商品コード 整数 4桁 # 数量 数字 4桁 # # なお、各ファイルは商品コードの昇順にソートされているものとする。 # ※実行例:http://ime.nu/s2.etowns.slyip.net/~c_cpp_homework/cgi-bin/joyful/img/256.txt # '前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し、新たな在庫ファイル "zaiko_new.txt" を出力する' :- '前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し'(LL1,LL2), '新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,LL2). '前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し'(LL1,LL2) :- get_lines('zaiko.txt',Lines1), get_lines('nyuko.txt',Lines2), 行を商品番号と数量に分解する(Lines1,LL1), 行を商品番号と数量に分解する(Lines2,LL2). 行を商品番号と数量に分解する(Lines,LL) :- findall([_商品番号,_数量],( append(_,[_行|_],Lines), 商品番号と数量に分解(_行,_商品番号,_数量)), LL). 商品番号と数量に分解(_行,_商品番号,_数量) :- sub_atom(_行,0,4,4,S1), sub_atom(_行,4,4,0,S2), atom_to_term(S1,_商品番号,_), atom_to_term(S2,_数量,_). '新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,LL2) :- '新たな在庫ファイル'(LL1,LL2,LL3), 出力する('zaiko_new.txt',LL3). '新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,[],LL1) :- !. '新たな在庫ファイル "zaiko_new.txt" を出力する'([],LL2,LL2) :- !. '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号,_数量_1]|R1],[[_商品番号,_数量_2]|R2],[[_商品番号,_数量_3]|R3]) :- _数量_2_1 is _数量_1 + _数量_2, 入庫の集約(_商品番号,R2,_数量_2_1,_数量_3,R2_2), '新たな在庫ファイル "zaiko_new.txt" を出力する'(R1,R2_2,R3). '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],[[_商品番号_2,_数量_2]|R2],[[_商品番号_1,_数量_1]|R3]) :- _商品番号_1 @< _商品番号_2, '新たな在庫ファイル "zaiko_new.txt" を出力する'(R1,[[_商品番号_2,_数量_2]|R2],R3). '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],[[_商品番号_2,_数量_2]|R2],[[_商品番号_2,_数量_3]|R3]) :- _商品番号_1 @> _商品番号_2, 入庫の集約(_商品番号_2,R2,_数量_2,_数量_3,R2_2), '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],R2_2,R3). 入庫の集約(_商品番号,[],_数量_3,_数量_3,[]) :- !. 入庫の集約(_商品番号,[[_商品番号,_数量]|R],_数量_2_1,_数量_3,R2_2) :- _数量_2_2 is _数量_2_1 + _数量, 入庫の集約(_商品番号,R,_数量_2_2,_数量_3,R2_2),!. 入庫の集約(_商品番号,[[_商品番号_2_2,_数量]|R2],_数量_3,_数量_3,[[_商品番号_2,_数量_2]|R2]) :- \+(_商品番号=_商品番号_2). 出力する(File,LL) :- open(File,write,Outstream), append(_,[[_商品番号,_数量]|R],LL), writef(Outstream,'%4r%4r\n',[_商品番号,_数量]), R = [], close(Outstream). % 以下のサイトは ?- 'a##'. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/122 # # 1] 授業単元: # [2] 問題文(含コード&リンク): # # (1) # #include <stdio.h> # #define NUMBER 5 # int tensu[NUMBER]; # int top(void); # int main(void) # { # extern int tensu[]; # int i; # printf("%d人の点数を入力してください。\n", NUMBER); # for (i = 0; i < NUMBER; I++) { printf("%d:",i + 1); scanf("%d", &tensu[i]); } printf("最高点=%d\n", top()); return (0); # } # int top(void) # { extern int tensu[]; int i; int max = tensu[0]; for (i = 1; i < NUMBER; i++) if (tensu[i] > max) max = tensu[i]; return (max); # } # 上のプログラムを参考にして、5人の点数の平均点を返す関数 double ave(void)を作成せよ。 # その関数を用いて、読み込んだ5人の点数の平均値を出力するプログラムを作成せよ。 # (2) # 2つの 3成分ベクトル a, b の外積 c を求める関数 void acrossb(double a[], double b[], double c[]) を作成せよ。 # この関数を用いて次の二つのベクトル va=(1.0, 2.0, 1.0) , vb=(-2.0, 0.5, 1.0) の外積を計算するプログラムを作成せよ。 # '5人の点数の平均点を返す' :- '5人の点数'(_5人の点数), 平均点を返す(_5人の点数,_平均点), writef('平均点は %t です。\n',[_平均点]). '5人の点数'(_5人の点数) :- length(_5人の点数,5), findall(_点数,( append(L0,[_点数|_],_5人の点数), 点数の入力(L0,_点数)), _5人の点数). 点数の入力(L0,_点数) :- length([_|L0],N), writef('%t人目の点数を入力して下さい : ',[N]), get_line(Line), 点数入力診断(Line,_点数),!. 点数の入力(L0,_点数) :- 点数の入力(L0,_点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0, _点数 =< 100,!. 点数入力診断(Line,_点数) :- writef('入力された %t からは適切な点数が得られません。再入力をお願いします。\n',[Line]), fail. 平均点を返す(_5人の点数,_平均点) :- 平均点を返す(_5人の点数,0,_平均点). 平均点を返す([],_合計,_平均点) :- _平均 is _合計 / 5,!. 平均点を返す([_点数|R],_合計_1,_平均点) :- _合計_2 is _点数 + _合計_1, 平均点を返す(R,_合計_2,_平均点). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/95 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):http://ime.nu/i.imgur.com/hnQll.jpg # # 演習 9-2 整数(最大100まで)をmainプログラムで用意し、キーボードから # 100個以下の整数を任意の個数、入力する。ただし、最初に入力する # データの個数を入力する。 # データの入った配列とデータ数を以下の関数に渡して、配列の中の # 最大値と最小値、および平均値を計算するプログラムを作成せよ。 # 'キーボードから100個以下の整数(最大100まで)を任意の個数、入力する。ただし、最初に入力するデータの個数を入力する。 データの入ったならびとデータ数を受け取りならびの中の最大値と最小値、および平均値を計算する' :- '個数を入力する'(_データ数), length(_データの入ったならび,_データ数), データを入力する(_データの入ったならび), 'データの入ったならびとデータ数を受け取りならびの中の最大値と最小値、および平均値を計算する'(_データの入ったならび,_データ数,_最大値,_最小値,_平均値), writef('最大値 = %t,最小値 = %t,平均値 = %t\n',[_最大値,_最小値,_平均値]). データを入力する(L) :- findall(_100以下の整数,( append(L0,[_|R],L), '100以下の整数を入力する'(L0,_100以下の整数)), L). '100以下の整数を入力する'(L0,_100以下の整数) :- length([_|L0],Nth), writef('%t番目の整数 : ',[Nth]), get_line(Line), '100以下の整数入力診断'(Line,_100以下の整数),!. '100以下の整数を入力する'(L0,_100以下の整数) :- '100以下の整数を入力する'(L0,_100以下の整数). '個数を入力する'(_個数) :- write('入力する整数の個数は : '), get_line(Line), '100以下の整数入力診断'(Line,_個数),!. '個数を入力する'(_個数) :- '個数を入力する'(_個数). '100以下の整数入力診断'(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), _整数 > 0, _整数 =< 100,!. '100以下の整数入力診断'(Line,_) :- write('入力された%tからは適切な個数が得られません。再入力をお願いします。\n',[Line]), fail. 'データの入ったならびとデータ数を受け取りならびの中の最大値と最小値、および平均値を計算する'(_データの入ったならび,_データ数,_最大値,_最小値,_平均値) :- 最大値(_データの入ったならび,_最大値), 最小値(_データの入ったならび,_最小値), 平均値(_データの入ったならび,_データ数,_平均値). 最大値(_データの入ったならび,_最大値) :- append(L1,[_最大値|L2],_データの入ったならび), '全てのデータがAより小さいか等しい'(L1,_最大値), '全てのデータがAより小さいか等しい'(L2,_最大値). 最小値(_データの入ったならび,_最小値) :- append(L1,[_最大値|L2],_データの入ったならび), '全てのデータがAより大きいか等しい'(L1,_最小値), '全てのデータがAより大きいか等しい'(L2,_最小値). 平均値(_データの入ったならび,_データ数,_平均値) :- sum(_データの入ったならび,_合計), _平均値 is _合計 / _データ数. '全てのデータがAより小さいか等しい'([],A). '全てのデータがAより小さいか等しい'([B|R],A) :- B @=< A, '全てのデータがAより小さいか等しい'(R,A). '全てのデータがAより大きいか等しい'([],A). '全てのデータがAより大きいか等しい'([B|R],A) :- B @>= A, '全てのデータがAより大きいか等しい'(R,A). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/42 # # [1] 授業単元:楽しいC(ポインタと関数) # [2] 問題文(含コード&リンク): # 秒数を与えると,それが何日何時間何分何秒にあた # るかを計算する関数 # calctime(long sec, int *dp, int *hp, int *mp, # int *sp); # を作成せよ.例えば # calctime(100000, &d, &h, &m, &s); # として呼び出すとd=1, h=3,m=46,s=40 となる # (100,000 秒=1 日3 時間46 分40 秒).以下の実行例の # ように,関数の動作を確認できるmain 関数も作成すること. # (出力例) # 秒数を入力してください:100000 # 100000 秒= 1 日3 時間46 分40 秒 # 秒数を入力してください:3725 # 3725 秒= 0 日1 時間2 分5 秒 # '秒数を与えると,それが何日何時間何分何秒にあたるかを計算する' :- 秒数の入力(_秒数), '秒数を与えると,それが何日何時間何分何秒にあたるかを計算する'(_秒数,_日数,_時間,_分,_秒), '0は表示せず日数,時間,分,秒を表示する'(_日数,_時間,_分,_秒). 秒数の入力(_秒数) :- write('秒数を入力してください : '), get_line(Line), 秒数の入力診断(Line,_秒数),!. 秒数の入力(_秒数) :- 秒数の入力(_秒数). 秒数の入力診断(Line,_秒数) :- atom_to_term(Line,_秒数,_), integer(_秒数), _秒数 >= 0,!. 秒数の入力診断(Line,_秒数) :- writef('入力された %t からは適切な秒数が得られません。再入力をお願いします。\n',[Line]), fail. '秒数を与えると,それが何日何時間何分何秒にあたるかを計算する'(_秒数,_日数,_時間,_分,_秒) :- _日数 is _秒数 // 86400, _余り_1 is _日数 mod 86440, _時間 is _余り_1 // 3600, _余り_2 is _余り_1 mod 3600, _分 is _余り_2 // 60, _秒 is _余り_2 mod 60. '0は表示せず日数,時間,分,秒を表示する'(_日数,_時間,_分,_秒) :- append(_,[[N,S]|R],[[_日数,日],[_時間,時間],[_分,分],[_秒,秒]]), 表示(N,S), R = [], write('\n'). 表示(0,_) :- !. 表示(N,S) :- writef('%t%t ',[N,S]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/824 # # [1] 授業単元: C言語とアルゴリズム # [2] 問題文(含コード&リンク): # 初速v、仰角θを入力。着弾距離、着弾するまでの時間を求める。 # <問題の意味> # vx=vcos(θ),vy=-gt+vsin(θ) # x=vtcos(θ),y=-gt^2/2+vtsin(θ)+y0 # y=0,y0=0のとすると、 # 着弾するまでの時間は gt^2/2=vtsin(θ) > t=2*vsin(θ)/g # 着弾距離はtがわかれば x=vtcos(θ)で求まる # '初速v、仰角θを入力。着弾距離、着弾するまでの時間を求める' :- 初速vの入力(_v), 仰角thetaの入力(_theta), '初速v、仰角θを入力。着弾距離、着弾するまでの時間を求める'(_v,_theta,_着弾距離,_着弾するまでの時間), writef('着弾距離は %t m\n着弾するまでの時間は %t 秒です。\n',[_着弾距離,_着弾するまでの時間]). '初速v、仰角θを入力。着弾距離、着弾するまでの時間を求める'(_v,_theta,_着弾距離,_着弾するまでの時間) :- _着弾するまでの時間 is _v * sin(_theta) / 9.80665. _着弾距離 is _v * cos(_theta) * _着弾するまでの時間. 初速vの入力(_v) :- write('初速vを入力して下さい : '), get_line(Line), 初速vの入力診断(Line,_v),!. 初速vの入力(_v) :- 初速vの入力(_v). 初速vの入力診断(Line,_v) :- atom_to_term(Line,_v,_), number(_v), _v > 0.0,!. 初速vの入力診断(Line,_v) :- writef('入力された%tは初速vとして適切でありません。再入力をお願いします。\n',[Line]), fail. 仰角thetaの入力(_theta) :- write('仰角thetaを入力して下さい : '), get_line(Line), 仰角thetaの入力診断(Line,_theta),!. 仰角thetaの入力(_theta) :- 仰角thetaの入力(_theta). 仰角thetaの入力診断(Line,_theta) :- atom_to_term(Line,_theta,_), number(_theta), _theta >= 0.0, _theta =< pi,!. 仰角thetaの入力診断(Line,_theta) :- writef('入力された%tは仰角thetaとして適切でありません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/822 # # [1] 授業単元:c言語プログラミング # [2] 問題文(含コード&リンク):(1,2,3) (1,2,4)...といった数列が続くのlist.txtを読み込み、 # 左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむプログラムを作りなさい。 # (この場合、左が1と1かつ真ん中が2と2で右が3と4なので4の方が大きいので(1,2,4)を削除する) # '(1,2,3) (1,2,4)...といった数列が続くのlist.txtを読み込み、左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ' :- get_chars('list.txt',Chars), '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ'(Chars). '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ'(Chars) :- ならびに変換(Chars,LL1), '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し'(LL1,LL2), 'link2.txtに書きこむ'(LL2). ならびに変換([],[]). ならびに変換(['('|R1],[[A,B,C]|R2]) :- append(L0,[)|R3],R1), concat_atom(L0,S), atom_to_term(S,(A,B,C),_), ならびに変換(R3,R2),!. ならびに変換([_|R1],R2) :- ならびに変換(R1,R2). '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し'(LL1,LL2) :- 左の数字と真ん中の数字でグループを作る(LL1,LL3), グループの中の最小ならびを蒐める(LL3,LL2). 左の数字と真ん中の数字でグループを作る(LL1,LL3) :- findsetof([A,B],( append(_,[[A,B,_]|_],LL1)), LL3). グループの中の最小ならびを蒐める(LL3,LL2) :- findall(L,( グループの中での最小ならび(LL3,L)), LL2). グループの中での最小ならび(LL3,L) :- append(_,[[A,B]|_],LL3), findmin([A,B,C],( append(_,[[A,B,C]|_],LL1)), L). 'link2.txtに書きこむ'(LL2) :- open('link2.txt',write,Outstream), 'link2.txtに書きこむ'(Outstream,LL2), close(Outstream). 'link2.txtに書きこむ'(Outstream,LL2) :- append(_,[[A,B,C]|R],LL2), writef(Outstream,'(%t,%t,%t) ',[A,B,C]), R = [], 最後に改行(Outstream). 最後に改行(Outstream) :- write(Outstream,'\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/711 # # [1] 授業単元:リスト構造 # [2] 問題文(含コード&リンク): # malloc関数とリスト構造を使い、ファイルから二行の多桁整数を読み取る。 # それを4桁ずつリスト構造に格納し、加算を行うプログラムを作れ。 # # 口頭で出題された問題なので、おかしい部分があったらすみません。 # 'ファイルから二行の多桁整数を読み取る。それを4桁ずつリスト構造に格納し、加算を行う'(_ファイル名,_4桁ずつリストの加算値) :- 'ファイルから二行の多桁整数を読み取る'(_ファイル名,_多桁整数), 'それを4桁ずつリスト構造に格納し'(_多桁整数,_4桁ずつリスト), 加算を行う(_4桁ずつリスト,_加算値). 'ファイルから二行の多桁整数を読み取る'(_ファイル名,_多桁整数) :- get_lines(_ファイル名,[_第一行,_第二行|_]), concat_atom([_第一行,_第二行],_結合した文字列), atom_to_term(_結合した文字列,_多桁整数,_). 'それを4桁ずつリスト構造に格納し'(_多桁整数,_4桁ずつリスト) :- 'それを4桁ずつリスト構造に格納し'(_多桁整数,[],_4桁ずつリスト). 'それを4桁ずつリスト構造に格納し'(0,L,L) :- !. 'それを4桁ずつリスト構造に格納し'(N,L1,L) :- M is N mod 10000, N_1 is N // 10000, 'それを4桁ずつリスト構造に格納し'(N_1,[M|L1],L). 加算を行う([],0). 加算を行う([N|R],S) :- 加算を行う(R,S_1), S is N + S_1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/712 # # [1] 授業単元: C言語実習 # [2] 問題文(含コード&リンク): # 整数値を読み取り,4桁毎に 兆,億,万 を挿入して表示せよ. # # 例 # 入力:114514 # 出力:11万4514 # 入力:810 # 出力:810 # # '整数値を読み取り,4桁毎に 兆,億,万 を挿入して表示する' :-  整数値を読み取り(_整数値), '4桁毎に 兆,億,万 を挿入して表示する'(['',万,億,兆],_整数値). '4桁毎に 兆,億,万 を挿入して表示する'([_,_,_,_],0) :- writef('%t\n',[0]),!. '4桁毎に 兆,億,万 を挿入して表示する'(_,0) :- !. '4桁毎に 兆,億,万 を挿入して表示する'([_単位|R],N) :- M is N mod 10000, N_1 is N // 10000, '4桁毎に 兆,億,万 を挿入して表示する'(R,N_1), 表示する(_単位,M). 表示する(_,0) :- !. 表示する('',M) :- writef('%t\n',[M]),!. 表示する(_単位,M) :- writef('%t%t',[M,_単位]). 整数値を読み取り(_整数値) :- writef('整数を入力して下さい : '), get_line(Line), 整数値読み取り診断(Line,_整数値),!. 整数値を読み取り(_整数値) :- 整数値を読み取り(_整数値). 整数値を読み取り診断(Line,_整数値) :- atom_to_term(Line,_整数値,_), integer(_整数値),!. 整数値を読み取り診断(Line,_整数値) :- writef('入力された %t からは整数値が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/712 # # [1] 授業単元: C言語実習 # [2] 問題文(含コード&リンク): # 整数値を読み取り,4桁毎に 兆,億,万 を挿入して表示せよ. # # 例 # 入力:114514 # 出力:11万4514 # 入力:810 # 出力:810 # # '整数値を読み取り,4桁毎に 兆,億,万 を挿入して表示する' :-  整数値を読み取り(_整数値), '4桁毎に 兆,億,万 を挿入して表示する'(_整数値). '4桁毎に 兆,億,万 を挿入して表示する'(_整数値) :- number_chars(_整数値,Chars), '4桁毎に 兆,億,万 を挿入して'([[兆,12],[億,8],[万,4]],Chars,Chars2), 表示する(Chars2). '4桁毎に 兆,億,万 を挿入して'([],Chars_1,Chars_2) :- 頭部のゼロならびを取り除く(Chars_1,Chars_2). '4桁毎に 兆,億,万 を挿入して'([[_単位,_桁]|R],Chars_1,Chars_2) :- '0の処理に注意して、4桁毎に 兆,億,万 を挿入を続ける'([[_単位,_桁]|R],Chars_1,Chars_2),!. '0の処理に注意して、4桁毎に 兆,億,万 を挿入を続ける'([[_単位,_桁]|R],Chars_1,Chars_2) :- '単位を付加し挿入を続ける'(_単位,_桁,R,Chars_1,Chars_2). '0の処理に注意して、4桁毎に 兆,億,万 を挿入を続ける'([[_単位,_桁]|R],['0','0','0','0'|Chars_1],Chars_2) :- '4桁毎に 兆,億,万 を挿入して'(R,Chars_1,Chars_2),!. '0の処理に注意して、4桁毎に 兆,億,万 を挿入を続ける'([[_単位,_桁]|R],Chars_1,Chars_2) :- '4桁毎に 兆,億,万 を挿入して'(R,Chars_1,Chars_2). '単位を付加し挿入を続ける'(_単位,_桁,R,['0','0','0','0'|Chars_1],Chars_2) :- '4桁毎に 兆,億,万 を挿入して'(R,Chars_1,Chars_2). '単位を付加し挿入を続ける'(_単位,_桁,R,Chars_1,Chars_2) :- '表示有効な数字が存在する場合は'(_桁,Chars_1,L1,L2,L1_2), '4桁毎に 兆,億,万 を挿入して'(R,L2,Chars_1_2), 単位を付加する(L1_2,_単位,Chars_1_2,Chars_2). '表示有効な数字が存在する場合は'(_桁,Chars_1,L1,L2,L1_2) :- 'Chars_1の桁数が_桁以下'(_桁,Chars_1,L1,L2), 頭部のゼロならびを取り除く(L1,L1_2), \+(L1_2=[]). 単位を付加する(L1_2,_単位,Chars_1_2,Chars_2) :- append(L1_2,[_単位|Chars_1_2],Chars_2),!. 'Chars_1の桁数が_桁以下'(_桁,Chars_1,L1,L2) :- length(L2,_桁), append(L1,L2,Chars_1). 頭部のゼロならびを取り除く(['0'],['0']) :-!. 頭部のゼロならびを取り除く(['0','0','0','0'|R],R) :- !,fail. 頭部のゼロならびを取り除く(['0','0','0'|R],R) :-!. 頭部のゼロならびを取り除く(['0','0'|R],R) :-!. 頭部のゼロならびを取り除く(['0'|R],R) :-!. 頭部のゼロならびを取り除く(R,R) :-!. 整数値を読み取り(_整数値) :- writef('整数を入力して下さい : '), get_line(Line), 整数値を読み取り診断(Line,_整数値),!. 整数値を読み取り(_整数値) :- 整数値を読み取り(_整数値). 整数値を読み取り診断(Line,_整数値) :- atom_to_term(Line,_整数値,_), integer(_整数値),!. 整数値を読み取り診断(Line,_整数値) :- writef('入力された wt からは整数値が得られません。再入力をお願いします。\n',[Line]), fail. 表示する(_単位を挿入された整数ならび) :- concat_atom(_単位を挿入された整数ならび,_表示文字列), writef('%w\n',[_表示文字列]). % % いつも通り文字ならびに変換した結果迷走した。 % こんな問題は単純に整数のまま処理した方がいい。 http://nojiriko.asia/prolog/c153_712_1.html % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/625 # # [1] 授業単元:C言語 # [2] 問題文:123, 1.23, 1.2.3という数字を入力したとき、 #        整数、小数、使用できない数字という分類に分けよ。 # '123, 1.23, 1.2.3という数字を入力したとき、整数、小数、使用できない数字という分類に分けよ。'(_整数分類ならび,_小数分類ならび,_使用できない数字分類ならび) :- split('123, 1.23, 1.2.3',[',',' '],L), '整数、小数、使用できない数字という分類'(L,_整数分類ならび,_小数分類ならび,_使用できない数字分類ならび). '整数、小数、使用できない数字という分類'([],[],[],[]). '整数、小数、使用できない数字という分類'([A|R1],R2,R3,[A|R4]) :- 'Aが使用できない数字'(A), '整数、小数、使用できない数字という分類'(R1,R2,R3,R4),!. '整数、小数、使用できない数字という分類'([A|R1],[A|R2],R3,R4) :- 'Aが整数'(A), '整数、小数、使用できない数字という分類'(R1,R2,R3,R4),!. '整数、小数、使用できない数字という分類'([A|R1],R2,[A|R3],R4) :- 'Aが小数(A), '整数、小数、使用できない数字という分類'(R1,R2,R3,R4). '整数、小数、使用できない数字という分類'([A|R1],R2,R3,[A|R4]) :- 'Aがエラーではないが整数でも小数でもない', '整数、小数、使用できない数字という分類'(R1,R2,R3,R4),!. 'Aが使用できない数字'(A) :- \+(catch(atom_to_term(A,_,_),_,fail)). 'Aが整数'(A) :- atom_to_term(A,X,_), integer(X). 'Aが小数'(A) :- atom_to_term(A,X,_), float(X). 'Aがエラーではないが整数でも小数でもない'. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/625 # # [1] 授業単元:C言語 # [2] 問題文:123, 1.23, 1.2.3という数字を入力したとき、 #        整数、小数、使用できない数字という分類に分けよ。 # '123, 1.23, 1.2.3という数字を入力したとき、整数、小数、使用できない数字という分類に分けよ。' :- split('123, 1.23, 1.2.3',[',',' '],L), '整数、小数、使用できない数字という分類'(L). '整数、小数、使用できない数字という分類'([]). '整数、小数、使用できない数字という分類'([A|R]) :- \+(catch(atom_to_term(A,_,_),_,fail)), writef('%tは 使用できない数字 に分類されます\n',[A]), '整数、小数、使用できない数字という分類'(R). '整数、小数、使用できない数字という分類'([A|R]) :- atom_to_term(A,X,_), integer(X), writef('%tは 整数 に分類されます\n',[A]), '整数、小数、使用できない数字という分類'(R). '整数、小数、使用できない数字という分類'([A|R]) :- atom_to_term(A,X,_), float(X), writef('%tは 小数 に分類されます\n',[A]), '整数、小数、使用できない数字という分類'(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/523 # # 【 課題 】キーボードで生徒のデータを入力するプログラムを作成せよ # データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。 # 【 形態 】Javaアプリケーション(main()で開始 # 【 GUI  】制限なし # 【 期限 】2011年11月24日(木) # 【 Ver  】java version 1.6.0_22 # 【 補足 】作ってみたものの、上手く行きません。 # http://ime.nu/ideone.com/8gqKi # 何処がどう間違っているか指摘していただければ幸いです。 # # 'キーボードで生徒のデータを入力する。データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。' :- repeat, 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断), 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,_診断),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 指示に従い一行入力する('名前,ID,学年,電話番号 をカンマ区切りで入力して下さい(終了したい時は改行のみ) : ',Line), 入力診断(Line,_名前,_ID,_学年,_電話番号,_診断), \+(_診断 = 再入力),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断). 指示に従い一行入力する(_指示,Line) :- writef('%t',[_指示]), get_line(Line),!. 入力診断('',_名前,_ID,_学年,_電話番号,終了) :- !. 入力診断(Line,_名前,_ID,_学年_1,_電話番号,入力完了) :- split(Line,[','],[_名前,_ID,_学年,_電話番号]), 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年),!. 入力診断(Line,_名前,_ID,_学年,_電話番号,再入力) :- writef('入力された %t からは求める生徒データが得られません。再入力をお願いします。\n',[Line]). 学年の入力が負の場合メッセージを表示して中断する(_学年,_学年) :- _学年 >= 0,!. 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年) :- _学年_1 < 0, writef('学年データ%tが負数です。再入力をしますか? y or n : ',[_学年_1]), get_line(y), 学年の再入力(_学年),!. 学年の再入力(_学年) :- write('学年を入力して下さい : '), get_line(Line), 学年再入力診断(Line,_学年),!. 学年再入力診断(Line,_学年) :- atom_to_term(Line,_学年,_), integer(_学年), _学年 >= 0,!. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,終了) :- !. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,入力完了) :- assertz(生徒のデータ(_名前,_ID,_学年,_電話番号)), fail. % % http://nojiriko.asia/prolog/j71_523.html とは僅かな違い。 % 何処が違うのか、捜すのさえ難しいくらいだが。 % どちらが好ましい表現かという問題。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/523 # # 【 課題 】キーボードで生徒のデータを入力するプログラムを作成せよ # データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。 # 【 形態 】Javaアプリケーション(main()で開始 # 【 GUI  】制限なし # 【 期限 】2011年11月24日(木) # 【 Ver  】java version 1.6.0_22 # 【 補足 】作ってみたものの、上手く行きません。 # http://ime.nu/ideone.com/8gqKi # 何処がどう間違っているか指摘していただければ幸いです。 # # 'キーボードで生徒のデータを入力する。データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。' :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断), 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,_診断),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 指示に従い一行入力する('名前,ID,学年,電話番号 をカンマ区切りで入力して下さい(終了したい時は改行のみ) : ',Line), 入力診断(Line,_名前,_ID,_学年,_電話番号,_診断), \+(_診断 = 再入力). 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断). 指示に従い一行入力する(_指示,Line) :- writef('%t',[_指示]), get_line(Line),!. 入力診断('',_,_,_,_,終了) :- !. 入力診断(Line,_名前,_ID,_学年_1,_電話番号,入力完了) :- split(Line,[','],[_名前,_ID,_学年,_電話番号]), 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年),!. 入力診断(Line,_名前,_ID,_学年,_電話番号,再入力) :- writef('入力された %t からは求める生徒データが得られません。再入力をお願いします。\n',[Line]). 学年の入力が負の場合メッセージを表示して中断する(_学年,_学年) :- _学年 >= 0,!. 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年) :- _学年_1 < 0, writef('学年データ%tが負数です。再入力をしますか? y or n : ',[_学年_1]), get_line('学年データ%tが負数です。再入力をしますか? y or n : ',y), 学年の再入力(_学年),!. 学年の再入力(_学年) :- write('学年を入力して下さい : '), get_line(Line), 学年再入力診断(Line,_学年),!. 学年再入力診断(Line,_学年) :- atom_to_term(Line,_学年,_), integer(_学年), _学年 >= 0,!. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,終了) :- !. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,入力完了) :- assertz(生徒のデータ(_名前,_ID,_学年,_電話番号)), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/544 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):5 つの要素を持つdouble 型配列vx[] に対し # て,その各要素の正負を反転するプログラムを, # ポインタ演算を用いて作成せよ.例えばvx[] が # {1.1, 2.2, -3.3, 4.4, -5.5}であったとき,プログ # ラムの結果vx[] は{-1.1, -2.2, 3.3, -4.4, 5.5} # となる.ただし,プログラムは以下の要件を満たすこと # とする. # # 解答例等 # 5 つの実数を入力してください # vx[0] = 1.1 # vx[1] = 2.2 # vx[2] = -3.3 # vx[3] = 4.4 # vx[4] = -5.5 # 正負を反転させました。 # vx[0] = -1.100000 # vx[1] = -2.200000 # vx[2] = 3.300000 # vx[3] = -4.400000 # vx[4] = 5.500000 # '5 つの要素を持つならびに対して,その各要素の正負を反転する' :- '5 つの要素を持つならびに対して'(_ならび), 'その各要素の正負を反転する'(_ならび,_正負を反転したならび), '正負を反転したならびを表示する'(_正負を反転したならび). '5 つの要素を持つならびに対して'(_ならび) :- length(_ならび,5), write('5 つの実数を入力してください\n'), findall(_値,( '5 つの要素を実数で埋める'(_ならび,_値)), _ならび). '5 つの要素を実数で埋める'(_ならび,_値) :- append(L0,[_値|_],_ならび), length(L0,Len), writef('vx[%t] = ',[Len]), 実数の入力(_値). 実数の入力(_値) :- get_line(Line), 実数入力診断(Line,_値),!. 実数の入力(_値) :- 実数の入力(_値). 実数入力診断(Line,_値) :- atom_to_term(Line,_値,_), float(_値),!. 実数入力診断(Line,_値) :- writef('入力された %t からは実数が得られません。再入力をお願いします。\n',[Line]), fail. 'その各要素の正負を反転する'([],[]). 'その各要素の正負を反転する'([A|R1],[B|R2]) :- B is A * -1, 'その各要素の正負を反転する'(R1,R2). '正負を反転したならびを表示する'(_正負を反転したならび) :- append(L0,[_正負を反転された値|R],_正負を反転したならび), length(L0,Nth), writef('vx[%t] = %t\n',[Nth,_正負を反転された値]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/470 # # [2]つぎの関数をつくる # void zeroSuppress(char *src, char *dst, char pos, char flg) # posは小数点を挿入する位置で1なら1桁目と2桁目の間に # 小数点があるものとしてゼロサプレスします。 # 文字数<=posの場合処理しない。 # 動きの例 # src = "0123456"、 pos = 1 →dst = "123456" # src = "0012500" pos = 2 →dst ="12500" # src = "0000001" pos = 3 →dst ="0001" # src = "000B12" pos = 2 →dst ="000"(Bとそれ以降は無視) # flg = 1だと\0でうめる # src = "0000001" pos = 3 →dst = "\0\0\00001" # # 頭部ゼロサプレス(_数字文字列,_小数点位置文字,_フラグ,_表示文字列) :- atom_chars(_数字文字列,_ならび), 文字数値変換(_小数点位置文字,_小数点位置), ならび変換後の頭部ゼロサプレス(_ならび,_小数点位置,_フラグ,_表示ならび), atom_chars(_表示文字列,_表示ならび),!. ならび変換後の頭部ゼロサプレス(_ならび,_小数点位置,_フラグ,_表示文字列) :- 'B文字以下の除去'(_ならび,_ならび_1), 整数部と小数点部を分離(_ならび_1,_小数点位置,_整数部ならび,_小数部ならび), '整数部頭部の変換'(_整数部ならび,_フラグ,_変換された整数部ならび), append(_変換された整数部ならび,['.'|_小数部ならび],_表示ならび),!. 文字数値変換(_小数点位置文字,_小数点位置) :- atom_to_term(_小数点位置文字,_小数点位置,_). 'B文字以下の除去'(_ならび_1,_ならび_2) :- append(_ならび_2,['B'|R],_ならび_1),!. 'B文字以下の除去'(_ならび,_ならび). 整数部と小数点部を分離(_ならび,_小数点位置,_整数部ならび,_小数部ならび) :- length(_小数部ならび,_少数点位置), append(_整数部ならび,_小数部ならび,_ならび),!. 整数部と小数点部を分離(_ならび,_小数点位置,_整数部ならび,_小数部ならび) :- 'が7桁に満たない時は頭部にゼロを詰めておく'(_ならび,_頭部にゼロを詰めたならび), 整数部と小数点部を分離(_頭部にゼロを詰めたならび,_小数点位置,_整数部ならび,_小数部ならび). 'が7桁に満たない時は頭部にゼロを詰めておく'(_ならび,_頭部にゼロを詰めたならび) :- length(_頭部にゼロを詰めたならび,7), append(L1,_ならび,_頭部にゼロを詰めたならび), all(L1,'0'). 整数部頭部の変換([],_,[]). 整数部頭部の変換([A|R],_,[A|R]) :- \+(A = '0'),!. 整数部頭部の変換(['0'|R1],'1',['\000\'|R2]) :- 整数部頭部の変換(R1,R2),!. 整数部頭部のコード変換(['0'|R1],_フラグ,[' '|R2]) :- \+(_フラグ = '1'), 整数部頭部の変換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/470 # # [2]つぎの関数をつくる # void zeroSuppress(char *src, char *dst, char pos, char flg) # posは小数点を挿入する位置で1なら1桁目と2桁目の間に # 小数点があるものとしてゼロサプレスします。 # 文字数<=posの場合処理しない。 # 動きの例 # src = "0123456"、 pos = 1 →dst = "123456" # src = "0012500" pos = 2 →dst ="12500" # src = "0000001" pos = 3 →dst ="0001" # src = "000B12" pos = 2 →dst ="000"(Bとそれ以降は無視) # flg = 1だと\0でうめる # src = "0000001" pos = 3 →dst = "\0\0\00001" # # 頭部ゼロサプレス(_数字文字列,_小数点位置文字,_フラグ,_表示文字列) :- atom_codes(_数字文字列,_コードならび), 文字数値変換(_小数点位置文字,_小数点位置), コードならび変換後の頭部ゼロサプレス(_コードならび,_小数点位置,_フラグ,_表示コードならび), atom_codes(_表示文字列,_表示コードならび),!. コードならび変換後の頭部ゼロサプレス(_コードならび,_小数点位置,_フラグ,_表示文字列) :- 'B文字以下の除去'(_コードならび,_コードならび_1), 整数部と小数点部を分離(_コードならび_1,_小数点位置,_整数部コードならび,_小数部コードならび), '整数部頭部のコード変換'(_整数部コードならび,_フラグ,_変換された整数部コードならび), append(_変換された整数部コードならび,[46|_小数部コードならび],_表示コードならび),!. 文字数値変換(_小数点位置文字,_小数点位置) :- atom_to_term(_小数点位置文字,_小数点位置,_). 'B文字以下の除去'(_コードならび_1,_コードならび_2) :- append(_コードならび_2,[66|R],_コードならび_1),!. 'B文字以下の除去'(_コードならび,_コードならび). 整数部と小数点部を分離(_コードならび,_小数点位置,_整数部コードならび,_小数部コードならび) :- length(_小数部コードならび,_少数点位置), append(_整数部コードならび,_小数部コードならび,_コードならび),!. 整数部と小数点部を分離(_コードならび,_小数点位置,_整数部コードならび,_小数部コードならび) :- 'コードが7桁に満たない時は頭部にゼロを詰めておく'(_コードならび,_頭部にゼロを詰めたコードならび), 整数部と小数点部を分離(_頭部にゼロを詰めたコードならび,_小数点位置,_整数部コードならび,_小数部コードならび). 'コードが7桁に満たない時は頭部にゼロを詰めておく'(_コードならび,_頭部にゼロを詰めたコードならび) :- length(_頭部にゼロを詰めたコードならび,7), append(L1,_コードならび,_頭部にゼロを詰めたコードならび), all(L1,48). 整数部頭部のコード変換([],_,[]). 整数部頭部のコード変換([A|R],_,[A|R]) :- \+(A = 48),!. 整数部頭部のコード変換([48|R1],'1',[0|R2]) :- 整数部頭部のコード変換(R1,R2),!. 整数部頭部のコード変換([48|R1],_フラグ,[32|R2]) :- \+(_フラグ = '1'), 整数部頭部のコード変換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/477 # # [1] 授業単元:C言語 # [2] 問題文:3*3の逆行列Aをもとめよ # http://ime.nu/ideone.com/erZBk # '3*3の逆行列Aをもとめよ'(_a,_逆行列A) :- var(_a), '3行3列の行列aを入力'(_a), 逆行列(_a,_逆行列A). '3*3の逆行列Aをもとめよ'(_a,_逆行列A) :- \+(var(_a)), 逆行列(_a,_逆行列A). 逆行列(_行列,_逆行列) :- 行列に単位行列を結合して(_行列,_行列の二), 既約ガウス行列に変形(_行列の二,_既約ガウス行列), 変数正方行列(1,N,_逆行列), 行列の結合(_,_逆行列,_既約ガウス行列). 行列に単位行列を結合して(_行列,_行列の二) :- length(_行列,N), 単位行列(N,L), 行列の結合(_行列,L,_行列の二). 行列の結合(Len1,Len2,[_行1],[_行2],[_行3]) :- append(_行1,_行2,_行3), length(_行1,Len1), length(_行2,Len2). 行列の結合(Len1,Len2,[_行1|R1],[_行2|R2],[_行3|R3]) :- append(_行1,_行2,_行3), 行列の結合(Len1,Len2,R1,R2,R3), length(_行1,Len1), length(_行2,Len2). 行列の結合([_行1|R1],[_行2|R2],_結合された行列) :- 行列の結合(Len1,Len2,[_行1|R1],[_行2|R2],_結合された行列), Len1 > 0, Len2 > 0. 変数正方行列(M,N,[]) :- M > N. 変数正方行列(M,N,[L|R]) :- length(L,N), M2 is M + 1, 変数正方行列(M2,N,R). '3行3列の行列aを入力'(_a) :- length(_a,3), findall(L,( append(L0,[L|_],_a), length(L,3), length(L0,_行位置), '3列入力する'(_行位置,1,L)), _a). '3列入力する'(_,_,[]). '3列入力する'(_行位置,_列位置,[V|R]) :- writef('列入力[_行位置][_列位置] : '), get_line(Line), atom_to_term(Line,V,_), _列位置_2 is _列位置 + 1, '3列入力する'(_行位置,_列位置_2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/454 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 線形リスト構造で、整数を1つ入れる度にソートし、出力するプログラムを作成せよ # 配列はitem[11]とnext[11]を用意する。 # '線形リスト構造で、整数を1つ入れる度にソートし、出力する'(_線形リスト,_挿入されたリスト) :- writef('線形リストの初期値 = %t\n',[[]]), '整数を1つ入れる度に'(_整数), '線形リスト構造で、整数を1つ入れる度にソートし、出力する'(_線形リスト,_整数,_挿入されたリスト), 出力する(_挿入されたリスト). '線形リスト構造で、整数を1つ入れる度にソートし、出力する'([],_挿入整数,[_挿入整数]). '線形リスト構造で、整数を1つ入れる度にソートし、出力する'([A|R1],_挿入整数,[_挿入整数|R1]) :- A >= _挿入整数,!. '線形リスト構造で、整数を1つ入れる度にソートし、出力する'([A|R1],_挿入整数,[A|R1]) :- A < _挿入整数, '線形リスト構造で、整数を1つ入れる度にソートし、出力する'([A|R1],_挿入整数,R2). '整数を1つ入れる度に'(_整数) :- write('整数を1つ入れて下さい : '), get_line(Line), 整数入力診断(Line,_整数),!. '整数を1つ入れる度に'(_整数) :- '整数を1つ入れる度に'(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 出力する(_挿入されたリスト) :- writef('整列された線形リスト = %t\n',[[_挿入されたリスト]]). /* '線形リスト構造で、整数を1つ入れる度にソートし'(_線形リスト,_挿入整数,_挿入された線形リスト) :- append(L0,[A|R],_線形リスト), _挿入整数 =< A, append(L0,[_挿入整数,A|R],_挿入された線形リスト),!. '線形リスト構造で、整数を1つ入れる度にソートし'(_線形リスト,_挿入整数,_挿入された線形リスト) :- append(_線形リスト,[_挿入整数],_挿入された線形リスト). */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/399 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):http://ime.nu/i.imgur.com/UwzPZ.jpg # # # 下の例のような、学生の4科目の(数学、物理、科学、英語)の試験点数(100点満点)を # 書いたファイルがある。(学生数は100名以下) # # ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、 # 各科目の平均点を表示するプログラムを作成する。 # # ・ 科目名(6文字未満)を入れる文字列(文字の一次元配列)を4つ用意する。 # # ・ 学籍番号と点数を一緒に入れる二次元整数配列を用意する # 例 int tensu[ ? ][ ? ] # # 最初に二次元配列を表示して、実行例のように点数を表示し、次に各学生の # 平均点、各科目の平均点を表示する。 # # ただし、ファイルの先頭には学生数(この例では5名)があり、つぎに4科目の # 科目名(数学、物理、科学、英語)が記述され、続いて、1行目に指定した学生数分 # の学籍番号と各試験点数が書かれている。 # # # ファイルの例(5名の例) # # 5 # Math Phys Chem Eng # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 表示例 # # 点数 :::: # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 学生平均 :::: # 8001 : 80.0 # 8004 : 48.25 # 8013 : 85.50 # 8035 : 81.25 # 8062 : 47.25 # # 科目平均 # 数学 : 69.8 # 物理 : 65.0 # 科学 : 69.0 # 英語 : 70.0 # 'ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_ファイル名) :- 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび), '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび). 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- get_lines(_ファイル名,Lines), 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数), 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび), '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび),!. 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数) :- Lines = [_学生数文字列|_], atom_to_term(_学生数文字列,_学生数,_), integer(_学生数),!. 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび) :- Lines = [_,_二行目文字列|_], split(_二行目文字列,[' ',','],_科目名ならび),!. '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび) :- length(_学籍番号と各試験点数ならび,_学生数), Lines = [_,_|_残りLines], findall(_学籍番号と各点数,( append(_,[_学籍番号と各点数文字列|_],_残りLines), aplit(_学籍番号と各点数文字列,[' ',','],_学籍番号と各点数)), _学籍番号と各試験点数ならび). '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- 学生の科目の一覧を表示(_学籍番号と各試験点数ならび), '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび). 学生の科目の一覧を表示(_学籍番号と各試験点数ならび) :- append(_,[_学籍番号と各試験点数|R],_学籍番号と各試験点数ならび), concat_atom(_学籍番号と各試験点数,' ',_表示文字列), writef('%t\n',[_表示文字列]), R = []. '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび) :- 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび), 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点ならび), 各学生の平均点を表示する(_各学生の平均点ならび), 各科目の平均点を表示する(_各科目の平均点ならび). 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび) :- findall([_学籍番号,_平均点],( append(_,[[_学籍番号|L]|_],_学籍番号と各試験点数ならび), 相加平均(L,_平均点)), _各学生の平均点ならび). 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点ならび) :- 転置(_学籍番号と各試験点数ならび,[_|_科目別点数ならび]), findall([_科目名,_平均点],( 科目名と点数ならびを得る(_科目名ならび,_学籍番号と各試験点数ならび,_科目名,_点数ならび), 相加平均(_点数ならび,_平均点)), _各科目の平均点ならび). 科目名と点数ならびを得る(_科目名ならび,_学籍番号と各試験点数ならび,_科目名,_点数ならび) :- append(L0,[_科目名|_],_科目名ならび), length(L0,Len), nth1(Len,_科目別点数ならび,_点数ならび). 各学生の平均点を表示する(_各学生の平均点ならび) :- write('\n学生平均 ::::\n'), append(_,[[_学籍番号,_平均点]|R],_各学生の平均点ならび), writef('%8r : %5r\n',[_学籍番号,_平均点]), R = []. 各科目の平均点を表示する(_各科目の平均点ならび) :- write('\n科目平均 ::::\n'), append(_,[[_科目名,_平均点]|R],_各科目の平均点ならび), writef('8r : %5r\n',[_科目名,_平均点]), R = []. % % http://nojiriko.asia/prolog/c153_399.html の % 各学生の平均点以下の述語定義と比較して、 % どちらが、理解しやすいかを問う。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/399 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):http://ime.nu/i.imgur.com/UwzPZ.jpg # # # 下の例のような、学生の4科目の(数学、物理、科学、英語)の試験点数(100点満点)を # 書いたファイルがある。(学生数は100名以下) # # ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、 # 各科目の平均点を表示するプログラムを作成する。 # # ・ 科目名(6文字未満)を入れる文字列(文字の一次元配列)を4つ用意する。 # # ・ 学籍番号と点数を一緒に入れる二次元整数配列を用意する # 例 int tensu[ ? ][ ? ] # # 最初に二次元配列を表示して、実行例のように点数を表示し、次に各学生の # 平均点、各科目の平均点を表示する。 # # ただし、ファイルの先頭には学生数(この例では5名)があり、つぎに4科目の # 科目名(数学、物理、科学、英語)が記述され、続いて、1行目に指定した学生数分 # の学籍番号と各試験点数が書かれている。 # # # ファイルの例(5名の例) # # 5 # Math Phys Chem Eng # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 表示例 # # 点数 :::: # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 学生平均 :::: # 8001 : 80.0 # 8004 : 48.25 # 8013 : 85.50 # 8035 : 81.25 # 8062 : 47.25 # # 科目平均 # 数学 : 69.8 # 物理 : 65.0 # 科学 : 69.0 # 英語 : 70.0 # 'ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_ファイル名) :- 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび), '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび). 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- get_lines(_ファイル名,Lines), 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数), 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび), '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび),!. 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数) :- Lines = [_学生数文字列|_], atom_to_term(_学生数文字列,_学生数,_), integer(_学生数),!. 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび) :- Lines = [_,_二行目文字列|_], split(_二行目文字列,[' ',','],_科目名ならび),!. '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび) :- length(_学籍番号と各試験点数ならび,_学生数), Lines = [_,_|_残りLines], findall(_学籍番号と各点数,( append(_,[_学籍番号と各点数文字列|_],_残りLines), aplit(_学籍番号と各点数文字列,[' ',','],_学籍番号と各点数)), _学籍番号と各試験点数ならび). '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- write('\n'), 学生の科目の一覧を表示(_学籍番号と各試験点数ならび), '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび). 学生の科目の一覧を表示(_学籍番号と各試験点数ならび) :- append(_,[_学籍番号と各試験点数|R],_学籍番号と各試験点数ならび), concat_atom(_学籍番号と各試験点数,' ',_表示文字列), writef('%t\n',[_表示文字列]), R = []. '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび) :- 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび), 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点), write('\n学生平均 ::::\n'), 各学生の平均点を表示する(_各学生の平均点ならび), write('\n科目平均 ::::\n'), 各科目の平均点を表示する(_各科目の平均点). 各学生の平均点([],[]). 各学生の平均点([[_学籍番号|L]|R1],[[_学籍番号,_平均点]|R2]) :- 相加平均(L,_平均点), 各学生の平均点(R1,R2). 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点) :- 転置(_学籍番号と各試験点数ならび,[_|_科目別点数ならび]), 転置された点数ならびから科目別平均点を得る(_科目名ならび,_科目別点数ならび,_各科目の平均点). 転置された点数ならびから科目別平均点を得る([],[],[]). 転置された点数ならびから科目別平均点を得る([_科目名|R1],[L|R2],[[_科目名,_平均点]|R3]) :- 相加平均(L,_平均点), 転置された点数ならびから科目別平均点を得る(R1,R2,R3). 各学生の平均点を表示する([]). 各学生の平均点を表示する([[_学籍番号,_平均点]|R]) :- writef('%8r : %5r\n',[_学籍番号,_平均点]), 各学生の平均点を表示する(R). 各科目の平均点を表示する([]). 各科目の平均点を表示する([[_科目名,_平均点]|R]) :- writef('8r : %5r\n',[_科目名,_平均点]), 各科目の平均点を表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/421 # # [1] 授業単元:C言語 # [2] 問題文:ガウスの消去法を使ってn元連立方程式を解け # http://ime.nu/ideone.com/2GwBp # ガウスの消去法を使ってn元連立方程式を解け(_n元,_解ならび) :- 拡大係数行列を得る(_n元,_拡大係数行列), 既約ガウス行列に変形(_拡大係数行列,_既約ガウス行列), 最終列を取り出す(_既約ガウス行列,_解ならび). 拡大係数行列を得る(_n元,_拡大係数行列) :- M is _n元 + 1, length(_拡大係数行列,_n元), findall(_行,( append(Ln,[_行|R],_拡大係数行列), length(_行,M), length([_|Ln],_何行目), 係数の入力(_何行目,1,_n元,_行)), _拡大係数行列). 係数の入力(_何行目,1,_n元,_行) :- writef('%t行目 : ',[_何行目]), findall(_係数,( for(1,N,_n元), writef('A * X[%t] : ',[N]), 数を得る(_係数)), _係数ならび), write(' = A :'), 数を得る(_最後の係数), append(_係数ならび,[_最後の係数],_行),!. 最終列を取り出す(_行列,_最終列) :- 転置(_行列,_最終列), append(_,[_最終列],_転置された行列). 数を得る(_数) :- get_line(Line), 数を得る診断(Line,_数),!. 数を得る(_数) :- 数を得る(_数). 数を得る診断(Line,_数) :- atom_to_term(Line,_数,_), 数の形式検査(_数),!. 数を得る診断(Line,_数) :- writef('入力された %t からは適切な係数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 数の形式検査(_数) :- number(_数),!. 数の形式検査(_数1 / _数2) :- number(_数1), number(_数2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/400 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): #  入力された数値が素数か否かを判定し,結果を画面に出力せよ.ただし # #  .襦璽很仁瓩鮖箸κ法 #  ∈撞⊇萢を使う方法 #  上記のどちらも使わない方法 # #  のいずれについても解答する事. # '入力された数値が素数か否かを判定し,結果を画面に出力する'(_数) :- 入力された数値が(_入力された数値), '素数か否かを判定し,結果を画面に出力する'(_入力された数値). 入力された数値が(_入力された数値) :- write('1以上の整数を入力して下さい : '), get_line(Line), 入力された数値診断(Line,_入力された数値),!. 入力された数値が(_入力された数値) :- 入力された数値が(_入力された数値). 入力された数値診断(Line,_入力された数値) :- atom_to_term(Line,_入力された数値,_), integer(_入力された数値), _入力された数値 >= 1,!. 入力された数値診断(Line,_入力された数値) :- writef('入力された %t からは1以上の整数が得られません。再入力をお願いします\n',[Line]), fail. '素数か否かを判定し,結果を画面に出力する'(_入力された数値) :- 素数(_入力された数値), writef('%tは素数です\n',[_入力された数値]),!. '素数か否かを判定し,結果を画面に出力する'(_入力された数値) :- \+(素数(_入力された数値)), writef('%tは素数ではありません\n',[_入力された数値]). 素数(_数) :- 約数の個数(_数,_約数の個数), _約数の個数 =< 2. 約数の個数(_数,_約数の個数) :- _数_1 is _数 - 1, count(( for(1,N,_数_1), 0 is _数 mod N)), _約数の個数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/383 # # # [1] 授業単元:プログラミング演習 # # [2] 問題文(含コード&リンク): # # # http://ime.nu/codepad.org/bMCs37CD # # 3): # 西暦で表された、年、月、日、の3つの値が与えられていたとして、その年内で経過日数を求めるプログラムを作成する。 # ?ヶ月ごとの日数を配列に格納するが、うるう年があるため、?行?列の多次元配列を用いることとする。 # # int mdays[][12]={{日数を入れる},{うるう年の日数を入れる}}; # # 結果は標準入出力とする。 # # '西暦で表された、年、月、日、の3つの値が与えられていたとして、その年内で経過日数を求める'(_年,_月,_日,_経過日数) :- うるう年(_年), 月日数([_月日数ならび,_]), 経過日数計算(_月,_日,_月日数ならび,_経過日数). '西暦で表された、年、月、日、の3つの値が与えられていたとして、その年内で経過日数を求める'(_年,_月,_日,_経過日数) :- \+(うるう年(_年)), 月日数([_,_月日数ならび]), 経過日数計算(_月,_日,_月日数ならび,_経過日数). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 経過日数計算(_月,_日,_月日数ならび,_経過日数) :- length([_|L0],_月), append(L0,_,_月日数ならび), sum(L0,_前月末日までの経過日数), _経過日数 is _前月末日までの経過日数 + _日. 月日数([[31,29,31,30,31,30,31,31,30,31,30,31],[31,28,31,30,31,30,31,31,30,31,30,31]]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/335 # # [1] 授業単元:楽しいプログラミング # [2] 問題文(含コード&リンク): 以下の実行例のように,三角形の2 辺の長さとその2 # 辺のなす角(0〜180[deg])を入力すると,もう1 辺の # 長さと,三角形の面積を表示するプログラムを作成せ # よ.π = 3.14159265 とする. #  [3.1] OS: linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限:2011年11月17日 9:00まで # [5] その他の制限: while, if, for, 配列まで # # 例 #  三角形の2 辺の長さを入力してください。 # 辺1:-3.0 # 正の値を入力してください。辺1:3.0 # 辺2:6.0 # 2 辺のなす角度[deg] を入力してください:200.0 # 0<角度[deg]<180 の値を入力してください。30.0 # もう1 辺の長さ= 3.717941 # 三角形の面積= 4.500000 # # '三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると,もう1 辺の長さと,三角形の面積を表示するプログラムを作成せよ.π = 3.14159265 とする' :- '三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると'(_辺の長さ_1,_辺の長さ_2,_2辺のなす角), もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角). '三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると'(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :- write('三角形の2 辺の長さを入力してください。 '), 辺の長さ_1の入力(_辺の長さ_1), 辺の長さ_2の入力(_辺の長さ_2), '2辺のなす角の入力'(_2辺のなす角). 辺の長さ_1の入力(_辺の長さ_1) :- write('辺[1] : '), get_line(Line), 辺の長さ_1の入力診断(Line,_辺の長さ_1),!. 辺の長さ_1の入力(_辺の長さ_1) :- 辺の長さ_1の入力(_辺の長さ_1). 辺の長さ_2の入力(_辺の長さ_2) :- write('辺[2] : '), get_line(Line), 辺の長さの入力診断(Line,_辺の長さ_2),!. 辺の長さ_2の入力(_辺の長さ_2) :- 辺の長さ_2の入力(_辺の長さ_2). 辺の長さの入力診断(Line,_辺の長さ) :- atom_to_term(Line,_辺の長さ,_), number(_辺の長さ), _辺の長さ > 0.0,!. 辺の長さの入力診断(Line,_辺の長さ) :- writef('入力された %t からは三角形の辺にあたる情報が得られません。再入力をお願いします。\n',[Line]), fail. '2辺のなす角の入力'(_2辺のなす角) :- write('2辺のなす角度を入力して下さい (0<角度<180) : '), get_line(Line), '2辺のなす角の入力診断'(Line,_2辺のなす角),!. '2辺のなす角の入力'(_2辺のなす角) :- '2辺のなす角の入力(_2辺のなす角). '2辺のなす角の入力診断'(Line,_2辺のなす角) :- atom_to_term(Line,_2辺のなす角), number(_2辺のなす角), _2辺のなす角 > 0.0, _2辺のなす角 < 180.0,!. '2辺のなす角の入力診断'(Line,_2辺のなす角) :- writef('入力された%t からは2辺のなす角を得られません。再入力をお願いします。\n',[Line]), fail. もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :- _辺の長さ_2 >= _辺の長さ_1, もう1辺の長さ(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_もう1辺の長さ), 三角形の面積(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_三角形の面積), 表示する(_もう1辺の長さ,_三角形の面積),!. もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :- _辺の長さ_2 < _辺の長さ_1, もう1辺の長さと三角形の面積を表示する(_辺の長さ_2,_辺の長さ_1,_2辺のなす角). もう1辺の長さ(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_もう1辺の長さ) :- _三角形の高さ is _辺の長さ_1 * sin(_2辺のなす角 / 180 * pi), _辺の長さ_2_1 is _辺の長さ_1 * cos(_2辺のなす角 / 180 * pi), _辺の長さ_2_2 is _辺の長さ_2 - _辺の長さ_2_1, _もう1辺の長さ is sqrt(_辺の長さ_2_2 * _辺の長さ_2_2 + _三角形の高さ * _三角形の高さ). 三角形の面積(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_三角形の面積) :- _三角形の高さ is _辺の長さ_1 * sin(_2辺のなす角 / 180 * pi), _三角形の面積 is _辺の長さ_2 * _三角形の高さ / 2. 表示する(_もう1辺の長さ,_三角形の面積) :- writef('%16c : %12r\n%16c : %12r\n',[もう1辺の長さ,_もう1辺の長さ,三角形の面積,_三角形の面積]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/211 # # [1] 授業単元:プログラミング入門 # [2] 問題文:秒数を与えると,それが何日何時間何分何秒にあた # るかを計算する関数 # calctime(long sec, int *dp, int *hp, int *mp, # int *sp); # を作成せよ.例えば # calctime(100000, &d, &h, &m, &s); # として呼び出すとd=1, h=3,m=46,s=40 となる # (100,000 秒=1 日3 時間46 分40 秒).以下の実行例の # ように,関数の動作を確認できるmain 関数も作成しろ # 実行例.秒数を入力してください:100000 # 100000 秒= 1 日3 時間46 分40 秒 # '秒数を与えると,それが何日何時間何分何秒にあたるかを計算する' 秒数を与えると(_秒数), それが何日何時間何分何秒にあたるかを計算する(_秒数,_何日,_何時間,_何分), 何日何時間何分にあたるかを表示する(_秒数,_何日,_何時間,_何分). 秒数を与えると(_秒数) :- write('秒数を入力してください:\n'), get_line(Line), 秒数入力診断(Line,_秒数),!. 秒数を与えると(_秒数) :- 秒数を与えると(_秒数). 秒数入力診断(Line,_秒数) :- atom_to_term(Line,_秒数,_), integer(_秒数), _秒数 >= 0,!. 秒数入力診断(Line,_秒数) :- writef('入力された %t からは適切な秒数が得られません。再入力をお願いします。\n',[Line]), fail. それが何日何時間何分何秒にあたるかを計算する(_秒数,_何日,_何時間,_何分) :- _何日 is _秒数 // 86400, _余りの一 is _秒数 mod 86400, _何時間 is _余り // 3600, _余りの二 is _余り mod 3600, _何分 is _余り // 60. 何日何時間何分にあたるかを表示する(_秒数,_何日,_何時間,_何分) :- writef('%t 秒= %t日%t時間%t分\n',[_秒数,_何日,_何時間,_何分]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/140 # # [1] 授業単元: Cプロ # [2] 問題文(含コード&リンク): # 3行3列の行列aを入力後、余因子行列で行列値|a|を求める # '3行3列の行列aを入力後、余因子行列で行列値|a|を求める' :- '3行3列の行列aを入力'(_a), '余因子行列で行列値|a|を求める'(_a,_行列式_aの値), writef('行列値|a|は%tです。\n',[_行列値_aの値]). '3行3列の行列aを入力'(_a) :- length(_a,3), findall(L,( nth1(_nth1,_a,L), length(L,3), '3列入力する'(_nth1,1,L)), _a). '3列入力する'(_,_,[]). '3列入力する'(_行位置,_列位置,[V|R]) :- writef('列入力[%t][%t] : ',[_行位置,_列位置]), get_line(Line), atom_to_term(Line,V,_), _列位置_2 is _列位置 + 1, '3列入力する'(_行位置,_列位置_2,R). '余因子行列を使って逆行列を得る'(_n,_正方行列,_逆行列) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値), 余因子行列(_n,_正方行列,_余因子行列), 転置(_余因子行列,_転置された余因子行列), 行列のすべての要素に値を掛ける(1,_n,_転置された余因子行列,1 / _行列式の値,_逆行列). 行列のすべての要素に値を掛ける(_行目,_n,LL,_,LL) :- _行目 > _n,!. 行列のすべての要素に値を掛ける(_行目,_n,LL1,_乗数 / _除数,LL2) :- '行基本変形'(_乗数 / _除数 # _行目,LL1,LL3), _行目_2 is _行目 + 1, 行列のすべての要素に値を掛ける(_行目_2,_n,LL3,_乗数 / _除数,LL2). '余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :- 余因子行列(_n,_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], '二つのならびの積の和'(_aの第一行,_余因子行列の第一行,_行列式_aの値). '二つのならびの積の和'([],[],0). '二つのならびの積の和'([A|R1],[B|R2],S) :- '二つのならびの積の和'(R1,R2,S_1), S is S_1 + A * B. 余因子行列(_n,_正方行列,_余因子行列) :- length(_余因子行列,_n), findall(L,( nth1(_i,_余因子行列,L), 余因子行列の要素が余因子である(_n,_正方行列,_i,L)), _余因子行列). 余因子行列の要素が余因子である(_n,_正方行列,_i,L) :- length(L,_n), findall(_余因子,( nth1(_j,L,_余因子), 余因子(_n,_正方行列,_i,_j,_余因子)), L). 行列式の値(_正方行列,_i,_n,_行列式の値) :- findsum(W,( 'n次正方行列の要素を列・行取り出す'(_n,_正方行列,_i,_j,_正方行列の要素), 余因子(_n,_正方行列,_i,_j,_余因子), W is _正方行列の要素 * _余因子), _行列式の値). 余因子(_n,_正方行列,_i,_j,_余因子) :- 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子). 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) :- '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), 'i,jから乗数を得る'(_i,_j,_乗数), 二つの対角要素の積を得る(_n,_n_1次正方行列,_右下がり対角要素の積,_右上がり対角要素の積), _余因子 is _乗数 * (_右下がり対角要素の積-_右上がり対角要素の積). '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列) :- '第何行を取り除く'(_正方行列,_i,_第i行が取り除かれた行列), 転置(_第i行が取り除かれた行列,_転置された第i行が取り除かれた行列), '第何行を取り除く'(_転置された第i行が取り除かれた行列,_j,_転置された第i行第j列が取り除かれた行列), 転置(_転置された第i行第j列が取り除かれた行列,_n_1次正方行列). '第何行を取り除く'(_正方行列,_第何行,_第i行が取り除かれた行列) :- append(L0,[L|R],_正方行列), length([_|L0],_第何行), append(L0,R,_第i行が取り除かれた行列). 二つの対角要素の積を得る(_n,_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- 二つの対角要素を得る(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), 対角要素の掛算(_右下がり対角要素ならび,_右下がり対角要素の積), 対角要素の掛算(_右上がり対角要素ならび,_右上がり対角要素の積). 二つの対角要素を得る(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- 右下がり対角要素ならび(_n,_正方行列,_右下がり対角要素ならび), 右上がり対角要素ならび(_n,_正方行列,_右上がり対角要素ならび). 右下がり対角要素ならび(_n,_正方行列,_右下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), nth1(_nth1,L,V)), _右下がり対角要素ならび). 右上がり対角要素ならび(_n,_正方行列,_右上がり対角要素ならび) :- findall(V,( append(_,[L|R],_正方行列), length([_|R],_nth1), nth1(_nth1,L,V)), _右上がり対角要素ならび),!. 左下がり対角要素ならび(_n,_正方行列,_左下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), length([_|R],_nth1), append(_,[V|R],L)), _左下がり対角要素ならび),!. 左上がり対角要素ならび(_n,_正方行列,_左下がり対角要素ならび) :- findall(V,( append(_,[L|R1],_正方行列), length([_|R1],_nth1), length([_|R2],_nth1), append(_,[V|R2],L)), _左上がり対角要素ならび),!. 'i,jから乗数を得る'(_i,_j,(-1)) :- 1 is (_i + _j) mod 2,!. 'i,jから乗数を得る'(_i,_j,1) :- 0 is (_i + _j) mod 2,!. 対角要素の掛算([],1). 対角要素の掛算([A|R],X) :- 対角要素の掛算(R,Y), X is A * Y. 行列式の値(_正方行列,_i,_n,_行列式の値) :- findsum(W,( 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i,_j,_正方行列の要素), 余因子(_n,_正方行列,_i,_j,_余因子), W is _正方行列の要素 * _余因子), _行列式の値). 'n次正方行列の要素を行・列順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_i行), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_j列), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/137 # # [1] 授業単元:基礎プロ # [2] 問題文(含コード&リンク): # キーボードから自然数 n を読み込む. # 読み込んだ自然数 n の階乗を計算する. # 計算結果を以下の実行例のように出力する. # # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > # # この動作をするプログラムを作成せよ # 'キーボードから自然数 n を読み込む.読み込んだ自然数 n の階乗を計算する.計算結果を以下の実行例のように出力する.' 'キーボードから自然数 n を読み込む'(_n), '読み込んだ自然数 n の階乗を計算する.'(_n,_階乗式の文字列表現,_nの階乗), '計算結果を以下の実行例のように出力する.'(_n,_階乗式の文字列表現,_nの階乗). 'キーボードから自然数 n を読み込む'(_n) :- 自然数を読み込む(_n). '読み込んだ自然数 n の階乗を計算する.'(_n,_1からnまでの数ならび,_nの階乗) :- findall(N,for(1,N,_n),_1からnまでの数ならび), mult(_1からnまでの数ならび,_nの階乗). /* findmult(_対象項,_実行項,_解) :- findall(_対象項,_実行項,L), mult(L,_解). */ mult([],1). mult([A|R],X) :- mult(R,Y), X is A * Y. '計算結果を以下の実行例のように出力する.'(_n,_1からnまでの数ならび,_nの階乗) :- concat_atom(_1からnまでのならび,' × ',_階乗式の表示用文字列), writef('%t! = %t = %t\n',[_n,_階乗式の表示用文字列,_nの階乗]). 自然数を読み込む(_自然数) :- write('自然数を入力 : '), get_line(Line), 自然数を読み込み診断(Line,_自然数),!. 自然数を読み込む(_自然数) :- 自然数を読み込む(_自然数). 自然数を読み込み診断(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 0,!. 自然数を読み込み診断(Line,_自然数) :- writef('入力された %t からは自然数が得られません。再入力をお願いします。\n',[Line]), fail. % % 何故findmult/3を使わなかったか? % % 目下の課題は以下の実行例をどのように述語定義の中に取り込むかだ % コメントはそのまま引数ゼロの述語として定義し、副目標として書いて置けばよいが % このような改行のある事例は述語アトムとして見やすいものにならない。 % /* # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/137 # # [1] 授業単元:基礎プロ # [2] 問題文(含コード&リンク): # キーボードから自然数 n を読み込む. # 読み込んだ自然数 n の階乗を計算する. # 計算結果を以下の実行例のように出力する. # # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > # # この動作をするプログラムを作成せよ # 'キーボードから自然数 n を読み込む.読み込んだ自然数 n の階乗を計算する.計算結果を以下の実行例のように出力する.' 'キーボードから自然数 n を読み込む'(_n), '読み込んだ自然数 n の階乗を計算する.'(_n,_階乗式の文字列表現,_nの階乗), '計算結果を以下の実行例のように出力する.'(_n,_階乗式の文字列表現,_nの階乗). 'キーボードから自然数 n を読み込む'(_n) :- 自然数を読み込む(_n). '読み込んだ自然数 n の階乗を計算する.'(_n,_1からnまでの数ならび,_nの階乗) :- findall(N,for(1,N,_n),_1からnまでの数ならび), concat_atom(_1からnまでの数ならび,'*',_階乗式の文字列表現), atom_to_term(_階乗式の文字列表現,_式,_), _nの階乗 is _式. '計算結果を以下の実行例のように出力する.'(_n,_1からnまでの数ならび,_nの階乗) :- concat_atom(_1からnまでのならび,' × ',_階乗式の表示用文字列), writef('%t! = %t = %t\n',[_n,_階乗式の表示用文字列,_nの階乗]). 自然数を読み込む(_自然数) :- write('自然数を入力 : '), get_line(Line), 自然数を読み込み診断(Line,_自然数),!. 自然数を読み込む(_自然数) :- 自然数を読み込む(_自然数). 自然数を読み込み診断(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 0,!. 自然数を読み込み診断(Line,_自然数) :- writef('入力された %t からは自然数が得られません。再入力をお願いします。\n',[Line]), fail. % % 目下の課題は以下の実行例をどのように述語定義の中に取り込むかだ % コメントはそのまま引数ゼロの述語として定義し、副目標として書いて置けばよいが % このような改行のある事例は述語アトムとして見やすいものにならない。 % /* # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/134 # # [2] 問題文(含コード&リンク): # 1:キーボードから自然数 m と n を読み込む. 2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示. 3:この 2:の操作を m 回繰り返す. # 実行例 # > ./ex06-3 # 繰り返し回数を入力: 10 # 乱数の個数を入力: 100 # 回 平均 # 1 0.509034 # 2 0.488603 # 3 0.485044 # 4 0.473806 # 5 0.503660 # 6 0.519470 # 7 0.477955 # 8 0.536236 # 9 0.516652 # 10 0.467380 # > # この動作をするプログラムを作成せよ。乱数は疑似乱数発生関数 drand48 を用いる.この関数は呼び出すたびにdrand48() を 3 回呼び出すと,drand48() の生成した三つの乱数がそれぞれ変数 x, y, z に格納される. # double x, y, z; x = drand48(); y = drand48(); z = drand48(); # この関数を用いるプログラムは,冒頭に #include <stdlib.h> と記述 # '1:キーボードから自然数 m と n を読み込む. 2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示. 3:この 2:の操作を m 回繰り返す.' :- '1:キーボードから自然数 m と n を読み込む'(_m,_n), '2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(1,_実行回数,_m,_n), '3:この 2:の操作を m 回繰り返す.' (_実行回数,_m). '1:キーボードから自然数 m と n を読み込む'(_m,_n) :- 'キーボードから自然数 m を読み込む'(_m), 'キーボードから自然数 n を読み込む'(_n). 'キーボードから自然数 m を読み込む'(_m) :- 自然数を読み込む(_m). 'キーボードから自然数 n を読み込む'(_n) :- 自然数を読み込む(_n). 自然数を読み込む(_自然数) :- get_line(Line), 自然数を読み込む(Line,_自然数),!. 自然数を読み込む(_自然数) :- 自然数を読み込む(_自然数). 自然数を読み込む(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 0,!. 自然数を読み込む(Line,_自然数) :- writef('入力された %t からは自然数が得られません。再入力をお願いします。\n'), fail. '2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(_実行回数,_実行回数,_n) :- '0 以上 1 未満の一様乱数 n 個の平均値を計算して'(_n,_平均値), '実行例ように表示'(_実行回数,_平均値). '2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(_実行回数_1,_実行回数,_n) :- _実行回数_2 is _実行回数_1 + 1, '2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(_実行回数_2,_実行回数,_n). '0 以上 1 未満の一様乱数 n 個の平均値を計算して'(_n,_平均値) :- findavg(_一様乱数,( for(1,_,_n), '0 以上 1 未満の一様乱数'(_一様乱数)), _平均値). '0 以上 1 未満の一様乱数'(_一様乱数) :- _一様乱数 is random(1000000) / 1000000. '実行例ように表示'(_実行回数,_平均値) :- writef('%3l%8l\n',[_実行回数,_平均値]). '3:この 2:の操作を m 回繰り返す.' (_m,_m). % % 目下の課題は以下の実行例をどのように述語定義の中に取り込むかだ % /* 実行例 :- # 1 0.509034 # 2 0.488603 # 3 0.485044 # 4 0.473806 # 5 0.503660 # 6 0.519470 # 7 0.477955 # 8 0.536236 # 9 0.516652 # 10 0.467380 */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/102 # # [1] プログラミング実習応用 # [2] √a(ただしaは正の実数)の近似値を求めて表示するプログラムを作成せよ。 #   X(n)=1/2{X(n-1)+a/X(n-1)},X(0)=1.0 ()の文字は右下の文字。 #   ・nは整数型、X(n)は実数型(float or double) ・aの値はキーボードから入力 #   ・再起呼び出しによる方法、逐次的に計算する方法のいずれでもよい # 'X'(_a,0,1.0). 'X'(_a,_n,X) :- _n_1 is _n - 1, 'X'(_a,_n_1,Y), X is Y / 2 + _a / ( 2 * Y). '√a(ただしaは正の実数)の近似値を求めて表示する' :- 'aはキーボードから入力'(_a), 'X'(_a,50,_近似値), 表示する(_近似値). 'aはキーボードから入力'(_a) :- write('aを入力して下さい : '), get_char(Line), 'aはキーボードから入力'(Line,_a),!. 'aはキーボードから入力'(_a) :- 'aはキーボードから入力'(_a). 'aはキーボードから入力'(Line,_a) :- atom_to_term(Line,_a,_), float(_a), _a >= 0.0,!. 'aはキーボードから入力'(Line,_a) :- writef('入力された %t からは正の実数が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/100 # # [1] 授業単元:C言語 # [2] 問題文 # 整数n(>=1)を入力し,nの約数の個数を返す関数int divisor(int)を用いてnが素数かどう # かを判定し,その結果を画面表示するプログラムを作成せよ. # '整数n(>=1)を入力し,nの約数の個数を返す述語を用いてnが素数かどうか判定する' :- '整数n(>=1)を入力し'(_n), 約数の個数(_n,_約数の個数), 素数かどうか判定する(_約数の個数,_判定), writef('%tは%t\n',[_n,_判定]). '整数n(>=1)を入力し'(_n) :- write('整数(>=1)を入力して下さい : '), get_line(Line), '整数n(>=1)を入力診断'(Line,_n),!. '整数n(>=1)を入力し'(_n) :- '整数n(>=1)を入力し'(_n). '整数n(>=1)を入力診断'(Line,_n) :- atom_to_term(Line,_n,_), integer(_n), _n >= 1,!. '整数n(>=1)を入力診断'(Line,_n) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '約数の個数'(_数,_約数の個数) :- _数_1 is _数 - 1, count(( for(1,N,_数_1), 0 is _数 mod N)), _約数の個数). 素数かどうか判定する(_約数の個数,素数です) :- _約数の個数 =< 2,!. 素数かどうか判定する(_約数の個数,素数ではない). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/84 # # [1] 授業単元:C言語 # [2] 問題文:10個の要素が格納できる配列を2つ宣言し、それぞれ任意の整数で初期化せよ。 # その後、この2つの配列の中身を入れ替えよ。 # '10個の要素が格納できるならびを2つ宣言し、それぞれ任意の整数で初期化する'(L1,L2) :- '10個の要素が格納できるならびを2つ宣言し'(_宣言名1,_宣言名2), 'それぞれ任意の整数で初期化する'(_宣言名1,_宣言名2). '10個の要素が格納できるならびを2つ宣言し'(_宣言名1,_宣言名2) :- '10個の要素が格納できるならびを宣言する'(_宣言名1), '10個の要素が格納できるならびを宣言する'(_宣言名2),!. '10個の要素が格納できるならびを宣言する'(_宣言名) :- length(L1,10), P =.. [_宣言名,L1], assertz(P). 'それぞれ任意の整数で初期化する'(_宣言名1,_宣言名2) :- 任意の整数で初期化する(_宣言名1), 任意の整数で初期化する(_宣言名2). 任意の整数で初期化する(_宣言名) :- P =.. [_宣言名,L], retract(P), 変数ならびを任意の整数で初期化する(L), assertz(P),!. 変数ならびを任意の整数で初期化する([]) :- !. 変数ならびを任意の整数で初期化する([N|R]) :- get_integer(N), 変数ならびを任意の整数で初期化する(R). get_integer(N) :- get_line(Line), 整数入力診断(Line,N),!. get_integer(N) :- get_integer(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数入力診断(Line,N) :- writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]), fail. 'その後、この2つのならびの中身を入れ替える'(_宣言名1,_宣言名2) :- 'この2つのならびの中身を'(_宣言名1,_宣言名2,L1,L2), 入れ替える(_宣言名1,_宣言名2,L1,L2),!. 'この2つのならびの中身を'(_宣言名1,_宣言名2,L1,L2) :- P1 =.. [_宣言名1,L1), P2 =.. [_宣言名2,L2), retract(P1), retract(P2),!. 入れ替える(_宣言名1,_宣言名2,L1,L2) :- P1_2 =.. [_宣言名1,L2], P2_2 =.. [_宣言名2,L1], assertz(P1_2), assertz(P2_2),!. % Prologにとって難題。 % % 実は「入れ替える」ということが普通にはできない。 % % 宣言するという事を述語としてassertすることとして捉えてみた。 % 'この2つの中味を'述語のretractのタイミングが相当に怪しい。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/59 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # プログラム例7.3.1をswitch文を使わずにif文、else if文を使うプログラムに変更しなさい。 # #include # # int main(void) # { # int x, z; # x=5; # z= x % 2; # switch(z) # { # case 0: # printf("x= %d は偶数です.\n",x); # break; # case 1: # printf("x= %dは奇数です.\n",x); # break; # default: # printf("xは負の数である可能性があります.\n"); # } # return 0; # # 変数xの値をキーボードから入力するように機能変更しなさい。 # プログラム例7.3.1 # http://www.dotup.org/uploda/www.dotup.org2233167.txt.html # '変数xの値をキーボードから入力して、奇数か偶数かを表示しなさい' :- '変数xの値をキーボードから入力して'(_x), '奇数か偶数かを表示しなさい'(_x). '変数xの値をキーボードから入力して'(_x) :- write('整数を入力して下さい : '), get_line(Line), '変数xの値をキーボードから入力診断'(Line,_x),!. '変数xの値をキーボードから入力して'(_x) :- '変数xの値をキーボードから入力して'(_x). '変数xの値をキーボードから入力診断'(Line,_x) :- atom_to_term(Line,_x,_), integer(_x),!. '変数xの値をキーボードから入力診断'(Line,_x) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '奇数か偶数かを表示しなさい'(_x) :- 0 is _x mod 2, writef('%tは偶数です.\n',[_x]),!. '奇数か偶数かを表示しなさい'(_x) :- 1 is _x mod 2, writef('%tは奇数です.\n',[_x]),!. '奇数か偶数かを表示しなさい'(_x) :- writef('%tは負の数である可能性があります.\n',[_x]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/33 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):mのn乗 を一の位まで正確に計算するプログラムを書け。ただし、mは2以上10000未満の整数、nは0以上10000未満の整数とする。 # # 'mのn乗 を一の位まで正確に計算するプログラムを書け。ただし、mは2以上10000未満の整数、nは0以上10000未満の整数とする。'(_m,_n,_答え) :- findall(_m,( for(1,N,_n)), L), concat_atom(L,'*',S), atom_to_term(S,_式,_), _答え is _式. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'mのn乗 を一の位まで正確に計算するプログラムを書け。ただし、mは2以上10000未満の整数、nは0以上10000未満の整数とする。'(_m,_n,_答え) :- 'mのn乗 を一の位まで正確に計算するプログラムを書け。ただし、mは2以上10000未満の整数、nは0以上10000未満の整数とする。'(_m,1,_n,_答え). 'mのn乗 を一の位まで正確に計算するプログラムを書け。ただし、mは2以上10000未満の整数、nは0以上10000未満の整数とする。'(_m,N,_n,1) :- N > _n,!. 'mのn乗 を一の位まで正確に計算するプログラムを書け。ただし、mは2以上10000未満の整数、nは0以上10000未満の整数とする。'(_m,N,_n,X) :- N_2 is N + 1, 'mのn乗 を一の位まで正確に計算するプログラムを書け。ただし、mは2以上10000未満の整数、nは0以上10000未満の整数とする。'(_m,N_2,_n,Y), X is _m * Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/29 # # [1] 授業単元:プログラミング入門 # [2] 問題文:0以上20以下の整数を入力として受け付けて, # その数から20までの整数を順に出力せよ。 # '0以上20以下の整数を入力として受け付けて,その数から20までの整数を順に出力せよ。' :- '0以上20以下の整数を入力として受け付けて'(_入力整数), 'その数から20までの整数を順に出力する'(_入力整数). '0以上20以下の整数を入力として受け付けて'(_入力整数) :- write('0以上20以下の整数を入力して下さい: '), get_line(Line), '0以上20以下の整数を入力として受け付けて'(Line,_入力整数),!. '0以上20以下の整数を入力として受け付けて'(_入力整数) :- '0以上20以下の整数を入力として受け付けて'(_入力整数). '0以上20以下の整数を入力として受け付けて'(Line,_入力整数) :- atom_to_term(Line,_入力整数), integer(_入力整数), _入力整数 >= 0, _入力整数 =< 20,!. '0以上20以下の整数を入力として受け付けて'(Line,_入力整数) :- writef('入力された %t からは0以上20以下の整数が得られません。再入力をお願いします。\n',[Line]), fail. 'その数から20までの整数を順に出力する'(_その数) :- for(_その数,_整数,20), writef('%t\n',[_整数]), _整数 = 20. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'その数から20までの整数を順に出力する'(20) :- write('%t\n',[20]),!. 'その数から20までの整数を順に出力する'(_整数) :- writef('%t\n',[_整数]), _整数_2 is _整数 + 1, 'その数から20までの整数を順に出力する'(_整数_2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'その数から20までの整数を順に出力する'(_整数) :- _整数 > 20,!. 'その数から20までの整数を順に出力する'(_整数) :- writef('%t\n',[_整数]), _整数_2 is _整数 + 1, 'その数から20までの整数を順に出力する'(_整数_2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'その数から20までの整数を順に出力する'(_その数) :- '限界数までの整数を順に出力する'(_その数,20). '限界数までの整数を順に出力する'(N,_限界数) :- N > _限界数,!. '限界数までの整数を順に出力する'(N,_限界数) :- writef('%t\n',[N]), N_2 is N + 1, '限界数までの整数を順に出力する'(N_2,_限界数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/10 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):例に示すように、二つの整数値を読み込んで、 #               小さい方の数以上で大きいほうの数以下の整数 #               を全て加えた値を表示するプログラムを作成せよ。 #               (例) #                  二つの整数を入力してください。 #                  整数1: 37 # 整数2: 28 # 28以上37以下の全整数の和は325です。 #                # '二つの整数値を読み込んで、小さい方の数以上で大きいほうの数以下の整数を全て加えた値を表示する' :- '二つの整数値を読み込んで、'(_二つの整数値), 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を(_二つの整数値,_小さい方の数,_大きい方の数,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値), 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を表示する(_小さい方の数,_大きい方の数,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値). '二つの整数値を読み込んで、'(_二つの整数値) :- write('二つの整数を入力して下さい。\n'), findall(_整数,( for(1,_何番目,2), 整数入力(_何番目,_整数)), _二つの整数値). 整数入力(_何番目,_整数) :- writef('整数%t: ',[_何番目]), get_line(Line), 整数入力診断(Line,_整数),!. 整数入力(_何番目,_整数) :- 整数入力(_何番目,_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を([N1,N2],N1,N2,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値) :- N1 =< N2, findsum(N,( for(N1,N,N2)), _小さい方の数以上で大きいほうの数以下の整数を全て加えた値). 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を([N1,N2],N2,N1,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値) :- N1 > N2, findsum(N,( for(N2,N,N1)), _小さい方の数以上で大きいほうの数以下の整数を全て加えた値). 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を表示する(_小さい方の数,_大きい方の数,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値) :- writef('%t以上%t以下の全整数を加えた値は%tです。\n',[_小さい方の数,_大きい方の数,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/957 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。 # 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(_n,X) :- findall(N,for(1,N,_n),L), concat_atom(L,'*',S), atom_to_term(S,_式,_), X is _式. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(_n,X) :- 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(1,_n,1,X). 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(N,_n,X,X) :- N > _n,!. 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(N,_n,X_1,X) :- X_2 is X_1 * N, N_2 is N + 1, 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(N_2,_n,X_2,X). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(1,1) :- !. 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(N,X) :- N_1 is N - 1, 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(N_1,X_1), X is X_1 * N. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/929 # # [1] プログラミング # [2] 入力された整数が偶数だったら2で割り、奇数ならば3倍してから1足す # これを1になるまで繰り返し、かつ過程も出力するプログラムを作れ # '入力された整数が偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する' :- 入力された整数が(_入力された整数), '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_入力された整数). '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(1) :- 過程も出力する('受け取り整数が 1 になった為終了します。\n),!. '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_受け取り整数) :- 過程も出力する('新たに受け取った整数は %t です\n',[_受け取り整数]), 偶数だったら2で割り(_受け取り整数,_2で割った整数), '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_2で割った整数). '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_受け取り整数) :- 奇数ならば3倍してから1足す(_受け取り整数,_3倍してから1足した整数), '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_3倍してから1足した整数). 偶数だったら2で割り(_受け取り整数,_2で割った整数) :- 偶数だったら(_受け取り整数), 過程も出力する('%t は偶数でした\n',[_受け取り整数]), '2で割り'(_受け取り整数,_2で割った整数), 過程も出力する('受け取り整数 %t を2で割った整数は %t となりました\n',[_受け取り整数,_2で割った整数]),!. 奇数ならば3倍してから1足す(_受け取り整数,_3倍してから1足した整数) :- 奇数ならば(_受け取り整数), 過程も出力する('%t は奇数でした\n',[_受け取り整数]), '3倍してから1足す'(_受け取り整数,_3倍してから1足した整数), 過程も出力する('受け取り整数 %t を3倍してから1足した整数は %t となりました\n',[_受け取り整数,_3倍してから1足した整数]),!. 偶数だったら(_受け取り整数) :- 0 is _受け取り整数 mod 2. '2で割り'(_受け取り整数,_2で割った整数) :- _2で割った整数 is _受け取り整数 // 2. 奇数ならば(_受け取り整数) :- 1 is _受け取り整数 mod 2. '3倍してから1足す'(_受け取り整数,_3倍してから1足した整数) :- _3倍してから1足した整数 is _受け取り整数 * 3 + 1. 入力された整数が(_入力された整数) :- write('整数を入力して下さい : '), get_line(Line), 入力された整数診断(Line,_入力された整数),!. 入力された整数が(_入力された整数) :- 入力された整数が(_入力された整数). 入力された整数診断(Line,_入力された整数) :- atom_to_term(Line,_入力された整数,_), integer(_入力された整数),!. 入力された整数診断(Line,_入力された整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 過程も出力する(_出力フォーマット,_値ならび) :- writef(_出力フォーマット,_値ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/926 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # # 1以上の整数値を入力すると、以下の条件を満たすピラミッドをoxを使って表示するピラミッドを出力するプログラムを作成せよ # # *条件 # 1以上の奇数が入力された時のみピラミッドを表示し、それ以外の場合は「条件をみたしていないので表示しない」と出力する。 # ピラミッドの底辺の長さは入力された数値とする。 # # *実行例 # xxxo # xxooo # xooooo # ooooooo # # '1以上の整数値を入力すると、以下の条件を満たすピラミッドをoxを使って表示するピラミッドを出力する *条件 1以上の奇数が入力された時のみピラミッドを表示し、それ以外の場合は「条件をみたしていないので表示しない」と出力する。ピラミッドの底辺の長さは入力された数値とする。' :- '1以上の整数値を入力すると'(_1以上の整数), 'ピラミッドを表示する'(_1以上の整数). '1以上の整数値を入力すると'(_1以上の整数) :- write('1以上の整数値(奇数)を入力して下さい : '), get_line(Line), '1以上の整数値を入力診断,(Line,_1以上の整数),!. '1以上の整数値を入力すると'(_1以上の整数) :- '1以上の整数値を入力すると'(_1以上の整数). '1以上の整数値を入力診断'(Line,_1以上の整数) :- atom_to_term(Line,_1以上の整数,_), '1以上の奇数が入力された時のみ'(_1以上の整数),!. '1以上の整数値を入力診断'(Line,_1以上の整数) :- write('条件をみたしていないので表示しない\n'), fail. '1以上の奇数が入力された時のみ'(_1以上の整数),!. _1以上の整数 >= 1, 奇数である(_1以上の整数),!. ピラミッドを表示する(_1以上の整数) :- length(L,_1以上の整数), append(L1,[_|L1],L), length(L1,Len), all(L1,'x'), ピラミッドを表示する(_1以上の整数,L1). ピラミッドを表示する(_1以上の整数,[]) :- length(L,_1以上の整数), all(L,o), put_list_ln(L). ピラミッドを表示する(_1以上の整数,[A|L1]) :- length(L,_1以上の整数), append([A|L1],L2,[A|L1],L), all(L2,o), put_list_ln(L), ピラミッドを表示する(_1以上の整数,L1). 奇数である(N) :- 1 is N mod 2. put_list_ln([]) :- write('\n'). put_list_ln([A|R]) :- put_char(A), put_list_ln(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/926 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # # 1以上の整数値を入力すると、以下の条件を満たすピラミッドをoxを使って表示するピラミッドを出力するプログラムを作成せよ # # *条件 # 1以上の奇数が入力された時のみピラミッドを表示し、それ以外の場合は「条件をみたしていないので表示しない」と出力する。 # ピラミッドの底辺の長さは入力された数値とする。 # # *実行例 # xxxo # xxooo # xooooo # ooooooo # # '1以上の整数値を入力すると、以下の条件を満たすピラミッドをoxを使って表示するピラミッドを出力する *条件 1以上の奇数が入力された時のみピラミッドを表示し、それ以外の場合は「条件をみたしていないので表示しない」と出力する。ピラミッドの底辺の長さは入力された数値とする。' :- '1以上の整数値を入力すると'(_1以上の整数), 'ピラミッドを表示する'(_1以上の整数). '1以上の整数値を入力すると'(_1以上の整数) :- write('1以上の整数値(奇数)を入力して下さい : '), get_line(Line), '1以上の整数値を入力診断,(Line,_1以上の整数),!. '1以上の整数値を入力すると'(_1以上の整数) :- '1以上の整数値を入力すると'(_1以上の整数). '1以上の整数値を入力診断'(Line,_1以上の整数) :- atom_to_term(Line,_1以上の整数,_), '1以上の奇数が入力された時のみ'(_1以上の整数),!. '1以上の整数値を入力診断'(Line,_1以上の整数) :- write('条件をみたしていないので表示しない\n'), fail. '1以上の奇数が入力された時のみ'(_1以上の整数),!. _1以上の整数 >= 1, 奇数である(_1以上の整数),!. ピラミッドを表示する(_1以上の整数) :- length(L,_1以上の整数), append(L1,[_|L1],L), length(L1,Len), all(L1,'x'), ピラミッドを表示する(_1以上の整数,L1). ピラミッドを表示する(_1以上の整数,[]) :- length(L,_1以上の整数), all(L,o), put_list_ln(L). ピラミッドを表示する(_1以上の整数,[A|L1]) :- length(L,_1以上の整数), append([A|L1],L2,[A|L1],L), all(L2,o), put_list_ln(L), ピラミッドを表示する(_1以上の整数,L1). 奇数である(N) :- 1 is N mod 2. put_list_ln([]) :- write('\n'). put_list_ln([A|R]) :- put_char(A), put_list_ln(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/881 # # 【2】 # # # 2次元配列の問題です # m行n列の配列aの # 各行ごとの合計 gyouwa[i] i=0,1,・・・,m # 各列ごとの合計 retuwa[j] j=0,1,・・・,n # を計算するプログラムの作成をお願いします # # •行列サイズ m,n は実行時に 100以内であれば自由に設定してデータを再入力させる機能をつける # ◦配列サイズの上限はプログラム中で配列を宣言するとき「100 個」として下さい。これは,プログラム中で大き目の配列を宣言しておいて,指定されたサイズに応じて必要分を使うための練習です。 # # 【3】c言語 # 【4】10月30日まで # # 'm行n列の配列aの各行ごとの合計 gyouwa[i] i=0,1,・・・,m各列ごとの合計 retuwa[j] j=0,1,・・・,nを計算する'(LL,_行の和ならび,_列の和ならび) :- 行の和ならびを求める(LL,_行の和ならび), 列の和ならびを求める(LL,_列の和ならび). 行の和ならびを求める(LL,_行の和ならび) :- findall(_行の和,( append(_,[L|_],LL), sum(L,_行の和)), _行の和ならび). 列の和ならびを求める(LL,_列の和ならび) :- 転置(LL,LL2), 行の和ならびを求める(LL2,_列の和ならび). '指定したサイズの行列にキーボードから入力して、各行ごとの合計と各列ごとの合計を求める'(_行列,_行の和ならび,_列の和ならび) :- '指定したサイズの行列にキーボードから入力して'(_行列), 行の和ならびを求める(_行列,_行の和ならび), 列の和ならびを求める(_行列,_列の和ならび). '指定したサイズの行列にキーボードから入力して'(_行列) :- 指定したサイズの(_行数,_列数), 行列にキーボードから入力して(_行数,_列数,_行列). '指定したサイズの行列に乱数を使って値を埋め、各行ごとの合計と各列ごとの合計を求める'(_行列,_行の和ならび,_列の和ならび) :- '指定したサイズの行列に乱数を使って値を埋め'(_行列), 行の和ならびを求める(_行列,_行の和ならび), 列の和ならびを求める(_行列,_列の和ならび). '指定したサイズの行列に乱数を使って値を埋め'(_行列) :- 指定したサイズの(_行数,_列数), 行列に乱数を使って値を埋め(_行数,_列数,_行列). 指定したサイズの(_行数,_列数) :- 行数の入力(_行数), 列数の入力(_列数). 行数の入力(_行数) :- write('行数を入力してください : '), get_line(Line), 行数の入力診断(Line,_行数),!. 行数の入力(_行数) :- 行数の入力(_行数). 行数の入力診断(Line,_行数) :- atom_to_term(Line,_行数,_), integer(_行数), _行数 >= 1, _行数 =< 100,!. 行数の入力診断(Line,_行数) :- write('入力された%tからは適切な行数が得られません。再入力をお願いします。\n',[Line]), fail. 列数の入力(_列数) :- write('列数を入力してください : '), get_line(Line), 列数の入力診断(Line,_列数),!. 列数の入力(_列数) :- 列数の入力(_列数). 列数の入力診断(Line,_列数) :- atom_to_term(Line,_列数,_), integer(_列数), _列数 >= 1, _列数 =< 100,!. 列数の入力診断(Line,_列数) :- write('入力された%tからは適切な列が得られません。再入力をお願いします。\n',[Line]), fail. 行列にキーボードから入力して(_行数,_列数,_行列) :- length(_行列,_行数), findall(_行,( append(L01,[_行|_],_行列), 行の値をキーボードから入力する(_行,L01,_列数)), _行列). 行の値をキーボードから入力する(_行,L01,_列数) :- length(_行,_列数), findall(_列の値,( append(L02,[_|_],_行), 行列要素の値の入力(L01,L02,_列の値)), _行). 行列要素の値の入力(L01,L02,_列の値) :- 行列要素の位置を求める(L01,L02,M行,N列), writef('%t行%t列の値 : ',[M行,N列]), get_integer(_列の値). 行列要素の位置を求める(L01,L02,M行,N列) :- length([_|L01],M行), length([_|L02],N列). 行列に乱数を使って値を埋め(_行数,_列数,_行列) :- length(_行列,_行数), findall(_行,( append(_,[_行|_],_行列), 行を乱数値で埋める(_行,_列数)), _行列). 行を乱数値で埋める(_行,_列数) :- length(_行,_列数), findall(_列の値,( append(_,[_|_],_行), '-100~100の範囲の値を入力'(_列の値)), _行). '-100~100の範囲の値を入力'(_列の値) :- _列の値 is (random(200)+1) - 100). % % 行列の転置述語は 転置/2 は http://nojiriko.asia/prolog/gyoretsu_no_tenchi.html % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/876 # # [1] 授業単元:プログラム作成 # [2]D, C, B, A, S, Invalid という成績を表す列挙体 # enum result を定義し,点数(int 型)を引数として # enum result 型の値を返す関数 # seiseki_hantei(int sc) # と,enum result 型の値を引数として,成績を表示する関数も作成する # 点数と成績は以下の通とする # 0〜59 点: D # 60〜69 点: C # 70〜79 点: B # 80〜89 点: A # 90〜100 点: S # それ以外: Invalid # # # る関数 # print_seiseki(enum result res) # を作成せよ.この2 つの関数を使用して,以下の実行例 # のように点数を入力すると成績を表示するmain 関数も # 作成すること.点数と成績の関係は以下の通りとする. # 例. # 点数(整数)を入力してください:91 # 成績はS です。 # '成績を入力して判定し、それを表示する' :- 成績を入力して(_成績), 成績を判定し(_成績,_判定), 判定を表示する(_判定). 成績を入力して(_成績) :- write('点数(整数)を入力してください:'), get_line(Line), 成績入力診断(Line,_成績),!. 成績を入力して(_成績) :- 成績を入力して(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績),!. 成績入力診断(Line,_成績) :- writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[Line]), fail. 成績判定を判定し(_成績,'D') :- _成績 >= 0, _成績 =< 59,!. 成績判定を判定し(_成績,'C') :- _成績 >= 60, _成績 =< 69,!. 成績判定を判定し(_成績,'B') :- _成績 >= 70, _成績 =< 79,!. 成績判定を判定し(_成績,'A') :- _成績 >= 80, _成績 =< 89,!. 成績判定を判定し(_成績,'S') :- _成績 >= 90, _成績 =< 100,!. 成績判定を判定し(_,異常値). 判定を表示する(_判定) :- writef('判定は%tです\n',[_判定]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/876 # # [1] 授業単元:プログラム作成 # [2]D, C, B, A, S, Invalid という成績を表す列挙体 # enum result を定義し,点数(int 型)を引数として # enum result 型の値を返す関数 # seiseki_hantei(int sc) # と,enum result 型の値を引数として,成績を表示する関数も作成する # 点数と成績は以下の通とする # 0〜59 点: D # 60〜69 点: C # 70〜79 点: B # 80〜89 点: A # 90〜100 点: S # それ以外: Invalid # # # る関数 # print_seiseki(enum result res) # を作成せよ.この2 つの関数を使用して,以下の実行例 # のように点数を入力すると成績を表示するmain 関数も # 作成すること.点数と成績の関係は以下の通りとする. # 例. # 点数(整数)を入力してください:91 # 成績はS です。 # 成績判定表(0,59,'D'). 成績判定表(60,69,'C'). 成績判定表(70,79,'B'). 成績判定表(80,89,'A'). 成績判定表(90,100,'S'). '成績を入力して判定し、それを表示する' :- 成績を入力して(_成績), 成績を判定し(_成績,_判定), 判定を表示する(_判定). 成績を入力して(_成績) :- write('点数(整数)を入力してください:'), 行入力(_行), 成績入力診断(_行,_成績),!. 成績を入力して(_成績) :- 成績を入力して(_成績). 成績入力診断(_行,_成績) :- read_term_from_atom(_行,_成績,[valiable_names(_),valiables(_)]), integer(_成績),!. 成績入力診断(_行,_成績) :- writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[_行]), fail. 成績を判定し(_成績,_判定) :- 成績判定表(_下限,_上限,_判定), _成績 >= _下限, _成績 =< _上限,!. 成績を判定し(_,異常値). 判定を表示する(_判定) :- writef('判定は%tです\n',[_判定]),!. 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/876 # # [1] 授業単元:プログラム作成 # [2]D, C, B, A, S, Invalid という成績を表す列挙体 # enum result を定義し,点数(int 型)を引数として # enum result 型の値を返す関数 # seiseki_hantei(int sc) # と,enum result 型の値を引数として,成績を表示する関数も作成する # 点数と成績は以下の通とする # 0〜59 点: D # 60〜69 点: C # 70〜79 点: B # 80〜89 点: A # 90〜100 点: S # それ以外: Invalid # # # る関数 # print_seiseki(enum result res) # を作成せよ.この2 つの関数を使用して,以下の実行例 # のように点数を入力すると成績を表示するmain 関数も # 作成すること.点数と成績の関係は以下の通りとする. # 例. # 点数(整数)を入力してください:91 # 成績はS です。 # 判定ならび(['D','C','B','A','S','異常値']). 成績判定表(0,59,'D'). 成績判定表(60,69,'C'). 成績判定表(70,79,'B'). 成績判定表(80,89,'A'). 成績判定表(90,100,'S'). 成績判定表(minint,maxint,異常値). '成績を入力して判定し、それを表示する' :- 成績を入力して(_成績), 判定ならび(_判定ならび), member(_判定,_判定ならび), 成績を判定し(_成績,_判定), 判定を表示する(_判定). 成績を入力して(_成績) :- write('点数(整数)を入力してください:'), get_line(Line), 成績入力診断(Line,_成績),!. 成績を入力して(_成績) :- 成績を入力して(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績),!. 成績入力診断(Line,_成績) :- writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[Line]), fail. 成績を判定し(_点数,_判定) :- 成績判定表(_下限,_上限,_判定), _成績 >= _下限, _成績 =< _上限,!. 判定を表示する(_判定) :- writef('判定は%tです\n',[_判定]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/876 # # [1] 授業単元:プログラム作成 # [2]D, C, B, A, S, Invalid という成績を表す列挙体 # enum result を定義し,点数(int 型)を引数として # enum result 型の値を返す関数 # seiseki_hantei(int sc) # と,enum result 型の値を引数として,成績を表示する関数も作成する # 点数と成績は以下の通とする # 0〜59 点: D # 60〜69 点: C # 70〜79 点: B # 80〜89 点: A # 90〜100 点: S # それ以外: Invalid # # # る関数 # print_seiseki(enum result res) # を作成せよ.この2 つの関数を使用して,以下の実行例 # のように点数を入力すると成績を表示するmain 関数も # 作成すること.点数と成績の関係は以下の通りとする. # 例. # 点数(整数)を入力してください:91 # 成績はS です。 # 判定ならび(['D','C','B','A','S','異常値']). 成績判定表(0,59,'D'). 成績判定表(60,69,'C'). 成績判定表(70,79,'B'). 成績判定表(80,89,'A'). 成績判定表(90,100,'S'). 成績判定表(minint,maxint,異常値). '成績を入力して判定し、それを表示する' :- 成績を入力して(_成績), 成績を判定し(_成績,_判定), 判定を表示する(_判定). 成績を入力して(_成績) :- write('点数(整数)を入力してください:'), get_line(Line), 成績入力診断(Line,_成績),!. 成績を入力して(_成績) :- 成績を入力して(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績),!. 成績入力診断(Line,_成績) :- writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[Line]), fail. 成績を判定し(_点数,_判定) :- 判定ならび(_判定ならび), member(_判定,_判定ならび), 成績判定表(_下限,_上限,_判定), _成績 >= _下限, _成績 =< _上限,!. 判定を表示する(_判定) :- writef('判定は%tです\n',[_判定]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/876 # # [1] 授業単元:プログラム作成 # [2]D, C, B, A, S, Invalid という成績を表す列挙体 # enum result を定義し,点数(int 型)を引数として # enum result 型の値を返す関数 # seiseki_hantei(int sc) # と,enum result 型の値を引数として,成績を表示する関数も作成する # 点数と成績は以下の通とする # 0〜59 点: D # 60〜69 点: C # 70〜79 点: B # 80〜89 点: A # 90〜100 点: S # それ以外: Invalid # # # る関数 # print_seiseki(enum result res) # を作成せよ.この2 つの関数を使用して,以下の実行例 # のように点数を入力すると成績を表示するmain 関数も # 作成すること.点数と成績の関係は以下の通りとする. # 例. # 点数(整数)を入力してください:91 # 成績はS です。 # :- op(250,xfx,'〜'). :- op(280,xf,'点'). :- op(300,xfx,':'). 成績判定表(0 〜 59 点 : 'D'). 成績判定表(60 〜 69 点 : 'C'). 成績判定表(70 〜 79 点 : 'B'). 成績判定表(80 〜 89 点 : 'A'). 成績判定表(90 〜 100 点 : 'S'). '成績を入力して判定し、それを表示する' :- 成績を入力して(_成績), 成績を判定し(_成績,_判定), 判定を表示する(_判定). 成績を入力して(_成績) :- write('点数(整数)を入力してください:'), get_line(Line), 成績入力診断(Line,_成績),!. 成績を入力して(_成績) :- 成績を入力して(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績),!. 成績入力診断(Line,_成績) :- writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[Line]), fail. 成績を判定し(_点数,_判定) :- 成績判定表(_下限 〜 _上限 点 : _判定), _成績 >= _下限, _成績 =< _上限,!. 成績を判定し(_,成績が異常値). 判定を表示する(_判定) :- writef('判定は%tです\n',[_判定]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/858 # # # 5人の学生の成績(100点満点)の値をキーボードから読み込み,それらの平均点と分散(標準偏差の二乗)を求めるプログラムを作れ。 # # # 授業の課題です # 解説付きでお願いします。 # # '5人の学生の成績(100点満点)の値をキーボードから読み込み,それらの平均点と分散(標準偏差の二乗)を求める' :- '5人の学生の成績(100点満点)の値をキーボードから読み込み'(_5人の学生の成績ならび), 'それらの平均点と分散(標準偏差の二乗)を求める'(_5人の学生の成績ならび,_平均点,_分散), append(_5人の学生の成績ならび,[_平均点,_分散],_表示情報), writef('%t,%t,%t,%t,%t の 平均点は %t, 分散は %t です。\n,_表示情報). '5人の学生の成績(100点満点)の値をキーボードから読み込み'(_5人の学生の成績ならび) :- length(_5人の学生の成績ならび,5), findall(_成績,( append(L0,[_成績|_],_5人の学生の成績ならび), length([_|L0],_何個目), write('成績(0-100点)の[%t個目]を入力してください : ',[_何個目]), 成績入力(_成績)), _5人の学生の成績ならび). 成績入力(_成績) :- get_line(Line), 成績入力診断(Line,_成績),!. 成績入力(_成績) :- 成績入力(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績), _成績 >= 0, _成績 =< 100,!. 成績入力診断(Line,_成績) :- writef('入力された %t からは成績(0-100点)が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'それらの平均点と分散(標準偏差の二乗)を求める'(_5人の学生の成績ならび,_平均点,_分散) :- それらの平均点と(_5人の学生の成績ならび,_平均点), 分散を求める(_5人の学生の成績ならび,_分散). それらの平均点と(_5人の学生の成績ならび,_平均点) :- findavg(_成績,( append(_,[_成績|_],_5人の学生の成績ならび)), _平均点). 分散を求める(_5人の学生の成績ならび,_平均点,_分散) :- findavg(_偏差,( append(_,[_成績|_],_5人の学生の成績ならび), _偏差 is (_成績 - _平均点) * (_成績 - _平均点)), _分散). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/849 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # プログラム例6.3.1を配列変数xの要素数(変数memberの値)と各要素の値をキーボードから入力するように変更しなさい。 # プログラム例6.3.1 # #include <stdio.h> # # int main(void) # { # int x[10] = {80, 56, 68, 75, 45, 100, 92, 73, 63, 95}; # int member = 10; # int total; # float average; # int i; # for (i = 0, total = 0; i < member; ++i ) # total += x[i]; # average = (float)total / (float)member; # printf("総和=%d\n",total); # printf("平均点=%7.2f\n", average); # return 0; # } # # 設問1-2 # 上記設問1-1と同じ配列変数xの要素をその並びを逆順にして配列変数yへ代入し、yの全要素を表示するプログラムを作りなさい。 # '要素数と各要素の値を逆順にキーボードから入力して、その総和と平均点を求める' :- '要素数とならびの各要素を逆順に入力して'(_要素数,_ならび), 全要素を表示する(_逆順ならび). '要素数とならびの各要素を逆順に入力して'(_要素数,_逆順ならび) :- 要素数の入力(_要素数), length(Ln,_要素数), ならびを逆順に入力([],Ln,[],_逆順ならび). 要素数の入力(_要素数) :- write('要素数を入力してください : '), get_line(Line), 要素数入力診断(Line,_要素数),!. 要素数の入力(_要素数) :- 要素数の入力(_要素数). 要素数入力診断(Line,_要素数) :- atom_to_term(Line,_要素数,_), integer(_要素数), _要素数 > 0,!. 要素数入力診断(Line,_要素数) :- writef('入力された %t からは適切な要素数が得られませんでした。再入力をお願いします。\n',[Line]), fail. ならびを逆順に入力(Ln,Ln,_逆順ならび,_逆順ならび) :- !. ならびを逆順に入力(L0,Ln,L,_逆順ならび) :- length([_|L0],_何番目), writef('%t番目の数値を入力してください : '), 値の入力(_値), ならびを逆順に入力([_|L0],Ln,[_値|L],_逆順ならび). 値の入力(_値) :- get_line(Line), 値の入力診断(Line,_値),!. 値の入力(_値) :- 値の入力(_値). 値の入力診断(Line,_値) :- atom_to_term(Line,_値,_), number(_値),!. 値の入力診断(Line,_値) :- writef('入力された%tからは数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. 全要素を表示する([]). 全要素を表示する([_要素]) :- writef('%t\n',[_要素]),!. 全要素を表示する([_要素|R]) :- writef('%t ',[_要素]), 全要素を表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/849 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # プログラム例6.3.1を配列変数xの要素数(変数memberの値)と各要素の値をキーボードから入力するように変更しなさい。 # プログラム例6.3.1 # #include <stdio.h> # # int main(void) # { # int x[10] = {80, 56, 68, 75, 45, 100, 92, 73, 63, 95}; # int member = 10; # int total; # float average; # int i; # for (i = 0, total = 0; i < member; ++i ) # total += x[i]; # average = (float)total / (float)member; # printf("総和=%d\n",total); # printf("平均点=%7.2f\n", average); # return 0; # } # # 設問1-2 # 上記設問1-1と同じ配列変数xの要素をその並びを逆順にして配列変数yへ代入し、yの全要素を表示するプログラムを作りなさい。 # '要素数と各要素の値をキーボードから入力して、その総和と平均点を求める' :- '要素数とならびの各要素を入力して'(_要素数,_ならび), その総和と平均点を求める(_要素数,_ならび,_総和,_平均点), writef('総和=%t 平均点= %7c\n',[_総和,_平均点]). '要素数とならびの各要素を入力して'(_要素数,_ならび) :- 要素数の入力(_要素数), ならびの入力(_要素数,_ならび). 要素数の入力(_要素数) :- write('要素数を入力してください : '), get_line(Line), 要素数入力診断(Line,_要素数),!. 要素数の入力(_要素数) :- 要素数の入力(_要素数). 要素数入力診断(Line,_要素数) :- atom_to_term(Line,_要素数,_), integer(_要素数), _要素数 > 0,!. 要素数入力診断(Line,_要素数) :- writef('入力された %t からは適切な要素数が得られませんでした。再入力をお願いします。\n',[Line]), fail. ならびの入力(_要素数,_ならび) :- length(_ならび,_要素数), findall(_値,( append(L0,[_値|_],_ならび), length([_|L0],_何番目), writef('%t番目の数値を入力してください : '), 値の入力(_値)), _ならび). 値の入力(_値) :- get_line(Line), 値の入力診断(Line,_値),!. 値の入力(_値) :- 値の入力(_値). 値の入力診断(Line,_値) :- atom_to_term(Line,_値,_), number(_値),!. 値の入力診断(Line,_値) :- writef('入力された%tからは数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. その総和と平均点を求める(_要素数,_ならび,_総和,_平均点) :- sum(_ならび,_総和), _平均点 is _総和 / _要素数. sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/845 # # 台形近似法を用いてf(x)=cos(x)を任意の範囲で積分するプログラムを # ユーザ関数を定義して作成しなさい. # その際の区分間距離も任意に入力できるようにすること。 # # 実行例 # 積分範囲を入力せよ # x0 = 0 # xl = 10 # 区分間距離を入力せよ # length = 1 # ans = 9.949055 # 積分範囲を入力せよ # x0 = 0 # xl = 100 # 区分間距離を入力せよ # length = 5 # ans = 49.588107 # # お願いします。 # # f(X,Y) :- Y is cos(X). '台形近似法を用いてf(x)=cos(x)を任意の範囲で積分する 区分間距離は任意に入力できるようにする' :- 積分範囲を入力する(_積分範囲下限,_積分範囲上限), 区分間距離を入力する(_区分間距離), f(_積分範囲下限,Y_1), '台形近似法を用いて積分する'(_積分範囲下限,Y_1,_積分範囲上限,_区分間距離,_積分値), writef('f(x)=cos(x) x範囲 %t-%t の積分値は %t です。\n',[_積分範囲下限,_積分範囲上限,_積分値]). 積分範囲を入力する(_積分範囲下限,_積分範囲上限) :- write('積分範囲を入力してください\n積分範囲下限(実数) : '), 実数入力(_積分範囲下限), write('積分範囲上限(実数) : '), 実数入力(_積分範囲上限), _積分範囲上限 > _積分範囲下限,!. 積分範囲を入力する(_積分範囲下限,_積分範囲上限) :- 積分範囲を入力する(_積分範囲下限,_積分範囲上限). 実数入力(_実数) :- get_line(Line), 実数入力診断(Line,_実数),!. 実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 実数入力診断(Line,_実数) :- writef('入力された %t は実数表現になっていません。再入力をお願いします。\n',[Line]), fail. 区分間距離を入力する(_区分間距離) :- write('区分間距離を入力してください : '), 実数入力(_区分間距離),!. 区分間距離を入力する(_区分間距離) :- 区分間距離を入力する(_区分間距離). '台形近似法を用いて積分する'(K,_,_積分範囲上限,_区分間距離,0.0) :- K >= _積分範囲上限,!. '台形近似法を用いて積分する'(X_1,Y_1,_積分範囲上限,_区分間距離,_積分値) :- X_2 is X_1 + _区分間距離, f(X_2,Y_2), _台形面積 is (_Y_1 + _Y_2) * _区分間距離 / 2, '台形近似法を用いて積分する'(X_2,Y_2,_積分範囲上限,_区分間距離,_積分値_2), _積分値 is _台形面積 + _積分値_2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/809 # # [1] 授業単元:C言語 繰り返し # [2] 問題文(含コード&リンク): # 1.キーボードから正の整数を2つ(x  y)入力し、縦x個、横y個の文字'*' # からなる長方形を表示するプログラムを多重ループを用いて作成せよ。 # # 2.キーボードから入力した10進整数(0以上2^31 -1以下)を二進数にせよ # for文を使うこと。例えば2で割った余りと商の値によって下の桁のビットから求める等 # # 'キーボードから入力した10進整数(0以上2^31 -1以下)を二進数にする'(_二進数数値ならび,_二進数表示) :- 'キーボードから入力した10進整数(0以上2^31 -1以下)を'(_10進整数), '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,_二進数数値ならび,_二進数表示). 'キーボードから入力した10進整数(0以上2^31 -1以下)を'(_10進整数) :- write('10進整数(0以上2^31 -1以下)を入力してください : '), get_line(Line), '10進整数(0以上2^31 -1以下)入力検査'(Line,_10進整数),!. 'キーボードから入力した10進整数(0以上2^31 -1以下)を'(_10進整数) :- 'キーボードから入力した10進整数(0以上2^31 -1以下)を'(_10進整数). '10進整数(0以上2^31 -1以下)入力検査'(Line,_10進整数) :- atom_to_term(Line,_10進整数,_), _10進整数 >= 0,!. '10進整数(0以上2^31 -1以下)入力検査'(Line,_10進整数) :- writef('入力された %t からは(0以上2^31 -1以下)の10進整数は得られません。再入力をお願いします。\n',[Line]), fail. '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,_二進数数値ならび,_二進数表示) :- '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,[],_二進数表示). '10進整数(0以上2^31 -1以下)を二進数にする'(0,_二進数数値ならび,_二進数数値ならび,_二進数表示) :- concat_atom(['0x|_二進数数値ならび],_二進数表示). '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,L,_二進数数値ならび,_二進数表示) :- _二進数の一桁 is _10進整数 mod 2, '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,L,_二進数表示) :- _二進数の一桁 is _10進整数 mod 2, _二で割った商 is _10進整数 // 2, '10進整数(0以上2^31 -1以下)を二進数にする'(_ニで割った商,[_二進数の一桁|L],_二進数数値ならび,_二進数表示). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/809 # # [1] 授業単元:C言語 繰り返し # [2] 問題文(含コード&リンク): # 1.キーボードから正の整数を2つ(x  y)入力し、縦x個、横y個の文字'*' # からなる長方形を表示するプログラムを多重ループを用いて作成せよ。 # # 2.キーボードから入力した10進整数(0以上2^31 -1以下)を二進数にせよ # for文を使うこと。例えば2で割った余りと商の値によって下の桁のビットから求める等 # # 'キーボードから正の整数を2つ(x  y)入力し、縦x個、横y個の文字'*'からなる長方形を表示する' :- 'キーボードから正の整数を2つ(x  y)入力し'(_x,_y), '縦x個、横y個の文字'*'からなる長方形を表示する'(_x,_y). 'キーボードから正の整数を2つ(x y)入力し'(_x,_y) :- write('正の整数を2つ(x y) 入力してください : '), 正の整数を入力(_x), 正の整数を入力(_y),!. 'キーボードから正の整数を2つ(x y)入力し'(_x,_y) :- 'キーボードから正の整数を2つ(x y)入力し'(_x,_y). 正の整数を入力(_正の整数) :- get_line(Line), 正の整数入力検査(Line,_正の整数),!. 正の整数入力検査(Line,_正の整数) :- atom_to_term(Line,_正の整数,_), integer(_正の整数), _正の整数 > 0,!. 正の整数入力検査(Line,_正の整数) :- writef('入力された%tからは正の整数が得られません。もう一度最初から入力してください。\n',[Line]), fail. '縦x個、横y個の文字'*'からなる長方形を表示する'(_x,_y) :- for(1,M,_x), for(1,N,_y), write(*), N = _y, nl, M = _x. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/651 # # [1] 授業単元:C言語システムプログラミング # [2] 問題文(含コード&リンク): # 複数の整数を入力した後,その一覧に最大(Max)と最小(Min)の印を付けて表示するプログラムを作成せよ. # 但し,初めに入力する個数を入力する.(入力数は最大10とする) # 実行例↓ # Number? 4 # Score1? 40 # Score2? 90 # Score3? 80 # Score4? 30 # ***Result*** # 1 40 # 2 90 Max # 3 80 # 4 30 Min # '複数の整数を入力した後,その一覧に最大(Max)と最小(Min)の印を付けて表示する' :- '複数の整数を入力した後'(_整数ならび), 'その一覧に最大(Max)と最小(Min)の印を付けて表示する'(_整数ならび). '複数の整数を入力した後'(_整数ならび) :- '整数の個数を入力する'(_整数の個数), '複数の整数を入力した後'(_整数の個数,_整数ならび). '整数の個数を入力する'(_整数の個数) :- write('整数の個数を入力してください : '), get_line(Line), '整数の個数を入力検査'(Line,_整数の個数),!. '整数の個数を入力する'(_整数の個数) :- '整数の個数を入力する'(_整数の個数). '整数の個数を入力検査'(Line,_整数の個数) :- atom_to_term(Line,_整数の個数,_), integer(_整数の個数), _整数の個数 > 0,!. '整数の個数を入力検査'(Line,_整数の個数) :- writef('入力された%tからは適切な整数の個数は得られませんでした。再入力をお願いします。\n',[Line]), fail. '複数の整数を入力した後'(_整数の個数,_整数ならび) :- length(_整数ならび,_整数の個数), findall(_整数,( append(_,[_整数|_],_整数ならび), 整数を入力する(_整数)), _整数ならび). 'その一覧に最大(Max)と最小(Min)の印を付けて表示する'(_整数ならび) :- 最大値(_整数ならび,_最大値), 最小値(_整数ならび,_最小値), append(_,[_整数,|R],_整数ならび), writef('%4c ',[_整数]), 最大値の表示(_整数,_最大値), 最小値の表示(_整数,_最小値), write('\n'), R = []. 最大値の表示(_最大値,_最大値) :- writef('Max ',[_最大値]),!. 最大値の表示(_,_). 最小値の表示(_最小値,_最小値) :- writef('Min ',[_最小値]),!. 最小値の表示(_,_). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/645 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # ■プログラム1: # りんごが30個中、腐ったりんごが10個あったとき、 # 腐ってないりんごを3人で分けると、 # 一人当たりのりんごの個数は何個になるか、計算し、 # "一人あたりのりんごの個数"と"残ったりんごの個数"を # 出力するプログラム。 # (C言語の足し算、引き算、かけ算、割り算はそれぞれ、 +, -, *, / を使うが、 # 割った余り(剰余) は % で計算できる。 (例: n を m で割った余りは n % m )) # ■プログラム2: # 上記プログラム1 のリンゴの個数などの数を scanfを使ってキーボードから # 入力することで、任意の個数に対して計算できるように改良したプログラム。 # ただし両プログラムの変数名は、最初のりんごの個数をapple、 # 腐っていたりんごの個数を bad_apple、人数をpersons、 # 一人当たりのりんごの個数を apple_for_one、余りをrest とすること。 # 'りんごの個数を入力し、その中の腐ったりんごの個数を入力する。人数を入力して、腐ってないりんごをこの人数で分けると、一人当たりのりんごは何個になるかを計算し、"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する' :- りんごの個数を入力し(_りんごの個数), 腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数), 人数を入力して(_分割する人数), '腐ってないりんごを何人かで分ける'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数), '"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する'(_一人当たりのりんごの個数,_残ったりんごの個数). りんごの個数を入力し(_りんごの個数) :- write('りんごの個数を入力してください : '), get_line(Line), りんごの個数入力検査(Line,_りんごの個数),!. りんごの個数を入力し(_りんごの個数) :- りんごの個数を入力し(_りんごの個数). りんごの個数入力検査(Line,_りんごの個数) :- atom_to_term(Line,_りんごの個数,_), integer(_りんごの個数), _りんごの個数 > 0,!. りんごの個数入力検査(Line,_りんごの個数) :- writef('入力された%tからは適切なりんごの個数が得られません。再入力をお願いします。\n',[Line]), fail. 腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数) :- writef('腐ったりんごの個数を入力してください( >%t ) : ',[_りんごの個数]), get_line(Line), 腐ったりんごの個数入力検査(Line,_腐ったりんごの個数),!. 腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数) :- 腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数). 腐ったりんごの個数入力検査(Line,_りんごの個数,_腐ったりんごの個数) :- atom_to_term(Line,_腐ったりんごの個数,_), integer(_腐ったりんごの個数), _腐ったりんごの個数 < _りんごの個数,!. 腐ったりんごの個数入力検査(Line,_りんごの個数,_腐ったりんごの個数) :- writef('入力された%tからは適切な腐ったりんごの個数は得られません。再入力をお願いします。\n',[Line]), fail. 人数を入力して(_分割する人数) :- write('分割する人数を入力してください : '), get_line(Line), 人数入力検査(Line,_分割する人数),!. 人数を入力して(_分割する人数) :- 人数を入力して(_分割する人数). 人数入力検査(Line,_分割する人数) :- atom_to_term(Line,_分割する人数,_), integer(_分割する人数), _分割する人数 > 0,!. 人数入力検査(Line,_分割する人数) :- writef('入力された%tからは適切な分割する人数が得られません。再入力をお願いします。\n',[Line]), '腐ってないりんごを何人かで分ける'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数) :- '腐っないりんごを'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数), '何人かで分ける'(_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数). '腐っないりんごを'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数) :- _腐っていないりんごの個数 is _りんごの個数 - _腐ったりんごの個数. '何人かで分ける'(_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数) :- _一人当たりのりんごの個数 is _腐っていないりんごの個数 // _分割する人数, _残ったりんごの個数 is _腐っていないりんごの個数 mod _分割する人数. '"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する'(_一人当たりのりんごの個数,_残ったりんごの個数) :- 出力する('一人あたりのりんごの個数 = %t\n',_一人当たりのりんごの個数), 出力する('残ったりんごの個数 = %t\n',_残ったのりんごの個数). 出力する(_表示パターン,_表示項目) :- writef(_表示パターン,[_表示項目]). % このプログラムは http://nojiriko.asia/prolog/c152_645_1.html のどこを変更 % したかを確認してこそ、意味のあるものです。 % 最初の述語名が大きく異なっていること。これが一番重要だと思います。 % それから具体値を一般化した場合の述語名の書き換え方。 % やはり、Prologは国語だ。 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/627 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # scanf で n を受け取り, 要素数 n の乱数配列を作成し, 指定した 2 つの要素番号にある要素を交換するプログラムを作成せよ. # 'n を受け取り, 要素数 n の乱数ならびを作成し, 指定した 2 つの要素番号にある要素を交換する' :- 'n を受け取り'(_n), '要素数 n の乱数配列を作成し'(_n,_乱数ならび), '指定した 2 つの要素番号にある要素を交換する'(_n,_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび), 表示する(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび),!. 'n を受け取り'(_n) :- write('要素数nを入力してください : '), get_line(Line), 'n受け取り検査'(Line,_n),!. 'n を受け取り'(_n) :- 'n を受け取り'(_n). 'n受け取り検査'(Line,_n) :- atom_to_term(Line,_n,_), integer(_n), _n > 0,!. 'n受け取り検査'(Line,_n) :- writef('入力された%tからは適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. '要素数 n の乱数配列を作成し'(_n,_乱数ならび) :- length(_乱数ならび,_n), findall(_乱数,( append(_,[_乱数|_],_乱数ならび), _乱数 is random(100) + 1), _乱数ならび). '指定した 2 つの要素番号にある要素を交換する'(_n,_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2), '2 つの要素番号にある要素を交換する'(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび). '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2) :- writef('2つの要素番号[1~%t]をカンマ区切りで入力してください : ',[_n]), get_line(Line), '指定した 2 つの要素番号入力検査'(Line,_n,_要素番号_1,_要素番号_2),!. '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2) :- '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2). '指定した 2 つの要素番号入力検査'(Line,_n,_要素番号_1,_要素番号_2) :- '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2), '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2),!. '指定した 2 つの要素番号入力検査'(Line,_要素番号_1,_要素番号_2) :- write('再入力をお願いします\n'), fail. '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2) :- split(Line,[','],[_要素番号_1,_要素番号_2]),!. '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2) :- writef('入力された%tからは2要素の要素番号が得られません。\n',[Line]), fail. '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2) :- _要素番号_1 > 0, _要素番号_1 =< _n, _要素番号_2 > 0, _要素番号_2 =< _n,!. '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2) :- writef('入力された要素には[1~%t]の範囲を逸脱しているものが有ります。\n',[Line,_n]), fail. '2 つの要素番号にある要素を交換する'(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- 要素番号を変数に置換(_乱数ならび,_要素番号_1,_元の値_1,_変数_1,_乱数ならびの一), 要素番号を変数に置換(_乱数ならびの一,_要素番号_2,_元の値_2,_変数_2,_2要素が交換された乱数ならび), _変数_1 = _元の値_2, _変数_2 = _元の値_1,!. 要素番号を変数に置換(_ならび,_要素番号,_元の値,_変数,_置換されたならび) :- length([_|L0],_要素番号), append(L0,[_元の値|R],_ならび), append(L0,[_変数|R],_置換されたならび). 表示する(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- writef('元の乱数ならびは: %t\n',[_乱数ならび]), writef('%t番目と%t番目の要素を交換する\n',[_要素番号_1,_要素番号_2]), writef('2要素が交換された乱数ならびは: %t\n',[_2要素が交換された乱数ならび]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/588 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算するプログラムを作成せよ. # ただし, 一つの行の合計は, 行の先頭を指す整数型のポインタ a と列数をあらわす整数 n を受け取り, 一行の合計を返す 関数 int row_sum( int* a, int n ) を作成し計算せよ. (関数の引数と返り値の型を指定されたもので作ること) # # '3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算する'(_指定した行位置,_行の和) :- '3x4 の行列を二次元配列で定義し', '3x4 の行列'(_行列), '3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算する'(_行列,_指定した行位置,_行の和). '行列の指定した行の和を計算する'(_行列,_指定した行位置,_行の和) :- nth1(_指定した行位置,_行列,_指定した行), sum(_指定した行,_行の和). '3x4 の行列を二次元配列で定義し' :- length(LL,3), findall(L,( append(L0,[L|_],LL), length([_|L0],_行位置), length(L,4), 列を埋める(_行位置,L)), LL), assertz('3x4 の行列'(LL)). 列を埋める(_行位置,L) :- findall(_値,( append(L0,[_値|_],L), length([_|L0],_列位置), 整数入力(_行位置,_列位置,_値)), L). 整数入力(_行位置,_列位置,_値) :- writef('[%t][%t]: ',[_行位置,_列位置]), get_line(Line), 整数入力検査(Line,_値),!. 整数入力(_行位置,_列位置,_値) :- 整数入力(_行位置,_列位置,_値). 整数入力検査(Line,_値) :- atom_to_term(Line,_値,_), integer(_値),!. 整数入力検査(Line,_値) :- writef('入力された%tからは数値が得られません。再入力をお願いします。\n',[Line]), fail. sum([],0). sum([V|R],S) :- sum(R,S2), S is V + S2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/588 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算するプログラムを作成せよ. # ただし, 一つの行の合計は, 行の先頭を指す整数型のポインタ a と列数をあらわす整数 n を受け取り, 一行の合計を返す 関数 int row_sum( int* a, int n ) を作成し計算せよ. (関数の引数と返り値の型を指定されたもので作ること) # # '3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算する'(_n行目,_行の和) :- '3x4 の行列を二次元配列で定義し'(LL), nth1(_n行目,LL,L), sum(L,_行の和). '3x4 の行列を二次元配列で定義し'(LL) :- length(LL,3), findall(L,( append(L0,[L|_],LL), length([_|L0],_行位置), length(L,4), 列を埋める(_行位置,L)), LL). 列を埋める(_行位置,L) :- findall(_値,( append(L0,[_値|_],L), length([_|L0],_列位置), 整数入力(_行位置,_列位置,_値)), L). 整数入力(_行位置,_列位置,_値) :- writef('[%t][%t]: ',[_行位置,_列位置]), get_line(Line), 整数入力検査(Line,_値),!. 整数入力(_行位置,_列位置,_値) :- 整数入力(_行位置,_列位置,_値). 整数入力検査(Line,_値) :- atom_to_term(Line,_値,_), integer(_値),!. 整数入力検査(Line,_値) :- writef('入力された%tからは数値が得られません。再入力をお願いします。\n',[Line]), fail. sum([],0). sum([V|R],S) :- sum(R,S2), S is V + S2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/573 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 挿入ソートを乱数配列に対して 100 回実行し, 一回のソートにおける 配列要素の値の比較回数とその平均値を表示するプログラムを作成せよ. また, 以下の機能も加えよ; # 1.整数 n, max を scanf で受け取り, 乱数配列の 長さ n と乱数の範囲 ( 1 から max まで )を指定できる. # 2.一回のソートにおける比較回数は見やすいように各行 10 個ずつ表示する. # '挿入ソートを乱数ならびに対して 100 回実行し, 一回のソートにおける ならび要素の値の比較回数とその平均値を表示する' :- ならびの長さを得る(_n), 乱数の最大値を得る(Max), '挿入ソートを乱数ならびに対して 100 回実行し, 一回のソートにおける ならび要素の値の比較回数とその平均値を表示する'(1,_n,Max,_比較回数合計,_比較回数平均値), writef('比較平均回数: %t\n',[_比較回数平均]),!. ならびの長さを得る(_n) :- write('ならびの長さを入力してください : '), get_line(Line), ならびの長さ検査(Line,_n),!. ならびの長さを得る(_n) :- ならびの長さを得る(_n). ならびの長さ検査(Line,_n) :- atom_to_term(Line,_n,_), interger(_n),!. ならびの長さ検査(Line,_n) :- writef('入力された%tから適切な整数が得られません。再入力をお願いします。\n',[Line]), fail. 乱数の最大値を得る(Max) :- write('乱数の最大値を入力してください : '), get_line(Line), 乱数の最大値検査(Line,Max),!. 乱数の最大値を得る(Max) :- 乱数の最大値を得る(Max). 乱数の最大値検査(Line,Max) :- atom_to_term(Line,Max,_), interger(Max),!. 乱数の最大値検査(Line,Max) :- writef('入力された%tから乱数の最大値として適切な整数が得られません。再入力をお願いします。\n',[Line]), fail. '挿入ソートを乱数ならびに対して 100 回実行し, 一回のソートにおける ならび要素の値の比較回数とその平均値を表示する'(N,_n,Max,_比較回数合計,_比較回数平均値) :- N > 100, _比較回数平均値 is _比較回数合計 / 100,!. '挿入ソートを乱数ならびに対して 100 回実行し, 一回のソートにおける ならび要素の値の比較回数とその平均値を表示する'(N,_n,Max,_比較回数合計,_比較回数平均値) :- 乱数ならびを得る(_n,_Max,_乱数ならび), 比較回数を数えながら挿入整列(_乱数ならび,_整列されたならび,0,_比較回数), 比較回数の表示(N,_比較回数), _比較回数のニ is _比較回数合計 + _比較回数, N2 is N + 1, '挿入ソートを乱数ならびに対して 100 回実行し, 一回のソートにおける ならび要素の値の比較回数とその平均値を表示する'(N2,_n,Max,_比較回数合計のニ,_比較回数平均値). 乱数ならびを得る(_n,_Max,_乱数ならび) :- length(_乱数ならび,_n), findall(N,( append(_,[N|_],_乱数ならび), N is random(_Max) + 1), _乱数ならび),!. 比較回数を数えながら挿入整列(L1) :- 比較回数を数えながら挿入整列(L1,[],L2,0,_比較回数), writef('整列されたリストは %t 比較回数は %t です。\n',[L2,_比較回数]). 比較回数を数えながら挿入整列([],L,L,_比較回数,_比較回数). 比較回数を数えながら挿入整列([A|R1],L1,L,_比較回数1,_比較回数) :- 'append挿入'(A,L1,L2,_比較回数2), writef('append挿入: %t,%t,%t,%t\n',[A,L1,L2,_比較回数2]), _比較回数3 is _比較回数1 + _比較回数2, 比較回数を数えながら挿入整列(R1,L2,L,_比較回数3,_比較回数). 比較回数を数えながら挿入整列([A|R1],[],L,_比較回数1,_比較回数) :- _比較回数2 is _比較回数1 + 1, 比較回数を数えながら挿入整列(R1,[A],L,_比較回数2,_比較回数). 'append挿入'(A,L1,L,_比較回数) :- append(L0,[B|R],L1), A < B, append(L0,[A,B|R],L), length(L0,Len), _比較回数 is ((Len * 2) + 1) * 2,!. 'append挿入'(A,L1,L,_比較回数) :- append(L1,[A],L), length(L1,Len), _比較回数 is Len * 2 + 1,!. 比較回数の表示(N,_比較回数) :- 0 is N mod 10, N2 is N + 1, writef('%t:%t\n',[N,_比較回数]),!. 比較回数の表示(N,_比較回数) :- writef('%t:%t ',[N,_比較回数]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/563 # # http://ime.nu/codepad.org/bsGYVXWW # # 4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する。 # '4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する' :- '4名の学生別に3科目の成績を入力して'(LL), 'その学生別平均と'(LL,_学生別平均ならび), '科目別平均を'(LL,_科目別平均ならび), '表示する'(_学生別平均ならび,_科目別平均ならび). '4名の学生別に3科目の成績を入力して'(LL) :- '4名の'(LL,4), findall(L,( 学生別に(LL,L), '3科目の成績を入力する'(L)), LL). '4名の'(LL) :- length(LL,4). 学生別に(LL,L) :- append(_,[L|_],LL). '3科目の成績を入力する'(L) :- '3科目の'(L), findall(_成績,( 成績を(L,_成績), 入力する(_成績)), L). '3科目の'(L) :- length(L,3). 成績を(L,_成績) :- append(_,[_成績|_],L). 入力する(_成績) :- get_line(Line), 成績入力検査(Line,_成績),!. 入力する(_成績) :- 入力する(_成績). 成績入力検査(Line,_成績) :- atom_to_term(Line,_成績,_), '成績は0点以上100点以下の整数とする'(_成績),!. 成績入力検査(Line,_成績) :- writef('入力された%tからは科目成績として適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. '成績は0点以上100点以下の整数とする'(_成績) :- integer(_成績), _成績 >= 0, _成績 =< 100. 'その学生別平均と'(LL,_学生別平均ならび) :- findall(_平均,( append(_,[L|_],LL), 相加平均(L,_平均)), _学生別平均ならび). '科目別平均を'(LL,_科目別平均ならび) :- 転置(LL,LL1), findall(_平均,( append(_,[L|_],LL1), 相加平均(L,_平均)), _科目別平均ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0,M). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/563 # # http://ime.nu/codepad.org/bsGYVXWW # # 4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する。 # # '4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する' :- '4名の学生別に3科目の成績を入力して'(LL), 'その学生別平均と'(LL,_学生別平均ならび), '科目別平均を'(LL,_科目別平均ならび), '表示する'(_学生別平均ならび,_科目別平均ならび). '4名の学生別に3科目の成績を入力して'(LL) :- '4名の'(LL,4), findall(L,( 学生別に(LL,L), '3科目の成績を入力する'(L)), LL). '4名の'(LL) :- length(LL,4). 学生別に(LL,L) :- append(_,[L|_],LL). '3科目の成績を入力する'(L) :- '3科目の'(L), findall(_成績,( 成績を(L,_成績), 入力する(_成績)), L). '3科目の'(L) :- length(L,3). 成績を(L,_成績) :- append(_,[_成績|_],L). 入力する(_科目別成績) :- get_line(Line), 入力検査(Line,_科目別成績),!. 入力する(_科目別成績) :- 入力する(_科目別成績). 入力検査(Line,_科目別成績) :- atom_to_term(Line,_科目別成績,_), integer(_科目別成績), _科目別成績 >= 0, _科目別成績 =< 100,!. 入力検査(Line,_科目別成績) :- writef('入力された%tからは科目成績として適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'その学生別平均と'(LL,_学生別平均ならび) :- findall(_平均,( append(_,[L|_],LL), 相加平均(L,_平均)), _学生別平均ならび). '科目別平均を'(LL,_科目別平均ならび) :- 転置(LL,LL1), findall(_平均,( append(_,[L|_],LL1), 相加平均(L,_平均)), _科目別平均ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/563 # # http://ime.nu/codepad.org/bsGYVXWW # # #include # #define student 4 # #define score 3 # int main(){ # int i, j; # int a[student][score]; # int num[3]; # for(i=0; i= 0, _成績 =< 100,!. 成績入力検査(Line,_成績) :- writef('入力された%tからは科目成績として適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'その学生別平均と'(LL,_学生別平均ならび) :- findall(_平均,( append(_,[L|_],LL), 相加平均(L,_平均)), _学生別平均ならび). '科目別平均を'(LL,_科目別平均ならび) :- 転置(LL,LL1), findall(_平均,( append(_,[L|_],LL1), 相加平均(L,_平均)), _科目別平均ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0,M). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/563 # # http://ime.nu/codepad.org/bsGYVXWW # # #include # #define student 4 # #define score 3 # int main(){ # int i, j; # int a[student][score]; # int num[3]; # for(i=0; i < student; i++){ # for(j=0; j < score; j++){ # printf("学生%d 科目%d :", i+1, j+1); # scanf("%d", &a[j][i]); # } # } # # for(j=0; j < student; j++){ # num[j]=0; # for(i=0; i < score; i++){ # num[j]=num[j]+a[student][score]; # } # } # # for(j=0; j < student; j++){ # for(i=0; i < score; i++){ # printf("学生%d 科目%d:%5.1f\n", i+1, i+1, num[i]/score); # } # } # return 0; # } # # ここまでは出来たんだが、↓のように表示するにはどう加えればいいのですか? # 学生別平均 学生1:0.0 学生2:0.0 学生3:0.0 学生4:0.0 # 科目別平均 科目1:0.0 科目2:0.0 科目3:0.0 # '4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する' :- '4名の学生別に3科目の成績を入力して'(LL), 'その学生別平均と'(LL,_学生別平均ならび), '科目別平均を'(LL,_科目別平均ならび), '表示する'(_学生別平均ならび,_科目別平均ならび). '4名の学生別に3科目の成績を入力して'(LL) :- '4名の'(LL,4), findall(L,( 学生別に(LL,L), '3科目の成績を入力する'(L)), LL). '4名の'(LL) :- length(LL,4). 学生別に(LL,L) :- append(_,[L|_],LL). '3科目の成績を入力する'(L) :- '3科目の'(L), findall(_成績,( 成績を(L,_成績), 入力する(_成績)), L). '3科目の'(L) :- length(L,3). 成績を(L,_成績) :- append(_,[_成績|_],L). 入力する(_科目別成績) :- get_line(Line), 入力検査(Line,_科目別成績),!. 入力する(_科目別成績) :- 入力する(_科目別成績). 入力検査(Line,_科目別成績) :- atom_to_term(Line,_科目別成績,_), integer(_科目別成績), _科目別成績 >= 0, _科目別成績 =< 100,!. 入力検査(Line,_科目別成績) :- writef('入力された%tからは科目成績として適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'その学生別平均と'(LL,_学生別平均ならび) :- findall(_平均,( append(_,[L|_],LL), 相加平均(L,_平均)), _学生別平均ならび). '科目別平均を'(LL,_科目別平均ならび) :- 転置(LL,LL1), findall(_平均,( append(_,[L|_],LL1), 相加平均(L,_平均)), _科目別平均ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/350 # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク):整数 mとnを入力して m+(m+1)+(m+2)+…+n # を出力するプログラムを作成しろ # % 馬鹿正直に、m+(m+1)+(m+2)+…+n をプログラムとして書こうとしたら % どのような困難があるかということを示す。 '整数 mとnを入力して m+(m+1)+(m+2)+…+nを出力するプログラムを作成しろ' :- '整数 mとnを入力して'(_m,_n), 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S), '_m,_n,の値と適用するための工夫をする'(S,S2), 文字列を項に変換する(S2,P,VL), '表示文字列Xの表すものは変数Xである'(VL,X), call(P), '_mをmに_nをnに変換すると'(S,S3), writef('%t = %t\n',[S3,X]). 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S) :- _n_1 is _n - _m - 1, findall(S1,( for(1,N,_n_1), concat_atom(['(_m+',N,')'],S1)), L), concat_atom(L,'+',S),!. '_m,_n,の値と適用するための工夫をする'(S1,S2) :- concat_atom(['_m=',_m,',_n=',_n,',',X is S1,'+_n'],S2),!. '表示文字列Xの表すものは変数Xである'(VL,X) :- member('X'=X,VL). 文字列を項に変換する(S,P,VL) :- atom_to_term(S,P,VL),!. '_mをmに_nをnに変換すると'(S1,S2) :- atom_chars(S1,Chars), 'ならびの_mをmに_nをnに変換すると'(L1,L2), atom_chars(S2,L2),!. 'ならびの_mをmに_nをnに変換すると'([],[]) :-!. 'ならびの_mをmに_nをnに変換すると'(['_',m|R1],[m|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'(['_'|n],[n|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'([A|R1],[A|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. '整数 mとnを入力して'(_m,_n) :- write('m + 1 < n となるように'), 整数を入力(_m), 整数を入力(_n), '整数 mとnを入力診断'(_m,_n),!. '整数 mとnを入力して'(_m,_n) :- '整数 mとnを入力して'(_m,_n). 整数を入力(_整数) :- write('整数を入力しなさい : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数を入力(_整数) :- 整数を入力(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '整数 mとnを入力診断'(_m,_n) :- _n > _m + 1,!. '整数 mとnを入力診断'(_m,_n) :- write('m + 1 < n でなくてはなりません。再入力をお願いします。'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/350 # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク):整数 mとnを入力して m+(m+1)+(m+2)+…+n # を出力するプログラムを作成しろ # % 馬鹿正直に、m+(m+1)+(m+2)+…+n をプログラムとして書こうとしたら % どのような困難があるかということを示す。 '整数 mとnを入力して m+(m+1)+(m+2)+…+nを出力するプログラムを作成しろ' :- '整数 mとnを入力して'(_m,_n), 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S), '_m,_n,の値と適用するための工夫をする'(S,S2), 文字列を項に変換する(S2,P,VL), '表示文字列Xの表すものは変数Xである'(VL,X), call(P), '_mをmに_nをnに変換すると'(S,S3), writef('%t = %t\n',[S3,X]). 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S) :- _n_1 is _n - _m - 1, findall(S1,( for(1,N,_n_1), concat_atom(['(_m+',N,')'],S1)), L), concat_atom(L,'+',S),!. '_m,_n,の値と適用するための工夫をする'(S1,S2) :- concat_atom(['_m=',_m,',_n=',_n,',',X is S1,'+_n'],S2),!. '表示文字列Xの表すものは変数Xである'(VL,X) :- member('X'=X,VL). 文字列を項に変換する(S,P,VL) :- atom_to_term(S,P,VL),!. '_mをmに_nをnに変換すると'(S1,S2) :- atom_chars(S1,Chars), 'ならびの_mをmに_nをnに変換すると'(L1,L2), atom_chars(S2,L2),!. 'ならびの_mをmに_nをnに変換すると'([],[]) :-!. 'ならびの_mをmに_nをnに変換すると'(['_',m|R1],[m|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'(['_'|n],[n|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'([A|R1],[A|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. '整数 mとnを入力して'(_m,_n) :- write('m + 1 < n となるように'), 整数を入力(_m), 整数を入力(_n), '整数 mとnを入力診断'(_m,_n),!. '整数 mとnを入力して'(_m,_n) :- '整数 mとnを入力して'(_m,_n). 整数を入力(_整数) :- write('整数を入力しなさい : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数を入力(_整数) :- 整数を入力(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '整数 mとnを入力診断'(_m,_n) :- _n > _m + 1,!. '整数 mとnを入力診断'(_m,_n) :- write('m + 1 < n でなくてはなりません。再入力をお願いします。'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/340 # # 1C言語学習 # 2 2つの整数を入力して、その2つの最大公約数を求めよ # 3環境 は Linux gcc C言語です # 4期限は 明日までです # 5 配列には入っていません # ならったところまでの総合問題です # 初心者なので、簡略化しないで頂きたいです お願いします # # '2つの整数を入力して、その2つの最大公約数を求める' :- '2つの整数を入力して'(_整数_1,_整数_2), 'その2つの最大公約数を求める'(_整数_1,_整数_2,_最大公約数), 最大公約数を表示する(_整数_1,_整数_2,_最大公約数). '2つの整数を入力して'(_整数_1,_整数_2) :- 整数を入力して(_整数_1), 整数を入力して(_整数_2). 整数を入力して(_整数) :- write('整数を入力してください : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数を入力して(_整数) :- 整数を入力して(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 'その2つの最大公約数を求める'(_整数,_整数,_整数) :- !. 'その2つの最大公約数を求める'(_整数_1,_整数_2,_最大公約数) :- _整数_1 > _整数_2, 小さい整数を初期値として下降しながら2整数の公約数を捜す(_整数_2,_整数_1,_整数_2,_最大公約数),!. 'その2つの最大公約数を求める'(_整数_1,_整数_2,_最大公約数) :- _整数_1 < _整数_2, 小さい整数を初期値として下降しながら2整数の公約数を捜す(_整数_1,_整数_1,_整数_2,_最大公約数),!. 小さい整数を初期値として下降しながら2整数の公約数を捜す(_初期値,_整数_1,_整数_2,_最大公約数) :- for(_初期値,_最大公約数,1), 0 is _整数_1 mod _最大公約数, 0 is _整数_2 mod _最大公約数,!. 最大公約数を表示する(_整数_1,_整数_2,_最大公約数) :- writef('%t と %t の最大公約数は %t\n',[_整数_1,_整数_2,_最大公約数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/340 # # 1C言語学習 # 2 2つの整数を入力して、その2つの最大公約数を求めよ # 3環境 は Linux gcc C言語です # 4期限は 明日までです # 5 配列には入っていません # ならったところまでの総合問題です # 初心者なので、簡略化しないで頂きたいです お願いします # # '2つの整数を入力して、その2つの最大公約数を求める' :- '2つの整数を入力して'(_整数_1,_整数_2), 'その2つの最大公約数を求める'(_整数_1,_整数_2,_最大公約数), 最大公約数を表示する(_整数_1,_整数_2,_最大公約数). '2つの整数を入力して'(_整数_1,_整数_2) :- 整数を入力して(_整数_1), 整数を入力して(_整数_2). 整数を入力して(_整数) :- write('整数を入力してください : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数を入力して(_整数) :- 整数を入力して(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 'その2つの最大公約数を求める'(_整数_1,_整数_2,_最大公約数) :- 最大公約数をユークリッドの互除法で求める(_整数_1,_整数_2,_最大公約数). 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最大公約数を表示する(_整数_1,_整数_2,_最大公約数) :- writef('%t と %t の最大公約数は %t\n',[_整数_1,_整数_2,_最大公約数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/338 # # 急ぎなのですが # 1 考えるC # 2 整数m(mが2以上)を入力し、m以下の素数を全て表示するプログラムを作れ。 # 3 環境はlinux gcc C言語です # # 4期限は今日の夕方まで # 5進んだところは # 配列はまだやっていません # 総合問題みたいらしいです # # ぐぐればすぐサンプルがあるらしいのですが、それを使わずにかけといっていました # (簡単にかけるらしいので) # # よろしくお願いします # % 失敗駆動の例 '整数m(mが2以上)を入力し、m以下の素数を全て表示する' :- '整数m(mが2以上)を入力し'(_m), 'm以下の素数を全て表示する'(_m). '整数m(mが2以上)を入力し'(_m) :- write('整数m(mが2以上)を入力してください : '), get_line(Line), '整数m(mが2以上)を入力診断'(Line,_m),!. '整数m(mが2以上)を入力し'(_m) :- '整数m(mが2以上)を入力し'(_m). '整数m(mが2以上)を入力診断'(Line,_m) :- atom_to_term(Line,_m,_), integer(_m), _m >= 2,!. '整数m(mが2以上)を入力診断'(Line,_m) :- writef('入力された %t からは2以上の整数が得られません。再入力をお願いします。\n',[Line]), fail. 'm以下の素数を全て表示する'(_m) :- for(2,N,_m), 'Nは素数である'(2,N), writef('%t\n',[N]), N = _m,!. 'm以下の素数を全て表示する'(_). 'Nは素数である'(N) :- for(2,M,N), 'NはMで割り切れる'(N,M), !, M = N. 'NはMで割り切れる'(N,M) :- 0 is N mod M. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/338 # # 急ぎなのですが # 1 考えるC # 2 整数m(mが2以上)を入力し、m以下の素数を全て表示するプログラムを作れ。 # 3 環境はlinux gcc C言語です # # 4期限は今日の夕方まで # 5進んだところは # 配列はまだやっていません # 総合問題みたいらしいです # # ぐぐればすぐサンプルがあるらしいのですが、それを使わずにかけといっていました # (簡単にかけるらしいので) # # よろしくお願いします # '整数m(mが2以上)を入力し、m以下の素数を全て表示する' :- '整数m(mが2以上)を入力し'(_m), 'm以下の素数を全て表示する'(_m). '整数m(mが2以上)を入力し'(_m) :- write('整数m(mが2以上)を入力してください : '), get_line(Line), '整数m(mが2以上)を入力診断'(Line,_m),!. '整数m(mが2以上)を入力し'(_m) :- '整数m(mが2以上)を入力し'(_m). '整数m(mが2以上)を入力診断'(Line,_m) :- atom_to_term(Line,_m,_), integer(_m), _m >= 2,!. '整数m(mが2以上)を入力診断'(Line,_m) :- writef('入力された %t からは2以上の整数が得られません。再入力をお願いします。\n',[Line]), fail. 'm以下の素数を全て表示する'(_m) :- for(2,N,_m), 'Nは素数である'(2,N), writef('%t\n',[N]), N = _m,!. 'm以下の素数を全て表示する'(_). 'Nは素数である'(N,N) :- !. 'Nは素数である'(M,N) :- 0 is N mod M,!, fail. 'Nは素数である'(M,N) :- M2 is M + 1, 'Nは素数である'(M2,N). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/338 # # 急ぎなのですが # 1 考えるC # 2 整数m(mが2以上)を入力し、m以下の素数を全て表示するプログラムを作れ。 # 3 環境はlinux gcc C言語です # # 4期限は今日の夕方まで # 5進んだところは # 配列はまだやっていません # 総合問題みたいらしいです # # ぐぐればすぐサンプルがあるらしいのですが、それを使わずにかけといっていました # (簡単にかけるらしいので) # # よろしくお願いします # '整数m(mが2以上)を入力し、m以下の素数を全て表示する' :- '整数m(mが2以上)を入力し'(_m), 'm以下の素数を全て表示する'(_m). '整数m(mが2以上)を入力し'(_m) :- write('整数m(mが2以上)を入力してください : '), get_line(Line), '整数m(mが2以上)を入力診断'(Line,_m),!. '整数m(mが2以上)を入力し'(_m) :- '整数m(mが2以上)を入力し'(_m). '整数m(mが2以上)を入力診断'(Line,_m) :- atom_to_term(Line,_m,_), integer(_m), _m >= 2,!. '整数m(mが2以上)を入力診断'(Line,_m) :- writef('入力された %t からは2以上の整数が得られません。再入力をお願いします。\n',[Line]), fail. 'm以下の素数を全て表示する'(_m) :- findall(N,( for(2,N,_m)), L1), エラトステネスの篩(L1,L2), append(_,[_素数|R],L2), writef('%t\n',[_素数]), R = []. エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/8 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):自然数n>0を入力し、その自明でない約数(1とn以外の約数)をひとつ出力するプログラムを作成せよ。 # '自然数n>0を入力し、その自明でない約数(1とn以外の約数)をひとつ出力する' :- 自然数を入力し(_n), 'その自明でない約数(1とn以外の約数)をひとつ出力する'(_n). 'その自明でない約数(1とn以外の約数)をひとつ出力する'(_n) :- _m is _n // 2, _m >= 2, for(_m,N,2), Mod is _n mod N, Mod = 0, writef('%t\n',[N]). 'その自明でない約数(1とn以外の約数)をひとつ出力する'(_n) :- writef('%tは素数です\n',[_n]). 自然数を入力し(_n) :- write('自然数を入力してください : '), get_line(Line), 自然数入力診断(Line,_n),!. 自然数を入力し(_n) :- 自然数を入力し(_n). 自然数入力診断(Line,_n) :- atom_to_term(Line,_n,_), integer(_n), _n > 0,!. 自然数入力診断(Line,_n) :- writef('入力された%tからは自然数nが得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/7 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):自然数n > 1 と整数g, x >= 0 を入力として, g^x をn で割った余りg^x mod n を求めて表 # 示するプログラムを作成せよ. # '自然数n > 1 と整数g, x >= 0 を入力として, g^x をn で割った余りg^x mod n を求めて表示する' :- '自然数n > 1 と整数g, x >= 0 を入力して、'(_n,_g,_x), 'g^x をn で割った余りg^x mod nを求めて表示する'(_n,_g,_x,_余り), writef('%t = %t^%t mod %t\n',[_余り,_g,_x,_n]). '自然数n > 1 と整数g, x >= 0 を入力して、'(_n,_g,_x) :- '自然数n > 1 と'(_n), '整数g>=0'(_g), '整数x>=0'(_x). '自然数n > 1 と'(_n) :- write('1より大きい自然数を入力してください : '), get_line(Line), '1より大きい自然数の入力診断'(Line,_n),!. '自然数n > 1 と'(_n) :- '自然数n > 1 と'(_n). '1より大きい自然数の入力診断'(Line,_n) :- atom_to_term(Line,_n,_), integer(_n), _n > 1,!. '1より大きい自然数の入力診断'(Line,_n) :- writef('入力された%tから1より大きい自然数が得られません。再入力をお願いします。\n',[Line]), fail. '整数g>=0'(_x) :- write('0以上の整数を入れてください : '), get_line(Line), '0以上の整数入力診断'(Line,_g),!. '整数g>=0'(_x) :- '整数g>=0'(_x). '整数x>=0'(_x) :- write('0以上の整数を入れてください : '), get_line(Line), '0以上の整数入力診断'(Line,_x),!. '整数x>=0'(_x) :- '整数x>=0'(_x). '0以上の整数入力診断'(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 0,!. '0以上の整数入力診断'(Line,N) :- writef('入力された%tからは0以上の整数は得られません。再入力をお願いします。\n',[Line]),!,fail. 'g^x をn で割った余りg^x mod nを求めて表示する'(_n,_g,_x,_余り) :- _余り is truncate(_g ^ _x) mod _n. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/805 # # [1]授業単元:プログラミング # [2]問題文:番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存 # 全データ一覧 # 入力した番号の点数のみ表示 # 新しいデータを入力しリストの最後に追加 # 番号のみを入力してデータ削除 ← 可能ならば、出来てなくても大丈夫です # プログラム終了 # # 始めから与えられているデータを入れ忘れました。申し訳ありませんでした # 番号  数学  英語 # N0003  82  100 # N0006  73  91 # N0020  69  83 # N0011  44  70 # N0025  34  62 # N0022  32  52 # N0015  16  12 # N0013  61  100 # N0001  70  88 # (本当はデータ数が25個程あるのですが、これだけでお願いします) # 全データ一覧ではリスト通りの表示でOKです # 成績('N0003',82,100). 成績('N0006',73,91). 成績('N0020',69,83). 成績('N0011',44,70). 成績('N0025',34,62). 成績('N0022',32,52). 成績('N0015',16,12). 成績('N0013',61,100). 成績('N0001',70,88). 成績管理 :- 成績管理メニュー表示, get_integer(_選択), 成績管理選択実行(_選択). 成績管理メニュー表示 :- write('左側の番号で選択してください\n'), write('1..番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存\n'), write('2..全データ一覧\n'), write('3..入力した番号の点数のみ表示\n'), write('4..新しいデータを入力しリストの最後に追加\n'), write('5..番号のみを入力してデータ削除\n'), write('9..終了\n'),!. 成績管理選択実行(1) :- '番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存'. 成績管理選択実行(2) :- 全テータ一覧. 成績管理選択実行(3) :- 入力した番号の点数のみ表示. 成績管理選択実行(4) :- 新しいデータを入力しリストの最後に追加. 成績管理選択実行(5) :- 番号のみを入力してデータ削除. 成績管理選択実行(9). '番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存' :- findall([_番号,_数学点数,_英語点数],( 成績(_番号,_数学点数,_英語点数)), LL), open('生成保存.pro',write,Outstream), writef(Outstream,'%q.\n',[LL]), close(Outstream). 全データ一覧 :- write('番号  数学  英語\n'), 成績(_番号,_数学点数,_英語点数), writef('%t %4r %4r\n',[_番号,_数学点数,_英語点数]), fail. 全データ一覧. 入力した番号の点数のみ表示 :- 入力した番号(_入力した番号), write('番号  数学  英語\n'), 成績(_番号,_数学点数,_英語点数), writef('%t %4r %4r\n',[_番号,_数学点数,_英語点数]), fail. 入力した番号の点数のみ表示. 入力した番号(_入力した番号) :- get_line(_入力した番号),!. 新しいデータを入力しリストの最後に追加 :- 番号の入力(_番号), 数学点数の入力(_数学点数), 英語点数の入力(_英語点数), 新しいデータを入力しリストの最後に追加(_番号,_数学点数,_英語点数). 新しいデータを入力しリストの最後に追加(_番号,_数学点数,_英語点数) :- assertz(成績(_番号,_数学点数,_英語点数)). 番号の入力(_番号) :- write('番号を入力してください : '), get_line(_番号),!. 数学点数の入力(_数学点数) :- write('数学点数(0~100)を入力してください : '), get_line(Line), 点数入力診断(Line,_数学点数), 数学点数の入力(_数学点数) :- 数学点数の入力(_数学点数). 英語点数の入力(_英語点数) :- write('英語点数(0~100)を入力してください : '), get_line(Line), 点数入力診断(Line,_英語点数),!. 英語点数の入力(_英語点数) :- 英語点数の入力(_英語点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0, _点数 =< 100,!. 点数入力診断(Line,_点数) :- write('入力された %t から点数として適切な整数を得られません。再入力をお願いします。\n',[Line]), fail. '番号のみを入力してデータ削除 ← 可能ならば、出来てなくても大丈夫です' :- 番号のみ入力して(_番号), retract(成績(_番号,_,_)), fail. '番号のみを入力してデータ削除 ← 可能ならば、出来てなくても大丈夫です'. 番号のみ入力して(_番号) :- get_line(_番号),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/731 # # ../test/read.cgi/tech/1311089619/726 # すみません。提出することが出来ました。 # 明日に行う課題を出されました。 # 出来れば教えていただけますか? # [1] 授業単元:C言語プログラミング # [2] 問題文:4つの数値をを入力して結果が20になる数式(+,-,*,/)を全て表示させる. # ()は考えない。 # 組み合わせがない場合はエラー表示とする。入力できる数値は一桁のみとする。 # '4つの数値を入力して結果が20になる数式(+,-,*,/)を全て表示させる' :- '4つの数値を入力して'(_数値1,_数値2,_数値3,_数値4), '結果が20になる数式(+,-,*,/)を全て'(_数値1,_数値2,_数値3,_数値4,_式ならび), 表示させる(_数値1,_数値2,_数値3,_数値4,_式ならび). '結果が20になる数式(+,-,*,/)を全て'(_数値1,_数値2,_数値3,_数値4,_式ならび) :- findall(_式,( 順列([_数値1,_数値2,_数値3,_数値4],4,L1), 順列(['+','-','*','/'],3,L2), 式を構成する(L1,L2,_式), 20 is truncate(_式))), _式ならび). '4つの数値を入力して'(_数値1,_数値2,_数値3,_数値4) :- 整数入力(_数値1), 整数入力(_数値2), 整数入力(_数値3), 整数入力(_数値4),!. 式を構成する(L1,L2,_式) :- 演算子を挿入する(L1,L2,L3), concat_atom(L3,S), atom_to_term(S,_式,_). 演算子を挿入する([A],_,[A]) :- !. 演算子を挿入する([_,0|R1],[/|R2],R3) :- !,fail. 演算子を挿入する([A|R1],[B|R2],[A,B|R3]) :- 演算子を挿入する(R1,R2,R3). 表示させる(_数値1,_数値2,_数値3,_数値4,[]) :- writef('この4つの数値 %t,%t,%t,%t からは解が得られません\n',[_数値1,_数値2,_数値3,_数値4]),!. 表示させる(_数値1,_数値2,_数値3,_数値4,_式ならび) :- append(_,[_式|R],_式ならび), writef('20 = %t.\n',[_式]), R = []. 整数入力(_整数) :- write('整数を入力してください : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数入力(_整数) :- 整数入力(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 順列(Y,0,_,[]). 順列(Y,N,EL,[A|X]) :- \+(member(A,EL)), del(Z = Y - A), M is N - 1, 順列(Z,M,EL,X). 順列(Y,N,EL,[_|X]) :- member(A,EL), 順列(Z,M,EL,X). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(Z = Y - A), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). del(X = [A|X] - A). del([B|Y] = [B|X] - A) :- del(Y = X - A). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/658 # # 助けてください。5つあります。 # 明日提出期限です。 # # 入力した数の階乗を計算するプログラムを作れ。 # nの階乗とは、n!と書いて、次のような計算をするものである。 # n! = n × (n – 1) × (n – 2) × … × 2 × 1 # # ヒント)関数 fact(n)を n!を計算するプログラムとする。 # この時、 # n! = n × (n – 1)! # だから、fact(n) を計算するには、fact(n-1)を計算してから、nをかければ良い。 # 'n!'(_n,_階乗) :- 階乗式評価項文字列の生成(N,_階乗式評価項文字列), atom_to_term(_階乗式評価項文字列,P,VL), '文字列の中の変数と_論理変数を結びつける'('_n',VL,_n), '文字列の中の変数と_論理変数を結びつける'('_階乗',VL,_階乗), call(P). 階乗式評価項文字列の生成(_n,_階乗式評価項文字列) :- 階乗式文字列の生成(_n,_階乗式文字列), swritef(_階乗式評価項文字列,'_階乗 is %t,[_階乗式文字列]). 階乗式文字列の生成(_n,_階乗式文字列) :- _n_3 is _n - 3, findall(S,( for(0,M,_n_3), concat_atom(['(','_n',' - ',M,')'],S)), L), append(L,['2','1'],L1), concat_atom(L1,' * ',_階乗式文字列),!. '文字列の中の変数と_論理変数を結びつける'(_変数文字列,[_変数文字列=V],V) :- !. '文字列の中の変数と_論理変数を結びつける'(_変数文字列,[_|R],V) :- '文字列の中の変数と_論理変数を結びつける'(_変数文字列,R,V). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/662 # # 次の式を計算するプログラムを作れ。 # Sum = 12 + 22 + ... + N2 # (注意) Nの値は、キーボードから入力できるようにすること。 # Q:\prog> calcsum (注) この例ではプログラムの名前をcalcsumとした。 # Input N? 10 Nの値として10を入力する # Sum is 385 12 + 22 + 32 + 42 + 52 + 62 + 72 + 82 + 92 + 102 を計算すると385になる。 # # 'Nの値をキーボードから入力して Sum = 12 + 22 + ... + N2 を計算する' :- 'Nの値をキーボードから入力して'(N), 'Sum = 12 + 22 + ... + N2 を計算する'(1,N,L,0,Sum), concat_atom(L,' + ',_加算式文字列), writef('%t = %t\n',[Sum,_加算式文字列]),!. 'Sum = 12 + 22 + ... + N2 を計算する'(M,N,[],Sum,Sum) :- M > N,!. 'Sum = 12 + 22 + ... + N2 を計算する'(M,N,[E|R],Sum1,Sum) :- E is 10 * M * 2, Sum2 is Sum1 + E, M2 is M + 1, 'Sum = 12 + 22 + ... + N2 を計算する'(M2,N,R,Sum2,Sum). 'Nの値をキーボードから入力して'(N) :- write('限界桁Nを入力してください : '), get_line(Line), 整数入力診断(Line,N),!. 'Nの値をキーボードから入力して'(N) :- 'Nの値をキーボードから入力して'(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N), N > 0,!. 整数入力診断(Line,N) :- writef('入力された%tからは整数Nを得られませんでした。再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/663 # # [1]C言語単位認定課題 # [2] # 課題8-2. 配列に順番に入力した数字を代入するプログラムを作れ。 # # すなわち、例えば以下のようなものを作れ。 # 1度目にinput_number()で入力した数を、numbers[0]に代入し、 # 2度目にinput_number()で入力した数を、numbers[1]に代入し、 # … # n 度目にinput_number()で入力した数を、numbers[n-1]に代入する。 # # # input_number()という関数は、自分で定義するように # [3]Windows Vista・cygwin1.7・C言語 # [4]今夜まで # # お願いします、 # 'ならびに順番に入力した数字を入力する' :- ならびの要素数を指定する(_要素数), length(L,_要素数), findall(N,( append(_,[_|_],L), get_integer(N)), L). ならびの要素数を指定する(_要素数) :- write('要素数を入力してください : '), get_integer(_要素数),!. get_integer(N) :- get_line(Line), 整数入力診断(Line,N),!. get_integer(N) :- get_integer(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/638 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク): 4つの数字を入力して四則演算の組み合わせを考えて # 10になる数式を表示せよ。10になる数式がなければ"NG"と表示。 # 入力できる数値は1〜9までとする。 # 例) # 入:1 2 3 4 # 答え:2×3+1×4 # '4つの数字を入力して四則演算の組み合わせを考えて10になる数式を表示せよ。10になる数式がなければ"NG"と表示' :- '4つの数字を入力して'(N1,N2,N3,N4), 順列([+,-,*,/],3,L), 式文字列を構成する([N1,N2,N3,N4],L,_式文字列), atom_to_term(_式文字列,_式,_), 10 is truncate(_式), write('%t\n',[_式文字列]),!. '4つの数字を入力して四則演算の組み合わせを考えて10になる数式を表示せよ。10になる数式がなければ"NG"と表示' :- write('NG\n'). '4つの数字を入力して'(N1,N2,N3,N4) :- write('4つの整数を空白区切りで入力してください : '), readln([N1,N2,N3,N4]), すべて整数([N1,N2,N3,N4]). 式文字列を構成する(_値ならび,_符号ならび,_式文字列) :- 式を構成するならびを生成(_値ならび,_符号ならび,_式を構成するならび), concat_atom(_式を構成するならび,_式文字列). 式を構成するならびを生成([N4],[],[N4]) :- !. 式を構成するならびを生成([N1,0|R1],[/|R2],R3) :- !,fail. 式を構成するならびを生成([N|R1],[_符号|R2],[N,_符号|R3]) :- 式を構成するならびを生成(R1,R2,R3). すべて整数([]). すべて整数([N|R]) :- integer(N), すべて整数(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/627 # # [1] 授業単元:プログラミング演習 1 # [2] 問題文(含コード&リンク) # 符号無し整数xのposビット目を、1にした値を返す関数sec,0にした値を返す関数reset,反転した値を返す関数inverse # # unsigned  set( unsigned x, int pos) { /* ••• */ } #  unsigned  reset ( unsigned x, int pos) { /* ••• */ } # unsigned  inverse ( unsigned x, int pos) { /* ••• */ } # を作成せよ。 # <実行例> # 非負の整数を入力してください:0x0B # セットしたいポジションを入力してください:3 # Original bits: 00000000000000000000000000001011 # set 1 to pos: 00000000000000000000000000001011 # reset 0 to pos: 00000000000000000000000000000011 # inverse the pos: 00000000000000000000000000000011 # [3.1] OS: unix # [3.2] コンパイラ名とバージョン: gcc # [3.3] 言語: C # [4] 期限:7月27日 # よろしくお願いします。 # # sec(_符合無し整数x,_posビット目,_値) :- '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目,_値). reset(_符合無し整数x,_posビット目,_値) :- '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目,_値). inverse(_符合無し整数x,_posビット目,_値) :- '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目,_値). '符号無し整数xのposビット目を三様に変化させる' :- '符号無し整数xの入力'(_符号なし整数x), 'posビット目の入力'(_posビット目), '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目), '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目), '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目),!. '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目) :- '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目,_値), 表示する('set 1 to pos : ',_値). '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目,_値) :- '符号無し整数xのposビット目を'(0,_posビット目,Y), _値 is _符号無し整数x \/ Y. '符号無し整数xのposビット目を、0にした値を返す述語reset'(_符合無し整数x,_posビット目) :- '符号無し整数xのposビット目を、0にした値を返す述語reset'(_符合無し整数x,_posビット目,_値), 表示する('reset 0 to pos: ',_値). '符号無し整数xのposビット目を、0にした値を返す述語reset'(_符合無し整数x,_posビット目,_値) :- '符号無し整数xのposビット目を'(0,_posビット目,Y), _値 is _符号無し整数x /\ Y. '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目) :- '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目,_値), 表示する('inverse the pos: ',_値). '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目,_値) :- '符号無し整数xのposビット目を'(0,_posビット目,Y), _値 is _符号無し整数x # Y. '符号無し整数xのposビット目を'(N,N,1) :- !. '符号無し整数xのposビット目を'(M,N,X) :- M2 is M + 1, '符号無し整数xのposビット目を'(M2,N,Y), X is Y * 2. '符号無し整数xの入力'(_符号無し整数x) :- write('符合無し整数xを入力してください : '), get_line(Line), '符号無し整数xの入力診断'(Line,_符号無し整数x),!. '符号無し整数xの入力'(_符号なし整数x) :- '符号無し整数xの入力'(_符号無し整数x). '符号無し整数xの入力診断'(Line,_符号無し整数x) :- atom_to_term(Line,_符号無し整数x,_), integer(_符号無し整数x),!. '符号無し整数xの入力診断'(Line,_符号無し整数x) :- writef('入力された%tから符号無し整数が得られません。再入力をお願いします。\n',[Line]), fail. 'posビット目の入力'(_posビット目) :- write('posビット目を入力してください : '), get_line(Line), 'posビット目の入力診断'(_posビット目),!. 'posビット目の入力'(_posビット目) :- 'posビット目の入力'(_posビット目). 'posビット目の入力診断'(Line,_posビット目) :- atom_to_term(Line,_posビット目,_), integer(_posビット目), _posビット目 >= 0, _posビット目 =< 31,!. 'posビット目の入力診断'(Line,_posビット目) :- writef('入力された%tから適切な整数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. 表示する(_表示文字列,_値) :- write(_表示文字列), 二進数表示(_値,[]), write('\n'),!. 二進数表示(0,L) :- L1 = [0|L], '32桁になるように頭部に0を付加する'(L1,L2), concat_atom(L2,S), writef('%32s',[S]),!. 二進数表示(1,L) :- L1 = [1|L], '32桁になるように頭部に0を付加する'(L1,L2), concat_atom(L2,S), writef('%32s',[S]),!. 二進数表示(_値,L) :- _値_1 is _値 // 2, _余り is _値 mod 2, 二進数表示(_値_1,[_余り|L]),!. '32桁になるように頭部に0を付加する'(L1,L2) :- length(L2,32), append(L0,L1,L2), all(L0,0),!. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 143代目 #7 # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した三つの整数値の平均値を求めるプログラムを作成しなさい。 # ただし、平均値を求める関数 float ave(int a,int b) # を利用すること。 % % ave()の代わりに述語 二項平均/3 を使うこととする。 % キーボードから入力した三つの整数値の平均値を求める :- キーボードから入力した整数値(_整数の一), キーボードから入力した整数値(_整数の二), キーボードから入力した整数値(_整数の三), 三項平均を二項平均だけから求める(_整数の一,_整数の二,_整数の三,_平均値), 平均値表示(_平均値). 三項平均を二項平均だけから求める(_平均値,_平均値,_平均値,_平均値) :- !. 三項平均を二項平均だけから求める(_整数の一,_整数の二,_整数の三,_平均値) :- 二項平均(_整数の一,_整数の二,_二項平均の一), 二項平均(_整数の一,_整数の三,_二項平均の二), 二項平均(_整数の二,_整数の三,_二項平均の三), 三項平均を二項平均だけから求める(_二項平均の二,_二項平均の三,_二項平均の一,_平均値). 二項平均(_第一項,_第二項,_二項平均) :- _二項平均 is (_第一項 + _第二項) / 2. 平均値表示(_平均値) :- writef('平均値は %t です。\n',[_平均値]). キーボードから入力した整数値(_整数) :- write('整数を入力してください : '), get_line(Line), キーボードから入力した整数値診断(Line,_整数),!. キーボードから入力した整数値(_整数) :- キーボードから入力した整数値(_整数). キーボードから入力した整数値診断(Line,_整数) :- read_term_from_atom(Line,_整数,[]), integer(_整数),!. キーボードから入力した整数値診断(Line,_整数) :- writef('入力された %t からは整数は得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/797 # # (1)c言語(2)問題:最大公約数を求める関数を条件とベースに基づいて作成お願いします # 条件 # 1:関数gcdの呼ばれた回数を記録  2:呼ばれた回数と、その時の引数a,bの値を表示 # 実行結果:2つの整数を入力してください # 数値1:64 # 数値2:120 # 1回目の関数の呼び出し:a=64 ,b=120 # 2回目の関数の呼び出し:a=120 ,b=64 # 3回目の関数の呼び出し:a=64 ,b=56 # 4回目の関数の呼び出し:a=56 ,b=8 # 最大公約数は8です # ベース # #include <stdio.h>//ユークリッドのアルゴリズムで最大公約数gcdを求める # int gcd(int fa , int fb); //プロトタイプ宣言 # int main(){ # int a,b,g; # printf("2つの数値を入力してください。\n"); # printf("数値1:"); # scanf("%d",&a); # printf("数値2:"); # scanf("%d",&b); # g = gcd(a,b); # printf("最大公約数は%dです\n",g); # } # int gcd(int fa, int fb){ # int r,ret; # r = fa % fb ; # if(r > 0){ //不成立時が終了条件 # ret = gcd(fb,r); //再帰呼び出し # }else{ret = fb ; # }return ret; # } # # 実行結果:2つの整数を入力してください # 数値1:64 # 数値2:120 # 1回目の関数の呼び出し:a=64 ,b=120 # 2回目の関数の呼び出し:a=120 ,b=64 # 3回目の関数の呼び出し:a=64 ,b=56 # 4回目の関数の呼び出し:a=56 ,b=8 # 最大公約数は8です 最大公約数を求める :- '2つの整数を入力'(_整数1,_整数2), 最大公約数をユークリッドの互除法で求める(_a,_b,X), writef('最大公約数は%tです\n',[X]). '2つの整数を入力'(_整数1,_整数2) :- write('2つの整数をカンマ区切りで入力してください '), 数値1の入力(_整数1), 数値2の入力(_整数2). 数値1の入力(_整数1) :- get_line(Line), 整数入力診断(Line,_整数1),!. 数値1の入力(_整数1) :- 数値1の入力(_整数1). 数値2の入力(_整数2) :- get_line(Line), 整数入力診断(Line,_整数2),!. 数値2の入力(_整数2) :- 数値2の入力(_整数2). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[Line]), fail. 最大公約数をユークリッドの互除法で求める(_a,_b,X) :- 最大公約数をユークリッドの互除法で求める(_a,_b,X,1,Count). 最大公約数をユークリッドの互除法で求める(_a,_b,_b,Count,Count) :- 0 is _a mod _b, writef(%t回目の呼び出し a=%t,b=%t\n,[Count,_a,_b]),!. 最大公約数をユークリッドの互除法で求める(_a,_b,X,Count1,Count) :- Mod is _a mod _b, writef(%t回目の呼び出し a=%t,b=%t\n,[Count1,_a,_b]), Count2 is Count + 1, 最大公約数をユークリッドの互除法で求める(_b,Mod,X,Count2,Count) . % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/770 # # ../test/read.cgi/tech/1308749241/765 の続きです # (1)c言語 # (2)問題:「偶数なら2で割る、奇数なら3倍して1を足す」処理をして、さらにその関数に偶数処理と奇数処理の回数を表示するプログラムの作成をお願いします。 # 実行結果 # 2以上の自然数を入力してください。 # 11 # 11→34→17→52→26→13→40→20→10→5→16→8→4→2→1 # 偶数処理の回数:10回 # 奇数処理の回数:4回 # '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返し、さらに偶数処理と奇数処理の回数を表示する' :- 2以上の自然数を入力(_自然数), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返し、さらに偶数処理と奇数処理の回数を表示する'(_自然数,0,0). '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返し、さらに偶数処理と奇数処理の回数を表示する'(1,_偶数処理の回数,_奇数処理の回数) :- write('->1\n'), writef('偶数処理の回数: %t回\n奇数処理の回数: %t回\n',[_偶数処理の回数,_奇数処理の回数]),!. '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返し、さらに偶数処理と奇数処理の回数を表示する'(N,_偶数処理の回数1,_奇数処理の回数) :- 偶数(N), _偶数処理の回数2 is _偶数処理の回数1 + 1, N2 is N // 2, writef('%t->',[N]), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返し、さらに偶数処理と奇数処理の回数を表示する'(N2,_偶数処理の回数2,_奇数処理の回数). '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返し、さらに偶数処理と奇数処理の回数を表示する'(N,_偶数処理の回数,_奇数処理の回数1) :- 奇数(N), _奇数処理の回数2 is _奇数処理の回数1 + 1, N2 is N * 3 + 1, writef('%t->',[N]), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返し、さらに偶数処理と奇数処理の回数を表示する'(N2,_偶数処理の回数,_奇数処理の回数2). 2以上の自然数を入力(_自然数) :- write('2以上の自然数を入力してください。\n'), get_line(Line), 2以上の自然数を入力診断(Line,_自然数),!. 2以上の自然数を入力(_自然数) :- 2以上の自然数を入力(_自然数). 2以上の自然数を入力診断(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 2,!. 2以上の自然数を入力診断(Line,_自然数) :- writef('入力された%tからは2以上の自然数を得られません。再入力をお願いします\n',[Line]), fail. 偶数(N) :- 0 is N mod 2. 奇数(N) :- 1 is N mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/765 # # (1)c言語 # (2)問題:偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返すプログラムの作成をお願いします。 # 「偶数なら2で割り、奇数なら3倍して1を足す」という部分を再帰関数化しろ。 # 実行結果 # 2以上の自然数を入力してください。 # 11 # 11→34→17→52→26→13→40→20→10→5→16→8→4→2→1 # '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す' :- 2以上の自然数を入力(_自然数), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(_自然数). '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(1) :- write('->1\n'),!. '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N) :- 偶数(N), N2 is N // 2, writef('%t->',[N]), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N2). '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N) :- 奇数(N), N2 is N * 3 + 1, writef('%t->',[N]), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N2). 2以上の自然数を入力(_自然数) :- write('2以上の自然数を入力してください。\n'), get_line(Line), 2以上の自然数を入力診断(Line,_自然数),!. 2以上の自然数を入力(_自然数) :- 2以上の自然数を入力(_自然数). 2以上の自然数を入力診断(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 2,!. 2以上の自然数を入力診断(Line,_自然数) :- writef('入力された%tからは2以上の自然数を得られません。再入力をお願いします\n',[Line]), fail. 偶数(N) :- 0 is N mod 2. 奇数(N) :- 1 is N mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/765 # # (1)c言語 # (2)問題:偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返すプログラムの作成をお願いします。 # 「偶数なら2で割り、奇数なら3倍して1を足す」という部分を再帰関数化しろ。 # 実行結果 # 2以上の自然数を入力してください。 # 11 # 11→34→17→52→26→13→40→20→10→5→16→8→4→2→1 # '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す' :- 2以上の自然数を入力(_自然数), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(_自然数). '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(1) :- write('->1\n'),!. '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N) :- 偶数(N), N2 is N // 2, writef('%t->',[N]), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N2). '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N) :- 奇数(N), N2 is N * 3 + 1, writef('%t->',[N]), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N2). 2以上の自然数を入力(_自然数) :- write('2以上の自然数を入力してください。\n'), get_line(Line), 2以上の自然数を入力診断(Line,_自然数),!. 2以上の自然数を入力(_自然数) :- 2以上の自然数を入力(_自然数). 2以上の自然数を入力診断(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 2,!. 2以上の自然数を入力診断(Line,_自然数) :- writef('入力された%tからは2以上の自然数を得られません。再入力をお願いします\n',[Line]), fail. 偶数(N) :- 0 is N mod 2. 奇数(N) :- 1 is N mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/720 # # よろしくお願いします。 # [1] 授業単元:情報C # [2] 問題文(含コード&リンク):複数人の身長を入力し、入力人数、最大値、最小値 # 平均値を出力するプログラムを作成せよ。ただし、身長に負の値が入力されたときに # 身長の入力を終了することとし、データとして利用しないこと # '複数人の身長を入力し、入力人数、最大値、最小値、平均値を出力する' :- 複数人の身長を入力し(_身長ならび), length(_身長ならび,_入力人数), 最大値(_身長ならび,_最大値), 最小値(_身長ならび,_最小値), 平均値(_身長ならび,_平均値), writef('入力人数: %t\n最大値: %t\n最小値: %t\n平均値: %t\n',[_入力人数,_最大値,_最小値,_平均値]). 複数人の身長を入力し(_身長ならび) :- 身長を得る(_身長), 複数人の身長を入力し(_身長,_身長ならび). 複数人の身長を入力し(N,[]) :- N < 0,!. 複数人の身長を入力し(_身長,[_身長|R]) :- 身長を得る(_身長2), 複数人の身長を入力し(_身長2,R). 身長を得る(_身長) :- write('身長を入力してください(終了する時は負数) : '), get_line(Line), 身長入力診断(Line,_身長),!. 身長を得る(_身長) :- 身長を得る(_身長). 身長入力診断(Line,_身長) :- atom_to_term(Line,_身長,_), integer(_身長), _身長 > 0,!. 身長入力診断(Line,_身長) :- writef('入力された%tは身長として適切な値を取りません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/719 # # これをプログラム実行時にキーボードから名前、年齢、電話番号を入力できるように変更したい # 'プログラム実行時にキーボードから名前、年齢、電話番号を入力して電話帳に追加する' :- repeat, write('1..追加 9..終了\n'), readln([_選択]), '名前・年齢・電話番号を入力する'(_選択), _選択 = 9. '名前・年齢・電話番号を入力する'(9) :- !. '名前・年齢・電話番号を入力する'(1) :- findall(_値,( append(_,[_項目名|_],[名前,年齢,電話番号]), writef('%t : ',[_項目名]), get_line(_値)), L), 電話帳に追加(L). 電話帳に追加([_名前,_年齢文字列,_電話番号]) :- atom_to_term(_年齢文字列,_年齢,_), assertz('電話帳'(_名前,_年齢文字列,_電話番号)),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/600 # # [1] 授業単元:関数 # [2] 問題文(含コード&リンク): # 情報量の単位は、8bit=1B,1024B=1KB,1024KB=1MB,…(1TBまで)となっている。 # [実数]MBや、実数[KB]のような入力をしたとき、それが何bitを意味しているかを表示するプログラムを作成したい。 # なお、設定において、数値変換処理には、関数を利用することとし、入力は【整数】の後に「空白」を1つ挟み、【TB/MB/KB/B】のいずれかの単位を表す文字列が書かれているものとする。 # '[実数]MBや、実数[KB]のような入力をしたとき、それが何bitを意味しているかを表示する'(_文字列,_ビット数) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 数値変換(_文字列,L1,L2,_ビット数). 数値変換(_文字列,S1,[' ','T','B'|_],_ビット数) :- atom_to_term(S1,_テラバイト数,_), _ビット数 is 8 * _テラバイト数 * 1000000000,!. 数値変換(_文字列,S1,[' ','M','B'|_],_ビット数) :- atom_to_term(S1,_メガバイト数,_), _ビット数 is 8 * _メガバイト * 1000000,!. 数値変換(_文字列,S1,[' ','K','B'|_],_ビット数) :- atom_to_term(S1,_キロバイト数,_), _ビット数 is 8 * _キロバイト * 1000,!. 数値変換(_文字列,S1,[' ','B'|_],_ビット数) :- atom_to_term(S1,_バイト数,_), _ビット数 is 8 * _バイト数,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/526 # # [1] 授業単元:C言語 # # [2] 問題文(含コード&リンク): #  1円硬貨, 5円硬貨, 10円硬貨, 50円硬貨, 100円硬貨, 500円硬貨の内から種類不問で何枚か取り出し、 #  その重さの合計を小数点以下1桁まで入力させる。 #  その値から、取り出した硬貨の合計金額を推定し表示するプログラムを作れ。 #  ただし、推定される金額が複数存在する場合はその全てを表示する。 #  また、1円硬貨, 5円硬貨, 10円硬貨, 50円硬貨, 100円硬貨, 500円硬貨の1枚あたりの重さは #  それぞれ1g, 3.7g, 4.5g, 4g, 4.8g, 7gであるとする。 #  (入力例) #  8.0 #  (出力例) #  8円 #  54円 #  100円 #  501円 # '1円硬貨, 5円硬貨, 10円硬貨, 50円硬貨, 100円硬貨, 500円硬貨の内から種類不問で何枚か取り出し、その重さの合計を小数点以下1桁まで入力させる。その値から、取り出した硬貨の合計金額を推定し表示する' :- '重さの合計を小数点以下1桁まで入力'(_重さの合計), '取り出した硬貨の合計金額を推定し'(_重さの合計,_取り出した硬貨の合計金額), 表示する(_取り出した硬貨の合計金額), fail. '1円硬貨, 5円硬貨, 10円硬貨, 50円硬貨, 100円硬貨, 500円硬貨の内から種類不問で何枚か取り出し、その重さの合計を小数点以下1桁まで入力させる。その値から、取り出した硬貨の合計金額を推定し表示する'. '重さの合計を小数点以下1桁まで入力'(_重さの合計) :- write('重さの合計を小数点以下1桁まで入力してください : '), get_line(Line), 重さの合計入力診断(Line,_重さの合計),!. '重さの合計を小数点以下1桁まで入力'(_重さの合計) :- '重さの合計を小数点以下1桁まで入力'(_重さの合計). 重さの合計入力診断(Line,_重さの合計) :- atom_to_term(Line,_重さの合計の一,_), float(_重さの合計の一), _重さの合計 is floor(_重さの合計の一 * 10) / 10,!. 重さの合計入力診断(Line,_重さの合計) :- writef('入力された%tからは適切な実数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. '取り出した硬貨の合計金額を推定し'(_重さの合計,_取り出した硬貨の合計金額) :- Max is truncate(_重さの合計), findall(N,for(Max,N,0),L1), 順列(L1,6,[F,E,D,C,B,A]), 重さの制限(_重さの合計,F,E,D,C,B,A), _重さの合計100mg is truncate(_重さの合計 * 10), _重さの合計100mg is 10 * A + 37 * B + 45 * C + 40 * D + 48 * E + 70 * F, _取り出した硬貨の合計金額 is 1 * A + 5 * B + 10 * C + 50 * D + 100 * E + 500 * F. 重さの制限(_重さの合計100mg,F,E,D,C,B,A) :- F =< _重さの合計100mg // 70, _重さの合計100mg_2 is _重さの合計100mg - F * 70, E =< _重さの合計100mg_2 // 48, _重さの合計100mg_3 is _重さの合計100mg_2 - E * 48, D =< _重さの合計100mg_3 // 40, _重さの合計100mg_4 is _重さの合計100mg_5 - D * 40, C =< _重さの合計100mg_4 // 45, _重さの合計100mg_5 is _重さの合計100mg_6 - C * 45, B =< _重さの合計100mg_5 // 37, _重さの合計100mg_6 is _重さの合計100mg_3 - B * 37, A =< _重さの合計100mg_6 // 10,!. 表示する(_取り出した硬貨の合計金額) :- writef('%t円\n',[_取り出した硬貨の合計金額]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/522 # # [1] 情報処理演習 # [2] 問題:何個かのデータをもらって,その平均,総和,最大値,最小値,標準偏差を計算するプログラムを作成する.プログラムは以下の条件をみたすこと. # ・あらかじめ100個の整数型の要素を持つ配列を定義しておく. # ・scanfを用いてデータの個数を入力できること.また,scanfを用いてデータの値を配列に入力できること. # ・if文を用いて0以下,101以上のデータの個数が入力されないようにすること. # ・for文を用いること. # ・解は実数で求めること. # 実行例 # ================================ # Input integer: 5 # Input numbers: # 40 # 50 # 60 # 70 # 80 # Average: 60 # Sum: 300 # Max: 80 # Min: 40 # Standard Deviation: 14.1 # ================================ # 'あらかじめ100個の整数型の要素を持つならびを定義しておく'(_100個の整数型の要素を持つならび) :- length(_100個の整数型の要素を持つならび,100), assertz('100個の整数型の要素を持つならび'(_100個の整数型の要素を持つならび)). '何個かのデータをもらって,その平均,総和,最大値,最小値,標準偏差を計算する' :- '100個の整数型の要素を持つならび'(_100個の整数型の要素を持つならび), データの個数を入力(_データの個数), データの入力(_データの個数,_100個の整数型の要素を持つならび), '平均・総和・最大値・最小値・標準偏差'(_100個の整数型の要素を持つならび,_平均,_総和,_最大値,_最小値,_標準偏差), 表示('平均: %t\n総和: %t\n最大値: %t\n最小値: %t\n標準偏差: %t\n',[_平均,_総和,_最大値,_最小値,_標準偏差]). データの個数を入力(_データの個数) :- write('データの個数を入力してください : '), get_line(Line), データの個数入力診断(Line,_データの個数),!. データの個数を入力(_データの個数) :- データの個数を入力(_データの個数). データの個数入力診断(Line,_データの個数) :- atom_to_term(Line,_データの個数,_), integer(_データの個数), _データの個数 > 0, _データの個数 < 101,!. データの個数入力診断(Line,_データの個数) :- writef('入力された %t はデータの個数として適切ではありません。再入力をお願いします : ',[Line]), fail. データの入力(_データの個数,_100個の整数型の要素を持つならび) :- length(L,_データの個数), findall(_整数,( append(_,[_整数|_],L), get_integer(_整数)), L), append(L,_,_100個の整数型の要素を持つならび). '平均・最大値・最小値・標準偏差'(_100個の整数型の要素を持つならび,_平均,_最大値,_最小値,_標準偏差) :- 平均(_100個の整数型の要素を持つならび,_平均), 総和(_100個の整数型の要素を持つならび,_総和), 最大値(_100個の整数型の要素を持つならび,_最大値), 最小値(_100個の整数型の要素を持つならび,_最小値), 標準偏差(_100個の整数型の要素を持つならび,_標準偏差). 総和([A|R],0) :- var(A),!. 総和([A|R],_総和) :- 総和(R,_総和_1), _総和 is A + _総和_1,!. 総和([],0). 平均(L,_平均) :- length(L,_要素数), _要素数 > 0, 総和(L,_総和), _平均 is _総和 / _要素数. 最大値(L,_最大値) :- append(L0,[_最大値|R],L), \+((member(V1,L0),\+(var(V1)),V1 > _最大値)), \+((member(V2,R),\+(var(V2)),V2 > 最大値)). 最小値(L,_最小値) :- append(L0,[_最小値|R],L), \+((member(V1,L0),\+(var(V1)),V1 < _最小値)), \+((member(V2,R),\+(var(V2)),V2 < 最小値)). 標準偏差([A|_],N,_,_総和,_標準偏差) :- var(A), V is sqrt(_総和 / (N - 1)),!. 標準偏差([],N,_,_総和,_標準偏差) :- V is sqrt(_総和 / (N - 1)),!. 標準偏差([A|R],N,_平均,S,_標準偏差) :- S1 is (A - _平均) ^ 2, S2 is S + S1, 標準偏差(R,N,_平均,S2,V). 標準偏差(L,_標準偏差) :- length(L,N), 算術平均(L,_平均), 標準偏差(L,N,_平均,0.0,_標準偏差). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/522 # # [1] 情報処理演習 # [2] 問題:何個かのデータをもらって,その平均,総和,最大値,最小値,標準偏差を計算するプログラムを作成する.プログラムは以下の条件をみたすこと. # ・あらかじめ100個の整数型の要素を持つ配列を定義しておく. # ・scanfを用いてデータの個数を入力できること.また,scanfを用いてデータの値を配列に入力できること. # ・if文を用いて0以下,101以上のデータの個数が入力されないようにすること. # ・for文を用いること. # ・解は実数で求めること. # 実行例 # ================================ # Input integer: 5 # Input numbers: # 40 # 50 # 60 # 70 # 80 # Average: 60 # Sum: 300 # Max: 80 # Min: 40 # Standard Deviation: 14.1 # ================================ # 'あらかじめ100個の整数型の要素を持つならびを定義しておく'(_100個の整数型の要素を持つならび) :- length(_100個の整数型の要素を持つならび,100), assertz('100個の整数型の要素を持つならび'(_100個の整数型の要素を持つならび)). '何個かのデータをもらって,その平均,総和,最大値,最小値,標準偏差を計算する' :- '100個の整数型の要素を持つならび'(_100個の整数型の要素を持つならび), データの個数を入力(_データの個数), データの入力(_データの個数,_100個の整数型の要素を持つならび), '平均・総和・最大値・最小値・標準偏差'(_100個の整数型の要素を持つならび,_平均,_総和,_最大値,_最小値,_標準偏差), 表示('平均: %t\n総和: %t\n最大値: %t\n最小値: %t\n標準偏差: %t\n',[_平均,_総和,_最大値,_最小値,_標準偏差]). データの個数を入力(_データの個数) :- write('データの個数を入力してください : '), get_line(Line), データの個数入力診断(Line,_データの個数),!. データの個数を入力(_データの個数) :- データの個数を入力(_データの個数). データの個数入力診断(Line,_データの個数) :- atom_to_term(Line,_データの個数,_), integer(_データの個数), _データの個数 > 0, _データの個数 < 101,!. データの個数入力診断(Line,_データの個数) :- writef('入力された %t はデータの個数として適切ではありません。再入力をお願いします : ',[Line]), fail. データの入力(_データの個数,_100個の整数型の要素を持つならび) :- length(L,_データの個数), findall(_整数,( append(_,[_整数|_],L), get_integer(_整数)), L), append(L,_,_100個の整数型の要素を持つならび). '平均・最大値・最小値・標準偏差'(_100個の整数型の要素を持つならび,_平均,_最大値,_最小値,_標準偏差) :- 平均(_100個の整数型の要素を持つならび,_平均), 総和(_100個の整数型の要素を持つならび,_総和), 最大値(_100個の整数型の要素を持つならび,_最大値), 最小値(_100個の整数型の要素を持つならび,_最小値), 標準偏差(_100個の整数型の要素を持つならび,_標準偏差). 総和([A|R],0) :- var(A),!. 総和([A|R],_総和) :- 総和(R,_総和_1), _総和 is A + _総和_1,!. 総和([],0). 平均(L,_平均) :- length(L,_要素数), _要素数 > 0, 総和(L,_総和), _平均 is _総和 / _要素数. 最大値(L,_最大値) :- append(L0,[_最大値|R],L), \+((member(V1,L0),\+(var(V1)),V1 > _最大値)), \+((member(V2,R),\+(var(V2)),V2 > 最大値)). 最小値(L,_最小値) :- append(L0,[_最小値|R],L), \+((member(V1,L0),\+(var(V1)),V1 < _最小値)), \+((member(V2,R),\+(var(V2)),V2 < 最小値)). 標準偏差([A|_],N,_,_総和,_標準偏差) :- var(A), V is sqrt(_総和 / (N - 1)),!. 標準偏差([],N,_,_総和,_標準偏差) :- V is sqrt(_総和 / (N - 1)),!. 標準偏差([A|R],N,_平均,S,_標準偏差) :- S1 is (A - _平均) ^ 2, S2 is S + S1, 標準偏差(R,N,_平均,S2,V). 標準偏差(L,_標準偏差) :- length(L,N), 算術平均(L,_平均), 標準偏差(L,N,_平均,0.0,_標準偏差). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/410 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): http://codepad.org/ZtuWkxys # # //決まった形式のテキストを9×9の配列に1~9の数字の情報を入力する関数aa_readを作りたいです。 # //たとえば1を読み込めばビットで000000001を、4を読み込めば000001000を、 # //つまりビットの1の位置を数字に対応させています。 # //そして「.」を読み込めば特別に111111111を構造体aa_tのcellに入力します。 # //r,cは行と列に対応しています。下のテキストファイルの内容と、入力する盤面の位置は対応させます。 # //読み込む形式はテキストファイルで、内容はたとえば下のようなものです。 # //123|..1|43. # //4..|24.|31. # //..7|7.6|... # //---+---+--- # //...|..8|5.. # //5.1|1..|1.. # //5.9|2..|3.4 # //---+---+--- # //41.|..1|1.1 # //..5|.3.|4.. # //2..|...|..7 # //テキストファイルから1文字ずつfgetcで走査していき数字のみ拾って、 # //aa_tのcellの正しい位置にその情報を入れる、という動作をさせたいのですが、 # //どうもうまくいきません。よろしくお願いします # '決まった形式のテキストを9×9の配列に1~9の数字の情報を入力する'(_テキストファイル,LL) :- length(LL,9), findall(L,( length(L,9), append(_,[L|_],LL)), LL), open(_テキストファイル,read,Instream), '数字のみ拾って、cellの正しい位置にその情報を入れる'(Instream,LL), close(Instream). '数字のみ拾って、cellの正しい位置にその情報を入れる'(Instream,LL) :- findall(L,( append(_,[L|_],LL), findall(_数値ビット表現,( append(_,[_|_],L), '数字かドットを読み込む'(Instream,_数値ビット表現)), L)), LL). '数字かドットを読み込む'(Instream,_数値ビット表現) :- at_end_stream(Instream),!, fail. '数字かドットを読み込む'(Instream,_数値ビット表現) :- get_char(Instream,_数字かドット), 数値ビット表現(_数字かドット,_数値ビット表現),!. '数字かドットを読み込む'(Instream,_数値ビット表現) :- '数字かドットを読み込む'(Instream,_数値ビット表現). 数値ビット表現('0',0). 数値ビット表現('1',1). 数値ビット表現('2',2). 数値ビット表現('3',4). 数値ビット表現('4',8). 数値ビット表現('5',16). 数値ビット表現('6',32). 数値ビット表現('7',64). 数値ビット表現('8',128). 数値ビット表現('9',256). 数値ビット表現('.',511). 数値ビット表現述語の生成 :- append(_,[A|R],['0b0','0b1','0b10','0b100','0b1000','0b10000','0b100000','0b1000000','0b10000000','0b100000000','0b111111111']), atom_to_term(A,N,_), sub_atom(A,2,Len,0,B), wr('数値ビット表現(''%t'',%t).\n',[Len,N]), R =[]. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/425 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 与えた文字列を指定した回数繰り返す文字列に変換するプログラムを作成しなさい。 # ただし、main関数を以下のように宣言し、実行時に引数をとれるようにする。 # 第一引数は繰り返し回数とし、第二引数は繰り返される文字列とする。 # すなわち、./prog 3 "ABC"と実行した場合は、ABCABCABCとなる文字列が作られる。 # 作られた文字列は、表示すること。必要に応じて、数字を数値に変換する関数atoi()を使用してもよい。 # その際は、#include<stdlib.h>を加えること。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc,char*argv[]){ # /** argc:引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:引数**/ # x=atoi(argv[1]);/*atoiの使用例*/ # return(0); # } # program :- 与えた文字列を指定した回数繰り返す文字列に変換する. 与えた文字列を指定した回数繰り返す文字列に変換する :- user_parameters([_回数文字列,_文字列]), atom_to_term(_回数文字列,_回数,_), length(Ln,_回数), append(_,[_|R],Ln), write(_文字列), R = []. user_parameters(A) :- current_prolog_flag(argv, B), append(_, [--|A], B). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/340 # # [1] C言語演習 # [2] put_nchar関数(←自分で作成する)を使用して、以下のプログラムを作成せよ。 # 何段ですか:5 # * * # * * # * * # * * # * # 'V字形を描く' :- 段数を得る(_段), 'V字形図案'(_段,_図案用紙), 'V字形を描画する'(_図案用紙). 'V字形図案'(_段,_図案用紙) :- 図案用紙の手配(_段,_図案用紙), 'V字形図案に描く'([],_図案用紙). 'V字形図案に描く'(L0,[L]) :- append(L0,[*|L0],L),!. 'V字形図案に描く'(L0,[L|R]) :- append(L0,[*|L1],[*|L0],L), all(L1,' '), 'V字形図案に描く'([' '|L0],R). 図案用紙の手配(_段,_図案用紙) :- _幅 is _段 * 2 - 1, length(L,_幅), length(_図案用紙,_段), findall(L,( append(_,[_|_],_図案用紙)), _図案用紙). 'V字形を描画する'(_図案用紙) :- append(_,[L|R],_図案用紙), concat_atom(L,S), writef('%t\n',[S]), R = []. 段数を得る(_段) :- write('段数を入力してください : '), get_line(Line), 段数入力診断(Line,_段),!. 段数を得る(_段) :- 段数を得る(_段). 段数入力診断(Line,_段) :- atom_to_term(Line,_段,_), integer(_段), _段 > 0, 1 is _段 mod 2,!. 段数入力診断(Line,_) :- writef('入力された %t からは段として適切な奇数が得られませんでした。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/340 # # [1] C言語演習 # [2] put_nchar関数(←自分で作成する)を使用して、以下のプログラムを作成せよ。 # 参考:http://codepad.org/DdpoVJOe # 何段ですか:5 # * # *** # ***** # *** # * # 菱形を描く :- 段数を得る(_段), 菱形図案(_段,_図案用紙), 菱形を描画する(_図案用紙). 菱形図案(_段,_図案用紙) :- 図案用紙の手配(_段,_図案用紙), 上向きの山を築く([_],_図案用紙), 下向きの山と合体する(_図案用紙). 図案用紙の手配(_段,_図案用紙) :- length(_図案用紙,_段), findall(_,( append(_,[_|_],_図案用紙)), _図案用紙). 上向きの山を築く(L1,[L|R]) :- append(L0,L1,L0,L), all(L0,' '), all(L1,'*'), 上向きの山を築く([_,_|L1],R). 上向きの山を築く(_,_図案用紙). 下向きの山と合体する(_図案用紙) :- 逆さまにコピーして下向きの山を作る(_図案用紙,_図案用紙2), _図案用紙 = _図案用紙2. 逆さまにコピーして下向きの山を作る(_図案用紙,_図案用紙2) :- reverse(_図案用紙,_図案用紙2). 菱形を描画する(_図案用紙) :- append(_,[L|R],_図案用紙), concat_atom(L,S), writef('%t\n',[S]), R = []. 段数を得る(_段) :- write('段数を入力してください : '), get_line(Line), 段数入力診断(Line,_段),!. 段数を得る(_段) :- 段数を得る(_段). 段数入力診断(Line,_段) :- atom_to_term(Line,_段,_), integer(_段), _段 > 0, 1 is _段 mod 2,!. 段数入力診断(Line,_) :- writef('入力された %t からは段として適切な奇数が得られませんでした。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/281 # # [1] 情報処理演習 # [2] 問題:2重のfor文を使って,以下のような偶数の九九の表を作成せよ.ただし,行数と列数は入力して指定できるようにする. # 入力された行数と列数がそれぞれ0以下,20以上の場合は,九九は表示せずプログラムを終了する. # また、ソースプログラムの説明,考察.for文についてのまとめなども加えよ。 # 実行例 # ================================ # Input GYO: 3 # Input RETSU: 5 # 2 4 6 8 10 # 4 8 12 16 20 # 6 12 18 24 30 # ================================ # # '2重のfor文を使って,以下のような偶数の九九の表を作成せよ.ただし,行数と列数は入力して指定できるようにする.入力された行数と列数がそれぞれ0以下,20以上の場合は,九九は表示せずプログラムを終了する' :- 行数と列数は入力して指定(_行数,_列数), 偶数の九九の表を作成(_行数,_列数). 行数と列数は入力して指定(_行数,_列数) :- 行数の入力(Line1,_行数), 列数の入力(Line2,_列数),!. 行数の入力(_行数) :- write('行数 : '), get_line(Line), 行数の入力診断(Line,_行数),!. 行数の入力(_行数) :- 行数の入力(_行数). 行数入力診断(Line_行数) :- atom_to_term(Line,_行数,_), integer(_行数),!. 行数入力診断(Line,_行数) :- writef('入力された%tから適切な行数を得られません。再入力をお願いします。\n',[Line]), fail. 列数の入力(_列数) :- write('列数 : '), get_line(Line), 列数の入力診断(Line,_列数),!. 列数の入力(_列数) :- 列数の入力(_列数). 列数入力診断(Line_列数) :- atom_to_term(Line,_列数,_), integer(_列数),!. 列数入力診断(Line,_列数) :- writef('入力された%tから適切な列数を得られません。再入力をお願いします。\n',[Line]), fail. 偶数の九九の表を作成(_行数,_列数) :- '入力された行数と列数がそれぞれ0以下,20以上の場合は,九九は表示せずプログラムを終了する'(_行数,_列数),!. 偶数の九九の表を作成(_行数,_列数) :- '2重のfor文を使って,以下のような偶数の九九の表を作成'(_行数,_列数), 行数と列数は入力して指定(_次の九九の表の行数,_次の九九の表の列数), 偶数の九九の表を作成(_次の九九の表の行数,_次の九九の表の列数). '入力された行数と列数がそれぞれ0以下,20以上の場合は,九九は表示せずプログラムを終了する'(_行数,_) :- _行数 =< 0,!. '入力された行数と列数がそれぞれ0以下,20以上の場合は,九九は表示せずプログラムを終了する'(_,_列数) :- _列数 >= 20,!. '2重のfor文を使って,以下のような偶数の九九の表を作成'(_行数,_列数) :- for(1,M,_行数), for(1,N,_列数), X is (2 * M) * N, writef('%4r',[X]), N = _列数, nl, M = _行数,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/131 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://codepad.org/EEw71Jn2 # # [問1] 長さ100のstruct rocker型の配列 struct rocker Rockers[100]; を定義して、この中の所定の数のロッカーに乱数を格納するプログラムを以下の手続きにしたがって作りなさい。 # # ○ データ構造として次の構造体を用意する。 # struct rocker { # int data; //保存するデータ # char name[20]; //ロッカーのラベル # }; # # ○ main関数の中身が次のようになるものとする。 # int main() { # int N; # struct rocker Rockers[100]; # scanf("%d", &N); # set_rockers(Rockers, N); # display_rockers(Rockers, N); # } # # 上記main関数の中の # void set_rockers(struct rocker rockers[], int length); //0番目からlength-1番目のロッカーにラベル(name)と乱数(data)を格納する関数 # および # void display_rockers(struct rocker rockers[], int length);//0番目からlength-1番目のロッカーのname, dataを全て表示する関数。 # を次の仕様を元に定義し、プログラムを完成させなさい。 # # set_rockers()の仕様: #  例えば0番目のロッカーには # rocker[0].name が "rocker-0"という文字列がラベルとしてセットされ、 # rocker[0].data に乱数(例:1804289383)がセットされます。 # # ラベルをセットするにはsprintf()を使用すると便利です。 #  sprintf()は例えば #  char str[100]; #  int i = 1; # sprintf(str, "rocker-%d", i); # とすると、strには"rocker-1"がセットされます。 # #  乱数はあらかじめ用意されている関数 int rand()を使用すると得ることが出来ます。ただし # #include # が必要です。rand()は呼び出すたびに全く異なる数を返してきます。なお、rand()を使う前にsrand(0)を実行するようにしてください。 # # display_rockers()の仕様: # printf("%s : %d\n", rockers[i].name, rockers[i].data); # をlength個分繰り返してください。 # # # gcc kadai11-1.c # ./a.out # 3 # rocker-0 : 1804289383 # rocker-1 : 846930886 # rocker-2 : 1681692777 # '長さ100のならびを定義して、この中の所定の数のロッカーに乱数を格納する' :- 長さ100のならびを定義して, 所定の数を得る(_数), length(Ln,_数), ロッカー位置と格納する値を乱数で決める(Ln). 長さ100のならびを定義して :- abolish(ロッカー/2), ロッカーを生成してロッカー番号を振る(1). ロッカーを生成してロッカー番号を振る(N) :- N > 100,!. ロッカーを生成してロッカー番号を振る(N) :- assertz(ロッカー(N,_)), N2 is N + 1, ロッカーを生成してロッカー番号を振る(N2). 所定の数を得る(_数) :- write('1以上100以下の数を入力しなさい : '), get_line(Line), 所定の数診断(Line,_数),!. 所定の数を得る(_数) :- 所定の数を得る(_数). 所定の数診断(Line,_数) :- atom_to_term(Line,_数,_), integer(_数), _数 >= 1, _数 =< 100,!. 所定の数診断(Line,_) :- writef('入力された%tからは1以上100以下の数を得られませんでした。再入力をお願いします\n',[Line]), fail. ロッカー位置と格納する値を乱数で決める([]) :- !. ロッカー位置と格納する値を乱数で決める([_|Ln]) :- '1から100の範囲のランダム値を得る'(_ロッカー番号), 指定位置のロッカーが空だったら(_ロッカー番号), ロッカーにランダム値を格納する(_ロッカー番号), ロッカー位置と格納する値を乱数で決める(Ln). ロッカー位置と格納する値を乱数で決める([_|Ln]) :- ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|Ln]). '1から100の範囲のランダム値を得る'(_ランダム値) :- _ランダム値 is random(100) + 1. 指定位置のロッカーが空だったら(_ロッカー番号) :- ロッカー(_ロッカー番号,_ロッカー), var(_ロッカー),!. ロッカーにランダム値を格納する(_ロッカー番号) :- _ロッカー is random(0x100000000), retract(ロッカー(_ロッカー番号,_)), assertz(ロッカー(_ロッカー番号,_ロッカー)),!. ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|Ln]) :- ロッカー位置と格納する値を乱数で決める([_|Ln]). ロッカーの値を更新する(_ロッカー番号,_ロッカー) :- retract(ロッカー(_ロッカー番号,_)), assertz(ロッカー(_ロッカー番号,_ロッカー)),!. ロッカーの値を新しいランダム値に更新する(_ロッカー番号) :- ロッカーにランダム値を格納する(_ロッカー番号). ロッカーの値を新しいランダム値に更新する :- '1から100の範囲のランダム値を得る'(_ロッカー番号), ロッカーの値を新しいランダム値に更新する(_ロッカー番号). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/131 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://codepad.org/EEw71Jn2 # # [問1] 長さ100のstruct rocker型の配列 struct rocker Rockers[100]; を定義して、この中の所定の数のロッカーに乱数を格納するプログラムを以下の手続きにしたがって作りなさい。 # # ○ データ構造として次の構造体を用意する。 # struct rocker { # int data; //保存するデータ # char name[20]; //ロッカーのラベル # }; # # ○ main関数の中身が次のようになるものとする。 # int main() { # int N; # struct rocker Rockers[100]; # scanf("%d", &N); # set_rockers(Rockers, N); # display_rockers(Rockers, N); # } # # 上記main関数の中の # void set_rockers(struct rocker rockers[], int length); //0番目からlength-1番目のロッカーにラベル(name)と乱数(data)を格納する関数 # および # void display_rockers(struct rocker rockers[], int length);//0番目からlength-1番目のロッカーのname, dataを全て表示する関数。 # を次の仕様を元に定義し、プログラムを完成させなさい。 # # set_rockers()の仕様: #  例えば0番目のロッカーには # rocker[0].name が "rocker-0"という文字列がラベルとしてセットされ、 # rocker[0].data に乱数(例:1804289383)がセットされます。 # # ラベルをセットするにはsprintf()を使用すると便利です。 #  sprintf()は例えば #  char str[100]; #  int i = 1; # sprintf(str, "rocker-%d", i); # とすると、strには"rocker-1"がセットされます。 # #  乱数はあらかじめ用意されている関数 int rand()を使用すると得ることが出来ます。ただし # #include # が必要です。rand()は呼び出すたびに全く異なる数を返してきます。なお、rand()を使う前にsrand(0)を実行するようにしてください。 # # display_rockers()の仕様: # printf("%s : %d\n", rockers[i].name, rockers[i].data); # をlength個分繰り返してください。 # # # gcc kadai11-1.c # ./a.out # 3 # rocker-0 : 1804289383 # rocker-1 : 846930886 # rocker-2 : 1681692777 # '長さ100のならびを定義して、この中の所定の数のロッカーに乱数を格納する' :- 長さ100のならびを定義して(_ロッカーならび), 所定の数を得る(_数), length(Ln,_数), ロッカー位置と格納する値を乱数で決める(Ln,_ロッカーならび). 長さ100のならびを定義して(_ロッカーならび) :- length(_ロッカーならび,100). 所定の数を得る(_数) :- write('1以上100以下の数を入力しなさい : '), get_line(Line), 所定の数診断(Line,_数),!. 所定の数を得る(_数) :- 所定の数を得る(_数). 所定の数診断(Line,_数) :- atom_to_term(Line,_数,_), integer(_数), _数 >= 1, _数 =< 100,!. 所定の数診断(Line,_) :- writef('入力された%tからは1以上100以下の数を得られませんでした。再入力をお願いします\n',[Line]), fail. ロッカー位置と格納する値を乱数で決める([],_ロッカーならび) :- !. ロッカー位置と格納する値を乱数で決める([_|R1],_ロッカーならび) :- '1から100の範囲のランダム値を得る'(_位置), 指定位置のロッカーが空だったら(_位置,_ロッカーならび,_ロッカー), ロッカーにランダム値を格納する(_ロッカー), ロッカー位置と格納する値を乱数で決める(R1,_ロッカーならび). ロッカー位置と格納する値を乱数で決める([_|R1],_ロッカーならび) :- ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|R1],_ロッカーならび). '1から100の範囲のランダム値を得る'(_ランダム値) :- _ランダム値 is random(100) + 1. 指定位置のロッカーが空だったら(_位置,_ロッカーならび,_ロッカー) :- nth1(_位置,_ロッカーならび,_ロッカー), var(_ロッカー). ロッカーにランダム値を格納する(_ロッカー) :- _ロッカー is random(0x100000000). ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|R1],_ロッカーならび) :- ロッカー位置と格納する値を乱数で決める([_|R1],_ロッカーならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/131 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://codepad.org/EEw71Jn2 # # [問1] 長さ100のstruct rocker型の配列 struct rocker Rockers[100]; を定義して、この中の所定の数のロッカーに乱数を格納するプログラムを以下の手続きにしたがって作りなさい。 # # ○ データ構造として次の構造体を用意する。 # struct rocker { # int data; //保存するデータ # char name[20]; //ロッカーのラベル # }; # # ○ main関数の中身が次のようになるものとする。 # int main() { # int N; # struct rocker Rockers[100]; # scanf("%d", &N); # set_rockers(Rockers, N); # display_rockers(Rockers, N); # } # # 上記main関数の中の # void set_rockers(struct rocker rockers[], int length); //0番目からlength-1番目のロッカーにラベル(name)と乱数(data)を格納する関数 # および # void display_rockers(struct rocker rockers[], int length);//0番目からlength-1番目のロッカーのname, dataを全て表示する関数。 # を次の仕様を元に定義し、プログラムを完成させなさい。 # # set_rockers()の仕様: #  例えば0番目のロッカーには # rocker[0].name が "rocker-0"という文字列がラベルとしてセットされ、 # rocker[0].data に乱数(例:1804289383)がセットされます。 # # ラベルをセットするにはsprintf()を使用すると便利です。 #  sprintf()は例えば #  char str[100]; #  int i = 1; # sprintf(str, "rocker-%d", i); # とすると、strには"rocker-1"がセットされます。 # #  乱数はあらかじめ用意されている関数 int rand()を使用すると得ることが出来ます。ただし # #include # が必要です。rand()は呼び出すたびに全く異なる数を返してきます。なお、rand()を使う前にsrand(0)を実行するようにしてください。 # # display_rockers()の仕様: # printf("%s : %d\n", rockers[i].name, rockers[i].data); # をlength個分繰り返してください。 # # # gcc kadai11-1.c # ./a.out # 3 # rocker-0 : 1804289383 # rocker-1 : 846930886 # rocker-2 : 1681692777 # '長さ100のならびを定義して、この中の所定の数のロッカーに乱数を格納する' :- 長さ100のならびを定義して(_ロッカーならび), 所定の数を得る(_数), length(Ln,_数), ロッカー位置と格納する値を乱数で決める(Ln,_ロッカーならび). 長さ100のならびを定義して(_ロッカーならび) :- length(_ロッカーならび,100), ロッカーにロッカー番号を振る(1,_ロッカーならび). ロッカーにロッカー番号を振る(_,[]). ロッカーにロッカー番号を振る(N,[[N,_]|R]) :- N2 is N + 1, ロッカーにロッカー番号を振る(N2,R). 所定の数を得る(_数) :- write('1以上100以下の数を入力しなさい : '), get_line(Line), 所定の数診断(Line,_数),!. 所定の数を得る(_数) :- 所定の数を得る(_数). 所定の数診断(Line,_数) :- atom_to_term(Line,_数,_), integer(_数), _数 >= 1, _数 =< 100,!. 所定の数診断(Line,_) :- writef('入力された%tからは1以上100以下の数を得られませんでした。再入力をお願いします\n',[Line]), fail. ロッカー位置と格納する値を乱数で決める([],_ロッカーならび) :- !. ロッカー位置と格納する値を乱数で決める([_|Ln],_ロッカーならび) :- '1から100の範囲のランダム値を得る'(_ロッカー番号), 指定位置のロッカーが空だったら(_ロッカー番号,_ロッカーならび,_ロッカー), ロッカーにランダム値を格納する(_ロッカー), ロッカー位置と格納する値を乱数で決める(Ln,_ロッカーならび). ロッカー位置と格納する値を乱数で決める([_|Ln],_ロッカーならび) :- ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|Ln],_ロッカーならび). '1から100の範囲のランダム値を得る'(_ランダム値) :- _ランダム値 is random(100) + 1. 指定位置のロッカーが空だったら(_ロッカー番号,_ロッカーならび,_ロッカー) :- member([_ロッカー番号,_ロッカー],_ロッカーならび), var(_ロッカー),!. ロッカーにランダム値を格納する(_ロッカー) :- _ロッカー is random(0x100000000). ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|Ln],_ロッカーならび) :- ロッカー位置と格納する値を乱数で決める([_|Ln],_ロッカーならび). % 以下のサイトは # 問2 # 正整数n,n個の実数,および文字列を読み込み,文字列がselectionのときは # 選択ソート,文字列がbubbleのときはバブルソートをして, # 使用したソートアルゴリズムと降順にソートされた実数型配列を # 出力するプログラムを作成せよ.以下のコードを穴埋めして,用いても良い. # # 実行例 # 整数 > 10 # 0番目の実数 > 3.3 # 1番目の実数 > 4.4 # 2番目の実数 > 2.2 # 3番目の実数 > 1.1 # 4番目の実数 > 0.0 # 5番目の実数 > 9.9 # 6番目の実数 > 8.8 # 7番目の実数 > 5.5 # 8番目の実数 > 7.7 # 9番目の実数 > 6.6 # 文字列 > selection # 選択ソート # 9.900000 # 8.800000 # 7.700000 # 6.600000 # 5.500000 # 4.400000 # 3.300000 # 2.200000 # 1.100000 # 0.000000 # # 実行例 # 整数 > 10 # 0番目の実数 > 3.3 # 1番目の実数 > 4.4 # 2番目の実数 > 2.2 # 3番目の実数 > 1.1 # 4番目の実数 > 0.0 # 5番目の実数 > 9.9 # 6番目の実数 > 8.8 # 7番目の実数 > 5.5 # 8番目の実数 > 7.7 # 9番目の実数 > 6.6 # 文字列 > bubble # バブルソート # 9.900000 # 8.800000 # 7.700000 # 6.600000 # 5.500000 # 4.400000 # 3.300000 # 2.200000 # 1.100000 # 0.000000 # '正整数n,n個の実数,および文字列を読み込み,文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして,使用したソートアルゴリズムと降順にソートされた実数型配列を出力する' :- '正整数n,n個の実数,および文字列を読み込み'(_正整数n,_n個の実数ならび,_文字列), '文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして'(_文字列,_n個の実数ならび,_降順に整列されたn個の実数ならび), '使用したソートアルゴリズムと降順にソートされた実数型配列を出力する'(_文字列,_降順に整列されたn個の実数ならび). '正整数n,n個の実数,および文字列を読み込み'(_正整数n,_n個の実数ならび,_文字列) :- '正整数nを読み込み'(_正の整数n), 'n個の実数を読み込み'(_正の整数n,_n個の実数ならび), '文字列を読み込み'(_文字列). '正整数nを読み込み'(_正の整数n) :- write('正の整数を入力してください : '), get_integer(_正の整数n), _正の整数n > 0,!. 'n個の実数を読み込み'(_正の整数n,_n個の実数ならび) :- length(_n個の実数ならび,_正の整数n), findall(_実数,( append(_,[_|_],__n個の実数ならび), 実数を読み込む(_実数)), _n個の実数ならび). 実数を読み込む(_実数) :- write('実数を入力してください : '), get_line(Line), 実数入力診断(Line,_実数),!. 実数を読み込む(_実数) :- 実数を読み込む(_実数). 実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), number(_実数),!. 実数入力診断(Line,_実数) :- writef('入力された%tからは実数が得られません。再入力をお願いします。\n',[Line]), fail. '文字列を読み込み'(_文字列) :- get_line(_文字列). '文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして'(selection,_n個の実数ならび,_降順に整列されたn個の実数ならび) :- 降順選択ソート(_n個の実数ならび,_降順整列されたn個の実数ならび),!. '文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして'(bubble,_n個の実数ならび,_降順に整列されたn個の実数ならび) :- 降順バブルソート(_n個の実数ならび,_降順に整列されたn個の実数ならび),!. '使用したソートアルゴリズムと降順にソートされた実数型配列を出力する'(selection,_降順整列されたn個の実数ならび) :- listing(降順選択ソート/2), listing(降順swap/3), 出力する(_降順に整列されたn個の実数ならび). '使用したソートアルゴリズムと降順にソートされた実数型配列を出力する'(bubble,_降順に整列されたn個の実数ならび) :- listing(降順バブルソート/2), listing(降順交換/2), 出力する(_降順に整列されたn個の実数ならび). 出力する(_降順に整列されたn個の実数ならび) :- append(_,[_実数|R],_降順に整列されたn個の実数ならび), writef('%t\n',[_実数]), R = []. 降順選択ソート([],[]) :- !. 降順選択ソート([A],[A]) :- !. 降順選択ソート(L1,[N|R2]) :- append(L0,[N|R],L1), \+((member(N1,L0),N1 @< N)), \+((member(N2,R),N2 @< N)), swap(L0,[N|R],R1), 降順選択ソート(R1,R2). swap([],[N|R],R) :- !. swap(L0,[N|R],R1) :- L0=[S|R0], append(R0,[S|R],R1). 降順バブルソート(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一),!, 降順バブルソート(_対象ならびの一,_整列済みならび). 降順バブルソート(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 交換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/166 # # [1] 授業単元:C言語 # [2] 問題文:コンソールから2つの数(数1,数2とする)を入力する.ただし,数1は複数の桁の整数で,数2は1桁の数であるとする. # 数1が数2の倍数のときには,数1が数2の倍数である旨を表示し,そうでない場合は,数1が数2の倍数では無い旨,教示する. # そして,数1に含まれる,数字としての数2の個数を数え,結果をコンソールに出力させる. # 以上を4つの関数で構成されるプログラムとして作成せよ. # # 実行例 # 数1を入力して下さい 23242 ←キーボードから23242と入力 # 数2を入力して下さい 2 ←キーボードから2と入力 # 23242は2の倍数です # 23242に含まれる2の数字は3個です # # 数1を入力して下さい 323 # 数2を入力して下さい 3 # 323は3の倍数ではありません # 323に含まれる3の数字は2個です # お願いします # # <仕様> # プログラムを以下の関数で構成する. # 数1が数2の倍数であるか否かの判定の関数 # ・引数:数1, 数2(いずれもint型) # ・戻り値:0または1(いずれもint型) # 0…数1は数2の倍数ではない # 1…数1は数2の倍数 # 数1に含まれる数字としての数2の個数を数える関数 # ・引数:数1, 数2(いずれもint型) # ・戻り値:数えた結果の個数(int型) # 数1, 数2にまつわる分析を行う関数 # ・引数:数1, 数2(いずれもint型) # ・戻り値:分析結果…2桁の整数 # 1の位 :数1に含まれる数2の数字の個数 # 10の位:数1が数2の倍数か否か(0:非倍数,1:倍数)) # main関数. # ・数1, 数2をキーボードから入力する # ・上記の分析関数を呼び出す # ・下記の分析結果を表示する. # 数1が数2の倍数か否か # 数1に含まれる数2の数字の個数 # 関数 銑の名称やソースプログラム内の位置は任意で良い. # # 'コンソールから2つの数(数1,数2とする)を入力する.ただし,数1は複数の桁の整数で,数2は1桁の数であるとする'(_数1,_数2) :- '数1を入力する。ただし,数1は複数の桁の整数であるとする'(_数1), '数2を入力する。ただし,数2は1桁の数であるとする'(_数2). '数1を入力する。ただし,数1は複数の桁の整数であるとする'(_数1) :- write('数1を入力してください(複数の桁の整数) : '), get_line(Line), 'ただし,数1は複数の桁の整数であるとする'(Line,_数1),!. '数1を入力する。ただし,数1は複数の桁の整数であるとする'(_数1) :- '数1を入力する。ただし,数1は複数の桁の整数であるとする'(_数1). 'ただし,数1は複数の桁の整数であるとする'(Line,_数1) :- atom_to_term(Line,_数1,_), integer(_数1), _数1 > 9,!. 'ただし,数1は複数の桁の整数であるとする'(Line,_) :- writef('入力された %t から複数桁の整数が得られません。再入力をお願いします。\n',[Line]), fail. '数2を入力する。ただし,数2は1桁の数であるとする'(_数2) :- write('数2を入力してください(1桁の整数) : '), get_line(Line), 'ただし,数2は1桁の数であるとする'(Line,_数2),!. '数2を入力する。ただし,数2は1桁の数であるとする'(_数2) :- '数2を入力する。ただし,数2は1桁の数であるとする'(_数2). 'ただし,数2は1桁の数であるとする'(Line,_数2) :- atom_to_term(Line,_数2,_), integer(_数2), _数2 >= 0, _数2 =< 9,!. 'ただし,数2は1桁の数であるとする'(Line,_) :- writef('入力された %t から1桁の数が得られません。再入力をお願いします。\n',[Line]), fail. '数1が数2の倍数のときには,数1が数2の倍数である旨を表示し,そうでない場合は,数1が数2の倍数では無い旨,教示する'(_数1,_数2,_教示) :- '数1が数2の倍数のときには,数1が数2の倍数である旨を表示し'(_数1,_数2,_教示),!. '数1が数2の倍数のときには,数1が数2の倍数である旨を表示し,そうでない場合は,数1が数2の倍数では無い旨,教示する'(_数1,_数2,_教示) :- '数1が数2の倍数でない場合は、数1が数2の倍数では無い旨,教示する'(_数1,_数2,_教示),!. '数1が数2の倍数のときには,数1が数2の倍数である旨を表示し'(_数1,_数2,数1が数2の倍数である) :- _数1 is _数2 * 2. '数1が数2の倍数でない場合は、数1が数2の倍数では無い旨,教示する'(_数1,_数2,数1が数2の倍数では無い) :- \+(_数1 is _数2 * 2). '数1に含まれる,数字としての数2の個数を数え,結果をコンソールに出力させる'(_数1,_数2,_数1に含まれる数2の個数) :- '数1に含まれる,数字としての数2の個数を数え'(_数1,_数2,_数1に含まれる数2の個数), 結果をコンソールに出力させる(_数1に含まれる数2の個数). '数1に含まれる,数字としての数2の個数を数え'(_数1,_数2,_数1に含まれる数2の個数) :- number_chars(_数1,L1), number_chars(_数2,L2), count(append(_,L2,_,L1),_数1に含まれる数2の個数), 結果をコンソールに出力させる(_数1に含まれる数2の個数) :- writef('数1には数2の数が%t個含まれます。\n',[_数1に含まれる数2の個数]). % 以下のサイトは # 述語 項複写/2 を定義してください。第二引数に以下のように複写された項が # 戻されます。 # # ?- 項複写(p(u,A,B,A),X). # X = p(u,_1,_2,_1). # # A が 2つ現れるので、複写された項にも _1 が2つ必要。 # 基本的にはfunctor/3や=../2を使えば構造の複写はできるのですが、 # 最終的に第一引数に現れる共通する変数の関係を第二引数の項に # 反映しなくてはなりません。 # これをどうやって定義するか? % *** user: 項複写 / 6 *** 項複写(M,N,P,P1,VarList,VarList) :- M > N,!. 項複写(M,N,P,P1,VarList1,VarList2) :- arg(M,P,T), arg(M,P1,T1), 項複写(T,T1,VarList1,VarList3), M1 is M + 1, 項複写(M1,N,P,P1,VarList3,VarList2),!. % *** user: 項複写 / 4 *** 項複写(P,P1,VarList1,VarList2) :- struct(P), functor(P,F,A), functor(P1,F,A), 項複写(1,A,P,P1,VarList1,VarList2),!. 項複写(P,P1,VarList1,[(P,P1)|Varlist2]) :- var(P), 変数リストの更新(P,P1,VarList1,VarList2),!. 項複写(P,P1,VarList,VarList) :- \+(var(P)), atom_to_term(P,Q,_), \+(P == Q), sprintf(%q,[P],P1),!. 項複写(P,P,Varlist,VarList). % *** user: 項複写 / 2 *** 項複写(_項1,_項2) :- 項複写(_項1,_項2,[],VarList),!. % *** user: 変数リストの更新 / 4 *** 変数リストの更新(P1,P2,[],[]) :- !. 変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,P2)|R4]) :- V1 == P1, V2 = P2, 変数リストの更新(P1,P2,R3,R4),!. 変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,V2)|R4]) :- \+(V1 == P1), 変数リストの更新(P1,P2,R3,R4),!. % 以下のサイトは # 述語 全ての要素についてPである (引数の数は任意) を定義してください。 # 条件 第一引数には リストがきます。このリストの要素を全て満足する目標が # 最後の引数Pとなります。 % % ?- 全ての要素についてPである([1,2,3],_要素,member(_要素,[2,2,4,1,3])). % _要素 = _1001 % true % 全ての要素についてPである([],_,_). 全ての要素についてPである([_要素|R],_要素,P) :- 項複写((_要素,P),(_要素1,P1)), call_P(P), 全ての要素についてPである(R,_要素1,P1). call_P(P) :- call(P),!. % *** user: 項複写 / 6 *** 項複写(M,N,P,P1,VarList,VarList) :- M > N,!. 項複写(M,N,P,P1,VarList1,VarList2) :- arg(M,P,T), arg(M,P1,T1), 項複写(T,T1,VarList1,VarList3), M1 is M + 1, 項複写(M1,N,P,P1,VarList3,VarList2),!. % *** user: 項複写 / 4 *** 項複写(P,P1,VarList1,VarList2) :- struct(P), functor(P,F,A), functor(P1,F,A), 項複写(1,A,P,P1,VarList1,VarList2),!. 項複写(P,P1,VarList1,[(P,P1)|Varlist2]) :- var(P), 変数リストの更新(P,P1,VarList1,VarList2),!. 項複写(P,P1,VarList,VarList) :- \+(var(P)), atom_to_term(P,Q,_), \+(P == Q), sprintf(%q,[P],P1),!. 項複写(P,P,Varlist,VarList). % *** user: 項複写 / 2 *** 項複写(_項1,_項2) :- 項複写(_項1,_項2,[],VarList),!. % *** user: 変数リストの更新 / 4 *** 変数リストの更新(P1,P2,[],[]) :- !. 変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,V2)|R4]) :- V1 == P1, V2 = P2, 変数リストの更新(P1,P2,R3,R4),!. 変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,V2)|R4]) :- \+(V1 == P1), 変数リストの更新(P1,P2,R3,R4),!. % 以下のサイトは # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): キーボードから入力した数値(10進数)を # 2進数に変換して画面に出力するコードを作成しなさい。 # # また,キーボードから入力した2進数の数値を # 10進数に変換して画面に出力するコードを作成しなさい。 # # また、必要に応じて再帰を使っても使わなくてもよい。 'キーボードから入力した数値(10進数)を2進数に変換して画面に出力する' :- 'キーボードから入力した数値(10進数)を'(_10進数), '2進数に変換して'(_10進数,_2進数表示), 画面に出力する(_2進数表示). 'キーボードから入力した数値(10進数)を'(_10進数) :- get_line(Line), 入力した数値診断(Line,_10進数),!. 入力した数値診断(Line,_10進数) :- atom_to_term(Line,_10進数), integer(_10進数),!. '2進数に変換して'(_10進数,_2進数表示) :- _10進数 >= 0, '10進数を2進数ならび表現に変換'(_10進数,[],L), concat_atom(L,_2進数表示). '2進数に変換して'(_10進数,_2進数表示) :- _10進数 < 0, _10進数_1 is 2147483648 + _10進数, '10進数をn桁の2進数ならび表現に変換'(_10進数_1,31,[],L), concat_atom([1|L],_2進数表示). '10進数を2進数ならび表現に変換'(0,L,L) :- !. '10進数を2進数ならび表現に変換'(N,L1,L) :- M1 is N mod 2, N2 is N // 2, '10進数を2進数ならび表現に変換'(N2,[M1|L1],L). '10進数をn桁の2進数ならび表現に変換'(0,_n桁,L) :- length(L,_n桁), '10進数を2進数ならび表現に変換'(_10進数,[],L1), append(L0,L1,L), all(L0,0),!. 画面に出力する(_2進数表示) :- writef('%t\n',[_2進数表示]). % 以下のサイトは # [1]授業単元: 関数入門 # [2]問題文: # 100点満点の試験を入力して、5段階評価を返す関数 hyouka を作成せよ。 # 5段階評価は、100〜90までは5、89〜80は4、79〜70は3、69〜60は2、60未満は1とする。 # この関数を利用して、学生10人の試験の点数を入力して、 # それぞれの5段階評価を求め一覧表を表示するプログラム quality.cpp を作成せよ。 '学生10人の試験の点数を入力して、それぞれの5段階評価を求め一覧表を表示する' :- '学生10人の試験の点数を入力して'(_10人の試験の点数), それぞれの5段階評価を求め(_10人の試験の点数,_評価ならび), 一覧表を表示する(_評価ならび). '学生10人の試験の点数を入力して'(_10人の試験の点数) :- length(_10人の試験の点数,10), 学生番号・点数を入力(_10人の試験の点数). 学生番号・点数を入力(_10人の試験の点数) :- findall([_学生番号,_点数], append(_,[_|_],_10人の試験の点数), 学生番号を入力(_学生番号), 点数を入力(_点数)), _10人の試験の点数). 学生番号を入力(_学生番号) :- write('学生番号を入力してください : '), get_line(_学生番号). 点数を入力(_点数) :- get_line(Line), 点数入力診断(Line,_点数),!. 点数を入力(_点数) :- 点数を入力(_点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0, _点数 =< 100,!. 点数入力診断(Line,_点数) :- writef('入力された%tから点数が得られません。再入力をお願いします。[Line]), fail. それぞれの5段階評価を求め(_10人の試験の点数,_評価ならび) :- findall([_学生番号,_試験の点数,_5段階評価],(           append(_,[[_学生番号,_試験の点数]|_],_10人の試験の点数), '5段階評価'(__100点満点の試験の点数,_5段階評価)), _評価ならび). '5段階評価'(_試験の点数,5) :- '5段階評価は、100〜90までは5'(_試験の点数). '5段階評価'(_試験の点数,4) :- '5段階評価は、89〜80は4'(_試験の点数). '5段階評価'(_試験の点数,3) :- '5段階評価は、79〜70は3'(_試験の点数). '5段階評価'(_試験の点数,2) :- '5段階評価は、69〜60は2'(_試験の点数). '5段階評価'(_試験の点数,1) :- '5段階評価は、60点未満は1'(_試験の点数). '5段階評価は、100〜90までは5'(_試験の点数) :- _試験の点数 >= 90, _試験の点数 =< 100,!. '5段階評価は、89〜80は4'(_試験の点数) :- _試験の点数 >= 80, _試験の点数 =< 89,!. '5段階評価は、79〜70は3'(_試験の点数) :- _試験の点数 >= 70, _試験の点数 =< 79,!. '5段階評価は、69〜60は2'(_試験の点数) :- _試験の点数 >= 60, _試験の点数 =< 69,!. '5段階評価は、60点未満は1'(_試験の点数) :- _試験の点数 < 60. 一覧表を表示する(_評価ならび) :- 見出し表示, それぞれの評価を表示する(_評価ならび). 見出し表示 :- writef('%12r %12r %12r\n',[学生番号,試験成績,'5段階の評価']). それぞれの評価を表示する([]). それぞれの評価を表示する([[_学生番号,_試験の成績,_5段階の評価]|R]) :- writef('%12r %12r %12r\n',[_学生番号,_試験の成績,_5段階の評価]), それぞれの評価を表示する(R). % 以下のサイトは # ・以下の実行結果になるようプログラムを作成せよ。 # # 実行結果 # 人数 > 5 # 0人目: # 名前 > Taro # 電話番号 > 090-111-1111 # 1人目: # 名前 > Hanako # 電話番号 > 090-222-2222 # 2人目: # 名前 > Ichiro # 電話番号 > 090-333-3333 # 3人目: # 名前 > Jiro # 電話番号 > 090-444-4444 # 4人目: # 名前 > Hanayo # 電話番号 > 090-555-5555 # # 電話帳: # Taro, 090-111-1111 # Hanako, 090-222-2222 # Ichiro, 090-333-3333 # Jiro, 090-444-4444 # Hanayo, 090-555-5555 # # 名前 > Hanayo # Hanayo, 090-555-5555 # # 実行結果 # 人数 > 2 # 0人目: # 名前 > Taro # 電話番号 > 090-111-1111 # 1人目: # 名前 > Taro # 電話番号 > 090-222-2222 # # 電話帳: # Taro, 090-111-1111 # Taro, 090-222-2222 # # 名前 > Taro # Taro, 090-111-1111 # Taro, 090-222-2222 # # 実行結果 # 人数 > 0 # # 電話帳: # # 名前 > Taro # 該当者なし '電話番号を登録し、それを表示し、さらに検索する' :- 電話番号登録, 電話番号表示, 電話番号検索. 電話番号登録 :- abolish(電話帳/2), 処理人数を入力する(_人数), length(Ln,_人数), append(L0,[_|R],Ln), length(L0,_人目), writef('%t人目:\n',[_人目]), 名前を入力する(_名前), 電話番号を入力する(_電話番号), assertz(電話帳(_名前,_電話番号)), R = [],!. 電話番号登録. 処理人数を入力する(_人数) :- write('\n人数 > '), get_line(Line), 処理人数入力診断(Line,_人数),!. 処理人数を入力する(_人数) :- 処理人数を入力する(_人数). 処理人数入力診断(Line,_人数) :- atom_to_term(line,_人数,_), integer(_人数), _人数 > 0,!. 処理人数入力診断(Line,_人数) :- writef('入力された %t から適切な人数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 名前を入力する(_名前) :- write('名前 > '), get_line(_名前). 電話番号を入力する(_電話番号) :- write('電話番号 > '), get_line(Line), 電話番号入力診断(Line,_電話番号),!. 電話番号を入力(_電話番号) :- 電話番号を入力する(_電話番号). 電話番号入力診断(Line,Line) :- split(Line,['(',')','-',' '],L), concat_atom(L,S), atom_chars(S,Chars), 全てが数字(Chars),!. 電話番号入力診断(Line,_電話番号) :- writef('入力された%tは電話番号として不適切です。再入力をお願いします。\n',[Line]), fail. 電話番号表示 :- writef('\n電話帳 >\n'), 電話帳(_名前,_電話番号), writef('%t, %t\n',[_名前,_電話番号]), fail. 電話番号表示. 電話番号検索 :- 名前を鍵に電話番号を得る. 名前を鍵に電話番号を得る :- 名前を入力(_名前), 電話番号の検索と出力(_名前),!. 電話番号の検索と出力(_名前,_電話番号) :- 電話帳(_名前,_電話番号), 名前と電話番号を出力する(_名前,_電話番号), fail. 電話番号の検索と出力(_名前,_電話番号) :- \+(電話帳(_名前,_電話番号)), write('該当者なし\n'),!. 電話番号の検索と出力(_,_). 名前と電話番号を出力する(_名前,_電話番号) :- writef('%t, %t\n',[_名前,_電話番号]). 全てが数字([]) :- !. 全てが数字([A|R]) :- member(A,['0','1','2','3','5','5','6','7','8','9']), 全てが数字(R). % 以下のサイトは # [1] 授業単元: プログラミング  # [2] 問題文(含コード&リンク):入力仕様を、入力座標は最大2桁までの整数を # 最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う # プログラムの作成。 '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(_入力座標ならび) :- length(Ln,10), 座標入力(_座標), '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(Ln,_座標,_入力座標ならび). '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(_,end_of_file,[]) :- !. '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'([_],_座標,[_座標]) :- !. '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'([_|Ln],_座標,[_座標|R2]) :- 座標入力(_座標2), '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(Ln,_座標2,R2). 座標入力(_座標) :- get_line(Line), 座標入力診断(Line,_座標),!. 座標入力(_座標) :- 座標入力(_座標). 座標入力診断(Line,_座標) :- atom_to_term(Line,_座標,_), integer(_座標), number_chars(_座標,Chars), length(Chars,Len), len >= 1, Len =< 2,!. 座標入力診断(Line,_) :- writef('入力された%tからは2桁までの座標値は得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/981 # # [1] 授業単元:C言語応用 # [2] 問題文(含コード&リンク): # キーボードから入力した数だけのロッカーを割り付け、各ロッカーにキーボードから入力したデータを保存し、最後に保存した内容を表示するプログラムkadai10-1.cを次のステップにしたがって作成せよ。 # 但し、各ロッカーには次のロッカーへのポインター(次のロッカーの鍵と思えばわかりやすい)も荷物に相当するデータといっしょに保存するものとする。 # ./a.out # 3      説明:ロッカーの数を入力 # 1 3 4       データ入力 # 'キーボードから入力した数だけのロッカーを割り付け、各ロッカーにキーボードから入力したデータを保存し、最後に保存した内容を表示する' :- キーボードから入力した数だけのロッカーを割り付け(_ロッカーならび), 各ロッカーにキーボードから入力したデータを保存し(_ロッカーならび), 最後に保存した内容を表示する(_ロッカーならび). キーボードから入力した数だけのロッカーを割り付け(_ロッカーならび) :- キーボードから入力した数(_キーボードから入力した数), ロッカーを割り付け(_ロッカーならび). キーボードから入力した数(_キーボードから入力した数) :- get_line(Line), キーボードから入力した数診断(Line,_キーボードから入力した数),!. キーボードから入力した数(_キーボードから入力した数) :- キーボードから入力した数(_キーボードから入力した数). キーボードから入力した数診断(Line,_キーボードから入力した数) :- atom_to_term(Line,_キーボードから入力した数), integer(_キーボードから入力した数), _キーボードから入力した数 > 0,!. キーボードから入力した数診断(Line,_キーボードから入力した数) :- writef('入力された %t からロッカーの数が得られませんでした。再入力をお願いします。\n',[Line]), fail. ロッカーを割り付け(_キーボードから入力した数,_ロッカーならび) :- length(_ロッカーならび,_キーボードから入力した数). 各ロッカーにキーボードから入力したデータを保存し(_ロッカーならび) :- readln(_入力したデータならび), データを保存(_入力したデータならび,_ロッカーならび). データを保存(_入力したデータならび,_ロッカーならび) :- ロッカーは入力データより大きいか等しい(_入力したデータならび,_ロッカーならび),!. データを保存(_入力したデータならび,_ロッカーならび) :- 入力データの方がロッカーよりも多い場合は(_入力したデータならび,_ロッカーならび). ロッカーは入力データより大きいか等しい(_入力したデータならび,_ロッカーならび) :- append(_入力したデータならび,_,_ロッカーならび). 入力データの方がロッカーよりも多い場合は(_入力したデータならび,_ロッカーならび) :- append(_ロッカーならび,_,入力したデータならび). 最後に保存した内容を表示する([]) :- !. 最後に保存した内容を表示する([_データ|R]) :- writef('%t\n',[_データ]), 最後に保存した内容を表示する(R). % 以下のサイトは # 【課題】キーボードから入力された1〜9までを九九にし、 # 答えを1行に3個ずつ表示する。半角数字以外が入力された場合、 # 任意のエラーメッセージを表示させること。 # 【形態】public class Kuku1{で始める # 【期限】4月11日 # 【Ver 】jdk1.6.0_24 # 【注】変数、if,for,whileまで学習。 # # 単なる九九の計算のプログラムはできるのですが、例えば、3と入力して # 3の段の答えだけを表示するやり方、エラーを表示させるやり方、 # 3つずつというのが全くわかりません。 'キーボードから入力された1〜9までを九九にし、答えを1行に3個ずつ表示する' :- 'キーボードから入力された1〜9までを'(_1〜9までの数), append(_,[[N1,N2,N3]|R],[[1,2,3],[4,5,6],[7,8,9]]), M1 is N1 * _1〜9までの数, M2 is N2 * _1〜9までの数, M3 is N3 * _1〜9までの数, writef('%t %t %t\n',[M1,M2,M3]), R = []. 'キーボードから入力された1〜9までを'(_1〜9までの数) :- get_line(Line), 'キーボードからの入力診断'(Line,_1〜9までの数),!. 'キーボードから入力された1〜9までを'(_1〜9までの数) :- 'キーボードから入力された1〜9までを'(_1〜9までの数). 'キーボードからの入力診断'(Line,_1〜9までの数) :- atom_to_term(Line,_1〜9までの数,_), integer(_1〜9までの数), _1〜9までの数 >= 1, _1〜9までの数 =< 9,!. 'キーボードからの入力診断'(Line,_1〜9までの数) :- writef('入力された %t からは1〜9までの数が得られません。再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/910 # # 【1】c言語 # 【2】入力された小数点をmy roundという関数を使って含む数値を四捨五入するプログラムを作成せよ。 # my_round関数の仕様 # int my_round(float x){     # #    int ret; # #    四捨五入の処理    # #    return( ret ); # # } # # # 実行結果 # # 小数点を含む数値を入力してください。 # 数値:1.89 # 1.890000は2に四捨五入されました # # '入力された小数点をmy roundという関数を使って含む数値を四捨五入する' :- 入力された小数点を(_小数点数), 四捨五入する(_小数点数,_四捨五入された小数点数). _四捨五入された整数 is truncate(_四捨五入された小数点数), writef('%t は %f に四捨五入されました。\n',[_小数点数,_四捨五入された整数]). 入力された小数点を(_小数点数) :- write('小数点を含む数値を入力してください。 \n数値: '), get_line(Line), 入力された小数数診断(Line,_小数点数),!. 入力された小数点を(_小数点数) :- 入力された小数点を(_小数点数). 入力された小数数診断(Line,_小数点数) :- atom_to_term(Line,_小数点数,_), float(_小数点数),!. 入力された小数数診断(Line,_小数点数) :- writef('入力された %t からは小数点数を得られませんでした。再入力をお願いします。\n',[Line]), fail. 四捨五入する(_小数点数,_四捨五入された小数点数) :- _四捨五入された小数点数 is floor(_小数点数 + 0.5). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/889 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/MysbRMqT # # キーボードから入力した数だけのロッカーを割り付け、各ロッカーにキーボード # から入力したデータを保存し、最後に保存した内容を表示するプログラム # kadai10-1.cを次のステップにしたがって 作成せよ。但し、各ロッカーには # 次のロッカーへのポインター(次のロッカーの鍵と思えばわかりやすい)も # 荷物に相当するデータといっしょに保存するものとする。 # # 1-1 データ構造として次の構造体を用意する。 # struct rocker { # int data; //保存するデータ # struct rocker *next; //次のボックスのアドレス(鍵) # }; # # 1-2 最初の鍵として次のポインターを大域変数として用意する。 # struct rocker *head; # # 1-3 1個のロッカーを割り当てて、最後に割り当てたロッカーに新しく割り当てた # ロッカーのアドレス(鍵)を保存する関数 struct rocker *new_rocker(struct rocker *last_rocker)を定義しなさい。 # ただし引数 last_rockerは最後に作ったボックスのポインターとする。この間数は # 新しく割り当てたロッカーのアドレスを返すものとする。 # # 1-4 全てのロッカーに保存したデータを最初のロッカーから順番に表示していく # 関数 void display_rockers(struct rocker *pt)を定義しなさい。 # ただし、実行結果が次のようになるように定義しなさい。 # # gcc kadai10-1.c # ./a.out # 3      説明:ロッカーの数を入力 # 1 3 4       データ入力 # [ data = 1 ]->[ data = 3 ]->[ data = 4 ]       表示 # # ※ 表示部分では printf("[ data = %d ]->", xxxxx); もしくは printf("[ data = %d ]\n", xxxxxx);を使用する # 'キーボードから入力した数だけのロッカーを割り付け、各ロッカーにキーボードから入力したデータを保存し、最後に保存した内容を表示する' :- キーボードから入力した数だけのロッカーを割り付け(_ロッカーならび), 各ロッカーにキーボードから入力したデータを保存し(_ロッカーならび), 最後に保存した内容を表示する(_ロッカーならび). キーボードから入力した数だけのロッカーを割り付け(_ロッカーならび) :- キーボードから入力した数(_キーボードから入力した数), length(_ロッカーならび,_キーボードから入力した数). キーボードから入力した数(_キーボードから入力した数) :- write('ロッカーの数を入力してください : '), get_line(Line), キーボードから入力した数診断(Line,_キーボードから入力した数),!. キーボードから入力した数(_キーボードから入力した数) :- キーボードから入力した数(_キーボードから入力した数). キーボードから入力した数診断(Line,_キーボードから入力した数) :- atom_to_term(Line,_キーボードから入力した数,_), integer(_キーボードから入力した数), _キーボードから入力した数 >= 1,!. キーボードから入力した数診断(Line,_キーボードから入力した数) :- writef('入力された %t から適切な整数が得られません。再入力をお願いします。\n',[Line]), fail. 各ロッカーにキーボードから入力したデータを保存し([]). 各ロッカーにキーボードから入力したデータを保存し([Line|R]) :- キーボードから入力したデータを(Line), 各ロッカーにキーボードから入力したデータを保存し(R). 最後に保存した内容を表示する(_ロッカーならび) :- append(L0,[_データ|R],_ロッカーならび), length([_|L0],_n番目), writef('ロッカー[%t]: %t\n',[_n番目,_データ]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/883 # # あと、もうひとつ問題 # 2.201003121(10進数9桁)、性別(男:1、女:2)、年令(未成年:0,成年:1,高齢:2,後期高齢:3)、 # 職業(無:0、有:1)で個々人が16分類される。それぞれを数字(コード)で入力させ、 # その人の状態を一旦ディスプレイに表示し、if文を使って、自然な文章で最後に表示するプログラムを作れ # 'それぞれを数字(コード)で入力させ、その人の状態を一旦ディスプレイに表示し、if文を使って、自然な文章で最後に表示する' :- 'それぞれを数字(コード)で入力させ'(_個人ID,_分類コード), 分類コードの生成([_分類コード,_性別,_年齢,_職業],_分類表示), writef('%t\n',[_分類表示]), 自然な文章で最後に表示する(_個人ID,_性別,_年齢,_職業). 'それぞれを数字(コード)で入力させ'(_個人ID,_分類コード) :- 個人IDの入力(_個人ID), 分類コードの入力(_分類コード),!. 個人IDの入力(_個人ID) :- write('個人IDを入力してください : '), get_line(Line), 個人ID入力診断(Line,_個人ID),!. 個人IDの入力(_個人ID) :- 個人IDの入力(_個人ID). 個人ID入力診断(Line,_個人ID) :- atom_to_term(Line,_個人ID,_), integer(_個人ID), _個人ID >= 100000000, _個人ID =< 999999999,!. 個人ID入力診断(Line,_個人ID) :- writef('入力された %t からは適切な個人IDが得られませんでした。再入力をお願いします。\n',[Line]), fail. 分類コードの入力(_分類コード) :- 分類コード表示, write('分類コードを入力してください : '), get_line(Line), 分類コード入力診断(Line,_分類コード),!. 分類コードの入力(_分類コード) :- 分類コードの入力(_分類コード). 分類コード入力診断(Line,_分類コード) :- atom_to_term(Line,_分類コード,_), integer(_分類コード), _分類コード >= 0, _分類コード =< 15,!. 分類コード入力診断(Line,_分類コード) :- writef('入力された %t からは分類コードが得られませんでした。再入力をお願いします。\n',[Line]), fail. 分類コードの生成([_分類コード,_性別,_年齢,_職業],_分類表示) :- append(L01,[_性別|_],['男','女']), append(L02,[_年齢|_],['未成年','青年','高齢者','後期高齢者']), append(L03,[_職業|_],['無','有']), length(L01,N1), length(L02,N2), length(L03,N3), _分類コード is N1 * 8 + N2 * 2 + N3, concat_atom(['分類コード ',_分類コード,' [','性別:',_性別,' ','年齢: ',_年齢,' ','職業: ',_職業,']'],_分類表示). 分類コード表示 :- 分類コードの生成([_分類コード,_性別,_年齢,_職業],_分類表示), writef('%t\n',[_分類表示]), fail. 分類コード表示. 自然な文章で最後に表示する(_個人ID,_性別,_年齢,_職業) :- writef('個人IDが%tの人は、%tで',[_個人ID,_性別]), 自然な年齢表現(_年齢), 自然な職業表現(_職業). 自然な年齢表現(_年齢) :- writef('年齢分類は%t、',[_年齢]). 自然な職業表現(有) :- write('職業に就いています。\n'). 自然な職業表現(無) :- write('無職です。\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/621 # # [1] C言語演習 # [2] http://ime.nu/codepad.org/QMwiwwtp を改良して、 #   80〜100:優 70〜 79:良 60〜 69:可 0〜 59:不可 #  の分布グラフを表示するプログラムを作成しなさい。 # 【実行結果】 # 点数を入力してください。 # 1番:17 # 2番:38 # 3番:100 # 4番:95 # 5番:23 # □ 分布グラフ □ #  優:** #  良: #  可: # 不可:*** # ◆´,魏造して、「不可一覧表」も表示できるようにしなさい。 # 【実行結果】 # ,離廛蹈哀薀爐硫爾 # 不可一覧表 # 1番 ( 17点) # 2番 ( 38点) # 5番 ( 23点) # と表示させる。 #  配列を利用して、23番目までのフィボナッチ数列を画面に整列させた状態で表示させなさい。 # 1,1,2,3,5,8,13,21,34,… #  [3.1] Windows7 #  [3.3] C言語 # [4] 木曜19時まで # [5] 配列まで # わかる方どうかよろしくお願いします。 # # '入力する人数を得て、その人数分の点数を入力する。それを80〜100:優 70〜 79:良 60〜 69:可 0〜 59:不可 の分布グラフとして表示しなさい。さらに不可一覧表も表示しなさい' :- 入力する人数を得る(_人数), n人分の点数を得る(_人数,_点数ならび), グラフ分布(_点数ならび,L1,L2,L3,L4), グラフ表示(L1,L2,L3,L4), 不可一覧表表示(_点数ならび). 入力する人数を得る(_人数) :- write('入力する人数を入れてください : '), get_line(Line), 入力する人数診断(Line,_人数),!. 入力する人数を得る(_人数) :- 入力する人数を得る(_人数). 入力する人数診断(Line,_人数) :- atom_to_term(Line,_人数,_), integer(_人数), _人数 > 0,!. 入力する人数診断(Line,_人数) :- writef('入力された %t から人数が得られません。再入力をお願いします。\n',[Line]), fail. n人分の点数を得る(_n人分,_点数ならび) :- length(_点数ならび,_n人分), findall(_点数,( append(_,[_点数|_],_点数ならび), 点数を入力してください(_点数)), _点数ならび). 点数を入力してください(_点数) :- writef('点数を入力してください : '), get_line(Line,_点数,_), 点数入力診断(Line,_点数),!. 点数を入力してください(_点数) :- 点数を入力してください(_点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0, _点数 =< 100,!. 点数入力診断(Line,_点数) :- writef('入力された %t から適切な点数が得られません。再入力をお願いします。\n',[Line]), fail. グラフ分布([],[],[],[],[]). グラフ分布([_点数|R],[*|L1],L2,L3,L4) :- _点数 >= 80,_点数 =< 100, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,[*|L2],L3,L4) :- _点数 >= 70,_点数 =< 79, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,L2,[*|L3],L4) :- _点数 >= 60,_点数 =< 69, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,L2,L3,[*|L4]) :- _点数 >= 0,_点数 =< 59, グラフ分布(R,L1,L2,L3,L4). グラフ表示(L1,L2,L3,L4) :- concat_atom(L1,_優), concat_atom(L2,_良), concat_atom(L3,_可), concat_atom(L4,_不可), writef(' 優: %t\n 良: %t\n 可: %t\n不可: %t\n',[_優,_良,_可,_不可]). 不可一覧表表示(_点数ならび) :- append(L0,[_点数|_],_点数ならび), _点数 < 60, length([_|L0],_n番目), writef('[%t番目] %t点\n',[_n番目,_点数]), fail. 不可一覧表表示(_点数ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/571 # # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文: # 台形則により関数 f(x)=xe^xをx=0からx=1まで数値積分するプログラムを作成。 # ただし、積分区間の分割数nはキーボードから入力する。 # func(X,Y) :- Y is X * exp(X). '台形則により関数 f(x)=xe^xをx=0からx=1まで数値積分する'(X) :- 積分区間の分割数nはキーボードから入力する(_分割数), 台形公式による積分(_分割数,0,1,X). 積分区間の分割数nはキーボードから入力する(_分割数) :- 項目名・制約付き整数入力(分割数,(_分割数 > 1,0 is _分割数 mod 2),_分割数). 台形公式による積分(_分割数,X0,Xn,S) :- _分割数 > 1, 0 is _分割数 mod 2, Xn > X0, 台形則(_分割数,X0,Xn,S). 台形則(N,X0,Xn,X) :- _間隔 is (Xn-X0) / N, 台形則(1,_分割数,_間隔,X0,Xn,0.0,S), func(X0,F0), func(Xn,Fn), X is (F0 + Fn + S + S ) * _間隔 * 0.5. 台形則(N,_分割数,_,_,_,X,X) :- N > _分割数,!. 台形則(N,_分割数,_間隔,X0,Xn,Y,X) :- U is _間隔 * N + X0, func(U,F), Y2 is Y + F, N2 is N + 1, 台形則(N2,_分割数,_間隔,X0,Xn,Y2,X). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 項目名・制約付き整数入力(_項目名,_制約,_整数) :- writef('%tを入力してください : '), get_line(Line), 項目名・制約付き整数入力診断(Line,_項目名,_制約,_整数),!. 項目名・制約付き整数入力(_項目名,_制約,_整数) :- 項目名・制約付き整数入力(_項目名,_制約,_整数). 項目名・制約付き整数入力診断(Line,_項目名,_制約,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), call(_制約),!. 項目名・制約付き整数入力診断(Line,_項目名,_制約,_整数) :- writef('入力された %t からは適切な%tが得られませんでした。再入力をお願いします。\n',[Line,_項目名]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/564 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した数だけの長さのint型の配列を用意して、 # 同じくキーボードから値を入力し、表示するプログラムkadai9-1.cを作りなさい。 # 但し長さlengthのint型の配列の内容を表示する関数 # void display_array(int *data, int length)を定義して使用すること。 # 実行例: # gcc kadai9-1.c # ./a.out # 3 <- 長さを入力 # 1 3 4 <-データ入力 # 1 <-ここから表示 # 3 # 4 # # 'キーボードから入力した数だけの長さのint型の配列を用意して、同じくキーボードから値を入力し、表示する' :- キーボードから入力した数(_入力した数), 'だけの長さのint型の配列を用意して'(_入力した数,_ならび), 同じくキーボードから値を入力し(_ならび), 表示する(_ならび). キーボードから入力した数(_入力した数) :- get_line(Line), 整数入力診断(Line,_入力した数),!. キーボードから入力した数(_入力した数) :- キーボードから入力した数(_入力した数) . 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'だけの長さのint型の配列を用意して'(_入力した数,_ならび) :- length(_ならび,_入力した数). 同じくキーボードから値を入力し(_ならび) :- 一行で数を入力する(ならび),!. 同じくキーボードから値を入力し(_ならび) :- 同じくキーボードから値を入力し(_ならび). 一行で数を入力する(_ならび) :- get_line(Line), 一行で数を入力診断(Line,_ならび),!. 一行で数を入力診断(Line,_ならび) :- get_split_line([' ',','],_ならび), すべて整数(_ならび),!. 一行で数を入力診断(Line,_ならび) :- length(_ならび,N), writef('入力された %t から %t個の整数を得られませんでした。再入力をお願いします。\n',[Line,N]), fail. 数を入力する(_数) :- get_line(Line), 整数数入力診断(Line,_数),!. 数を入力する(_数) :- 整数を入力する(_数). 表示する(_ならび) :- append(_,[_値|R],_ならび), writef('%t\n',[_値]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/565 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/6wsr2CEj # 国語と数学の2科目のテストの成績を処理するプログラムにおいて、生徒数を # キーボードから入力した後に、そのデータを入力し、最後に入力したデータ全てを # 表示する。 # '国語と数学の2科目のテストの成績を処理するプログラムにおいて、生徒数をキーボードから入力した後に、そのデータを入力し、最後に入力したデータ全てを表示する' :- 生徒数をキーボードから入力した(_生徒数), 後に, そのデータを入力し(_生徒数,_入力したデータ), 最後に入力したデータ全てを表示する(_入力したデータ). 生徒数をキーボードから入力した(_生徒数) :- get_line(Line), 生徒数入力診断(Line,_生徒数),!. 生徒数をキーボードから入力した(_生徒数) :- 生徒数をキーボードから入力した(_生徒数). 生徒数入力診断(Line,_生徒数) :- atom_to_term(Line,_生徒数,_), integer(_生徒数),!. 生徒数入力診断(Line,_生徒数) :- writef('入力された %t から生徒数が得られませんでした。再入力をお願いします。',[Line]), fail. 後に :- true. そのデータを入力し(_生徒数,_入力したデータ) :- length(_入力したデータ,_生徒数), そのデータを入力し(_入力したデータ). そのデータを入力し([]). そのデータを入力し([[_国語,_数学]|R]) :- 国語点数を入力(_国語), 数学点数を入力(_数学), そのデータを入力し(R). 国語点数を入力(_国語点数) :- get_line(Line), 国語点数入力診断(Line,_国語点数),!. 国語点数を入力(_国語点数) :- 国語点数を入力(_国語点数). 国語点数入力診断(Line,_国語点数) :- atom_to_term(Line,_国語点数,_), integer(_国語点数),!. 国語点数入力診断(Line,_国語点数) :- writef('入力された %t から国語点数が得られませんでした。再入力をお願いします。',[Line]), fail. 数学点数を入力(_数学点数) :- get_line(Line), 数学点数入力診断(Line,_数学点数),!. 数学点数を入力(_数学点数) :- 数学点数を入力(_数学点数). 数学点数入力診断(Line,_数学点数) :- atom_to_term(Line,_数学点数,_), integer(_数学点数),!. 数学点数入力診断(Line,_数学点数) :- writef('入力された %t から数学点数が得られませんでした。再入力をお願いします。',[Line]), fail. 最後に入力したデータ全てを表示する(_入力したデータ) :- append([_,[[_国語,_数学]|R],_入力したデータ), writef('%t,%t\n',[_国語,_数学]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/506 # # [1] 授業単元: # [2] 問題文:平面上の点,直線,円の位置関係を判定するプログラムを作れ. # 判定結果としては,カッコ内の文字列を表示せよ. # 点のxy-座標および円の半径と中心のxy-座標を入力し,その点と円の位置関係を, # (a) 点は円の外部にある('gaibu') # (b) 点は円周上にある('enshuujou') # (c) 点は円の内部にある('naibu') # のいずれかに分類せよ. # '平面上の点,直線,円の位置関係を判定する'(_判定) :- '点のxy-座標および円の半径と中心のxy-座標を入力し'(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標), その点と円の位置関係を判定する(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標,_判定), write('%t\n',[_判定]). '点のxy-座標および円の半径と中心のxy-座標を入力し'(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標) :- '点のxy-座標を入力'(_点x座標,_点y座標), '円の半径を入力'(_円の半径), '円の中心のxy-座標を入力'(_中心のx座標,_中心のy座標). その点と円の位置関係を判定する(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標,点は円の外部にある) :- 点は円の外部にある(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標),!. その点と円の位置関係を判定する(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標,点は円周上にある) :- 点は円周上にある(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標),!. その点と円の位置関係を判定する(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標,点は円の内部にある) :- 点は円の内部にある(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標),!. '点のxy-座標を入力'(_点x座標,_点y座標) :- '点のx座標の入力'(_点x座標), '点のy座標の入力'(_点y座標),!. '円の半径の入力'(_円の半径) :- write('円の半径を入力してください : '), get_line(Line), 数値入力診断(Line,_円の半径),!. '円の半径を入力'(_円の半径) :- '円の半径を入力'(_円の半径). '円の中心のxy-座標を入力'(_中心のx座標,_中心のy座標) :- '円の中心のx座標を入力'(_中心のx座標), '円の中心のy座標を入力'(_中心のy座標),!. '点のx座標の入力'(_点x座標) :- write('点のxy-座標を入力してください x座標 : '), get_line(Line), 数値入力診断(Line,_点x座標),!. '点のx座標を入力'(_点x座標) :- '点のx座標を入力'(_点x座標). '点のy座標の入力'(_点y座標) :- write(' y座標 : '), get_line(Line), 数値入力診断(Line,_点y座標),!. '点のy座標を入力'(_点y座標) :- '点のy座標を入力'(_点y座標). '円の中心のx座標の入力'(_中心のx座標) :- write('円の中心のxy-座標を入力してください x座標 : '), get_line(Line), 数値入力診断(Line,_中心のx座標),!. '円の中心のx座標を入力'(_中心のx座標) :- '円の中心のx座標を入力'(_中心のx座標). '円の中心のy座標の入力'(_中心のy座標) :- write(' y座標 : '), get_line(Line), 数値入力診断(Line,_中心のy座標),!. '円の中心のy座標を入力'(_中心のy座標) :- '円の中心のy座標を入力'(_中心のy座標). 数値入力診断(Line,_座標点) :- atom_to_term(Line,_座標点,_), number(_座標点),!. 数値入力診断(Line,_座標点) :- writef('入力された %t から数値が得られません。再入力をお願いします。\n',[Line]), fail. 点は円の外部にある(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標) :- X is (_点x座標 - _中心のx座標) * (_点x座標 - _中心のx座標), Y is (_点y座標 - _中心のy座標) * (_点y座標 - _中心のy座標), X + Y > _円の半径 * _円の半径,!. 点は円周上にある(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標) :- X is (_点x座標 - _中心のx座標) * (_点x座標 - _中心のx座標), Y is (_点y座標 - _中心のy座標) * (_点y座標 - _中心のy座標), X + Y =:= _円の半径 * _円の半径,!. 点は円の内部にある(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標) :- X is (_点x座標 - _中心のx座標) * (_点x座標 - _中心のx座標), Y is (_点y座標 - _中心のy座標) * (_点y座標 - _中心のy座標), X + Y < _円の半径 * _円の半径,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/490 # # [1] 授業単元:ファイルにある数字をすべて読み込む # [2] 問題文(含コード&リンク): # log1.txtには、0個以上の実数が1行に1つずつ、改行を挟んで記載されている。 # 記載されている実数を全て読み込み、数値の個数、平均値、分散値を求めて表示するプログラムを作成しなさい。 # 'log1.txtには、0個以上の実数が1行に1つずつ、改行を挟んで記載されている。記載されている実数を全て読み込み、数値の個数、平均値、分散値を求めて表示する' :- findall(V,( append(_,[Line|_],Lines), atom_to_term(Line,V,_)), L), 数値の個数(L,_個数), 平均値(L,_平均値), 分散値(L,_分散値), writef('個数 = %t, 平均値 = %t, 分散値 = %t\n',[_個数,_平均値,_分散値]). 平均値([],N,S,M) :- M is S / N,!. 平均値([A|R],N,S,M) :- S1 is S + A, 平均値(R,N,S1,M). 平均値(L,M) :- length(L,N), 平均値(L,N,0.0e+00,M). 分散値(L,V) :- length(L,N), 平均値(L,M), 分散値(L,N,M,0.0e+00,V). 分散値([],N,M,S,V) :- V is S / N,!. 分散値([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散値(R,N,M,S2,V). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/470 # # [1] 授業単元:ファイルから読み込んだ数値の集計 # [2] 問題文(含コード&リンク): # ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする。 # そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を画面に表示するプログラムを作成しなさい。 # 'ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする。そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を画面に表示する' :- 'ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする'(_20個の数値ならび), 'そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を'(_20個の数値ならび,_最大値,_最小値,_平均値), 画面に表示する(_最大値,_最小値,_平均値). 'ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする'(_20個の数値ならび) :- get_lines('num1.txt',LL), findall(V,( append(_,[Line|_],LL), atom_to_term(Line,V,_)), _20個の数値ならび). 'そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を画面に表示する'(_20個の数値ならび,_最大値,_最小値,_平均値) :- 最大値(_20個の数値ならび,_最大値), 最小値(_20個の数値ならび,_最小値), 平均値(_20個の数値ならび,_平均値). 画面に表示する(_最大値,_最小値,_平均値) :- writef('最大値 = %t, 最小値 = %t, 平均値 = %t\n',[_最大値,_最小値,_平均値]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最大値([A|R],X) :- 最大値_1(R,A,X) . 最大値_1([],X,X) :- !. 最大値_1([A|R],B,X) :- A @> B,!, 最大値_1(R,A,X). 最大値_1([_|R],A,X) :- 最大値_1(R,A,X). 最小値([A|R],X) :- 最小値_1(R,A,X). 最小値_1([A|R],B,X) :- A @> B,!, 最小値_1(R,B,X). 最小値_1([A|R],_,X) :- !,最小値_1(R,A,X). 最小値_1([],X,X). 平均値(L,M) :- length(L,N), 平均値(L,N,0.0e+00,M). 平均値([],N,S,M) :- M is S / N,!. 平均値([A|R],N,S,M) :- S1 is S + A, 平均値(R,N,S1,M). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/470 # # [1] 授業単元:ファイルから読み込んだ数値の集計 # [2] 問題文(含コード&リンク): # ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする。 # そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を画面に表示するプログラムを作成しなさい。 # 'ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする。そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を画面に表示する' :- 'ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする'(_20個の数値ならび), 'そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を'(_20個の数値ならび,_最大値,_最小値,_平均値), 画面に表示する(_最大値,_最小値,_平均値). 'ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする'(_20個の数値ならび) :- get_lines('num1.txt',LL), findall(V,( append(_,[Line|_],LL), atom_to_term(Line,V,_)), _20個の数値ならび). 'そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を画面に表示する'(_20個の数値ならび,_最大値,_最小値,_平均値) :- 最大値(_20個の数値ならび,_最大値), 最小値(_20個の数値ならび,_最小値), 平均値(_20個の数値ならび,_平均値). 画面に表示する(_最大値,_最小値,_平均値) :- writef('最大値 = %t, 最小値 = %t, 平均値 = %t\n',[_最大値,_最小値,_平均値]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最大値([A|R],X) :- 最大値_1(R,A,X) . 最大値_1([],X,X) :- !. 最大値_1([A|R],B,X) :- A @> B,!, 最大値_1(R,A,X). 最大値_1([_|R],A,X) :- 最大値_1(R,A,X). 最小値([A|R],X) :- 最小値_1(R,A,X). 最小値_1([A|R],B,X) :- A @> B,!, 最小値_1(R,B,X). 最小値_1([A|R],_,X) :- !,最小値_1(R,A,X). 最小値_1([],X,X). 平均値(L,M) :- length(L,N), 平均値(L,N,0.0e+00,M). 平均値([],N,S,M) :- M is S / N,!. 平均値([A|R],N,S,M) :- S1 is S + A, 平均値(R,N,S1,M). % 以下のサイトは # 出典:: 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/342 # # ごめんなさい。よろしくお願いします。 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という # 名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理と、 # 続いてそのファイルを開いてデータを読み込み、指定した番号の人のデータを # 以下のように表示する処理をするプログラムを作りなさい。 # (実行後meibo.txt の中身は # # 1 # 168.000000 # 55.000000 # 2 # 170.000000 # 66.000000 # 3 # 158.000000 # 45.000000 # # と書かれている) # # 実行例です # http://ime.nu/uproda.2ch-library.com/387866eaw/lib387866.jpg # # '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理と、続いてそのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する' :- '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理', 続いて, 'そのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する'. '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理' :- '学籍番号(整数)、身長(実数)、体重(実数)を入力すると'(_学籍番号・身長・体重ならび), 'meibo.txt という名前のファイルを作り'(Outstream), 'その中に学籍番号、身長、体重を記録する'(Outstream,_学籍番号・身長・体重ならび),!. そのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する :- そのファイルを開いてデータを読み込み(_データ), 指定した番号の人のデータを以下のように表示する(_データ). '学籍番号(整数)、身長(実数)、体重(実数)を入力すると'(_学籍番号・身長・体重ならび) :- 登録人数を得る(_登録人数), 学籍番号・身長・体重ならびを形作る(_学籍番号・身長・体重ならび,_登録人数), 学籍番号・身長・体重ならびを得る(_学籍番号・身長・体重ならび). 学籍番号・身長・体重ならびを形作る(_学籍番号・身長・体重ならび,_登録人数) :- length(_学籍番号・身長・体重ならび,_登録人数). 学籍番号・身長・体重ならびを得る([]). 学籍番号・身長・体重ならびを得る([[_学籍番号・身長・体重ならび]|R]) :- 学籍番号を得る(_学籍番号), 身長を得る(_身長), 体重を得る(_体重), 学籍番号・身長・体重ならびを得る(R). 'meibo.txt という名前のファイルを作り'(Outstream) :- open('meibo.txt',write,Outstream),!. 'その中に学籍番号、身長、体重を記録する'(Outstream,_学籍番号・身長・体重ならび) :- append(_,[[_学籍番号,_身長,_体重]|R],_学籍番号・身長・体重ならび), writef(Outstream,'%t\n%t\n%t\n',[_学籍番号,_身長,_体重]), R = [], close(Outstream),!. そのファイルを開いてデータを読み込み(_データ) :- get_lines('meibo.txt',_データ). 指定した番号の人のデータを以下のように表示する(_データ) :- 指定した番号の人(_学籍番号), 指定した番号の人のデータを以下のように表示する(_学籍番号,_データ),!. 指定した番号の人のデータを以下のように表示する('',_) :- !. 指定した番号の人のデータを以下のように表示する(end_of_file,_) :- !. 指定した番号の人のデータを以下のように表示する(_学籍番号,_データ) :- append(_,[[_学籍番号,_身長,_体重]|_],_データ), writef('%t %t %t\n',[_学籍番号,_身長,_体重]), 指定した番号の人(_学籍番号2), 指定した番号の人のデータを以下のように表示する(_学籍番号2,_データ),!. 指定した番号の人(_学籍番号) :- write('検索する学籍番号を入れてください : '), get_integer(_学籍番号),!. 登録人数を得る(_登録人数) :- write('最初に登録人数を決めてください : '), get_line(Line), 登録人数入力診断(Line,_登録人数),!. 登録人数入力診断(Line,_登録人数) :- atom_to_term(Line,_登録人数,_), integer(_登録人数), _登録人数 >= 1, _登録人数 =< 10,!. 登録人数入力診断(Line,_登録人数) :- 再入力指示(Line,[登録人数]). 学籍番号を得る(_学籍番号) :- repeat, write('学籍番号(整数) : '), get_line(Line), 学籍番号入力検査(Line,_学籍番号),!. 学籍番号入力検査(Line,_学籍番号) :- 再入力指示(Line,学籍番号), fail. 身長を得る(_身長) :- repeat, write('身長(実数) : '), get_line(Line), 学籍番号入力検査(Line,_身長),!. 体重を得る(_体重) :- repeat, write('体重(実数) : '), get_line(Line), 学籍番号入力検査(Line,_体重),!. 学籍番号入力検査(Line,_学籍番号) :- atom_to_term(Line,_学籍番号,_), integer(_学籍番号),!. 学籍番号入力検査(Line,_学籍番号) :- 再入力指示(Line,学籍番号), fail. 身長入力検査(Line,_身長) :- atom_to_term(Line,_身長,_), float(_身長),!. 身長入力検査(Line,_身長) :- 再入力指示(Line,身長), fail. 体重入力検査(Line,_体重) :- atom_to_term(Line,_体重,_), float(_体重),!. 体重入力検査(Line,_体重) :- 再入力指示(Line,体重), fail. 再入力指示(Line,_項目名) :- writef('入力された %t からは%tが得られません。再入力をお願いします。\n',[Line,_項目名]). 続いて :- true. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/341 # # [よろしくお願いします・・(´・ω・`) # # 1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 整数aとbを入力すると、mylife.txt という名前のファイルを作り、その中にa+bの計算結果を記録する処理と、 # 続いてそのファイルを開いてデータを読み込み、ディスプレイ上に表示する処理をするプログラムを作りなさい。 # (実行後mylife.txt の中身は # # 126 # # とだけ書かれている) # # http://ime.nu/uproda.2ch-library.com/387865yc9/lib387865.jpg # 実行例です。 # # http://ime.nu/uproda.2ch-library.com/387863Wqm/lib387863.jpg # ここまで出来て居ます # '整数aとbを入力すると、mylife.txt という名前のファイルを作り、その中にa+bの計算結果を記録する処理と、続いてそのファイルを開いてデータを読み込み、ディスプレイ上に表示する処理をする' :- '整数aとbを入力すると、mylife.txt という名前のファイルを作り、その中にa+bの計算結果を記録する', 続いて, _そのファイル = 'mylife.txt', そのファイルを開いてデータを読み込み、ディスプレイ上に表示する(_そのファイル). '整数aとbを入力すると、mylife.txt という名前のファイルを作り、その中にa+bの計算結果を記録する' :- 整数aとbを入力すると(_a,_b), 'mylife.txt という名前のファイルを作り'(Outstream), 'a+bの計算結果を'(_a,_b,_計算結果), 記録する(Outstream). 整数aとbを入力すると(_a,_b) :- 整数aを入力する(_a), 整数bを入力する(_b). 整数aを入力する(_a) :- write('整数を入力してください : '), get_integer(_a). 整数bを入力する(_b) :- write('整数を入力してください : '), get_integer(_b). 'mylife.txt という名前のファイルを作り'(Outstream) :- open('mylife.txt',write,Outstream),!. 'a+bの計算結果を'(_a,_b,_計算結果) :- _計算結果 is _a + _b. 記録する(Outstream,_計算結果) :- writef(Outstream,'%t\n',[_計算結果]), close(Outstream). 続いて :- true. そのファイルを開いてデータを読み込み、ディスプレイ上に表示する(_そのファイル) :- そのファイルを開いて(_そのファイル,Instream), データを読み込み(Instream,_データ), ディスプレイ上に表示する(Instream,_データ). そのファイルを開いて(_そのファイル,Instream) :- open(_そのファイル,read,Instream). データを読み込み(Instream,_データ) :- get_lines(Instream,_データ), close(Instream). ディスプレイ上に表示する(_データ) :- put_lines(_データ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_lines(Stream,Lines) :- is_stream(Stream), get_chars(Stream,Chars), chars_lines(Chars,Lines),!. get_lines(File,Lines) :- atom(File), exitst(File,read), get_chars(File,L), chars_lines(L,Lines),!. get_chars(Input,end_of_file,[]) :- !. get_chars(Input,X,[X|R]) :- get_char(Input,Y), get_chars(Input,Y,R). get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists(File_1,read), open(File_1,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),!. % *** user: chars_lines / 3 *** 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). % *** user: chars_lines / 2 *** chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), concat_atom(U,A), chars_lines(R,R2). % *** user: put_lines / 2 *** put_lines(_,[]) :- !. put_lines(Output,[Line|R]) :- is_stream(Output), write(Output,Line), write(Output,'\n'), put_lines(Output,R),!. put_lines(File,L) :- \+(is_stream(File)), open(File,write,Output), put_lines(Output,L), close(Output),!. % *** user: put_lines / 1 *** put_lines(Lines) :- append(_,[Line|R],Lines), write_formatted('%t\n',[Line]), R = [],!. % *** user: get_integer / 2 *** get_integer(Input,N) :- get_line(Input,Line), get_integer_1(Input,Line,N),!. % *** user: get_integer / 1 *** get_integer(N) :- get_line(Line), get_integer_1(Line,N),!. % *** user: get_integer_1 / 3 *** get_integer_1(_,end_of_file,_) :- !, fail. get_integer_1(Input,Line,N) :- atom_to_term(Line,N,_), integer(N),!. get_integer_1(Input,_,N) :- get_line(Input,Line), get_integer_1(Input,Line,N) . % *** user: get_integer_1 / 2 *** get_integer_1(end_of_file,_) :- !,fail. get_integer_1(Line,N) :- atom_to_term(Line,N,_), integer(N),!. get_integer_1(_,N) :- get_line(Line), get_integer_1(Line,N). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/269 # # # [1] 授業単元:Cプログラミング # [2] 問題文:2つの正の整数値を入力させ四則演算の結果を表示させる。 # 2つの正の整数値を入力させ四則演算の結果を表示させる :- 2つの正の整数値を入力させ([N1,N2]), 四則演算の結果を(N1,N2,_四則演算の結果), 表示させる(_四則演算の結果). 2つの正の整数値を入力させ(L) :- length(L,_要素数), 2つ(_要素数),!. 2つの正の整数値を入力させ([_正の整数値|R]) :- 正の整数値を入力させ(_正の整数値), 2つの正の整数値を入力させ(R). 2つ(2). 正の整数値を入力させ(_正の整数値) :- write('正の整数値を入力してください : '), get_line(Line), 正の整数値診断(Line,_正の整数値),!. 正の整数値診断(Line,_正の整数値) :- atom_to_term(Line,_正の整数値,_), integer(_正の整数値), _正の整数値 > 0,!. 正の整数値診断(Line,_正の整数値) :- writef('入力された %t からは正の整数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. 四則演算の結果を(N1,N2,_四則演算の結果) :- findall([_演算,_式],四則演算(_演算,_式),_四則演算の結果). 四則演算(加算,N1 + N2 = _演算結果) :- _演算結果 is N1 + N2. 四則演算(減算,N1 - N2 = _演算結果) :- _演算結果 is N1 - N2. 四則演算(乗算,N1 * N2 = _演算結果) :- _演算結果 is N1 * N2. 四則演算(除算,N1 / N2 = _演算結果) :- _演算結果 is N1 + N2. 表示させる(_四則演算の結果) :- append(_,[[_演算,_式]|R],_四則演算の結果), writef('%t %t\n',[_演算,_式]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/270 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): # 要素数10の整数型配列を作成し、初期化の時に10個の任意の数値を代入して置く。 # 1つの整数を入力させ、その整数が、配列の中に何個あるか、または、存在しないかを表示するプログラムを作成しなさい。 # 例:配列が{9, 1, 2, 3, 4, 5, 6, 7, 8, 9}のとき # 1を入力したら、「1個あります」→終了 # 9を入力したら、「2個あります」→終了 # 10を入力したら、「存在しません」→終了 # '要素数10の整数型配列を作成し、初期化の時に10個の任意の数値を代入して置く。1つの整数を入力させ、その整数が、配列の中に何個あるか、または、存在しないかを表示する' :- 要素数10の整数型配列を作成し(L), 初期化の時に10個の任意の数値を代入して置く(L), 1つの整数を入力させ(_整数), その整数が、配列の中に何個あるか、または、存在しないか(_整数,L,_診断), 表示する(_診断). 要素数10の整数型配列を作成し(L) :- length(L,10). 初期化の時に10個の任意の数値を代入して置く([]). 初期化の時に10個の任意の数値を代入して置く([N|R]) :- N is random(20), 初期化の時に10個の任意の数値を代入して置く(R). その整数が、配列の中に何個あるか、または、存在しないか(_整数,L,_何個) :- findall(1,append(_,[_整数|_],L),L2), length(L2,Len), Len > 0, 全角整数表現(Len,_全角整数表現), concat_atom([_全角整数表現,個あります],_何個),!. その整数が、配列の中に何個あるか、または、存在しないか(_整数,L,存在しません). 1つの整数を入力させ(_整数) :- write('1つの整数を入力してください : '), get_line(Line), 整数入力診断(Line,_整数),!. 1つの整数を入力させ(_整数) :- 1つの整数を入力させ(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t から整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 表示する(_診断) :- writef('%t\n',[_診断]). 全角整数表現(_整数値,_全角整数表現) :- number_chars(_整数値,Chars), findall(_全角数字,( append(_,[A|_],Chars), 半角数字全角数字(A,_全角数字)), L), concat_atom(L,_全角整数表現). 半角数字全角数字('0',0). 半角数字全角数字('1',1). 半角数字全角数字('2',2). 半角数字全角数字('3',3). 半角数字全角数字('4',4). 半角数字全角数字('5',5). 半角数字全角数字('6',6). 半角数字全角数字('7',7). 半角数字全角数字('8',8). 半角数字全角数字('9',9). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/235 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # キーボードから西暦を表す4桁の数字を数値として読み込み、閏年かどうか判定する。 # 入力された西暦年が1000年以上4000年いかでなければ、その旨を指示してプログラムを終了する。  # 閏年の条件:4で割り切れるが100で割り切れない年を閏年とする。ただし400で割り切れる年を閏年とする。 # それ以外の年は平年とする。 # # キーボードから西暦を表す4桁の数字を数値として読み込み、閏年かどうか判定する。 :- キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字), 閏年かどうか判定する(_4桁の数字,_閏年か否か). キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字) :- write('西暦を表す4桁の数字を入力してください : '), 西暦を表す4桁の数字を数値として読み込み(_4桁の数字),!. キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字) :- キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字). 西暦を表す4桁の数字を数値として読み込み(_4桁の数字) :- get_line(Line), 西暦を表す4桁の数字診断(Line,_4桁の数字),!. 西暦を表す4桁の数字診断(Line,_4桁の数字) :- atom_to_term(Line,_4桁の数字,_), integer(_4桁の数字), 西暦範囲検査(_4桁の数字),!. 西暦を表す4桁の数字診断(Line,_4桁の数字) :- atom_to_term(Line,_4桁の数字,_), \+(integer(_4桁の数字)), writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]),!,fail. 西暦を表す4桁の数字診断(Line,_) :- fail. 西暦範囲検査(_4桁の数字) :- _4桁の数字 >= 1000, _4桁の数字 =< 4000,!. 西暦範囲検査(_4桁の数字) :- writef('入力された数字 %t は 1000以上4000以下の範囲にありません。再入力をお願いします。\n',[_4桁の数字]),!, fail. 閏年かどうか判定する(_4桁の数字,閏年) :- 閏年(_4桁の数字),!. 閏年かどうか判定する(_,閏年ではない). 閏年(_年,閏年) :- 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/1307166756/119 # # [1] 授業単元:配列の並び替え # [2] 問題文(含コード&リンク): # 次の処理を順に行うプログラムを作成しなさい。 # 要素数5の整数型配列に、すべて異なる整数を入力させる。 # 入力された順に、配列の中身を表示しなさい。 # 次に、配列の中身を入れ替え、昇順に並び替えなさい。 # 並び替えた配列の中身を表示しなさい。 # '要素数5の整数型配列に、すべて異なる整数を入力させる。入力した順に、配列の中身を表示する。次に、配列の中身を入れ替え、昇順に並び替える。 並び替えた配列の中身を表示する' :- 要素数5の整数型配列に、すべて異なる整数を入力させる(L), 入力された順に、配列の中身を表示する(L), 配列の中身を入れ替え、昇順に並び替える(L,L2), 並び替えた配列の中身を表示する(L2). '要素数5の整数型配列に、すべて異なる整数を入力させる'(_要素数5の整数ならび) :- length(_要素数5の整数ならび,5), '要素数5の整数型配列に、すべて異なる整数を入力させる'([],_要素数5の整数ならび). '要素数5の整数型配列に、すべて異なる整数を入力させる'([],[]). '要素数5の整数型配列に、すべて異なる整数を入力させる'(L1,[N|R]) :- length([_|L1],Nth), writef('整数[%t番目]を入力してください : ',[Nth]), get_line(Line), 整数入力検査(Line,L1,N),!. '要素数5の整数型配列に、すべて異なる整数を入力させる'(L1,L) :- '要素数5の整数型配列に、すべて異なる整数を入力させる'(L1,L). 整数入力検査(Line,L1,N) :- atom_to_term(Line,N,_), integer(N), \+(append(_,[N|_],L1)),!. 整数入力検査(Line,L1,N) :- \+(atom_to_term(Line,N,_)), !, writef('入力された %t からは整数を得られません。再入力をお願いします。\n',[Line]), fail. 整数入力検査(Line,L1,N) :- atom_to_term(Line,N,_), append(_,[N|_],L1), writef('入力された %t は既に入力があります。再入力をお願いします。\n',[N]), fail. 入力された順に、配列の中身を表示する(L) :- concat_atom(L,' ',S), writef('%t\n',[S]),!. 配列の中身を入れ替え、昇順に並び替える([],[]) :- !. 配列の中身を入れ替え、昇順に並び替える([A],[A]) :- !. 配列の中身を入れ替え、昇順に並び替える(L1,[A|R]) :- append(L0,[A|R0],L1), append(L0,R0,L2), min(L2,B), B @>= A, 配列の中身を入れ替え、昇順に並び替える(L2,R). 並び替えた配列の中身を表示する(L) :- concat_atom(L,' ',S), writef('%t\n',[S]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/13 # # [1] 授業単元:繰り返し・条件分岐 # [2] 問題文(含コード&リンク): # 3以上40未満の整数Nを入力したとき、「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画するプログラムを作成しなさい。 # 例: 3 # *** # * * # *** # '3以上40未満の整数Nを入力したとき、「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する' :- '3以上40未満の整数Nを入力したとき'(_N), '「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する'(_N). '3以上40未満の整数Nを入力したとき'(_N) :- write('3以上40未満の整数を入力してください : '), get_line(Line), '3以上40未満の整数Nを入力診断'(Line,_N),!. '3以上40未満の整数Nを入力したとき'(_N) :- '3以上40未満の整数Nを入力したとき'(_N). '3以上40未満の整数Nを入力診断'(Line,_N) :- atom_to_term(Line,_N,_), integer(_N), _N >= 3, _ < 40,!. '3以上40未満の整数Nを入力診断'(Line,_N) :- writef('入力された %t からは3以上40未満の整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. '「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する'(_N) :- 一辺の長さがNの(_N,LL), 中を塗りつぶさない正方形を描画する(LL). 一辺の長さがNの(_N,LL) :- length(LL,_N), findall(L,( append(_,[L|_],LL), length(L,_N)), LL),!. 中を塗りつぶさない正方形を描画する([L|R]) :- all(L,'*'), 中を塗りつぶさいない正方形を(R), 描画する([L|R]). 中を塗りつぶさない正方形を([L]) :- all(L,'*'),!. 中を塗りつぶさない正方形を([['*'|R1]|R]) :- last(R1,'*'), 変数を空白に変換(R1,' '), 中を塗りつぶさない正方形を(R). 変数を空白に変換([]) :- !. 変数を空白に変換([' '|R]) :- 変数を空白に変換(R),!. 変数を空白に変換([_|R]) :- 変数を空白に変換(R). 描画する([]). 描画する([L|R]) :- concat_atom(L,S), writef('%t\n',[S]), 描画する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/13 # # [1] 授業単元:繰り返し・条件分岐 # [2] 問題文(含コード&リンク): # 3以上40未満の整数Nを入力したとき、「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画するプログラムを作成しなさい。 # 例: 3 # *** # * * # *** # '3以上40未満の整数Nを入力したとき、「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する' :- '3以上40未満の整数Nを入力したとき'(_N), '「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する'(_N). '3以上40未満の整数Nを入力したとき'(_N) :- write('3以上40未満の整数を入力してください : '), get_line(Line), '3以上40未満の整数Nを入力診断'(Line,_N),!. '3以上40未満の整数Nを入力したとき'(_N) :- '3以上40未満の整数Nを入力したとき'(_N). '3以上40未満の整数Nを入力診断'(Line,_N) :- atom_to_term(Line,_N,_), integer(_N), _N >= 3, _ < 40,!. '3以上40未満の整数Nを入力診断'(Line,_N) :- writef('入力された %t からは3以上40未満の整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. '「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する'(_N) :- 一辺の長さがNの(_N,LL), 中を塗りつぶさない正方形を描画する(LL). 一辺の長さがNの(_N,LL) :- length(LL,_N), findall(L,( append(_,[L|_],LL), length(L,_N)), LL),!. 中を塗りつぶさない正方形を描画する([L|R]) :- all(L,'*'), 中を塗りつぶさいない正方形を(R), 描画する([L|R]). 中を塗りつぶさない正方形を([L]) :- all(L,'*'),!. 中を塗りつぶさない正方形を([['*'|R1]|R]) :- last(R1,'*'), 変数を空白に変換(R1,' '), 中を塗りつぶさない正方形を(R). 変数を空白に変換([]) :- !. 変数を空白に変換([' '|R]) :- 変数を空白に変換(R),!. 変数を空白に変換([_|R]) :- 変数を空白に変換(R). 描画する([]). 描画する([L|R]) :- concat_atom(L,S), writef('%t\n',[S]), 描画する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/894 # # [1] 授業単元: Cプログラミング1 # [2] 問題文:2つの n 次元ベクトル a,b の内積を求めるプログラムを作成せよ。尚、n の個数は未定であるので、動的メモリを利用せよ。 # (入力例) # 何個入力しますか? : 5 # a input num[0] : 12.3 # a input num[1] : 5.6 # a input num[2] : 7.89 # a input num[3] : 9.51 # a input num[4] : 62.7 # b input num[0] : 0.12 # b input num[1] : 34.56 # b input num[2] : 7.89 # b input num[3] : 75.3 # b input num[4] : 86.1 # (出力) # inner product : 6371.837100 # # '2つの n 次元ベクトル a,b の内積を求める' :- 'n 次元ベクトルを得る'(_n), '2つの n 次元ベクトル a,b を入力する'(_n,_a,_b), ベクトルの内積(_a,_b,_内積), 内積を表示する(a,_a,b,_b,_内積). 'n 次元ベクトルを得る'(_n) :- write('何次元のベクトルを入力しますか? : '), get_integer(_n),!. '2つの n 次元ベクトル a,b を入力する'(_n,_a,_b) :- 'n 次元ベクトルを入力する'(_n,a,_a), 'n 次元ベクトルを入力する'(_n,b,_b),!. 'n 次元ベクトルを入力する'(_n,_ベクトル名,_ベクトル) :- length(_ベクトル,_n), writef('%t次元ベクトル%tの入力 ',[_n,_ベクトル名]), findall([V],( append(L0,[_|_],_ベクトル), length([_|L0],Nth), 値の入力(Nth,_n,V)), _ベクトル),!. 値の入力(Nth,_n,V) :- writef('[%t-%t] : ',[Nth,_n]), get_line(Line), 値の入力診断(Line,V),!. 値の入力(Nth,_n,V) :- 値の入力(Nth,_n,V). 値の入力診断(Line,V) :- atom_to_term(Line,V,_), number(V),!. 値の入力診断(Line,V) :- writef('入力された %t からは適切な値が得られませんでした。再入力をお願いします。\n',[Line]), fail. ベクトルの内積([],[],0) :- !. ベクトルの内積([[A]|R1],[[B]|R2],X) :- ベクトルの内積(R1,R2,Y), X is Y + A * B. 内積を表示する(a,_a,b,_b,_内積) :- writef('ベクトル%t %t と ベクトル%t %t の内積は %t です\n',[a,_a,b,_b,_内積]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/874 # # [1] 授業単元: Cプログラミング1 # [2] 問題文(含コード&リンク): キーボードより整数 a を入力して、 a×a の2次元配列を動的メモリ確保し、その配列の中に a×a の九九の計算結果を代入し、その内容を表示するプログラムを作成せよ。 # (入力例) # input num : 3 # (出力) # 1 2 3 # 2 4 6 # 3 6 9 # # 'キーボードより整数 a を入力して、 a×a の2次元配列を動的メモリ確保し、その配列の中に a×a の九九の計算結果を代入し、その内容を表示する' :- 'キーボードより整数 a を入力して'(_a), 'a×a の2次元配列を動的メモリ確保し'(_a,LL), 'その配列の中に a×a の九九の計算結果を代入し'(_a,LL), その内容を表示する(_a,LL). 'キーボードより整数 a を入力して'(_a) :- write('input num : '), get_line(Line), 整数入力検査(Line,_a),!. 'キーボードより整数 a を入力して'(_a) :- 'キーボードより整数 a を入力して'(_a). 整数入力検査(Line,_a) :- atom_to_term(Line,_a,_), integer(_a), _a > 0,!. 整数入力検査(Line,_a) :- writef('入力された %t からは適切な整数が得られませんでした。再入力をお願いします\n',[Line]), fail. 'a×a の2次元配列を動的メモリ確保し'(_a,LL) :- length(LL,_a), findall(L,( append(_,[L|_],LL), length(L,_a)), LL). 'その配列の中に a×a の九九の計算結果を代入し'(_a,LL) :- findall(L,( append(L0,[L|_],LL), findall(V,( append(L01,[V|_],L), ならびの掛け算([_|L0],[_|L01],LX), length(LX,V)), L)), LL). ならびの掛け算(L1,L2,LX) :- findall(L2,( append(_,[_|_],L1)), LL), flat(LL,LX). その内容を表示する(_a,LL) :- 表示パターンを生成する(_a,_表示パターン), append(_,[N|R],L), writef(_表示パターン,[N]), R = []. その内容を表示する(_a,LL) :- 表示パターンを生成する(_a,_表示パターン), append(_,[N|R],L), writef(_表示パターン,[N]), R = []. 表示パターンを生成する(_a,_表示パターン) :- length(L,_a), all(L,'%t '), append(L,['\n'],L2), concat_atom(L2,_表示パターン),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/555 # # 内容: # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 正の整数を入力したとき、その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と表示するプログラムを作成しなさい # 入力した値が0または負の整数であれば、繰り返し再入力させるようにプログラムを作成すること # '正の整数を入力したとき、その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と表示する' :- '正の整数を入力する'(_1以上の正の整数), その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と(_1以上の正の整数,_診断), 表示する(_診断). 正の整数を入力する(_1以上の正の整数) :- write('1以上の正の整数を入力してください : '), get_line(Line), 正の整数入力診断(Line,_1以上の正の整数),!. 正の整数を入力する(_1以上の正の整数) :- 正の整数を入力する(_1以上の正の整数). 正の整数入力診断(Line,_1以上の正の整数) :- atom_to_term(Line,_1以上の正の整数,_), integer(_1以上の正の整数), _1以上の正の整数 >= 1,!. 正の整数入力診断(Line,_1以上の正の整数) :- writef('入力された %t からは1以上の正の整数が得られません。再入力をお願いします。\n',[Line]), fail. その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と(_その数値,_診断) :- _その数値 > 0, Y is _その数値 - 1, 階乗(Y,Z), 0 is (Z + 1) mod _その数値,!. その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と(_その数値,素数ではありません) :- _その数値 > 0, Y is _その数値 - 1, 階乗(Y,Z), \+(0 is (Z + 1) mod _その数値),!. 階乗(M,N,1) :- M > N, !. 階乗(M,N,X) :- M2 is M + 1, 階乗(M2,N,Y), X is M * Y. 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1, 階乗(N2,Y), X is N * Y,!. 表示する(_診断) :- writef('%t\n',[_診断]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/423 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 3つの異なる値の実数を入力させる。それがどんな順番で入力されたとしても、昇順に並び替えて表示するプログラムを作成しなさい # なお、プログラムの末尾には、このプログラムが正しいことを確認するためには、何パターンのデータを試す必要があるかを考え、必要なテストを行った結果を記録しなさい # 3つの異なる値の実数を入力させる。それがどんな順番で入力されたとしても、昇順に並び替えて表示する :- 3つの異なる値の実数を入力させる(V1,V2,V3), '3sort'(V1,V2,V3,_1,_2,_3), writef('%t %t %t\n',[_1,_2,_3]). '3sort'(_1,_2,_3,_1,_2,_3) :- _1 =< _2,_2 =< _3,!. '3sort'(_1,_2,_3,_1,_3,_2) :- _1 =< _3,_3 =< _2,!. '3sort'(_1,_2,_3,_2,_1,_3) :- _2 =< _1,_1 =< _3,!. '3sort'(_1,_2,_3,_2,_3,_1) :- _2 =< _3,_3 =< _1,!. '3sort'(_1,_2,_3,_3,_1,_2) :- _3 =< _1,_1 =< _2,!. '3sort'(_1,_2,_3,_3,_2,_1) :- _3 =< _2,_2 =< _1,!. 3つの異なる値の実数を入力させる(V1,V2,V3) :- 実数を入力する(1,[],V1), 実数を入力する(2,[V1],V2), 実数を入力する(3,[V1,V2],V3),!. 実数を入力する(_N番目,L,V) :- writef('実数を入力してください[%t番目] : ',[_N番目]), get_line(Line), 実数入力検査(Line,L,V),!. 実数を入力する(_N番目,L,V) :- 実数を入力する(_N番目,L,V). 実数入力検査(Line,L,_実数) :- atom_to_term(Line,_実数,_), 実数入力検査のニ(Line,L,_実数),!. 実数入力検査のニ(Line,L,_実数) :- float(_実数), \+(append(_,[_実数|_],L)),!. 実数入力検査のニ(Line,L,_実数) :- \+(float(_実数)),!, writef('入力された %t からは実数値が得られません。\n',[Line]), fail. 実数入力検査のニ(Line,L,_実数) :- float(_実数),!, append(_,[_実数|_],L), writef('実数 %t は既に入力されています\n',[_実数]), fail. テスト :- テストパターン(N,_,[V1,V2,V3],L,[X1,X2,X3]), L = [V1,V2,V3], \+('3sort'(V1,V2,V3,X1,X2,X3)), writef('no%t, Error %t,%t,%t\n',[V1,V2,V3]), fail. テスト. テストパターン(1,(1 < 2,2 < 3),[1.0,2.0,3.0],[A,B,C],[A,B,C]). テストパターン(2,(1 < 3,3 < 2),[1.0,3.0,2.0],[A,C,B],[A,B,C]). テストパターン(3,(2 < 1,1 < 3),[2.0,1.0,3.0],[B,A,C],[A,B,C]). テストパターン(4,(2 < 3,3 < 1),[2.0,3.0,1.0],[B,C,A],[A,B,C]). テストパターン(5,(3 < 1,1 < 2),[3.0,1.0,2.0],[C,A,B],[A,B,C]). テストパターン(6,(3 < 2,2 < 1),[3.0,2.0,1.0],[C,B,A],[A,B,C]). テストバターン(7,(1 = 2,2 < 3),[1.0,1.0,3.0],[A,A,C],[A,A,C]). テストパターン(8,(1 = 3,3 < 2),[1.0,1.0,2.0],[A,A,B],[A,B,A]). テストパターン(9,(2 = 3,3 < 1),[2.0,2.0,1.0],[B,B,A],[A,B,B]. テストパターン(10,(1 < 2,2 = 3),[1.0,2.0,2.0],[A,B,B],[A,B,B]). テストパターン(11,(2 < 1,1 = 3),[2.0,1.0,1.0],[B,A,A],[A,B,B]). テストパターン(12,(3 < 2,2 = 1),[3.0,1.0,1.0],[C,A,A],[A,A,C]). テストパターン(13,(1 = 2,2 = 3),[A,A,A],[A,A,A]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/276 # # [1] 授業単元:繰り返し処理 # [2] 問題文: # 五者択一の自作の問題文章を表示させ、整数入力を受けつけ、正解・不正解の判定を行う。 # ただし、正解が入力されるまで、「不正解」と表示した後、同じ問題を正解となるまで繰り返し表示し、回答を入力させる。 # 問題が2問である上記のようなプログラムを作成しなさい。 # # 五者択一の自作の問題文章を表示させ、整数入力を受けつけ、正解・不正解の判定を行う :- 五者択一の自作問題を表示([]), 整数入力を受けつけ([],_整数), 五者択一の自作の問題文章を表示させ、整数入力を受けつけ、正解・不正解の判定を行う(_整数,[]). 五者択一の自作の問題文章を表示させ、整数入力を受けつけ、正解・不正解の判定を行う(_整数,L) :- 正解・不正解の判定を行う(_整数,正解),!. 五者択一の自作の問題文章を表示させ、整数入力を受けつけ、正解・不正解の判定を行う(_整数,L) :- 五者択一の自作問題を表示([_整数|L]), 整数入力を受けつけ([_整数|L],_整数2), 五者択一の自作の問題文章を表示させ、整数入力を受けつけ、正解・不正解の判定を行う(_整数2,[_整数|L]). 自作問題(3,'キシュウローレルは桜花賞馬にはなれなかった'). 自作問題(5,'ニホンピロエースは1966年の皐月賞馬である'). 自作問題(1,'タニノハローモアは阪神三歳ステークスで一番人気だった'). 自作問題(2,'ダコタはNHK杯の勝ち馬だった'). 自作問題(4,'ヤマノオーはダービーでは同着の2着だった'). 五者択一の自作問題を表示(L) :- write('以下の文で正しくないものの文番号を入力しなさい\n'), append(_,[_番号|R],[1,2,3,4,5]), \+(append(_,[_番号|_],L)), 自作問題を表示(_番号), R = [],!. 自作問題を表示(_番号) :- 自作問題(_番号,_問題), writef('%t .. %t\n',[_番号,_問題]),!. 整数入力を受けつけ(L,_整数) :- write('整数 : '), get_line(Line), 整数入力を受けつけ診断(Line,L,_整数),!. 整数入力を受けつけ(L,_整数) :- 整数入力を受けつけ(L,_整数). 整数入力を受けつけ診断(Line,L,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), \+(append(_,[_整数|_],L)), _整数 >= 1, _整数 =< 5,!. 整数入力を受けつけ診断(Line,L,_整数) :- writef('入力された %t からは1~5の整数が得られません。再入力をお願いします。',[Line]), fail. 正解・不正解の判定を行う(_解答,正解) :- 正解(_解答),!. 正解・不正解の判定を行う(_解答,不正解). 正解(2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/236 # # [1]C言語初級課題 # [2]次のコードは、キーボードから0から9までの4つの数を # 受け取って小さい順から書き出すプログラムの未完成版である。 # コードを完成させなさい。fgetsでキーボードから文字列を受け取り、 # それをatoi関数で整数に変換し、0から9までの範囲にあるか確認し、 # 範囲にない場合は再入力を促し再入力させること。 # # #include <stdio.h> # #inckude <stdlib.h> # int main(void){ # char s[1024];//fgets関数に与える文字列バッファ # char *t;//fgets戻り値格納用 # int n;//atoi関数の戻り値格納用 # { # //この部分にコードを追加してコードを完成させてください。 # return(0); # } # [3] Windows 7/Microsoft SDK/C言語 # [4]5/31まで # [5]簡単な課題だそうですが、手こずってます。どうかよろしくお願いします。 # # キーボードから0から9までの4つの数を受け取って小さい順から書き出す :- length(L,4), キーボードから0から9までの4つの数を受け取って(L), 小さい順に(L,L1), 書きだす(L1). キーボードから0から9までの4つの数を受け取って([]). キーボードから0から9までの4つの数を受け取って([N|R]) :- get_char(A), atom_to_term(A,N,_), integer(N), N >= 0, N < 9, キーボードから0から9までの4つの数を受け取って(R). キーボードから0から9までの4つの数を受け取って(L) :- キーボードから0から9までの4つの数を受け取って(L). 小さい順に(L1,L2) :- 小さい順に(L1,[],L2). 小さい順に([],L,L) :- !. 小さい順に([N1|R1],[],L3) :- 小さい順に(R1,[N1],L3),!. 小さい順に([N1|R1],[N2|R2],L3) :- N1 =< N2, 小さい順に(R,[N1,N2|R2],L3). 小さい順に([N1|R1],[N2|R2],[N2|R3]) :- N1 > N2, 小さい順に([N1|R1],R2,R3). 書きだす([]) :- nl. 書きだす([N|R]) :- write(N), 書きだす(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/220 # # 全然わからなくて困ってます。よろしくお願いします。 # [1] 授業単元:実用プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力された2つの整数と演算番号(1〜4)に対して、ポインタを使って以下の処理をするプログラムを作りなさい。 # ただし、演算番号として1〜4以外の値が入力された場合は、"該当する番号がありません.確認して下さい" # と表示してプログラムを終了させることとする。 # (↓からプログラム実行例。_が後ろの数字に付いてる所はキーボードからの入力を表す) # # 2つの実数a,bを入力してください. # a=3_ # b=5_ # 計算の種類を選んでください. # 1:a+b # 2:a-b # 3:a*b # 4:a/b # ==>4_ # a/b=0.600000 # 'キーボードから入力された2つの整数と演算番号(1〜4)に対して、ポインタを使って以下の処理をする' :- write('a='), 'キーボードから整数を入力'(_a), write('b='), 'キーボードから整数を入力'(_b), write('計算の種類を選んでください\n'), write('1:a+b\n2:a-b\n3:a*b\n4:a/b\n'), write('==>'), '演算番号(1〜4)の取得'(_演算番号), 演算(_演算番号,_a,_b,_答え), writef('%t\n',[_答え]),!. 'キーボードから入力された2つの整数と演算番号(1〜4)に対して、ポインタを使って以下の処理をする'. 'キーボードから整数を入力'(_整数) :- get_line(Line), 'キーボードから整数を入力診断'(Line,_整数). 'キーボードから整数を入力'(_整数) :- 'キーボードから整数を入力'(_整数). 'キーボードから整数を入力診断'(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 'キーボードから整数を入力診断'(Line,_整数) :- writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]), fail. '演算番号(1〜4)の取得'(_演算番号) :- get_line(Line), '演算番号(1〜4)の取得診断'(Line,_演算番号). '演算番号(1〜4)の取得診断'(Line,_演算番号) :- atom_to_term(Line,_演算記号,_), integer(_演算記号), _演算記号 >= 1, _演算記号 =< 4. '演算番号(1〜4)の取得診断'(Line,_演算番号) :- write('該当する番号がありません.確認して下さい\n'), fail. 演算(1,_a,_b,_答え) :- _x is _a + _b, concat_atom([_a,'+',_b,'=',_x],_答え). 演算(2,_a,_b,_答え) :- _x is _a - _b, concat_atom([_a,'-',_b,'=',_x],_答え). 演算(3,_a,_b,_答え) :- _x is _a * _b, concat_atom([_a,'*',_b,'=',_x],_答え). 演算(4,_a,_b,_答え) :- _x is _a / _b, concat_atom([_a,'/',_b,'=',_x],_答え). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/288 # # sqlite v3.6.23.1で、 # comment (text) ,postedtime (int) という形式にて掲示板を作っているのですが、 # 「最新の5コメント、但し、24時間以内の投稿については最大50個まで」を求めたくて # # SELECT comment FROM mm ORDER BY postedtime DESC LIMIT 50 # UNION # SELECT comment FROM mm WHERE postedtime > $nowtime - 3600*24 ORDER BY ptime DESC LIMIT 50 # # としてみたのですが($nowtimeには今の時間を入れてます)、 # 1st ORDER BY term does not match in the result set というエラーが出ます。 # (union前後のクエリそれぞれ単独ではエラーは出ません) # # 欲しい結果を求めるにはどのように書けばいいのでしょうか? # # '最新の5コメント、但し、24時間以内の投稿については最大50個まで'(_テーブル,_現在の時刻,P) :- split(_現在の時刻,[' ','/','-',':','.'],[_年,_月,_日,_時,_分,_秒,_]), テーブル構造(_テーブル,時刻,N), findmax(M,テーブル構造(_テーブル,_,M),Max), length(L1,Max), nth1(N,L1,_時刻), P =.. [_テーブル|L1], 選択(P,_年,_月,_日,_時,_分,_秒,L), append(_,[_時刻|_],L), call(P). 選択(P,_年,_月,_日,_時,_分,_秒,L) :- findsetof(_時刻,( call(P), 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻)), L1), 要素切り取り(L1,L),!. 選択(P,_年,_月,_日,_時,_分,_秒,L) :- findall(_時刻,( call(P), 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻)), L1), 整列(L1,L2), 要素切り取り(L2,L),!. 選択(P,_,_,_,_,_,_,L) :- findall(_時刻,( call(P)), L1), 整列(L1,L2), length(L,5), append(_,L,L2),!. 要素切り取り(L1,L) :- length(L1,Length), Length >= 50, length(L,50), append(_,L,L1),!. 要素切り取り(L1,L1) :- length(L1,Length), Length >= 5, length < 50,!. 時刻が24時間以内(_年,12,31,_時,_分,_秒,_時刻) :- split(_時刻,['/','-',':','.'],[_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]), _年_1 is _年 + 1, [_年_1,1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,2,29,_時,_分,_秒,_時刻) :- うるう年(_年), [_年,3,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,2,28,_時,_分,_秒,_時刻) :- \+(うるう年(_年)), [_年,3,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,30,_時,_分,_秒,_時刻) :- append(_,[_月|_],[4,6,9,11]), _月_1 is _月 + 1, [_年,_月_1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,31,_時,_分,_秒,_時刻) :- append(_,[_月|_],[1,3,5,7,8,10]), _月_1 is _月 + 1, [_年,_月_1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻) :- split(_時刻,['/','-',':','.'],[_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]), _日_1 is _日 + 1, [_年,_月,_日_1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数) . うるう年(_年) :- 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/1305867431/113 # # 【質問テンプレ】 # [1]Cプログラミング # [2]10人の身長(150cm〜180cm)を任意にキーボードから入力し、 #   160cm以上の人数と未満の人数、およびそれらの平均値を求めよ。 # '10人の身長(150cm〜180cm)を任意にキーボードから入力し、160cm以上の人数と未満の人数、およびそれらの平均値を求める'(_160cm以上の人数,_160cm未満の人数,_160cm以上の平均,_160cm未満の平均) :- length(_10人の身長ならび), '10人の身長(150cm〜180cm)を任意にキーボードから入力し'(_10人の身長ならび), '160cm以上の人数と未満の人数、およびそれらの平均値を求める'(_10人の身長ならび,_160cm以上の人数,_160cm未満の人数,_160cm以上の平均,_160cm未満の平均). '10人の身長(150cm〜180cm)を任意にキーボードから入力し'([]) :- !. '10人の身長(150cm〜180cm)を任意にキーボードから入力し'([_身長|R]) :- get_line(Line), '10人の身長(150cm〜180cm)を'(Line,_身長), '10人の身長(150cm〜180cm)を任意にキーボードから入力し'(R),!. '10人の身長(150cm〜180cm)を任意にキーボードから入力し'(L) :- '10人の身長(150cm〜180cm)を任意にキーボードから入力し'(L). '10人の身長(150cm〜180cm)を'(Line,_身長) :- atom_to_term(Line,_身長,_), integer(_身長), _身長 >= 150, _身長 =< 180. '160cm以上の人数と未満の人数、およびそれらの平均値を求める'(_10人の身長ならび,_160cm以上の人数,_160cm未満の人数,_160cm以上の平均,_160cm未満の平均) :- '160cm以上の人数'(_10人の身長ならび,_160cm以上の人数), '160cm未満の人数'(_10人の身長ならび,_160cm未満の人数), '160cm以上の平均'(_10人の身長ならび,_160cm以上の平均), '160cm未満の平均'(_10人の身長ならび,_160cm未満の平均). '160cm以上の人数'(_10人の身長ならび,_160cm以上の人数) :- count((append(_,[_身長|_],_10人の身長ならび),_身長 >= 160),_160cm以上の人数). '160cm未満の人数'(_10人の身長ならび,_160cm未満の人数) :- count((append(_,[_身長|_],_10人の身長ならび),_身長 < 160),_160cm未満の人数). '160cm以上の平均'(_10人の身長ならび,_160cm以上の人数) :- findavg(_身長,( append(_,[_身長|_],_10人の身長ならび), _身長 >= 160), _160cm以上の平均). '160cm未満の平均'(_10人の身長ならび,_160cm未満の人数) :- findavg(_身長,( append(_,[_身長|_],_10人の身長ならび), _身長 < 160), _160cm未満の人数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/146 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   for文を用いて、下の実行結果のように、定価(price)を入力すると #   1〜9割引の価格(kakaku)を表示するプログラムを作成せよ # #   定価の入力:500 # 1割引=450 # 2割引=400 # 3割引=350 # 4割引=300 # 5割引=250 # 6割引=200 # 7割引=150 # 8割引=100 # 9割引=50 # # 'for文を用いて、下の実行結果のように、定価を入力すると1〜9割引の価格を表示する' :- 定価を入力(_定価), for(1,N,9), _割引率 is 0.5 * N, _価格 is _定価 * ( 1 - _割引率), writef('%t割引 = %t\n',[N,_価格]), N = 9. 定価を入力(_定価) :- write('定価を入力してください : '), get_line(Line), 定価入力診断(Line,_定価),!. 定価を入力(_定価) :- 定価を入力(_定価). 定価入力診断(Line,_定価) :- atom_to_term(Line,_定価,_), number(_定価), _定価 >= 0,!. 定価入力診断(Line,_定価) :- writef('入力された文字列 %t から定価に相応しい値を得られませんでした。再入力をお願いします\n',[Line]), fail. % % for/3とbetween/3の違いはbetween(Start,End,N)はEnd >= Startでなくてはならないのに % 対して % for/3はStart < Endが許される。この場合Nは降順に呼び出される。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/680 # # 1]授業単元:プログラミング # [2]問題文:自己参照型構造体を用いて、以下の処理をするプログラムを作成せよ。 # # 正の数入力→連結リストを辿り、初めて入力された数ならばカウンタを1増やす。同じ数が続けて入力されたらその数のカウンタをさらに1増やす。 # 負の数入力→負の数の絶対値と同じ回数入力された数のデータを削除(例えば、-3を入力し、それ以前に14が3回入力されていたら、それを削除) # 0を入力→データを出力して終了。 # # データ出力→終了の流れはどうにかなりましたが、それ以外で上手い発想が思いつきません。 # # http://ime.nu/codepad.org/yayuXIUa # # 期限は明日までです。 # # 正の数入力後連結リストを辿り、初めて入力された数ならばカウンタを1増やす。負の数入力後負の数の絶対値と同じ回数入力された数のデータを削除0を入力後データを出力して終了 :- 数入力(_数), 連結リストとカウンタを更新していく(_数,[],0,_連結リスト,_カウンタ), データを出力して終了(_連結リスト,_カウンタ),!. 連結リストとカウンタを更新していく(_数,L_1,_カウンタ_1,L,_カウンタ) :- 負の数が入力されたら負の数の絶対値と同じ回数入力された数のデータを削除して連結リストの最後に0を加える(_数,L_1,_カウンタ_1,L,_カウンタ),!. 連結リストとカウンタを更新していく(_数,L_1,_カウンタ_1,L,_カウンタ) :- 初めて入力された数ならばカウンタを1増やす(_数,L_1,_カウンタ_1,L_2,_カウンタ_2), 数入力(_数_2), 連結リストとカウンタを更新していく(_数_2,L_2,_カウンタ_3,L,_カウンタ). 連結リストとカウンタを更新していく(_数,L_1,_カウンタ_1,L,_カウンタ) :- \+(初めて入力された数ならばカウンタを1増やす(_数,L_1,_カウンタ_1,L,_カウンタ)), 数入力(_数_2), 連結リストの最後に数を追加(_数,L_1,L_2), 連結リストとカウンタを更新していく(_数_2,L_2,_カウンタ_1,L,_カウンタ). データを出力して終了(_連結リスト,_カウンタ) :- writef('実行後の連結リストは %t です\nその時点のカウンタは %t です\n',[_連結リスト,_カウンタ]),!. 負の数が入力されたら負の数の絶対値と同じ回数入力された数のデータを削除して連結リストの最後に0を加える(_負の数,L_1,_カウンタ_1,L_2,_カウンタ_2) :- _負の数 < 0, _負の数の絶対値 is abs(_負の数), 負の数の絶対値と同じ回数入力された数のデータを削除(_負の数の絶対値,L_1,L_3), 連結リストの最後に0を加える(L3,L2),!. 連結リストの最後に0を加える(L3,L2) :- append(L_3,[0],L_2),!. 負の数の絶対値と同じ回数入力された数のデータを削除(_負の数の絶対値,L_1,L_2) :- 既に入力された重複しない数ならびを得る(L_1,_数ならび), 削除する数を選択する(_負の数の絶対値,_数ならび,L_1,_削除する数候補), 連結リストからデータを削除(_削除する数候補,L_1,L_2). 既に入力された重複しない数ならびを得る(L_1,_数ならび) :- findsetof(_数,append(_,[_数|_],L_1),_数ならび),!. 削除する数を選択する(_負の数の絶対値,_数ならび,L_1,_削除する数候補) :- findall(_数,( append(_,[_数|_],_数ならび), 負の数の絶対値に要素数が一致する数(_負の数の絶対値,L_1,_数)), _削除する数候補),!. 負の数の絶対値に要素数が一致する数(_負の数の絶対値,L_1,_数) :- count(append(_,[_数|_],L_1),_負の数の絶対値)),!. 連結リストからデータを削除([],L,L) :- !. 連結リストからデータを削除([_数|R],L_1,L) :- ならびから削除(_数,L_1,L_2), 連結リストからデータを削除(R,L_2,L). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. 初めて入力された数ならばカウンタを1増やす(_数,L_1,_カウンタ_1,L_2,_カウンタ_3) :- \+(append(_,[_数|_],L_1)), _カウンタ_2 is _カウンタ_1 + 1, 同じ数が続けて入力されたらその数のカウンタをさらに1増やす(_数,L_1,_カウンタ_2,_カウンタ_3), 連結リストの最後に数を追加(_数,L_1,L_2),!. 同じ数が続けて入力されたらその数のカウンタをさらに1増やす(_数,L_1,_カウンタ_1,_カウンタ_2) :- last(L_1,_数), _カウンタ_2 is _カウンタ_1 + 1,!. 同じ数が続けて入力されたらその数のカウンタをさらに1増やす(_,_,_カウンタ_1,_カウンタ_1). 連結リストの最後に数を追加(_数,L_1,L_2) :- append(L_1,[_数],L_2). 数入力(_数) :- write('数を入力してください : '), get_line(Line), 数入力診断(Line,_数),!. 数入力(_数) :- 数入力(_数). 数入力診断(Line,_数) :- atom_to_term(Line,_数,_), number(_数),!. 数入力診断(Line,_数) :- writef('入力された %t からは数値が得られません。再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/470 # # # 入力ファイル(成績ファイル)の仕様 # # ファイル名は、ASCII文字で構成されるものとする。 # ファイル名の最大長は FILENAME_MAX である(第2回の課題0を参照)。 # 1行は、「学生番号」、「氏名」、「成績」の順に記述したもので、 # 各項目の区切り文字は、「タブ('\t')」1個である。 # 学生番号は、英数字からなる6桁の文字列である。 # 氏名の文字列長の最大は20バイトとする。 # 成績は、0〜100までの整数である。 # 入力は、最大500行と仮定してよい。 # # 出力形式 # 入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する。 # 次に、成績の降順にソートして出力する。各項 目間は、「タブ('\t')」1個で区切る。 # 平均点は、小数点以下1桁まで出力する。 # 出力形式は、実行例を参照せよ。 # エラー処理 # 呼出しでファイル名が指定されない場合はエラーとし、「ファイル名を指定してください」と表示し、プログラムを終了する。 # 指定されたファイルのオープンに失敗した場合に、「ファイルを開けませんでした」と表示し、プログラムを終了する。 # 今回のプログラムでは、a. b. 以外のエラー処理はしなくてよい。 # # % cat sample.txt # 03888 八 90 # 03111 一 100 # 03222 二 30 # 03666 六 70 # 03555 五 60 # 03333 三 80 # 03777 七 40 # 03999 九 20 # 03444 四 50 # % ./work31.exe sample.txt # 最高点:100 # 最低点: 20 # 平均点: 60.0 # 100 03111 一 # 90 03888 八 # 80 03333 三 # 70 03666 六 # 60 03555 五 # 50 03444 四 # 40 03777 七 # 30 03222 二 # 20 03999 九 # % # # 言語はCです # よろしくおねがいします # program :- user_parameters([_ファイル名]), '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t''[B')」1個で区切る。' (_ファイル名). '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(_ファイル名) :- 入力ファイルを読み込み(_ファイル名,LL), '最初に、成績の最高点と最低点と平均点を出力する'(LL), '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL). 入力ファイルを読み込み(_ファイル名,LL) :- get_lines(_ファイル名,Lines), 三項ならびに変換(Lines,LL). 三項ならびに変換([],[]) :- !. 三項ならびに変換([Line|R1],[[_成績,_学生番号,_氏名]|R2]) :- atom_chars(Line,Chars), append(L0,['\t'|L1],['\t'|L2],Chars), atom_chars(_学生番号,L0), atom_chars(_氏名,L1), atom_chars(_成績文字列,L2), atom_to_term(_成績文字列,_成績,_), 三項ならびに変換(R1,R2). 最初に、成績の最高点と最低点と平均点を出力する(LL) :- findmax(_成績, append(_,[[_成績,_,_]|_],LL), _最高点成績), findmin(_成績, append(_,[[_成績,_,_]|_],LL), _最低点成績), findavg(_成績, append(_,[[_成績,_,_]|_],LL), _平均点), writef('最高点: %t\n',[_最高点成績]), writef('最低点: %t\n',[_最低点成績]), writef('平均点: %t\n',[_平均点]),!. '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL) :- sort(LL,LL1), reverse(LL1,LL2), append(_,[L|R],LL2), writef('%t\t%t\t%t\t\n',L), R = [],!. % *** user: append / 4 *** append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % *** user: findmax / 3 *** findmax(V,P,Max) :- findall(V,P,L), max(L,Max). % *** user: findmin / 3 *** findmin(V,P,Max) :- findall(V,P,L), min(L,Max). % *** user: findavg / 3 *** findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. % *** user: sum / 2 *** sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/458 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # # x>0,y>0という条件でxとyを入力 # xからy間の数字で2の倍数のみを出力 # 例 # x=4 # y=9 # # 2の倍数 # 4 8 # 'x>0,y>0という条件でxとyを入力 xからy間の数字で2の倍数のみを出力' :- 'xの入力'(_x), 'yの入力'(_y), writef('x=%t\ny=%t\n\n2の倍数\n',[_x,_y]), for(_x,N,_y), '4の倍数のみを出力'(N), N=_y, nl. 'xの入力'(_x) :- 催促付き入力('x=',_x), 'xの入力診断'(Line,_x),!. 'xの入力'(_x) :- 'xの入力'(_x). 'xの入力診断'(Line,_x) :- atom_to_term(Line,_x,_), integer(_x), _x > 0,!. 'xの入力診断'(Line,_y) :- writef('入力された%tからは正の整数が得られませんでした\n',[Line]), fail. 'yの入力'(_y) :- 催促付き入力('y=',Line), 'yの入力診断'(Line,_y),!. 'yの入力'(_y) :- 'yの入力診断'(_y),!. 'yの入力診断'(Line,_y) :- atom_to_term(Line,_y,_), integer(_y), _y > 0,!. 'yの入力診断'(Line,_) :- writef('入力された%tからは正の整数が得られませんでした\n',[Line]), fail. '4の倍数のみを出力'(N) :- 0 is N mod 4, writef('%t ',[N]),!. '4の倍数のみを出力'(_). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/305 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/deaimail.from.tv/up/src/up3988.jpg # # 12個の整数をxに読み込み、平均値、標準偏差を計算して、出力せよ。 '12個の整数をxに読み込み、平均値、標準偏差を計算して、出力する' :- '12個の整数をxに読み込み'(_x), 平均値を計算(_x,_平均値), 標準偏差を計算(_x,_平均値,_標準偏差), write_formatted('x=%t, 平均値=%t, 標準偏差=%t\n',[_x,_平均値,_標準偏差]). '12個の整数をxに読み込み'(_x) :- length(_x,12), 'xに読み込み'(_x). 'xに読み込み'([]) :- !. 'xに読み込み'([N|R]) :- 整数を読み込む(N), 'xに読み込み'(R). 整数を読み込む(N) :- write('整数を入力してください : '), get_line(Line), 整数入力診断(Line,N),!. 整数を読み込む(N) :- 整数を読み込む(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数入力診断(Line,N) :- write_formatted('入力された %t から整数が得られませんでした。再入力をお願いします\n',[Line]), fail. 平均値を計算(L,_平均値) :- length(L,_要素数), 合計(L,_合計値), _平均値 is _合計値 / _要素数. 合計([],0) :- !. 合計([N|R],X) :- 合計(R,Y), X is N + Y. 標準偏差を計算(L,_平均値,V) :- 標準偏差(L,N,_平均値,0.0,V). 標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!. 標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 標準偏差(R,N,M,S2,V). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/83 # # [1] 授業単元:整数演算 # [2] 問題文(含コード&リンク):1個以上32個以下の正整数の最大・最小・最小公倍数・最大公約数を求めよ # 1個以上32個以下の正整数の最大・最小・最小公倍数・最大公約数を求めよ(_N個,_整数ならび,_最大,_最小,_最小公倍数,_最大公約数) :- _N個 >= 1,_N個 =< 32, 'N個の正の整数を得る'(_N個,_整数ならび), _整数ならび = [_最初の整数|_残りならび], 最大値と最小値を同時に取得する(_残りならび,_最初の整数,_最初の整数,_最大値,_最小値), 最大公約数(_整数ならび,_最大公約数), 最小公倍数(_整数ならび,_最小公倍数). 'N個の正の整数を得る'(_N個,_整数ならび) :- length(L,_N個), _整数ならび = L, findall(_正の整数,( append(_,[_正の整数|R],L), length([_正の整数|R],_残り個数), 正の整数を得る(_残り個数,_正の整数)), L). 正の整数を得る(_残り個数,_正の整数) :- write_formatted('正の整数を入力してください(残り%t個) : ',[_残り個数]), get_line(Line), 正の整数診断(Line,_正の整数),!. 正の整数を得る(_残り個数,_正の整数) :- 正の整数を得る(_残り個数,_正の整数). 正の整数診断(Line,_正の整数) :- atom_to_term(Line,_正の整数,_), integer(_正の整数), _正の整数 > 0,!. 正の整数診断(Line,_正の整数) :- write_formatted('入力された %t から正の整数は得られません。再入力をお願いします。',[Line]), fail. 最大公約数([N1|R],_最大公約数) :- 最大公約数の三(R,N1,_最大公約数). 最大公約数の三([],_最大公約数,_最大公約数). 最大公約数の三([N|R],_最大公約数_1,_最大公約数) :- 最大公約数(N,_最大公約数_1,_最大公約数_2), 最大公約数の三(R,_最大公約数_2,_最大公約数). 最小公倍数([N1|R],_最小公倍数) :- 最小公倍数の三(R,N1,_最小公倍数). 最小公倍数の三([],_最小公倍数,_最小公倍数). 最小公倍数の三([N|R],_最小公倍数_1,_最小公倍数) :- 最小公倍数(N,_最小公倍数_1,_最小公倍数_2), 最小公倍数の三(R,_最小公倍数_2,_最小公倍数). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最小公倍数(A,B,X) :- integer(A), integer(B), 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最大値と最小値を同時に取得する([],_最大値,_最小値,_最大値,_最小値) :- 最大値と最小値を同時に取得する([N|R],_最大値_1,_最小値_1,_最大値,_最小値) :- N > _最大値, 最大値と最小値を同時に取得する(R,N,_最小値_1,_最大値,_最小値),!. 最大値と最小値を同時に取得する([N|R],_最大値_1,_最小値_1,_最大値,_最小値) :- N < _最小値, 最大値と最小値を同時に取得する(R,_最大値_1,N,_最大値,_最小値),!. 最大値と最小値を同時に取得する([N|R],_最大値_1,_最小値_1,_最大値,_最小値) :- 最大値と最小値を同時に取得する(R,_最大値_1,_最小値_1,_最大値,_最小値),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/7 # # [1] 授業単元:暇つぶし # [2] 問題文(含コード&リンク): # 下記のような2chへの書き込み時刻のログを標準入力より受け取り、 # EOF がきたら現在の !ninja レベルがいくつであるか出力せよ # # !ninja レベルについて # 最初の書き込み時にはレベル1である # 最後にレベルアップした書き込み時刻から24時間以上経過して書き込むと1レベルアップする # # 条件1 一番最初の書き込み時刻以前にはクッキーは存在しないものとする # 条件2 ●無しとする # 条件3 書き込み時刻のログは古いものから順に並んでいるものとする # # 2011/02/11 22:33:44 # 2011/02/12 01:23:45 # 2011/02/14 18:19:20 # '下記のような2chへの書き込み時刻のログを標準入力より受け取り、 EOF がきたら現在の !ninja レベルがいくつであるか出力せよ' :- 一番最初の書き込み時刻以前にはクッキーは存在しないものとする(_ninja_1), get_lines(Lines), ninjaレベルの計測(Lines,_ninja_1,_ninja), writef('現在の !ninja レベルは %t です\n',[_ninja]),!. ninjaレベルの計測([],_ninja,_ninja) :- !. ninjaレベルの計測([_],_ninja,_ninja) :- !. ninjaレベルの計測([_時刻_1,_時刻_2|R],_ninja_1,_ninja) :- '24時間以上経過'(_時刻_1,_時刻_2), _ninji_2 is _ninja_1 + 1, ninjaレベルの計測([_時刻_2|R],_ninja_2,_ninja),!. ninjaレベルの計測([_時刻_1,_時刻_2|R],_ninja_1,_ninja) :- \+('24時間以上経過'(_時刻_1,_時刻_2)), ninjaレベルの計測([_時刻_2|R],_ninja_1,_ninja),!. 一番最初の書き込み時刻以前にはクッキーは存在しないものとする(1). '24時間以上経過'(_時刻_1,_時刻_2) :- sub_atom(_時刻_1,0,10,_,_年月日_1), sub_atom(_時刻_2,0,10,_,_年月日_2), sub_atom(_時刻_1,11,8,_,_時分秒_1), sub_atom(_時刻_1,11,8,_,_時分秒_2), '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2), '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2) :- _年月日_1 @< _年月日_2, _時分秒_1 @=< _時分秒_2,!. '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2) :- \+(_月末日(_年月日_1)), _時分秒_1 @> _時分秒_2, 翌日(_年月日_1,_翌日_1), _翌日_1 @< _年月日_2,!. 翌日(_年月日,_翌日の表示表現) :- sub_atom(_年月日,0,4,_年), sub_atom(_年月日,5,2,_月), sub_atom(_年月日,8,2,_日), 翌日(_年,_月,_日,_翌日の表示表現). 翌日(_年,'12','31',_翌日の表示表現) :- atom_to_term(_年,_年整数,_), _年整数_2 is _年整数 + 1, concat_atom([_年整数_2,/,'01',/,'01'],_翌日の表示表現),!. 翌日(_年,_月,_日,_翌日の表示表現) :- 月末日(_月,_日), 次の数字に対応する二文字の頭部零文字列(_月,_翌月), concat_atom([_年,/,_翌月,/,'01'],_翌日の表示表現),!. 翌日(_年,_月,_日,_翌日の表示表現) :- \+(月末日(_月,_日)), 次の数字に対応する二文字の頭部零文字列(_日,_翌日), concat_atom([_年,/,_翌月,/,_翌日],_翌日の表示表現),!. 次の数字に対応する二文字の頭部零文字列(_数値文字列,_次の数値文字列) :- length(L,2), atom_to_term(_数値文字列,_整数,_), _整数_2 is _整数 + 1, number_chars(_整数_2,Chars), append(L0,Chars,L), all(L0,'0'). 月末日(_年,'02','29') :- atom_to_term(_年,_年整数,_), うるう年(_年整数),!. 月末日(_年,'02','28') :- atom_to_term(_年,_年整数,_), \+(うるう年(_年整数)),!. 月末日(_年,_月,30) :- append(_,[_月|_],['04','06','09','11']),!. 月末日(_年,_月,31) :- append(_,[_月|_],['01','03','05','07','08','10','12']),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail . うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは '-N1からN2までの数字に一致させる'(_N1,_N2,_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,Len,_,S1,S2,S3,L1,L2,L3), \+((last(L1,A),数字または符号(A)), Len =< 4, \+((L3=[B|_],数字(B)), atom_to_term(S2,N,_), integer(N), N >= _N1, N =< _N2. 数字または符号(A) :- append(_,[A|_],['0','1','2','3','4','5','6','7','8','9','+','-']). % 以下のサイトは 'N1からN2までの数字に一致させる'(_N1,_N2,_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,Len,_,S1,S2,S3,L1,L2,L3), Len =< 3, \+((last(L1,A),数字(A)), \+((L3=[B|_],数字(B)), atom_to_term(S2,N,_), integer(N), N >= _N1, N =< _N2. % 以下のサイトは 計画停電グループ所属(グループ1,西荻). 計画停電グループ所属(グループ1,所沢). 計画停電グループ所属(グループ1,横浜南). 計画停電グループ所属(グループ1,けやき台). 計画停電グループ所属(グループ1,狭山ヶ丘). 計画停電グループ所属(グループ1,大井). 計画停電グループ所属(グループ4,上野毛). 計画停電グループ所属(グループ4,大井). 計画停電グループ所属(グループ5,埼玉). 計画停電グループ所属(グループ5,熊谷). % *** user: '計画停電' / 1 *** 計画停電(_年月日) :- 計画停電(_年月日,L), 計画停電表示(L). 計画停電表示(L) :- append(L0,[_グループ|R],L), 表示形式の取得(L0,_表示形式), 営業所並び文字列の取得(_グループ,_営業所並び文字列), wr(_表示形式,[_グループ,_営業所並び文字列]), R = []. 表示形式の取得(L0,_表示形式) :- length(L0,Len), 表示形式(Len,_表示形式). 表示形式(0,' %t 6:20-10:00; 13:50-17:30; %s\n'). 表示形式(1,' %t 9:20-13:00; 16:50-20:30; %s\n'). 表示形式(2,' %t 12:20-16:00; %s\n'). 表示形式(3,' %t 15:20-19:00; %s\n'). 表示形式(4,' %t 17:20-22:00; %s\n'). 営業所並び文字列の取得(_グループ,_営業所並び文字列) :- findall(_営業所,計画停電グループ所属(_グループ,_営業所),_営業所ならび), concat_atom(_営業所ならび,',',_営業所並び文字列). /* 計画停電(_日文字列,L) :- atom(_日文字列), sub_atom(_日文字列,_,2,_,_日文字列), 今日(_今日), 年月日から年月取得(_今日,_年月), concat_atom([_年月,_日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_日,L) :- integer(_日), _日 =< 31, 今日(_今日), 年月日から年月取得(_今日,_年月), 整数から文字列(2,_日,_日文字列), concat_atom([_年月,_日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_月日文字列,L) :- atom(_月日文字列), _月日文字列 @>= '0101', _月日文字列 @=< '1231', 今日(_今日), 年月日から年取得(_今日,_年), concat_atom([_年,_月日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_月日,L) :- integer(_月日), _月日 >= 101, _月日 =< 1231, 今日(_今日), 年月日から年取得(_今日,_年), 整数から文字列(4,_月日,_月日文字列), concat_atom([_年,_月日文字列],_年月日), 計画停電(_年月日,L),!. */ 計画停電(_年月日,L) :- atom(_年月日), atom_length(_年月日,8), count((日付の発生('20110317',_年月日_1,_年月日), _年月日_1 @>= '20110317' , _年月日_1 @=< _年月日),_経過日数), ならびの回転(左方向,_経過日数,[グループ4,グループ5,グループ1,グループ2,グルーブ3],L) . ならびの回転(左方向,0,L,L) :- !. ならびの回転(左方向,N,[A|R1],L) :- N_1 is N - 1, append(R1,[A],L2), ならびの回転(左方向,N_1,L2,L). 日付の発生(_日付,_日付,_日付上限) :- _日付 @> _日付上限,!,fail. 日付の発生(_日付,_日付,_日付上限). 日付の発生(_日付の一,_日付,_日付上限) :- 年・月・日に分解(_日付の一,_年の一,_月の一,_日の一), 翌日(_年の一,_月の一,_日の一,_翌日), 日付の発生(_翌日,_日付,_日付上限). 年・月・日に分解(_年月日,_年,_月,_日) :- sub_atom(_年月日,0,4,_,_年), sub_atom(_年月日,4,2,_,_月), sub_atom(_年月日,6,2,_,_日). 翌日(_年,'12','31',_翌日) :- 翌年(_年,_翌年), concat_atom([_翌年,'01','01'],_翌日),!. 翌日(_年,_月,'31',_翌日) :- append(_,[_月|_],['01','03','05','07','08','10','12']), 翌月(_月,_翌月), concat_atom([_年,_翌月,'01'],_翌日),!. 翌日(_年,_月,'30',_翌日) :- append(_,[_月|_],['04','06','09','11']), 翌月(_月,_翌月), concat_atom([_年,_翌月,'01'],_翌日). 翌日(_年,'02','29',_翌日) :- concat_atom([_年,'03','01'],_翌日),!. 翌日(_年,'02','28',_翌日) :- \+(うるう年(_年)), concat_atom([_年,'03','01'],_翌日),!. 翌日(_年,_月,_日,_翌日) :- 翌日(_日,_翌日の日), concat_atom([_年,_月,_翌日の日],_翌日). 翌月(_月,_翌月) :- atom_to_term(_月,M,_), M2 is M + 1, 整数から文字列(2,M2,_翌月). 翌年(_年,_翌年) :- atom_to_term(_年,Y,_), Y2 is Y + 1, 整数から文字列(4,Y2,_翌年). 翌日(_日,_翌日) :- atom_to_term(_日,D,_), D2 is D + 1, 整数から文字列(2,D2,_翌日). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数). うるう年(_年) :- 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/1296387672/610 # # [1] 授業単元: プログラミング # [2] 問題文 サッカーの試合結果の記録されたデータファイルを読み取り、 # 優勝したチーム名を出力するプログラムを作成せよ。 # データファイルには、先頭の行にチーム数が出力されており、 # 2行目からチーム名(チーム数分)、 # それ以降の行に試合結果が出力されている。 # 試合結果の行は以下のフォーマットとなっている。 # <ホーム側のチーム名> <ホーム側チームの得点> # <アウェイ側チームの得点> <アウェイ側チーム名> # チーム名は30文字以内とする。 # 試合に勝ったチームには勝ち点3が与えられ、引き分けたチームには # 勝ち点1が与えられる。勝ち点の合計が最も多いチームが優勝となるが、 # 勝ち点の合計が同じチームが複数ある場合には、それらのうち、 # 得失点差(得点と失点の差)の合計が大きいチームが優勝となる。 # 得失点差の合計が同じ場合にはどちらを優勝としてもよい。 # 4 # MANCHESTER_UNITED # ARSENAL # CHELSEA # LIVERPOOL # MANCHESTER_UNITED 3 1 ARSENAL # CHELSEA 3 0 LIVERPOOL # ARSENAL 2 2 CHELSEA # LIVERPOOL 3 0 MANCHESTER_UNITED # ------------------------------------ # 優勝したチーム名を出力するプログラムを作成する(_データファイル) :- get_lines(_データファイル,Lines), データファイルには先頭の行にチーム数が出力されており、(Lines,_チーム数,_2行目以降ならび), '2行目からチーム名(チーム数分)'(_2行目以降ならび,_チーム数,_チーム名ならび,_試合結果ならび), 優勝したチーム名を(_チーム名ならび,_試合結果ならび,_優勝したチーム), 出力する(_優勝したチーム名). データファイルには先頭の行にチーム数が出力されており、(Lines,_チーム数,_2行目以降ならび) :- Lines = [_チーム数文字列|_2行目以降ならび], atom_to_term(_チーム数文字列,_チーム数,_),!. '2行目からチーム名(チーム数分)'(_2行目以降ならび,_チーム数,_チーム名ならび,_試合結果ならび) :- length(_チーム名ならび,_チーム数), append(_チーム名ならび,_試合結果ならび,_2行目以降ならび),!. 優勝したチーム名を(_チーム名ならび,_試合結果ならび,_優勝したチーム名) :- findall([_チーム名,_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差],( append(_,[_チーム名|_],_チーム名ならび), all([_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差],0)), _チーム成績ならび), 試合結果をチーム成績ならびに反映させる(_試合結果ならび,_チーム成績ならび,_最終チーム成績ならび), 優勝したチームを判定する(_最終チーム成績ならび,_優勝したチーム名). 試合結果をチーム成績ならびに反映させる([],_最終チーム成績ならび,_最終チーム成績ならび) :- !. 試合結果をチーム成績ならびに反映させる([_試合結果行|R],_チーム成績ならび1,_最終チーム成績ならび) :- split(_試合結果行,[' '],[_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名]), 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,_ホーム側の勝数の加算値,_アウェイ側の勝数の加算値,_ホーム側の敗数の加算値,_アウェイ側の敗数の加算値,_ホーム側の引き分け数の加算値,_アウェイ側の引き分け数の加算値,_ホーム側の勝ち点の加算値,_アウェイ側の勝ち数の加算値), チーム成績の更新(_ホーム側のチーム名,_ホーム側の得点,_ホーム側の勝数の加算値,_ホーム側の敗数の加算値,_ホーム側の引き分け数の加算値,_ホーム側の勝ち点の加算値,_チーム成績ならび1,_チーム成績ならび2), チーム成績の更新(_アウェイ側のチーム名,_アウェイ側の得点,_アウェイ側の勝数の加算値,_アウェイ側の敗数の加算値,_アウェイ側の引き分け数の加算値,_アウェイ側の勝ち点の加算値,_チーム成績ならび2,_チーム成績ならび3), 試合結果をチーム成績ならびに反映させる(R,_チーム成績ならび3,_最終チーム成績ならび). 優勝したチームを判定する(_最終チーム成績ならび,_優勝したチーム名) :- findmax([_勝ち点,_得失点差],( append(_,[[_チーム名,_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差]|_],_最終チーム成績ならび)), [_勝ち点,_得失点差]), append(_,[[_優勝したチーム名,_,_,_,_勝ち点,_,_,_得失点差]|_],_最終チーム成績ならび). 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,1,0,0,1,0,0,3,0) :- _ホーム側の得点 > _アウェイ側の得点,!. 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,0,1,1,0,0,0,0,3) :- _ホーム側の得点 < _アウェイ側の得点,!. 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,0,0,0,0,1,1,1,1) :- _ホーム側の得点 = _アウェイ側の得点,!. 出力する(_優勝したチーム名) :- write_formatted('優勝したチームは %t です\n',[_優勝したチーム名]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1258320456/189 # # 解答お願いします。 # # 1. 下記のような九九の計算表を出力するプログラムを作成し、実行してください。このときforループを使用するもの(q11.py)と、whileループを使用するもの(q12.py)の2種類を作成してください。 # 1の段 1 2 3 4 5 6 7 8 9 # 2の段 2 4 6 8 10 12 14 16 18 # ..........中略.... # 9の段 9 18 27 36 45 54 63 72 81 # # 2. 次のような手順で、キーボードから入力した数値の合計を求めるものとします。実際に Python プログラム (q2.py) の形にして、実行してください。 # 合計に使う変数を 0 にする。 # キーボードから数値を入れる。 # 入力した数値が 0 より大きい間次のブロックを繰り返す: # 合計に数値を加える。 # キーボードから数値を入れる。 # 合計を印刷する # 3. turtleを使用して、図形を表示するスクリプトg.pyを作成してください。どのような図形を作成するか記述(少なくとも6角形よりは複雑である事)して、スクリプトの内容をメールに含めてください。なお、スクリプトには、必ず for ループを含むようにしてください # # # キーボードから入力した数値の合計 :- キーボードから入力した数値の合計(0). キーボードから入力した数値の合計(S1) :- 数値を入力する(N), N > 0, S2 is S1 + N, キーボードから入力した数値の合計(S2). キーボードから入力した数値の合計(S) :- write_formatted('合計は %t\n',[S]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% キーボードから入力した数値の合計 :- 数値を入力する(N), キーボードから入力した数値の合計(N,0). キーボードから入力した数値の合計(N,S) :- N =< 0, write_formatted('合計は %t\n',[S]),!. キーボードから入力した数値の合計(N,S1) :- S2 is S1 + N, 数値を入力する(N2), キーボードから入力した数値の合計(N2,S2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% キーボードから入力した数値の合計 :- キーボードから入力した数値の合計(0,S), write_formatted('合計は %t\n',[S]). キーボードから入力した数値の合計(S1,S) :- 数値を入力する(N), N > 0, S2 is S1 + N, キーボードから入力した数値の合計(S2,S). キーボードから入力した数値の合計(S,S). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% キーボードから入力した数値の合計 :- 数値を入力する(N), キーボードから入力した数値の合計(N,0,S), write_formatted('合計は %t\n',[S]). キーボードから入力した数値の合計(N,S,S) :- N =< 0,!. キーボードから入力した数値の合計(N,S1,S) :- S2 is S1 + N, 数値を入力する(N2), キーボードから入力した数値の合計(N2,S2,S). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数値を入力する(_数値) :- get_line(Line), 数値入力診断(Line,_数値),!. 数値を入力する(_数値) :- 数値を入力する(_数値). 数値入力診断(Line,_数値) :- atom_to_term(Line,_数値,_), number(_数値),!. 数値入力診断(Line,_) :- write_formatted('入力された %t からは数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/313 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # # 1..キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む関数を作れ。 # ただし、nの値とファイル名は引数として取得するものとする。 # 2..引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と # 氏名のデータを構造体変数に格納し、学生番号順に表示する関数を作れ。 # 3..以上で作成した関数を使用し、プログラムを完成せよ。ただし、nの値と使用するファイルの名前は # プログラムの引数として与えられるものとする。 program :- user_parameters([_n個文字列,_ファイル]), atom_to_term(_n個文字列,_n個,_), キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む(_n個,_ファイル), 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_ファイル,_n個). 'キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む'(_n個,_ファイル) :- length(L,_n個), 学生番号と氏名の組を読み込む(L), open(_ファイル,write,Outstream), append(_,[[_学生番号,_氏名]|R],L), write_foratted(Outstream,'%t,%t\n',[_学生番号,_氏名]), R = [], close(Outstream),!. 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_ファイル,_n個) :- length(L,_n個), get_line(_ファイル,Lines), append(L,_,Lines), sort(L,_整列済みデータ), append(_,[[_学生番号,_氏名]|R],_整列済みデータ), write_formatted('%t,%t\n',[_学生番号,_氏名]), R = [],!. 学生番号と氏名の組を読み込む([]) :- !. 学生番号と氏名の組を読み込む([[_学生番号,_氏名]|R]) :- 学生番号を読み込む(_学生番号), 氏名を読み込む(_氏名), 学生番号と氏名の組を読み込む(R). 学生番号を読み込む(_学生番号) :- write('学生番号を入力してください : '), get_line(_学生番号),!. 学生番号を読み込む(_氏名) :- write('氏名を入力してください : '), get_line(_氏名),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/181 # # [1] 授業単元:プログラミング C言語 # [2] 問題文(含コード&リンク):明治以降の和暦を指定して、西暦に変換するプログラム #               まず元号(M,T,S,H)を数字(1〜4)で選んで年を入力し、 #               西暦を表示させる。元号選択時に1〜4以外を選んだら #               エラーメッセージをだして終了させます。 # # 明治以降の和暦を指定して、西暦に変換するプログラム :- '元号をM,T,S,Hで得る'(_元号略記), 年を得る(_年), 明治以降の和暦を西暦に変換する(_元号略記,_年,_西暦年), write_formatted('%t%t年は西暦%t年となります。\n',[_元号略記,_年,_西暦年). '元号をM,T,S,Hで得る'(_元号略記) :- write('元号を数値で 1..明治 2..大正 3..昭和 4..平成 の左側の数字で入力してください : '), get_line(Line), 元号略記(Line,_元号略記),!. 元号略記(Line,_元号略記) :- atom_to_term(Line,_入力番号,_), integer(A), 入力番号から元号略記へ(_入力番号,_元号略記). 入力番号から元号略記へ(1,'M'). 入力番号から元号略記へ(2,'T'). 入力番号から元号略記へ(3,'S'). 入力番号から元号略記へ(4,'H'). 入力番号から元号略記へ(X,_) :- \+((X>=1,X=<4)), write_formatted('入力された%tからは元号が得られませんでした\n',[X]),!, fail. 年を得る(_年) :- write('年を入力してください : '), get_line(Line), 年を得るの診断(Line,_年),!. 年を得るの診断(Line,_年) :- atom_to_term(Line,_年,_), integer(_年),!. 年を得るの診断(Line,_年) :- write_formatted('入力された %t からは年を得られませんでした\n',[Line]), fail. 明治以降の和暦を西暦に変換する('M',_年,_西暦年) :- _西暦年 is 1867 + _年,!. 明治以降の和暦を西暦に変換する('T',_年,_西暦年) :- _西暦年 is 1911 + _年,!. 明治以降の和暦を西暦に変換する('S',_年,_西暦年) :- _西暦年 is 1925 + _年,!. 明治以降の和暦を西暦に変換する('H',_年,_西暦年) :- _西暦年 is 1988 + _年,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/147 # # [1] 授業単元:ポインタ # [2] 問題文(含コード&リンク): # ランダムな数値が格納された配列を昇順にソートし、結果を画面に出力する。(コマンドプロンプト) # 課題ファイルのmain関数・昇順ソート関数・ソート結果表示関数に、仮引数と関数の中身を追加する。基本的に、main関数内は、関数呼び出しのみとする。 # 課題ファイル http://ime.nu/uproda.2ch-library.com/lib339300.txt.shtml # # #include # # void Sort_func( int * ); /* ソート処理関数の定義 */ # void Disp_func( int * ); /* ソート結果表示関数の定義 */ # # # /* # ※ 2つの関数を呼出しソート結果を画面に出力する。 # 関数を完成させよ。 # 定義済の関数宣言・変数の変更(移動)を禁止する。 # */ # # void main() # { # /* # 配列変数 intNumFrom に格納された数値を、 # 昇順となるようにintNumFrom を変更せよ。 # */ # # int intNumFrom[8] = {88,52,6,43,65,38,46,16}; # # # Sort_func( intNumFrom ); /* ソート処理関数呼出し*/ # # Disp_func( &intNumFrom[1] ); /* ソート結果表示関数呼出し */ # # return; # } # # void Sort_func( ###### ) # { # # } # # # void Disp_func( ###### ) # { # # } 'ランダムな数値が格納されたならびを昇順にソートし、結果を画面に出力する。' :- ランダムな数値が格納されたならびを(_ランダムな数値が格納されたならび), 昇順にソートし(_ランダムな数値が格納されたならび,[],_昇順に整列したならび), 画面に出力する(_昇順に整列したならび). ランダムな数値が格納されたならびを(_ランダムな数値が格納されたならび) :- ならびの要素数を入力する(_要素数), length(L,_要素数), findall(_ランダムな数値,( append(_,[_ランダムな数値|_],L), ランダムな数値(_ランダムな数値)), _ランダムな数値が格納されたならび). ランダムな数値(_ランダム数値) :- 1 is random mod 2, _ランダムな数値 is ( random mod 10000 ) / 100),!. ランダムな数値(_ランダム数値) :- _ランダムな数値 is random mod 100,!. ならびの要素数を入力する(_要素数) :- 範囲指定付き整数入力(要素数,'要素数を入力してください : ',1,100,_要素数). 昇順にソートし([],_昇順に整列したならび,_昇順に整列したならび) :- !. 昇順にソートし([_値1|R1],L1,_昇順に整列したならび) :- 昇順に挿入(_値1,L1,L2), 昇順にソートし(R1,L2,_昇順に整列したならび). 昇順に挿入(V,[],[V]) :- !. 昇順に挿入(V,[V1|R1],[V,V1|R1]) :- V =< V1,!. 昇順に挿入(V,[V1|R1],[V1|R2]) :- V > V1, 昇順に挿入(V,R1,R2). 画面に出力する(L) :- append(_,[_数値|R],L), write_formatted('%t ',[_数値]), R = [], nl. 範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値) :- write(_催促), get_line(Line), 範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値),!. 範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値) :- 範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値). 範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値) :- atom_to_term(Line,_値,_), integer(_値), _値 >= _範囲下限, _値 =< _範囲上限,!. 範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値) :- write_formatted('入力された %t からは、%tから%tの範囲の適切な%tを得られませんでした。再入力をお願いします。\n',[Line,_範囲下限,_範囲上限,_入力項目名]), fail. % 以下のサイトは # 出典:: 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, list_nth(_出発地番号,_都道府県名ならび,_出発地),!. 出発地を入力診断(Line,_都道府県名ならび,_出発地) :- write_formatted('入力された %t から適切な出発地を得ることができません。再入力をお願いします。\n',[Line]), fail. 目的地を入力する(_都道府県名ならび,_目的地) :- write('目的地の都道府県名番号を入力してください : '), get_line(Line), 目的地を入力診断(Line,_都道府県名ならび,_目的地), 目的地を入力する(_都道府県名ならび,_目的地) :- 目的地を入力する(_都道府県名ならび,_目的地). 目的地を入力診断(Line,_都道府県名ならび,_目的地) :- atom_to_term(Line,_目的地番号,_), integer(_目的地番号), _目的地番号 > 1, _目的地番号 =< 47,!. 目的地を入力診断(Line,_,_目的地) :- write_formatted('入力された %t から適切な目的地を得ることができません。再入力をお願いします。\n',[Line]), fail. 距離と経路の表示(_出発地,_目的地,_距離,_順路) :- write_formatted('距離は %t,経路は %t',[_距離,_出発地]), append(_,[[A,B]|R],_順路), write_formatted(' -> %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), list_nth(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/1267796762/899 # # 【 課題 】要素型がint型である配列を作り、全要素を1〜10の乱数で埋め尽くす(1以上10以下の値を # 代入する) # 【 形態 】1. Javaアプリケーション(main()で開始)/2. Applet/3. Servlet/ #        4. 携帯(開発環境のver.必須)/5. その他(明記のこと) 《必ず選択》 # 【 GUI  】1. AWTのみ/2. Swing/3. SWT/4. 制限なし/ 5. その他(明記すること) #        《GUIの課題の場合必ず選択》 # 【 期限 】提出期限、解答希望日を書きます。「できるだけ早く」はNG。 《必須》 # 【 Ver  】コンソールでjava -versionを実行し、その結果を貼ります。 《必須》 # 【 用語 】数学用語、専門用語の意味、説明を書きます。 《あれば必須》 # 【 補足 】課題について自分なりに補足する事、何か思う事があれば書きます。 #        丸投げでない場合は、途中までのソースとその経過報告、 #        質問点、疑問点を書きます(なるべく丸投げにしてください)。 # # # 要素型がint型であるならびを作り、全要素を1〜10の乱数で埋め尽くす(L) :- ならびの長さを得る(_長さ), length(L,_長さ), findall(N,( append(_,[N|_],L), N is (random mod 10) + 1), L). ならびの長さを得る(_長さ) :- write('ならびの長さを入力してください : '), get_line(Line), ならびの長さ診断(Line,_長さ),!. ならびの長さを得る(_長さ) :- ならびの長さを得る(_長さ). ならびの長さ診断(Line,_長さ) :- atom_to_term(Line,_長さ,_), integer(_長さ), _長さ > 0,!. ならびの長さ診断(Line,_長さ) :- write_formatted('入力された %t からならびの長さとして適切な整数を得られませんでした。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: 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), write_formatted(Output,'%t\n',[S]), fail. リーデング情報の書き込み(Outstream). 情報の回覧(LL) :- write('順位,種牡馬名,毛色,産地,出走頭数,勝馬頭数,出走回数,勝利回数,賞金,1出走賞金,1頭平均賞金,勝馬率,アーニング・インデックス\n'), リーデング情報(_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数), _1出走賞金 is truncate(_賞金 / _出走回数), _1頭平均賞金 is truncate(_賞金 / _出走頭数) _勝馬率 is _勝馬頭数 / _出走頭数, アーニング・インデックスの算出(_種牡馬名,_アーニング・インデックス), write_formatted('%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t\n',[_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_1出走賞金,1頭,_平均賞金,_勝馬率,_アーニング・インデックス]), fail. 情報の回覧(LL). リーディング情報の追加 :- write('指示に従い各項目を入力してください\n'), リーディング情報項目(_項目,_項目のタイプ), リーディング情報項目の入力(_項目,_項目のタイプ,_項目値ならび), P =.. [リーデング情報|_項目値ならび], assertz(P),!. リーディング情報項目の入力(_項目,_項目のタイプ,_項目値ならび) :- findall(_項目値,( リーディング情報項目(_項目,_項目のタイプ), 項目の入力(_項目,_項目のタイプ,_項目値)), _項目値ならび). 項目の入力(_項目,文字列,_項目値) :- write_formatted('%t (文字列) を入力してください : ',[_項目]), get_line(_項目値),!. 項目の入力(_項目,整数,_項目値) :- write_formatted('%t (整数)を入力してください : ',[_項目]), get_line(Line), 項目の入力診断(_項目,整数,Line,_項目値),!. 項目の入力(_項目,整数,_項目値) :- 項目の入力(_項目,整数,_項目値). 項目の入力診断(_項目,整数,Line,_項目値) :- atom_to_term(Line,_項目値,_), integer(_項目値),!. 項目の入力診断(_項目,整数,Line,_項目値) :- write_formatted('入力された%tからは%tにふさわしい整数を得られませんでした。再入力をお願いします。\n',[Line,_項目]), fail. % 産駒の総収得賞金/2,産駒の出走頭数/2,全出走馬収得賞金/1,総出走頭数/1 は未定義である。 % これらの述語をデータベースと定義した上で、アーニング・インデックスを算出する。 アーニング・インデックスの算出(_種牡馬名,_アーニングインデックス) :- 産駒の総収得賞金(_種牡馬名,_産駒の総収得賞金), 産駒の出走頭数(_種牡馬名,産駒の出走頭数), 全出走馬収得賞金(_全出走馬収得賞金), 総出走頭数(_総出走頭数), _アーニング・インデックス is ( _産駒の総収得賞金 / _産駒の出走頭数 ) / ( _全出走馬収得賞金 / _総出走頭数),!. リーディング情報項目(順位,整数). リーディング情報項目(種牡馬名,文字列). リーディング情報項目(毛色,文字列). リーディング情報項目(産地,文字列). リーディング情報項目(出走頭数,整数). リーディング情報項目(勝馬頭数,整数). リーディング情報項目(出走回数,整数). リーディング情報項目(勝利回数,整数). リーディング情報項目(賞金,整数). /* リーディング情報項目(1出走賞金,整数). リーディング情報項目(1頭平均賞金,整数). リーディング情報項目(勝馬率,浮動小数点数).). リーディング情報項目(アーニング・インデックス,浮動小数点数). */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/965 # # [1] 授業単元: cプログラム # [2] 問題文(含コード&リンク):100点満点の試験の得点データが学生の人数分ある。これを「不定個数のデータの読み込み」の #  どちらかの方法(最初にデータの個数を読み込むか、データの終わりを特別な値で知らせるか) #  で読み込み、10点刻みでの度数分布表を作成しなさい。 # '100点満点の試験の得点データが学生の人数分ある。これを「不定個数のデータの読み込み」のどちらかの方法(最初にデータの個数を読み込むか、データの終わりを特別な値で知らせるか)で読み込み、10点刻みでの度数分布表を作成する' :- 最初にデータの個数を読み込む(_データの個数), length(_得点ならび,_データの個数), 得点データを読み込む(_得点ならび), '10点刻みでの度数分布表を作成する'(_得点ならび,_度数分布ならび), 度数分布表の表示(_度数分布ならび). 最初にデータの個数を読み込む(_データの個数) :- write('データの個数を入力してください : '), get_line(Line), データの個数読み込み診断(Line,_データの個数),!. 最初にデータの個数を読み込む(_データの個数) :- 最初にデータの個数を読み込む(_データの個数). データの個数読み込み診断(Line,_データの個数) :- atom_to_term(Line,_データの個数,_), integer(_データの個数), _データの個数 > 0,!. データの個数読み込み診断(Line,_データの個数) :- write_formatted('入力された %t から正の整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 得点データを読み込む(L) :- findall(_得点,( append(L0,[_得点|_]),L), 得点データを読み込む([_|L0],_得点)), L). 得点データを読み込む(Ln,_得点) :- length(Ln,Len), write_formatted('%t人目の得点を入力してください : ',[Len]), get_line(Line), 得点データ診断(Line,_得点),!. 得点データを読み込む(Ln,_得点) :- 得点データを読み込む(Ln,_得点). 得点データ診断(Line,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 >= 0, _得点 =< 100,!. 得点データ診断(Line,_) :- write_formatted('入力された %t から0以上100以下の整数の得点は得られませんでした。\n再入力をお願いします\n',[Line]), fail. '10点刻みでの度数分布表を作成する'(L,_データの個数,_度数分布表) :- '10点刻みでの度数ならびを作成する'(L,[0,0,0,0,0,0,0,0,0,0,0],_度数ならび), findall(U,( append(_,[A|_],_度数ならび), U is truncate(floor((A * 100 / _データの個数) + 0.5))), _度数分布表). '10点刻みでの度数ならびを作成する'([],L,L) :- !. '10点刻みでの度数ならびを作成する'([A|R],L1,L) :- 度数ならびの更新(A,L1,L2), '10点刻みでの度数ならびを作成する'(R,L2,L). 度数ならびの更新(_得点,L1,L2) :- _位置 is _点数 // 10, append(L0,[_度数|R],L1), length(L0,_位置), _度数2 is _度数 + 1, append(L0,[_度数2|R],L2),!. 度数分布表の表示(_度数分布表) :- write('階級 , 度数\n'), 度数分布表の表示(0,_度数分布表). 度数分布表の表示(_,[]) :- !. 度数分布表の表示(100,[_度数|R]) :- write_formatted('%2d ,%3d\n',[N,N1,_度数]),!. 度数分布表の表示(N,[_度数|R]) :- N1 is N + 9, write_formatted('%2d-%2d,%3d\n',[N,N1,_度数]), N2 is N + 10, 度数分布表の表示(N2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/823 # # [1] 授業単元:ネットワークプログラミング # [2] 問題文(含コード&リンク): # ネットワーク対戦型ゲームを実装せよ # 宛先ホスト,ポート番号をコマンドライン引数として扱う. # serverとclientの1対1通信でOK # getaddrinfo()を使用すること # localhost内で動作すればOK # ゲームに関して # じゃんけん # ○×ゲーム # などなど・・・ # 提出物 # サーバ側,クライアント側のプログラム # 碁盤サーバ :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket), open(NewSocket,read,Instream), open(NewSocket,write,Outstream), get_line(Instream,Line), ゲーム(Instream,Outstream,Line), close(Instream), close(Outstream), socket_shutdown(Socket), socket_shutdown(NewSocket). ゲーム(_,_,ありません) :- !. ゲーム(Instream,Outstream,Line) :- exception_handler(atom_to_term(Line,Term,Varlist),Ex, Term = Ex), call(Term), 自分の手番(_次の手), write_formatted(Outstream,'着手(%q). ',[_次の手]), flush_output(Outstream), get_line(Instream,Line2), ゲーム(Instream,Outstream,Line2). 着手((A,B)) :- write_formatted('相手の着手は%t%tです\n',[A,B]), 盤面表示(A,B),!. 自分の手番(_次の手) :- write('次の手をカンマ区切りで入力してください : '), get_line(Line), 自分の着手診断(Line,_次の手),!. 自分の手番(_次の手) :- 自分の手番(_次の手). 自分の着手診断(Line,(A,B)) :- split(Line,[',',' '],[A,B]), A @>= 'A', A @=< 'S', B >= 0, B =< 19,!. 自分の着手診断(Line,_次の手) :- write_formatted('%t は適切な盤面表現ではありません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/871 # # 【 課題 】 # 商品リストに登録されている商品名と個数を入力すると、商品名、単価、個数、合計金額を表示するプログラムを作成します。添付のソースファイルにコードを追加して、以下の実行結果になるようなプログラムを作成してください。 # ☆商品名と個数を入力すると、商品名、単価、個数、合計金額を表示する (個数が入力されない場合は1個とみなす) # C:\kadai>java Shopping Orange # 商品:Orange # 単価:100円 個数:1個 合計:100円 # # C:\kadai> java Shopping Orange 3 # 商品:Orange # 単価:100円 個数:3個 合計:300円 # # ☆ 商品が見つからなかった場合には、エラーメッセージを表示する # C:\kadai>java Shopping Melon 3 # Melonは商品ではありません。 # # ☆ 引数の数が0または3つ以上の場合は、エラーメッセージを表示する # C:\kadai>java Shopping Orange Apple Peach # 引数には商品名と個数を入力してください。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】4. 制限なし # 【 Ver  】1.6.0_05 # 【 補足 】 Shoppingクラスはmain()メソッドを持つ。 # 実行時の引数には商品名と個数を入力する。 # 個数が入力されなかった場合は1とみなす。 # Fruitクラスのsearch()メソッドは、商品が存在するかどうかを検索する # メソッドで、商品が存在した場合は単価を戻す。商品が見つからなかった場合には-1を戻す。 # Fruitクラスのdisplay()メソッドは、商品名、単価、個数から合計金額を計算して表示するメソッドである。商品が登録されていない場合はメッセージを表示する # ソース # shopping http://ime.nu/www.dotup.org/uploda/www.dotup.org1383033.java.html # fruit http://ime.nu/www.dotup.org/uploda/www.dotup.org1383034.java.html # ../test/read.cgi/tech/1267796762/870さん その通りです。完全に丸投げになりますがよろしくお願い致します。 # # '商品リストに登録されている商品名と個数を入力すると、商品名、単価、個数、合計金額を表示する' :- 商品名と個数を入力すると(_商品名,_個数), 商品名、単価、個数、合計金額を(_商品名,_単価,_個数,_合計金額), 表示する(_商品名,_単価,_個数,_合計金額),!. '商品リストに登録されている商品名と個数を入力すると、商品名、単価、個数、合計金額を表示する'. 商品名と個数を入力すると(_商品名,_個数) :- user_parameters([_商品名,_個数文字列]), atom_to_term(_個数文字列,_個数,_),!. 商品名、単価、個数、合計金額を(_商品名,_単価,_個数,_合計金額) :- 商品名リスト(_商品名,_単価), _合計金額 is truncate(_単価 * _個数 + 0.5),!. 商品名、単価、個数、合計金額を(_商品名,_,_,_) :- '商品が見つからなかった場合には、エラーメッセージを表示する'(_商品名), fail. 表示する(_商品名,_単価,_個数,_合計金額) :- write_formatted('商品:%t\n',[_商品名]), write_formatted('単価:%t円 個数:%t個 合計:%t円\n',[_単価,_個数,_合計金額]),!. '商品が見つからなかった場合には、エラーメッセージを表示する'(_商品名) :- write_formatted('%tは商品ではありません。\n',[_商品名]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/853 # # 【 課題 】(1)三科目の点数を入力し、平均点を表示するプログラムを作成せよ。 # (2)まず人数を入力、その人数分の三科目の点数を入力、個人ごとの平均点を表示するプログラムを作成せよ。 #   (3)(2)を継承。オーバーライドを使用し、入力する科目を五科目に増やし、さらに合計点も表示するプログラムを作成せよ。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】本日九時 # 【 Ver  】java version "1.6.0_21" #   Java(TM) SE Runtime Environment (build 1.6.0_21-b07) #   Java HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing) # 【 補足 】問題が口頭だったため、文章におかしいところがあるかも知れませんが、よろしくお願いします。 まず人数を入力、その人数分の三科目の点数を入力、個人ごとの平均点を表示する :- まず人数を入力(_人数), その人数分の三科目の点数を入力(_人数,_その人数分の三科目の得点ならび), 個人ごとの平均点を表示する(_その人数分の三科目の得点ならび). まず人数を入力(_人数) :- write('人数を入力してください : '), get_line(Line), 人数入力診断(Line,_人数),!. まず人数を入力(_人数) :- まず人数を入力(_人数). 人数入力診断(Line,_人数) :- atom_to_term(Line,_人数,_), integer(_人数), _人数 > 0,!. 人数入力診断(Line,_人数) :- write_formatted('入力された文字列 %t からは人数を得られませんでした。再入力をお願いします。\n',[Line]), fail. その人数分の三科目の点数を入力(_人数,_その人数分の三科目の得点ならび) :- length(_その人数分の三科目の得点ならび,_人数), findall(_三科目の得点,( append(_,[_三科目の得点|_],_その人数分の三科目の得点ならび), 三科目の点数を入力し(_三科目の得点)), _その人数分の三科目の得点ならび). 個人ごとの平均点を表示する(_その人数分の三科目の得点ならび) :- append(L0,[_三科目の得点|R],_その人数分の三科目の得点ならび), 個人idを付加して表示(L0), 平均点を表示する(_三科目の得点), R = []. 個人idを付加して表示(L0) :- length([_|L0],_何番目]), write_formatted('%t : ',[_何番目]). 三科目の点数を入力し(_三科目の得点) :- write('三科目の点数をカンマ区切りで一行で入力してください : '), get_split_line([','],_三科目の得点). 平均点を表示する(_三科目の点数) :- 平均点を(_三科目の点数,_平均点), 表示する(_平均点). 平均点を([_第一科目の点数,_第二科目の点数,_第三科目の点数],_平均点) :- _平均点 is (_第一科目の点数 + _第二科目の点数 + _第三科目の点数) / 3. 表示する(_平均点) :- write_formatted('三科目の平均は %t です\n',[_平均点]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/782 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # # キーボードから入力した整数を、2倍して表示するプ ログラムを作成しなさい。ただし以下の要件を満たすこと。 # calcx2 関数の定義・・・ void calcx2(void) ?  引数ならびに戻り値はなし。?  入力値を 2 倍する # main 関数の定義?  キーボードから整数の入力?  calx2 関数の呼出し?   結果の表示 program :- キーボードからの整数入力(_整数), 整数を2倍して(_整数,_2倍した整数), 結果の表示(_2倍した整数). キーボードからの整数入力(_整数) :- get_line(Line), キーボードからの整数入力(Line,_整数),!. キーボードからの整数入力(_整数) :- キーボードからの整数入力(_整数). キーボードからの整数入力(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. キーボードからの整数入力(Line,_整数) :- write_formatted('入力された文字列 %t から整数は得られませんでした\n',[Line]), fail. 整数を2倍して(_整数,_2倍した整数) :- _2倍した整数 is _整数 * 2. 結果の表示(_2倍した整数) :- write_formatted('%t\n',[_2倍した整数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/626 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # # 問題1メイン関数でキーボードから二つの整数n1とn2を読み込み,それらをexponent関数を呼び出して, # n1のn2乗を計算し,結果をメイン関数で表示するプログラムを書きなさい. # <実行例> # 二つの整数を入力してください. # n1 = 5 # n2 = 2 # 5の2乗は25です. # 問題2 5人の点数を読み込んでいき、その最高点を表示するプログラムを作成しなさい。 # 問題3 円の面積の一覧表を計算するプログラムを作成しなさい。 # <実行結果> # 半径 --- 面積 # 1.0 --- 3.14 # 1.1 --- 3.80 # 1.2 --- 4.52 # 1.3 --- 5.31 # 問題4 球の体積を計算するプログラムを作成しなさい。 # 実行例 # 体積 = 1766.25 '5人の点数を読み込んでいき、その最高点を表示する' :- '5人の点数を読み込んでいき'(_5人の点ならび), 最高点を表示する(_5人の点ならび). '5人の点数を読み込んでいき'(_5人の点ならび) :- length(_5人の点ならび,5), findall(_点数,( append(L0,[_点数|_],_5人の点ならび), 点数を得る(L0,_点数)), _5人の点ならび),!. 点数を得る(L0,_点数) :- length([_|L0],N人目), writef('%t人目の点数を入力してください : ',[N人目]), get_line(Line), 点数の入力診断(Line,_点数),!. 点数を得る(L0,_点数) :- 点数を得る(L0,_点数). 点数の入力診断(Line,_) :- atom_to_term(Line,_点数,_), number(_点数),!. 点数の入力診断(Line,_点数) :- writef('入力された %t からは点数が得られません。再入力をお願いします\n',[Line]), fail. 最高点を表示する(_5人の点ならび) :- 最高点を(_5人の点ならび,_最高点), 表示する(_最高点). 最高点を(_5人の点ならび,_最高点) :- sort(_5人点ならび,_昇順に整列した5人の点ならび), last(_昇順に整列した5人の点ならび,_最高点). 表示する(_最高点) :- writef('最高点は%tです\n',[_最高点]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/626 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # # 問題1メイン関数でキーボードから二つの整数n1とn2を読み込み,それらをexponent関数を呼び出して, # n1のn2乗を計算し,結果をメイン関数で表示するプログラムを書きなさい. # <実行例> # 二つの整数を入力してください. # n1 = 5 # n2 = 2 # 5の2乗は25です. # 問題2 5人の点数を読み込んでいき、その最高点を表示するプログラムを作成しなさい。 # 問題3 円の面積の一覧表を計算するプログラムを作成しなさい。 # <実行結果> # 半径 --- 面積 # 1.0 --- 3.14 # 1.1 --- 3.80 # 1.2 --- 4.52 # 1.3 --- 5.31 # 問題4 球の体積を計算するプログラムを作成しなさい。 # 実行例 # 体積 = 1766.25 'メイン関数でキーボードから二つの整数n1とn2を読み込み,それらをexponent関数を呼び出して,n1のn2乗を計算し,結果をメイン関数で表示する' :- メイン. メイン :- キーボードから二つの整数n1とn2を読み込み(_n1,_n2), exponent(_n1,_n2,_結果), writef('%tの%t乗は%tです\n',[_n1,_n2,_結果]). キーボードから二つの整数n1とn2を読み込み(_n1,_n2) :- キーボードからn1を読み込み(_n1), キーボードからn2を読み込み(_n2). キーボードからn1を読み込み(_n1) :- write('n1 = '), get_line(Line), キーボードからn1を読み込み診断(Line,_n1),!. キーボードからn1を読み込み(_n1) :- キーボードからn1を読み込み(_n1). キーボードからn1を読み込み診断(Line,_n1) :- atom_to_term(Line,_n1,_), integer(_n1),!. キーボードからn1を読み込み診断(Line,_n1) :- writef('入力された %t からは整数が得られません。再入力をお願いします\n',[Line]), fail. キーボードからn2を読み込み(_n2) :- write('n2 = '), get_line(_n2), キーボードからn2を読み込み診断(Line,_n2),!. キーボードからn2を読み込み(_n2) :- キーボードからn2を読み込み(_n2). キーボードからn2を読み込み診断(Line,_n2) :- atom_to_term(Line,_n2,_), integer(_n2),!. キーボードからn2を読み込み診断(Line,_n2) :- writef('入力された %t からは整数が得られません。再入力をお願いします\n',[Line]), fail. exponent(_n1,0,1) :- !. exponent(_n1,1,_n1) :- !. exponent(_n1,_n2,_結果) :- exponentで定数が整数の時は(_n1,_n2,_結果). exponent(_n1,_n2,_結果) :- exponentで定数が負数の時は(_n1,_n2,_結果). exponentで定数が整数の時は(_n1,_n2,_結果). _n2 > 0, _n2_1 is _n2 - 1, exponent(_n1,_n2_1,_結果_1), _結果 is _n1 * _結果_1. exponentで定数が負数の時は(_n1,_n2,_結果) :- _n2 < 0, _n2_1 is _n2 + 1, exponent(_n1,_n2_1,_結果_1), _結果 is _結果_1 / _n1. % get_line/1 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/329 # # 【質問テンプレ】 # [1] 授業単元: Cプログラミン # [2] 問題文(含コード&リンク): #     四則演算をコマンドラインから入力して答えを出せ。 #     例)keisan.exe 4 x 7 + 2 - 20 / 2 # 答え:20 # program :- user_parameters([_パラメータ]), atom_to_term(_パラメータ,_式,_), _答え is _式, write_formatted('答え: %t\n',[_値]), halt. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/277 # # [1] 授業単元:プログラミング言語(C) # [2] 問題文(含コード&リンク): # Cプログラミングの基礎[新訂版]発行:サイエンス社 著:蓑原隆より # P48 3.1 3.2 3.3 3.4 P55 4.1 P88 5.1 P104 6.1 6.2 # http://ime.nu/upload.jpn.ph/upload/img/u72273.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72276.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72274.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72275.jpg # # 3.2 身長と体重を入力すると、次の判定方法で肥満度を判定するプログラムを # 作成せよ。 # # 標準体重(kg) = (身長(cm) - 100) * 0.9 # # 肥満度(%) = ((体重-標準体重) / 標準体重)) * 100. # 肥満度20%以上はふとり過ぎ。肥満度10~20%はふとりぎみ。 # 肥満度±10%以内は標準。肥満度-10~~-20%はやせぎみ。 # 肥満度20%以下はやせすぎ。 身長と体重を入力すると、次の判定方法で肥満度を判定する :- 身長と体重を入力する(_身長,_体重), その身長の標準体重を得る(_身長,_標準体重), 肥満度を得る(_身長,_体重,_標準体重,_肥満度), 肥満度を判定する(_肥満度,_判定), write_formatted('あなたは肥満度%tで、%tです。\n',[_肥満度,_判定]). 身長と体重を入力する(_身長,_体重) :- 身長を入力する(_身長), 体重を入力する(_体重). 身長を入力する(_身長) :- write('身長を入力してください : '), get_line(Line), 身長入力診断(Line,_身長),!. 身長を入力する(_身長) :- 身長を入力する(_身長). 身長入力診断(Line,_身長) :- atom_to_term(Line,_身長,_), number(_身長),!. 身長入力診断(Line,_身長) :- write_formatted('入力された文字列%tからは身長が得られませんでした。再入力をお願いします。\n',[Line]), fail. 体重を入力する(_体重) :- write('体重を入力してください : '), get_line(Line), 体重入力診断(Line,_体重),!. 体重を入力する(_体重) :- 体重を入力する(_体重). 体重入力診断(Line,_体重) :- atom_to_term(Line,_体重,_), number(_体重),!. 体重入力診断(Line,_体重) :- write_formatted('入力された文字列%tからは体重が得られませんでした。再入力をお願いします。\n',[Line]), fail. その身長の標準体重を得る(_身長,_標準体重) :- _標準体重 = (_身長 - 100) * 0.9. 肥満度を得る(_身長,_体重,_標準体重,_肥満度) :- _肥満度 is ((_体重-_標準体重) / _標準体重)) * 100. 肥満度を判定する(_肥満度,ふとりすぎ) :- _肥満度 >= 20.0. 肥満度を判定する(_肥満度,ふとりすぎ) :- _肥満度 >= 10.0, _肥満度 < 20.0. 肥満度を判定する(_肥満度,ふつう) :- _肥満度 > -10.0, _肥満度 < 10.0. 肥満度を判定する(_肥満度,やせぎみ) :- _肥満度 =< -10.0, _肥満度 > -20.0. 肥満度を判定する(_肥満度,やせすぎ) :- _肥満度 =< -20.0. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/277 # # [1] 授業単元:プログラミング言語(C) # [2] 問題文(含コード&リンク): # Cプログラミングの基礎[新訂版]発行:サイエンス社 著:蓑原隆より # P48 3.1 3.2 3.3 3.4 P55 4.1 P88 5.1 P104 6.1 6.2 # http://ime.nu/upload.jpn.ph/upload/img/u72273.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72276.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72274.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72275.jpg # # 3.1 気温と温度を入力すると、不快指数の値とその値で不快に感じる人の割合を # 表示するプログラムを作成せよ。 # (不快指数) = 0.81 * 気温 + 0.01 * 湿度 * (0.99 * 気温 - 14.3) + 46.3 # 不快指数の値によって次の表に示す割合の人が不快に感じるといわれている。 # 不快指数 割合 # 77未満 約9% # 77以上85未満 約65% # 85以上 約93% '気温と温度を入力すると、不快指数の値とその値で不快に感じる人の割合を表示する' :- '気温と湿度を入力すると、'(_気温,_湿度), 不快指数の値とその値で不快に感じる人の割合を表示する(_気温,_湿度,_不快指数). '気温と湿度を入力する、'(_気温,_湿度) :- 気温を入力する(_気温), 湿度を入力する(_湿度). 気温を入力する(_気温) :- write('気温を入力してください : '), 行入力(_行), 気温入力診断(_行,_気温),!. 気温を入力する(_気温) :- 気温を入力する(_気温). 湿度を入力する(_湿度) :- write('湿度を入力してください : '), 行入力(_行), 湿度入力診断(_行,_湿度),!. 湿度を入力する(_湿度) :- 湿度を入力する(_湿度). 気温入力診断(_行,_気温) :- read_term_from_atom(_行,_気温,[]), integer(_気温),!. 気温入力診断(_行,_) :- writef('入力された文字列 %t からは気温を得られませんでした。再入力をお願いします。\n',[_行]), fail. 湿度入力診断(_行,_湿度) :- read_term_from_atom(_行,_湿度,[]), integer(_湿度),!. 湿度入力診断(_行,_) :- writef('入力された文字列 %t からは湿度を得られませんでした。再入力をお願いします。\n',[_行]), fail. 不快指数の値とその値で不快に感じる人の割合を表示する(_気温,_湿度,_不快指数) :- 不快指数の値とその値で不快に感じる人の割合を(_気温,_湿度,_不快指数,_不快に感じる人の割合), 表示する(_不快指数,_不快に感じる人の割合). 不快指数の値とその値で不快に感じる人の割合を(_気温,_湿度,_不快指数,_不快に感じる人の割合) :- 不快指数の値と(_気温,_湿度,_不快指数), 不快に感じる人の割合を(_不快指数,_不快に感じる人の割合), 不快指数の値と(_気温,_湿度,_不快指数) :- _不快指数 is 0.81 * _気温 + 0.01 * _湿度 * (0.99 * _気温 - 14.3) + 46.3. 不快に感じる人の割合を(_不快指数,9) :- 不快指数が77未満(_不快指数). 不快に感じる人の割合を(_不快指数,65) :- 不快指数が77以上85未満の時(_不快指数). 不快に感じる人の割合を(_不快指数,85) :- 不快指数が85以上の時(_不快指数). 不快指数が77未満(_不快指数) :- _不快指数 < 77. 不快指数が77以上85未満の時(_不快指数) :- _不快指数 >= 77, _不快指数 < 85. 不快指数が85以上の時(_不快指数) :- _不快指数 >= 85. 表示する(_不快指数,_不快に感じる人の割合) :- writef('不快指数は %t, この状態を不快に感じる人の割合は 約%t%%です\n',[_不快指数,_不快に感じる人の割合]). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/721 # # 【課題】Studentというクラスを宣言するプログラムを作成せよ。インスタンス変数には、氏名、生年月日、学籍番号を記録せよ。 # ただし、学籍番号は入学年度を表す二桁の整数、学部を表す一桁の整数、残り四桁の整数を組み合わせた七桁の整数で表現されるものとする。 # インスタンスメソッドとしては、以下のものは必須とする。 # 名字を返すメソッド、名前を返すメソッド、誕生年を和暦で返すメソッド、誕生年を西暦で返すメソッド、入学年度を返すメソッド # 【形態】1. Javaアプリケーション # 【期限】1月11日 # 【ver】linux # 【補足】あまり難しくしないでください。 # データベース構造(学生,1,氏名). データベース構造(学生,2,誕生日). データベース構造(学生,3,学籍番号). 名字を返す(_学籍番号,_名字) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), split(_氏名,[' ',',','-','_'],[_名字,_]). 名前を返す(_学籍番号,_名前) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), split(_氏名,[' ',',','-','_'],[_,_名前]). 誕生年を和暦で返す(_学籍番号,_誕生日の和暦) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), 和暦西暦変換(_誕生日の和暦,_誕生日). 誕生年を西暦で返す(_学籍番号,_誕生日の西暦) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日の西暦,_整数学籍番号). 入学年度を返す(_学籍番号,_入学年度) :- 学籍番号変換(_学籍番号,_整数学籍番号), _入学年度 is _整数学籍番号 // 10000. 学籍番号変換(_学籍番号,_学籍番号) :- integer(_学籍番号),!. 学籍番号変換(_学籍番号,_整数学籍番号) :- \+(integer(_学籍番号)), atom_chars(_学籍番号,Chars), すべてが数字(Chars), atom_to_term(_学籍番号,_整数学籍番号,_),!. 学籍番号変換(_学籍番号ではなくて氏名,_整数学籍番号) :- atom(_学籍番号ではなくて氏名), 学生(_学籍番号ではなくて氏名,_,_整数学籍番号),!. すべてが数字([]) :- !. すべてが数字([A|R]) :- append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']), すべてが数字(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/21 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org1340661.txt # # 2.問題1を利用して、キーボードから実数aと正の整数nを入力しa^1 + a^2 + a^3 +... + a^nを作成せよ。 '問題1を利用して、キーボードから実数aと正の整数nを入力しa^1 + a^2 + a^3 +... + a^nを作成せよ。'(_解) :- キーボードから実数aと正の整数nを入力し(_実数a,_整数n), 'a^1 + a^2 + a^3 +... + a^nを作成せよ。'(1,_正の整数n,_実数a,0,_解). 'a^1 + a^2 + a^3 +... + a^nを作成せよ。'(_正の整数n,_整数n,_実数a,X) :- power(_実数a,_正の整数n,X),!. 'a^1 + a^2 + a^3 +... + a^nを作成せよ。'(M,_正の整数n,_実数a,_解1) :- power(_実数a,M,Y), M2 is M + 1, 'a^1 + a^2 + a^3 +... + a^nを作成せよ。'(M2,_正の整数n,_実数a,_解2), _解1 is _解2 + Y. キーボードから実数aと正の整数nを入力し(_実数a,_正の整数n) :- キーボードから実数aを入力(_実数a), キーボードから正の整数nを入力(_正の整数n). キーボードから実数aを入力(_実数a) :- write('a^1 + a^2 + a^3 +... + a^nの計算をします。実数aを入力してください : '), get_line(Line), 実数a入力診断(Line,_実数a),!. キーボードから実数aを入力(_実数a) :- キーボードから実数aを入力(_実数a). 実数a入力診断(Line,_実数a) :- atom_to_term(Line,_実数a,_), float(_実数a),!. 実数a入力診断(Line,_) :- write_formatted('入力された %t から実数が得られません。再入力をお願いします。\n',[Line]), fail. キーボードから正の整数nを入力(_正の整数n) :- write('正の整数nを入力してください : '), get_line(Line), 整数n入力診断(Line,_正の整数n),!. キーボードから正の整数nを入力(_正の整数n) :- キーボードから正の整数nを入力(_正の整数n). 整数n入力診断(Line,_正の整数n) :- atom_to_term(Line,_正の整数n,_), integer(_正の整数n), _正の整数n > 0,!. 整数n入力診断(Line,_) :- write_formatted('入力された %t から正の整数が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/884 # # 分からないプログラミング課題があります。 # 問)N個の文字列を入力すると文字列の長さが短い順、同じ長さの時は順不同、に #   並べ替えて表すプログラムを作りなさい。 # # 二次元配列とポインタ配列を使うらしいんですけど、コンパイル時にエラーばかり出てしまいます。 # どなたか分かる方いらっしゃいますか? # 'N個の文字列を入力すると文字列の長さが短い順、同じ長さの時は順不同、に並べ替えて表す' :- 'N個の文字列を入力すると'(_N個の文字列), '文字列の長さが短い順、同じ長さの時は順不同、に並べ替えて'(_N個の文字列,_長さ順に並べ替えた文字列), 表す(_長さ順に並べ替えた文字列). 'N個の文字列を入力すると'(_N個の文字列) :- 'N個の'(_N個), length(_N個の文字列,_N個), 'N個の文字列を入力する'(_N個の文字列). 'N個の'(_N個) :- write('何個の文字列を入力しますか : '), get_line(Line), 'N個の入力診断'(Line,_N個),!. 'N個の'(_N個) :- 'N個の'(_N個). 'N個の入力診断'(Line,_N個) :- atom_to_term(Line,_N個,_), integer(_N個), _N個 > 0,!. 'N個の入力診断'(Line,_N個) :- write_formatted('入力された %t からは正の整数が得られません。再入力をお願いします。\n',[Line]), fail. 'N個の文字列を入力する'([]) :- !. 'N個の文字列を入力する'([_文字列|R]) :- 'N個の文字列を入力する'(R). '文字列の長さが短い順、同じ長さの時は順不同、に並べ替えて'(_N個の文字列,_長さの短い順に並べ替えた文字列ならび) :- findall([_長さ,_文字列],( append(_,[_文字列|_],_N個の文字列), sub_atom(_文字列,0,_長さ,0,_文字列)), _長さを鍵に整列したならび), sort(長さを鍵に整列した,_長さの短い順に並