このディレクトリの索引

% 以下のサイトは # 出題場所 :: 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個,_n個の実数,_平均,_標準偏差), 出力する(_平均,_標準偏差). それらの平均と標準偏差を(_n個,_n個の実数,_n個の実数の平均,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_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個の実数の平均), 個々の実数と平均の差の二乗の合計(_n個,_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗の合計), 標準偏差は分散の平方根になる(_n個,_個々の実数と平均の差の二乗の合計,_n個の実数の標準偏差). 個々の実数と平均の差の二乗の合計(_n個,_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗の合計) :- findsum(_個々の実数と平均の差の二乗,( 個々の実数と平均の差の二乗(_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗)),_個々の実数と平均の差の二乗の合計). 個々の実数と平均の差の二乗(_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗) :- 個々の実数(_n個の実数,_個々の実数), _個々の実数と平均の差の二乗 is (_個々の実数 - _n個の実数の平均) ^ 2. 個々の実数(_n個の実数,_個々の実数) :- nth1(_,_n個の実数,_個々の実数). 標準偏差は分散の平方根になる(_n個,_個々の実数と平均の差の二乗の合計,_n個の実数の標準偏差) :- _n個の実数の標本の分散 is _個々の実数と平均の差の二乗の合計 / _n個, _n個の実数の標準偏差 is sqrt(_n個の実数の標本の分散). 実数を得る(_個々の実数) :- 行入力(_行), read_term_from_atom(_行,_実数,[]), 実数診断(_行,_実数),!. 実数を得る(_個々の実数) :- 実数を得る(_個々の実数). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 実数診断(_行,_実数) :- float(_実数),!. 実数診断(Line,_実数) :- writef('入力された %t から実数が得られません。再入力をお願いします。\n',[_行]), fail. findsum(_集約対象項,_目標,_合計) :- findall(_集約対象項,_目標,_集約対象項ならび), sum_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)が乗ることはできません。 'できるだけ多くの人数で、肩車をしようと思います。      肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_最大人数) :- 身長と体重のセットを得る(_身長と体重のセット), 'できるだけ多くの人数で、肩車をしようと思います。'(_身長と体重のセット,_最大人数). 身長と体重のセットを得る(_身長と体重のセット) :- 行を得る(_行,_終了状態), 身長と体重のセットを得る(_終了状態,_行,_身長と体重のセット). 行を得る(_行,_終了状態) :- get_char(_文字), 行を得る(_文字,_文字ならび,_終了状態), atomic_list_concat(_文字ならび,_行). 行を得る(_入力文字,[],_終了状態) :- 入力文字が改行文字またはend_of_fileの時停止する(_入力文字,_終了状態),!. 行を得る(_文字,_行ならび,_終了状態) :- 行を得るために文字入力を続ける(_文字,_行ならび,_終了状態). 入力文字が改行文字またはend_of_fileの時停止する('\n',改行終了). 入力文字が改行文字またはend_of_fileの時停止する(end_of_file,入力終了). 行を得るために文字入力を続ける(_文字,[_文字|_残りの文字ならび],_終了状態) :- get_char(_次の文字), 行を得る(_次の文字,_残りの文字ならび,_終了状態). 身長と体重のセットを得る(入力終了,_,[]) :- !. 身長と体重のセットを得る(改行終了,'\n',[]) :- !. 身長と体重のセットを得る(_,_行,_身長体重ならび) :- 入力終了になるまで行入力を続ける(_,_行,_身長体重ならび). 入力終了になるまで行入力を続ける(_,_行,[[_身長,_体重]|_残りの行ならび]) :- 行から身長と体重を取り出す(_行,_身長,_体重), 行を得る(_次の行,_終了状態), 身長と体重のセットを得る(_終了状態,_次の行,_残りの行ならび). 行から身長と体重を取り出す(_行,_身長,_体重) :- カンマ区切りの場合(_行,_身長,_体重),!. 行から身長と体重を取り出す(_行,_身長,_体重) :- 空白区切りの場合(_行,_身長,_体重). カンマ区切りの場合(_行,_身長,_体重) :- sub_atom(_行,_前文字列,',',_後文字列), read_term_from_atom(_前文字列,_身長,[]), read_term_from_atom(_後文字列,_体重,[]). 空白区切りの場合(_行,_身長,_体重) :- sub_atom(_行,_前文字列,' ',_後文字列), read_term_from_atom(_前文字列,_身長,[]), read_term_from_atom(_後文字列,_体重,[]). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 'できるだけ多くの人数で、肩車をしようと思います。'(_人間ならび,_最大人数) :- findall(_肩車人数,( 肩車人数(_人間ならび,_肩車人数)),_肩車人数ならび), max_list(_肩車人数ならび,_最大人数). 肩車人数(_人間ならび,_肩車人数) :- select(_取りだされた人間,_人間ならび,_残りの人間ならび), 肩車を重ねる(_取りだされた人間,_残りの人間ならび,_肩車重ね), length(_肩車重ね,_肩車人数). 肩車を重ねる(_自分,_人間ならび,[_自分|_肩車重ね]) :- 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね). 肩車を重ねる(_一番上の人間,_,[_一番上の人間]). 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね) :- select(_上の人間,_人間ならび,_残りの人間ならび), '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_上の人間,_自分), 肩車を重ねる(_上の人間,_残りの人間ならび,_肩車重ね). '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'([_上の人間の身長,_上の人間の体重],[_自分の身長,_自分の体重]) :- _上の人間の身長 @< _自分の身長, _上の人間の体重 @< _自分の体重. % 以下のサイトは '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる データが標準入力で与えられた際、結果を標準出力に出力する' :- データが標準入力で与えられた際(_与えられた数字), '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる'(_与えられた数字,_いくつ), 結果を標準出力に出力する(_いくつ). データが標準入力で与えられた際(_与えられた数字) :- write('数字を入力してください : '), read_line_to_codes(current_input,Codes), number_codes(_与えられた数字,Codes). '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる'(_与えられた数字,_いくつ) :- '与えられた数字よりも小さい数字の中で'(_与えられた数字,_与えられた数字よりも小さい数字のならび), 素数がいくつあるか調べる(_与えられた数字よりも小さい数字のならび,_いくつ). '与えられた数字よりも小さい数字の中で'(_与えられた数字,_与えられた数字よりも小さい数字のならび) :- succ(_与えられた数字_1,_与えられた数字), findall(N,between(2,_与えられた数字_1,N),_与えられた数字よりも小さい数字のならび). 素数がいくつあるか調べる(_与えられた数字よりも小さい数字のならび,_いくつ) :- 度数(非決定性のエラトステネスの篩(_与えられた数字よりも小さい数字のならび,_素数),_いくつ). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|L1],_素数) :- 先頭の素数を網として篩に掛けて行く(N,L1,_素数). 先頭の素数を網として篩に掛けて行く(N,L1,_素数) :- 'L1の要素でNで割り切れないものを篩に掛ける'(N,L1,L2), 非決定性のエラトステネスの篩(L2,_素数). 'L1の要素でNで割り切れないものを篩に掛ける'(N,L1,L2) :- findall(_要素,( 'L1の要素で'(L1,_要素), 'Nで割り切れないものを篩に掛ける'(_要素,N)),L2). 'L1の要素で'(L1,_要素) :- member(_要素,L1). 'Nで割り切れないものを篩に掛ける'(_要素,N) :- \+(0 is _要素 mod N). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). 結果を標準出力に出力する(_いくつ) :- writef('結果は %w\n',[_いくつ]). :- '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる データが標準入力で与えられた際、結果を標準出力に出力する',halt. % 以下のサイトは # 出典 :: 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(_得点,( '5人の', '得点(10点満点)を受け取る'(_得点)),_5人の得点ならび). '5人の' :- between(1,5,_). '得点(10点満点)を受け取る'(_得点) :- 行入力(_行文字列), '診断: 得点(10点満点)を受け取る'(_行文字列,_得点),!. '得点(10点満点)を受け取る'(_得点) :- '得点(10点満点)を受け取る'(_得点). '診断: 得点(10点満点)を受け取る'(_行文字列,_得点) :- 行文字列を解析して0から10の範囲の得点を得る(_行文字列,_得点),!. '診断: 得点(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. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 157代目 #602 # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し、'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力せよ。'(_文字列). '文字列を入力し、'(_文字列) :- read_line_to_codes(user_input,Codes), atom_chars(_文字列,Codes). 'その文字列に含まれる英字、数字、その他の文字の数を出力せよ。'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力せよ(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- 文字ごとの種別判定行列を作る(_文字列,_文字ごとの種別判定行列), 列を合計したならび(_文字ごとの種別判定行列,[_英字の数,_数字の数,_その他の文字の数]). 文字ごとの種別判定行列を作る(_文字列,_文字ごとの種別判定行列) :- findall([A,B,C],( sub_atom(_文字列,_,1,_,_文字), 文字種判定(_文字,A,B,C)),_文字ごとの種別判定行列). 列を合計したならび(_行列,[_英字の数,_数字の数,_その他の文字の数]) :- 転置(_行列,_転置された行列), 転置された行の合計をならびに取る(_転置された行列,[_英字の数,_数字の数,_その他の文字の数]). 転置された行の合計をならびに取る(_転置された行列,_行の合計ならび) :- findall(S,( member(L,_転置された行列), sum_list(L,S)),_行の合計ならび). 出力せよ(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数は %w,数字の数は %w,その他の文字の数は %w\n',[_英字の数,_数字の数,_その他の文字の数]). 文字種判定(_文字,1,0,0) :- 英字(_文字),!. 文字種判定(_文字,0,1,0) :- 数字(_文字),!. 文字種判定(_文字,0,0,1). 英字(A) :- A @>='A',A @=< 'Z'; A @>='a',A @=< 'z'. 数字(A) :- A @>= '0', A @=< '9'. 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #531 # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 平成○年の値を入力し、西暦に変換するプログラムを作成 # '平成○年の値を入力し、西暦に変換する' :- '平成○年の値を入力し漢数字を数字に変換する'(_数字), '平成元年は西暦1989年であることから西暦を得る'(_数字,_西暦), format('西暦は ~w です。\n',[_西暦]). '平成○年の値を入力し漢数字を数字に変換する'(_数字) :- '平成○年の値を入力し'(_漢数字年), 漢数字を数字に変換する(_漢数字年,_数字). '平成○年の値を入力し'(_漢数字年) :- write('平成○年を入力してください : '), 漢数字年を得る(_漢数字年). 漢数字年を得る(_漢数字年) :- 行入力されたものが漢数字であるか検査する(_漢数字年),!. 漢数字年を得る(_漢数字年) :- 漢数字年を得る(_漢数字年). 行入力されたものが漢数字であるか検査する(_漢数字年) :- 行入力(_行), 年は切り取って検査する(_行,_年が切り取られた行), 漢数字年入力検査(_年が切り取られた行,_漢数字年). 年は切り取って検査する(_行,_年が切り取られた行) :- 末尾文字が年だったら切り取る(_行,_年が切り取られた行),!. 年は切り取って検査する(_行,_行). 末尾文字が年だったら切り取る(_行,_年が切り取られた行) :- sub_atom(_行,_,1,0,年), sub_atom(_行,0,_,1,_年が切り取られた行). 漢数字年入力検査(元,元) :- !. 漢数字年入力検査(_漢数字年,_漢数字年) :- forall(sub_atom(_漢数字年,_,1,_,A),'漢数字・数字'(A,_)),!. 漢数字年入力検査(_行,_) :- writef('入力された %t からは漢数字が得られませんでした。再入力をお願いします。\n',[_行]), fail. 漢数字を数字に変換する(元,1) :- !. 漢数字を数字に変換する(_年,_数字) :- '二桁年の数字を得る'(_年,_数字). 漢数字を数字に変換する(_年,_数字) :- '一桁年の数字を得る'(_年,_数字). '二桁年の数字を得る'(_年,_数字) :- '十の桁、一の桁の漢数字を切り取り数字を得る'(_年,_数字). '十の桁、一の桁の漢数字を切り取り数字を得る'(_年,_数字) :- '十の桁、一の桁の漢数字を得る'(_年,_十の桁の漢数字,_一の桁の漢数字), '十の桁、一の桁の数字を得る'(_十の桁の漢数字,_一の桁の漢数字,_十の桁の数字,_一の桁の数字), _数字 is _十の桁の数字 * 10 + _一の桁の数字. '十の桁、一の桁の漢数字を得る'(_年,_十の桁の漢数字,_一の桁の漢数字) :- sub_atom(_年,0,1,R,_十の桁の漢数字), sub_atom(_年,R,1,0,_一の桁の漢数字), R > 0. '十の桁、一の桁の数字を得る'(_十の桁の漢数字,_一の桁の漢数字,_十の桁の数字,_一の桁の数字) :- '漢数字・数字'(_十の桁の漢数字,_十の桁の数字), '漢数字・数字'(_一の桁の漢数字,_一の桁の数字). '一桁年の数字を得る'(_年,_数字) :- sub_atom(_年,0,1,0,_一の桁の漢数字), '漢数字・数字'(_一の桁の漢数字,_数字). '平成元年は西暦1989年であることから西暦を得る'(_数字,_西暦) :- _西暦 is _数字 + 1989 - 1. '漢数字・数字'(一,1). '漢数字・数字'(二,2). '漢数字・数字'(三,3). '漢数字・数字'(四,4). '漢数字・数字'(五,5). '漢数字・数字'(六,6). '漢数字・数字'(七,7). '漢数字・数字'(八,8). '漢数字・数字'(九,9). '漢数字・数字'(十,1). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは :- 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++の宿題片付けます 161代目 #983 # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ.' :- '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントする'. '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントする' :- 入力したDNA塩基配列中にある(_DNA塩基ならび), '塩基 t, c, a, gそれぞれの個数をカウントする'(_DNA塩基ならび,0,0,0,0,_t,_c,_a,_g), writef('Thymine (t) : %w\nCytoshine (c) : %w\nAdenine (a) : %w\nGuanime (g) : %w\n',[_t,_c,_a,_g]). 入力したDNA塩基配列中にある(_DNA塩基ならび) :- 行入力(_行), atom_chars(_行,_DNA塩基ならび). '塩基 t, c, a, gそれぞれの個数をカウントする'([],_t,_c,_a,_g,_t,_c,_a,_g). '塩基 t, c, a, gそれぞれの個数をカウントする'([_塩基|R],_t_1,_c_1,_a_1,_g_1,_t,_c,_a,_g) :- 塩基の集計欄に加算(_塩基,_t_1,_c_1,_a_1,_g_1,_t_2,_c_2,_a_2,_g_2), '塩基 t, c, a, gそれぞれの個数をカウントする'(R,_t_2,_c_2,_a_2,_g_2,_t,_c,_a,_g). 塩基の集計欄に加算(t,_t_1,_c,_a,_g,_t,_c,_a,_g) :- succ(_t_1,_t). 塩基の集計欄に加算(c,_t,_c_1,_a,_g,_t,_c,_a,_g) :- succ(_c_1,_c). 塩基の集計欄に加算(a,_t,_c,_a_1,_g,_t,_c,_a,_g) :- succ(_a_1,_a). 塩基の集計欄に加算(g,_t,_c,_a,_g_1,_t,_c,_a,_g) :- succ(_g_1,_g). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典 :: 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. % 以下のサイトは ファイルから全行読み取る(_ファイル,_全行) :- open(_ファイル,read,_ストリーム), ストリームから全行読み取る(_ストリーム,_全行), close(_ストリーム). ストリームから全行読み取る(_ストリーム,[]) :- at_end_of_stream(_ストリーム),!. ストリームから全行読み取る(_ストリーム,_全行) :- ストリームから全行読み取って行く(_ストリーム,_全行). ストリームから全行読み取って行く(_ストリーム,[_行|R]) :- 行入力(_ストリーム,_行), ストリームから全行読み取る(_ストリーム,R). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_ストリーム,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,end_of_file) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_ストリーム,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,_) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!,fail. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,end_of_file) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,_) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!,fail. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは # 最大の利益 # 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). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/7 # # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示するプログラムを作成しなさい。 # ただし、文字を大文字に変換する関数を作成し、それを利用すること。 # 'キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示する' :- キーボードから入力した文字列を(_文字コードならび), 'すべて大文字に変換して(小文字は大文字に、大文字はそのままに)'(_文字コードならび,_大文字に変換された文字コードならび), 表示する(_大文字に変換された文字コードならび). キーボードから入力した文字列を(_文字コードならび) :- write('文字列を入力してください : '), read_line_to_codes(user_input,_文字コードならび). 'すべて大文字に変換して(小文字は大文字に、大文字はそのままに)'(_文字コードならび,_大文字に変換された文字コードならび) :- findall(_変換されたコード,( member(_文字コード,_文字コードならび), '小文字は大文字に、大文字はその(_文字コード,_変換された文字コード)),_大文字に変換された文字コードならび). '小文字は大文字に、大文字はそのままに'(_文字コード,_変換された文字コード) :- 小文字は大文字に(_文字コード,_変換された文字コード). '小文字は大文字に、大文字はそのままに'(_文字コード,_文字コード) :- 大文字はそのままに(_文字コード). 小文字は大文字に(_文字コード,_変換された文字コード) :- 小文字の場合は(_文字コード), 大文字に変換して(_文字コード,_変換されたコード). 大文字はそのままに(_文字コード) :- \+(小文字の場合は(_文字コード)). 小文字の場合は(_文字コード) :- between(97,121,_文字コード). 大文字に変換して(_文字コード,_変換されたコード) :- _大文字コード is _文字コード - 32. 表示する(_大文字に変換された文字コードならび) :- atom_codes(_文字列,_大文字に変換された文字コードならび), writef('%w\n',[_文字列]). % 以下のサイトは # 出典 :: 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://hibari.2ch.net/test/read.cgi/tech/1289913298/7 # # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示するプログラムを作成しなさい。 # ただし、文字を大文字に変換する関数を作成し、それを利用すること。 # 'キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示する' :- キーボードから入力した文字列を(_文字コードならび), すべて大文字に変換して(_文字コードならび,_大文字に変換された文字コードならび), 表示する(_大文字に変換された文字コードならび). キーボードから入力した文字列を(_文字コードならび) :- write('文字列を入力してください : '), read_line_to_codes(user_input,_文字コードならび). すべて大文字に変換して([],[]). すべて大文字に変換して(L1,L2) :- 小文字場合は大文字に変換する(L1,L2). 小文字場合は大文字に変換する([_文字コード|R1],[_変換されたコード|R2]) :- 小文字の場合は大文字に変換して(_文字コード,_変換されたコード), すべて大文字に変換して(R1,R2). 小文字の場合は大文字に変換して(_文字コード,_変換されたコード) :- 小文字の場合は(_文字コード), 大文字に変換して(_文字コード,_変換されたコード). 小文字の場合は大文字に変換して(_文字コード,_文字コード) :- 小文字でない場合は変換せずに(_文字コード). 小文字の場合は(_文字コード) :- between(97,121,_文字コード). 大文字に変換して(_文字コード,_変換されたコード) :- _大文字コード is _文字コード - 32. 小文字でない場合は変換せずに(_文字コード) :- \+(小文字の場合は(_文字コード)). 表示する(_大文字に変換された文字コードならび) :- atom_codes(_文字列,_大文字に変換された文字コードならび), writef('%w\n',[_文字列]). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), once(成績データを得る(_成績ならび)). 成績データを得る(_成績ならび) :- findnsols(100,[_学籍番号,_成績],( 連続した行入力(_行), (行入力終了条件(_行),!,fail;split(_行,[' '],[_学籍番号,_成績]))),_成績ならび). 連続した行入力(_行) :- repeat, get_line(_行). 行入力終了条件('0 0'). 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ member([_学籍番号,_成績],_成績ならび),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび) :- once(上位11名を選別する(_成績ならび,_降順に整列した成績鍵ならび,_上位11名)), 上位11名を表示する(_上位11名). 上位11名を選別する(_成績ならび,_降順に整列した成績鍵ならび,_上位11名ならび) :- findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_成績ならび,_降順に整列した成績鍵ならび,_学籍番号,_成績),_上位11名ならび). '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_成績ならび,_降順に整列した成績鍵ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), member([_学籍番号,_成績],_成績ならび). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), get_line(_行), length(Ln,100), 成績データを得る(Ln,_行,_整列鍵ならび,_成績ならび). 成績データを得る(_,'0 0',[]) :- !. 成績データを得る([],_,[]). 成績データを得る([_|Ln],_行,[[_学籍番号,_成績]|R]) :- split(_行,[' '],[_学籍番号,_成績]), get_line(_行_2), 成績データを得る(Ln,_行_2,R). 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ member([_学籍番号,_成績],_成績ならび),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび) :- 上位11名を選別する(_上位11名), 上位11名を表示する(_上位11名). 上位11名を選別する(_降順に整列した成績鍵ならび,_成績ならび,_上位11名ならび) :- once(findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_降順に整列した成績鍵ならび,_成績ならび,_学籍番号,_成績),_上位11名ならび)). '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_降順に整列した成績鍵ならび,_成績ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), member([_学籍番号,_成績],_成績ならび). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 成績データを成績順に並べ直す(_成績ならび,_成績順に整列した成績ならび), 上位11名の選別(_成績順に整列した成績ならび,_上位11名ならび), 上位11名を表示する(_上位11名ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), get_line(_行), 成績データを得る(1,_行,_整列鍵ならび,_成績ならび). 成績データと整列鍵を得る(_,'0 0',[],[]) :- !. 成績データと整列鍵を得る(100,_,[],[]). 成績データと整列鍵を得る(M,_行,[[_成績,M]|R1],[[_学籍番号,_成績]|R2]) :- split(_行,[' '],[_学籍番号,_成績]), succ(M,M_2), get_line(_行_2), 成績データと整列鍵を得る(M_2,_行_2,R1,R2). 成績データを成績順に並べ直す(_整列鍵ならび,_成績ならび,_成績順に整列した成績ならび) :- sort(_整列鍵ならび,_整列した整列鍵ならび), 成績データを大きい順に並べ直す(_整列した整列鍵ならび,_成績ならび,[],_成績順に整列した成績ならび). 成績データを大きい順に並べ直す([],_,_成績順に整列した成績ならび,_成績順に整列した成績ならび). 成績データを大きい順に並べ直す([[_,M]|R1],_成績ならび,L1,_成績順に整列した成績ならび) :- nth1(M,_成績ならび,[_学籍番号,_成績]), 成績データを大きい順に並べ直す(R1,_成績ならび,[[_学籍番号,_成績]|L1],_成績順に整列した成績ならび). 上位11名の選別(L,_上位11名ならび) :- findnsols(11,X,member(X,L),_上位11名ならび),!. 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典 :: Qiita_47443e0fb2988c1332b2 表(1,×,×,×,×,×). 表(2,×,×,×,○,×). 表(3,×,×,○,×,×). 表(4,×,○,×,×,×). 表(5,×,×,○,○,○). 表(6,×,○,○,×,×). 表(7,×,○,×,○,○). 表(8,×,○,○,○,○). 表(9,○,×,×,×,×). 表(10,○,×,×,○,×). 表(11,○,×,○,×,○). 表(12,○,○,×,×,○). 表(13,○,×,○,○,○). 表(14,○,○,○,×,○). 表(15,○,○,×,○,○). 表(16,○,○,○,○,○). 結婚できるか(_結婚できるか) :- findall(_項目の判定,聞き取り(_項目の判定),[_年収,_身長,_学歴,_親が資産家]), 結婚できるか(_年収,_身長,_学歴,_親が資産家,_結婚できるか). 聞き取り項目(年収,年収). 聞き取り項目(身長,身長). 聞き取り項目(学歴,学歴). 聞き取り項目(親の資産額,親が資産家). 聞き取り(_項目の判定) :- 聞き取り項目の値を得る(_項目,_値), 項目の判定(_項目,_値,_項目の判定). 聞き取り項目の値を得る(_項目,_値) :- 聞き取り項目(_質問,_項目), writef('%t : ',[_質問]), 行入力(_値). 項目の判定(_項目,_値,_項目の判定) :- P =.. [_項目,_値,_項目の判定], call(P). 年収(_年収文字列,○) :- 年収が10000000円以上(_年収文字列),!. 年収(_,×). 年収が10000000円以上(_年収文字列) :- atom_number(_年収文字列,_年収), _年収 >= 10000000. 親が資産家(_資産額文字列,○) :- 親の資産が10000000円以上(_資産額文字列),!. 親が資産家(_,×). 親の資産が10000000円以上(_資産額文字列) :- atom_number(_資産額文字列,_資産額), _資産額 >= 100000000. 身長(_身長文字列,○) :- 身長が180cm以上(_身長文字列),!. 身長(_,×). 身長が180cm以上(_身長文字列) :- atom_number(_身長文字列,_身長), _身長 >= 180. 学歴(_学歴,○) :- 最終学歴の偏差値が65以上(_学歴),!. 学歴(_学歴,×). 最終学歴の偏差値が65以上(_大学卒) :- 入試時点の偏差値(_大学卒,_偏差値), _偏差値 >= 65. 入試時点の偏差値(南河内大学,71). 入試時点の偏差値(私立東京未来大学,62). 結婚できるか(_年収,_身長,_学歴,_親が資産家,結婚できる) :- 表(_,_年収,_身長,_学歴,_親が資産家,○). 結婚できるか(_年収,_身長,_学歴,_親が資産家,結婚できない) :- 表(_,_年収,_身長,_学歴,_親が資産家,×). 行入力(_行文字列) :- 行入力文字ならびを得る(_行入力文字ならび), atom_chars(_行文字列,_行入力文字ならび). 行入力文字ならびを得る(_行入力文字ならび) :- findall(_文字,(文字入力(_文字),(行入力終了(_文字),!,fail;true)),_行入力文字ならび). 文字入力(end_of_file) :- at_end_of_stream(user_input). 文字入力(_文字) :- get_char(_文字). 文字入力(_文字) :- 文字入力(_文字). 行入力終了(end_of_file). 行入力終了('\n'). % 以下のサイトは # 出典 :: 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([]. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/726 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した10文字以内の任意の文字列の中で、 # ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す関数 # char *cut_str(char *address1, char target_char)を定義し、 # その動作を確認するkadai7-2.cを作りなさい。 # ただし、文字列と、ある特定の文字の入力は、 # char str[10], target_char; # scanf("%s %c", str, &target_char); # で入力されるものとして、 # 答えは以下で出力されるものとする。 # printf("answer = %s\n", cut_str(str, target_char)); # # 'キーボードから入力した10文字以内の任意の文字列の中で、ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す'(_ある特定の文字が最初に現れる位置からそれ以降の部分文字列) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字), 'ある特定の文字が最初に現れる位置からそれ以降の部分文字列を返す'(_文字列,_ある特定の文字,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列). キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- 催促の後一行入力して文字列とある特定の文字を得る(_文字列,_ある特定の文字),!. キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字). 催促の後一行入力して文字列とある特定の文字を得る(_文字列,_ある特定の文字) :- 催促の後一行入力する(_入力文字列), 文字列入力診断(_入力文字列,_文字列,_ある特定の文字). 催促の後一行入力する(_入力文字列) :- write('10文字以内の任意の文字列とある特定の文字を空白区切りで入力してください : '), 一行読み込む(_入力文字列,_). 文字列入力診断(_入力文字列,_文字列,_ある特定の文字) :- 文字列とある特定の文字を切り出す(_入力文字列,_文字列,_ある特定の文字), 文字列の長さ診断(_文字列,_ある特定の文字),!. 文字列入力診断(_入力文字列,_,_) :- writef('入力された %t から適切な情報が得られません。再入力をお願いします。\n',[_入力文字列]), fail. 文字列とある特定の文字を切り出す(_入力文字列,_文字列,_ある特定の文字) :- sub_atom(_入力文字列,_文字列,_空白文字列,_ある特定の文字), 空白文字列(_空白文字列), ある特定の文字は先頭文字は空白になり得ない(_ある特定の文字). 空白文字列(_空白文字列) :- sub_atom(_空白文字列,_,1,_,' '), forall(sub_atom(_空白文字列,_,1,_,_文字),_文字 = ' '). ある特定の文字は先頭文字は空白になり得ない(_ある特定の文字) :- \+(sub_atom(_ある特定の文字,0,1,_,' ')). 文字列の長さ診断(_文字列,_ある特定の文字) :- '10文字以内の文字列と1文字のある特定の文字'(_文字列,_ある特定の文字),!. 文字列の長さ診断(_文字列,_ある特定の文字) :- atom_length(_文字列,_文字列の長さ), writef('入力された文字列 %t は%t文字あります。10文字以下の長さで再入力をお願いします\n',[_文字列,_文字列の長さ]), fail. '10文字以内の文字列と1文字のある特定の文字'(_文字列,_ある特定の文字) :- '10文字以内の文字列'(_文字列), '1文字のある特定の文字'(_ある特定の文字). '10文字以内の文字列'(_文字列) :- atom_length(_文字列,_文字列の長さ), _文字列の長さ =< 10. '1文字のある特定の文字'(_ある特定の文字) :- atom_length(_ある特定の文字,1). 'ある特定の文字が最初に現れる位置からそれ以降の部分文字列を返す'(_文字列,_ある特定の文字,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列) :- sub_atom(_文字列,S,_,_,_ある特定の文字), sub_atom(_文字列,S,_,0,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列),!. 一行読み込む(_行,_終了状態) :- 行入力(_行,_終了状態). 行入力(X,_終了状態) :- get_char(C), '行入力/3'(C,Chars,_終了状態), atom_chars(X,Chars). '行入力/3'('\n',[],改行) :- !. '行入力/3'([A],[A],end_of_file) :- at_end_of_stream(user_input),!. '行入力/3'(C,[C|R],_終了状態) :- get_char(C2), '行入力/3'(C2,R,_終了状態). % 以下のサイトは # 出典 :: Yahoo 知恵袋 pata0103さんの質問 # - - - # 1 2 - # 1 - 3 # このようなテキストファイルを読み取って # int a[3][3]という配列に # 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する # といったことをするにはどのようにコードを書けばいいのでしょう? # 簡単なことで申し訳ありませんがよろしくお願いします。 # '- - - 1 2 - 1 - 3 このようなテキストファイルを読み取って int a[3][3]という配列に 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(_ファイル,_a) :- テキストファイルを読み取って(_ファイル,_Lines), 'int a[3][3]という配列に 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(Lines,_a). このようなテキストファイルを読み取って(_ファイル,Lines) :- get_lines(_ファイル,Lines). 'int a[3][3]という配列に 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(Lines,_a) :- findall(L,( 読み取った行をならびに変換し(Line,L1), 'ならびの各要素に、座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(L1,L)),_a). 読み取った行をならびに変換し(Line,L1) :- member(Line,Lines), split(Line,[' '],L1). 'ならびの各要素に、座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(L1,L) :- findall(B,( member(A,L1), '”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(A,B)),L). '”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(-,-1) :- !. '”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(_数字,_数字). get_line(Line) :- read_line_to_codes(user_input,Codes), atom_codes(Line,Codes). get_lines([]) :- at_end_of_stream(user_input),!. get_lines([Line|R]) :- get_line(Line), get_lines(R). % 以下のサイトは 行文字列入力(_行文字列,_終了状態) :- 一文字を得る(_文字), 文字ならび入力(_文字,_文字ならび,_終了状態), 文字ならびを行文字列に変換する(_行文字列,_文字ならび). 文字ならび入力(_文字,_文字ならび,_終了状態) :- 入力文字が改行またはend_of_fileで終了する(_文字,_文字ならび,_終了状態),!. 文字ならび入力(_文字,_文字ならび,_終了状態) :- 文字を読み込みながら文字ならび入力を続ける(_文字,_文字ならび,_終了状態). 入力文字が改行またはend_of_fileで終了する(end_of_file,[],end_of_file) :- !. 入力文字が改行またはend_of_fileで終了する('\n',[],改行). 文字を読み込みながら文字ならび入力を続ける(_文字,[_文字|R],_終了状態) :- 一文字を得る(_次の文字), 文字ならび入力(_次の文字,R,_終了状態). 一文字を得る(_文字) :- get_char(_文字). 文字ならびを行文字列に変換する(_行文字列,_文字ならび) :- atom_chars(_行文字列,_文字ならび). % 以下のサイトは 行入力(_行,_終了状態) :- 一文字を得る(_文字), 文字ならび入力(_文字,_文字ならび,_終了状態), atom_chars(_行,_文字ならび). 文字ならび入力(_文字,_文字ならび,_終了状態) :- 入力文字が改行またはend_of_fileで終了する(_文字,_文字ならび,_終了状態),!. 文字ならび入力(_文字,_文字ならび,_終了状態) :- 文字を読み込みながら文字ならび入力を続ける(_文字,_文字ならび,_終了状態). 入力文字が改行またはend_of_fileで終了する(end_of_file,[],end_of_file) :- !. 入力文字が改行またはend_of_fileで終了する('\n',[],改行). 文字を読み込みながら文字ならび入力を続ける(_文字,[_文字|R],_終了状態) :- 一文字を得る(_次の文字), 文字ならび入力(_次の文字,R,_終了状態). 一文字を得る(_文字) :- 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)が乗ることはできません。 'できるだけ多くの人数で、肩車をしようと思います。      肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_最大人数) :- 身長と体重のセットを得る(_身長と体重のセット), 'できるだけ多くの人数で、肩車をしようと思います。'(_身長と体重のセット,_最大人数). 身長と体重のセットを得る(_身長と体重のセット) :- 行を得る(_行,_終了状態), 身長と体重のセットを得る(_終了状態,_行,_身長と体重のセット). 行を得る(_行,_終了状態) :- get_char(_文字), 行を得る(_文字,_文字ならび,_終了状態), atomic_list_concat(_文字ならび,_行). 行を得る(_入力文字,[],_終了状態) :- 入力文字が改行文字またはend_of_fileの時停止する(_入力文字,_終了状態),!. 行を得る(_文字,_行ならび,_終了状態) :- 行を得るために文字入力を続ける(_文字,_行ならび,_終了状態). 入力文字が改行文字またはend_of_fileの時停止する('\n',改行終了). 入力文字が改行文字またはend_of_fileの時停止する(end_of_file,入力終了). 行を得るために文字入力を続ける(_文字,[_文字|_残りの文字ならび],_終了状態) :- get_char(_次の文字), 行を得る(_次の文字,_残りの文字ならび,_終了状態). 身長と体重のセットを得る(入力終了,_,[]) :- !. 身長と体重のセットを得る(改行終了,'\n',[]) :- !. 身長と体重のセットを得る(_,_行,_身長体重ならび) :- 入力終了になるまで行入力を続ける(_,_行,_身長体重ならび). 入力終了になるまで行入力を続ける(_,_行,[[_身長,_体重]|_残りの行ならび]) :- 行から身長と体重を取り出す(_行,_身長,_体重), 行を得る(_次の行,_終了状態), 身長と体重のセットを得る(_終了状態,_次の行,_残りの行ならび). 行から身長と体重を取り出す(_行,_身長,_体重) :- カンマ区切りの場合(_行,_身長,_体重),!. 行から身長と体重を取り出す(_行,_身長,_体重) :- 空白区切りの場合(_行,_身長,_体重). カンマ区切りの場合(_行,_身長,_体重) :- sub_atom(_行,_前文字列,',',_後文字列), read_term_from_atom(_前文字列,_身長,[]), read_term_from_atom(_後文字列,_体重,[]). 空白区切りの場合(_行,_身長,_体重) :- sub_atom(_行,_前文字列,' ',_後文字列), read_term_from_atom(_前文字列,_身長,[]), read_term_from_atom(_後文字列,_体重,[]). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 'できるだけ多くの人数で、肩車をしようと思います。'(_人間ならび,_最大人数) :- findall(_肩車人数,( 肩車人数(_人間ならび,_肩車人数)),_肩車人数ならび), max_list(_肩車人数ならび,_最大人数). 肩車人数(_人間ならび,_肩車人数) :- select(_取りだされた人間,_人間ならび,_残りの人間ならび), 肩車を重ねる(_取りだされた人間,_残りの人間ならび,_肩車重ね), length(_肩車重ね,_肩車人数). 肩車を重ねる(_自分,_人間ならび,[_自分|_肩車重ね]) :- 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね). 肩車を重ねる(_一番上の人間,_,[_一番上の人間]). 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね) :- select(_上の人間,_人間ならび,_残りの人間ならび), '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_上の人間,_自分), 肩車を重ねる(_上の人間,_残りの人間ならび,_肩車重ね). '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'([_上の人間の身長,_上の人間の体重],[_自分の身長,_自分の体重]) :- _上の人間の身長 @< _自分の身長, _上の人間の体重 @< _自分の体重. % 以下のサイトは # 出典 :: CodeIQ q1565 # 【問題】 # できるだけ多くの人数で、肩車をしようと思います。 #      # # 肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。 # # # 【例】 # 一行ごとに、身長と体重のセットが与えられます。次の例は、5人の身長と体重を表しています。 # 166 71 # 178 84 # 176 94 # 174 85 # 174 65 # # # この中から肩車をする人間を選ぶと、身長と体重が # (166, 71) # (174, 85) # (176, 94) # の3人が最大人数になります。 # # ※身長と体重共に、上の人が下の人“より小さい”場合に肩車が許されるとしていますので、 #  (174, 85)の上に(174, 65)が乗ることはできません。 'できるだけ多くの人数で、肩車をしようと思います。      肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_最大人数) :- 身長と体重のセットを得る(_身長と体重のセット), 'できるだけ多くの人数で、肩車をしようと思います。'(_身長と体重のセット,_最大人数). 身長と体重のセットを得る(_身長と体重のセット) :- 行を得る(_行,_終了状態), 身長と体重のセットを得る(_終了状態,_行,_身長と体重のセット). 行を得る(_行,_終了状態) :- get_char(_文字), 行を得る(_文字,_文字ならび,_終了状態), atomic_list_concat(_文字ならび,_行). 行を得る(_入力文字,[],_終了状態) :- 入力文字が改行文字またはend_of_fileの時停止する(_入力文字,_終了状態),!. 行を得る(_文字,_行ならび,_終了状態) :- 行を得るために文字入力を続ける(_文字,_行ならび,_終了状態). 入力文字が改行文字またはend_of_fileの時停止する('\n',改行終了). 入力文字が改行文字またはend_of_fileの時停止する(end_of_file,入力終了). 行を得るために文字入力を続ける(_文字,[_文字|_残りの文字ならび],_終了状態) :- get_char(_次の文字), 行を得る(_次の文字,_残りの文字ならび,_終了状態). 身長と体重のセットを得る(入力終了,_,[]) :- !. 身長と体重のセットを得る(改行終了,'\n',[]) :- !. 身長と体重のセットを得る(_,_行,_身長体重ならび) :- 入力終了になるまで行入力を続ける(_,_行,_身長体重ならび). 入力終了になるまで行入力を続ける(_,_行,[[_身長,_体重]|_残りの行ならび]) :- 行から身長と体重を取り出す(_行,_身長,_体重), 行を得る(_次の行,_終了状態), 身長と体重のセットを得る(_終了状態,_次の行,_残りの行ならび). 行から身長と体重を取り出す(_行,_身長,_体重) :- カンマ区切りの場合(_行,_身長,_体重),!. 行から身長と体重を取り出す(_行,_身長,_体重) :- 空白区切りの場合(_行,_身長,_体重). カンマ区切りの場合(_行,_身長,_体重) :- sub_atom(_行,_前文字列,',',_後文字列), read_term_from_atom(_前文字列,_身長,[]), read_term_from_atom(_後文字列,_体重,[]). 空白区切りの場合(_行,_身長,_体重) :- sub_atom(_行,_前文字列,' ',_後文字列), read_term_from_atom(_前文字列,_身長,[]), read_term_from_atom(_後文字列,_体重,[]). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 'できるだけ多くの人数で、肩車をしようと思います。'(_人間ならび,_最大人数) :- findall(_肩車人数,( 肩車人数(_人間ならび,_肩車人数)),_肩車人数ならび), max_list(_肩車人数ならび,_最大人数). 肩車人数(_人間ならび,_肩車人数) :- select(_取りだされた人間,_人間ならび,_残りの人間ならび), 肩車を重ねる(_取りだされた人間,_残りの人間ならび,_肩車重ね), length(_肩車重ね,_肩車人数). 肩車を重ねる(_自分,_人間ならび,[_自分|_肩車重ね]) :- 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね). 肩車を重ねる(_一番上の人間,_,[_一番上の人間]). 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね) :- select(_上の人間,_人間ならび,_残りの人間ならび), '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_上の人間,_自分), 肩車を重ねる(_上の人間,_残りの人間ならび,_肩車重ね). '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'([_上の人間の身長,_上の人間の体重],[_自分の身長,_自分の体重]) :- _上の人間の身長 @< _自分の身長, _上の人間の体重 @< _自分の体重. % 以下のサイトは # 出典 :: 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 // _最大公約数. % 以下のサイトは 'PGMファイルの読み取り'(_入力ファイル) :- abolish(画像構造/2), raw_read_pgm(_入力ファイル). raw_read_pgm(_入力ファイル,_画像構造ならび) :- headerを読み取る(_入力ファイル,_headerの文字数), 画像データの読み込み(_入力ファイル,_headerの文字数,_画像データ), assertz(画像構造(画像データ,_画像データ)). headerを読み取る(_入力ファイル,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- open(_入力ファイル,read,Input), '型・矩形サイズ・色の深さを得る'(Input,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数), close(Input). '型・矩形サイズ・色の深さを得る'(Input,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- get_line(Input,Line), '型・矩形サイズ・色の深さを得る'(Input,Line,[],0,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数), '型・矩形サイズ・色の深さを定義する'(_型,_矩形サイズ,_色の深さ). '型・矩形サイズ・色の深さを得る'(Input,Line,[_色の深さ,_矩形サイズ,_型],_ヘッダの文字数,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- !. '型・矩形サイズ・色の深さを得る'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- 'コメント行は無視して、_ヘッダの文字数だけ更新'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数),!. '型・矩形サイズ・色の深さを得る'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- '型・矩形サイズ・色の深さを埋めていく'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). 'コメント行は無視して、_ヘッダの文字数だけ更新'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- sub_atom(Line,0,1,_,'#'), '改行を含むコメント行の文字数を求めて_ヘッダ文字数を更新する'(Line,_ヘッダ文字数_1,_ヘッダ文字数_2), get_line(Input,Line2), '型・矩形サイズ・色の深さを得る'(Input,Line2,L1,_ヘッダの文字数_2,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). '改行を含むコメント行の文字数を求めて_ヘッダ文字数を更新する'(Line,_ヘッダ文字数_1,_ヘッダ文字数_2) :- atom_length(Line,Length), _ヘッダの文字数_2 is _ヘッダの文字数 + Length + 1. '型・矩形サイズ・色の深さを埋めていく'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- get_line(Input,Line2), atom_length(Line,Length), _ヘッダの文字数_2 is _ヘッダの文字数_1 + Length + 1, '型・矩形サイズ・色の深さを得る'(Input,Line2,_ヘッダの文字数_2,[Line|L1],_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). '型・矩形サイズ・色の深さを定義する'(_型,_矩形サイズ,_色の深さ) :- assertz(画像構造(型,_型)), assertz(画像構造(矩形サイズ,_矩形サイズ)), assertz(画像構造(色の深さ,_色の深さ)). 画像データの読み込み(_入力ファイル,_ヘッダの文字数,_画像データ) :- open(_入力ファイル,read,Input,[type(binary)]), ヘッダ部分を空読み(Input,_ヘッダの文字数), 画像データ部分の読み取り(Input,_画像データ), close(input). ヘッダ部分を空読み(Input,_ヘッダの文字数) :- between(1,_ヘッダの文字数,N), get_byte(Input,_), N = _ヘッダの文字数,!. 画像データ部分の読み取り(Input,_画像データ) :- findall(C,(repeat,get_byte(Input,C),(C = -1,!,fail;true)),_画像データ). get_line(Input,Line) :- get_char(Input,A), get_line(Input,A,L), atom_chars(Line,L). get_line(Input,'\n',[]) :- !. get_line(Input,A,[A|R]) :- get_char(Input,B), get_line(Input,B,R). % 以下のサイトは # 出典 :: 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. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/649 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # ダイエットファイルに # # 20100930,curry and rice # 20101003,kitsune soba # 20101003,rice ball # # のような形で日付とその日食べた昼食が保存されているとする. # コマンド行引数にダイエットファイル名と日付(yyyymmdd 形式) を指定して実行すると, # ファイルの中から指定した日付を含む行を検索し,その日の昼食を出力するプログラムを作成せよ. # また,引数としてファイルと文字列を指定しなかった場合に,使い方を出力して終了するようにせよ. # 日付の検索には,標準関数char *strstr(const char *str1, const char *str2); を使用するのが簡単である. # # 【実行例】 # % ./q3-3 diet.txt 20100929 # date 20100929 was not found in file diet.txt # % ./q3-3 diet.txt 20101003 # 20101003,kitsune soba # 20101003,rice ball # % ./q3-3 # Usage: ./q3-3 filename date(yyyymmdd) # % # # program :- パラメータを得る(_ファイル,_日付), get_split_lines(_ファイル,[','],LL), 日付をキーに検索する(_日付,LL,LL2), 検索した行を表示する(_日付,LL2). halt. パラメータを得る(_ファイル,_日付) :- user_paramaters(L), 診断(L,_ファイル,_日付),!. 診断([_ファイル,_日付],_ファイル,_日付) :- !. 診断(_,_,_) :- write('Usage: ./prolog filename date(yyyymmdd)\n'), halt. 日付をキーに検索する(_,[],[]) :- !. 日付をキーに検索する(_日付,[[_日付,_その日食べた昼食]|R1],[[_日付,_その日食べた昼食]|R2]) :- 日付をキーに検索する(_日付,R1,R2),!. 日付をキーに検索する(_日付,[_|R1],R2) :- 日付をキーに検索する(_日付,R1,R2),!. 検索した行を表示する([]) :- !. 検索した行を表示する([[_,_日付,_その日食べた昼食]|R]) :- write('%t,%t\n',[_日付,_その日食べた昼食]), 検索した行を表示する(R). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/477 # # [1] アルゴリズム論 # [2] Unixコマンドのgrepを実装したmygrepの作成 #   コマンドライン引数で検索文字列とファイル名をもらい、ファイル内に検索文字列が含まれる行があればその行を出力する #   正規表現に対応させる必要はない # [3] # [3.1]windows xp  # [3.2]gcc  # [3.3]c言語 # [4] 無期限 # [5] strstrは使用禁止 # # よろしくおねがいします # program :- user_paramaters([_検索文字列,_ファイル名]), open(_ファイル名,read,Instream), grep_line(Instream,_検索文字列), close(Instream), halt. grep_line(Instream,_検索文字列) :- at_end_of_stream(Instream),!. grep_line(Instream,_検索文字列) :- get_line(Stream,Line), sub_atom(Line,_,_,_,_検索文字列), writef('%t\n',[Line]), fail. grep_line(Instream,_検索文字列) :- grep_line(Instream,_検索文字列). % 以下のサイトは % [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([]. % 以下のサイトは # 問題文 # (21:13 追記) |A|=|B|=1のケースがテスト中に一つ含まれていましたので、リジャッジを行います。なお、このケースでNOを出力するプログラムに影響はありません。 # # 文字列 A の文字をちょうど 3 回スワップすることにより、文字列 B に変換できるとき、二つの文字列 A, B を、仲良し文字列と呼ぶことにします。 # # スワップとは、文字列に含まれる 2 つの文字を、入れ替えることを指します。 例えば、abcという文字列であれば、aとcを入れ替えて、cbaのように変換することが出来ます。 # # aaのような文字列に対し、 1 文字目のaと、 2 文字目のaを入れ替えることは許されていますが、同じ場所の文字を指定することはできません。 # # 文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # B # 1 行目には、文字列 A(2≦|A|≦1000) が与えられる。 # 2 行目には、文字列 B(|B|=|A|) が与えられる。 # A, B 共に、小文字アルファベットのみで構成されていることが保障されている。 # 出力 # 与えられた 2 つの文字列が、仲良し文字列であればYES、そうでなければNOを出力せよ。 出力の末尾には改行をいれること。 # # 入力例1 # abcdef # fedcba # 出力例1 # YES # まず、文字列 A のabcdefのaとfをスワップし、fbcdeaとします。 # # 次に、bとeをスワップし、fecdbaとします。 # # 最後に、cとdをスワップし、fedcbaとすると、文字列 B と一致します。 # # よって、この 2 つの文字列は、仲良し文字列となるため、YESと出力します。 # # 入力例2 # abababab # babababa # 出力例2 # NO # 使っている文字数が同じでも、 3 回のスワップでは同じ文字列にできないパターンも存在します。 # # 入力例3 # nt # nt # 出力例3 # NO # スワップの仕方が 1 通りしかなく、 3 回のスワップを繰り返すと、tnになってしまいます。 よって、同じ 2 つの文字列ですが、仲良し文字列ではありません。 # # 入力例4 # pqqq # pqqq # 出力例4 # YES # まず、 1 番目の文字と 2 番目の文字を入れ替え、qpqqとします。 次に、 3 番目の文字と 4 番目の文字を入れ替え、qpqqとします。この際、同じ文字を選んでいますが、場所が違うので問題ありません。 最後に、1番目の文字と、2番目の文字を入れ替え、pqqqとします。 # # 入力例5 # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyzw # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz # 出力例5 # YES # 長い文字列が与えらえれることがあることにも注意してください。 # # 入力例6 # abcdef # ghijkl # 出力例6 # NO '文字列 A(2≦|A|≦100))、B(|B|=|A|) が与えられるので、仲良し文字列になっているかどうかを判定しなさい。' :- '文字列 A(2≦|A|≦100)'(_A), '文字列 B(|B|=|A|)'(_A,_B), 文字列と仲良し文字列(_A,_B). '文字列 A(2≦|A|≦100)'(_A) :- 行入力(_A), '(2≦|A|≦100)'(_A). 行入力(_行) :- read_line_to_codes(_Codes), atom_codes(_行,_Codes). '(2≦|A|≦100)'(_A) :- atom_length(_A,_長さ), between(2,100,_長さ). '文字列 B(|B|=|A|)'(_A,_B) :- 行入力(_B), '(|B|=|A|)'(_A,_B). '(|B|=|A|)'(_A,_B) :- atom_length(_A,_長さ), atom_length(_B,_長さ). 文字列と仲良し文字列(_文字列,_仲良し文字列) :- atom_chars(_文字列,L1), 文字列中の文字の三回スワップ(L1,[],L2), atom_chars(_仲良し文字列,L2). 文字列中の文字の三回スワップ(X,[_,_,_,_,_,_],X). 文字列中の文字の三回スワップ(L1,_履歴,X) :- スワップ(L1,_履歴,_nth0_1,_nth0_2,L2), 文字列中の文字の三回スワップ(L2,[_nth0_1,_nth0_2|_履歴],X). スワップ(L1,_履歴,_何番目_1,_何番目_2,L2) :- 交換する候補を得る(L1,_履歴,_何番目_1,_何番目_2,A,B), 交換する(L1,_何番目_1,_何番目_2,A,B,L2). 交換する候補を得る(L1,_履歴,_何番目_1,_何番目_2,_交換要素_1,_交換要素_2) :- 'まだ交換していない位置の要素を取り出す'(_何番目_1,L1,_履歴,_交換要素_1), 'まだ交換していない位置の要素を取り出す'(_何番目_2,L1,[_何番目_1|_履歴],_交換要素_2). 'まだ交換していない位置の要素を取り出す'(_何番目,L,_履歴,_交換要素) :- nth1(_何番目,L,_交換要素), \+(member(_何番目,_履歴)). 交換する(L1,_何番目_1,_何番目_2,A,B,L2) :- 'L2を生成する'(L1,L2), '交換する値をL2に埋める'(_何番目_1,_何番目_2,A,B,L2), 変数として残った要素を埋める(L1,L2). 'L2を生成する'(L1,L2) :- length(L1,Len), length(L2,Len). '交換する値をL2に埋める'(_何番目_1,_何番目_2,A,B,L2) :- nth1(_何番目_1,L2,B), nth1(_何番目_2,L2,A). 変数として残った要素を埋める([],[]). 変数として残った要素を埋める([A|R1],[A|R2]) :- 変数として残った要素を埋める(R1,R2),!. 変数として残った要素を埋める([_|R1],[A|R2]) :- 変数として残った要素を埋める(R1,R2). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/933 # [1] 授業単元:プログラミング基礎 # [2] 問題文: # 氏名が"end"になるまで、氏名と点数を入力する。データがなくなったら点数の平均を算出 # する。平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上 # 下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。 # _____________________________ #   氏名   点数  備考  # --------------------- #   井上    70   #   田口    65  * #   佐藤    100   #   田中    30  ***   # ===================== # [3.1] Windows 8 #  [3.2] Visual studio 2008 #  [3.3] C # # '氏名が"end"になるまで、氏名と点数を入力する。データがなくなったら点数の平均を算出する。氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。' :- '氏名が"end"になるまで、氏名と点数を入力する。'(_氏名_点数ならび), 'データがなくなったら点数の平均を算出する。'(_氏名_点数ならび,_平均), '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名_点数ならび,_平均). '氏名が"end"になるまで、氏名と点数を入力する。'(_氏名_点数ならび) :- findall([_氏名,_点数],( 氏名の入力(_氏名),(_氏名=end,!,fail;点数の入力(_点数))), _氏名_点数ならび). 氏名の入力(_氏名) :- get_line(_氏名). 点数の入力(_点数) :- 整数を得る(_整数). 'データがなくなったら点数の平均を算出する。'(_氏名_点数ならび,_平均) :- length(_氏名_点数ならび,_人数), findall(_点数,member([_,_点数],_氏名_点数ならび),_点数ならび), sum_list(_点数ならび,_合計点), _平均 is _合計点 / _人数. '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名_点数ならび,_平均). forall( member([_氏名,_点数],_氏名_点数_ならび), '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名,_点数,_平均)). '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名,_点数,_平均) :- 備考(_氏名,_点数,_備考), writef('20r10r %4l\n,[_氏名,_点数,_備考]). 備考(_点数,_平均,_備考) :- '平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、'(_点数,_平均). 備考(_点数,_平均,_備考) :- '平均より10点以上下回っていたら"***"、'(_点数,_平均). 備考(_点数,_平均,_備考) :- '平均より1点以上下回っていたら"***"、'(_点数,_平均). 点数が平均点より低い場合(_点数,_平均,_備考),!. 備考(_,_,''). '平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、'(_点数,_平均,'***') :- 点数が平均点より低い場合(_点数,_平均,_備考) :- '平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、'(_点数,_平均,'***') :- _平均 - _点数 >= 20. '10点以上下回っていたら"**"、'(_点数,_平均,'**') :- _平均 - _点数 >= 10, _平均 - _点数 < 20. '1点以上下回っていたら"*"を備考欄に表示する。'(_点数,_平均,'*') :- _平均 - _点数 < 10, _平均 - _点数 >= 1. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/861 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # (Run Length圧縮) # 文字列が連続した場合、ある規則で文字を置き換え、 # 文字列を短くすることができます。 # 例えば、AAAAという文字列の場合、@4Aと表現すれば # 1文字分圧縮されます。 # この規則で圧縮された文字列を入力して # もとの文字列に復元して終了するプログラムを # 作成してください。 # ただし、復元した文字列に@文字は出現しないものとします。 # # 原文の文字列は半角の英大文字、英小文字、数字、記号であり100文字以内、連続する文字は9文字以内です。 # # 実行例) # ab@5C1@8050 入力 # abCCCCC10000000050 出力 # @99+1=1@90 入力 # 999999999+1=1000000000 出力 # '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了するプログラムを 作成してください。 ただし、復元した文字列に@文字は出現しないものとします。 原文の文字列は半角の英大文字、英小文字、数字、記号であり100文字以内、連続する文字は9文字以内です。 実行例) ab@5C1@8050 入力 abCCCCC10000000050 出力 @99+1=1@90 入力 999999999+1=1000000000 出力' :- '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了する'. '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了する' :- 圧縮された文字列を入力し(_圧縮された文字列), もとの文字列に復元して(_圧縮された文字列,_復元された文字列), 終了する(_復元された文字列). 圧縮された文字列を入力し(_圧縮された文字列) :- get_line(_圧縮された文字列). もとの文字列に復元して(_圧縮された文字列,_復元された文字列) :- '前文字列、圧縮部の復元された数字列,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部の復元された数字列,_後文字列), もとの文字列に復元して(_後文字列,_復元された文字列_2), atomic_list_concat([_前文字列,_数字列,_復元された文字列_2],_復元された文字列),!. もとの文字列に復元して(_文字列,_文字列). '前文字列、圧縮部の復元された数字列,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部の復元された数字列,_後文字列) :- '前文字列、圧縮部,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部,_後文字列), 圧縮部を復元する(_圧縮部,_圧縮部の復元された数字列). '前文字列、圧縮部,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部,_後文字列) :- sub_atom(_圧縮された文字列,S,3,R,_圧縮部), sub_atom(_圧縮部,0,1,2,'@'), sub_atom(_圧縮された文字列,0,S,_,_前文字列), sub_atom(_圧縮された文字列,_,R,0,_後文字列). 圧縮部を復元する(_圧縮部,_圧縮部の復元された数字列) :- sub_atom(_圧縮部,1,1,_,_繰り返し回数文字), sub_atom(_圧縮部,2,1,_,_繰り返される数文字), atom_numbers(_繰り返し回数文字,[_繰り返し回数]), findall(_繰り返される数字,between(1,_繰り返し回数数,_),_圧縮部の復元された数字列). 終了する(_復元された文字列) :- writef('%t\n',[_復元された文字列]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/852 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 2つの数字を入力されるので、 # 左側の数字が大きい場合は、left # 右側の数字が大きい場合は、right # 同じ数字の場合は、equal # と表示すること # # 実行例 # 1 12 # right # 10 19 # left # 5 5 # equal # # '2つの数字を入力されるので、 左側の数字が大きい場合は、left 右側の数字が大きい場合は、right 同じ数字の場合は、equal と表示すること' :- '2つの数字を入力されるので、'(_左側の数字,_右側の数字), '左側の数字が大きい場合は、left 右側の数字が大きい場合は、right 同じ数字の場合は、equal と表示すること'(_左側の数字,_右側の数字). '2つの数字を入力されるので、'(_左側の数字,_右側の数字) :- get_split_line([' ',','],[_左側の数字,_右側の数字]). '左側の数字が大きい場合は、left 右側の数字が大きい場合は、right 同じ数字の場合は、equal と表示すること'(_左側の数字,_右側の数字) :- '左側の数字が大きい場合は、leftと表示すること'(_左側の数字,_右側の数字). '左側の数字が大きい場合は、left 右側の数字が大きい場合は、right 同じ数字の場合は、equal と表示すること'(_左側の数字,_右側の数字) :- '右側の数字が大きい場合は、rightと表示すること'(_左側の数字,_右側の数字). '左側の数字が大きい場合は、left 右側の数字が大きい場合は、right 同じ数字の場合は、equal と表示すること'(_左側の数字,_右側の数字) :- '同じ数字の場合は、equalと表示すること'(_左側の数字,_右側の数字). '左側の数字が大きい場合は、leftと表示すること'(_左側の数字,_右側の数字) :- '左側の数字が大きい場合は、'(_左側の数字,_右側の数字). leftと表示すること. '左側の数字が大きい場合は、'(_左側の数字,_右側の数字) :- _左側の数字 > _右側の数字. leftと表示すること :- write('left\n'). '右側の数字が大きい場合は、rightと表示すること'(_左側の数字,_右側の数字) :- '右側の数字が大きい場合は、'(_左側の数字,_右側の数字), rightと表示すること. '右側の数字が大きい場合は、'(_左側の数字,_右側の数字) :- _左側の数字 < _右側の数字. rightと表示すること :- write('right\n'). '同じ数字の場合は、equalと表示すること'(_同じ数字,_同じ数字) :- equalと表示すること. equalと表示すること :- write('equal\n'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_list(_区切り語彙ならび,_語彙ならび) :- get_line(_文字列), split(_文字列,_区切り語彙ならび,_語彙ならび). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/833 # [1] 授業単元: プログラミング1 # [2] 問題文 # 文字列が入力され, # 次に表示したい文字の番号が入力されるので、 # その番号の文字を表示すること # 範囲を超えた場合は、NAと表示する # (番号は、1から始まる) # (文字列は50文字以内) # # 実行例 # abcdfge 入力1 # 3 入力2 # # '文字列が入力され, 次に表示したい文字の番号が入力されるので、 その番号の文字を表示すること 範囲を超えた場合は、NAと表示する (番号は、1から始まる) (文字列は50文字以内)' :- '文字列が入力され,(文字列は50文字以内)'(_文字列,_文字列長), '次に表示したい文字の番号が入力されるので、'(_文字の番号), 'その番号の文字を表示すること範囲を超えた場合は、NAと表示する(番号は、1から始まる)'(_文字列,_文字列長,_文字の番号),!. '文字列が入力され,(文字列は50文字以内)'(_文字列長,_文字列) :- get_line(_文字列), atom_length(_文字列,_文字列長), _文字列長 =< 50. '文字列が入力され,(文字列は50文字以内)'(_文字列) :- '文字列が入力され,(文字列は50文字以内)'(_文字列). '次に表示したい文字の番号が入力されるので、'(_文字の番号) :- 整数を得る(表示したい文字の番号,true,_文字の番号). 'その番号の文字を表示すること範囲を超えた場合は、NAと表示する(番号は、1から始まる)'(_文字列,_文字列長,_文字の番号) :- succ(_nth0,_文字の番号), sub_atom(_文字列,_nth0,1,_,_文字), writef('%t\n',[_文字]). 'その番号の文字を表示すること範囲を超えた場合は、NAと表示する(番号は、1から始まる)'(_文字列,_文字列長,_文字の番号) :- write('NA\n'). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/831 # [1] 授業単元:プログラミング基礎 # [2] 問題文 # 文字配列buffを100バイト確保して、キーボードから繰り返し入力して # その文字列を空白を作り、連結していくプログラムを作ります # キーボードから入力できる文字は30バイトまでです # byeと入力で、終了 # '文字配列buffを100バイト確保して、キーボードから繰り返し入力して その文字列を空白を作り、連結していくプログラムを作ります キーボードから入力できる文字は30バイトまでです byeと入力で、終了'(L) :- length(L,100), get_line(_行文字列), 'キーボードから繰り返し入力してその文字列を空白を作り、連結していく'(_行文字列,L), atom_chars(_文字列,L). 'キーボードから繰り返し入力してその文字列を空白を作り、連結していく'(bye,L) :- 残りに空白を埋める(L). 'キーボードから繰り返し入力してその文字列を空白を作り、連結していく'(_文字列,L) :- atom_chars(_文字列,_文字ならび), 文字列を埋める(_文字ならび,L,R), get_line(_次の行文字列), 'キーボードから繰り返し入力してその文字列を空白を作り、連結していく'(_次の行文字列,R). 文字列を埋める([],[' '|R],R). 文字列を埋める([_文字|R1],[_文字|R2],R) :- 文字列を埋める(R1,R2,R). 残りに空白を埋める([]). 残りに空白を埋める([' '|R]) :- 残りに空白を埋める(R). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/808 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 担当者はなん人でも構わない、担当者名と売上を入力する。売上合計を求める。各担当の売 # 上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。 # ________________________________ # 担当者  売上  比率 # --------------------- # 山田  12000  30.0% # 鈴木   8000  20.0% # 井上  20000  50.0% # 合計  40000  100.0% # ===================== # '担当者はなん人でも構わない、担当者名と売上を入力する。売上合計を求める。各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。' :- '担当者はなん人でも構わない、担当者名と売上を入力する。', '売上合計を求める。'(_売上合計), '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'. '担当者はなん人でも構わない、担当者名と売上を入力する。' :- 担当者名と売上を入力(_担当者名,_売上), 担当者と売上を追加定義する(_担当者名,_売上), '担当者はなん人でも構わない、担当者名と売上を入力する。',!. '担当者はなん人でも構わない、担当者名と売上を入力する。'. 担当者名と売上を入力(_担当者名,_売上) :- 担当者名の入力(_担当者名), \+(_担当者名=''), 売上の入力(_売上). 担当者名の入力(_担当者名) :- write('担当者名を入力して下さい : '), get_line(_担当者名). 売上の入力(_売上) :- 整数を得る(売上,integer(_売上),_売上). 担当者と売上を追加定義する(_担当者,_売上) :- assertz('担当者・売上'(_担当者,_売上)). 売上合計を得る(_売上合計) :- findall(_売上,( '担当者・売上'(_,_売上)), _売上ならび), sum_list(_売上ならび,_売上合計). '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_売上合計) :- write('担当者  売上  比率 \n'), forall('担当者・売上'(_担当者名,_売上),'各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_担当者名,_売上,_売上合計)), write('===================== \n'). '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_担当者名,_売上,_売上合計) :- \+(_売上合計 = 0), _比率 is _売上 / _売上合計 * 100, '担当者名、売上、比率を表示する。'(_担当者名,_売上,_比率). '担当者名、売上、比率を表示する。'(_担当者名,_売上,_比率) :- format('~w ~0f ~1f%\n',[_担当者名,_売上,_比率]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/577 # コードゴルフ # # 月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ # 標準入力から以下の形式で与えられる # D W # # '月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ 標準入力から以下の形式で与えられる D W ' :- '標準入力から以下の形式で与えられる D W '(D,W), '月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ'(D,W). '標準入力から以下の形式で与えられる D W '(D,W) :- get_line(_行), split(_行,[' '],[D,W]). '月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ'(D,W) :- sub_atom(土金木水火月日,U,1,_,W), M is ((D + U - 1) mod 7) * 3, sub_atom('SatFriThrWedTueMonSun',M,3,_,X), wirte(X). % コードゴルフ参加 p(W,D):-sub_atom(土金木水火月日,U,1,_,W),M is ((D+U-1) mod 7)*3,sub_atom('SatFriThrWedTueMonSun',M,3,_,X),wirte(X). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/757 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 担当者名が"end"になるまで、担当者名と売上を入力する。 # 売上合計、平均、最も売上が多い担当者名とその売上、 # 最も売上が低い担当者名とその売上を表示する。 # '担当者名が"end"になるまで、担当者名と売上を入力する。 売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。' :- '担当者名が"end"になるまで、担当者名と売上を入力する。'(_担当者名_売上ならび), '売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。'(_担当者_売上ならび). '担当者名が"end"になるまで、担当者名と売上を入力する。'(_担当者名_売上ならび) :- findall([_担当者名,_売上],( 担当者の入力(_担当者名), ( _担当者名 = end,!,fail; 売上の入力(_売上))), _担当者名_売上ならび). 担当者の入力(_担当者名) :- write('担当者名を入力してください (endで終了する) : '), get_line(_担当者名). 売上の入力(_売上) :- 整数を得る('売上を入力して下さい : ',true,_売上). '売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。'(_担当者_売上ならび) :- '売上合計、平均、'(_担当者_売上ならび,_売上合計,_平均), '最も売上が多い担当者名とその売上、最も売上が低い担当者名とその売上を'(_担当者_売上ならび,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上), 表示する(_売上合計,_平均,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上). '売上合計、平均、'(_担当者_売上ならび,_売上合計,_平均) :- findall(_売上,( member([_,_売上],_担当者名_売上ならび)), _売上ならび), sum_list(_売上ならび,_売上合計), length(_売上ならび,_要素数), _平均 is _売上合計 / _要素数. '最も売上が多い担当者名とその売上、最も売上が低い担当者名とその売上を'(_担当者_売上ならび,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上) :- setof(_担当者,[_担当者,_売上] ^ member([_担当者,_売上],_担当者_売上ならび),_担当者名ならび), 担当者別の売上合計(_担当者_売上ならび,_担当者名ならび,_担当者別売上合計ならび), '最も売上が多い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が多い担当者,_最も売上が多い担当者の売上), '最も売上が低い担当者名とその売上'(_担当者別売上合計ならび,_最も売上が低い担当者,_最も売上が低い担当者の売上). 担当者別の売上合計(_担当者_売上ならび,_担当者名ならび,_担当者別売上合計ならび) :- findall([_担当者名,_売上合計],( member(_担当者名,_担当者名ならび), findsum(_売上,( member([_担当者名,_売上],_担当者別売上ならび), _売上合計))), _担当者別売上合計ならび). '最も売上が多い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が多い担当者,_最も売上が多い担当者の売上) :- append(L1,[[_最も売上が多い担当者,_最も売上が多い担当者の売上]|L2],_担当者別売上合計ならび), \+((member([_,_売上合計],L1),_売上合計 > _最も売上が多い担当者の売上)), \+((member([_,_売上合計],L2),_売上合計 > _最も売上が多い担当者の売上)). '最も売上が低い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が低い担当者,_最も売上が低い担当者の売上) :- append(L1,[[_最も売上が低い担当者,_最も売上が低い担当者の売上]|L2],_担当者別売上合計ならび), \+((member([_,_売上合計],L1),_売上合計 < _最も売上が低い担当者の売上)), \+((member([_,_売上合計],L2),_売上合計 < _最も売上が低い担当者の売上)). 表示する(_売上合計,_平均,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上) :- writef('売上合計 = %t\n平均 = %t\n',[_売上合計,_平均]), writef('最も売上が多い担当者名 = %t\n最も売上が多い担当者の売上 = %t\n最も売上が低い担当者名 = %t\n',[_最も売上が多い担当者名,_最も売上が多い担当者の売上]), writef('最も売上が低い担当者名 = %t\n最も売上が低い担当者の売上 = %t\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. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/741 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成すること # 英文の回文判定 # 回文とは、どちらから読んでも # 同じ並びになる文章。 # 1つの英文字列(100文字以内)が入力されるので、 # 回文であれば、GOODと表示 # 回文でなければ、NGと表示 # *大文字小文字を区別しない # *「?!,. 」を無視する # # 実行例) # apple 入力 # NG 出力 # Borrow or rob? 入力 # GOOD 出力 # Kodak ad? OK! 入力 # GOOD 出力 # What time is it? 入力 # NG 出力 # Was it a bar or a bat I saw? 入力 # GOOD 出力 # '英文の回文判定 回文とは、どちらから読んでも 同じ並びになる文章。 1つの英文字列(100文字以内)が入力されるので、 回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する' :- '1つの英文字列(100文字以内)が入力されるので、'(_文字列), '回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する'(_文字列). '1つの英文字列(100文字以内)が入力されるので、'(_文字列) :- get_line(_文字列), atom_length(_文字列,_文字列の長さ), _文字列の長さ =< 100,!. '1つの英文字列(100文字以内)が入力されるので、'(_文字列) :- '1つの英文字列(100文字以内)が入力されるので、'(_文字列). '回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する'(_文字列) :- '*大文字小文字を区別しない *「?!,. 」を無視する'(_文字列,_回文判定文字列), '回文であれば、GOODと表示 回文でなければ、NGと表示'(_回文判定文字列). '*大文字小文字を区別しない *「?!,. 」を無視する'('',''). '*大文字小文字を区別しない *「?!,. 」を無視する'(_文字列_1,_文字列) :- 最初の文字と残り文字列(_文字列_1,_文字,_残り文字列), '大文字を小文字に変換し、「?!,. 」を無視する'(_文字,_文字_2), '*大文字小文字を区別しない *「?!,. 」を無視する'(_残り文字列,_文字列_2), atom_concat(_文字_2,_文字列_2,_文字列). '大文字を小文字に変換し、「?!,. 」を無視する'(_文字,_文字_2) :- '大文字を小文字に変換し'(_文字,_文字_1), '*「?!,. 」を無視する'(_文字_1,_文字_2). 大文字を小文字に変換(_文字,_小文字) :- 英大文字英小文字(_文字,_小文字),!. 大文字を小文字に変換(_文字,_文字). 英大文字英小文字('A',a). 英大文字英小文字('B',b). 英大文字英小文字('C',c). 英大文字英小文字('D',d). 英大文字英小文字('E',e). 英大文字英小文字('F',f). 英大文字英小文字('G',g). 英大文字英小文字('H',h). 英大文字英小文字('I',i). 英大文字英小文字('J',j). 英大文字英小文字('K',k). 英大文字英小文字('L',l). 英大文字英小文字('M',m). 英大文字英小文字('N',n). 英大文字英小文字('O',o). 英大文字英小文字('P',p). 英大文字英小文字('Q',q). 英大文字英小文字('R',r). 英大文字英小文字('S',s). 英大文字英小文字('T',t). 英大文字英小文字('U',u). 英大文字英小文字('V',v). 英大文字英小文字('W',w). 英大文字英小文字('X',x). 英大文字英小文字('Y',y). 英大文字英小文字('Z',z). '*「?!,. 」を無視する'(_文字,'') :- member(_文字,['?','!','.',' ']),!. '*「?!,. 」を無視する'(_文字,_文字). '回文であれば、GOODと表示 回文でなければ、NGと表示'(_文字列) :- '回文であれば、'(_文字列), 'GOODと表示'. '回文であれば、GOODと表示 回文でなければ、NGと表示'(_) :- '回文でなければ、'(_文字列), 'NGと表示'. '回文であれば、'(_文字列) :- forall((sub_atom(_文字列,S,1,R,_文字),S =< R),sub_atom(_文字列,R,1,S,_文字)). '回文でなければ、'(_文字列) :- \+('回文であれば、'(_文字列)). 'GOODと表示' :- write('Good\n'). 'NGと表示' :- write('NG\n'). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/736 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成しなさい. # 文字列を5つ入力し、その中の # 一番小さい文字列を表示 # (英数字のみ) # (文字列は、50文字以内) # (英字の大文字と小文字は、 #  特に考慮しないで、そのまま比較 #  して良いこととする) # # 実行例) # abc 入力1 # aaaa 入力2 # wsdd 入力3 # gfd 入力4 # xxxd 入力5 # aaaa 出力 # 19dfc 入力1 # xuw29 入力2 # 12k2 入力3 # mnnn 入力4 # bccd1 入力5 # 12k2 出力 # '文字列を5つ入力し、その中の一番小さい文字列を表示 (英数字のみ)(文字列は、50文字以内)(英字の大文字と小文字は、特に考慮しないで、そのまま比較して良いこととする)' :- '文字列を5つ入力し、'(_文字列ならび), 一番小さい文字列を表示(_文字列ならび). '文字列を5つ入力し、'(_文字列ならび) :- findall(_文字列,( between(1,5,_), get_line(_文字列)), _文字列ならび). 一番小さい文字列を表示([_文字列|_残り文字列ならび],_一番小さい文字列) :- 一番小さい文字列を(_残り文字列ならび],_文字列,_一番小さい文字列), 表示(_一番小さい文字列). 一番小さい文字列を([],_一番小さい文字列,_一番小さい文字列). 一番小さい文字列を([_文字列|_残り文字列ならび],_現時点で一番小さい文字列,_一番小さい文字列) :- _文字列 @< _現時点で一番小さい文字列, 一番小さい文字列を(_残り文字列ならび,_文字列,_一番小さい文字列). 一番小さい文字列を([_文字列|_残り文字列ならび],_現時点で一番小さい文字列,_一番小さい文字列) :- _文字列 @>= _現時点で一番小さい文字列, 一番小さい文字列を(_残り文字列ならび,_現時点で一番小さい文字列,_一番小さい文字列). 表示(_一番小さい文字列) :- writef('%t\n',[_一番小さい文字列]). 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). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは " 出典: このディレクトリの索引 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # ?以下のプログラムを作成しなさい. # 文字列を入力して、 # その文字列が数字であるかどうか調べる # (符号も対応すること) # (数字は、intの範囲内で) # (0023は、数字として扱う) # 実行例) # 1234 入力 # number 出力 # 1234abncdef 入力 # string 出力 # ab^d34x 入力 # string 出力 # -92837 入力 # number 出力 # +37 入力 # number 出力 # [3] 環境 . #  [3.1] Windows 8.1 #  [3.2] Visual studio 2013 #  [3.3] C # [4] 期限:2014年7月14日0:00 '文字列を入力して、その文字列が数字であるかどうか調べる(符号も対応すること)(数字は、intの範囲内で)(0023は、数字として扱う)' :- get_line(_文字列), '文字列を入力して、その文字列が数字であるかどうか調べる(符号も対応すること)(数字は、intの範囲内で)(0023は、数字として扱う)'(_文字列). '文字列を入力して、その文字列が数字であるかどうか調べる(符号も対応すること)(数字は、intの範囲内で)(0023は、数字として扱う)'(_文字列) :- その文字列が数字であるかどうか調べる(_文字列). その文字列が数字であるかどうか調べる(_文字列) :- その文字列は数字を構成する(_文字列). その文字列は数字を構成する(_文字列) :- 数字文字列(_文字列), write('number\n'). その文字列は数字を構成する(_文字列) :- \+(数字文字列(_文字列)), write('string\n'). 数字文字列(_文字列) :- '先頭文字が+または-である'(_文字列,_残り文字列), '記号を除く数字ならび。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_残り文字列),!. 数字文字列(_文字列) :- '記号を除く数字文字列。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_文字列). '先頭文字が+または-である'(_文字列,_残り文字列) :- 先頭文字と残り文字列を得る(_文字列,_先頭文字,_残り文字列), '+または-である'(_先頭文字). '+または-である'('+'). '+または-である'('-'). '記号を除く数字文字列。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_文字列) :- 先頭文字と最終文字にピリオドが来ている(_文字列),!,fail. '記号を除く数字文字列。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_文字列) :- 記号を除く数字文字列(_文字列), 先頭文字と最終文字にピリオドが来ている(_文字列) :- sub_atom(_文字列,0,1,_,'.'). 先頭文字と最終文字にピリオドが来ている(_文字列) :- sub_atom(_文字列,_,1,0,'.'). 記号を除く数字文字列('') :- !. 記号を除く数字文字列(_文字列) :- 先頭文字の数字記号検査(_文字列,_残り文字列). 記号を除く数字文字列(_残り文字列). 先頭文字の数字記号検査(_文字列,_残り文字列) :- 先頭文字と残り文字列を得る(_文字列,_先頭文字,_残り文字列), 先頭文字の数字記号検査(_先頭文字,_文字列,_残り文字列). 先頭文字の数字記号検査('.',_残り文字列) :- \+(sub_atom(_残り文字列,_,1,_,'.')),!. 先頭文字の数字記号検査(A,_残り文字列) :- sub_atom('0123456789',_,1,_,A),!. 先頭文字と残り文字列を得る(_文字列,_先頭文字,_残り文字列) :- sub_atom(_文字列,0,1,R,_先頭文字), sub_atom(_文字列,1,R,0,_残り文字列). % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #698 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # ?以下のプログラムを作成しなさい. # 5件の数字を入力し、上位3位までの # 数字を順に表示する # (数字の大きい順) # # 実行例) # 22 入力1 # 30 入力2 # 10 入力3 # 40 入力4 # 2 入力5 # 40 30 22 出力 # 123 入力1 # 25 入力2 # 294 入力3 # -100 入力4 # 80 入力5 # 294 123 80 出力 # -20 入力1 # -25 入力2 # -394 入力3 # -50 入力4 # -80 入力5 # -20 -25 -50 出力 # [3] 環境 . #  [3.1] Windows 8.1 #  [3.2] Visual studio 2013 #  [3.3] C # [4] 期限:2014年7月14日0:00 '5件の数字を入力し、上位3位までの 数字を順に表示する (数字の大きい順)' :- '5件の数字を入力し、'(_5件の数字ならび), '上位3位までの数字を順に表示する(数字の大きい順)'(_5件の数字ならび). '5件の数字を入力し、'(_5件の数字ならび) :- findall(_数字,( 数字の入力(_数字)),_5件の数字ならび). 数字の入力(_数字) :- '_件目の入力を促す', 数字入力(_行,_数字). '_件目の入力を促す' :- append(L1,[_件目|R],[1,2,3,4,5]), length([_件目|R],_残り件数), writef('%w件目(残り%w件) の数字を入力して下さい : ',[_件目,_残り件数]). 数字入力(_行,_数字) :- 行入力し数字を得る(_行,_数字),!. 数字入力(_行,_数字) :- 数字入力(_行,_数字). 行入力し数字を得る(_行,_数字) :- 行入力(_行), 数字検査(_行,_数字). 行入力(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 数字検査(_行,_数字) :- 行を解析し数字を得る(_行,_数字),!. 数字検査(_行,_) :- 再入力を要請する(_行). 行を解析し数字を得る(_行,_数字) :- atom_number(_行,_数字). 再入力を要請する(_行) :- writef('入力された文字列 %w は数字ではありません。再入力をお願いします。\n',[_行]), fail. '上位3位までの数字を順に表示する(数字の大きい順)'(_5件の数字ならび) :- '上位3位までの数字を順に(数字の大きい順)'(_5件の数字ならび,[],_上位3位までの数字ならび), 表示する(_上位3位までの数字ならび). '上位3位までの数字を順に(数字の大きい順)'([],[_1,_2,_3|_],[_1,_2,_3]). '上位3位までの数字を順に(数字の大きい順)'([M|R1],L1,_上位3位までの数字ならび) :- 挿入する(M,L1,L2), '上位3位までの数字を順に(数字の大きい順)'(R1,L2,_上位3位までの数字ならび). 挿入する(M,L1,L2) :- 'L1が[]であるかL1の先頭要素よりMが大きい時停止する'(M,L1,L2). 挿入する(M,L1,L2) :- 挿入するべき位置を捜す(M,L1,L2). 'L1が[]であるかL1の先頭要素よりMが大きい時停止する'(M,[],[M]). 'L1が[]であるかL1の先頭要素よりMが大きい時停止する'(M,[N|R],[M,N|R]) :- M >= N,!. 挿入するべき位置を捜す(M,[N|R2],[N|R3]) :- M < N, 挿入する(M,R2,R3). 表示する(_上位3位までの数字ならび) :- writef('%w %w %w\n',_上位3位までの数字ならび). % 以下のサイトは # S(1≦S≦10) # L(100≦L≦100) # 標準入力から以下の形式で与えられる # S L # # 例を参考にoとxを配置せよ # # 例 # 3 2 # oooxxx # oooxxx # oooxxx # xxxooo # xxxooo # xxxooo # # 2 3 # ooxxoo # ooxxoo # xxooxx # xxooxx # ooxxoo # ooxxoo # # 1 1 # o # # 2 1 # oo # :- dynamic(行パターン,1). 白(白). 黒(黒). '_行数 is S * L, S(1≦S≦10) L(100≦L≦100) 標準入力から以下の形式で与えられる S L' :- 'S Lを得る'(_s,_l), 表示パターンの形成(_s,_l,LL1), 出力する(LL1). 表示パターンの形成(_s,_l,_表示パターン) :- 行パターンの定義(_s,_l), 表の形成(_s,_l,_表示パターン), 転置して具体値を埋める(_表示パターン). 行パターンの定義(_s,_l) :- 白(_白), 黒(_黒), 行パターンの生成(_白,_黒,_s,_l), 行パターンの生成(_黒,_白,_s,_l). 行パターンの生成(_文字_1,_文字_2,_s,_l) :- length(Ln,_l), findall(文字,( 同一文字列トグル(Ln,_s,_文字_1,_文字_2,_文字)), _行パターン), assertz(行パターン(_行パターン)). 同一文字列トグル([_|_],_s,_文字,_,_文字) :- between(1,_s,_). 同一文字列トグル([_|Ln],_s,_文字_1,_文字_2,_文字) :- 同一文字列トグル(Ln,_s,_文字_2,_文字_1,_文字). 転置して具体値を埋める([L1|R]) :- 転置([L1|R],LL2), findall(L,( member(L,LL2), 行パターン(L)), LL2). 表の形成(_s,_l,[_行パターン|LL]) :- 行パターン(_行パターン),!, findall(L,( between(2,_l,_), length(L,_s)), LL). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 'S Lを得る'(S,L) :- get_line(Line), split(Line,[' '],[S,L]). 出力する(LL) :- flatten(LL,L), forall(member(A,L),format('~w\n',[A])). % 以下のサイトは # S(1≦S≦10) # L(100≦L≦100) # 標準入力から以下の形式で与えられる # S L # # 例を参考にoとxを配置せよ # # 例 # 3 2 # oooxxx # oooxxx # oooxxx # xxxooo # xxxooo # xxxooo # # 2 3 # ooxxoo # ooxxoo # xxooxx # xxooxx # ooxxoo # ooxxoo # # 1 1 # o # # 2 1 # oo # '_行数 is S * L, S(1≦S≦10) L(100≦L≦100) 標準入力から以下の形式で与えられる S L' :- 'S Lを得る'(S,L), 行パターンABを得る(S,L,A,B), findall(AorB,( between(1,L,N), 'AorB'(N,A,B,AorB)), X), 出力する(X). 'S Lを得る'(S,L) :- get_line(Line), split(Line,[' '],[S,L]). 出力する(LL) :- flatten(LL,L), forall(member(A,L),format('~w\n',[A])). 'AorB'(N,A,_,A) :- 1 is N mod 2. 'AorB'(N,_,B,B) :- 0 is N mod 2. 行パターンABを得る(S,L,A,B) :- 合計L行(L,白,黒,S,L,A), 合計L行(L,黒,白,S,L,B). 合計L行(0,_,_,_,_,[]) :- !. 合計L行(L_2,_文字_1,_文字_2,S,L,[_行文字列|R]) :- 行文字列(_文字_1,_文字_2,S,L,_行文字列), succ(L_1,L_2), 合計L行(L_1,_文字_1,_文字_2,S,L,R). 行文字列(_,_,_,0,'') :- !. 行文字列(_文字_1,_文字_2,S,L,_文字列) :- 連続文字列(_文字_1,S,_連続文字列), succ(L_1,L), 行文字列(_文字_2,_文字_1,S,L_1,_連続文字列_1), atom_concat(_連続文字列,_連続文字列_1,_文字列). 連続文字列(_文字,S,_連続文字列) :- findall(_文字,between(1,S,_),L), atom_chars(_連続文字列,L). % 以下のサイトは # プログラミングのお題スレ Part4 #197 # アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 # 例に沿って連続する文字をカウントするプログラムを作成せよ。 # # 出力の最後に改行を挿入すること。 # 標準入力から以下の形式で与えられる。 # S # # 例) # In: # aaaaaaaaaabbbbbbbbbbbbcccccccddddddddddeeeeeeefffffffffghiiiiiiiii # # Out: # a10b12c7d10e7f9ghi9 # # In: # # Out: # 0 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 例に沿って連続する文字をカウントするプログラムを作成せよ。 出力の最後に改行を挿入すること。 標準入力から以下の形式で与えられる。'(LL) :- 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(Line), atom_chars(Line,Chars), '連続する文字をカウントするプログラムを作成せよ。'(Chars,LL), 出力する(LL). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(Line) :- write('In: '), get_line(Line). '連続する文字をカウントするプログラムを作成せよ。'([],[]) :- !. '連続する文字をカウントするプログラムを作成せよ。'(Chars,[[_連続文字,_文字数]|R]) :- 先頭からの連続文字(Chars,Chars1,Chars2,_連続文字), length(L1,_文字数), '連続する文字をカウントするプログラムを作成せよ。'(L2,R). 先頭からの連続文字(Chars,Chars1,Chars2,_連続文字) :- append(Chars1,Chars2,Chars), 連続文字(Chars1,_連続文字), \+((Chars2 = [A|R],_連続文字 = A)). 連続文字([],_). 連続文字([_連続文字|R],_連続文字) :- 連続文字(R,_連続文字). 出力する(LL) :- flatten(LL,L), atomic_list_concat(L,S), writef('Out:\n%t\n',[S]). % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #526 # [1] 授業単元: プログラミング? # [2] 問題文(含コード&リンク): テキストファイルの読みこみ、行頭文字が小文字の場合 # http://pastebin.com/RKHNpMwy # 大文字に置き換え、変換してファイル出力 # [3] 環境: Xcode 5.1.1 #  [3.1] OS: OSX 10.9 #  [3.2] コンパイラ名とバージョン: gcc49 #  [3.3] 言語: C++ # [4] 期限: 無期限 # [5] その他の制限: # よろしくお願いします。 'テキストファイルの読みこみ、行頭文字が小文字の場合大文字に置き換え、変換してファイル出力'(_ファイル) :- see(_ファイル), 'テキストファイルの読みこみ、'(_行), '行頭文字が小文字の場合大文字に置き換え、変換して出力'(_行), seen. 'テキストファイルの読みこみ、'(_行) :- get_line(_行). '行頭文字が小文字の場合大文字に置き換え、変換して出力'(end_of_file) :- !. '行頭文字が小文字の場合大文字に置き換え、変換して出力'(_行) :- '行頭文字が小文字の場合大文字に置き換え、'(_行,_行_2), writef('%t\n',[_行_2]), 'テキストファイルの読みこみ、'(_次の行), '行頭文字が小文字の場合大文字に置き換え、変換して出力'(_次の行). '行頭文字が小文字の場合大文字に置き換え、'(_行,_行_2) :- 行頭文字が小文字の場合(_行), '大文字に置き換え、'(_行,_行_2),!. '行頭文字が小文字の場合大文字に置き換え、'(_行,_行). 行頭文字が小文字の場合(_行) :- sub_atom(_行,0,1,_,A), A @>= 'a', A @=< 'z'. '大文字に置き換え、'(_行,_行_2) :- sub_atom(_行,0,1,R,_小文字), 小文字大文字(_小文字,_大文字), sub_atom(_行,_,R,0,_残り文字列), atom_concat(_大文字,_残り文字列,_行_2). 小文字大文字(a,'A'). 小文字大文字(b,'B'). 小文字大文字(c,'C'). 小文字大文字(d,'D'). 小文字大文字(e,'E'). 小文字大文字(f,'F'). 小文字大文字(g,'G'). 小文字大文字(h,'H'). 小文字大文字(i,'I'). 小文字大文字(j,'J'). 小文字大文字(k,'K'). 小文字大文字(l,'L'). 小文字大文字(m,'M'). 小文字大文字(n,'N'). 小文字大文字(o,'O'). 小文字大文字(p,'P'). 小文字大文字(q,'Q'). 小文字大文字(r,'R'). 小文字大文字(s,'S'). 小文字大文字(t,'T'). 小文字大文字(u,'U'). 小文字大文字(v,'V'). 小文字大文字(w,'W'). 小文字大文字(x,'X'). 小文字大文字(y,'Y'). 小文字大文字(z,'Z'). % 以下のサイトは # 出典: プログラムのお題スレ 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). % 以下のサイトは # 出典 :: C言語の宿題片付けます 167代目 #324 # [1] 授業単元:プログラミング基礎 # [2] 問題文 # text.txtというファイルに以下のような個人情報が保存されているとする。これを読み込み、 # 実行例のように画面に出力するプログラムを作成しなさい。 # ヒント: 氏名の読み込みでは"name: %s\n"のような変換仕様を用いると良い。 # ▼text.txtの内容 # name: Ichiro # age: 20 # weight: 65.5 # e-mail: ichiro@foo.bar # ▼実行例 # 氏名: Ichiro # 年齢: 20 # 体重: 65.5 # Eメール: ichiro@foo.bar # # ご教示願います 'text.txtというファイルに ▼text.txtの内容 name: Ichiro age: 20 weight: 65.5 e-mail: ichiro@foo.bar のような個人情報が保存されているとする。これを読み込み、 実行例のように表示する ▼実行例 氏名: Ichiro 年齢: 20 体重: 65.5 Eメール: ichiro@foo.bar' :- 'text.txtというファイルに ▼text.txtの内容 name: Ichiro age: 20 weight: 65.5 e-mail: ichiro@foo.bar のような個人情報が保存されているとする。これを読み込み、'(Lines), '実行例のように表示する ▼実行例 氏名: Ichiro 年齢: 20 体重: 65.5 Eメール: ichiro@foo.bar'(Lines). 'text.txtというファイルに ▼text.txtの内容 name: Ichiro age: 20 weight: 65.5 e-mail: ichiro@foo.bar のような個人情報が保存されているとする。これを読み込み、'(_行ならび) :- get_lines('text.txt',_行ならび). '実行例のように表示する ▼実行例 氏名: Ichiro 年齢: 20 体重: 65.5 Eメール: ichiro@foo.bar'(_行ならび) :- append(_,[_行|_残り行ならび],_行ならび), 実行例のように(_行,_変換された行), 表示する(_変換された行), _残り行ならび = []. 実行例のように(_行,_変換された行) :- 文字列変換候補(_変換対象文字列,_変換文字列), sub_atom(_行,_前文字列の長さ,_,_後文字列の長さ,_変換対象文字列), 変換された文字列を構成する(_行,_変換文字列,_前文字列の長さ,_後文字列の長さ,_変換された文字列),!. 実行例のように(_行,_行). 変換された文字列を構成する(_行,_変換文字列,_前文字列の長さ,_後文字列の長さ,_変換された文字列) :- sub_atom(_行,0,_前文字列の長さ,_,_前文字列), sub_atom(_行,_,_後文字列の長さ,0,_後文字列), atomic_list_concat([_前文字列,_変換文字列,_後文字列],_変換された行),!. 文字列変換候補(name,氏名). 文字列変換候補(age,年齢). 文字列変換候補(weight,体重). 文字列変換候補('e-mail','Eメール'). 表示する(_変換された行) :- writef('%t\n',[_変換された行]). % 以下のサイトは # 出典 :: 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/270 # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):入力した1桁の整数を行数と解釈し、その後、その行数分だけキーボードから入力された # 文字をディスプレイに出力する。 # [条件1]整数(行数)入力にはgetchar関数を使用する。 # [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。 # [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。 # [3] 環境 #  [3.1] OS:Windows7 #  [3.2] コンパイラ名とバージョン:gcc 3.4 #  [3.3] 言語: C # [4] 期限:2014/03/30 '入力した1桁の整数を行数と解釈し、その後、その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。' :- '入力した1桁の整数を行数と解釈し、 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_行数), 'その後、', 'その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。'(_行数),!. '入力した1桁の整数を行数と解釈し、 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_行数) :- '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数), 行数と解釈し(_入力した1桁の整数,_行数). '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数) :- '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。'(_入力した1桁の整数),!. '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数) :- write('Input error 再入力をお願いします\n'), '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数). '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。'(_入力した1桁の整数) :- 行入力(_行文字列), get_term_from_atom(_行文字列,_入力した1桁の整数,[]), integer(_入力した1桁の整数), number_chars(_入力した1桁の整数,[_]),!. 行数と解釈し(_入力した1桁の整数,_行数) :- _入力した1桁の整数 = _行数. 'その後、'. 'その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。'(_行数) :- reawmode, between(1,_行数,_行目), 'キーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。', _行目 = _行数, norawmode. 'キーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。' :- repeat, get_char(_文字), put_char(_文字), _文字 = '\n',!. 行入力(_行文字列) :- get_char(_文字), 行文字ならび(_文字,_行文字ならび), atom_chars(_行文字列,_行文字ならび). 行文字ならび(end_of_file,[]) :- !. 行文字ならび('\n',[]) :- !. 行文字ならび(_文字,[_文字|R]) :- get_char(_次の文字), 行文字ならび(_次の文字,R). rawmode :- shell('stty raw -echo',_). norawmode :- shell('stty -raw echo',_). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # # かたやん印刷所では、いまの時代においてもグーテンベルグ印刷にこだわって印刷をしています。 # グーテンベルグ印刷とは、活版(活字を組み合わせて作った版)で印刷する方法です。(Wikipedia) # # かたやん印刷所の所長かたやんは、使った活字を元の場所に戻さないので、 # いつも活字を入れているボックスはぐちゃぐちゃで、 # ほしい活字をすぐに見つけ出すことができません。 # # そこで見かねた印刷所の副所長エミーは、活字を入れているボックスビデオで撮影し、 # 画像解析し、ボックスのどこにどの活字があるかを解析し、 # ほしい文字列の活字がどこにあるか瞬時にみつけだすプログラミングを作ることにしました。 # # 現状の状態のボックスは以下のようになっています。 # # # 6×6のボックスの中から"PRO, PROGRAMMER"という活字を探し出したいです。 # カンマやスペースは1つの活字としてカウントします。 # ですので、今回は文字13個、カンマ1個、スペース1個の合計15個の活字が必要です。 # 一度使った活字は2回使うことはできません。 # # 活字の場所は、(縦番号,横番号)で表すと以下のような順番で活字を取り出すことができます。 # 縦番号は上から下の方向に、横番号は左から右の方向に、1から数えます。 # 1,4 = P # 2,1 = R # 1,6 = O # 5,2 = , # 5,4 = space # 2,2 = P # 3,4 = R # 4,5 = O # 5,1 = G # 4,3 = R # 1,1 = A # 2,5 = M # 6,1 = M # 2,4 = E # 6,6 = R # # # 上記の例では、例えば"P"という文字が2回でてきますが、(1,4)と(2,2)にある"P"はどちらを先につかってもかまいません。 # また場所の特定は1つのみ記述すればよいです。すべての場所番号を書く必要はありません。 # # 画像解析したボックスのデータはCSVで出力されます。 # ボックスのデータを使ってほしい文字列を作るための活字の在り処を探しだしてください。 # # ■資料 # gutenberg.zip # zipファイルを解凍すると以下のファイルが入っています。 # # gutenberg.csv # このボックスから"STAY HUNGRY, STAY FOOLISH"という活字を取り出してください。 # 文字21個、カンマ1個、スペース3個で、合計25個の活字が必要です。 # # answer.txt # 解答用テキストファイルです。 # # ■解答方法 # 解答用テキストファイル(answer.txt)を完成させ、アップロードしてください。 # ※解答用テキストファイル(answer.txt)以外のファイル形式(zipなど)をアップロードした場合は評価対象外となります。 # '20×20のボックスの生成' :- open('gutenberg.csv',read,Instream), '20×20のボックスの生成'(Instream,_20掛ける20のボックス), close(Instream), assertz('20×20のボックス'(_20掛ける20のボックス)). '20×20のボックスの生成'(Instream,[]) :- at_end_of_stream(Instream),!. '20×20のボックスの生成'(Instream,[L|R]) :- get_line(Instream,Line), split(Line,['\t'],L), '20×20のボックスの生成'(Instream,R). '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス) :- atom_chars(_ある文字列,_文字ならび), '20×20のボックスの中からある文字列を取り出す'(_文字ならび,_20掛ける20のボックス,L), 解の表示(L). '20×20のボックスの中からある文字列を取り出す'([],_20掛ける20のボックス,[]) :- !. '20×20のボックスの中からある文字列を取り出す'([_文字|_残り文字ならび],_20掛ける20のボックス_1,[[_文字,_行目,_列目]|R]) :- ある文字を取り出す(_文字,_20掛ける20のボックス_1,1,_列目,_20掛ける20のボックス_2), '20×20のボックスの中からある文字列を取り出す'(_残り文字ならび,_20掛ける20のボックス_2,R). ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行_2|R_1]) :- nth1(_列目,_行,_文字), 行を更新する(_行,_列目,_行_2),!. ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行|R_2]) :- _行目_2 is _行目 + 1, ある文字を取り出す(_文字,R_1,_行目_2,_列目,R_2). 行を更新する(_行,_列目,_行_2) :- length([_|L1],_列目), append(L1,[_|R],_行), append(L1,[''|R],_行_2),!. 解の表示(L) :- tell('ans.txt'), forall(member([_文字,_行目,_列目],L),writef('%t,%t,%t\n',[_文字,_行目,_列目])), told. get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). :- '20×20のボックスの生成'(_CSVファイル). :- '20×20のボックス'(_20掛ける20のボックス), '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス). % 以下のサイトは # twitter_by_@mog_shi_20140225 # #  【ググった?】 #      /      \ #    YES        NO #   /            \ # 【見つかった?】       死ね #   |    | #   YES   NO #   |     \ # じゃあ聞くな  なら、無ぇよ # % % ?- ググリ信仰(_御託宣). % ググッた? YES % 見つかった? NO % _御託宣 = じゃ、無ぇよ. % true. % ?- ググリ信仰(_御託宣) :- '【ググった?】'(_答え), ググッた(_答え,_御託宣). ググッた('YES',_御託宣) :- '【見つかった?】'(_答え), 見つかった(_答え,_御託宣),!. ググッた('NO','死ね'). 見つかった('YES',じゃあ聞くな). 見つかった('NO','なら、無ぇよ'). '【ググった?】'(_答え) :- write('ググった? '), get_line(_答え), member(_答え,['YES','NO']),!. '【ググった?】'(_答え) :- '【ググった?】'(_答え). '【見つかった?】'(_答え) :- write('見つかった? '), get_line(_答え), member(_答え,['YES','NO']),!. '【見つかった?】'(_答え) :- '【見つかった?】'(_答え). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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). % 以下のサイトは # # シェル経由の他言語インターフェイス shs/3 です。 # shs(Command,_コマンドへの入力ならび,_コマンドからの出力ならび) :- popen(Command,Outstream,Instream), コマンドへの入力(Outstream,_コマンドへの入力ならび), close(Outstream), コマンドからの出力の収集(Instream,_コマンドからの出力ならび), close(Instream). popen(Command,Outstream,Instream) :- open(pipe(Command),write,Outstream), open(pipe(Outstream),read,Instream). コマンドへの入力(Outstream,_コマンドへの入力ならび) :- tell(Outstream), forall(member(_入力行,_コマンドへの入力ならび),writef('%t\n',[_入力行])), told. コマンドからの出力の収集(Instream,[]) :- at_end_of_stream(Instream),!. コマンドからの出力の収集(Instream,[_行|R]) :- get_line(Instream,_行), コマンドからの出力の収集(Instream,R). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,C,[C]) :- at_end_of_stream(Stream),!. get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/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/837 # [2] 配列の大きさ6で、それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。 # 'ならびの要素数6で、それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'(_ならび) :- 'ならびの要素数6で、'(_ならび), 'それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'(_ならび). 'それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'(_ならび) :- 'それを超えると受け取れないようにする。'(_ならび),!. 'それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'([_正の整数|R]) :- '整数を得る。負の数を入力した場合、入力処理を中断する。'(正の整数,_正の整数 >= 0,_正の整数), 'それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'(R). 'それを超えると受け取れないようにする。'([]). '整数を得る。負の数を入力した場合、入力処理を中断する。'(_正の整数) :- 整数を得る(_整数), '負の数を入力した場合、入力処理を中断する。'(_整数,_正の整数). 整数を得る(_整数) :- get_line(Line), '診断: 整数入力'(Line,_整数). 整数を得る(_整数) :- 整数を得る(_整数). '診断: 整数入力'(Line,_整数) :- get_term_from_atom(Line,_整数), integer(_整数),!. '診断: 整数入力'(Line,_整数) :- writef('入力された行"%t"からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '負の数を入力した場合、入力処理を中断する。'(_整数,_正の整数) :- _整数 < 0, writef('入力された整数"%t"は正の整数ではありませんから\n入力と見なされません。\n',[_整数]), !, 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/696 # [1] 授業単元: Cプログラミング # [2] 問題文(含コード&amp;リンク): データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が # 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の # 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 # 探索は二分探索法を使いソートにはクイックソートを使うこと。 # # 表示は以下のようにすること。 # Input A Student Number: 14【Enter】 # Ranking : #269 /*最高得点は1位とせよ.*/ # Subject A : 86 # Subject B : 59.1 # Subject C : 220.42 # Total : 365.52 # # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/697 # 【備考】 # 科目 A の得点は int 型,科目 B,C の得点は double 型で扱うこと. # 合計点が同じになる学生はいないということは既知とせよ. # データの人数は 1000 人であることもわかっているとせよ. # 学籍番号には抜けがある.学籍番号が存在しない場合は,”No data”と表示するようにせよ. # 雛型 (121.c) を用いよ.main 関数は完成しているので,main 関数内で呼び出している関数を作成せよ. # 'データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 探索は二分探索法を使いソートにはクイックソートを使うこと。' :- 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび), 合計得点の順位表を作る(_学生成績ならび,_合計得点の順位表), キーボードから入力された学籍番号の(_学籍番号), 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績), '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績). 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび) :- get_lines('rep_data.txt',Lines), findall(L,( member(_行,Lines), split(_行,[','],L)), _学生成績ならび). 合計得点の順位表を作る(_学生成績ならび,_合計得点の重複要素を許す降順ならび) :- findall(_合計,( member([_,A,B,C],_学生成績ならび), _合計 is A + B + C), _合計得点ならび), 重複要素を許す降順整列(_合計得点ならび,_合計得点の重複要素を許す降順ならび). キーボードから入力された学籍番号の(_学籍番号) :- 整数を得る(学籍番号,_学籍番号 >= 0,_学籍番号). キーボードから入力された学籍番号の(_学籍番号) :- キーボードから入力された学籍番号の(_学籍番号). 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績) :- length(Lines,_最大要素位置), 二分探索法を使い学生の成績を得る(1,_最大要素位置,_最大要素位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_要素位置,_要素位置,Lines,_学籍番号,_学生の成績) :- !, nth1(_要素位置,Lines,[_学籍番号|_学生の成績]). 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- succ(_要素位置_1,1,_要素位置_2),!, 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績), 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- _検索位置 is (_要素位置_1 + _要素位置_2) // 2, nth1(_検索位置,Lines,[_学籍番号_1|_学生の成績_1]), 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_学生の成績_1,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績,_学籍番号,_学生の成績) :- !. 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @< _学籍番号, 二分探索法を使い学生の成績を得る(_要素位置_1,_検索位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @> _学籍番号, 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_2,Lines,_学籍番号,_学生の成績). 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_1,Lines,[_学籍番号|_学生の成績]),!. 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_2,Lines,[_学籍番号|_学生の成績]). 重複要素を許す降順整列([],[]). 重複要素を許す降順整列([_軸要素|_残りならび],_合計得点の重複要素を許す降順ならび) :- 重複要素を許す降順分割(_軸要素,_残りならび,_軸要素と等しいか大きいならび,_軸要素より小さいならび), 重複要素を許す降順整列(_軸要素と等しいか大きいならび,_合計得点の重複要素を許す降順ならび_1), 重複要素を許す降順整列(_軸要素より小さいならび,_合計得点の重複要素を許す降順ならび_2), append(_合計得点の重複要素を許す降順ならび_1,[_軸要素|_合計得点の重複要素を許す降順ならび_2],_合計得点の重複要素を許す降順ならび). 重複要素を許す降順分割(_,[],[],[]) :- !. 重複要素を許す降順分割(_軸要素,[A|R],[A|R2],R3) :- A @>= _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). 重複要素を許す降順分割(_軸要素,[A|R],R2,[A|R3]) :- A @< _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績) :- _学生の成績 = [_科目Aの得点,_科目Bの得点,_科目Cの得点], _学生の合計得点 = _科目Aの得点+_科目Bの得点+_科目Cの得点, nth1(_順位,_合計得点の重複を許す降順ならび,_学生の合計得点), writef('学籍番号 :: %t\n順位 :: #%t\n,科目%t :: %t\n科目%t :: %t\n科目%t :: %t\n',[_学籍番号,_順位,'A',_科目Aの得点,'B',_科目Bの得点,'C',_科目Cの得点]). get_lines(Lines) :- get_lines(user_input,Lines). get_lines(Stream,Lines) :- findall(Line,( get_line(Stream,Line), ( Line=end_of_file,!,fail; true)), Lines). 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_line(user_input,X). % 以下のサイトは % % SWI-Prolog の readln/1 では % ?- readln(X). % :| abc,def % X = [abc,',',def] が期待される。 % ところが漢字を用いると % ?- readln(X). % :| 尾崎,隆大 % X = [尾,崎,',',隆,大] となって漢字の部分を語と認識しない。 % この問題を回避する為の一時凌ぎが以下の述語である。 % 予め、アトムを構成する文字コードのリストを utf16_code/1 で定義して置く。 % :- findall(X,between(12288,40959,X),L1), findall(Y,between(65280,65299,Y),L2), append(L1,L2,L), assertz(utf16_code(L)). readln(X) :- utf16_code(U), readln(X,_,_,U,_). % 以下のサイトは # 出題場所 :: 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/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/1362913813/854 # ●Regular Expressionの使用環境 # Becky! Internet Mail Ver.2 # # ●検索か置換か? # 検索 # # ●説明 # +0900を含まないものを検索したい # # ●対象データ # +0900 # +0500 # +0630 # # ●希望する結果 # +0500 # +0630 # # よろしくお願いします。 # # '+0900を含まないものを検索したい'(_文字列) :- 行ならび入力(_行ならび), '+0900を含まないものを検索したい'(_行ならび,_文字列). '+0900を含まないものを検索したい'(_行ならび,_文字列) :- member(_文字列,_行ならび), '+0900を含まないものを'(_文字列). '+0900を含まないものを'(_文字列) :- \+(sub_atom(_文字列,_,_,_,'+0900')). 行ならび入力([]) :- at_end_of_stream(user_input),!. 行ならび入力(_行ならび) :- 行を入力して行く(_行ならび) :- 行を入力して行く([_行|_残り行ならび]) :- 行入力(_行), 行ならび入力(_残り行ならび). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/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/453 # [2] 問題文 標準入力から1行の文字列を受け取って文字の単方向リストをつくれ # abbdeと入力すると→e→d→c→b→a # 標準入力から1行の文字列を受け取って文字の単方向リストをつくれ(_文字の単方向リスト) :- get_line(_文字列), atom_char(_文字列,_文字の単方向リスト). % 以下のサイトは # 出題場所 :: 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([]. % 以下のサイトは # 出典:: 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). % % 以下のサイトは # 出典 :: C/C++の宿題片付けます 166代目 #59 # 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 10000秒を入力して、2時間46分40秒と表示させるにはどうすればよいですか? '10000秒を入力して、2時間46分40秒と表示させるにはどうすればよいですか?' :- '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。 秒を入力して、時間、分、秒を表示させる'. '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。 秒を入力して、時間、分、秒を表示させる' :- '秒を入力して、'(_入力した秒), '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。 時間、分、秒を表示させる'(_入力した秒). '秒を入力して、'(_入力した秒) :- '秒は正の整数である。正の整数を得る'(_入力した秒). '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。 時間、分、秒を表示させる'(_入力した秒) :- '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。 時間、分、秒を'(_入力した秒,_時間,_分,_秒), 表示させる(_入力した秒,_時間,_分,_秒). '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。 時間、分、秒を'(_入力した秒,_時間,_分,_秒) :- '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。'(_入力した秒,_時間,_分,_秒). '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。'(_入力した秒,_時間,_分,_秒) :- '時間は_入力した秒を3600で割った商、'(_入力した秒,_時間), '分は3600で割った剰余を60で割った商、 秒はその剰余である。'(_入力した秒,_分,_秒). '時間は_入力した秒を3600で割った商、'(_入力した秒,_時間) :- _時間 is _入力した秒 // 3600. '分は3600で割った剰余を60で割った商、 秒はその剰余である。'(_入力した秒,_分,_秒) :- '分は_入力した秒を3600で割った剰余をさらに60で割った商、'(_入力した秒,_分), '秒は_入力した秒を3600で割った剰余をさらに60で割った剰余である。'(_入力した秒,_秒). '分は_入力した秒を3600で割った剰余をさらに60で割った商、'(_入力した秒,_分) :- _3600秒で割った余り is _入力した秒 mod 3600, _分 is _3600秒で割った余り // 60. '秒は_入力した秒を3600で割った剰余をさらに60で割った剰余である。'(_入力した秒,_秒) :- _3600秒で割った余り is _入力した秒 mod 3600, _秒 is _3600秒で割った余り mod 60. 表示させる(_入力した秒,_時間,_分,_秒) :- writef('入力した %w秒は %w時間%w分%w秒になります。\n',[_入力した秒,_時間,_分,_秒]). '秒は正の整数である。正の整数を得る'(_整数) :- write('秒(正の整数)を入力して下さい :: '), 行入力(_文字列), 正の整数入力検査(_文字列,_整数),!. '秒は正の整数である。正の整数を得る'(_整数) :- write('再入力をお願いします。\n'), '秒は正の整数である。正の整数を得る'(_整数). 行入力(_文字列) :- read_line_to_codes(current_input,Codes), atom_codes(_文字列,Codes). 正の整数入力検査(_文字列,_整数) :- 文字列は数値であり(_文字列,_整数),!, 正の整数(_整数). 文字列は数値であり(_文字列,_整数) :- atom_number(_文字列,_整数),!. 文字列は数値であり(_文字列,_整数) :- writef('入力された%wから数値が得られません。',[_文字列]), fail. 正の整数(_整数) :- 整数(_整数),!, 正の(_整数). 整数(_整数) :- integer(_整数),!. 整数(_整数) :- write('入力された数%wは整数ではありません。',[_整数]), fail. 正の(_整数) :- _整数 >= 0,!. 正の(_整数) :- writef('入力された整数%wは負数でした。',[_整数]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/879 # # # 問題 # 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 # 700 # 900 # 198 # 330 # # 1999 # 1999 # 100 # 189 # 100 # # 出力例 1 出力例 2 # 848 # # 150 # # 入出力例 1 では,2 つ目のパスタと 1 つ目のジュースを組み合わせた場合の 700 + 198 - 50 = 848 がその日のセットメニューの代金の最小値である. # # 入出力例 2 では,3 つ目のパスタと 2 つ目のジュースを組み合わせた場合の 100 + 100 - 50 = 150 がその日のセットメニューの代金の最小値である. # # ※各入出力例のデータは,右クリック等によりファイルに保存して利用可能です. 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる. ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求めるプログラムを作成せよ. 入力 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. 1 行目の整数は 1 つ目のパスタの値段である. 2 行目の整数は 2 つ目のパスタの値段である. 3 行目の整数は 3 つ目のパスタの値段である. 4 行目の整数は 1 つ目のジュースの値段である. 5 行目の整数は 2 つ目のジュースの値段である. ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている. 出力 その日のセットメニューの代金の最小値を 1 行で出力せよ.' :- '入力 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. 1 行目の整数は 1 つ目のパスタの値段である. 2 行目の整数は 2 つ目のパスタの値段である. 3 行目の整数は 3 つ目のパスタの値段である. 4 行目の整数は 1 つ目のジュースの値段である. 5 行目の整数は 2 つ目のジュースの値段である. ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび), 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる. ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび,_セットメニューの代金の最小値), 'その日のセットメニューの代金の最小値を 1 行で出力せよ.' (_セットメニューの代金の最小値). '入力 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. 1 行目の整数は 1 つ目のパスタの値段である. 2 行目の整数は 2 つ目のパスタの値段である. 3 行目の整数は 3 つ目のパスタの値段である. 4 行目の整数は 1 つ目のジュースの値段である. 5 行目の整数は 2 つ目のジュースの値段である. ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている.'([_1つ目のパスタの値段,_2つ目のパスタの値段,_3つ目のパスタの値段],[_1つ目のジュースの値段,_2つ目のジュースの値段]) :- '「ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている.」とあるから、整数範囲の検査は行わなくてよい。', '1 行目の整数は 1 つ目のパスタの値段である.'(_1つ目のパスタの値段), '2 行目の整数は 2 つ目のパスタの値段である.'(_2つ目のパスタの値段), '3 行目の整数は 3 つ目のパスタの値段である.'(_3つ目のパスタの値段), '4 行目の整数は 1 つ目のジュースの値段である.'(_1つ目のジュースの値段), '5 行目の整数は 2 つ目のジュースの値段である.'(_2つ目のジュースの値段). '1 行目の整数は 1 つ目のパスタの値段である.'(_1つ目のパスタの値段) :- 整数を得る(_1つ目のパスタの値段). '2 行目の整数は 2 つ目のパスタの値段である.'(_2つ目のパスタの値段) :- 整数を得る(_2つ目のパスタの値段). '3 行目の整数は 3 つ目のパスタの値段である.'(_3つ目のパスタの値段) :- 整数を得る(_2つ目のパスタの値段). '4 行目の整数は 1 つ目のジュースの値段である.'(_1つ目のジュースの値段) :- 整数を得る(_1つ目のジュースの値段). '5 行目の整数は 2 つ目のジュースの値段である.'(_2つ目のジュースの値段) :- 整数を得る(_2つ目のジュースの値段). 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる. ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび,_セットメニューの代金の最小値) :- findmin(_セットメニューの代金,( 'このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび,_パスタの価格,_ジュースの価格), 'パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.'(_パスタの価格,_ジュースの価格,_セットメニューの代金)), _セットメニューの代金の最小値). 'このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび,_パスタの価格,_ジュースの価格) :- member(_パスタの価格,_3種類のパスタの価格ならび), member(_ジュースの価格,_2種類のジュースの価格ならび). 'パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.'(_パスタの価格,_ジュースの価格,_セットメニューの合計) :- _セットメニーの合計 is _パスタの価格 + _ジュースの価格 - 50. 'その日のセットメニューの代金の最小値を 1 行で出力せよ.' (_セットメニューの代金の最小値) :- writef('その日のメニューの最小値は %t\n',[_セットメニューの代金の最小値]). '「ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている.」とあるから、整数範囲の検査は行わなくてよい。' :- true. findmin(A,P,_min) :- findall(A,P,L), min_list(L,_min). 整数を得る(_整数) :- read_line_to_codes(Codes), number_codes(_整数,Codes), integer(_整数),!. 整数を得る(_整数) :- 整数を得る(_整数). % 以下のサイトは # # お題:テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示するプログラム # 'テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示する'(_テキストファイル) :- テキストファイルを読み込み(_テキストファイル,_文), 'その中で最もよく使われている単語ベスト3を表示する'(_文). テキストファイルを読み込み(_テキストファイル,_文) :- get_lines(_テキストファイル,_行ならび), atomic_list_concat(_行ならび,_文). 'その中で最もよく使われている単語ベスト3を表示する'(_文) :- 形態素解析(文,_文,_形態素ならび), 最もよく使われている単語ベスト3を(_形態素ならび,_最もよく使われている単語ベスト3), 表示する(_最もよく使われている単語ベスト3). その中で最もよく使われている単語ベスト3を(_形態素ならび,[_単語1,_単語2,_単語3]) :- setof(A,member(A,_形態素ならび),_単語ならぴ), findall([_度数,_単語],( member(_単語,_単語ならび), count(_単語,_形態素ならび,_度数)), LL), sort(LL,_整列したLL), append(_,[[_,_単語3],[_,_単語2],[_,_単語1]],_整列したLL). 表示する([_単語1,_単語2,_単語3]) :- writef('%t %t %t\n',[_単語1,_単語2,_単語3]). count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum_list(_値ならび,_合計値),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 形態素解析サーバー(mecab). 形態素解析([],[]) :-!. 形態素解析([['EOS'|_]|_],[]) :-!. 形態素解析([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素解析(R2,R3),!. 形態素解析([[A|_]|R],[B|R2]) :- 形態素解析サーバー(mecab), make_list(A,['\t'],AL), AL = [B|_], 形態素解析(R,R2),!. 形態素解析([[A|_]|R],[A|R2]) :- 形態素解析サーバー(juman), 形態素解析(R,R2),!. 形態素解析_2([],[],[]) :- !. 形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!. 形態素解析_2([[@,A|_]|R],[A|R2],R3) :- 形態素解析_2(R,R2,R3),!. 形態素解析_2_重複削除([],L1,L) :- reverse(L1,L),!. 形態素解析_2_重複削除([A|R],Y,X) :- member(A,Y), 形態素解析_2_重複削除(R,Y,X),!. 形態素解析_2_重複削除([A|R],Y,X) :- \+(member(A,Y)), 形態素解析_2_重複削除(R,[A|Y],X). 形態素解析(ファイル,_テキストファイル,L) :- 形態素解析サーバー(_形態素解析サーバー), concat(['cat ',_テキストファイル,' | ',_形態素解析サーバー],S), sh(S,L1), 形態素解析(L1,L2), 形態素解析_3(L2,L). 形態素解析(文,S,L) :- tmpnam(_仮のファイル), tell(_仮のファイル), wr('%t',[S]), told, 形態素解析(ファイル,_仮のファイル,L) . 形態素解析_3([],[]). 形態素解析_3([A|R],[A|R2]) :- \+(list(A)), 形態素解析_3(R,R2) . 形態素解析_3([A|R],[B|R2]) :- list(A), member(B,A), 形態素解析_3(R,R2). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y) , split(V,[' ',','],U)), X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). tmpnam(TMPNAM) :- 乱数からTMPNAMを得る(TMPNAM),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 乱数からTMPNAMを得る(TMPNAM) :- アルファベットに変換([_1,_2,_3,_4,_5,_6]), atomic_list_concat(['/tmp/file'|[_1,_2,_3,_4,_5,_6]],TMPNAM), \+(exists_file(TMPNAM)). アルファベットに変換([]). アルファベットに変換([A|R]) :- C is random(62), アルファベットに変換の二(C,A), アルファベットに変換(R). アルファベットに変換の二(N,A) :- '基数62のコード・アルファベットコード変換表'(S,E,B), between(S,E,N), C is N - S + B, char_code(A,C). '基数62のコード・アルファベットコード変換表'(0,9,48). '基数62のコード・アルファベットコード変換表'(10,35,65). '基数62のコード・アルファベットコード変換表'(36,60,97). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/761 # # どなたかお手伝いお願いします。 # # [1] 授業単元:プログラミング実習 # [2] 問題文:三角形底辺aと高さhを引数で与え、面積を計算する関数sを作成しなさい。 # また,main関数で底辺と高さを入力し、面積は関数で求め、main関数に返し出力しなさい。 # main :- 三角形の底辺aを得る(_a), 高さhを得る(_h), '三角形底辺aと高さhを引数で与え、面積sを計算する'(_a,_h,_s), writef('三角形の面積は %t \n',[_s]). '三角形底辺aと高さhを引数で与え、面積sを計算する'(_a,_h,_s) :- _s is 0.5 * _h * _s. 三角形の底辺aを得る(_a) :- write('三角形の底辺aを入力して下さい : '), get_line(Line), '診断: 三角形の底辺aを得る'(Line,_a),!. 三角形の底辺aを得る(_a) :- 三角形の底辺aを得る(_a). '診断: 三角形の底辺aを得る'(Line,_a) :- atom_number(Line,_a),!. '診断: 三角形の底辺aを得る'(Line,_a) :- writef('入力された %t は数値ではありません。再入力をお願いします。\n',[Line]), fail. 高さhを得る(_h) :- write('高さhを入力して下さい : '), get_line(Line), '診断: 高さhを得る'(Line,_h),!. 高さhを得る(_h) :- 高さhを得る(_h). '診断: 高さhを得る'(Line,_h) :- atom_number(Line,_h),!. '診断: 高さhを得る'(Line,_h) :- writef('入力された %t は数値ではありません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/744 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&amp;リンク): # 次の式を計算するプログラムを作れ。 # Sum = 14 + 24 + ... + N4 # (注意) ・ Nの値は、キーボードから入力できるようにすること。 #     ・scanfではなくgetcharを用いること # '次の式を計算するプログラムを作れ Sum = 14 + 24 + ... + N4 (注意) ・ Nの値は、キーボードから入力できるようにすること。     ・scanfではなくgetcharを用いること' :- 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N), 'Sum = 14 + 24 + ... + N4 の式を'(_N,L), 計算する(L,Sum), atomic_list_concat(L,' + ',S1), write('%t = %t\n',[Sum,S1]). 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N) :- write('整数N[3-9]を入力して下さい : '), get_line(Line), '診断 : Nの値はキーボードから入力'(Line,_N),!. 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N) :- 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N). '診断 : Nの値はキーボードから入力'(Line,_N) :- atom_number(Line,_N), integer(_N), _N > 2,!. '診断 : Nの値はキーボードから入力'(Line,_N) :- writef('入力された値%tは3以上9以下の整数ではありません。再入力をお願いします。\n',[Line]), fail. 'Sum = 14 + 24 + ... + N4 の式を'(_N,L) :- findall(_m_1,( between(1,_m,_N), _m_1 is _m * 10 + 4), L). 計算する(L,Sum) :- sum(L,Sum). sum([],0). sum([N|R],Sum) :- sum(R,Sum_1), Sum is Sum_1 + N. % 以下のサイトは # # グーを0、チョキを1、パーを2とし、ユーザは自分の出す手をキーボードから入力する。 # 'グーを0、チョキを1、パーを2とし、ユーザは自分の出す手をキーボードから入力する。'(_自分の出す手) :- 'ユーザは自分の出す手をキーボードから入力する。'(_自分の出す手の入力値), 'グーを0、チョキを1、パーを2とし、'(_自分の出す手,_自分の出す手の入力値),!. 'グーを0、チョキを1、パーを2とし、'(_自分の出す手,_自分の出す手の入力値) :- グーを0(_自分の出す手,_自分の出す手の入力値). 'グーを0、チョキを1、パーを2とし、'(_自分の出す手,_自分の出す手の入力値) :- チョキを1(_自分の出す手,_自分の出す手の入力値). 'グーを0、チョキを1、パーを2とし、'(_自分の出す手,_自分の出す手の入力値) :- パーを2(_自分の出す手,_自分の出す手の入力値). グーを0(グー,0). チョキを1(チョキ,1). パーを2(パー,2). 'ユーザは自分の出す手をキーボードから入力する。'(_自分の出す手の入力値) :- キーボードから(_キーボードの入力ストリーム), get_line(_キーボードの入力ストリーム,Line), atom_number(Line,_自分の出す手の入力値). 'ユーザは自分の出す手をキーボードから入力する。'(_自分の出す手の入力値) :- 'ユーザは自分の出す手をキーボードから入力する。'(_自分の出す手の入力値). キーボードから(user_input). % 以下のサイトは # # グーを0、チョキを1、パーを2とし、ユーザは自分の出す手をキーボードから入力する。 # 'グーを0、チョキを1、パーを2とし、ユーザは自分の出す手をキーボードから入力する。'(_自分の出す手) :- 入力プロセスの生成(Id,Message_queue_Id), 'グーを0、チョキを1、パーを2とし'(_自分の出す手,_自分の出す手の入力値), 'ユーザは自分の出す手をキーボードから入力する。'(Id,Message_queue_Id,_自分の出す手の入力値),!. 'グーを0、チョキを1、パーを2とし'(_自分の出す手,_自分の出す手の入力値) :- グーを0(_自分の出す手,_自分の出す手の入力値). 'グーを0、チョキを1、パーを2とし'(_自分の出す手,_自分の出す手の入力値) :- チョキを1(_自分の出す手,_自分の出す手の入力値). 'グーを0、チョキを1、パーを2とし'(_自分の出す手,_自分の出す手の入力値) :- パーを2(_自分の出す手,_自分の出す手の入力値). グーを0(グー,0). チョキを1(チョキ,1). パーを2(パー,2). 'ユーザは自分の出す手をキーボードから入力する。'(Id,Message_queue_Id,_自分の出す手の入力値) :- キーボードから(_キーボードの入力ストリーム), 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,Line), atom_number(Line,_自分の出す手の入力値). 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,_情報) :- 入力プロセスから一度得た情報(Id,Message_queue_Id,Term), 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,Term,_情報). 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,_情報) :- 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,_情報). 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,_情報,_情報). 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,_情報,_情報) :- thread_peek_massage(Message_queue_Id,_次の情報),!,fail. 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,Term,_情報) :- 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,Term,_情報). 入力プロセスから一度得た情報(Id,Message_queue_Id,Term) :- thread_get_message(Message_queue_Id,Term). 入力プロセスの生成(Id,Message_queue_Id) :- thread_create(キーボードからの入力(Message_queue_Id),Id,[]). キーボードからの入力(Message_queue_Id) :- message_queue_create(Message_queue_Id), キーボードからの入力(Message_queue_Id). キーボードからの入力(Message_queue_Id) :- reapeat, キーボードから(Instream), get_line(Instream,Line), thread_send_message(Message_queue_Id,Line), fail. キーボードから(user_input). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/429 # # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/430 # # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/431 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):次レスで # # ランダムな整数がデータとして保存されたファイルから,まず,データの個数nを読み込み,その数だけデータを読み込み2分探索木に格納する. # 次に整数を一つだけキーボードから入力する. # そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する. # さらに,読み込んだデータの中で最小の値を表示し,プログラムを終了する. # いろいろなデータについて実行し,yes/noの判定と最小値の結果が正しいことを確認すること. # # ファイルの中身はこんな感じです。 # 10は要素数を表します。 # # 10 # # 27446 # 58007 # 103 # 56548 # 21869 # 21538 # 7867 # 65552 # 91919 # 76211 # # 'ランダムな整数がデータとして保存されたファイルから,まず,データの個数nを読み込み,その数だけデータを読み込み2分探索木に格納する. 次に整数を一つだけキーボードから入力する. そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する. さらに,読み込んだデータの中で最小の値を表示し,プログラムを終了する.' :- 'ランダムな整数がデータとして保存されたファイルから,'(Instream), 'まず,データの個数nを読み込み,その数だけデータを読み込み2分探索木に格納する.'(Instream,_2分探索木), '次に整数を一つだけキーボードから入力する.'(_整数), 'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'(_2分探索木,_整数), 'さらに,読み込んだデータの中で最小の値を表示し,プログラムを終了する.'.(_2分探索木). 'ランダムな整数がデータとして保存されたファイルから,'(Instream) :- 'ランダムな整数がデータとして保存されたファイル'(_ファイル), open(_ファイル,read,Instream). 'ランダムな整数がデータとして保存されたファイル'('save_binary_tree.txt'). 'まず,データの個数nを読み込み,その数だけデータを読み込み2分探索木に格納する.'(Instream,_2分探索木) :- 'まず,データの個数nを読み込み,'(Instream,_データの個数n), 'その数だけデータを読み込み2分探索木に格納する.'(Instream,_データの個数n,_2分探索木). 'まず,データの個数nを読み込み,'(Instream,_データの個数n) :- get_line(Instream,Line), atom_number(Line,_データの個数n). 'その数だけデータを読み込み2分探索木に格納する.'(Instream,N,_データの個数n,_2分探索木) :- データを読み込み(N), 'その数だけデータを読み込み2分探索木に格納する.'(Instream,0,_データの個数n,[_,_,_],_2分探索木). 'その数だけデータを読み込み2分探索木に格納する.'(Instream,_データの個数n,_データの個数n,_2分探索木,_2分探索木) :- close(Instream),!. 'その数だけデータを読み込み2分探索木に格納する.'(Instream,N,_データの個数n,_2分探索木_1,_2分探索木) :- データを読み込み(Instream,_データ), '2分探索木に格納する.'(_データ,_2分探索木_1,_2分探索木_2), N_2 is N + 1, 'その数だけデータを読み込み2分探索木に格納する.'(Instream,1,_データの個数n,_2分探索木_2,_2分探索木). データを読み込み(Instream,_データ) :- get_line(Instream,Line), \+(Line = ''), atom_number(Line,N),!. データを読み込み(Instream,_データ) :- データを読み込み(Instream,_データ). '2分探索木に格納する.'(_データ,[A,B,C],[A,_データ,C]) :- var(B),!. '2分探索木に格納する.'(_データ,[A,B,C],_2分探索木) :- 左枝の探索木に格納する(_データ,A,B,C,_2分探索木). '2分探索木に格納する.'(_データ,[A,B,C],_2分探索木) :- 右枝の探索木に格納する(_データ,A,B,C,_2分探索木). 左枝の探索木に格納する(_データ,A,B,C,[[_,_データ,_],B,C]) :- _データ =< B, var(A),!. 左枝の探索木に格納する(_データ,A,B,C,[A_1,B,C]) :- _データ =< B, '2分探索木に格納する.'(_データ,A,A_1). 右枝の探索木に格納する(_データ,A,B,C,[A,B,[_,_データ,_]]) :- _データ > B, var(C),!. 右枝の探索木に格納する(_データ,[A,B,C],[A,B,C_1]) :- _データ > B, '2分探索木に格納する.'(_データ,C,C_1). '次に整数を一つだけキーボードから入力する.'(_整数) :- 整数を得る(整数,_整数). 'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'([A,_整数,C],_整数) :- write('yes\n'),!. 'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'([A,B,C],_整数) :- var(B), write('no\n'),!. 'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'([A,B,C],_整数) :- 左の探索木の探索(B,A,_整数). 'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'([A,B,C],_整数) :- 右の探索木の探索(B,C,_整数). 左の探索木の探索結果表示(B,A,_整数) :- _整数 =< B, 'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'(A,_整数),!. 右の探索木の探索(B,C,_整数) :- _整数 > B, 'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'(C,_整数),!. 'さらに,読み込んだデータの中で最小の値を表示し,プログラムを終了する.'([A,B,C]) :- 'さらに,読み込んだデータの中で最小の値を表示し,'(_2分探索木), 'プログラムを終了する.'. 'さらに,読み込んだデータの中で最小の値を表示し,'([A,B,C]) :- var(A), writef('最小の値は %t です\n',[B]),!. 'さらに,読み込んだデータの中で最小の値を表示し,'([A,B,C]) :- \+(var(A)), 'さらに,読み込んだデータの中で最小の値を表示し,'(A). 'プログラムを終了する.' :- true. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/13 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # 1桁の整数10個をスペース区切りで入力すると,隣り合う2つの整数の和の1の位を表示していき # 1個になるまで繰り返すプログラムを作成せよ. # 【入力例】 # 7 5 6 5 4 5 7 1 3 2 # 【出力例】 # 2 1 1 9 9 2 8 4 5 # 3 2 0 8 1 0 2 9 # 5 2 8 9 1 2 1 # 7 0 7 0 3 3 # 7 7 7 3 6 # 4 4 0 9 # 8 4 9 # 2 3 # 5 # # '1桁の整数10個をスペース区切りで入力すると,隣り合う2つの整数の和の1の位を表示していき1個になるまで繰り返すプログラムを作成せよ.' :- '1桁の整数10個をスペース区切りで入力すると,'(L), '隣り合う2つの整数の和の1の位を表示していき1個になるまで繰り返す'(L),!. '1桁の整数10個をスペース区切りで入力すると,'(L) :- write('1桁の整数10個をスペース区切りで入力しなさい : '), get_split_line([' '],L). get_split_line(_区切りパターン,L) :- get_line(Line), split(Line,_区切りパターン,L). '隣り合う2つの整数の和の1の位を表示していき1個になるまで繰り返す'([_]). '隣り合う2つの整数の和の1の位を表示していき1個になるまで繰り返す'(L) :- '隣り合う2つの整数の和の1の位を表示していき'(L,L1), '隣り合う2つの整数の和の1の位を表示していき1個になるまで繰り返す'(L1). '隣り合う2つの整数の和の1の位を表示していき'([N1,N2],[N3]) :- N3 is (N1 + N2) mod 10, writef('%t\n',[N3]). '隣り合う2つの整数の和の1の位を表示していき'([N1,N2|R1],[N3|R2]) :- N3 is (N1 + N2) mod 10, writef('%t ',[N3]), '隣り合う2つの整数の和の1の位を表示していき'([N2|R1],R2). % 以下のサイトは # 出典:: 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/852 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 「空白を挟まず、何か入力してください。」と表示した後、入力された先頭文字が英字大文字、英字小文字、数字かを判定し、 # 「先頭文字は○○です。」という表示を行うプログラムを作成しなさい。 # '「空白を挟まず、何か入力してください。」と表示した後、入力された先頭文字が英字大文字、英字小文字、数字かを判定し、「先頭文字は○○です。」という表示を行う' :- '「空白を挟まず、何か入力してください。」と表示した', '入力された'(Line), '先頭文字が英字大文字、英字小文字、数字かを判定し'(Line,_判定), '「先頭文字は○○です。」という表示を行う'(_判定). '「空白を挟まず、何か入力してください。」と表示した後' :- write('空白を挟まず、何か入力してください。\n'). '入力された'(Line) :- get_line(Line). '先頭文字が英字大文字、英字小文字、数字かを判定し'(Line,_判定) :- sub_atom(Line,0,1,_,_先頭文字), '英字大文字、英字小文字、数字かを判定し'(_先頭文字,_判定). '英字大文字、英字小文字、数字かを判定し'(_先頭文字,英字大文字) :- 英字大文字(_先頭文字),!. '英字大文字、英字小文字、数字かを判定し'(_先頭文字,英字小文字) :- 英字小文字(_先頭文字),!. '英字大文字、英字小文字、数字かを判定し'(_先頭文字,数字) :- 数字(_先頭文字). 英字大文字(_先頭文字) :- _先頭文字 @>= 'A', _先頭文字 @=< 'Z'. 英字小文字(_先頭文字) :- _先頭文字 @>= 'a', _先頭文字 @=< 'z'. 数字(_先頭文字) :- _先頭文字 @>= '0', _先頭文字 @=< '9'. '「先頭文字は○○です。」という表示を行う'(_判定) :- writef('先頭文字は%tです。\n',[_判定]). % 以下のサイトは # 出典:: 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([]. % 以下のサイトは # 出典::c言語の宿題片付けます 164代目 #823 # [1] 授業単元: C # [2] 問題文(含コード&リンク): # [3] 環境 #  [3.1] 7 #  [3.2] gcc #  [3.3] C # [4] 期限: 明日まで # [5] その他の制限:a[]など配列は使わない。 # # # # リスト構造で名簿を作っているんですが、標準入力から名前を常に先頭に # 入れるという処理を10回繰り返しても10個とも全部最後に入力した名前に # なってしまいます・・・どうしてでしょうか? # 山田 田中 佐藤 鈴木 村上 # 山本 裏山 田山 小島 島々 # # これだけの名前を先頭から順番に入れて, # printf("%s",P.first->name); # printf("%s",P.first->->next->name); # printf("%s",P.first->->next->next->name); # ・ # ・ # 10個とも島々になってしまいます・・・何故でしょうか? # 一番簡単なリスト構造で先頭に入れるプログラム作っていただきませんか? # ちなみにPはfirstを含む構造体です。firstは構造体NAMEへのポインタで、 # 最初first=NULLです。 name,nextはNAMEのメンバーです。 # 'リスト構造で名簿を作っているんですが、標準入力から名前を常に先頭に 入れるという処理を10回繰り返しても10個とも全部最後に入力した名前に なってしまいます'(L) :- 'リスト構造で名簿を作っているんですが、標準入力から名前を常に先頭に 入れるという処理を10回繰り返しても10個とも全部最後に入力した名前に なってしまいます'([],L). 'リスト構造で名簿を作っているんですが、標準入力から名前を常に先頭に 入れるという処理を10回繰り返しても10個とも全部最後に入力した名前に なってしまいます'(L,L) :- length(L,10),!. 'リスト構造で名簿を作っているんですが、標準入力から名前を常に先頭に 入れるという処理を10回繰り返しても10個とも全部最後に入力した名前に なってしまいます'(L1,L) :- get_line(Line), 'リスト構造で名簿を作っているんですが、標準入力から名前を常に先頭に 入れるという処理を10回繰り返しても10個とも全部最後に入力した名前に なってしまいます'([Line|L1],L). % 以下のサイトは # 宿題じゃないんだけど、 # input.txtの中身が # 北アイルランド # あいうえお # aaa # だったとして # → # aaa # あいうえお # 北アイルランド # とエクセルの昇順と同じように並べ替えて # output.txtとして保存するプログラムを作成する # # C言語でお願いします。 'input.txtの中身が 北アイルランド あいうえお aaa だったとして → aaa あいうえお 北アイルランド とエクセルの昇順と同じように並べ替えて output.txtとして保存するプログラム' :- 'input.txtの中身が'(_行ならび), エクセルの昇順と同じように並べ替えて(_行ならび,_整列済み行ならび), 'output.txtとして保存する'(_整列済み行ならび). 'input.txtの中身が'(_行ならび) :- get_lines('input.txt',_行ならび). エクセルの昇順と同じように並べ替えて(_行ならび,_整列済み行ならび) :- 整列(_行ならび,_整列済み行ならび). 'output.txtとして保存する'(_整列済み行ならび) :- open('output.txt',write,Outstream), 'output.txtとして保存する'(Outstream,_整列済み行ならび), close(Outstream). 'output.txtとして保存する'(_,[]). 'output.txtとして保存する'(Outstream,[_行|_残り行ならび]) :- writef(Outstream,'%t\n',[_行]), 'output.txtとして保存する'(Outstream,_残り行ならび). get_lines( 整列([],[]). 整列([_軸要素|_残りならび],_整列したならび) :- 分類(_軸要素,_残りならび,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび), 整列(_軸要素に等しいか小さい要素ならび,_整列した軸要素に等しいか小さい要素ならび), 整列(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), append(_整列した軸要素に等しいか小さい要素ならび,[_軸要素|_整列した軸要素に等しいか小さい要素ならび],_整列したならび). 分類(_,[],[],[]). 分類(_軸要素,[_要素|_残り要素ならび],[_要素|_軸要素に等しいか小さい要素ならび],_軸要素より大きい要素ならび) :- _要素 @=< _軸要素, 分類(_軸要素,_残り要素ならび,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび). 分類(_軸要素,[_要素|_残り要素ならび],_軸要素に等しいか小さい要素ならび,[_要素|_軸要素より大きい要素ならび]) :- _要素 @> _軸要素, 分類(_軸要素,_残り要素ならび,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1232627790/958 # # 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】7/14 am6:00 # 【 Ver  】Eclipse Version: 3.4.2 # 【 補足 】 # あいう # かきく # さしす # 上記のようなテキストファイルを読み込み、 # さかあ # しきい # すくう # のように別のテキストファイルに書き出す感じです。 'テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す'(InFile,OutFile) :- テキストファイルから文字列5行を読み込み(Infile,_文字列5行), 別のテキストへ右縦書きで(_文字列5行,_右書き用に置換された文字列ならび), 書き出す(OutFile,_右書きように置換された文字列ならび), テキストファイルから文字列5行を読み込み(Infile,_文字列5行) :- open(InFile,read,Instream), findall(_行,( between(1,5,N), get_line(Instream,_行)), _文字列5行), close(InFile). 別のテキストへ右縦書きで(_文字列5行,_右書き用に置換された文字列ならび) :- findmax(_行の長さ,( member(_行,_文字列5行), atom_length(_行,_行の長さ), _最長文字数), 空白文字を付加して文字数一致させる(_最長文字数,_文字列5行,_空白文字を付加して矩形にした文字列5行), 右書き用に置換する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび). 右書き用に置換する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび) :- 行を反転しながら転置する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび). 行を反転しながら転置する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび) :- '一旦文字ならびに変換して、行を反転して転置する'(_空白文字を付加して矩形にした文字列5行,LL2), 文字列に戻す(LL2,_右書き用に置換された文字列ならび). '一旦文字ならびに変換して、行を反転して転置する'(_空白文字を付加して矩形にした文字列5行,LL2) :- findall(L,( member(_行,_空白文字を付加して矩形にした文字列5行), atom_chars(_行,Chars), reverse(Chars,L)), LL1), 転置(LL1,LL2). 文字列に戻す(LL2,_右書き用に置換された文字列ならび) :- findall(_文字列,( member(Chars,LL2), atom_chars(_文字列,Chars)), _右書き用に置換された文字列ならび). 空白文字を付加して文字数を一致させる(_最大文字数,_文字列5行,_空白を付加した文字列5行) :- findall(_空白を付加された文字列,( member(_文字列,_文字列5行), atom_length(_文字列,_文字列長さ), 空白文字を付加する(_最大文字数,_文字列の長さ,_文字列,_空白を付加された文字列)), _空白を付加された文字列5行). 空白文字を付加する(_最大文字数,_文字列の長さ,_文字列,_空白を付加された文字列) :- _空白文字数 is _最大文字数 - _文字列の長さ, findall(' ',between(1,_空白文字数,_),_空白文字ならび), atomic_list_concat([_文字列|_空白文字ならび],_空白を付加された文字列). 書き出す(OutFile,_右書き用に置換された文字列ならび) :- open(OutFile,write,Outstream), append(_,[_行|R],_右書き用に置換された文字列ならび), writef(Outstream,'%t\n',[_行]), R = [], close(Outstream). % % この符にはfindall/3だけで表現するという主題がある。 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/727 # # [1] 授業単元: 暇つぶし # [2] 問題文:迷路を解くプログラム。 #  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 # ----- ここからテキスト ----- # 5 5 # sxrrr # rxrrr # rrrxr # rrxgr # ----- ここまでテキスト ----- #  テキストの1行目は順番に迷路の横幅と縦幅を表します。 #  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。 #  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。 #  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 # 1 step # sxrrr # +xrrr # rrrxr # rrxgr # <中略> # 9 step # sxrrr # +x+++ # +++x+ # rrxg+ # '問題文:迷路を解くプログラム。  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 ----- ここからテキスト ----- 5 5 sxrrr rxrrr rrrxr rrxgr ----- ここまでテキスト -----  テキストの1行目は順番に迷路の横幅と縦幅を表します。  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 1 step sxrrr +xrrr rrrxr rrxgr <中略> 9 step sxrrr +x+++ +++x+ rrxg+ '(_テキスト) :- 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト). 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト) :- テキストを入力とし(_テキスト,LL1,LL2), スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順), '道を表示してください。'(_スタートからゴールまでの道順,LL1). スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順) :- スタートを探す(LL1,LL2,_スタートの行,_スタートの列), ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列), 隣に移動する(_スタートの行,_スタートの列,_ゴールの行,_ゴールの列,LL1,LL2,[],_スタートからゴールまでの道順). テキストを入力とし(_テキスト,LL1,LL2) :- get_lines(_テキスト,[_不要要素|_行ならび]), findall(_文字ならび,( member(_一行,_行ならび), atom_chars(_一行,_文字ならび)), LL1), 転置(LL1,LL2). スタートを探す(LL1,LL2,_スタートの行,_スタートの列) :- nth1(_スタートの行,LL1,L), nth1(_スタートの列,L,s). ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列) :- nth1(_ゴールの行,LL1,L), nth1(_ゴールの列,L,g). 隣に移動する(_ゴールの行,_ゴールの列,_ゴールの行,_ゴールの列,LL1,LL2,_,[[_ゴールの行,_ゴールの列]]). 隣に移動する(_行,_列,_ゴールの行,_ゴールの列,LL1,LL2,_履歴1,[[_行,_列]|R]) :- 移動可能な隣接点を得る(_行,_列,LL1,LL2,_隣の行,_隣の列), \+(member([_隣の行,_隣の列],_履歴1)), 隣に移動する(_隣の行,_隣の列,_ゴールの行,_ゴールの列,LL1,LL2,[[_行,_列]|_履歴1],R). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 列の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列) :- nth1(_行,LL1,L), length([_|L0],_列), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の列). 列の移動可能な隣接点(_行,_列,LL1,LL2,_隣の行,_隣の列) :- nth1(_列,LL2,L), length([_|L0],_行), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の行). 移動可能な隣接点(L0,R,_隣) :- last(L0,r), length(L0,_隣). 移動可能な隣接点(L0,R,_隣) :- R = [r|_], length([_,_|L0],_隣). '道を表示してください。'(_スタートからゴールまでの道順,LL) :- append(LL0,[[_行,_列]|RR],_スタートからゴールまでの道順), length([_|LL0],_ステップ), write('%t\n',[_ステップ]), '通過点を+に置換してLLを表示する'(_行,_列,LL), R = []. '通過点を+に置換してLLを表示する'(_行,_列,LL) :- append(L0,[L1|R],LL), length([_|L0],_行_1), 列の置換(_行_1,_行,_列,L1,L2), ならびを文字列に変換して表示(L2), R = []. 列の置換(_行,_行,_列,L1,L2) :- length([_|L0],_列), append(L0,[_|R],L1), append(L0,[+|R],L2),!. 列の置換(_,_,_,L,L). ならびを文字列に変換して表示(L) :- atomic_list_concat(L,S), writef('%t\n',[S]). 転置([],[],[]) :- !. 転置([[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/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/610 # # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # program :- '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列,0,0,0,0). '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする' :- 入力したDNA塩基配列(_DNA配列), atom_chars(_DNA配列,_DNA塩基ならび), '入力したDNA塩基ならび中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA塩基ならび,0,0,0,0). 入力したDNA塩基配列(_DNA配列) :- write('DNA塩基配列を入力してください : '), get_line(_DNA配列). '入力したDNA塩基ならび中にある塩基 t, c, a, g それぞれの個数をカウントする'([],_t,_c,_a,_g) :- 塩基カウント出力([[t,_t],[c,_c],[a,_a],[g,_g]]),!. '入力したDNA塩基ならび中にある塩基 t, c, a, g それぞれの個数をカウントする'([_塩基|R],_t_1,_c_1,_a_1,_g_1) :- カウントする(_塩基,_t_1,_c_1,_a_1,_g_1,_t_2,_c_2,_a_2,_g_2), '入力したDNA塩基ならび中にある塩基 t, c, a, g それぞれの個数をカウントする'(R,_t_2,_c_2,_a_2,_g_2). カウントする(t,_t,_c,_a,_g,_t_2,_c,_a,_g) :- _t_2 is _t + 1,!. カウントする(c,_t,_c,_a,_g,_t,_c_2,_a,_g) :- _c_2 is _c + 1,!. カウントする(a,_t,_c,_a,_g,_t,_c,_a_2,_g) :- _a_2 is _a + 1,!. カウントする(g,_t,_c,_a,_g,_t,_c,_a,_g_2) :- _g_2 is _g + 1,!. 塩基カウント出力(LL) :- append(_,[[_塩基記号,_個数]|R],LL), 塩基(_塩基名,_塩基記号), writef('%t (%t) : %t\n',[_塩基名,_塩基記号,_個数]), R = []. 塩基('Thymine',t). 塩基('Cytosine',c). 塩基('Adenine',a). 塩基('Guanine',g). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/610 # # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # program :- '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列,0,0,0,0). '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする' :- 入力したDNA塩基配列(_DNA配列), '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列,0,0,0,0). 入力したDNA塩基配列(_DNA配列) :- write('DNA塩基配列を入力してください : '), get_line(_DNA配列). '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'('',_t,_c,_a,_g) :- 塩基カウント出力([[t,_t],[c,_c],[a,_a],[g,_g]]),!. '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列,_t_1,_c_1,_a_1,_g_1) :- sub_atom(_DNA配列,0,1,R,_塩基), カウントする(_塩基,_t_1,_c_1,_a_1,_g_1,_t_2,_c_2,_a_2,_g_2), sub_atom(_DNA配列,1,R,0,_DNA半列_2), '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列_2,_t_2,_c_2,_a_2,_g_2). カウントする(t,_t,_c,_a,_g,_t_2,_c,_a,_g) :- _t_2 is _t + 1,!. カウントする(c,_t,_c,_a,_g,_t,_c_2,_a,_g) :- _c_2 is _c + 1,!. カウントする(a,_t,_c,_a,_g,_t,_c,_a_2,_g) :- _a_2 is _a + 1,!. カウントする(g,_t,_c,_a,_g,_t,_c,_a,_g_2) :- _g_2 is _g + 1,!. 塩基カウント出力(LL) :- append(_,[[_塩基記号,_個数]|R],LL), 塩基(_塩基名,_塩基記号), writef('%t (%t) : %t\n',[_塩基名,_塩基記号,_個数]), R = []. 塩基('Thymine',t). 塩基('Cytosine',c). 塩基('Adenine',a). 塩基('Guanine',g). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/610 # # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # program :- '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'. '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする' :- 入力したDNA塩基配列(_DNA配列), forall(( 塩基(_塩基名,_塩基記号), count(sub_atom(_DNA配列,_,1,_,_塩基記号),_個数)), writef('%t (%t) : %t\n',[_塩基名,_塩基記号,_個数])). 入力したDNA塩基配列(_DNA配列) :- write('DNA塩基配列を入力してください : '), get_line(_DNA配列). 塩基('Thymine',t). 塩基('Cytosine',c). 塩基('Adenine',a). 塩基('Guanine',g). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/637 # # 1] 授業単元: プログラミング 演習(構造体) # [2] 問題文(含コード&リンク): 3冊の本の名前、ISBN、著者名を入力し一覧表示しなさい。 # ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。 # '3冊の本の名前、ISBN、著者名を入力し一覧表示しなさい。ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。' :- '3冊の本の名前、ISBN、著者名を入力し'(_3冊の本), 一覧表示しなさい(_3冊の本). '3冊の本の名前、ISBN、著者名を入力し'(_3冊の本) :- findall([_本の名前,_ISBN,_著者名],( between(1,3,_), 本の名前の入力(_本の名前), 'ISBNの入力'(_ISBN), 著者名の入力(_著者名)), _3冊の本). 本の名前の入力(_本の名前) :- write('本の名前を入力してください : '), get_line(_本の名前). 'ISBNの入力'(_本の名前) :- write('ISBNを入力してください : '), get_line(_ISBN). 著者名の入力(_著者名) :- write('著者名を入力してください : '), get_line(_著者名). 一覧表示しなさい([]). 一覧表示しなさい([[_本の名前,_ISBN,_著者名]|R]) :- writef('%20l %17l %12l',[_本の名前,_ISBN,_著者名]), 'ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。'(_ISBN), write('\n'), 一覧表示しなさい(R). 'ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。'(_ISBN文字列) :- atom_chars(_ISBN文字列,[_,_,_,-,_,-,_,_,_,_,_,-,_,_,_,-|_]),!. 'ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。'(_ISBN文字列) :- write(' %ISBN形式エラー '). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/586 # # [1] 授業単元: プログラミングC # [2] 問題文(含コード&リンク): # キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字を大文字にするプログラムを作成せよ。 # # 実行例 文字列入力 :AbCdEfG123 #     変換文字列 :aBcDeFg123 # 'キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字を大文字にする' :- write('文字列入力 : '), get_line(_文字列), '入力された文字列の英字については大文字を小文字に、小文字を大文字にする'(_文字列,_変換文字列), writef('変換文字列 : %t\n',[_変換文字列]). '入力された文字列の英字については大文字を小文字に、小文字を大文字にする'(_文字列,_変換文字列) :- atom_chars(_文字列,_文字ならび), '文字ならびの英字については大文字を小文字に、小文字を大文字にする'(_文字ならび,_変換されたもじれならび), atom_chars(_変換文字列,_変換された文字ならび). '文字ならびの英字については大文字を小文字に、小文字を大文字にする'([],[]) :- !. '文字ならびの英字については大文字を小文字に、小文字を大文字にする'([_文字_1|R1],[_文字_2|R2]) :- 文字を変換する(_文字_1,_文字_2), '文字ならびの英字については大文字を小文字に、小文字を大文字にする'(R1,R2). '文字ならびの英字については大文字を小文字に、小文字を大文字にする'([_|R1],R2) :- '文字ならびの英字については大文字を小文字に、小文字を大文字にする'(R1,R2). 文字を変換する(_文字,_変換された文字) :- _文字 @>= 'A', _文字 @=< 'Z', nth1(_nth1,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_文字), nth1(_nth1,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_変換された文字),!. 文字を変換する(_文字,_変換された文字) :- _文字 @>= 'a', _文字 @=< 'z', nth1(_nth1,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字), nth1(_nth1,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_変換された文字),!. % 以下のサイトは # http://toro.2ch.net/test/read.cgi/tech/1357748713/477 # [1] 授業単元:c++ # [2] 問題文(含コード&リンク):不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、ローマ字名を入力してデータファイル内の情報を検索するプログラムを作成してください。 # 検索の結果として、該当者が居る場合画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。また、該当者が居ない場合はその旨を表示するようにしてください。 # [3] 環境 #  [3.1] OS: windows7 #  [3.2] コンパイラ名とバージョン: Borland C++ 5.5.1 #  [3.3] 言語:C++ # [4] 期限: 2013/2/1 # [5] その他の制限: 入出力の方法、変数、四則演算、分岐、繰り返し、関数、文字の出入力、文字列、構造体、ファイル処理の範囲内でお願い致します。 '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力してデータファイル内の情報を検索するプログラムを作成してください。 検索の結果として、該当者が居る場合画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示するようにしてください。' :- '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_検索結果,_ローマ字名,_漢字名,_番号,_得点), '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(_検索結果,_ローマ字名,_漢字名,_番号,_得点). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_検索結果,_入力されたローマ字名,_漢字名,_番号,_得点) :- ローマ字名を入力して(_入力されたローマ字名), '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_入力されたローマ字名,_検索結果,_漢字名,_番号,_得点). ローマ字名を入力して(_ローマ字名) :- write('検索するローマ字名を入力してください : '), get_line(_ローマ字名). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_入力されたローマ字名,該当者が居る,_漢字名,_番号,_得点) :- get_split_lines('seiseki.txt',[' ',','],LL), member([_入力されたローマ字名,_漢字名,_番号,_得点],LL). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_,該当者が居ない,_,_,_). '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(該当者が居る,_ローマ字名,_漢字名,_番号,_得点) :- '画面にその情報(ローマ字名、漢字名、番号、得点)を表示し'(_ローマ字名,_漢字名,_番号,_得点), 'なおかつその情報が記載された新しいファイル(kekka.txt)が生成される'(_ローマ字名,_漢字名,_番号,_得点). '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(該当者が居ない,_,_,_,_) :- write('該当者はいません\n'). '画面にその情報(ローマ字名、漢字名、番号、得点)を表示し'(_ローマ字名,_漢字名,_番号,_得点) :- writef('%t %t %t %t\n',[_ローマ字名,_漢字名,_番号,_得点]). 'なおかつその情報が記載された新しいファイル(kekka.txt)が生成される'(_ローマ字名,_漢字名,_番号,_得点) :- '新しいファイル(kekka.txt)が生成される'(Outstream), writef(Outstream,'%t %t %t %t\n',[_ローマ字名,_漢字名,_番号,_得点]), close(Outstream). '新しいファイル(kekka.txt)が生成される'(Outstream) :- open('kekka.txt',write,Outstream). % 以下のサイトは 加算器型相加平均(_累計,_相加平均) :- 加算器型相加平均([],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/1357748713/186 # # [1] 授業単元: プログラミングB # [2] 問題文(含コード&リンク):入力された文字列を2進数の文字列として #               解釈し、10進数に変換し画面出力しなさい。 #               入力にはライブラリ関数putcharを使用すること。 #               Enterキーのみが押された場合、エラーを表示し、再入力する。 #               0,1以外の文字が入力された場合、エラーを表示し、再入力する。   # # [3] 環境 #  [3.1] OS:Windows7 #  [3.2] コンパイラ名とバージョン: Borland C++ 5.5.1 #  [3.3] 言語:C言語 # [4] 期限: 2013/01/23 '入力された文字列を2進数の文字列として解釈し、10進数に変換し画面出力しなさい。 入力にはライブラリ関数putcharを使用すること。 Enterキーのみが押された場合、エラーを表示し、再入力する。 0,1以外の文字が入力された場合、エラーを表示し、再入力する。' :- '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)' (_入力された文字列), '2進数の文字列として解釈し、10進数に変換し'(_入力された文字列,_10進数), 画面に出力する(_入力された文字列,_10進数). '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)'(_入力された文字列) :- write('2進数文字列を入力してください : '), get_line(_入力された文字列), '診断 :: 入力された文字列を'(_入力された文字列),!. '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)'(_入力された文字列) :- '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)'(_入力された文字列). '診断 :: 入力された文字列を'('') :- 'Enterキーのみが押された場合、エラーを表示し、再入力する。',!,fail. '診断 :: 入力された文字列を'(_入力された文字列) :- '0,1以外の文字が入力された場合、エラーを表示し、再入力する。'(_入力された文字列), !,fail. '診断 :: 入力された文字列を'(_). 'Enterキーのみが押された場合、エラーを表示し、再入力する。' :- write('エラー :: 文字列が入力されていません\n'). '0,1以外の文字が入力された場合、エラーを表示し、再入力する。'(_入力された文字列) :- sub_atom(_入力された文字列,_,1,_,_文字), \+(_文字 = '0'), \+(_文字 = '1'), write('エラー :: 0,1以外の文字が入力されました\n'), !,fail. '2進数の文字列として解釈し、10進数に変換し'(_入力された文字列,_10進数) :- atomic_list_concat(['0b',_入力された文字列],_2進数を表す文字列), atom_number(_2進数を表す文字列,_10進数). 画面に出力する(_入力された文字列,_10進数) :- writef('入力された文字列: %t 変換された10進数: %t\n',[_入力された文字列,_10進数]). % 以下のサイトは yes. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/158 # # [1] 授業単元: プログラミング 〜構造体〜 # [2] 問題文(含コード&リンク): 3名の名前と性別、10桁の会員番号を入力し表示せよ # *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ # 入力(1234567890)→出力(12-3456-7890) # *入力された会員番号が10桁に満たない場合、 # または大きい場合は再度入力する指示を入れること # '3名の名前と性別、10桁の会員番号を入力し表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890) *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること' :- '3名の名前と性別、10桁の会員番号を入力し *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_3名の名前と性別と会員番号), '表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890)'(_3名の名前と性別と会員番号). '3名の名前と性別、10桁の会員番号を入力し *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_3名の名前と性別と会員番号) :- findall([_名前,_性別,_会員番号],( between(1,3,_), 名前を得る(_名前), 性別を得る(_性別), '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号)), _3名の名前と性別と会員番号). 名前を得る(_名前) :- write('名前を入力してください : '), get_line(_名前). 性別を得る(_性別) :- 整数を得る('性別を番号で入力してください 1..男 2..女\n',between(1,2,_性別番号),_性別番号), 性別番号から性別を得る(_性別番号,_性別). 性別番号から性別を得る(1,男). 性別番号から性別を得る(2,女). '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号) :- write('会員番号(数字10桁)を入力してください : '), get_line(Line), '診断:: 会員番号を得る'(Line,_会員番号),!. '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号) :- '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号). '診断:: 会員番号を得る'(Line,_会員番号) :- atom_chars(Line,Chars), 会員番号は数字のみで入力し(Chars), '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars),!. '診断:: 会員番号を得る'(Line,_会員番号) :- write('再入力をお願いします\n'), fail. 会員番号は数字のみで入力し(Chars) :- forall((member(A,Chars), member(A,['0','1','2','3','4','5','6','7','8','9'])),true),!. 会員番号は数字のみで入力し(Chars) :- writef('入力された文字列 %t には数字以外の文字が混入しています\n',[Chars]), fail. '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars) :- length(Chars,10),!. '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars) :- writef('入力された文字列 %t は10桁でありません\n',[Chars]), fail. '表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890)'(_3名の名前と性別と会員番号) :- append(_,[[_名前,_性別,_会員番号]|R],_3名の名前と性別と会員番号), number_chars(_会員番号,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), atomic_list_concat([[_1,_2,-,_3,_4,_5,_6,-,_7,_8,_9,_10],_会員表示文字列), writef('名前: %t\n性別: %t\n会員番号: %t\n\n',[_会員番号表示文字列]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元: リスト処理 # [2] 問題文(含コード&) http://codepad.org/3DdhcBUM # # /* # # seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 # また、整列する際に要素どうしを比較した回数も表示しなさい。 # # 【実行例】 # # 番号 氏名      得点 # 1021 Machida Masato 100 # 1017 Nonaka Fujio 98 # 1011 Suzuki kenichi 93 # 1019 Fujimoto Kaoru 92 # 1006 kato Ichiro 91 # ・ ・     ・ # ・ ・     ・ # ・ ・     ・ # 1020 Hoshi Izumi 32 # 整列の為の比較回数=132回 # # ※長いので実行結果は途中省略しています。 # ※比較回数はコードによって異なる場合があります。 # # */ 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 また、整列する際に要素どうしを比較した回数も表示しなさい。' :- 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび), リスト処理による挿入法で得点の降順に整列して(_生徒ならび,[],_整列済み生徒ならび,0,_比較回数), 表示しなさい(_整列済み生徒ならび,_比較回数). 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび) :- get_split_lines('seito.dat',[' '],_生徒ならび). リスト処理による挿入法で得点の降順に整列して([[_学籍番号,_姓,_名,_得点]|R1],L1,_整列済み生徒ならび,_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,L1,L2,_比較回数_1,_比較回数_2), リスト処理による挿入法で得点の降順に整列して(R1,L2,_整列済み生徒ならび,_比較回数_2,_比較回数),!. リスト処理による挿入法で得点の降順に整列して([],_整列済み生徒ならび,_整列済み生徒ならび,_比較回数,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],[[_学籍番号,_名,_名,_得点],[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],_比較回数_1,_比較回数) :- 比較回数 is _比較回数_1 + 1, _得点 >= _得点_1,!. 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R1],[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R2],_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,R1,R2,_比較回数_1,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[],[[_学籍番号,_名,_名,_得点]],_比較回数,_比較回数) :- !. 表示しなさい(_整列済み生徒ならび,_比較回数) :- 見出しの表示, append(_,[[_学籍番号,_姓,_名,_得点]|R],_整列済み生徒ならび), 整形して表示する(_学籍番号,_姓,_名,_得点), R = [], writef('整列の為の比較回数=%t回\n',[_比較回数]). 見出しの表示 :- write('番号 氏名      得点\n'). 整形して表示する(_学籍番号,_姓,_名,_得点) :- 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列), 得点を頭部空白3桁に(_得点,_得点文字列), atomic_list_concat([_学籍番号,_姓文字列,_名文字列,_得点文字列],' ',_表示文字列), writef('%t\n',[_表示文字列]). 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列) :- '8桁に'(_姓,_姓文字列), '8桁に'(_名,_名文字列). '8桁に'(_項,_8桁文字列) :- atom_chars(_項,Chars_1), length(L,8), append(L1,L2,L), all(L2,' '), atom_chars(_8桁文字列,L). 得点を頭部空白3桁に(_得点,_得点文字列) :- number_chars(_得点,Chars), length(L,3), append(L0,Chars,L), all(L0,' '), atom_chars(_得点文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,( member(A,Lines1), split(A,Sep,Line)), Lines). get_lines(Instream,end_of_file,_,_,[]) :-!. get_lines(Instream,S,[],_終了検索対象ならび,[S]) :- member(A,_終了検索対象ならび), 検索(S,A),!. get_lines(Instream,S,[],[],[S|R]) :- get_line(Instream,S2), get_lines(Instream,S2,[],[],R),!. get_lines(Instream,S,[],_終了検索対象ならび,[S|R]) :- member(A,_終了検索対象ならび), \+(検索(S,A)), get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), member(B,_終了検索対象ならび), 検索(S,B),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S|R]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), !, get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,_,_開始検索対象ならび,_終了検索対象ならび,X) :- get_line(Instream,S2), get_lines(Instream,S2,_開始検索対象ならび,_終了検索対象ならび,X),!. get_lines(_ファイル,_スタート行,_最終行,X) :- integer(_スタート行), integer(_最終行), 行位置指定選択(_ファイル,_スタート行,_最終行,X). get_lines(_ファイル,_開始検索対象ならび,_終了検索対象ならび,X) :- \+(integer(_開始検索対象ならび)), \+(integer(_終了検索対象ならび)), open(_ファイル,read,Instream), get_line(Instream,S), get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,X), close(Instream),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat, get_line(user_input,Line), (Line = end_of_file , (!) , fail ; true)), Lines). get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_chars(Instream,end_of_file,[]) :- !. get_chars(Instream,_,[]) :- at_end_of_stream(Instream),!. get_chars(Instream,X,[X|R]) :- get_char(Instream,Y), get_chars(Instream,Y,R) . get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists_file(File_1), open(File_1,read,Instream), get_char(Instream,X), get_chars(Instream,X,L), close(Instream),!. get_chars(Instream,L) :- is_stream(_,Instream,_), get_char(Instream,X), get_chars(Instream,X,L),!. get_chars(L) :- findall(U,( repeat, get_char(U), (U = end_of_file , (!) , fail ; true)), L). get_line(X) :- get_line(user_input,X). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,_,[]) :- at_end_of_stream(Instream),!. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), atomic_list_concat(U,A), chars_lines(R,R2). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y) , \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), C number Nl,!. split_5(B,C) :- atomic_list_concat(B,C),!. all([],_). all([V|R],V) :- all(R,V). 検索(_文字列,_副文字列) :- atom_length(_文字列,_文字列の文字数), atom_length(_副文字列,_副文字列の文字数), Max is _文字列の文字数 - _副文字列の文字数, between(0,Max,N), sub_atom(_文字列,N,_副文字列の文字数,_副文字列),!. 行位置指定選択(_ファイル,_選択先頭行,_選択最終行,X) :- wc(_ファイル,[[_行,_,_,_]]), _行数_1 is _行 - _選択先頭行 + 1, _行数_2 is _選択最終行 - _選択先頭行, atomic_list_concat(['tail -',_行数_1,' ',_ファイル,' | head -',_行数_2],S), shs(S,X). wc(F,X) :- exists_file(F1), atomic_list_concat(['wc ',F1],S), sh(S,X),!. wc(F,X) :- atomic_list_concat([F,' | wc'],S), sh(S,X),!. sh(Command,X) :- shs(Command,Y), findall(U,(member(V,Y) , make_list(V,[' ',','],U)),X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,_,[]) :- at_end_of_stream(Instream),!. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元:リスト構造 # [2] 問題文(含コード&amp;リンク): # http://ime.nu/iup.2ch-library.com/i/i0825590-1357830189.gif # # 以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作 成せよ. # リストは1つとし,初期値は「15 4 32 1」である. # ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. # ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. # ・データのソート(降順)を行う関数を作成する. # ・リストの平均値を計算し出力する関数を作成する。 # # ------表示例------ # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : # ------------------ # # ------実行例------- # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 1 # 追加するデータを入力してください : 10 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 4 # リストの平均値 : 12.4 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 3 # リスト : 32 15 10 4 1 # :- dynamic(リスト/1). '以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作成せよ. リストは1つとし,初期値は「15 4 32 1」である. ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. ・データのソート(降順)を行う関数を作成する. ・リストの平均値を計算し出力する関数を作成する。 ------表示例------ 1. データの追加 2. データの削除 3. データのソート(降順) 4. リストの平均値 5. 終了 何を実行しますか : ' :- 'リストは1つとし,初期値は「15 4 32 1」である', メニューを表示, 各項目の機能を実現して結果を表示する. 'リストは1つとし,初期値は「15 4 32 1」である' :- assertz(リスト([15,4,32,1])). メニューを表示 :- write('1. データの追加\n2. データの削除\n3. データのソート(降順)\n4. リストの平均値\n5. 終了\n何を実行しますか : '). メニューを表示 :- メニューを表示. 各項目の機能を実現して結果を表示する :- 機能番号を選択する(_機能番号), 機能を実現して結果を表示する(_機能番号), _機能番号 = 5,!. 機能番号を選択する(_機能番号) :- get_line(Line), '診断:: メニューの選択'(Line,_機能番号),!. 機能番号を選択する(_機能番号) :- 機能番号を選択する(_機能番号). '診断:: メニューの選択'(Line,_機能番号) :- atom_number(Line,_機能番号), integer(_機能番号), between(1,5,_機能番号),!. '診断:: メニューの選択'(Line,_機能番号) :- writef('選択された %t からは適切な機能番号が得られません。再入力をお願いします。\n',[Line]), fail. 機能を実現して結果を表示する(5) :- !. 機能を実現して結果を表示する(1) :- データの追加. 機能を実現して結果を表示する(2) :- データの削除. 機能を実現して結果を表示する(3) :- 'データのソート(降順)'. 機能を実現して結果を表示する(4) :- リストの平均値. データの追加 :- write('追加するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), append(L1,[_データ],L2), assertz(リスト(L2)). データの削除 :- write('削除するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), ならびから削除(_データ,L1,L2), assertz(リスト(L2)). 'データのソート(降順)' :- リスト(L1), 降順整列(L1,L2), atomic_list_concat(L2,' ',S), writef('リスト : %t\n',[S]). リストの平均値 :- リスト(L1), findavg(_データ,( member(_データ,L1)), _平均値), atomic_list_concat(L1,_リスト表示), writef('平均値 : %t\nリスト : %t\n',[_平均値,_リスト表示]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,_,[e,n,d,'_',o,f,'_',f,i,l,e]) :- at_end_of_stream(Stream),!. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. 降順整列([],[]). 降順整列([_軸要素|R1],_降順に整列されたならび) :- 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび), 降順整列(_軸要素に等しいか大きいならび,_整列した軸要素に等しいか大きいならび), 降順整列(_軸要素より小さいならび,_整列した軸要素より小さいならび), append(_整列した軸要素に等しいか大きいならび,[_軸要素|_整列した軸要素より小さいならび],_降順に整列したならび). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R],[_要素|_軸要素に等しいか大きいならび],_軸要素より小さいならび) :- _要素 @>= _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). 降順分割(_軸要素,[_要素|R],_軸要素に等しいか大きいならび,[_要素|_軸要素より小さいならび]) :- _要素 @< _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). findavg(_集約項,_項,_相加平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _相加平均 is _合計値 / _ならびの長さ,!. sum([],0). sum([N|R],S) :- sum(R,S_1), S is N + S_1. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 161代目 #983 # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ.' :- '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントする'. '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントする' :- 入力したDNA塩基配列中にある(_DNA塩基ならび), '塩基 t, c, a, gそれぞれの個数をカウントする'(_DNA塩基ならび,0,0,0,0,_t,_c,_a,_g), writef('Thymine (t) : %w\nCytoshine (c) : %w\nAdenine (a) : %w\nGuanime (g) : %w\n',[_t,_c,_a,_g]). 入力したDNA塩基配列中にある(_DNA塩基ならび) :- 行入力(_行), atom_chars(_行,_DNA塩基ならび). '塩基 t, c, a, gそれぞれの個数をカウントする'([],_t,_c,_a,_g,_t,_c,_a,_g). '塩基 t, c, a, gそれぞれの個数をカウントする'([_塩基|R],_t_1,_c_1,_a_1,_g_1,_t,_c,_a,_g) :- 塩基の集計欄に加算(_塩基,_t_1,_c_1,_a_1,_g_1,_t_2,_c_2,_a_2,_g_2), '塩基 t, c, a, gそれぞれの個数をカウントする'(R,_t_2,_c_2,_a_2,_g_2,_t,_c,_a,_g). 塩基の集計欄に加算(t,_t_1,_c,_a,_g,_t,_c,_a,_g) :- succ(_t_1,_t). 塩基の集計欄に加算(c,_t,_c_1,_a,_g,_t,_c,_a,_g) :- succ(_c_1,_c). 塩基の集計欄に加算(a,_t,_c,_a_1,_g,_t,_c,_a,_g) :- succ(_a_1,_a). 塩基の集計欄に加算(g,_t,_c,_a,_g_1,_t,_c,_a,_g) :- succ(_g_1,_g). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/983 # # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ.' :- '入力したDNA塩基配列中にある'(_DNA塩基ならび), '塩基 t, c, a, gそれぞれの個数をカウントする'(_DNA塩基ならび,_t,_c,_a,_g), writef('Thymine (t) : %t\nCytoshine (c) : %t\nAdenine (a) : %t\nGuanime (g) : %t\n',[_t,_c,_a,_g]). '入力したDNA塩基配列中にある'(_DNA塩基ならび) :- get_line(Line), atom_chars(Line,_DNA塩基ならび). '塩基 t, c, a, gそれぞれの個数をカウントする'([],0,0,0,0). '塩基 t, c, a, gそれぞれの個数をカウントする'([_塩基|R],_t,_c,_a,_g) :- '塩基 t, c, a, gそれぞれの個数をカウントする'(R,_t_1,_c_1,_a_1,_g_1), 塩基個数を加算(_塩基,_t_1,_c_1,_a_1,_g_1,_t,_c,_a,_g). 塩基個数を加算(t,_t_1,_c,_a,_g,_t,_c,_a,_g) :- _t is _t_1 + 1. 塩基個数を加算(c,_t,_c_1,_a,_g,_t,_c,_a,_g) :- _c is _c_1 + 1. 塩基個数を加算(a,_t,_c,_a_1,_g,_t,_c,_a,_g) :- _a is _a_1 + 1. 塩基個数を加算(g,_t,_c,_a,_g_1,_t,_c,_a,_g) :- _g is _g_1 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/859 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/kie.nu/Hag # ファイルの内容を行番号付きで出力するプログラムを作成せよ # ファイルの内容を行番号付きで出力するプログラムを作成せよ(_ファイル名) :- get_lines(_ファイル名,Lines), append(L0,[_行|R],Lines), length([_|L0],_行番号), writef('%t %t\n',[_行番号,_行]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/717 # # [1] 授業単元: C演習 # [2] 問題文(含コード&リンク): # (問題文)http://imgur.com/bAeG1 # (途中まで書いたコード)://codepad.org/nwwt2hgU # (使用するテキストファイル、結果含む) # http://s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/joyful.cgi? のNo.396 # :- dynamic(転置索引/2). テキストのダウンロード(_サイトファイル名,_出力ファイル名) :- atomic_list_concat(['w3m -dump ',_サイトのファイル名],S), popen(S,Chars), open(_出力ファイル名,write,Outstream), ファイルに書き込む(Outstream,Chars), close(Outstream). ファイルに書き込む(Outstream,[]). ファイルに書き込む(Outstream,[C|R]) :- put_char(Outstream,C), ファイルに書き込む(Outstream,R). 転置索引を作る(_ファイル名) :- open(_ファイル名,read,Instream), ストリームから転置索引を作る(Instream,0), close(Instream). ストリームから転置索引を作る(Instream,_) :- at_end_of_stream(Instream),!. ストリームから転置索引を作る(Instream,N) :- get_line(Instream,Line), N_2 is N + 1, 語彙を転置索引に登録する(Line,N), ストリームから転置索引を作る(Instream,N_2). 語彙を転置索引に登録する(Line,N) :- split(Line,[' ',',','.',':','(',')'],L), member(_語彙,L), \+(転置索引(_語彙,N)), assertz(転置索引(_語彙,N)), fail. 語彙を転置索引に登録する(_,_). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/682 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 以下の手順に従ってプログラムを作成せよ。 # 適宜printfを利用して、入力支援(「文字列を入力してください」等の画面表示)を行うこと。 # 1.文字配列name[5][64]を作成 # 2.キーボードから5人分の名前を入力し、name配列に格納 # 3.キーボードから名前を入力し、name配列の何番目に格納されているかを検索して表示 # (見つからなかった場合は「見つかりません」と表示) # 4.「quit」が入力されるまで3の処理を繰り返す # '以下の手順に従ってプログラムを作成せよ。 適宜printfを利用して、入力支援(「文字列を入力してください」等の画面表示)を行うこと。 1.文字配列名前[5][64]を作成 2.キーボードから5人分の名前を入力し、名前配列に格納 3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す' :- '1.文字配列名前[5][64]を作成'(_名前配列), '2.キーボードから5人分の名前を入力し、名前配列に格納'(_名前配列), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前). '1.文字配列名前[5][64]を作成'(LL) :- length(_名前配列,5), findall(L,( member(L,_名前配列), length(L,64)), _名前配列). '2.キーボードから5人分の名前を入力し、名前配列に格納'(_名前配列) :- findall(L,( member(L,_名前配列), 名前を入力し(_名前), 名前配列に格納(_名前,L)), _名前配列). 名前を入力し(_名前) :- write('名前を入力してください : '), get_line(_名前). 名前配列に格納(_名前,L) :- atom_chars(_名前,Chars), append(Chars,R,L), all(R,' '). '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前) :- 'キーボードから名前を入力し'(_名前), '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前). 'キーボードから名前を入力し'(_名前) :- write('検索する名前を入力してください : '), get_line(_名前). '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '4.「quit」が入力されるまで3の処理を繰り返す'(_名前),!. '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '名前配列の何番目に格納されているかを検索して'(_名前,_名前配列,_nth1), writef('%t番目 %t\n',[_nth,_名前]),!, fail. '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '見つからなかった場合は「見つかりません」と表示', fail. '見つからなかった場合は「見つかりません」と表示' :- write('見つかりません\n'). '名前配列の何番目に格納されているかを検索して'(_名前,_名前配列,_nth1) :- atom_chars(_名前,Chars), nth1(_nth1,_名前配列,L), append(Chars,R,L), all(R,' '). '4.「quit」が入力されるまで3の処理を繰り返す'(quit). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/648 # # [1] 授業単元:Cプログラミング # [2] 問題文(含コード&リンク): # 下記のアップロードされたファイル(数字の羅列)を読み込み、並び替え方法(昇順/降順)で指定されたファイル(out.txt) # へ出力するプログラムを作成せよ # http://ime.nu/www1.axfc.net/uploader/He/so/280605 # 以下実行結果 # # 並び替え方法をしていしてください(1:昇順、2:降順) # 1 # # 並び替えたファイルへ出力しました。 # # cat out.txt ←catコマンドで中身確認 # 1 # 3 # 3 # 3 # 'アップロードされたファイル(数字の羅列)を読み込み、並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_アップロードされたファイル名) :- 'アップロードされたファイル(数字の羅列)を読み込み'(_アップロードされたファイル名,_行ならび), '並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_行ならび). 'アップロードされたファイル(数字の羅列)を読み込み'(_行ならび) :- get_lines('input.txt',_行ならび). '並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_行ならび) :- '並び替え方法を指定してください(1:昇順、2:降順)'(_並び替え方法), 並び替え(_並び替え方法,_行ならび,_並び替えた行ならび), '指定されたファイル(out.txt)へ出力する'(_並び替えた行ならび). '並び替え方法を指定してください(1:昇順、2:降順)'(_並び替え方法) :- write('並び替え方法を指定してください(1:昇順、2:降順)'), 整数を得る('並び替え方法を指定してください(1:昇順、2:降順)',between(1,2,N),N), 並び替え方法(N,_並び替え方法). 並び替え方法(1,昇順). 並び替え方法(2,降順). 並び替え(昇順,_行ならび,_並び替えた行ならび) :- 整列(_行ならび,_並び替えた行ならび). 並び替え(降順,_行ならび,_並び替えた行ならび) :- 整列(_行ならび,_並び替えた昇順行ならび), reverse(_並び替えた昇順行ならび,_並び替えた行ならび). '指定されたファイル(out.txt)へ出力する'(_並び替えた行ならび) :- put_lines('out.txt',_並び替えた行ならび). put_lines(_ファイル名,_行ならび) :- open(_ファイル名,write,Outstream), forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/496 # # [1] C言語プログラミング2 # [2] 問題1・入力した文字列から文字を一文字ずつ交互に読み取り、文字列1、文字列2として結果を出力するプログラムを作成せよ。 # 問題2・また、文字列1、文字列2を入力し、それぞれから一文字ずつ交互に読み取った結果を文字列として出力するプログラムを作成せよ。 # 条件1・500文字前後の文字列を扱えるようにせよ。 # 条件2・問題1の文字列が奇数の場合は文字列1の側に奇数で余った一文字を入れること。(問題2の文字列1が一文字多い場合読み取りを忘れないように) # 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。 # 問題1・例 # 文字列・abcdefghijklm # ↓ # 文字列1・acegikm # 文字列2・bdfhjl # # 問題2・例 # 文字列1・acegikm # 文字列2・bdfhjl # ↓ # 文字列・abcdefghijklm # 'また、文字列1、文字列2を入力し、それぞれから一文字ずつ交互に読み取った結果を文字列として出力するプログラムを作成せよ。 条件1・500文字前後の文字列を扱えるようにせよ。 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。 問題2・例 文字列1・acegikm 文字列2・bdfhjl ↓ 文字列・abcdefghijklm' :- '文字列1、文字列2を入力し 条件1・500文字前後の文字列を扱えるようにせよ。 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。'(_文字列1,_文字列2), それぞれから一文字ずつ交互に読み取った結果を(_文字列1,_文字列2,_読み取った結果ならび), 文字列として出力する(_読み取った結果ならび). '文字列1、文字列2を入力し 条件1・500文字前後の文字列を扱えるようにせよ。 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。'(_文字列1,_文字列2) :- write('文字列1(半角英数記号のみからなる)を入力してください : '), get_line(_文字列1), write('文字列2(半角英数記号のみからなる)を入力してください : '), get_line(_文字列2). それぞれから一文字ずつ交互に読み取った結果を('','',[]) :- !. それぞれから一文字ずつ交互に読み取った結果を('',_文字列2,L) :- それぞれから一文字ずつ交互に読み取った結果を(_文字列2,'',L). それぞれから一文字ずつ交互に読み取った結果を(_文字列1,_文字列2,[_文字|R]) :- 一文字ずつ読み取った(_文字列1,_文字,_文字列3), それぞれから一文字ずつ交互に読み取った結果を(_文字列2,_文字列3,R). 一文字ずつ読み取った(_文字列1,_文字,_文字列3) :- sub_atom(_文字列1,S_1,1,R_1,_文字), S_2 is S_1 + 1, sub_atom(_文字列1,S_2,R_1,0,_文字列3),!. 文字列として出力する(_読み取った結果ならび) :- atomic_list_concat(_読み取った結果ならび,_読み取った結果文字列), writef('%t\n',[_読み取った結果文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/496 # # [1] C言語プログラミング2 # [2] 問題1・入力した文字列から文字を一文字ずつ交互に読み取り、文字列1、文字列2として結果を出力するプログラムを作成せよ。 # 問題2・また、文字列1、文字列2を入力し、それぞれから一文字ずつ交互に読み取った結果を文字列として出力するプログラムを作成せよ。 # 条件1・500文字前後の文字列を扱えるようにせよ。 # 条件2・問題1の文字列が奇数の場合は文字列1の側に奇数で余った一文字を入れること。(問題2の文字列1が一文字多い場合読み取りを忘れないように) # 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。 # 問題1・例 # 文字列・abcdefghijklm # ↓ # 文字列1・acegikm # 文字列2・bdfhjl # # 問題2・例 # 文字列1・acegikm # 文字列2・bdfhjl # ↓ # 文字列・abcdefghijklm # '入力した文字列から文字を一文字ずつ交互に読み取り、文字列1、文字列2として結果を出力するプログラムを作成せよ。 条件1・500文字前後の文字列を扱えるようにせよ。 条件2・問題1の文字列が奇数の場合は文字列1の側に奇数で余った一文字を入れること。(問題2の文字列1が一文字多い場合読み取りを忘れないように) 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。 問題1・例 文字列・abcdefghijklm ↓ 文字列1・acegikm 文字列2・bdfhjl' :- '入力した文字列から'(_入力した文字列), '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'(_入力した文字列,_文字列1,_文字列2), 結果を出力する(_入力した文字列,_文字列1,_文字列_2). 入力した文字列から(_入力した文字列) :- write('文字列を入力してください : '), get_line(_入力した文字列). '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'('','',''). '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'(_文字列,_文字列1,_文字列2) :- sub_atom(_文字列,0,1,R,_文字), sub_atom(_文字列,1,R,0,_文字列3), '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'(_文字列3,_文字列2,_文字列4), atom_concat(_文字,_文字列4,_文字列1). get_line(_文字列) :- read_line_to_codes(user_input,Codes), atom_codes(_文字列,Codes). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/439 # # [1] プログラム演習 # [2] 入力した文字列をASCIIコードに応じた2進数に変換するプログラムを作成せよ。 # (注釈:百文字程度の変換を行えるようにすること) # 例:abc→011000010110001001100011 # また、2進数から文字列に戻す変換を行うプログラムも作成せよ。 # 例:011000010110001001100011→abc # '入力した文字列をASCIIコードに応じた2進数に変換する' :- 入力した文字列を(_入力したASCIIコードならび), 'ASCIIコードならび2進数ビットならび変換'(_入力したASCIIコードならび,_2進数ビットならび), atomic_list_concat(_2進数ビットならび,_2進数列), writef('%t\n',[_2進数列]). '2進数から文字列に戻す変換'(_2進数ビットならび,_ASCIIコードならび) :- 入力した2進数列(_入力した2進数列), 入力したASCIIコードを2進数ビットならびに変換(_入力したASCIIコードならび,_2進数ビットならび), 'ASCIIコードならび2進数ビットならび変換'(_ASCIIコードならび,_2進数ビットならび), atom_codes(_ASCII文字列,_ASCIIコードならび), writef('%t\n',[_ASCII文字列]). 入力した文字列を(_入力したASCIIコードならび) :- read_line_to_codes(user_input,_入力したASCIIコードならび). 入力した2進数列(_入力した2進数列) :- read_line_to_codes(user_input,_入力した2進数列). 'ASCIIコードならび2進数ビットならび変換'([],[]). 'ASCIIコードならび2進数ビットならび変換'([_文字コード|R1],[_b1,_b2,_b3,_b4,_b5,_b6,_b7,_b8|R2]) :- 'ASCIIコード2進数表'(_ASCIIコード,[_b1,_b2,_b3,_b4,_b5,_b6,_b7,_b8]), 'ASCIIコードならび2進数ビットならび変換'(R1,R2). 'ASCIIコード2進数'(0,[0,0,0,0,0,0,0,0]). 'ASCIIコード2進数'(1,[0,0,0,0,0,0,0,1]). 'ASCIIコード2進数'(2,[0,0,0,0,0,0,1,0]). 'ASCIIコード2進数'(3,[0,0,0,0,0,0,1,1]). 'ASCIIコード2進数'(4,[0,0,0,0,0,1,0,0]). 'ASCIIコード2進数'(5,[0,0,0,0,0,1,0,1]). 'ASCIIコード2進数'(6,[0,0,0,0,0,1,1,0]). 'ASCIIコード2進数'(7,[0,0,0,0,0,1,1,1]). 'ASCIIコード2進数'(8,[0,0,0,0,1,0,0,0]). 'ASCIIコード2進数'(9,[0,0,0,0,1,0,0,1]). 'ASCIIコード2進数'(10,[0,0,0,0,1,0,1,0]). 'ASCIIコード2進数'(11,[0,0,0,0,1,0,1,1]). 'ASCIIコード2進数'(12,[0,0,0,0,1,1,0,0]). 'ASCIIコード2進数'(13,[0,0,0,0,1,1,0,1]). 'ASCIIコード2進数'(14,[0,0,0,0,1,1,1,0]). 'ASCIIコード2進数'(15,[0,0,0,0,1,1,1,1]). 'ASCIIコード2進数'(16,[0,0,0,1,0,0,0,0]). 'ASCIIコード2進数'(17,[0,0,0,1,0,0,0,1]). 'ASCIIコード2進数'(18,[0,0,0,1,0,0,1,0]). 'ASCIIコード2進数'(19,[0,0,0,1,0,0,1,1]). 'ASCIIコード2進数'(20,[0,0,0,1,0,1,0,0]). 'ASCIIコード2進数'(21,[0,0,0,1,0,1,0,1]). 'ASCIIコード2進数'(22,[0,0,0,1,0,1,1,0]). 'ASCIIコード2進数'(23,[0,0,0,1,0,1,1,1]). 'ASCIIコード2進数'(24,[0,0,0,1,1,0,0,0]). 'ASCIIコード2進数'(25,[0,0,0,1,1,0,0,1]). 'ASCIIコード2進数'(26,[0,0,0,1,1,0,1,0]). 'ASCIIコード2進数'(27,[0,0,0,1,1,0,1,1]). 'ASCIIコード2進数'(28,[0,0,0,1,1,1,0,0]). 'ASCIIコード2進数'(29,[0,0,0,1,1,1,0,1]). 'ASCIIコード2進数'(30,[0,0,0,1,1,1,1,0]). 'ASCIIコード2進数'(31,[0,0,0,1,1,1,1,1]). 'ASCIIコード2進数'(32,[0,0,1,0,0,0,0,0]). 'ASCIIコード2進数'(33,[0,0,1,0,0,0,0,1]). 'ASCIIコード2進数'(34,[0,0,1,0,0,0,1,0]). 'ASCIIコード2進数'(35,[0,0,1,0,0,0,1,1]). 'ASCIIコード2進数'(36,[0,0,1,0,0,1,0,0]). 'ASCIIコード2進数'(37,[0,0,1,0,0,1,0,1]). 'ASCIIコード2進数'(38,[0,0,1,0,0,1,1,0]). 'ASCIIコード2進数'(39,[0,0,1,0,0,1,1,1]). 'ASCIIコード2進数'(40,[0,0,1,0,1,0,0,0]). 'ASCIIコード2進数'(41,[0,0,1,0,1,0,0,1]). 'ASCIIコード2進数'(42,[0,0,1,0,1,0,1,0]). 'ASCIIコード2進数'(43,[0,0,1,0,1,0,1,1]). 'ASCIIコード2進数'(44,[0,0,1,0,1,1,0,0]). 'ASCIIコード2進数'(45,[0,0,1,0,1,1,0,1]). 'ASCIIコード2進数'(46,[0,0,1,0,1,1,1,0]). 'ASCIIコード2進数'(47,[0,0,1,0,1,1,1,1]). 'ASCIIコード2進数'(48,[0,0,1,1,0,0,0,0]). 'ASCIIコード2進数'(49,[0,0,1,1,0,0,0,1]). 'ASCIIコード2進数'(50,[0,0,1,1,0,0,1,0]). 'ASCIIコード2進数'(51,[0,0,1,1,0,0,1,1]). 'ASCIIコード2進数'(52,[0,0,1,1,0,1,0,0]). 'ASCIIコード2進数'(53,[0,0,1,1,0,1,0,1]). 'ASCIIコード2進数'(54,[0,0,1,1,0,1,1,0]). 'ASCIIコード2進数'(55,[0,0,1,1,0,1,1,1]). 'ASCIIコード2進数'(56,[0,0,1,1,1,0,0,0]). 'ASCIIコード2進数'(57,[0,0,1,1,1,0,0,1]). 'ASCIIコード2進数'(58,[0,0,1,1,1,0,1,0]). 'ASCIIコード2進数'(59,[0,0,1,1,1,0,1,1]). 'ASCIIコード2進数'(60,[0,0,1,1,1,1,0,0]). 'ASCIIコード2進数'(61,[0,0,1,1,1,1,0,1]). 'ASCIIコード2進数'(62,[0,0,1,1,1,1,1,0]). 'ASCIIコード2進数'(63,[0,0,1,1,1,1,1,1]). 'ASCIIコード2進数'(64,[0,1,0,0,0,0,0,0]). 'ASCIIコード2進数'(65,[0,1,0,0,0,0,0,1]). 'ASCIIコード2進数'(66,[0,1,0,0,0,0,1,0]). 'ASCIIコード2進数'(67,[0,1,0,0,0,0,1,1]). 'ASCIIコード2進数'(68,[0,1,0,0,0,1,0,0]). 'ASCIIコード2進数'(69,[0,1,0,0,0,1,0,1]). 'ASCIIコード2進数'(70,[0,1,0,0,0,1,1,0]). 'ASCIIコード2進数'(71,[0,1,0,0,0,1,1,1]). 'ASCIIコード2進数'(72,[0,1,0,0,1,0,0,0]). 'ASCIIコード2進数'(73,[0,1,0,0,1,0,0,1]). 'ASCIIコード2進数'(74,[0,1,0,0,1,0,1,0]). 'ASCIIコード2進数'(75,[0,1,0,0,1,0,1,1]). 'ASCIIコード2進数'(76,[0,1,0,0,1,1,0,0]). 'ASCIIコード2進数'(77,[0,1,0,0,1,1,0,1]). 'ASCIIコード2進数'(78,[0,1,0,0,1,1,1,0]). 'ASCIIコード2進数'(79,[0,1,0,0,1,1,1,1]). 'ASCIIコード2進数'(80,[0,1,0,1,0,0,0,0]). 'ASCIIコード2進数'(81,[0,1,0,1,0,0,0,1]). 'ASCIIコード2進数'(82,[0,1,0,1,0,0,1,0]). 'ASCIIコード2進数'(83,[0,1,0,1,0,0,1,1]). 'ASCIIコード2進数'(84,[0,1,0,1,0,1,0,0]). 'ASCIIコード2進数'(85,[0,1,0,1,0,1,0,1]). 'ASCIIコード2進数'(86,[0,1,0,1,0,1,1,0]). 'ASCIIコード2進数'(87,[0,1,0,1,0,1,1,1]). 'ASCIIコード2進数'(88,[0,1,0,1,1,0,0,0]). 'ASCIIコード2進数'(89,[0,1,0,1,1,0,0,1]). 'ASCIIコード2進数'(90,[0,1,0,1,1,0,1,0]). 'ASCIIコード2進数'(91,[0,1,0,1,1,0,1,1]). 'ASCIIコード2進数'(92,[0,1,0,1,1,1,0,0]). 'ASCIIコード2進数'(93,[0,1,0,1,1,1,0,1]). 'ASCIIコード2進数'(94,[0,1,0,1,1,1,1,0]). 'ASCIIコード2進数'(95,[0,1,0,1,1,1,1,1]). 'ASCIIコード2進数'(96,[0,1,1,0,0,0,0,0]). 'ASCIIコード2進数'(97,[0,1,1,0,0,0,0,1]). 'ASCIIコード2進数'(98,[0,1,1,0,0,0,1,0]). 'ASCIIコード2進数'(99,[0,1,1,0,0,0,1,1]). 'ASCIIコード2進数'(100,[0,1,1,0,0,1,0,0]). 'ASCIIコード2進数'(101,[0,1,1,0,0,1,0,1]). 'ASCIIコード2進数'(102,[0,1,1,0,0,1,1,0]). 'ASCIIコード2進数'(103,[0,1,1,0,0,1,1,1]). 'ASCIIコード2進数'(104,[0,1,1,0,1,0,0,0]). 'ASCIIコード2進数'(105,[0,1,1,0,1,0,0,1]). 'ASCIIコード2進数'(106,[0,1,1,0,1,0,1,0]). 'ASCIIコード2進数'(107,[0,1,1,0,1,0,1,1]). 'ASCIIコード2進数'(108,[0,1,1,0,1,1,0,0]). 'ASCIIコード2進数'(109,[0,1,1,0,1,1,0,1]). 'ASCIIコード2進数'(110,[0,1,1,0,1,1,1,0]). 'ASCIIコード2進数'(111,[0,1,1,0,1,1,1,1]). 'ASCIIコード2進数'(112,[0,1,1,1,0,0,0,0]). 'ASCIIコード2進数'(113,[0,1,1,1,0,0,0,1]). 'ASCIIコード2進数'(114,[0,1,1,1,0,0,1,0]). 'ASCIIコード2進数'(115,[0,1,1,1,0,0,1,1]). 'ASCIIコード2進数'(116,[0,1,1,1,0,1,0,0]). 'ASCIIコード2進数'(117,[0,1,1,1,0,1,0,1]). 'ASCIIコード2進数'(118,[0,1,1,1,0,1,1,0]). 'ASCIIコード2進数'(119,[0,1,1,1,0,1,1,1]). 'ASCIIコード2進数'(120,[0,1,1,1,1,0,0,0]). 'ASCIIコード2進数'(121,[0,1,1,1,1,0,0,1]). 'ASCIIコード2進数'(122,[0,1,1,1,1,0,1,0]). 'ASCIIコード2進数'(123,[0,1,1,1,1,0,1,1]). 'ASCIIコード2進数'(124,[0,1,1,1,1,1,0,0]). 'ASCIIコード2進数'(125,[0,1,1,1,1,1,0,1]). 'ASCIIコード2進数'(126,[0,1,1,1,1,1,1,0]). 'ASCIIコード2進数'(127,[0,1,1,1,1,1,1,1]). 'ASCIIコード2進数'(128,[1,0,0,0,0,0,0,0]). 'ASCIIコード2進数'(129,[1,0,0,0,0,0,0,1]). 'ASCIIコード2進数'(130,[1,0,0,0,0,0,1,0]). 'ASCIIコード2進数'(131,[1,0,0,0,0,0,1,1]). 'ASCIIコード2進数'(132,[1,0,0,0,0,1,0,0]). 'ASCIIコード2進数'(133,[1,0,0,0,0,1,0,1]). 'ASCIIコード2進数'(134,[1,0,0,0,0,1,1,0]). 'ASCIIコード2進数'(135,[1,0,0,0,0,1,1,1]). 'ASCIIコード2進数'(136,[1,0,0,0,1,0,0,0]). 'ASCIIコード2進数'(137,[1,0,0,0,1,0,0,1]). 'ASCIIコード2進数'(138,[1,0,0,0,1,0,1,0]). 'ASCIIコード2進数'(139,[1,0,0,0,1,0,1,1]). 'ASCIIコード2進数'(140,[1,0,0,0,1,1,0,0]). 'ASCIIコード2進数'(141,[1,0,0,0,1,1,0,1]). 'ASCIIコード2進数'(142,[1,0,0,0,1,1,1,0]). 'ASCIIコード2進数'(143,[1,0,0,0,1,1,1,1]). 'ASCIIコード2進数'(144,[1,0,0,1,0,0,0,0]). 'ASCIIコード2進数'(145,[1,0,0,1,0,0,0,1]). 'ASCIIコード2進数'(146,[1,0,0,1,0,0,1,0]). 'ASCIIコード2進数'(147,[1,0,0,1,0,0,1,1]). 'ASCIIコード2進数'(148,[1,0,0,1,0,1,0,0]). 'ASCIIコード2進数'(149,[1,0,0,1,0,1,0,1]). 'ASCIIコード2進数'(150,[1,0,0,1,0,1,1,0]). 'ASCIIコード2進数'(151,[1,0,0,1,0,1,1,1]). 'ASCIIコード2進数'(152,[1,0,0,1,1,0,0,0]). 'ASCIIコード2進数'(153,[1,0,0,1,1,0,0,1]). 'ASCIIコード2進数'(154,[1,0,0,1,1,0,1,0]). 'ASCIIコード2進数'(155,[1,0,0,1,1,0,1,1]). 'ASCIIコード2進数'(156,[1,0,0,1,1,1,0,0]). 'ASCIIコード2進数'(157,[1,0,0,1,1,1,0,1]). 'ASCIIコード2進数'(158,[1,0,0,1,1,1,1,0]). 'ASCIIコード2進数'(159,[1,0,0,1,1,1,1,1]). 'ASCIIコード2進数'(160,[1,0,1,0,0,0,0,0]). 'ASCIIコード2進数'(161,[1,0,1,0,0,0,0,1]). 'ASCIIコード2進数'(162,[1,0,1,0,0,0,1,0]). 'ASCIIコード2進数'(163,[1,0,1,0,0,0,1,1]). 'ASCIIコード2進数'(164,[1,0,1,0,0,1,0,0]). 'ASCIIコード2進数'(165,[1,0,1,0,0,1,0,1]). 'ASCIIコード2進数'(166,[1,0,1,0,0,1,1,0]). 'ASCIIコード2進数'(167,[1,0,1,0,0,1,1,1]). 'ASCIIコード2進数'(168,[1,0,1,0,1,0,0,0]). 'ASCIIコード2進数'(169,[1,0,1,0,1,0,0,1]). 'ASCIIコード2進数'(170,[1,0,1,0,1,0,1,0]). 'ASCIIコード2進数'(171,[1,0,1,0,1,0,1,1]). 'ASCIIコード2進数'(172,[1,0,1,0,1,1,0,0]). 'ASCIIコード2進数'(173,[1,0,1,0,1,1,0,1]). 'ASCIIコード2進数'(174,[1,0,1,0,1,1,1,0]). 'ASCIIコード2進数'(175,[1,0,1,0,1,1,1,1]). 'ASCIIコード2進数'(176,[1,0,1,1,0,0,0,0]). 'ASCIIコード2進数'(177,[1,0,1,1,0,0,0,1]). 'ASCIIコード2進数'(178,[1,0,1,1,0,0,1,0]). 'ASCIIコード2進数'(179,[1,0,1,1,0,0,1,1]). 'ASCIIコード2進数'(180,[1,0,1,1,0,1,0,0]). 'ASCIIコード2進数'(181,[1,0,1,1,0,1,0,1]). 'ASCIIコード2進数'(182,[1,0,1,1,0,1,1,0]). 'ASCIIコード2進数'(183,[1,0,1,1,0,1,1,1]). 'ASCIIコード2進数'(184,[1,0,1,1,1,0,0,0]). 'ASCIIコード2進数'(185,[1,0,1,1,1,0,0,1]). 'ASCIIコード2進数'(186,[1,0,1,1,1,0,1,0]). 'ASCIIコード2進数'(187,[1,0,1,1,1,0,1,1]). 'ASCIIコード2進数'(188,[1,0,1,1,1,1,0,0]). 'ASCIIコード2進数'(189,[1,0,1,1,1,1,0,1]). 'ASCIIコード2進数'(190,[1,0,1,1,1,1,1,0]). 'ASCIIコード2進数'(191,[1,0,1,1,1,1,1,1]). 'ASCIIコード2進数'(192,[1,1,0,0,0,0,0,0]). 'ASCIIコード2進数'(193,[1,1,0,0,0,0,0,1]). 'ASCIIコード2進数'(194,[1,1,0,0,0,0,1,0]). 'ASCIIコード2進数'(195,[1,1,0,0,0,0,1,1]). 'ASCIIコード2進数'(196,[1,1,0,0,0,1,0,0]). 'ASCIIコード2進数'(197,[1,1,0,0,0,1,0,1]). 'ASCIIコード2進数'(198,[1,1,0,0,0,1,1,0]). 'ASCIIコード2進数'(199,[1,1,0,0,0,1,1,1]). 'ASCIIコード2進数'(200,[1,1,0,0,1,0,0,0]). 'ASCIIコード2進数'(201,[1,1,0,0,1,0,0,1]). 'ASCIIコード2進数'(202,[1,1,0,0,1,0,1,0]). 'ASCIIコード2進数'(203,[1,1,0,0,1,0,1,1]). 'ASCIIコード2進数'(204,[1,1,0,0,1,1,0,0]). 'ASCIIコード2進数'(205,[1,1,0,0,1,1,0,1]). 'ASCIIコード2進数'(206,[1,1,0,0,1,1,1,0]). 'ASCIIコード2進数'(207,[1,1,0,0,1,1,1,1]). 'ASCIIコード2進数'(208,[1,1,0,1,0,0,0,0]). 'ASCIIコード2進数'(209,[1,1,0,1,0,0,0,1]). 'ASCIIコード2進数'(210,[1,1,0,1,0,0,1,0]). 'ASCIIコード2進数'(211,[1,1,0,1,0,0,1,1]). 'ASCIIコード2進数'(212,[1,1,0,1,0,1,0,0]). 'ASCIIコード2進数'(213,[1,1,0,1,0,1,0,1]). 'ASCIIコード2進数'(214,[1,1,0,1,0,1,1,0]). 'ASCIIコード2進数'(215,[1,1,0,1,0,1,1,1]). 'ASCIIコード2進数'(216,[1,1,0,1,1,0,0,0]). 'ASCIIコード2進数'(217,[1,1,0,1,1,0,0,1]). 'ASCIIコード2進数'(218,[1,1,0,1,1,0,1,0]). 'ASCIIコード2進数'(219,[1,1,0,1,1,0,1,1]). 'ASCIIコード2進数'(220,[1,1,0,1,1,1,0,0]). 'ASCIIコード2進数'(221,[1,1,0,1,1,1,0,1]). 'ASCIIコード2進数'(222,[1,1,0,1,1,1,1,0]). 'ASCIIコード2進数'(223,[1,1,0,1,1,1,1,1]). 'ASCIIコード2進数'(224,[1,1,1,0,0,0,0,0]). 'ASCIIコード2進数'(225,[1,1,1,0,0,0,0,1]). 'ASCIIコード2進数'(226,[1,1,1,0,0,0,1,0]). 'ASCIIコード2進数'(227,[1,1,1,0,0,0,1,1]). 'ASCIIコード2進数'(228,[1,1,1,0,0,1,0,0]). 'ASCIIコード2進数'(229,[1,1,1,0,0,1,0,1]). 'ASCIIコード2進数'(230,[1,1,1,0,0,1,1,0]). 'ASCIIコード2進数'(231,[1,1,1,0,0,1,1,1]). 'ASCIIコード2進数'(232,[1,1,1,0,1,0,0,0]). 'ASCIIコード2進数'(233,[1,1,1,0,1,0,0,1]). 'ASCIIコード2進数'(234,[1,1,1,0,1,0,1,0]). 'ASCIIコード2進数'(235,[1,1,1,0,1,0,1,1]). 'ASCIIコード2進数'(236,[1,1,1,0,1,1,0,0]). 'ASCIIコード2進数'(237,[1,1,1,0,1,1,0,1]). 'ASCIIコード2進数'(238,[1,1,1,0,1,1,1,0]). 'ASCIIコード2進数'(239,[1,1,1,0,1,1,1,1]). 'ASCIIコード2進数'(240,[1,1,1,1,0,0,0,0]). 'ASCIIコード2進数'(241,[1,1,1,1,0,0,0,1]). 'ASCIIコード2進数'(242,[1,1,1,1,0,0,1,0]). 'ASCIIコード2進数'(243,[1,1,1,1,0,0,1,1]). 'ASCIIコード2進数'(244,[1,1,1,1,0,1,0,0]). 'ASCIIコード2進数'(245,[1,1,1,1,0,1,0,1]). 'ASCIIコード2進数'(246,[1,1,1,1,0,1,1,0]). 'ASCIIコード2進数'(247,[1,1,1,1,0,1,1,1]). 'ASCIIコード2進数'(248,[1,1,1,1,1,0,0,0]). 'ASCIIコード2進数'(249,[1,1,1,1,1,0,0,1]). 'ASCIIコード2進数'(250,[1,1,1,1,1,0,1,0]). 'ASCIIコード2進数'(251,[1,1,1,1,1,0,1,1]). 'ASCIIコード2進数'(252,[1,1,1,1,1,1,0,0]). 'ASCIIコード2進数'(253,[1,1,1,1,1,1,0,1]). 'ASCIIコード2進数'(254,[1,1,1,1,1,1,1,0]). 'ASCIIコード2進数'(255,[1,1,1,1,1,1,1,1]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/434 # # [1] C言語 # [2] 1) codepad.org/u1WNoZPtの関数と反対の動作をする関数、 #     及び二つの関数の動作確認が出来るmain関数を作成せよ。 #   2) キーボードから入力されたアルファベット及び数字の数を数えて、 #     少ないほうを消去するプログラムを作成せよ。 #     ただし、同数の場合は両方とも消去する。 # [3.1] Windows7 # [3.3] C言語 # [4] 12/19 19時まで # [5] 特になし # # 'キーボードから入力されたアルファベット及び数字の数を数えて、少ないほうを消去するプログラムを作成せよ。ただし、同数の場合は両方とも消去する。'(_残った文字列) :- 'キーボードから入力された'(_文字列), 'アルファベット及び数字の数を数えて'(_文字列,_アルファベットの数,_数字の数), '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列). 'キーボードから入力された'(_文字列) :- write('アルファベットと数字だけからなる文字列を入力してください : '), get_line(_文字列). 'アルファベット及び数字の数を数えて'(_文字列,_アルファベットの数,_数字の数) :- count((sub_atom(_文字列,_,1,_,_文字),アルファベット(_文字)),_アルファベットの数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_アルファベットの数). アルファベット(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. アルファベット(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 数字(_文字) :- _文字 @>= '0', _文字 @=< '9'. '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- 少ないほうを消去する。(_文字列,_アルファベットの数,_数字の数,_残った文字列). '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- 'ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列). '少ないほうを消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット < _数字の数, アルファベットを消去する(_文字列,_残った文字列). '少ないほうを消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット > _数字の数, 数字を消去する(_文字列,_残った文字列). 'ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット = _数字の数, 両方とも消去する(_文字列,_残った文字列). アルファベットを消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(アルファベット(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). 数字を消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(数字(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). 両方とも消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(数字(_文字)), \+(アルファベット(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). count(P,Count) :- findall(1,P,L), length(L,Count). % 以下のサイトは # 出典:: 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/test/read.cgi/tech/1354070278/187 # # [1]C言語 # [2]最大20人分の番号、所属、名前を管理する構造体配列を利用し #   入力したデータを元に社員タグを出力するプログラムを作成せよ #   実行例 #   http://ime.nu/iup.2ch-library.com/i/i0804401-1355254105.jpg # [3.1]Windows # [4]2012/12/13まで # [5]いかにも初心者が作るようなものだと嬉しいです # お願いします # # # % syain # input name...yamada # input post...education # input syainID...1234 # # input name...okada # input post...sales # input syainID...9876 # # input name...\d # # *******[ IDnumber 1234 ]******* # post:education # name:yamada # ******************************* # # *******[ IDnumber 9876 ]******* # post:sales # name:okeda # ******************************* # :- dynamic(社員/3). '最大20人分の番号、所属、名前を管理する述語を定義し、 入力したデータを元に社員タグを出力する' :- '最大20人分の番号、所属、名前を管理する構造体配列を利用し入力したデータを元に', 入力したデータを元に社員タグを出力する. '最大20人分の番号、所属、名前を管理する述語を定義し' :- 最大20人分の(Ln), '番号、所属、名前を管理する述語を定義し'(Ln). 最大20人分の(Ln) :- length(Ln,20). '最大20人分の番号、所属、名前を管理する述語を定義し'([_|Ln]) :- '番号、所属、名前の入力'(_名前,_所属,_社員タグ), '番号、所属、名前を管理する述語を定義し'(_名前,_所属,_社員タグ), '最大20人分の番号、所属、名前を管理する述語を定義し'(Ln),!. '最大20人分の番号、所属、名前を管理する述語を定義し'(_). '番号、所属、名前の入力'(_名前,_所属,_社員タグ) :- 名前の入力(_名前), 所属の入力(_所属), 社員タグの入力(_社員タグ). 名前の入力(_名前) :- write('input name...'), get_line(_名前), \+(_名前 = end_of_file). 所属の入力(_所属) :- write('input post...'), get_line(_所属). 社員タグの入力(_社員タグ) :- write('input SyainID...'), get_line(_社員ID). '番号、所属、名前を管理する述語を定義し'(_名前,_所属,_社員タグ) :- assertz(社員(_社員タグ,_所属,_名前)). 入力したデータを元に社員タグを出力する :- 社員(_社員タグ,_所属,_名前), writef('*******[ IDnumber %t ]*******\n post:%t\n name:%t\n*******************************\n\n',[_社員タグ,_所属,_名前]), fail. 入力したデータを元に社員タグを出力する. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/138 # # [1] 授業単元: ファイル読み取り コサイン類似度 # [2] 問題文(含コード&amp;リンク):http://ime.nu/codepad.org/pX1MdXpC #   問題中のsample.txtの例 http://ime.nu/www1.axfc.net/uploader/so/2707638.txt #   問題中のtest.txtの例 http://ime.nu/www1.axfc.net/uploader/so/2707641.txt # # /* # 二つのtxtファイルがある # sample.txtはファイル名と500個の数値の文字列が一行書かれている。 # txtファイルを例として上げる # 例: # # test.txtはsample.txtと同じようなファイル名と500個の数値の文字列を一行とした文字列が # 不特定多数並んでいる。txtファイルを例として上げる。 # 例: # # この2つのtxtファイルを使って次の動作をするプログラムを作れ # # ?sample.txtに書かれている数値を読み取って、配列a[n]に格納する。 # nは数値の番号で0からはじめる。 # # ?test.txtを読み取って、一行ごとに数値を配列b[i][j]に格納する #  iには行数、jには数値の番号を入れる。番号は0からはじめる。 #  余裕があれば、ファイル名を別の配列に格納する # # ?それぞれ格納された配列の数値をつかって繰り返し文を使い # # c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数*sqrt(b[i][j]*b[i][j])をすべて足した数} # # の計算を行う。 # 考え方は下の用になる # # c[0]=(a[0]*b[0][0]+a[1]*b[0][1]+a[2]*b[0][2]+...+a[n]*b[0][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[0][0]*b[0][0]+b[0][1]*b[0][1]+b[0][2]*b[0][2]+...+b[0][j]*b[1][j])); # # c[1]=(a[0]*b[1][0]+a[1]*b[1][1]+a[2]*b[1][2]+...+a[n]*b[1][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[1][0]*b[1][0]+b[1][1]*b[1][1]+b[1][2]*b[1][2]+...+b[1][j]*b[1][j])); # # c[2]=(a[0]*b[2][0]+a[1]*b[2][1]+a[2]*b[2][2]+...+a[n]*b[2][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[2][0]*b[2][0]+b[2][1]*b[2][1]+b[2][2]*b[2][2]+...+b[2][j]*b[2][j])); # # ・ # ・ # ・ # # c[i]=(a[0]*b[i][0]+a[1]*b[i][1]+a[2]*b[i][2]+...+a[n]*b[i][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[i][0]*b[i][0]+b[i][1]*b[i][1]+b[i][2]*b[i][2]+...+b[i][j]*b[i][j])); # # # ?画面にc[i]をすべて表示させる。余裕があれば同時に?で格納したファイル名も出力する # # # /* # '二つのtxtファイルがある sample.txtはファイル名と500個の数値の文字列が一行書かれている。 txtファイルを例として上げる 例: test.txtはsample.txtと同じようなファイル名と500個の数値の文字列を一行とした文字列が 不特定多数並んでいる。txtファイルを例として上げる。 例: この2つのtxtファイルを使って次の動作をするプログラムを作れ 1)sample.txtに書かれている数値を読み取って、配列a[n]に格納する。 nは数値の番号で0からはじめる。 2)test.txtを読み取って、一行ごとに数値を配列b[i][j]に格納する  iには行数、jには数値の番号を入れる。番号は0からはじめる。  余裕があれば、ファイル名を別の配列に格納する 3)それぞれ格納された配列の数値をつかって繰り返し文を使い c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数*sqrt(b[i][j]*b[i][j])をすべて足した数} の計算を行う。'(_c) :- 'sample.txtに書かれている数値を読み取って、_aに格納する'(_a), 'test.txtを読み取って、配列bに格納する'(_b), 'c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数の計算を行う'(_a,_b,_c). 'sample.txtに書かれている数値を読み取って、_aに格納する。'(_a) :- get_numbers('sample.txt',_a). 'test.txtを読み取って、配列bに格納する'(_b) :- 'test.txtを読み取って'(Lines), 配列bに格納する(Lines,_b). 'test.txtを読み取って'(Lines) :- get_lines('test.txt',Lines). 配列bに格納する(Lines,_b) :- findall(L,( member(A,Lines), atom_codes(A,L)), _b). 'c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数の計算を行う'(_a,_b,_c) :- 'sqrt(a[n]*a[n])をすべて足した数'(_a,V), findsum(X,( 'a[n]*b[i][j]をすべて足した数'(_a,_b,W), X is W / (V * sqrt(S_1))), _c). 'sqrt(a[n]*a[n])をすべて足した数'(_a,X) :- findsum(U,( member(A,_a), U is A * A), S_0), X is sqrt(S_1). 'a[n]*b[i][j]をすべて足した数'(_a,_bW) :- member(L,_b), findsum(Y,( nth0(_nth0_1,L,N), nth0(_nth0_1,_a,M), Y is M * N), W). get_numbers(File,Numbers) :- get_lines(File,Lines), findall(Number,( member(Line,Lines), atom_to_number(Line,Number)), Numbers). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/102 # # [1] 授業単元:言語処理 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/0VyMr7kt # 上記のプログラムを変更して、逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み,計算結果を出力するプログラムを作成せよ. # さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示するプログラムを作成せよ. # '逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み,計算結果を出力する.さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル) :- 逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み(_テキストファイル,_逆ポーランド式ならび), 計算結果を出力する(_逆ポーランド式ならび), 'さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル). 逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み(_テキストファイル,_逆ポーランド式ならび) :- get_chars(_テキストファイル,_文字ならび), 数字を値に変換する(_文字ならび,_文字ならび_1), 空白を除去する(_文字ならび_1,_逆ポーランド式ならび). 数字を値に変換する([],[]). 数字を値に変換する([A|R1],[B|R1]) :- 数字ならば数に変換(A,B), 数字を値に変換する(R1,R2),!. 数字を値に変換する([A|R1],[A|R2]) :- 数字を値に変換する(R1,R2). 空白改行などを除去する([],[]). 空白改行などを除去する([A|R1],[A|R1]) :- member(A,[+,-,*,/,0,1,2,3,4,5,6,7,8,9]), 空白改行などを除去する(R1,R2),!. 空白改行などを除去する([_|R1],[_|R2]) :- 空白改行などを除去する(R1,R2). 数字ならば数に変換(A,B) :- A @>= '0', A @=< '9', atom_number(A,B). 計算結果を出力する(_逆ポーランド式ならび) :- 計算結果(_逆ポーランド式ならび,[],_値), writef('%t\n',[_値]). 計算結果([],[_値],_値). 計算結果([N|R1],L1,_値) :- number(N), 計算結果(R1,[N|L1],_値),!. 計算結果([_演算子|R1],[N1,N2|R2],_値) :- 演算(_演算子,N1,N2,N3), 計算結果(R1,[N3|R2],_値). 演算(_演算子,N1,N2,N3) :- F =.. [_演算子,N1,N2], N3 is F. 'さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル) :- get_lines(_テキストファイル,Lines), '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(Lines). '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(Lines) :- append(_,[_行|R],Lines), '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を'(_行), 表示する(_頻度ならび), R = []. '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を'(_行,_頻度ならび) :- '各行の内容を字句解析(トークンに分解)し'(_行,_字句ならび), 各要素の個数をカウントした結果を(_字句ならび,_頻度ならび). '各行の内容を字句解析(トークンに分解)し'(_行,_字句ならび) :- sPLIT(_行,[' ','+','-','*','/','1','2','3','4','5','6','7','8','9','0'],L_1), 空白を取り除く(L_1,_字句ならび). 各要素の個数をカウントした結果を(_字句ならび,_頻度ならび) :- setof(_要素,[_要素] ^ member(_要素,_字句ならび),L_1), findall([_頻度,_字句],( member(_字句,L_1), count(member(_字句,_字句ならび),_頻度)),_頻度ならび). 表示する(_頻度ならび) :- append(_,[[_頻度,_字句]|R],_頻度ならび), writef('%t,%t回 ',[_字句,_頻度]), R = [], write('\n'). % 以下のサイトは # 出典:: 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/84 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # コマンド選択で,0) 終了,1) 追加,2) 検索(id),3) リスト表示,4) 変更 5) 削除 6) 特殊機能 が行える商品在庫管理プログラムを作成する。 # データは,商品の番号 商品名 数 単価 の形式で商品のデータを持っているファイルとする. # 上の機能ルーチンは,全て関数として作成すること. # ただし,追加と検索は実装済みである. # # 'コマンド選択で,0) 終了,1) 追加,2) 検索(id),3) リスト表示,4) 変更 5) 削除 6) 特殊機能 が行える商品在庫管理プログラムを作成する。データは,商品の番号 商品名 数 単価 の形式で商品のデータを持っているファイルとする.' :- reconsult('在庫管理.pro'), コマンド選択で(_コマンド), '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(_コマンド), '在庫管理.proの保存'. コマンド選択で(_コマンド) :- 整数を得る('0) 終了,1) 追加,2) 検索(id),3) リスト表示,4) 変更 5) 削除 6) 特殊機能を整数で',member(_整数,between(0,6,_整数),_整数), nth0(_整数,[終了,追加,'検索(id)',リスト表示,変更,削除,特殊機能],_コマンド). '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(終了) :- !. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(追加) :- 在庫追加. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(検索) :- 在庫検索. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(リスト表示) :- リスト表示. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(変更) :- 在庫変更. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(削除) :- 在庫削除. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(特殊機能) :- 特殊機能. 在庫追加 :- 商品名を得る(_商品名), 数量を得る(_数量), 在庫追加(_商品名,_数量). 在庫追加(_商品名,_数量). retract(在庫(_商品名,_現在の数量)), _更新された数量 is _現在の数量 + _数量, asserta(在庫(_商品名,_更新された数量)),!. 在庫追加(追加,_商品名,_数量) :- asserta(在庫(_商品名,_数量)),!. '在庫検索(id)' :- 商品名を得る(_商品名), 在庫(_商品名,_数量), writef('現在の在庫数量は %t です\n',[_数量]),!. '在庫検索(id)' :- write('現在の在庫はありません\n'). リスト表示 :- 在庫(_商品名,_数量), writef('%t,%t\n',[_商品名,_数量]), fail. リスト表示. 在庫変更 :- 整数を得る('1..商品名 2..数量 どちらを変更するか',between(1,2,_整数),_整数), 在庫変更(_整数). 在庫変更(1) :- 現在の商品名を得る(_現在の商品名), 正しい商品名を得る(_正しい商品名), 在庫変更(_現在の商品名,_正しい商品名),!. 在庫変更(1) :- 在庫変更(1). 在庫変更(2) :- 商品名を得る(_商品名), '診断:: 商品名'(_商品名), 数量を得る(_数量), retract(在庫(_商品名,_)), asserta(在庫(_商品名,_数量)),!. 現在の商品名を得る(_現在の商品名) :- write('現在の商品名を入力してください : '), get_line(_現在の商品名), '診断:: 現在の商品名'(_現在の商品名),!. '診断:: 現在の商品名'(_現在の商品名) :- 在庫(_現在の商品名,_),!. '診断:: 現在の商品名'(_商品名) :- writef('入力された商品名の在庫はありません\n',[_商品名]), fail. 正しい商品名を得る(_正しい商品名) :- write('正しい商品名を入力してください : '), get_line(_正しい商品名),!. '診断:: 商品名'(_商品名) :- 在庫(_商品名,_),!. '診断:: 商品名'(_商品名) :- writef('指定された商品名の %t の在庫登録はありません\n',[_商品名]), fail. 在庫変更(_現在の商品名,_正しい商品名) :- retract(在庫(_現在の商品名,_数量)), asserta(在庫(_正しいの商品名,_数量)),!. 在庫削除 :- 商品名を得る(_商品名), retract(在庫(_商品名,_)). 特殊機能. 数量を得る(_数量) :- 数を得る(数量,true,_数量). '在庫管理.proの保存' :- tell('在庫管理.pro'), listing(在庫), told. % 以下のサイトは # 出典:: 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/1337692704/456 # # 【 課題 】http://ime.nu/ideone.com/hRQD87 # try catch # 【 Ver 】1.7.0_07 # 【 形態 】Javaアプリケーション # 【 期限 】27日 11:00まで # よろしくお願いします # # # 問題2:ある文字列が標準入力されたとき,次のような変換を行うプログラムKadai02.java を作成せ # よ.String クラスの,charAt メソッド,length メソッド,valueOf メソッドなどを使うとよい. #  ’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える. #  空白は空白のままとする. #  ”ab Adaf”という文字列であれば,”xo ooxo”に変換される. # 'ある文字列が標準入力されたとき,次のような変換を行う. ’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える. 空白は空白のままとする. "ab Adaf"という文字列であれば,"xo ooxo"に変換される.' :- ある文字列が標準入力されたとき(_ある文字列), '’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(_ある文字列,_変換された文字列), writef('%t',[_変換された文字列]). ある文字列が標準入力されたとき(_ある文字列) :- get_line(_ある文字列). '’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(_ある文字列,_変換された文字列) :- findall(_変換された文字,( sub_atom(_ある文字列,_,1,_,_文字), '文字が’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(_文字,_変換された文字)), L), atomic_list_concat(L,_変換された文字列). '文字が’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(a,x) :- !. '文字が’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(' ',' ') :- !. '文字が’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(_,o). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 文字列を逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 文字列を逆順に出力する(_文字列) :- findall(_,( 文字列を逆順に(_文字列,_文字), write(_文字)), _), write('\n'). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,1,_,0,_残り文字列), 文字列を逆順に(_残り文字列,_文字). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,0,1,_,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 文字列を逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 文字列を逆順に出力する(_文字列) :- findall(_文字,( 文字列を逆順に(_文字列,_文字)), _逆順文字ならび), atomic_list_concat(_逆順文字ならび,_逆順文字列), writef('%t\n',[_逆順文字列]). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,1,_,0,_残り文字列), 文字列を逆順に(_残り文字列,_文字). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,0,1,_,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 文字列を逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 文字列を逆順に出力する(_文字列) :- 文字列を逆順に(_文字列,_文字), write(_文字), fail. 文字列を逆順に出力する(_) :- write('\n'). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,1,_,0,_残り文字列), 文字列を逆順に(_残り文字列,_文字). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,0,1,_,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 逆順に出力する('') :- write('\n'). 逆順に出力する(_入力した文字列) :- sub_atom(_入力した文字列,0,1,_,_文字), sub_atom(_入力した文字列,1,_,0,_残り文字列), 逆順に出力する(_残り文字列), write(_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 逆順に出力する(_入力した文字列) :- 逆順に(_入力した文字列,_逆順文字ならぴ), 出力する(_逆順文字ならび). 逆順に(_入力した文字列,_逆順文字ならぴ) :- atom_chars(_入力した文字列,_文字ならび), reverse(_文字ならび,_逆順文字ならぴ). 出力する([]) :- write('\n'). 出力する([_文字|_残りならび]) :- wrire(_文字), 出力する(_残りならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 逆順に出力する(_入力した文字列) :- atom_chars(_入力した文字列,_文字ならび), reverse(_文字ならび,_逆順文字ならぴ), atom_chars(_逆順文字列,_逆順文字ならび), writef('%t\n',[_逆順文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/693 # # [1]C/C++プログラミング実習 まとめ  # [2]問題 http://ime.nu/codepad.org/CfJninhf #   問題文中に出てくる histograms.txt # [3]visual studio 2010 # [4]11月19日 10時 # [5]前にここのスレでお世話になりました../test/read.cgi/tech/1349527750/603です。 #   この前の課題を提出した所、今度はまとめとして前の問題の発展問題がだされました。 #   前に頂いたプログラムを改変してみようと思ったのですが、今回の問題が複雑になりすぎてて #   お手上げ状態です。どなたか助けていただけると幸いに思います。 # # /* # histograms.txtという文章ファイルがある。 # このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が # 並んでいて、それらの数字は水平TAB文字によって区切られている。 # このhistograms.txtを自動的に以下の条件のもとに改変して # train.datというファイルとして出力をするプログラムを作れ。 # # 条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。 #     (例 image/0-21C5N550AVL.jpg → 0 #        image/1-19690369.jpg  → 1 #        image/2-24891960.jpg  → 2 #        image/3-12725422.jpg  → 3) # # 条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。 # # 条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、 #     番号:数値?番号:数値?番号:数値?…という形に書き換える #     (例 0  0.0309051 0 0   0.00496689 #      → 2:0.0309051 5:0.00496689 …… ) # # 条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き #              指定した方の名前で出力を行う。 # # */ 'histograms.txtという文章ファイルがある。 このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が 並んでいて、それらの数字は水平TAB文字によって区切られている。 このhistograms.txtを自動的に以下の条件のもとに改変して train.datというファイルとして出力をするプログラムを作れ。 条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。     (例 image/0-21C5N550AVL.jpg → 0        image/1-19690369.jpg  → 1        image/2-24891960.jpg  → 2        image/3-12725422.jpg  → 3) 条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。 条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、     番号:数値?番号:数値?番号:数値?…という形に書き換える     (例 0  0.0309051 0 0   0.00496689      → 2:0.0309051 5:0.00496689 …… ) 条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き              指定した方の名前で出力を行う。' :- get_lines('histograms.txt',Lines), sPLIT(Lines,['\t'],LL0), findall(L1,( 自動的に以下の条件のもとに改変して(LL0,L1)), LL), 'train.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL). 自動的に以下の条件のもとに改変して(LL0,L1) :- member([File|R],LL0), '行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える'(File,N), 左から順に番号を振った上で要素が0のものを削除し(0,R,L), 水平TAB文字をすべて空白文字に変える([N|L],L1). '行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える'(File,N) :- split(File,['/','-'],[_,N|_]). 左から順に番号を振った上で要素が0のものを削除し(_,[],[]). 左から順に番号を振った上で要素が0のものを削除し(N_0,[A|R1],[N:A|R2]) :- \+(A = '\t'), \+(A = 0), N is N_0 + 1, 左から順に番号を振った上で要素が0のものを削除し(N,R1,R2). 左から順に番号を振った上で要素が0のものを削除し(N,[A|R1],[A|R2]) :- A = '\t', 左から順に番号を振った上で要素が0のものを削除し(N,R1,R2). 左から順に番号を振った上で要素が0のものを削除し(N,[A|R1],R2) :- A = 0, 左から順に番号を振った上で要素が0のものを削除し(N,R1,R2). 水平TAB文字をすべて空白文字に変える(L,S) :- findall(B,( member(A,L), 水平TAB文字を空白文字に(A,B)), L2), atomic_list_concat(L2,S). 水平TAB文字を空白文字に('\t',' ') :- !. 水平TAB文字を空白文字に(A,A). 'train.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL) :- 'train.datかtest.datのどちらのファイル名で出力するかを聞き', 指定した方の名前で出力を行う(LL). 'train.datかtest.datのどちらのファイル名で出力するかを聞き' :- write('ファイル名を選択します。\n1.. train.dat 2.. test.dat \n'). 指定した方の名前で出力を行う(LL) :- 指定した方の名前で(_指定した方の名前), 出力を行う(_指定して方の名前,LL). 指定した方の名前で(_指定した方の名前) :- 整数を得る('1または2',(N == 1;N == 2),N), 指定した方の名前で(N,_指定した方の名前). 指定した方の名前(1,'train.dat'). 指定した方の名前(2,'test.dat'). 出力を行う(_指定した方の名前,LL) :- open(_指定した方の名前,write,Outstream), ストリーム出力を行う(Outstream,LL), close(Outstream). ストリーム出力を出力を行う(Outstream,LL) :- append(_,[L|R],LL), atomic_list_concat(L,S), writef(Outstream,'%t\n',[S]), R = [], % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/659 # # [1] 授業単元: C言語 # [2] 問題文(含コード&amp;リンク): # ファイル処理 # 文字列を複数入力した上で、その順番に表示するプログラムを作る。また、その応用で逆に表示するものも作る。 # 1、文字列はいくらでも入力できる。 # 2、連結リストにデータを保持する。 # 3、入力を終わらせる手段を用意する # # /* '文字列を複数入力した上で、その順番に表示するプログラムを作る。また、その応用で逆に表示するものも作る。 1、文字列はいくらでも入力できる。 2、連結リストにデータを保持する。 3、入力を終わらせる手段を用意する' :- '文字列を複数入力した上で連結リストにデータを保持する(# 1、文字列はいくらでも入力できる。 2、連結リストにデータを保持する。 3、入力を終わらせる手段を用意する)'(_連結リスト), 'その順番に表示する'(_連結リスト). */ '文字列を複数入力した上で連結リストにデータを保持する(1、文字列はいくらでも入力できる。 2、連結リストにデータを保持する。 3、入力を終わらせる手段を用意する)'(_連結リスト) :- 文字列を入力する(_文字列), '文字列を複数入力した上で連結リストにデータを保持する(1、文字列はいくらでも入力できる。 2、連結リストにデータを保持する。 3、入力を終わらせる手段を用意する)'(_文字列,_連結リスト). '文字列を複数入力した上で連結リストにデータを保持する(1、文字列はいくらでも入力できる。 2、連結リストにデータを保持する。 3、入力を終わらせる手段を用意する)'(end_of_file,[]) :- !. '文字列を複数入力した上で連結リストにデータを保持する(# 1、文字列はいくらでも入力できる。 2、連結リストにデータを保持する。 3、入力を終わらせる手段を用意する)'(_文字列,[_文字列|_残り連結リスト]) :- 文字列を入力する(_文字列_2), '文字列を複数入力した上で連結リストにデータを保持する(1、文字列はいくらでも入力できる。 2、連結リストにデータを保持する。 3、入力を終わらせる手段を用意する)'(_文字列_2,_残り連結リスト). 文字列を入力する(_文字列) :- get_line(_文字列). その順番に表示する([]). その順番に表示する([_文字列|_残り連結リスト]) :- writef('%t\n',[_文字列]), その順番に表示する(_残り連結リスト). 逆に表示する([]). 逆に表示する([_文字列|_残り連結リスト]) :- 逆に表示する(_残り連結リスト), writef('%t\n',[_文字列]). % 以下のサイトは # 出典:: 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/1349527750/338 # # 7個のデータを入力し、中央地を表示するプログラムを作成して下さい # # 例 # 1番目の数字を入力してください: 13 # 2番目の数字を入力してください: 22 # ・・・ # 中央値は 22 です。 # # '7個のデータを入力し、中央地を表示する' :- '7個のデータを入力し'(_7個のデータ), 中央値を表示する(_7個のデータ). '7個のデータを入力し'(_7個のデータ) :- '7個のデータを'(_7個のデータ), 入力し(1,_7個のデータ),!. '7個のデータを'(_7個のデータ) :- length(_7個のデータ,7). 入力し(_何番目,[]) :- _何番目 > 7. 入力し(_何番目,[_データ|R]) :- writef('%t番目のデータを入力してください: ',[_何番目]), get_line(_データ), _何番目_2 is _何番目 + 1, 入力し(_何番目_2,R). 中央値を表示する(_7個のデータ) :- バブルソート(_7個のデータ,[_,_,_,_中央値,_,_,_]), 表示する(_中央値). バブルソート(L1,L2) :- 軽い泡はちょっと浮き上がる(L1,L3), 泡が浮き上がったら最初からやり直す(L3,L2),!. バブルソート(L,L) :- 浮き上がる泡がなくなったらバブルソート終了. 軽い泡はちょっと浮き上がる(L1,L3) :- append(L0,[_重い泡,_軽い泡|R],L1), _重い泡 @> _軽い泡, append(L0,[_軽い泡,_重い泡|R],L3). 泡が浮き上がったら最初からやり直す(L3,L2) :- バブルソート(L3,L2). 浮き上がる泡がなくなったらバブルソート終了. 表示する(_中央値) :- writef('中央値は %t です\n',[_中央値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/189 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/382.txt # # 文字列処理 キーボードからアルファベット小文字で入力し、イニシャルで表示する # プログラムを作成しなさい。 # 入力できる文字数は姓、名、最大20文字、配列を宣言すること。 # 文字変換関数を使用すること。 # (実行結果) 氏名をアルファベット小文字で入力して下さい # tanaka # hanako # tanaka hanako さんのイニシャルはH,Tです # # キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、 # その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントするプログラムを作成しなさい。 # ただし、入力する文字数は最大30文字とする。 # 文字列操作関数を必ず用いること # # (実行結果) 文字列を入力して下さい. # TanakaHanako1234          # 入力文字列は TanakaHanako1234 で          小文字は10文字,大文字は2文字,数字は4文字です. 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)、その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする' :- 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数). 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列) :- write('文字列を入力してください\n'), get_line(Line), 最大30文字(Line,_入力文字列). 最大30文字(Line,_入力文字列) :- atom_length(Line,_長さ), _長さ > 30, sub_atom(Line,0,30,_,_入力文字列),!. 最大30文字(_入力文字列,_入力文字列). 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数) :- count((sub_atom(_入力文字列,_,1,_,_文字),_文字 @>= 'a',_文字 @=< 'z'),_小文字の数), count((sub_atom(_入力文字列,_,1,_,_文字),_文字 @>= 'A',_文字 @=< 'Z'),_大文字の数), count((sub_atom(_入力文字列,_,1,_,_文字),_文字 @>= '0',_文字 @=< '9'),_数字の数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/189 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/382.txt # # 文字列処理 キーボードからアルファベット小文字で入力し、イニシャルで表示する # プログラムを作成しなさい。 # 入力できる文字数は姓、名、最大20文字、配列を宣言すること。 # 文字変換関数を使用すること。 # (実行結果) 氏名をアルファベット小文字で入力して下さい # tanaka # hanako # tanaka hanako さんのイニシャルはH,Tです # # キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、 # その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントするプログラムを作成しなさい。 # ただし、入力する文字数は最大30文字とする。 # 文字列操作関数を必ず用いること # # (実行結果) 文字列を入力して下さい. # TanakaHanako1234          # 入力文字列は TanakaHanako1234 で          小文字は10文字,大文字は2文字,数字は4文字です. 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)、その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする' :- 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数). 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列) :- write('文字列を入力してください\n'), get_line(Line), 最大30文字(Line,_入力文字列). 最大30文字(Line,_入力文字列) :- atom_length(Line,_長さ), _長さ > 30, sub_atom(Line,0,30,_,_入力文字列),!. 最大30文字(_入力文字列,_入力文字列). 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数) :- atom_chars(_入力文字列,_文字ならび), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_文字ならび,0,0,0,_小文字の数,_大文字の数,_数字の数). 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'([],_小文字の数,_大文字の数,_数字の数,_小文字の数,_大文字の数,_数字の数) :- !. 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'([_文字|R],_小文字の数_1,_大文字の数_1,_数字の数_1,_小文字の数,_大文字の数,_数字の数) :- '一文字単位のカウント'(_文字,_小文字の数_1,_大文字の数_1,_数字の数_1,_小文字の数_2,_大文字の数_2,_数字の数_2), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(R,_小文字の数_2,_大文字の数_2,_数字の数_2,_小文字の数,_大文字の数,_数字の数). '一文字単位のカウント'(_文字,_小文字の数_1,_大文字の数,_数字の数,_小文字の数_2,_大文字の数,_数字の数) :- _文字 @>= 'a', _文字 @=< 'z', _小文字の数 is _小文字の数_1 + 1. '一文字単位のカウント'(_文字,_小文字の数,_大文字の数_1,_数字の数,_小文字の数,_大文字の数,_数字の数) :- _文字 @>= 'A', _文字 @=< 'Z', _大文字の数 is _大文字の数_1 + 1. '一文字単位のカウント'(_文字,_小文字の数,_大文字の数,_数字の数_1,_小文字の数,_大文字の数,_数字の数) :- _文字 @>= '0', _文字 @=< '9', _数字の数 is _数字の数_1 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/189 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/382.txt # # 文字列処理 キーボードからアルファベット小文字で入力し、イニシャルで表示する # プログラムを作成しなさい。 # 入力できる文字数は姓、名、最大20文字、配列を宣言すること。 # 文字変換関数を使用すること。 # (実行結果) 氏名をアルファベット小文字で入力して下さい # tanaka # hanako # tanaka hanako さんのイニシャルはH,Tです # # キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、 # その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントするプログラムを作成しなさい。 # ただし、入力する文字数は最大30文字とする。 # 文字列操作関数を必ず用いること # # (実行結果) 文字列を入力して下さい. # TanakaHanako1234          # 入力文字列は TanakaHanako1234 で          小文字は10文字,大文字は2文字,数字は4文字です. '文字列処理 キーボードから姓名をアルファベット小文字で入力し(入力できる文字数は姓、名、最大20文字)、イニシャルで表示する。' :- '文字列処理 キーボードから姓名をアルファベット小文字で入力し(入力できる文字数は姓、名、最大20文字)'(_姓名), 'イニシャルで表示する。'(_姓名,_イニシャル). '文字列処理 キーボードから姓名をアルファベット小文字で入力し(入力できる文字数は姓、名、最大20文字)'(_姓,_名) :- '姓を入力(入力できる文字数は姓、名、最大20文字)'(_姓), '名を入力(入力できる文字数は姓、名、最大20文字)'(_名). '姓を入力(入力できる文字数は姓、名、最大20文字)'(_姓) :- write('姓を入力してください : '), get_line(Line_1), '入力できる文字数は姓、名、最大20文字'(Line_1,_姓). '名を入力(入力できる文字数は姓、名、最大20文字)'(_名) :- write('名を入力してください : '), get_line(Line_2), '入力できる文字数は姓、名、最大20文字'(Line_2,_名). '入力できる文字数は姓、名、最大20文字'(Line,Line) :- atom_length(Line,_長さ), _長さ_1 =< 20,!. '入力できる文字数は姓、名、最大20文字'(_文字列,_20文字以内の文字列) :- sub_atom(_文字列,0,20,_,_20文字以内の文字列). 'イニシャルで表示する。'(_姓,_名) :- イニシャルで(_姓,_名,_イニシャル), writef('%t %t さんのイニシャルは %t です\n',[_イニシャル]). イニシャルで(_姓,_名,_イニシャル) :- sub_atom(_姓,0,1,_,_姓の第一文字), to_upper(_姓の第一文字,_イニシャル_1), sub_atom(_名,0,1,_,_名の第一文字), to_upper(_名の第一文字,_イニシャル_2), atomic_list_concat([_イニシャル_1,',',_イニシャル_2],_イニシャル). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/79 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/codepad.org/kqhMSJiH # # /* # # ・問題文 # 名字と名前(null文字を除き10文字以内)を入力し、実行例のように氏名を表示する。 # なお、 # # 氏名は名前の次に1文字あけて名字を表示する # 名前は最初の文字を大文字に、2文字以降を小文字に変換して表示する。 # 名字はすべて大文字に変換して表示する # # とし、文字列関数を用いて行う。 # # ・実行例 # # 名字と名前を入力してください # yamada taro # 出力: Taro YAMADA # 名字と名前を入力してください # kawada hanako # 出力: Hanako KAWADA # .... # # */ '名字と名前(null文字を除き10文字以内)を入力し、実行例のように氏名を表示する。なお、氏名は名前の次に1文字あけて名字を表示する。名前は最初の文字を大文字に、2文字以降を小文字に変換して表示する。名字はすべて大文字に変換して表示する' :- '名字と名前(null文字を除き10文字以内)を入力し'(_名字,_名前), '名前は最初の文字を大文字に、2文字以降を小文字に変換して'(_名前,_変換後の名前), '名字はすべて大文字に変換して'(_名字,_大文字に変換された名字), '実行例のように氏名を表示する。なお、氏名は名前の次に1文字あけて名字を表示する'(_変換後の名前,_大文字に変換されたの名字). '名字と名前(null文字を除き10文字以内)を入力し'(_名字,_名前) :- write('名字と名前を入力してください\n'), 一行読み込む(_入力された名字), 一行読み込む(_入力された名前), 名字はnull文字をのぞき10文字以内(_入力された名字,_名字), 名前はnull文字をのぞき10文字以内(_入力された名前,_名前). 名字はnull文字をのぞき10文字以内(_入力された名字,_名字) :- null文字をのぞき10文字以内(_入力された名字,_名字). 名前はnull文字をのぞき10文字以内(_入力された名前,_名前) :- null文字をのぞき10文字以内(_入力された名前,_名前). null文字をのぞき10文字以内(_文字列,_null文字をのぞき10文字以内に制限された文字列) :- null文字をのぞき(_文字列,_null文字を除いた文字列), '10文字以内'(_null文字を除いた文字列,_null文字をのぞき10文字以内に制限された文字列). null文字をのぞき(_文字列,_null文字を除いた文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(_文字 = '')), _文字ならび), atom_chars(_null文字を除いた文字列,_文字ならび). '10文字以内'(_文字列,_10文字以内に制限された文字列) :- sub_atom(_文字列,0,10,_,_10文字以内に制限された文字列),!. '10文字以内'(_文字列,_文字列). '名前は最初の文字を大文字に、2文字以降を小文字に変換して'(_名前,_変換後の名前) :- 名前は最初の文字を大文字に(_名前,_大文字化された最初の文字), '2文字以降を小文字に変換して'(_名前,_小文字化された2文字以降), atomic_list_concat([_大文字化された最初の文字,_小文字化された2文字以降],_変換後の名前). 名前は最初の文字を大文字に(_名前,_大文字化された最初の文字) :- sub_atom(_名前,0,1,R,_最初の文字), to_upper(_最初の文字,_大文字化された最初の文字). '2文字以降を小文字に変換して'(_名前,_小文字化された2文字以降) :- sub_atom(_名前,1,_,0,_2文字以降), to_lower(_2文字以降,_小文字化された2文字以降). '名字はすべて大文字に変換して'(_名字,_大文字に変換された名字) :- to_upper(_名字,_大文字に変換された名字). '実行例のように氏名を表示する。なお、氏名は名前の次に1文字あけて名字を表示する'(_変換後の名前,_大文字に変換された名字) :- writef('出力: %t %t\n',[_変換後の名前,_変換後の名字]). % ・実行例 % % 名字と名前を入力してください % yamada taro % 出力: Taro YAMADA % 名字と名前を入力してください % kawada hanako % 出力: Hanako KAWADA % .... % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/793 # # [1] 授業単元:プログラミング # [2] 問題文: # http://ime.nu/codepad.org/3HrmfsVo # http://ime.nu/codepad.org/InxgbSAZ # http://ime.nu/codepad.org/99RFoVNY # # /* # プログラムの引数に書籍データのファイルと列数(a) を与える。書籍データのファイルは # c2md.csv である。 # # 各行が1つの書籍データを表している。書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち、 # それらをカンマ(,)で区切って表している。ただし書名にカンマ(,)が含まれる場合には、書名は二重引用符 # (”)で囲まれている。発行年、本体価格は正の整数値で記述されており、情報がない不明の場合は記述がない。 # # a で指定された列だけを表示せよ。 # ただし1行を出版社出版社名を表す文字の配列、書名を表す文字の配列、発行年を表す整数、本体価格 # を表す整数に分解する関数bunkatu を実装することで実現せよ。 # # */ # /* # プログラムの引数に書籍データのファイル(c2md.csv) を与える。各出版社が2000 年から2012 年ま # でに出版した本の冊数を求め、その冊数の多い順に表示せよ。 # ただし出版社名(name)とその出版社が2000 年から2012 年までに出版した本の冊数(pub)を表す以 # 下の構造体bkcmpy を用意する。 # struct bkcmpy { # char name[100]; # int pub; # }; # 各出版社に対して、このbkcmpy を作成し、この構造体の情報を出力することでプログラムを作成せよ。 # # プログラムでは、出版社が全部で150 社以下であることは仮定し、bkcmpy のポインターの配列 # bkcmpydb[150] を用意する。関数touroku ではbkcmpydb と読み込んだ出版社名cname を与える。 # cname が既にbkcmpydb に登録されていたら、その構造体のpub を1 増やし、登録されていなかった # ら、bkcmpy を1つ作成してbkcmpydb に登録する。 # /* # プログラムの引数に書籍データのファイル(c2md.csv) を与える。各出版社が2000 年から2012 年ま # でに出版した本の中で最高価格の本の情報を表示せよ。 # ただし出版社名(name)、書名(book)、発行年(year)、最高価格(price)を表す以下の構造体bkcmpy # を用意する。 # # struct bkcmpy { # char name[100]; # char book[420]; # int year; # int price; # }; # # 各出版社に対して、このbkcmpy を作成し、この構造体の情報を出力することでプログラムを作成せよ。 # # */ 'プログラムの引数に書籍データのファイルと列数(a) を与える。書籍データのファイルはc2md.csv である。各行が1つの書籍データを表している。書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち、それらをカンマ(,)で区切って表している。ただし書名にカンマ(,)が含まれる場合には、書名は二重引用符(”)で囲まれている。発行年、本体価格は正の整数値で記述されており、情報がない不明の場合は記述がない。a で指定された列だけを表示せよ。'(_ファイル名,_列数a) :- get_lines(_ファイル名,_行ならび), 書籍データならびに変換する(_行ならび,_書籍データならび), 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび). 書籍データならびに変換する([],[]). 書籍データならびに変換する([_行|R1],[[_出版社名,_書名,_発行年,_本体価格]|R2]) :- '書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち'(_行,_出版社名,_書名,_発行年,_本体価格), 書籍データならびに変換する(R1,R2). '書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち'(_書籍データ,_出版社名,_書名,_発行年,_本体価格) :- 二重引用符をエスケープに使ったsplit(_書籍データ,[_出版社名,_書名,_発行年,本体価格]). 二重引用符をエスケープに使ったsplit(_書籍データ,L) :- atom_chars(_書籍データ,_書籍データ文字ならび), 二重引用符をエスケープに使った文字ならびを区切る(_書籍データ文字ならび,L). 二重引用符をエスケープに使った文字ならびを区切る([],[]). 二重引用符をエスケープに使った文字ならびを区切る(L1,[A|R2]) :- 二重引用符にぶつかった(L1,A,R1_2), 二重引用符をエスケープに使った文字ならびを区切る(R1_2,R2),!. 二重引用符をエスケープに使った文字ならびを区切る(L1,[A|R2]) :- カンマ区切りを切り取る(L1,A,R1), 二重引用符をエスケープに使った文字ならびを区切る(R1,R2). 二重引用符にぶつかった(L1,A,R1_2) :- append(L0,['"'|R1],L1), \+(member('''',L0)), append(L1_1,['"'|R1_2],R1), atom_chars(A,L1_1),!. カンマ区切りを切り取る(L1,A,R1) :- append(L0,[','|R1],L1), atom_chars(A,L0),!. 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび) :- member(L,_書籍データならび), count((member(A,L),\+(A='')),_列数a), writef('%t,%t,%t,%t\n',L), fail. 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/844 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/DXRUGC3J # http://ime.nu/codepad.org/e9CIf3Iy # # /* # # 2.以下のように各行に整数だけを記したファイルがあるとします.このファイルを開いて,各 # 行の数値の和を求めるプログラムを書きなさい.ファイル名はプログラムの引数にすること. # # ----ファイルdata.txtの中身---- # 12 # 2 # -4 # 6 # 321 # --------------------------- # # 実行例337 # # */ # # /* # 3.2のプログラムを,数値は標準入力から得るようにしなさい.そして,以下の # 命令で2 と同じ結果が出るようにしなさい. # # 実行例 # # */ # # type datatxt | prog # .sum is # prog dat.txt337 # sum is a '数値は標準入力から得る.そして各行の数値の和を求める'(_各行の数値の和) :- get_lines(Lines), findsum(_値,( member(_行,Lines), atom_number(_行,_値)), _各行の数値の和). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/844 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/DXRUGC3J # http://ime.nu/codepad.org/e9CIf3Iy # # /* # # 2.以下のように各行に整数だけを記したファイルがあるとします.このファイルを開いて,各 # 行の数値の和を求めるプログラムを書きなさい.ファイル名はプログラムの引数にすること. # # ----ファイルdata.txtの中身---- # 12 # 2 # -4 # 6 # 321 # --------------------------- # # 実行例337 # # */ # # /* # 3.2のプログラムを,数値は標準入力から得るようにしなさい.そして,以下の # 命令で2 と同じ結果が出るようにしなさい. # # 実行例 # # */ # # type datatxt | prog # .sum is # prog dat.txt337 # sum is a '各行に整数だけを記したファイルがあるとします.このファイルを開いて,各行の数値の和を求める'(_ファイル名,_各行の数値の和) :- get_lines(_ファイル名,Lines), findsum(_値,( member(_行,Lines), atom_number(_行,_値)), _各行の数値の和). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/641 # # [1] C言語 # [2] http://ime.nu/ideone.com/m8dZRの関数を利用して、 #   キーボードから日付を読み込んで、その次の日を求める #   プログラムを作成しなさい。 # # 実行例 # --------------------- # 年月日:20120913 # # 次の日は:2012/09/14 # --------------------- # # [3.1] Windows7 # [3.3] C言語 # [4] 9/13 19:00まで # # 'キーボードから日付を読み込んで、その次の日を求める' :- 'キーボードから日付を読み込んで'(_日付文字列), その次の日を求める(_日付文字列,_次の日文字列), writef('次の日は:%t\n',[_次の日文字列]). 'キーボードから日付を読み込んで'(_日付文字列) :- write('日付を文字列8桁で入力してください : '), get_line(_日付文字列), atom(_日付文字列), atom_length(_日付文字列,8),!. 'キーボードから日付を読み込んで'(_日付文字列) :- 'キーボードから日付を読み込んで'(_日付文字列). その次の日を求める(_日付文字列,_次の日文字列) :- sub_atom(_日付文字列,0,4,_,_年), sub_atom(_日付文字列,4,2,_,_月), sub_atom(_日付文字列,6,2,_,_日), その次の日を求める(_年,_月,_日,_次の日文字列). その次の日を求める(_年,'12','31',_次の日文字列) :- 翌年の一月一日(_年,_次の日文字列),!. その次の日を求める(_年,'02','29',_次の日文字列) :- 同年の三月一日(_年,_次の日文字列),!. その次の日を求める(_年,'02','28',_次の日文字列) :- \+(うるう年(_年)), 同年の三月一日(_年,_次の日文字列),!. その次の日を求める(_年,_月,'31',_次の日文字列) :- 大の月(_月), ここでは12月は除外する(_月), 翌月の一日(_年,_月,_次の文字列),!. その次の日を求める(_年,_月,'30',_次の日文字列) :- 小の月(_月), ここでは2月は除外する(_月), 翌月の一日(_年,_月,_次の日文字列),!. その次の日を求める(_年,_月,_日,_次の日文字列) :- 同年同月の次の日(_年,_月,_日,_次の日文字列). 翌年の一月一日(_年,_翌年の一月一日) :- 翌年(_年,_翌年), atomic_list_concat([_翌年,'0101'],_翌年の一月一日). 同年の三月一日(_年,_同年の三月一日) :- atomic_list_concat([_年,'0301'],_同年の三月一日). 翌月の一日(_年,_月,_翌月の一日) :- 翌月(_月,_翌月), atomic_list_concat([_年,_翌月,'01'],_翌月の一日). 同年同月の次の日(_年,_月,_日,_同年同月の次の日) :- 翌日(_日,_翌日), atomic_list_concat([_年,_月,_翌日],_同年同月の次の日). 大の月(_月) :- member(_月,['01','03','05','07','08','10','12']). 小の月(_月) :- member(_月,['02','04','06','09','11']). ここでは12月は除外する(_月) :- \+(_月 == '12'). ここでは2月は除外する(_月) :- \+(_月 == '02'). うるう年(_年文字列) :- atom(_年文字列), atom_number(_年文字列,_年整数), !, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 翌年(_年,_翌年) :- atom_number(_年,_年整数), _翌年整数 is _年整数 + 1, 頭部零文字列に変換(4,_翌年整数,_翌年). 翌月('01','02'). 翌月('02','03'). 翌月('03','04'). 翌月('04','05'). 翌月('05','06'). 翌月('06','07'). 翌月('07','08'). 翌月('08','09'). 翌月('09','10'). 翌月('10','11'). 翌月('11','12'). 翌月('12','01'). 翌日('01','02'). 翌日('02','03'). 翌日('03','04'). 翌日('04','05'). 翌日('05','06'). 翌日('06','07'). 翌日('07','08'). 翌日('08','09'). 翌日('09','10'). 翌日('10','11'). 翌日('11','12'). 翌日('12','13'). 翌日('13','14'). 翌日('14','15'). 翌日('15','16'). 翌日('16','17'). 翌日('17','18'). 翌日('18','19'). 翌日('19','20'). 翌日('20','21'). 翌日('21','22'). 翌日('22','23'). 翌日('23','24'). 翌日('24','25'). 翌日('25','26'). 翌日('26','27'). 翌日('27','28'). 翌日('28','29'). 翌日('29','30'). 翌日('30','31'). 翌日('31','01'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/641 # # [1] C言語 # [2] http://ime.nu/ideone.com/m8dZRの関数を利用して、 #   キーボードから日付を読み込んで、その次の日を求める #   プログラムを作成しなさい。 # # 実行例 # --------------------- # 年月日:20120913 # # 次の日は:2012/09/14 # --------------------- # # [3.1] Windows7 # [3.3] C言語 # [4] 9/13 19:00まで # # 'キーボードから日付を読み込んで、その次の日を求める' :- 'キーボードから日付を読み込んで'(_日付文字列), その次の日(_日付文字列,_次の日文字列), writef('次の日は:%t\n',[_次の日文字列]). 'キーボードから日付を読み込んで'(_日付文字列) :- write('日付を文字列8桁で入力してください : '), get_line(_日付文字列), atom(_日付文字列), atom_length(_日付文字列,8),!. 'キーボードから日付を読み込んで'(_日付文字列) :- 'キーボードから日付を読み込んで'(_日付文字列). その次の日(_日付文字列,_次の日文字列) :- sub_atom(_日付文字列,4,4,0,'1231'), 翌年の一月一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 二月(_日付文字列), うるう年(_日付文字列), 二十九日(_日付文字列), 同年の三月一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 二月(_日付文字列), \+(うるう年(_日付文字列)), 二十八日(_日付文字列), 同年の三月一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 大の月(_日付文字列), 三十一日(_日付文字列), 翌月の一日(_日付文字列,_次の文字列). その次の日(_日付文字列,_次の日文字列) :- 小の月(_日付文字列), 三十日(_日付文字列), 翌月の一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 同年同月の次の日(_日付文字列,_次の日文字列). 翌年の一月一日(_日付文字列,_翌年の一月一日) :- sub_atom(_日付文字列,0,4,_,_年), 翌年(_年,_翌年), atomic_list_concat([_翌年,'0101'],_翌年の一月一日). 同年の三月一日(_日付文字列,_同年の三月一日) :- sub_atom(_日付文字列,0,4,_,_年), atomic_list_concat([_年,'0301'],_同年の三月一日). 翌月の一日(_日付文字列,_翌月の一日) :- sub_atom(_日付文字列,0,4,_,_年), sub_atom(_日付文字列,4,2,_,_月), 翌月(_月,_翌月), atomic_list_concat([_年,_翌月,'01'],_翌月の一日). 同年同月の次の日(_日付文字列,_同年同月の次の日) :- sub_atom(_日付文字列,0,6,_年月), sub_atom(_日付文字列,6,2,_日), 翌日(_日,_翌日), atomic_list_concat([_年月,_翌日],_同年同月の次の日). 二月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,'02'). 十二月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,'12'). 三十一日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'31'). 三十日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'30'). 二十九日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'29'). 二十八日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'28'). 大の月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,_月), member(_月,['01','03','05','07','08','10','12']), ここでは12月は除外する(_月). 小の月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,_月), member(_月,['02','04','06','09','11']), ここでは2月は除外する(_月). ここでは12月は除外する(_月) :- \+(_月 == '12'). ここでは2月は除外する(_月) :- \+(_月 == '02'). うるう年(_年) :- atom(_年), atom_length(_年,4), atom_number(_年,_年整数), うるう年(_年整数) . うるう年(_日付文字列) :- atom(_日付文字列), atom_length(_日付文字列,8), sub_atom(_日付文字列,0,4,_,_年), atom_number(_年,_年整数), うるう年(_年整数) . うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 翌年(_年,_翌年) :- atom_number(_年,_年整数), _翌年整数 is _年整数 + 1, atom_number(_翌年,_翌年整数). 翌月('01','02'). 翌月('02','03'). 翌月('03','04'). 翌月('04','05'). 翌月('05','06'). 翌月('06','07'). 翌月('07','08'). 翌月('08','09'). 翌月('09','10'). 翌月('10','11'). 翌月('11','12'). 翌月('12','01'). 翌日('01','02'). 翌日('02','03'). 翌日('03','04'). 翌日('04','05'). 翌日('05','06'). 翌日('06','07'). 翌日('07','08'). 翌日('08','09'). 翌日('09','10'). 翌日('10','11'). 翌日('11','12'). 翌日('12','13'). 翌日('13','14'). 翌日('14','15'). 翌日('15','16'). 翌日('16','17'). 翌日('17','18'). 翌日('18','19'). 翌日('19','20'). 翌日('20','21'). 翌日('21','22'). 翌日('22','23'). 翌日('23','24'). 翌日('24','25'). 翌日('25','26'). 翌日('26','27'). 翌日('27','28'). 翌日('28','29'). 翌日('29','30'). 翌日('30','31'). 翌日('31','01'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/473 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/rlR3n # # (問題文)ファイルgifts.datからデータを読み込み、 # 構造体のポインタ配列にデータを格納する。この際、利用する分だけ動的に # メモリを確保する。読み込んだ結果は、gifts.datとは別のファイルに出力せよ。 # (ファイル名は自由)また、入力ファイル名を標準入力から指定できるようにせよ。 # # gifts.dat # # JZK-30 jizake_tsumeawase 4500 # BSP-15 Body_soap_set 3000 # BT-200 Bath_towel_set 2500 # TEA-20 koutya_tsumeawase 5000 # # 実行例: # データ数を入力してください:4 # ファイル名を入力してください:gifts.dat # 表示形式変換後ファイルに出力しました 'ファイルgifts.datからデータを読み込む。読み込んだ結果は、表示形式変換後、gifts.datとは別のファイルに出力する' :- データ数を入力してください(_データ数), ファイル名を入力してください(_ファイル名), 'ファイルgifts.datからデータを読み込む。'(_データ数,LL), 表示形式変換後(LL,_項ならび), '読み込んだ結果は、gifts.datとは別のファイルに出力する'(_ファイル名,_項ならび). ファイル名を入力してください(_ファイル名) :- write('出力ファイル名を入力してください: '), get_line(_ファイル名). データ数を入力してください(_データ数) :- 数を得る(データ数,_データ数). 'ファイルgifts.datからデータを読み込む。'(_データ数,LL) :- open('gifts.dat',read,Instream), 'Instreamからデータを読み込む。'(Instream,_データ数,LL), close(Instream). 'Instreamからデータを読み込む。'(Instream,_データ数,[]) :- at_end_of_stream(Instream),!. 'Instreamからデータを読み込む。'(Instream,0,[]) :- !. 'Instreamからデータを読み込む。'(Instream,N,[L|R]) :- get_split_line(Instream,[' '],L), N_1 is N - 1, 'Instreamからデータを読み込む。'(Instream,N_1,R). 表示形式変換後([],[]). 表示形式変換後([L|R1],[P|R2]) :- P =.. [gifts|L], 表示形式変換後(R1,R2). 'gifts.datとは別のファイルに出力する'(_ファイル名,L) :- open(_ファイル名,write,Outstream), 'gifts.datとは別のOustreamに出力する'(Outstream,L), close(Oustream), write('表示形式変換後ファイルに出力しました\n'). 'gifts.datとは別のOustreamに出力する'(Outstream,L) :- append(_,[P|R],L), writef(Outstream,'%t.\n',[P]), R = []. % 以下のサイトは # 出典:: 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 + _単価 * _数量. get_split_lines(File,_区切り文字列ならび,LL) :- get_lines(File,_行ならび), findall(L,( member(_行,_行ならび), split(_行,_区切り文字列ならび,L)),LL) . get_lines(File,_行ならび) :- open(File,read,Instream), 行入力(Instream,_行), 行入力ならび(Instream,_行ならび), close(Instream). 行入力ならび(Instream,[]) :- at_end_of_stream(Instream),!. 行入力ならび(Instream,[_行|R]) :- 行入力(Instream,_行), 行入力ならび(Instream,R). get_split_line(_区切り文字列ならび,_語彙ならび) :- 行入力(_行), split(_行,_区切り文字列ならび,_語彙ならび). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 行入力(Instream,_行) :- read_line_to_codes(Instream,Codes), atom_codes(_行,Codes). split('',_,[]) :- !. split(_文字列,_区切り文字列ならび,[_前文字列|R]) :- member(_区切り文字列,_区切り文字列ならび), sub_atom(_文字列,_前文字列,_区切り文字列,_後文字列), split(_後文字列,_区切り文字列ならび,R),!. split(_文字列,_区切り文字ならび,[_文字列]) :- \+(member(_文字列,_区切り文字ならび)),!. split(_,_,[]). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1269704830/946 # # # 質問です。メモ帳のデータをfortranで読み込んだ後、指定したデータを掛け算し、 # その合計値を算出したいいのですが、どのようにプログラミングしたらいいでしょうか? # # depth 0, 5 cm P, S, P+S # 1 .000E+00 .121E+06 .121E+06 .000E+00 .859E+06 .859E+06 # 2 .320E+02 .325E+06 .325E+06 .170E+02 .798E+06 .798E+06 # 3 .300E+01 .671E+06 .671E+06 .100E+01 .116E+07 .116E+07 # 4 .247E+05 .173E+07 .175E+07 .120E+05 .160E+07 .161E+07 # 5 .440E+06 .151E+07 .195E+07 .229E+06 .152E+07 .175E+07 # 6 .146E+07 .474E+06 .194E+07 .793E+06 .899E+06 .169E+07 # 7 .253E+07 .124E+06 .266E+07 .143E+07 .763E+06 .219E+07 # 8 .329E+07 .280E+05 .332E+07 .191E+07 .757E+06 .267E+07 # 9 .373E+07 .526E+04 .373E+07 .222E+07 .753E+06 .297E+07 # 10 .391E+07 .315E+04 .392E+07 .239E+07 .732E+06 .312E+07 # 11 .394E+07 .516E+05 .399E+07 .245E+07 .772E+06 .322E+07 # 12 .387E+07 .910E+02 .387E+07 .245E+07 .636E+06 .309E+07 # 13 .375E+07 .480E+02 .375E+07 .242E+07 .583E+06 .300E+07 # ↓ #  ↓ #  ↓ #  400 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 # # 上記のデータの説明をさせていただきます。深さ0cmと5cmのそれぞれにP,S,P+Sという3種類のデータ # が存在し、まず、5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後、 # 5cmのP+Sの行と対応した「1〜400の変更した値」で順番に掛けてその合計を計算するようにプログラミング # したいのですが、うまくできず、困っています。 # (5cmのP+Sのデータは、左から数えて7番目のデータです。.859E+06から始まる行になります。) # # 具体的には、1〜400までの数字をそれぞれ1の場合、(1×50-25)×.859E+06という計算を縦に行っていき、 # (400×50-25)×.000E+00まで計算し、その合計値を算出できるようにプログラミングしたいと考えています。 # # '5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後、5cmのP+Sの行と対応した「1〜400の変更した値」で順番に掛けてその合計を計算する'(_ファイル名,_合計) :- '5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後'(_ファイル名,L), findsum(Y,( nth1(_nth,L,X), Y is _nth * X), _合計). '5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後'(_ファイル名,L) :- get_lines(_ファイル名,[' '],LL), findall(X,( member(L_1,LL), nth1(7,L_1,X_1), X is X_1 * 50 - 25), L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/830 # # 誰か助けて # # 問題1 # はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示するプログラムをex08-02.rbで保存して実行してください. # # 問題2 # 問題1のプログラムは、nilのスロットが指定されると、そのままnilを返します.このときには「そのスロットには文字列はありません.」と表示されるように、書き換えて、ex08-03.rbで保存して実行してください. # # 問題3 # はじめに文字列の値を設定した配列変数の各スロットについて、その文字列の文字数を表示するプログラムをex08-04.rbで保存して実行してください.たとえばstrings=[’dog’,’cat’,’mouse’]の場合、以下のように出力させます. # dogは3文字 # catは3文字 # mouseは5文字 # # 問題4 # はじめに文字列の値を設定した配列変数の各スロットの内容を3回ずつ表示するプログラムをex08-05.rbで保存して実行してください. # # 問題5 # 以下のように入力したいだけの文字列を入力するよう求めて、Enterが押されたらそれを入力した順につなげて1行に出力するプログラムをex08-07.rbで保存して実行してください. # 文字列を入力してください # dog[Enter] # 文字列を入力してください # cat[Enter] # 文字列を入力してください # elephant[Enter] # 文字列を入力してください # [Enter] # あなたの入力した文字列は # dog,cat,elephant # です. # # 問題6 # 問題5のプログラムを、文字列を入力とは逆順に出力するように書き換えたプログラムをex08-08.rbで保存して実行してください. # # 問題7 # 問題5のプログラムを、3文字の文字列のみを出力するように書き換えたプログラムをex08-09.rbで保存して実行してください. # # '問題1: はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示する' :- 入力された数字(_入力された数字), 文字列ならび(_文字列ならび), nth1(_入力された数字,_文字列ならび,_文字列), writef('%t\n',[_文字列]). 入力された数字(_入力された数字) :- 数を得る(数字,_入力された数字). '問題2: はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する' :- 入力された数字(_入力された数字), 文字列ならび(_文字列ならび), nth1(_入力された数字,_文字列ならび,_文字列), 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'(_文字列). 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'('') :- writef('%t\n',['そのスロットには文字列はありません.']). 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'(_文字列) :- \+(_文字列=''), writef('%t\n',[_文字列]). '問題3: はじめに文字列の値を設定した配列変数の各スロットについて、その文字列の文字数を表示する' :- 文字列ならび(_文字列ならび), append(_,[_文字列|R],_文字列ならび), atom_length(_文字列,_文字数), writef('%tの文字数は%t\n',[_文字列,_文字数]), R = []. '問題4: はじめに文字列の値を設定した配列変数の各スロットの内容を3回ずつ表示する' :- 文字列ならび(_文字列ならび), append(_,[_文字列|R],_文字列ならび), writef('%t\n%t\n%t\n',[_文字列,_文字列,_文字列]), R = []. '問題5: 入力したいだけの文字列を入力するよう求めて、Enterが押されたらそれを入力した順につなげて1行に出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), それを入力した順につなげて1行に出力する(_文字列ならび). 文字列を入力する(_文字列) :- writef('%t ',[文字列を入力してください]), get_line(_文字列). 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'('',[]) :- !. 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列,[_文字列|R]) :- 文字列を入力する(_文字列_2), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_2,R). それを入力した順につなげて1行に出力する(_行ならび) :- atomic_list_concat(_行ならび,_表示文字列), writef('%t\n',[_表示文字列]). '問題6: 問題5のプログラムを、文字列を入力とは逆順に出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), reverse(_文字列ならび,_反転した文字列ならび), 各文字列を反転して表示する(_反転した文字列ならび). 各文字列を反転して表示する(_反転した文字列ならび) :- append(_,[_文字列|R],_反転した文字列ならび), 文字列を反転する(_文字列,_反転した文字列), writef('%t\n',[_反転した文字列]), R = []. 文字列を反転する(_文字列,_反転した文字列) :- atom_chars(_文字列,Chars), reverse(Chars,Chars_2), atom_chars(_反転した文字列,Chars_2). '問題7: 問題5のプログラムを、3文字の文字列のみを出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), '入力された文字列のうち3文字の文字列のみを出力する'(_文字列ならび). '入力された文字列のうち3文字の文字列のみを出力する'([]). '入力された文字列のうち3文字の文字列のみを出力する'([_文字列|R]) :- '3文字の文字列のみを出力する'(_文字列), '入力された文字列のうち3文字の文字列のみを出力する'(R). '3文字の文字列のみを出力する'(_文字列) :- atom_length(_文字列,3), writef('%t\n',[_文字列]),!. '3文字の文字列のみを出力する'(_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/825 # # 誰かこれ教えてください… # # 問題1 # 最初に「文字列を入力してください.」と表示して文字列を読みこみ、 # 次に「数字を入力してください.」と表示して数字を読み込み、 # 入力文字列を入力した数字の回数分だけ一行ずつ表示するプログラムを # ex07-3-03.rbで保存して実行してください. # # 問題2 # 問題1で作成したプログラムは、数字の読み込みについてバグがある # 可能性があります(数字でないものが入力されたとき、 # どうなるでしょうか?).もしバグがある場合、 # それを修正したプログラムをex07-3-04.rbで保存して実行してください. # '最初に「文字列を入力してください.」と表示して文字列を読みこみ、次に「数字を入力してください.」と表示して数字を読み込み、入力文字列を入力した数字の回数分だけ一行ずつ表示する' :- '最初に「文字列を入力してください.」と表示して文字列を読みこみ'(_文字列), '次に「数字を入力してください.」と表示して数字を読み込み'(_数字), '入力文字列を入力した数字の回数分だけ一行ずつ表示する'(_文字列,_数字). '最初に「文字列を入力してください.」と表示して文字列を読みこみ'(_文字列) :- '最初に「文字列を入力してください.」と表示して', 文字列を読み込み(_文字列). '最初に「文字列を入力してください.」と表示して' :- write('文字列を入力してください. '). 文字列を読み込み(_文字列) :- get_line(_文字列). '次に「数字を入力してください.」と表示して数字を読み込み'(_数字) :- '次に「数字を入力してください.」と表示して', 数字を読み込み(_数字). '次に「数字を入力してください.」と表示して' :- write('数字を入力してください. '). 数字を読み込み(_数字) :- 数を得る('',_数字). '入力文字列を入力した数字の回数分だけ一行ずつ表示する'(_文字列,_数字) :- between(1,_数字,N), writef('%t\n',[_文字列]), N = _数字. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/816 # # すいません…テキストの問題なのですが何回やってもわかりません # どなたか教えていただけませんか? # # 最初に「文字列を入力してください.」と表示して文字列を読みこみ、 # 次に「確認のため、もう一度入力してください.」と表示して # 再び文字列を読み込み、二つの文字列が同じなら「OK」と表示して終了し、 # 違っている場合は「文字列の照合に失敗しました. # もう一度入力してください」と表示して、照合に成功するまで聞き続けるプログラムをex07-3-02.rbで保存して実行してください. # # # '最初に「文字列を入力してください.」と表示して文字列を読みこみ、次に「確認のため、もう一度入力してください.」と表示して再び文字列を読み込み、二つの文字列が同じなら「OK」と表示して終了し、違っている場合は「文字列の照合に失敗しました. もう一度入力してください」と表示して、照合に成功するまで聞き続ける'(_求める文字列) :- '最初に「文字列を入力してください.」と表示して文字列を読みこみ'(_最初の文字列), '次に「確認のため、もう一度入力してください.」と表示して再び文字列を読み込み'(_確認のための文字列), '二つの文字列が同じなら「OK」と表示して終了し、違っている場合は「文字列の照合に失敗しました. もう一度入力してください」と表示して、照合に成功するまで聞き続ける'(_最初の文字列,_確認のための文字列,_求める文字列). '最初に「文字列を入力してください.」と表示して文字列を読みこみ'(_最初の文字列) :- write('文字列を入力してください. '), get_line(_最初の文字列). '次に「確認のため、もう一度入力してください.」と表示して再び文字列を読み込み'(_確認のための文字列) :- write('確認のため、もう一度入力してください. '), get_line(_確認のための文字列), '二つの文字列が同じなら「OK」と表示して終了し、違っている場合は「文字列の照合に失敗しました. もう一度入力してください」と表示して、照合に成功するまで聞き続ける'(_求める文字列,_求める文字列,_求める文字列) :- write('OK\n'),!. '二つの文字列が同じなら「OK」と表示して終了し、違っている場合は「文字列の照合に失敗しました. もう一度入力してください」と表示して、照合に成功するまで聞き続ける'(_,_,_求める文字列) :- write('文字列の照合に失敗しました. もう一度入力してください\n'), '最初に「文字列を入力してください.」と表示して文字列を読みこみ、次に「確認のため、もう一度入力してください.」と表示して再び文字列を読み込み、二つの文字列が同じなら「OK」と表示して終了し、違っている場合は「文字列の照合に失敗しました. もう一度入力してください」と表示して、照合に成功するまで聞き続ける'(_求める文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/278 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク) : 起動するとローマ字で姓と名を入力、 # 姓と名の合計ポイントが基本のポイント、姓と名の合計が7の倍数なら最終ポイントは1.5倍、 # 姓と名にl,u,c,k,yが含まれていたら追加で、lとcは1ポイント、他は1ポイント、 # tとbが文字に含まれていた場合3ポイント追加するプログラムの作成 # '起動するとローマ字で姓と名を入力、姓と名の合計ポイントが基本のポイント、姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する。合計点が7の倍数なら最終ポイントは1.5倍にする。' :- 起動するとローマ字で姓と名を入力(_姓,_名), '姓と名の合計ポイントが基本のポイント、姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する。'(_姓,_名,_合計点), '姓と名の合計が7の倍数なら最終ポイントは1.5倍'(_合計点,_最終ポイント), writef('最終ポイントは %t 点です。',[_最終ポイント]). 起動するとローマ字で姓と名を入力(_姓,_名) :- write('ローマ字で姓を入力してください : '), get_line(_姓), write('ローマ字で名を入力してください : '), get_line(_名). '姓と名の合計ポイントが基本のポイント、姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する。'(_姓,_名,_合計点) :- 姓と名の合計ポイントが基本のポイント(_姓,_名,_基本ポイント), '姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する'(_姓,_名,_追加点), _合計点 is _基本ポイント + _追加点. 姓と名の合計ポイントが基本のポイント(_姓,_名,_基本ポイント) :- atomic_list_concat([_姓,_名],_姓名), char_codes(_姓名,Codes), 標準偏差(Codes,_基本ポイント_1), _基本ポイント is truncate(_基本ポイント_1). '姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する'(_姓,_名,_追加点) :- 姓と名にlが含まれていたら1ポイント追加する(_姓,_名,_追加点_1), 姓と名にcが含まれていたら1ポイント追加する(_姓,_名,_追加点_2), 他はどれかが入っていたら1ポイント追加する(_姓,_名,_追加点_3), 姓と名にtとgが含まれていたら3ポイント追加する(_姓,_名,_追加点_4), _追加点 is _追加点_1 + _追加点_2 + _追加点_3 + _追加点_4. 姓と名にlが含まれていたら1ポイント追加する(_姓,_名,1) :- sub_atom(_姓,_,1,_,'l'), sub_atom(_名,_,1,_,'l'),!. 姓と名にlが含まれていたら1ポイント追加する(_,_,0). 姓と名にcが含まれていたら1ポイント追加する(_姓,_名,1) :- sub_atom(_姓,_,1,_,'c'), sub_atom(_名,_,1,_,'c'),!. 姓と名にcが含まれていたら1ポイント追加する(_,_,0). 他はどれかが入っていたら1ポイント追加する(_姓,_名,1) :- member(A,[u,k,y]), sub_atom(_姓,_,1,_,A), sub_atom(_名,_,1,_,A),!. 他はどれかが入っていたら1ポイント追加する(_,_,0). 姓と名にtとgが含まれていたら3ポイント追加する(_姓,_名,3) :- sub_atom(_姓,_,1,_,t), sub_atom(_名,_,1,_,g), sub_atom(_姓,_,1,_,t), sub_atom(_名,_,1,_,g),!. 姓と名にtとgが含まれていたら3ポイント追加する(_,_,0). '姓と名の合計が7の倍数なら最終ポイントは1.5倍'(_点数,_最終ポイント) :- 0 is _点数 mod 7, _最終ポイント is truncate(_点数 * 1.5),!. '姓と名の合計が7の倍数なら最終ポイントは1.5倍'(_点数,_点数). 標準偏差(L,V) :- length(L,N), 相加平均(L,M), 標準偏差(L,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). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0,M). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/107 # # [1] 授業単元:C言語プログラム # [2] 問題文: # 以下のファイルsdata.txtに入っている商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、 # それらの結果を画面表示するとともに、ファイルodata2.txtに書き込むプログラムを作成せよ。 # 但し、以下の内容のデータファイルsdata.txtをemacsであらかじめ作成しておくこと。 # [sdata.txtの内容](商品名、単価、売り上げ個数) # coffee 250 75 # tea 270 52 # milk 300 22 # juice 350 54 # coke 300 36 # 'ファイルsdata.txtに入っている商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、ファイルodata2.txtに書き込む' :- open('sdata.txt',read,Instream), open('odata2.txt',write,Outstream), 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream), close(Outstream), close(Instream). 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream) :- at_end_of_stream(Instream). 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream) :- '商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め'(Instream,_商品名,_単価,_売り上げ個数,_商品別の売上高), 'それらの結果を画面表示するとともに、Outstreamに書き込む'(Outstream,_商品名,_単価,_売り上げ個数,_商品別の売上高), 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream). '商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め'(Instream,_商品名,_単価,_売り上げ個数,_商品別の売上高) :- get_line(Instream,Line), split(Line,[' '],[_商品名,_単価,_売り上げ個数]), _商品別の売上高 is _単価 * _売上個数. 'それらの結果を画面表示するとともに、Outstreamに書き込む'(Outstream,_商品名,_単価,_売り上げ個数,_商品別の売上高) :- writef('%t %t %t %t\n',[_商品名,_単価,_売り上げ個数,_商品別の売上高]), writef(Outstream,'%t %t %t %t\n',[_商品名,_単価,_売り上げ個数,_商品別の売上高]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/90 # # 助けてください! # C言語の課題です。 # # 「自分のフルネームをアルファベット小文字で入力し、そのアスキーコードを、10進数で求めて平均、分散、標準偏差を表示」 # を表すソースを教えてください。 # '自分のフルネームをアルファベット小文字で入力し、そのアスキーコードを、10進数で求めて平均、分散、標準偏差を表示' :- 自分のフルネームをアルファベット小文字で入力し(_自分のフルネーム), 'そのアスキーコードを、10進数で求めて'(_自分のフルネーム,_自分のフルネームのアスキーコードならび), '平均、分散、標準偏差を表示'(_自分のフルネームのアスキーコードならび). 自分のフルネームをアルファベット小文字で入力し(_自分のフルネーム) :- write('自分のフルネームをアルファベット小文字で入力してください : '), get_line(_自分のフルネーム). 'そのアスキーコードを、10進数で求めて'(_自分のフルネーム,_自分のフルネームのアスキーコードならび) :- atom_codes(_自分のフルネーム,_自分のフルネームのアスキーコードならび). '平均、分散、標準偏差を表示'(_自分のフルネーム,_自分のフルネームのアスキーコードならび) :- 相加平均(_自分のフルネームのアスキーコードならび,_相加平均), 分散(_自分のフルネームのアスキーコードならび,_分散), 標準偏差(_自分のフルネームのアスキーコードならび,_標準偏差), writef('自分のフルネーム = %t, 自分のフルネームのアスキーコード = %t, 平均 = %t, 分散 = %t, 標準偏差 = %t\n',[_自分のフルネーム,_自分のフルネームのアスキーコードならび,_平均,_分散,_標準偏差]). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0,M). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 分散(L,V) :- length(L,N), 相加平均(L,M), 分散(L,N,M,0.0,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). 標準偏差(L,V) :- length(L,N), 相加平均(L,M), 標準偏差(L,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/1342966104/71 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/TO8Kg 問題です。 # http://ime.nu/ideone.com/ZvUuR 課題を提出したら関数の定義 #              をしろといわれました。 # http://ime.nu/ideone.com/Nd5ir 自分なりにやったのですが #              ここからができませんでしたので #              よろしくお願いします。 # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙するプログラムkadai12.c を書きなさい。ただしファイル名は画面から入力されるものとする(scanf()を使う)。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分からないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)/(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。ただしファイル名は画面から入力されるものとする。' :- '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL), 'BMI値を計算し'(LL,LL1), 'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1). '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL) :- write('データファイル名を入力してください : '), get_line(_データファイル名), get_split_lines(_データファイル名,[' ',','],LL). 'BMI値を計算し'(LL1,LL2) :- findall([_BMI値,_氏名],( member([_氏名,_身長,_体重],LL1), 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値)), LL2). /* 'BMI値を計算し'([],[]). 'BMI値を計算し'([[_氏名,_身長,_体重]|R1],[[_BMI値,_氏名]|R2]) :- 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値), 'BMI値を計算し'(R1,R2). */ 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値) :- _BMI値 is _体重 / _身長 ^ 2. 'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1) :- 'BMI値が大きいもの順に'(LL1,LL3), その人のBMI値および肥満か否かを列挙する(LL3). 'BMI値が大きいもの順に'(LL1,LL3) :- sort(LL1,LL2), reverse(LL2,LL3). その人のBMI値および肥満か否かを列挙する(LL3) :- append(_,[[_BMI値,_氏名]|R],LL3), 'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,_肥満判定), writef('%t は %t。\n',[_氏名,_肥満判定]), R = []. 'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,肥満です) :- _BMI値 > 25.0,!. 'このBMI値が25を越えると、肥満とみなされる。'(_,肥満ではない). % 以下のサイトは # 出典 :: # [1] 授業単元: # [2] 問題文(含コード&リンク): # 試合で自分のチームが勝つ・負ける・引き分けるの予想を、10人に予想してもらってプログラムに入力する。 # 予想した人が男性の場合は M を入力し、女性の場合は W を入力する。 # 勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。 # それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し表示するプログラムを、 # # 構造体 # struct datatype # { # char sex;// 男女の性別、男性 M、女性 W # int expectation;// 勝ち 1、負け 2、引き分け 0 # } # # を利用して作成せよ # '試合で自分のチームが勝つ・負ける・引き分けるの予想を、10人に予想してもらってプログラムに入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。 それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し表示する' :- '試合で自分のチームが勝つ・負ける・引き分けるの予想を、10人に予想してもらってプログラムに入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。'(_10人の予想ならび), 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し表示する'(_10人の予想ならび). '試合で自分のチームが勝つ・負ける・引き分けるの予想を、10人に予想してもらってプログラムに入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。'(_10人の予想ならび) :- findnsols([_性別,_予想],10,( '予想を入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。'(_性別,_予想)),_10人の予想ならび),!. '予想を入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。'(_性別,_予想) :- write('性別を入力してください(M or F) : '), 行入力(_性別), 整数を得る('勝ち=1, 負け=2, 引き分け=0 を入力してください',between(0,2,_予想),_予想). 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し表示する'(_10人の予想ならび) :- 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し'(_10人の予想ならび,_予想結果ならび), 表示する(_予想結果ならび). 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し'(_10人の予想ならび,_予想結果ならび) :- findall([_性別,_勝ち合計,_引き分け合計,_負け合計],( '男女別に「 勝ち1・引き分け0・負け2 」を集計し'(_性別,_勝ち合計,_引き分け合計,_負け合計)),_予想結果ならび). '男女別に「 勝ち1・引き分け0・負け2 」を集計し'(_性別,_勝ち合計,_引き分け合計,_負け合計) :- 男女別に(_性別), '「 勝ち1・引き分け0・負け2 」を集計し'(_性別,_勝ち合計,_引き分け合計,_負け合計). 男女別に(_性別):- member(_性別,['M','F']). '「 勝ち1・引き分け0・負け2 」を集計し'(_性別,_勝ち合計,_引き分け合計,_負け合計) :- 勝ち1合計(_10人の予想ならび,_性別,_勝ち合計), 引き分け0合計(_10人の予想ならび,_性別,_引き分け合計), 負け2合計(_10人の予想ならび,_性別,_負け合計). 勝ち1合計(_10人の予想ならび,_性別,_勝ち):- 度数(member([_性別,1],_10人の予想ならび),_勝ち). 引き分け0合計(_10人の予想ならび,_性別,_引き分け):- 度数(member([_性別,0],_10人の予想ならび),_引き分け). 負け2合計(_10人の予想ならび,_性別,_負け):- 度数(member([_性別,2],_10人の予想ならび),_負け). 表示する(_予想結果ならび):- forall(member([_性別,_勝ち,_引き分け,_負け]_予想結果ならび), writef('%w 勝ち=%w,引き分け=%w,負け=%w\n',[_性別,_勝ち,_引き分け,_負け])). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). % 整数を得る/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/930 # # ・DBMS名とバージョン # SQLite3 # ・テーブルデータ # tbl1 tid(auto), name(text) # tbl2 tid(int), sid(int) # tbl3 sid(auto), tag(text),type(int) # # ざっとこんな感じでnameに対して複数のタグを持っている # といった感じのテーブルに対して、データを入れたいと思っています。 # で、バックアップがCSVで「name,tag...」という形式で大量にあるのですが、 # タグテーブルに無ければ追加、名前テーブルに追記、連結データを追加、 # と手数が思ってた以上に多いので、 # 挿入の手数をもう少し減らせる手段とかありませんか? # 'バックアップがCSV(「name,tag...」)の情報を追加する'(_バックアップCSVファイル) :- open(_バックアップCSVファイル,read,Instream), 'Instreamの情報を追加する'(Instream), close(Instream). 'Instreamの情報を追加する'(Instream) :- at_end_of_stream(Instream). 'Instreamの情報を追加する'(Instream) :- get_line(Instream,Line), split(Line,[','],[_name|_tagならび]), テーブルに追加する(_name,_tagならび), 'Instreamの情報を追加する'(Instream). テーブルに追加する(_name,_tagならび) :- tbl1(_tid,_name), 'tag情報をtbl3とtbl2に追加する'(_tid,_tagならび),!. テーブルに追加する(_name,_tagならび) :- \+(tbl1(_tid,_name)), 新しいtidを取得する(_tid), assertz(tbl1(_tid,_name)), 'tag情報をtbl3とtbl2に追加する'(_tid,_tagならび). 'tag情報をtbl3とtbl2に追加する'(_tid,_tagならび) :- append(_,[_tag|R],_tagならび), 新しいsidを取得する(_sid), assertz(tbl3(_sid,_tag)), assertz(tbl2(_tid,_sid)), R = [],!. 新しいtidを取得する(_tid) :- repeat, _tid is random(99999999) + 1, \+(tbl1(_tid,_)),!. 新しいsidを取得する(_sid) :- repeat, _sid is random(99999999) + 1, \+(tbl3(_sid,_)),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/958 # # [1] 授業単元:C言語 # [2] 問題文: # http://ime.nu/codepad.org/zTp80Rtc # #include # struct STUDENT # { # char name[20]; # int aen1; # int aen2; # int aen3; # int aenf; # }; # # void tensyori(struct STUDENT *x); # int main(void) # { # struct STUDENT a = {"sanaka", 70, 65, 80, 0}; # tensyori(&a); # printf("氏名=%s 得点=%d",a.name, a.tenf); # } # # void tensyori(struct STUDENT *x) # { # x->tenf=x->ten1; # } # 上記のリストは、3回の試験を行って最もよい得点を最終的な得点とする処理を行うプログラムであるが、最終的な得点を求めるtensyori関数がまだ未完成である。 # tensyori関数の処理を追加して、上記のプログラムを完成せよ。 # '3回の試験を行って最もよい得点を最終的な得点を求める'(_最終的な得点) :- write('氏名を入力してください : '), get_line(氏名), length(Ln,3), '3回の試験を行って最もよい得点を最終的な得点を求める'(Ln,0,_最終的な得点). '3回の試験を行って最もよい得点を最終的な得点を求める'([],_最終的な得点,_最終的な得点). '3回の試験を行って最もよい得点を最終的な得点を求める'([_|Ln],_前回までで一番よい得点,_最終的な得点) :- 数を得る(得点,_得点), 最もよい得点(_得点,_前回までで一番よい得点,_最もよい得点), '3回の試験を行って最もよい得点を最終的な得点を求める'(Ln,_最もよい得点,_最終的な得点). 最もよい得点(_得点,_前回までで一番よい得点,_得点) :- _得点 @>_前回までで一番よい得点,!. 最もよい得点(_得点,_前回までで一番よい得点,_前回までで一番よい得点). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/935 # # [1] 授業単元:C言語演習 # [2] 問題文: # 学生の英語、国語、数学の合計の得点データを処理するために、次のようなデータ型と名前のメンバを持つ構造体を考える。 #  氏名 : 文字型 name[20] #  英語得点 : 整数型 eigo #  国語得点 : 整数型 kokugo #  数学 : 整数型 sugaku # SCORE型の構造体配列data[5]を宣言せよ。 # そしてキーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると、最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力するプログラムを作成せよ。 # <データ例> # 番号 氏名 英語得点 国語得点 数学得点 # 1  nakashima 75   70    75 # 2  takada  85   65    70 # 3  arita   80   80    80 # 4  shimane  65   75    55 # 5  hirakata 70   77    90 # <出力例> # 英語 takada 85 # 国語 arita 80 # 数学 hirakata 90 # 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると、最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する' :- length(Ln,5), 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'(Ln), '最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する'. 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'([]). 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'([_|Ln]) :- 'データ(番号、氏名、各教科の得点)を入力すると', 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'(Ln). 'データ(番号、氏名、各教科の得点)を入力すると' :- 変数XXを得る(XX), 整数を得る(番号,_番号), 氏名を得る(_氏名), 各教科の得点を得る(_英語の得点,_国語の得点,_数学の得点), 成績を定義する(XX,_番号,_氏名,_英語の得点,_国語の得点,_数学の得点). 氏名を得る(_氏名) :- write('氏名 : '), get_line(_氏名). 各教科の得点を得る(_英語の得点,_国語の得点,_数学の得点) :- 整数を得る(英語得点,_英語得点), 整数を得る(国語得点,_国語得点), 整数を得る(数学得点,_数学得点). '最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する' :- append(_,[_教科|R],[英語,国語,数学]), 教科の最高得点を得る(_教科,_氏名,_最高得点), writef('%t の最高得点者は %t 得点は %t\n',[_教科,_氏名,_最高得点]). R = []. 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点) :- assertz(成績(_XX,番号,_番号)), assertz(成績(_XX,氏名,_氏名)), assertz(成績(_XX,英語,_英語得点)), assertz(成績(_XX,国語,_国語得点)), assertz(成績(_XX,数学,_数学得点)),!. 教科の最高得点を得る(_教科,_氏名,_最高得点) :- findmax([_得点,_氏名],( 成績(XX,_教科,_得点), 成績(XX,氏名,_氏名)), _最高得点). 変数xxを得る(_XX) :- N is random(99999999) + 1, 整数から文字列(8,N,A), atomic_list_concat([x,A],_XX), \+(成績(_XX,番号,_)),!. 変数xxを得る(_XX) :- 変数xxを得る(_XX). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/924 # # [1] 授業単元:C言語 # [2] 問題文: # 学生の英語、国語、数学の合計の得点データを処理するために、次のようなデータ型と名前のメンバを持つSCORE型構造体を考える。 # 学籍番号:整数型 number # 氏名:文字型 name[20] # 英語得点:整数型 eigo # 国語得点:整数型 kokugo # 数学得点:整数型 sugaku # 合計得点:整数型 goukei # SCORE型の2つの構造体変数x1,x2を宣言せよ。 # そしてキーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力されるプログラムを作成せよ。 # <データ例> # 変数 番号 氏名 英語得点 国語得点 数学得点 # x1  1  nakashima 75  80    75 # x2  2  takada  77   82    70 # <出力列> # nakashima 230 # 'キーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力される' :- 'キーボードから番号、氏名、各教科の得点を入力すると', '英語、国語、数学の3教科の合計点が計算され'(_合計点_番号ならび), '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび). 'キーボードから番号、氏名、各教科の得点を入力すると' :- 一人分の成績を定義する, 'キーボードから番号、氏名、各教科の得点を入力すると'. 'キーボードから番号、氏名、各教科の得点を入力すると'. 一人分の成績を定義する :- 番号を得る(_番号), 氏名を得る(_氏名), 各教科の得点を得る(_英語得点,_国語得点,_数学得点), 成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点). 番号を得る(_番号) :- 整数を得る(番号,_番号),!, \+(_番号==0). 氏名を得る(_氏名) :- write('氏名を入力してください : '), get_line(_氏名). 各教科の得点を得る(_英語得点,_国語得点,_数学得点) :- 整数を得る(英語得点,_英語得点), 整数を得る(国語得点,_国語得点), 整数を得る(数学得点,_数学得点). 成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点) :- 変数xxを得る(_XX), 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点). 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点) :- assertz(成績(_XX,番号,_番号)), assertz(成績(_XX,氏名,_氏名)), assertz(成績(_XX,英語成績,_英語成績)), assertz(成績(_XX,国語成績,_国語成績)), assertz(成績(_XX,数学成績,_数学成績)),!. 変数xxを得る(_XX) :- N is random(99999999) + 1, 整数から文字列(8,N,A), atomic_list_concat([x,A],_XX), \+(成績(_XX,番号,_)),!. 変数xxを得る(_XX) :- 変数xxを得る(_XX). '英語、国語、数学の3教科の合計点が計算され'(_合計点_変数番号ならび) :- setof(_XX,[_XX,_番号] ^ ( 成績(_XX,番号,_番号)),_XXならび), findall([_合計点,_XX],( member(_XX,_XXならび), 合計点を計算する(_XX,_合計点)),_合計点_変数番号ならび). 合計点を計算する(_XX,_合計点) :- 成績(_XX,英語成績,_英語成績), 成績(_XX,国語成績,_国語成績), 成績(_XX,数学成績,_数学成績), _合計点 is _英語成績 + _国語成績 + _数学成績. '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび) :- sort(_合計点_番号ならび,_整列された合計点_番号ならび), reverse(_整列された合計点_番号ならび,_降順に整列された合計点_番号ならび), _整列された合計点_番号ならび = [[_合計点,_XX]|_], 成績(_XX,氏名,_氏名), writef('合計点が高い方は %t で合計点 %t 点です。\n',[_氏名,_合計点]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/915 # # [1] 授業単元:C言語 # [2] 問題文: # ある地域の書数言語を調べたところ、その言語では数が五進法で表されており # また我々が使う数字の0〜4に対応する記号としてアルファベットのr,h,f,m,yによく似た形の文字が使われていることが分かった。 # この表記法で表された五進数をキーボードから文字列として受け取り、我々のの十進法表記に変換して表示するプログラムを作成せよ # 例えばキーボードから「rfym」という文字列(我々の表記では0423という五進数)を受け取った場合、 # これを「73」という十進法に変換し、画面に表示できればよい。ただし、受け取る五進数は4桁以下の非負正数(十進法の0〜624)であると仮定する。 # なお、この問題では以下のquin2dec()を作成しそれを用いて前記の処理を行うこと。 # ・4つの文字を因数として受けとる # ・受け取った4文字中r,h,f,m,y以外の文字が一文字でも含まれた場合エラーメッセージを出してプログラムを終了する。 # ・4文字をそれぞれ五進数の各桁の値と考え、それから定まる4桁の五進数を十進法整数値に変換する。 # ・前記の十進法整数値を戻り値として返す # ただし変換結果の画面表示はquin2dec()関数中ではなくmain()関数中で行うこと # # ある地域の書数表記文字(r,0). ある地域の書数表記文字(h,1). ある地域の書数表記文字(f,2). ある地域の書数表記文字(m,3). ある地域の書数表記文字(y,4). 'ある地域の書数表記法で表された五進数をキーボードから文字列として受け取り、我々の十進法表記に変換して表示する' :- 'ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列), ある地域の書数表記法による五進数表記文字列を我々の十進数表記文字列に変換(_五進数表記文字列,_十進数表記文字列), writef('%五進数表記 = %t, 我々の十進数表記 = %t\n',[_五進数表記文字列,_十進数表記文字列]). 'ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列) :- write('ある地域の書数言語表記法で表された五進数を入力してください : '), get_line(Line), '診断: ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(Line,_五進数表記文字列),!. 'ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列) :- 'ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列). '診断: ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(Line,_五進数表記文字列) :- sub_atom(Line,_,1,_,_文字), \+(ある地域の書数表記文字(_文字,_)),!, fail. '診断: ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列,_五進数表記文字列). ある地域の書数表記法による五進数表記文字列を我々の十進数表記文字列に変換(_五進数表記文字ならび,0,_十進数表記文字列) :- 五進数表記文字列を文字ならびに変換(_五進数表記文字列,_五進数表記文字ならび), ある地域の書数表記法による五進数文字ならびを十進数に変換(_五進数表記文字ならび,[],_十進数), 十進数を十進数表記文字列に変換(_十進数表記文字列,_十進数). 五進数表記文字列を文字ならびに変換(_五進数表記文字列,_五進数表記文字ならび) :- atom_chars(_五進数表記,_五進数表記文字ならび). ある地域の書数表記法による五進数文字ならびを十進数に変換([],_十進数,_十進数). ある地域の書数表記法による五進数文字ならびを十進数に変換([A|R1],Y_1,X) :- ある地域の書数表記文字(A,N), Y_2 is Y_1 * 5 + N, ある地域の書数表記法による五進数文字ならびを十進数に変換(R1,Y_2,X). 十進数を十進数表記文字列に変換(_十進数表記文字列,_十進数) :- atom_number(_十進数表記文字列,_十進数). % 以下のサイトは # 出典 :: 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/1339338438/872 # # [1] 授業単元: C言語 # [2] 問題文: # 簡単な暗号化関数の作成 # 英文字を第1引数、正整数値のシフト幅nを第2引数として受け取り、第一 # 引数をASC競魁璽匹韮遒蘯分先に進めた文字を返す関数を作成せよ。 # たとえば第1引数が'b'(十進数の98)、第2引数6であった場合は戻り値は'h'(十進数の104)となる。 #  ただし、大文字を進めた場合に'z'より大きくなる場合には'A'に折り返す。たとえば、'W'を指定し # た場合は'C'が戻り値となる。小文字についても同様に、'z'を超える場合は'a'に折り返す。また、英大 # 文字・小文字以外が第一引数に与えられた場合は、第1引数をそのまま戻り値とする。 #  このような関数をcharshift()という名前で作成した上で、この関数を用いて以下の機能を持つプログ # ラムを作成せよ。 # # 「最初にキーボードから80文字以内の英文を1行入力し、次に正整数のシフト幅を入力する。 # そして、英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を1行に # 出力する」 # # このプログラムでは以下のような結果が得られる # Input English words. # UDU was established in 1907. (←キーボードからの入力) # Input shift number. # 6 (←キーボードからの入力) # AJA cgy kyzghroynkj ot 1907. # '英文字を第1引数、正整数値のシフト幅nを第2引数として受け取り、第一引数をASCIIコードでn進めた文字を返す'(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字) :- charsshift(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字). charsshift(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字) :- member(L,[[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']]), nth0(_nth0,L,_文字), _シフト is 26 + _シフト幅n - _nth0, ならびの回転(左方向,_シフト,L,_第一引数をASCIIコードでn進めた文字),!. '最初にキーボードから80文字以内の英文を1行入力し、次に正整数のシフト幅を入力する。そして、英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を1行に出力する' '最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文), '次に正整数のシフト幅を入力する'(_シフト幅), '英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を'(_80文字以内の文字列,_シフト幅,_変換された文字列), 一行で出力する(_変換された文字列). '最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文) :- get_line(_文字列), '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_文字列,_80文字以内の英文),!. '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_文字列,_80文字以内の英文) :- sub_atom(_文字列,0,80,_,_80文字以内の英文),!. '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文,_80文字以内の英文). '次に正整数のシフト幅を入力する'(_シフト幅) :- 整数を得る(正整数のシフト幅,_シフト幅). '英文字のすべての文字を指定されたシフト幅だけcharsshiftで変換した文字列を'(_80文字以内の文字列,_シフト幅,_変換された文字列) :- findall(_変換された文字,( sub_atom(_80文字以内の英文,_,1,_,_英文字), charsshift(_英文字,_シフト幅,_変換された文字)), _変換された文字ならび), atomic_list_concat(_変換された文字ならび,_変換された文字列). 一行で出力する(_変換された文字列) :- writef('%t\n',[_変換された文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/855 # # [1] 授業単元:C言語 # [2] 問題文: # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ。 # <実行例> # 文字列を入力せよ:one-two-three-four # three-four # # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ :- 入力された文字列で(_文字列), '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列), 表示せよ(_2つ目のハイフン以降の文字列). 入力された文字列で(_文字列) :- get_line(_文字列). '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列) :- atom_chars(_文字列,_文字ならび), '2つ目のハイフン以降の文字列だけを'(0,_文字列ならび,0,_2つ目のハイフン以降の文字ならび), atom_chars(_2つ目のハイフン以降の文字列,_2つ目のハイフン以降の文字ならび). '2つ目のハイフン以降の文字列だけを'(_文字列ならび,2,_文字列ならび) :- !. '2つ目のハイフン以降の文字列だけを'(['-'|R1],_度数_1,_2つ目のハイフン以降の文字列) :- _度数_2 is _度数_1 + 1, '2つ目のハイフン以降の文字列だけを'(R1,_度数_2,_2つ目のハイフン以降の文字列). '2つ目のハイフン以降の文字列だけを'([_|R1],_度数_1,_2つ目のハイフン以降の文字列) :- '2つ目のハイフン以降の文字列だけを'(R1,_度数_2,_2つ目のハイフン以降の文字列). 表示せよ(_2つ目のハイフン以降の文字列) :- writef('%t\n',[_2つ目のハイフン以降の文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/855 # # [1] 授業単元:C言語 # [2] 問題文: # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ。 # <実行例> # 文字列を入力せよ:one-two-three-four # three-four # # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ :- 入力された文字列で(_文字列), '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列), 表示せよ(_2つ目のハイフン以降の文字列). 入力された文字列で(_文字列) :- get_line(_文字列). '2つ目のハイフン以降の文字列だけ'(_文字列,_2つ目のハイフン以降の文字列) :- '2つ目のハイフン'(_文字列,_残り文字ならび), atom_chars(_2つ目のハイフン以降の文字列,_残り文字ならび),!. '2つ目のハイフン'(_文字列,_残りならび) :- atom_chars(_文字列,_文字ならび), append(L1,['-'|_残り文字ならび],_文字ならび), member('-',L1),!. 以降の文字列だけ(_残り文字ならび,_2つ目のハイフン以降の文字列) :- atom_chars(_2つ目のハイフン以降の文字列,_残り文字ならび). 表示せよ(_2つ目のハイフン以降の文字列) :- writef('%t\n',[_2つ目のハイフン以降の文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/855 # # [1] 授業単元:C言語 # [2] 問題文: # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ。 # <実行例> # 文字列を入力せよ:one-two-three-four # three-four # # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ :- 入力された文字列で(_文字列), '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列), 表示せよ(_2つ目のハイフン以降の文字列),!. 入力された文字列で(_文字列) :- get_line(_文字列). '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列) :- '2つ目のハイフン'(_文字列,_2つ目のハイフンの位置), 以降の文字列だけを(_文字列,_2つ目のハイフン以降の文字列). '2つ目のハイフン'(_文字列,_2つ目のハイフンの位置) :- sub_atom(_文字列,0,_2つ目のハイフンの位置,_,_副文字列), count(sub_atom(_副文字列,_,1,_,'-'),2),!. 以降の文字列だけを(_文字列,_2つ目のハイフンの位置,_2つ目のハイフン以降の文字列) :- _2つ目のハイフンの次の位置 is _2つ目のハイフンの位置 + 1, sub_atom(_文字列,_2つ目のハイフンの次の位置,_,0,_2つ目のハイフン以降の文字列),!. 表示せよ(_2つ目のハイフン以降の文字列) :- writef('%t\n',[_2つ目のハイフン以降の文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/855 # # [1] 授業単元:C言語 # [2] 問題文: # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ。 # <実行例> # 文字列を入力せよ:one-two-three-four # three-four # # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ :- 入力された文字列で(_文字列), '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列), 表示せよ(_2つ目のハイフン以降の文字列),!. 入力された文字列で(_文字列) :- get_line(_文字列). '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列) :- '2つ目のハイフン'(_文字列,_2つ目のハイフンの位置), 以降の文字列だけを(_文字列,_2つ目のハイフンの位置,_2つ目のハイフン以降の文字列). '2つ目のハイフン'(_文字列,_2つ目のハイフンの位置) :- sub_atom(_文字列,_1つ目のハイフンの位置,1,_,'-'), sub_atom(_文字列,_2つ目のハイフンの位置,1,_,'-'), _2つ目のハイフンの位置 > _1つ目のハイフンの位置,!. 以降の文字列だけを(_文字列,_2つ目のハイフンの位置,_2つ目のハイフン以降の文字列) :- sub_atom(_文字列,_2つ目のハイフンの位置+1,_,0,_2つ目のハイフン以降の文字列). 表示せよ(_2つ目のハイフン以降の文字列) :- writef('%t\n',[_2つ目のハイフン以降の文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/849 # # [1] 授業単元: プログラミング # [2] 問題文: # 1文字を引数として受け取り、AならばZ,BならばY,aならばz,bならばy,0ならば9,1ならば8 # というように入れ替えた文字を戻り値とする関数をsymmetry()という名前で作成する。 # キーボードから80文字以内の英文を1行入力し、1行の全ての文字をsymmetry()で変換した # 文字列を1行に表示する。同じ操作を更にもう一度繰り返し、結果的に入力された英文と # 同じ文字列が表示されるようにする。 # 例:I was born in 1956.と打ち込んだ場合、R dzh ylim rm 8043.と表示されるようにする。 # 'キーボードから80文字以内の英文を1行入力し、1行の全ての文字をsymmetry述語で変換した文字列を1行に表示する。' :- 'キーボードから80文字以内の英文を1行入力し、'(_80文字以内の文字列), '1行の全ての文字をsymmetry述語で変換した文字列を'(_80文字以内の文字列,_変換した文字列), 表示する(_変換した文字列). 'キーボードから80文字以内の英文を1行入力し、'(_80文字以内の文字列) :- get_line(_文字列), '80文字以内の'(_文字列,_80文字以内の文字列). '80文字以内の'(_文字列,_80文字以内の文字列) :- sub_atom(_文字列,0,80,_,_80文字以内の文字列),!. '80文字以内の'(_文字列,_文字列). '1行の全ての文字をsymmetry述語で変換した文字列を'(_80文字以内の文字列,_変換した文字列) :- findall(_暗号文字,( sub_atom(_80文字以内の文字列,_,1,_,_文字), symmetry(_文字,_暗号文字)), _変換した文字ならび), atom_chars(_変換した文字列,_変換した文字ならび). 表示する(_変換した文字列) :- writef('%t\n',[_変換した文字列]). symmetry(_文字,_暗号文字) :- 暗号文字へずらす(_文字,_暗号文字),!. summetry(_文字,_文字). 暗号文字へずらす(_文字,_暗号文字) :- 文字種(_,_文字コード下限,_文字コード上限,L), nth0(_nth0,L,_文字), _シフト数 is _nth0 + (_文字コード上限 - _文字コード下限 + 1) // 2, ならびの回転(左方向,_シフト数,L,[_暗号文字|_]),!. 文字種(英小文字,97,122,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 文字種(英大文字,65,90,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']). 文字種(数字,48,57,['0','1','2','3','4','5','6','7','8','9']). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/827 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/qQfTmJyV # リンク先のコードは分数を読み込み、その分数を約分した結果を表示するものの一部であり、 # このプログラムを完成させよ。ただし、分子と分母に0を入力すると終了する。 # # 実行例 # bunshi:36 # bunbo:48 # 3/4 # bunshi:-12 # bunbo:15 # -4/5 # bunshi:0 # bunbo:0 # # '分数を読み込み、その分数を約分した結果を表示する' :- '分数を読み込み、'(_分数), その分数を約分した結果を(_分数,_約分した結果), 表示する(_分数,_約分した結果). '分数を読み込み、'(_分数) :- 分子を読み込む(_分子), 分母を読み込む(_分母), _分数 = _分子 / _分母. 分子を読み込む(_分子) :- 整数を得る(分子,_分子). 分母はを読み込む(_分母) :- 整数を得る(分母,_分母). その分数を約分した結果を(_分子_1 / _分母_1,_分子 / _分母) :- 最大公約数(_分子_1,_分母_1,_最大公約数), _分子 is _分子_1 // _最大公約数, _分母 is _分母_1 // _最大公約数. 表示する(_分子_1/_分母_1,_分子/_分母) :- writef('入力した分数 %t/%t\n約分した分数 %t/%t\n',[_分子_1,_分母_1,_分子,_分母]). 整数を得る(_催促文,_整数) :- 催促文を表示して整数を得る(_催促文,_整数),!. 整数を得る(_催促文,_整数) :- 整数を得る(_催促文,_整数). 催促文を表示して整数を得る(_催促文,_整数) :- writef('%wを入力して下さい : ',[_催促文]), 整数を得る(_整数). 整数を得る(_整数) :- 行入力(_行), 整数検査(_行,_整数). 行入力(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 整数検査(_行,_整数) :- atom_number(_行,_整数), integer(_整数),!. 整数検査(_行,_) :- writef('入力された %w は整数ではありません。再入力をお願いします。\n',[_行]), fail. 最大公約数をユークリッドの互除法で求める(M,N,_最大公約数) :- ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(M,N,_最大公約数). ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_被除数,_除数,_最大公約数) :- _剰余 is _被除数 mod _除数, 割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_被除数,_除数,_剰余,_最大公約数). 割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_被除数,_除数,0,_最大公約数) :- 割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数),!. 割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_被除数,_除数,_剰余,_最大公約数) :- '割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_被除数,_除数,_剰余,_最大公約数). 割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数) :- _除数 = _最大公約数. '割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_被除数,_除数,_剰余,_最大公約数) :- ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_除数,_剰余,_最大公約数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/188 # # 【課題】以下のようなクラス(名前は各自決める)を定義せよ。 # mainメソッドを呼び出すと、別のスレッドthを生成し、スタートさせる。 # mainメソッドは、プロンプトとして”Command> “を印字し、キーボードからの入力を待つ。 # 入力は、以下のようなadd, removeなどを先頭とするいくつかの文字列で、 # それを何らかの方法でスレッドthに渡し、ふたたび “Command> “を印字して次の入力を待つ。 # Command> add <文字列> # スレッドthでは、mainから受け取った<文字列>の部分を取り出し、 # thの中で管理するLinkedListの要素に加える(add)。一方、 # Command> remove <文字列> とすると該当する文字列をLinkedListから消す。そのほか、 # Command> print とでき、printはLinkedListにある要素をすべて印字し # Command> exit exitはスレッドを停止し、それを待ってmainメソッドを終了する # ものである。 # 上記以外の入力は無視する。 # (ヒント:書き方はたくさんありますが、たとえば前回のProducer Consumerの例を考えてください。 # 片方が生成(入力された文字列をMqueueに格納)、他方がそれを読み出すと考えます。 # もちろんもっと簡単な方法もあると思います。上記の仕様通りに動いていれば正解です。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【GUI】4.制限なし # 【 期限 】 今日(7/14)中 # 【 Ver  】 1.7.0_03 # 【 補足 】宜しくお願いします! # # 影を用いて情報を管理する :- 取り次ぎ(_取り次ぎ), コマンドを得る(_コマンド行), 影を生み出す(影(_取り次ぎ),_影,[]), 影を用いて情報を管理する(_取り次ぎ,_命令). 影を用いて情報を管理する(_取り次ぎ,exit). 影を用いて情報を管理する(_取り次ぎ,コマンド行) :- コマンドを得る(_コマンド_2), thread_send_message(_取り次ぎ,コマンド_2), 影を用いて情報を管理する(_取り次ぎ,コマンド行_2). コマンドを得る(_コマンド行) :- write('コマンド>> '), get_line(_コマンド行). 影(_取り次ぎ) :- 言伝からコマンドを得る(_取り次ぎ,_命令,R), 影(_取り次ぎ,_命令,R,[],L). 影(_取り次ぎ,_命令,_付加情報,L_1,L) :- コマンドの実行(_取り次ぎ,_コマンド,L_1,L_2), 言伝を送る(_取り次ぎ,ok), 言伝からコマンドを得る(_取り次ぎ,_命令_2,_付加情報_2), 影(_取り次ぎ,_命令_2,_付加情報_2,L_2,L). 言伝からコマンドを得る(_取り次ぎ,_命令,R) :- 言伝を取り出す(_取り次ぎ,_言伝,[]), split(_言伝,[' '],[_命令|R]). コマンドの実行(add,[_情報],L_1,[_情報|L_1]). コマンドの実行(delete,[_情報],L_1,L_2) :- ならびから削除(_情報,L_1,L_2). コマンドの実行(print,[],L_1,L_1) :- writef('%t\n',[L_1]). コマンドの実行(_コマンド,_,L_1,L_1) :- writef('%tコマンドは存在しません。\n',[_コマンド]). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. キューを保存する(L) :- tell('キュー保存.pro'), write(L), write('.\n'), told. 影を生み出す(Term,_影,Option) :- thread_create(Term,_影,Option). 影を終わる :- thread_self(_番号), thread_detach(_番号). 取り次ぎ(_取り次ぎ) :- message_queue_create(_取り次ぎ). 言伝を取り出す(_取り次ぎ,_言伝,_限界時間) :- thread_get_message(_取り次ぎ,_言伝,[timeout(_限界時間)]). 言伝を取り出す(_言伝) :- thread_get_message(_言伝). 言伝を送る(_番号,_言伝) :- thread_send_message(_番号,_言伝). 取り次ぎを立てる(_取り次ぎ) :- message_queue_create(_取り次ぎ,[]). 取り次ぎを解消する(_取り次ぎ) :- message_queue_destroy(_取り次ぎ). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/768 # # 数字が並んだテキストファイルからいくつかの数字だけを取り出して # 表示したいです. # 例:hoge.txt # 78 3 44 89 # 22 31 44 88 99 53 # 3 4 7 9 9 7 6 # 例えば上記のテキストデータですと, # 各行の最初の2つの数字以降の数字を取り出して # 表示したいです. # なお,読み込むテキストデータは行も列も不定になっています. # 上記のテキストデータは1行目は4列ですが,他の行は4列とは限りません. # なるべく簡単な関数で書けるとありがたいです. # 環境はvisual studio2010で書いてます. # # 初心者ですみません.よろしくお願いします. # '数値が並んだテキストファイルからいくつかの数値だけを削り残り文字列を取り出して表示する。各行の最初の2つの数値以降の文字列を表示したい'(_テキストファイル) :- 数値が並んだテキストファイルから(_テキストファイル,Lines), 各行の最初の2つの数値以降の文字列を(Lines,Line), 表示したい(Line,_残り行ならび), _残り行ならび = []. 数値が並んだテキストファイルから(_テキストファイル,Lines) :- get_lines(_テキストファイル,Lines). 各行の最初の2つの数値以降の文字列を取り出して(Lines,Line,_残り行ならび) :- append(_,[Line_1|_残り行ならび],Lines), 最初の2つの数値以降の文字列を取り出して(Line_1,Line). 最初の2つの数値以降の数値を取り出して(_文字列,_残り文字列) :- 最初の数値を除く残り文字列(_文字列,_残り文字列_1), 最初の数値を除く残り文字列(_残り文字列_1,_残り文字列),!. 最初の数値を除く残り文字列(_文字列,_残り文字列) :- sub_atom(_文字列,_,_,_,S1,_残り文字列,S3,L1,L2,L3), すべて数字(L2), \+((sub_atom(S3,0,1,_,A),数字(A))),!. 数字(A) :- A @>= '0', A @=< '9'. すべて数字([]). すべて数字([A|R]) :- 数字(A), すべて数字(R). 表示したい(Line) :- writef('%t\n',[Line]). % 以下のサイトは # 出典:: 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/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). % 数を得る % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/573 # # [1] 授業単元: STL # [2] 問題文(含コード&リンク): # 問 二つの値xとyを使用して差を返す関数形式マクロdiff(x,y)を使用し, # キーボードからint型の2つの数値n1とn2を入力した場合に、入力した2つの数値とその差を出力するmain関数のプログラムを作成しなさい。 # 問 四季を表す列挙体seasonを定義し、キーボードから0,1,2,3を入力した場合に、 # それぞれ"Spring", "Summer", "Fall", "Winter"と表示するプログラムを作成しなさい。ただし、enum season {Spring, Summer, Fall, Winter};を使用し、キーボードから0,1,2,3以外の数字が入力された場合には、入力し直す処理を含めなさい。 # 問 数字文字の出現回数の百分率を小数点以下1桁まで求め、 # '*'のグラフと共に表示するmain関数のプログラムを作成しなさい。 # 問 キーボードから入力した行数と空白以外の文字数を求め, # 行数と文字数を表示するmain関数のプログラムを作成しなさい。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。 # 'キーボードから入力した行数と空白以外の文字数を求め,行数と文字数を表示する。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。' :- 'キーボードから入力した'(Lines), '行数と空白以外の文字数を求め'(Lines,_行数,_空白以外の文字数), '行数と文字数を表示する'(_行数,_空白以外の文字数). キーボードから入力した([]) :- at_end_of_stream(user_input). キーボードから入力した([Line|R]) :- get_line(Line), キーボードから入力した(R). 行数と空白以外の文字数を求め(Lines,_行数,_空白以外の文字数) :- length(Lines,_行数), findsum(_一行の中にある空白以外の文字数,( member(_行,Lines), 一行の中にある空白以外の文字数(_行,_一行の中にある空白以外の文字数)), _空白以外の文字数). 一行の中にある空白以外の文字数(Line,_一行の中にある空白以外の文字数) :- count(( sub_atom(Line,_,1,_,_文字), \+(_文字 = ' ')), _一行の中にある空白以外の文字数). '行数と文字数を表示する'(_行数,_空白以外の文字数) :- writef('%t %t\n',[_行数,_空白以外の文字数]). % 以下のサイトは # 出典 :: 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/1339338438/547 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # # 次の表のデータを構造体(shouhin)に格納して、商品コードを入力し、該当する商品が # 見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を # 実行結果のように表示するプログラムを作成せよ。なお該当商品が見つからなかった場合 # のみ「見つかりませんでした」と表示してプログラムを終了する。 # # 商品コード  商品名      価格    販売数 # (code)    (name)      (price)  (number) # fm1     フラッシュメモリ  1500   27 # hu2     ハブ        23000   8 # mo3     マウス       2560   12 # # [実行結果・例] # 商品コードを入力:hu2 # 商品コード  商品名  価格  販売数  販売額 # -------------------------------------------------- # hu2     ハブ   23000   8    184000 # 商品売上(fm1,フラッシュメモリ,1500,27). 商品売上(hu2,ハブ,23000,8). 商品売上(mo3,マウス,2560,12). '商品コードを入力し、該当する商品が見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を実行結果のように表示する。なお該当商品が見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する。' :- 商品コードを入力し(_商品コード), '該当する商品が見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する。'(_商品コード). 商品コードを入力し(_商品コード) :- write('商品コード : '), get_line(_商品コード). '該当する商品が見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する。'(_商品コード) :- '該当する商品が見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を表示する'(_商品コード), 商品コードを入力し(_商品コード_2), '該当する商品が見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する。'(_商品コード_2). '該当する商品が見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する。'(_商品コード) :- '見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する。'(_商品コード),!. '該当する商品が見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を表示する'(_商品コード) :- 商品売上(_商品コード,_商品名,_価格,_販売数), _販売額 is _価格 * _販売数, writef('%10r %10r %10r %10r %10r\n',[_商品のコード,_商品名,_価格,_販売数,_販売額]). '商品コードが見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する。'(_商品コード) :- \+(商品売上(_商品コード,_,_,_)), write('見つかりませんでした\n'),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/478 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 下記の実行結果のように、入力された文字列を構成している個々の文字が # (1) 小文字の英字であるのか # (2) 大文字の英字であるのか # (3) 英字以外であるのか # を判定するプログラムを作成せよ。 # 文字列 input を構成する文字 input[loop] が文字列の終わりで無い事を検証するために、 # while(input[loop] != '\0') を用いてください。 # '入力された文字列を構成している個々の文字が (1) 小文字の英字であるのか (2) 大文字の英字であるのか (3) 英字以外であるのかを判定する'(_文字列,_個々の文字,_判定) :- '入力された文字列を構成している個々の文字が(_文字列,_個々の文字), '(1) 小文字の英字であるのか (2) 大文字の英字であるのか (3) 英字以外であるのかを判定する'(_個々の文字,_判定). 入力された文字列を構成している個々の文字が(_文字列,_個々の文字) :- 入力された文字列を(_文字列), 構成している個々の文字が(_文字列,_個々の文字). 入力された文字列を(_文字列) :- write('文字列を入力してください : '), get_line(_文字列). 構成している個々の文字が(_文字列,_個々の文字) :- sub_atom(_文字列,_,1,_,_個々の文字). '(1) 小文字の英字であるのか (2) 大文字の英字であるのか (3) 英字以外であるのかを判定する'(_個々の文字,小文字の英字) :- 小文字の英字である(_個々の文字),!. '(1) 小文字の英字であるのか (2) 大文字の英字であるのか (3) 英字以外であるのかを判定する'(_個々の文字,大文字の英字) :- 大文字の英字である(_個々の文字),!. '(1) 小文字の英字であるのか (2) 大文字の英字であるのか (3) 英字以外であるのかを判定する'(_個々の文字,英字以外) :- 英字以外である(_文字). 小文字の英字である(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 大文字の英字である(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. 英字以外である(_文字) :- \+(小文字の英字である(_文字)), \+(大文字の英字である(_文字)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/399 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # まず学生の人数(100人以下)を入力し、成績結果のファイルseiseki.txtを読み、 # それから国語または数学、英語の点数のどれかに注目した小から大への順番に従ってデータを並べ替えて、 # write.txtに出力するプログラムを作成しなさい。 # 例 # seiseki.txt # No. 国語 数学 英語 # 1  90 80 70 # 2   85 75 65 # 3   80 70 60 # 4   75 65 55 # 5   70 60 50 # # 学生の人数を入力してください。6 # 科目番号を入力してください。 # 1:国語、2:数学、3:英語 # 2 # # write.txt # 5 70 60 50 # 4 75 65 55 # 3 80 70 60 # 2 85 75 65 # 1 90 80 70 # 'まず学生の人数(100人以下)を入力し、成績結果のファイルseiseki.txtを読み、それから国語または数学、英語の点数のどれかに注目した小から大への順番に従ってデータを並べ替えて、write.txtに出力する' :- 'まず学生の人数(100人以下)を入力し'(_学生の人数), '成績結果のファイルseiseki.txtを読み'(_学生の人数,_成績ならび), 'それから国語または数学、英語の点数のどれかに注目'(_注目した科目,_成績ならび,_着目した科目の成績ならび), '小から大への順番に従ってデータを並べ替えて'(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび), 'write.txtに出力する'(_昇順に整列した着目した科目の成績ならび,_成績ならび). 'まず学生の人数(100人以下)を入力し'(_学生の人数) :- 整数を得る(学生の人数,_学生の人数 =< 100,_学生の人数). '成績結果のファイルseiseki.txtを読み'(_学生の人数,_成績ならび) :- get_split_lines('seiseki.txt',[' '],LL), 平坦化(LL,_成績ならび_1), 学生の人数分を切り取る(_学生の人数,_成績ならび_1,_成績ならび). 学生の人数分を切り取る(_学生の人数,_成績ならび_1,_成績ならび) :- length(_成績ならび_1,_要素数), _要素数 >= _学生の人数, length(_成績ならび,_学生の人数), append(_成績ならび,_,_成績ならび_1),!. 学生の人数分を切り取る(_学生の人数,_成績ならび,_成績ならび). 'それから国語または数学、英語の点数のどれかに注目'(_注目した科目,_成績ならび,_注目した科目の成績ならび) :- 注目した科目を選択する(_注目した科目), findall([_注目した科目の成績,_No],( member([_No,_国語,_数学,_英語],_成績ならび), 注目した科目成績を選択する(_注目した科目,[_国語,_数学,_英語],_注目した科目の成績)), _注目した科目の成績ならび). 注目した科目を選択する(_注目した科目) :- write('国語、数学、英語のうち、注目した科目を入力してください : '), get_line(Line), '診断: 注目した科目を選択する'(Line,_注目した科目),!. 注目した科目を選択する(_注目した科目) :- 注目した科目を選択する(_注目した科目). '診断: 注目した科目を選択する'(_注目した科目,_注目した科目) :- member(_注目した科目,[国語,数学,英語]),!. '診断: 注目した科目を選択する'(Line,_注目した科目) :- write('入力された %t は国語、数学、英語のいずれでもありません。再入力をお願いします。\n',[Line]), fail. 注目した科目成績を選択する(国語,[_国語,_数学,_英語],_国語). 注目した科目成績を選択する(数学,[_国語,_数学,_英語],_数学). 注目した科目成績を選択する(英語,[_国語,_数学,_英語],_英語). '小から大への順番に従ってデータを並べ替えて'(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび) :- 整列(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび). 整列([],[]). 整列([_軸要素|_着目した科目の成績ならび],_昇順に整列した着目した科目の成績ならび) :- 分割(_軸要素,_着目した科目の成績ならび,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび), 整列(_軸要素より小さい成績ならび,_整列した軸要素より小さい成績ならび), 整列(_軸要素より大きい成績ならび,_整列した軸要素より大きい成績ならび), append(_整列した軸要素より小さい成績ならび,[_軸要素|_整列した軸要素より大きい成績ならび],_昇順に整列した着目した科目の成績ならび). 分割(_,[],[],[]). 分割(_軸要素,[[_成績,_No]|R1],[[_成績,_No]|_軸要素より小さい成績ならび],_軸要素と等しいか大きい成績ならび) :- _成績 @<_軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 分割(_軸要素,[[_成績,_No]|R1],_軸要素より小さい成績ならび,[[_成績,_No]|_軸要素と等しいか大きい成績ならび]) :- _成績 @>= _軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 'write.txtに出力する'(_昇順に整列した着目した科目の成績ならび,_成績ならび) :- open('write.txt',write,Outstream), 'Outstreamへ出力'(Outstream,_昇順に整列した着目した科目の成績ならび,_成績ならび), close(Outstream). 'Outstreamへ出力'(Outstream,_昇順に整列した着目した科目の成績ならび,_成績ならび) :- append(_,[[_成績,_No]|R],_昇順に整列した着目した科目の成績ならび), member([_No,_国語,_数学,_英語],_成績ならび), writef(Outstream,'%t %t %t %t\n',[_No,_国語,_数学,_英語]), R = []. % 平坦化/2 % 以下のサイトは # 出典 :: 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(_整数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/134 # # 内容: # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/t5qL2 # # 名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し, # BMI指数の小さい順に並べた線形リストを作成した上で, # BMI指数の小さい順にBMI指数,身長,体重,名前を出力するプログラムを作成せよ。 # ただし,入力件数は不定とし,名前の1文字目に'0'を入れることでデータ入力を終了するものとする。 # # BMI指数は以下の式で算出できる。 # BMI = 体重[kg]/(身長[m])^2 '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,BMI指数の小さい順に並べた線形リストを作成した上で,BMI指数の小さい順にBMI指数,身長,体重,名前を出力する。ただし,入力件数は不定とし,名前の1文字目に"0"を入れることでデータ入力を終了するものとする' :- '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト), 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(_BMI指数の小さい順並べた線形リスト). '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト) :- findall([_BMI指数,_名前,_身長,_体重],( 名前を得る(_名前), ( sub_atom(_名前,0,1,_,'0'),!,fail; '身長[cm],体重[kg]を入力'(_身長,_体重), 'BMI指数を算出する'(_身長,_体重,_BMI指数))), _BMI指数を鍵とした線形リスト). 名前を得る(_名前) :- write('名前(半角英字によるローマ字表記)を入力してください : '), get_line(_名前), 半角英字によるローマ字表記(_名前). 名前を得る(_名前) :- 名前を得る(_名前). '身長[cm],体重[kg]を入力'(_身長,_体重) :- 数を得る('身長[cm]',_身長), 数を得る('体重[kg]',_体重),!. 'BMI指数を算出する'(_身長,_体重,_BMI指数) :- _BMI指数 is _体重 / (_身長 ^ 2). 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト) :- sort(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([]). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([[_BMI指数,_氏名,_身長,_体重]|R]) :- writef('%t,%t,%t,%t\n',[_BMI指数,_身長,_体重,_名前]), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(R). 半角英字によるローマ字表記(_名前) :- findall(_文字,( sub_atom(_名前,_,1,_,_文字), 空白または半角英字の文字(_文字)), _空白または半角英字であった文字ならび), atomic_list_concat(_空白または半角英字であった文字ならび,_名前). 空白または半角英字の文字(' '). 空白または半角英字の文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. 空白または半角英字の文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. % 数を得る/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/134 # # 内容: # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/t5qL2 # # 名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し, # BMI指数の小さい順に並べた線形リストを作成した上で, # BMI指数の小さい順にBMI指数,身長,体重,名前を出力するプログラムを作成せよ。 # ただし,入力件数は不定とし,名前の1文字目に'0'を入れることでデータ入力を終了するものとする。 # # BMI指数は以下の式で算出できる。 # BMI = 体重[kg]/(身長[m])^2 '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,BMI指数の小さい順に並べた線形リストを作成した上で,BMI指数の小さい順にBMI指数,身長,体重,名前を出力する。ただし,入力件数は不定とし,名前の1文字目に"0"を入れることでデータ入力を終了するものとする' :- '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト), 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(_BMI指数の小さい順並べた線形リスト). '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト) :- findall([_BMI指数,_名前,_身長,_体重],( 名前を得る(_名前), ( sub_atom(_名前,0,1,_,'0'),!,fail; '身長[cm],体重[kg]を入力'(_身長,_体重), 'BMI指数を算出する'(_身長,_体重,_BMI指数))), _BMI指数を鍵とした線形リスト). 名前を得る(_名前) :- write('名前(半角英字によるローマ字表記)を入力してください : '), get_line(_名前), 半角英字によるローマ字表記(_名前). 名前を得る(_名前) :- 名前を得る(_名前). '身長[cm],体重[kg]を入力'(_身長,_体重) :- 数を得る('身長[cm]',_身長), 数を得る('体重[kg]',_体重),!. 'BMI指数を算出する'(_身長,_体重,_BMI指数) :- _BMI指数 is _体重 / (_身長 ^ 2). 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト) :- sort(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([]). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([[_BMI指数,_氏名,_身長,_体重]|R]) :- writef('%t,%t,%t,%t\n',[_BMI指数,_身長,_体重,_名前]), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(R). 半角英字によるローマ字表記(_名前) :- findall(_文字,( sub_atom(_名前,_,1,_,_文字), 空白または半角英字の文字(_文字)), _空白または半角英字であった文字ならび), atomic_list_concat(_空白または半角英字であった文字ならび,_名前). 空白または半角英字の文字(' '). 空白または半角英字の文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. 空白または半角英字の文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. % 数を得る/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/61 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク):違うPCからテキストファイルをダウンロードするプログラムを作れ。 #               サーバでファイルを一行ずつ読み込み送信する。クライアントでは受信をしてファイルに書き込む。 # server :- open_server(Socket,NewSocket), open_server_stream(NewSocket,Instream,Outstream), server_to_client(Insteam,Outstream,Instream_2), close_server_stream(Instream,Outstream), close_server_socket(Socket,NewSocket). open_server(Port,Socket,NewSocket) :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket). open_server_stream(Newsocket,Instream,Outstream) :- open(NewSocket,read,Instream), open(NewSocket,write,Outstream). server_to_client(Insteam,Outstream,Instream_2) :- get_file_name(Instream,File), open(File,read,Instream_2), server_to_client(Instream_2,Outstream), close(Instream_2). get_file_name(Instream,File,Outstream) :- get_line(Instream,Line), sub_atom(Line,0,4,_,'GET '), split(Line,['"'],[_,File|_]), write(Outstream,'OK filename\n\n'). server_to_client(Instream_2,Outstream) :- at_end_of_stream(Instream_2),!. server_to_client(Instream_2,Outstream) :- get_char(Instream_2,Char), put_char(Outstream,Char), server_to_client(Instream_2,Outstream). close_server_stream(Instream,Outstream) :- close(Instream), close(Outstream). close_server_socket(Socket,NewSocket) :- socket_shutdown(Socket), socket_shutdown(NewSocket). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% client(Host,Port,File) :- open_client(Host,Port,Socket), client_server_to_client(Socket,File), close_client(Socket,Instream,Outstream). open_client(Host,Port,Socket,Instream,Outstream) :- socket(internet,stream,Socket), socket_connect(Socket, Host : Port), open(Socket,read,Instream), open(Socket,write,Outstream). client_server_to_clieint(Socket,File,Instream,Outstream) :- writef(Outstream,'%t\n',[File]), clieint_server_to_client(Instream,Outstream,Outstream_2). client_server_to_client(Instream,Outstream,File,Outstream_2) :- open(File,write,Outstream_2), client_セッション_1(Instream,Outstream), client_セッション_2(Instream,Outstream,Outstream_2), close(Outstream_2). client_セッション_2(Instream,Outstream_2) :- at_end_of_stream(Instream),!. client_セッション_2(Instream,Outstream_2) :- get_line(Instream,Line), writef(Outstream_2'%t\n',[Line]), client_セッション_2(Instream,Outstream_2). clieint_セッション_1(Instream,Outstream) :- writef('GET %t\n\n',[File]), get_line(Instream,Line_1), get_line(Instream,''), sub_atom(Line_1,0,4,_,'GET '). close_client(Socket,Instream,Outstream) :- close(Instream), close(Outstream), socket_shutdown(Socket). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/61 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク):違うPCからテキストファイルをダウンロードするプログラムを作れ。 #               サーバでファイルを一行ずつ読み込み送信する。クライアントでは受信をしてファイルに書き込む。 # server :- open_server(Socket,NewSocket), open_server_stream(NewSocket,Instream,Outstream), server_to_client(Insteam,Outstream,Instream_2), close_server_stream(Instream,Outstream), close_server_socket(Socket,NewSocket). open_server(Port,Socket,NewSocket) :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket). open_server_stream(Newsocket,Instream,Outstream) :- open(NewSocket,read,Instream), open(NewSocket,write,Outstream). server_to_client(Insteam,Outstream,Instream_2) :- get_file_name(Instream,File), open(File,read,Instream_2), server_to_client(Instream_2,Outstream), close(Instream_2). get_file_name(Instream,File,Outstream) :- get_line(Instream,Line), sub_atom(Line,0,4,_,'GET '), split(Line,['"'],[_,File|_]), write(Outstream,'OK filename\n\n'). server_to_client(Instream_2,Outstream) :- at_end_of_stream(Instream_2),!. server_to_client(Instream_2,Outstream) :- get_char(Instream_2,Char), put_char(Outstream,Char), server_to_client(Instream_2,Outstream). close_server_stream(Instream,Outstream) :- close(Instream), close(Outstream). close_server_socket(Socket,NewSocket) :- socket_shutdown(Socket), socket_shutdown(NewSocket). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% client(Host,Port,File) :- open_client(Host,Port,Socket), client_server_to_client(Socket,File), close_client(Socket,Instream,Outstream). open_client(Host,Port,Socket,Instream,Outstream) :- socket(internet,stream,Socket), socket_connect(Socket, Host : Port), open(Socket,read,Instream), open(Socket,write,Outstream). client_server_to_clieint(Socket,File,Instream,Outstream) :- writef(Outstream,'%t\n',[File]), clieint_server_to_client(Instream,Outstream,Outstream_2). client_server_to_client(Instream,Outstream,File,Outstream_2) :- open(File,write,Outstream_2), client_セッション_1(Instream,Outstream), client_セッション_2(Instream,Outstream,Outstream_2), close(Outstream_2). client_セッション_2(Instream,Outstream_2) :- at_end_of_stream(Instream),!. client_セッション_2(Instream,Outstream_2) :- get_line(Instream,Line), writef(Outstream_2'%t\n',[Line]), client_セッション_2(Instream,Outstream_2). clieint_セッション_1(Instream,Outstream) :- writef('GET %t\n\n',[File]), get_line(Instream,Line_1), get_line(Instream,''), sub_atom(Line_1,0,4,_,'GET '). close_client(Socket,Instream,Outstream) :- close(Instream), close(Outstream), socket_shutdown(Socket). % 以下のサイトは # # 質問付き入力の一般型を示す。 # 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). % 以下のサイトは # 出典 :: 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(_得点,( '5人の', '得点(10点満点)を受け取る'(_得点)),_5人の得点ならび). '5人の' :- between(1,5,_). '得点(10点満点)を受け取る'(_得点) :- 行入力(_行文字列), '診断: 得点(10点満点)を受け取る'(_行文字列,_得点),!. '得点(10点満点)を受け取る'(_得点) :- '得点(10点満点)を受け取る'(_得点). '診断: 得点(10点満点)を受け取る'(_行文字列,_得点) :- 行文字列を解析して0から10の範囲の得点を得る(_行文字列,_得点),!. '診断: 得点(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/39 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # # 4×4のマス目のうち1ヶ所を選び、そこに爆弾をおいておく。 # マス目の座標は左上が(0,0),右下が(3,3)である。 # 実行を開始するとプレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)、 # 爆弾の置かれたマス目であった場合は”wham!”と表示する。 # このプログラムを、以下のように改良せよ。 # (a)15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。 # (b)1度選んだマス目は再度選べないようにする(試行の回数には含めない)。 # (c)マス目の範囲(0,1,2,3のいずれか)から外れた数値を打ち込んだ場合に警告を出すようにする(試行の回数には含めない)。 # (d)1度選んだマス目が分かるように、下の表示を行う。 # 0 0 0 0 # 0 0 0 0 # 0 1 0 0 # 0 0 0 0 # マス目[1,2]を選んで爆弾に当たらなかった場合、その場所に1を表示 # '4×4のマス目のうち1ヶ所を選び、そこに爆弾をおいておく'(_表) :- length(_表,4), findall(L,( member(_,表), length(L,4)), _表), 爆弾をおいておく(_表). 爆弾をおいておく(_表) :- _x座標 is random(4), _y座標 is random(4), 座標を得る(_表,_x座標,_y座標,爆弾),!. 'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_表,_x座標,_y座標) :- 表を表示する(_表), 座標の入力(_x座標,_y座標), 座標範囲検査(_x座標,_y座標), 座標を入力済みとする(_表,_x座標,_y座標),!. 'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_表,_x座標,_y座標) :- 'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_表,_x座標,_y座標). 座標の入力(_x座標,_y座標) :- write('x座標(0..3),y座標(0..3)をカンマ区切りで入力してください : '), readln([_x座標,_y座標]). 座標範囲検査(_x座標,_y座標) :- between(0,3,_x座標), between(0,3,_y座標). 座標を入力済みとする(_表,_x座標,_y座標) :- 座標を得る(_表,_x座標,_y座標,V), 座標を評価する(V),!. 座標を得る(_表,_x座標,_y座標,V) :- length(Ln_y,_y座標), append(Ln_y,[L|_],_表), length(Ln_x,_x座標), append(Ln_x,[V|_],L),!. 座標を評価する(V) :- \+(var(V)), V = 爆弾,!. 座標を評価する(V) :- var(V), V = 1. '実行を開始するとプレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)、爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'(_表) :- Ln = [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_], 'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_x座標,_y座標), '爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'(Ln,_表,_x座標,_y座標). '爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'([],_表,_x座標,_y座標) :- write('You Win!\n'). '爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'(R,_表,_x座標,_y座標) :- '爆弾の置かれたマス目であった場合はWham!と表示する'(_表,_x座標,_y座標),!. '爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'([_|Ln],_表,_x座標,_y座標) :- 座標を入力済みとする(_表,_x座標,_y座標), 'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_x座標_2,_y座標_2), '爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'(Ln,_表,_x座標_2,_y座標_2). '爆弾の置かれたマス目であった場合は爆弾の置かれたマス目であった場合はWham!と表示する'(_表,_x座標,_y座標) :- length(Ln_y,_y座標), append(Ln_y,[L|_],_表), length(Ln_x,_x座標), append(Ln_x,[爆弾|_],L), write('Wham!\n'). 表を表示する([]). 表を表示する([_行|R]) :- 行を表示する(_行), 表を表示する(_表). 行を表示する([]) :- write('\n'). 行を表示する([A|R]) :- 変数と爆弾は0表示それ以外は1表示(A,N), write('%t ',[N]), 行を表示する(R). 変数と爆弾は0表示それ以外は1表示(A,0) :- var(A),!. 変数と爆弾は0表示それ以外は1表示(爆弾,0) :- !. 変数と爆弾は0表示それ以外は1表示(_,1). % 以下のサイトは # 出典:: 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の時はここでは一旦成功裡に終わる。駅番号がないから最終的には、述語「出発駅と到着駅をそれぞれ駅番号で入力し」で失敗して出発駅からの入れ直しとなる'. % 以下のサイトは # 出典:: 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 # # 'のぞみ料金表を"http://nojiriko.asia/prolog/nozomi_ryoukinhyo.txt"から読み取り、述語 料金表/1 を定義する' :- get_lines('http://nojiriko.asia/prolog/nozomi_ryoukinhyo.txt',Lines), カンマを取り除く(Lines,_カンマを取り除いたLines), '述語 料金表/1 を定義する'(_カンマを取り除いたLines,_料金表), assertz(料金表(_料金表)). カンマを取り除く([],[]). カンマを取り除く([_行|R1],[_行_2|R2]) :- findall(_文字,( sub_atom(_行,_,1,_,_文字), \+(_文字=',')), L), atom_chars(_行_2,L), カンマを取り除く(R1,R2). '述語 料金表/1 を定義する'(_カンマを取り除いたLines,_料金表) :- findall(L,( member(Line,Lines), split(Line,[' '],L)), LL), LL = [L1|R], _料金表 = [[''|L1]|R]. % split/3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 料金表([['',新大阪,京都,名古屋,新横浜], [東京,14920,14390,11540,3180], [新横浜,14600,13660,10910], [名古屋,6840,6100], [京都,3240]]). 料金表からのぞみ料金述語を定義する :- 料金表(_料金表), 料金表からのぞみ料金述語を定義する(_料金表). 料金表からのぞみ料金述語を定義する([[_|_行き先ならび]|_出発点付き料金表]) :- 新幹線のぞみ料金述語の定義する(_行き先ならび,_出発点付き料金表). 新幹線のぞみ料金述語を定義する(_,[]). 新幹線のぞみ料金述語を定義する(_行き先ならび,[[_出発点|_料金ならび]|R]) :- 出発点からの料金を定義する(_出発点,_行き先ならび,_料金ならび), 新幹線のぞみ料金述語を定義する(_行き先ならび,R). 出発点からの料金を定義する(_,_,[]). 出発点からの料金を定義する(_出発点,[_行き先|R1],[_料金|R2]) :- assertz(新幹線のぞみ料金(_出発点,_行き先,_料金)), 出発点からの料金を定義する(_出発点,R1,R2). 'なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする' :- split('なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする',[が,と,','],L), append(_,[',',_駅名,'が,N|_],L). assertz(駅番号(_駅名,N)), fail. 'なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする'. % 以下のサイトは リストになっている行データを逆順に表示する([]). リストになっている行データを逆順に表示する([_行|R]) :- リストになっている行データを逆順に表示する(R), writef('%t\n',[_行]). ファイルから行を逆順に収集する(_ファイル名,_逆順に収集された行リスト) :- open(_ファイル名,read,Instream), ファイルから行を逆順に収集する(Instream,[],_逆順に収集された行リスト), close(Instream). ファイルから行を逆順に収集する(Instream,_逆順に収集された行リスト,_逆順に収集された行リスト) :- at_end_of_stream(Instream),!. ファイルから行を逆順に収集する(Instream,_逆順に収集された行リスト_1,_逆順に収集された行リスト) :- get_line(Instream,Line), ファイルから行を逆順に収集する(Instream,[Line|_逆順に収集された行リスト_1],_逆順に収集された行リスト). ファイルから読み取った行を逆順に別ファイルに書き込む(_ファイル名,_別ファイル名) :- open(_ファイル名,read,Instream), open(_別ファイル名,write,Outstream), ファイルから行を逆順に収集する(Instream,Outstream,[],_逆順に収集された行リスト), close(Outstream), close(Instream). ファイルから読み取った行を逆順に別ファイルに書き込む(Instream,Outstream) :- at_end_of_stream(Instream),!. ファイルから読み取った行を逆順に別ファイルに書き込む(Instream,Outstream,_逆順に収集された行リスト_1,_逆順に収集された行リスト) :- get_line(Instream,Line), ファイルから読み取った行を逆順に別ファイルに書き込む(Instream,Outstream), writef(Outstream,'%t\n',[Line]). %%%%% 入力がリスト 出力がリストなのが reverse/2 reverse/3 これは組込述語であることが多い。 reverse(L1,L2) :- reverse(L1,[],L2). reverse([],L,L). reverse([A|R],L1,L) :- reverse(R,[A|L1],L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/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/947 # # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク): # 配列strに文字列を入力した後、 # 最初の2文字を取り除いた文字列を表示せよ # 参考:http://kie.nu/cCu # '文字列を入力した後、最初の2文字を取り除いた文字列を表示する' :- 文字列を入力した後(_文字列), 最初の2文字を取り除いた文字列を(_文字列,_副文字列), 表示する(_副文字列). 文字列を入力した後(_文字列) :- write('文字列を入力してください : '), get_line(_文字列). 最初の2文字を取り除いた文字列を(_文字列,_副文字列) :- sub_atom(_文字列,2,_,_,_副文字列). 表示する(_文字列) :- writef('%t\n',[_文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/943 # # [1] 授業単元: プログラミング入門 # [2] 問題文(含コード&リンク): # # 1 for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。 # 書き出した後で、ファイルからデータを読み込み画面に出力する。 # # # 2 a = 3.1, b = 2.9, c = −1.1, d = 5.3の最大値、最小値を求め画面に出力する # 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。書き出した後で、ファイルからデータを読み込み画面に出力する。' :- 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。', '書き出した後で、ファイルからデータを読み込み画面に出力する。'('data1.txt'). 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。' :- 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき'(_値ならび), 'その値をファイルdata1.txtに書き出す。'(_値ならび). 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき'(_値ならび) :- findall(_値,( for(0.1,V,10.0,0.1), _値 is V ^ 2), _値ならび). for(_値,_値,_限界値,_) :- _値 =< _限界値. for(S,_値,_限界値,_増分) :- S =< _限界値, S_2 is S + _増分, for(S_2,_値,_限界値,_増分). 'その値をファイルdata1.txtに書き出す。'(_値ならび) :- open('data1.txt',write,Outstream), 書き出す(Outstream,_値ならび), close(Outstream). 書き出す(Outstream,[]). 書き出す(Outstream,[_値|R]) :- writef(Outstream,'%t\n',[_値]), 書き出す(Outstream,R). '書き出した後で、ファイルからデータを読み込み画面に出力する。'(_ファイル) :- open(_ファイル,read,Instream), データを読み込み画面に出力する(Instream), close(Instream). データを読み込み画面に出力する(Instream) :- at_end_of_stream(Instream),!. データを読み込み画面に出力する(Instream) :- get_line(Instream,_値), 画面に出力する(_値), データを読み込み画面に出力する(Instream). 画面に出力する(_値) :- writef('%t\n',[_値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/943 # # [1] 授業単元: プログラミング入門 # [2] 問題文(含コード&リンク): # # 1 for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。 # 書き出した後で、ファイルからデータを読み込み画面に出力する。 # # # 2 a = 3.1, b = 2.9, c = −1.1, d = 5.3の最大値、最小値を求め画面に出力する # 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。書き出した後で、ファイルからデータを読み込み画面に出力する。' :- 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。', '書き出した後で、ファイルからデータを読み込み画面に出力する。'('data1.txt'). 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。' :- 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき'(_値ならび), 'その値をファイルdata1.txtに書き出す。'(_値ならび). 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき'(_値ならび) :- findall(_値,( for(0.1,V,10.0,0.1), _値 is V ^ 2), _値ならび). for(_値,_値,_限界値,_) :- _値 =< _限界値. for(S,_値,_限界値,_増分) :- S =< _限界値, S_2 is S + _増分, for(S_2,_値,_限界値,_増分). 'その値をファイルdata1.txtに書き出す。'(_値ならび) :- open('data1.txt',write,Outstream), append(_,[_値|R],_値ならび), writef(Outstream,'%t\n',[_値]), R = [], close(Outstream). '書き出した後で、ファイルからデータを読み込み画面に出力する。'(_ファイル) :- open(_ファイル,read,Instream), データを読み込み画面に出力する(Instream), close(Instream). データを読み込み画面に出力する(Instream) :- at_end_of_stream(Instream),!. データを読み込み画面に出力する(Instream) :- get_line(Instream,_値), 画面に出力する(_値), データを読み込み画面に出力する(Instream). 画面に出力する(_値) :- writef('%t\n',[_値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/943 # # [1] 授業単元: プログラミング入門 # [2] 問題文(含コード&リンク): # # 1 for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。 # 書き出した後で、ファイルからデータを読み込み画面に出力する。 # # # 2 a = 3.1, b = 2.9, c = −1.1, d = 5.3の最大値、最小値を求め画面に出力する # 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。書き出した後で、ファイルからデータを読み込み画面に出力する。' :- 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。', '書き出した後で、ファイルからデータを読み込み画面に出力する。'('data1.txt'). 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき、その値をファイルdata1.txtに書き出す。' :- 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき'(_値ならび), 'その値をファイルdata1.txtに書き出す。'(_値ならび). 'for文を用いて0.1の二乗、0.2の二乗、0.3の二乗と0.1ずつ10まで増やしていき'(_値ならび) :- findall(_値,( for(1,N,100), _値 is (0.1 * N) ^ 2), _値ならび). 'その値をファイルdata1.txtに書き出す。'(_値ならび) :- open('data1.txt',write,Outstream), 書き出す(Outstream,_値ならび), close(Outstream). 書き出す(Outstream,[]). 書き出す(Outstream,[_値|R]) :- writef(Outstream,'%t\n',[_値]), 書き出す(Outstream,R). '書き出した後で、ファイルからデータを読み込み画面に出力する。'(_ファイル) :- open(_ファイル,read,Instream), データを読み込み画面に出力する(Instream), close(Instream). データを読み込み画面に出力する(Instream) :- at_end_of_stream(Instream),!. データを読み込み画面に出力する(Instream) :- get_line(Instream,_値), 画面に出力する(_値), データを読み込み画面に出力する(Instream). 画面に出力する(_値) :- writef('%t\n',[_値]). % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/938 # # [1] 授業単元: コンピュータプログラミング # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/qvNtf # 2 # [問2] 国語と数学の2科目のテストの成績を処理するプログラムを作る。成績を3人分キーボードから入力した後、それを表示したい。これについて、次の手順でkadai7-2.cを作成しなさい。 # 1)次の構造体を利用する。 # # struct SEISEKI { # char name[50]; # int kokugo; # int sugaku; # }; <ーセミコロンを忘れないように(慣れた人でも良く間違う) # # 2) 次の配列を用意する。 # struct SEISEKI score[3]; # # 3) main関数で上記score[3]に次のようにデータをキーボード入力するようにする。 # scanf("%s %d %d %s %d %d %s %d %d", 一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....); # 注意:上記「一人目の氏名」とは、score[0].nameのことです。またscanfの使いかたとして文字列には&は要りませんが、int型やdouble型の変数の場合には頭に&を付けないといけません。 # ex. 入力例: # yamauchi 60 70 yamada 80 90 tougou 70 80 # # 4)次の関数を定義する。 # void print_score(struct SEISEKI a); # この関数は次のように成績を出力するものとする。 # printf(" name: %s\n kokugo: %d\n sugaku: %d\n", ........); # 表示例: # name: yamauchi # kokugo: 60 # sugaku: 70 # # 5) void print_score()を使って3人分の成績を列挙する。 '国語と数学の2科目のテストの成績を処理するプログラムを作る。成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後、それを表示する' :- '成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後'(_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績), それを表示する([_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績]). '成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後'(_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績) :- write('一行に 氏名,国語の成績,数学の成績,の形式で三人分入力してください\n'), readln([_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績]), 入力検査([_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績],正常終了),!. '成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後'(_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績) :- '成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後'(_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績). 入力検査([_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績],_診断) :- 整数項目入力検査([_一人目の国語の成績,_一人目の数学の成績,_二人目の国語の成績,_二人目の数学の成績,_三人目の国語の成績,_三人目の数学の成績],[_一人目の国語の成績,_一人目の数学の成績,_二人目の国語の成績,_二人目の数学の成績,_三人目の国語の成績,_三人目の数学の成績],_診断),!. 整数項目入力検査([],[],異常終了) :- !,fail. 整数項目入力検査([],[],正常終了) :- !. 整数項目入力検査([_科目名|R1],[_成績|R2],_診断) :- integer(_成績), 整数項目入力検査(R1,R2,_診断),!. 整数項目入力検査([_科目名|R1],[_成績|R2],異常終了) :- writef('%tが正しく入力されませんでした。\n',[_科目名]), 整数項目入力検査(R1,R2,異常終了). それを表示する([]). それを表示する([_氏名,_数学成績,_国語成績|R]) :- writef('氏名 : %t\n 数学成績: %t\n 国語成績: %t\n',[[_氏名,_数学成績,_国語成績]), それを表示する(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/712 # # よろしくお願いします! # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク): # 入力した2進数の数値について、10進数表記に直す計算を行いたい。 # 以下に示すように、下の桁から順に2をかける回数を増やすように計算を行い、最終的な結果を表示せよ。 # なお、再帰は用いなくてよい。 # 参考:ttp://kie.nu/bOw #    ttp://kie.nu/bOx # '入力した2進数の数値について、10進数表記に直す計算を行い、最終的な結果を表示する' :- 入力した2進数の数値について(_入力した2進数の数値ならび), '下の桁から順に2をかける回数を増やすように計算を行い、10進数表記に直す'(_入力した2進数の数値ならび,_10進数表記), 最終的な結果を表示する(_10進数表記). 入力した2進数の数値について(_入力した2進数の数値ならび) :- write('2進数を0か1からなる数字列として入力してください : '), get_line(Line), 入力した2進数の数値表現診断(Line,_入力した2進数の数値ならび),!. 入力した2進数の数値について(_入力した2進数の数値ならび) :- 入力した2進数の数値について(_入力した2進数の数値ならび). 入力した2進数の数値表現診断(Line,_入力した2進数の数値ならび) :- findall(_文字,( sub_atom(Line,_,1,_,_文字)), L), '2進数文字ならびを数値ならびに変換する'(L,_入力した2進数の数値ならび),!. 要素が0または1のみの場合数値に変換する( 入力した2進数の数値表現診断(Line,_入力した2進数の数値ならび) :- writef('入力された %t には2進数として不適切な文字が含まれています。再入力をお願いします。\n',[Line]), fail. '2進数文字ならびを数値ならびに変換する'(['0',b|R],_入力した2進数の数値ならび) :- 要素が0または1のみの場合数値に変換する(R,_入力した2進数の数値ならび),!. '2進数文字ならびを数値ならびに変換する'(L,_入力した2進数の数値ならび) :- 要素が0または1のみの場合数値に変換する(L,_入力した2進数の数値ならび). 要素が0または1のみの場合数値に変換する([]). 要素が0または1のみの場合数値に変換する(['0'|R1],[0|R2]) :- 要素が0または1のみの場合数値に変換する(R1,R2). 要素が0または1のみの場合数値に変換する(['1'|R1],[1|R1]) :- 要素が0または1のみの場合数値に変換する(R1,R2). '下の桁から順に2をかける回数を増やすように計算を行い、10進数表記に直す'(_入力した2進数の数値ならび,_10進数表記) :- 下の桁から取り出しやすいように逆順に並べ直す(_入力した2進数の数値ならび,_逆順に並べ直した2進数の数値ならび), '下の桁から順に2をかける回数を増やすように計算を行い'(_逆順に並べ直した2進数の数値ならび,0,_10進数), '10進数表記に直す'(_10進数,_10進数表記). '下の桁から順に2をかける回数を増やすように計算を行い'([],_,0). '下の桁から順に2をかける回数を増やすように計算を行い'([N|R],M,X) :- _掛ける数 is truncate(2 ^ M), M_2 is M + 1, '下の桁から順に2をかける回数を増やすように計算を行い'(R,M_2,X_2), X is (N * _掛ける数) + _X_2. 下の桁から取り出しやすいように逆順に並べ直す(_入力した2進数の数値ならび,_逆順に並べ直した2進数の数値ならび) :- reverse(_入力した2進数の数値ならび,_逆順に並べ直した2進数の数値ならび). '10進数表記に直す'(_10進数,_10進数表記) :- swritef(_10進数表記,'%t',[_10進数]). 最終的な結果を表示する(_10進数表記) :- writef('%t\n',[_10進数表記]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/703 # # # レポート課題 # # 標準入力で与えた単語が,指定ファイル中に出現した回数を出力するプログラムを作成せよ. # 単語データは以下の構造体を使用し,ハッシュを使用すること # ハッシュ関数は各自で定義してよい # 単語は,スペースまたは改行で区切られる文字列とする # ハッシュのサイズはコマンド引数から指定し,作成したハッシュテーブルの偏り具合を表示すること # # struct word { # char *str; # int count; # struct word *next; # }; # 実行例 # # $ ./wordcount 13 api.txt # [0]:147 [1]:133 [2]:170 [3]:137[4]:133[5]:132 [6]:160 [7]:167 [8]:136 [9]:154 [10]:142 [11]:149 [12]:125 # Word => API # API: 10 # Word => virtual # virtual: 33 # Word => 0 # $ # # # お願いします。 # # '標準入力で与えた単語が,指定ファイル中に出現した回数を出力する'(_指定ファイル) :- 標準入力で与えた単語が(_標準入力で与えた単語), 指定ファイル中に出現した回数を(_指定ファイル,_標準入力で与えた単語,_出現した回数), 出力する(_指定ファイル,_標準入力で与えた単語,_出現した回数). 標準入力で与えた単語が(_標準入力で与えた単語) :- get_line(_標準入力で与えた単語). 指定ファイル中に出現した回数を(_指定ファイル,_標準入力で与えた単語,_指定ファイル中に出現した回数) :- get_lines(_指定ファイル,Lines), count(( member(_行,Lines), sub_atom(_行,_,_,_,_標準入力で与えた単語)), _指定ファイル中に出現した回数). 出力する(_指定ファイル,_標準入力で与えた単語,_指定ファイル中に出現した回数) :- writef('単語 %t が ファイル "%t" 中に出現した回数は %t です。\n',[_標準入力で与えた単語,_指定ファイル,_指定ファイル中に出現した回数]). % 以下のサイトは # 出典:: 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/617 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文: http://ime.nu/codepad.org/lwC4tzs0 # このコードの関数addNewNodeToHeadとdeleteFirstNodeの中身を完成させてください。 # /*------------------------------------------------ # 連結リストの実装例(リストヘッドによる方法) # ------------------------------------------------*/ # #include # #include # # //DATA型を定義(正体は int 型) # typedef int DATA; # # //NODE型の構造体定義 # typedef struct node { # struct node *next; // 次のノードへのポインタ # DATA data; // データ部 # } NODE; # # //リストの先頭ポインタを保持する変数の宣言 # NODE list_head; # # //関数のプロトタイプ宣言 # void addNewNodeToHead( DATA* ); // 先頭ノードを追加 # void deleteFirstNode(); // 先頭ノードを削除 # void showList(); //リストの表示 # # /*--------------------------------------- # メイン関数 # ---------------------------------------*/ # int main() # { # int key; # DATA value = 1; //格納する値を生成するための変数 # # // リストヘッドの初期化 # list_head.next = NULL; # # //終了の 9 が入力されるまで繰り返す # while( key != 9 ) { # # //リストの表示 # showList(); # # //メニューを表示 # printf("1.先頭に追加,2.先頭を削除,9.終了:"); # # //メニュー番号の入力と分岐 # scanf("%d",&key); # switch( key ) { # # case 1: //リストの先頭にデータを追加 # # //追加するDATA(いまは整数値)を引数に追加関数をよぶ # addNewNodeToHead( &value ); //注意:ノードを追加後,ついでに value をインクリメントしている # break; # # case 2: //先頭のデータを削除 # # //先頭の要素を削除する関数をよぶ # deleteFirstNode(); # break; # } # } # # return 0; # } # # //リストの先頭にノードを追加する # void addNewNodeToHead( DATA *d ) # { # NODE *newNode, *pos; # # # } # # // リストの先頭ノードを削除する # void deleteFirstNode() # { # NODE *pos, *prevNode; # # # } # # //連結リストの状態を表示する # void showList() # { # NODE *pos; //読み出し位置にあるノードへのポインタ変数 # # //最初のノードのアドレスを取得(注意: リストが空の場合は NULL が入っている) # pos = list_head.next; # # //末尾のノードまで繰り返す # while ( pos != NULL ) { # printf("%d ", pos->data); //データ参照して表示 # pos = pos->next; //次のノードに進む # } # # printf("\n\n"); # } # 実行結果 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:1 # 1: 1 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:2 # 2: 1 2 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:2 # 3: 1 3 2 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:2 # 2: 1 3 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:3 # 3番目の要素はありません。 # 2: 1 3 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:2 # 1: 1 # 1.n番目を追加、2.n番目を削除、9.終了:9 # [3.3] 言語: C言語 [4] 期限:5月25日 [5] その他の制限: よろしくお願いします。 # 結び目(0,0,_). '終了の 9 が入力されるまで繰り返す'(_初期ならび,_実行終了時ならび) :- write('1.n番目を追加、2.n番目を削除、9.終了:1 \n'), get_integer(_メニュー番号), 実行の選択(_メニュー番号,_初期ならび,_実行終了時ならび). 実行の選択(9,_ならび,_ならび) :- !. 実行の選択(1,_実行前ならび,_実行終了時ならび) :- '1.n番目を追加'(_実行前ならび,_追加後のならび), '終了の 9 が入力されるまで繰り返す'(_追加後のならび,_実行終了時ならび). 実行の選択(2,_実行前ならび,_実行終了時ならび) :- '2.n番目を削除'(_実行前ならび,_削除後のならび), '終了の 9 が入力されるまで繰り返す'(_削除後のならび,_実行終了時ならび). '1.n番目を追加'(_実行前ならび,_追加後のならび) :- write('追加する要素番号を入力してください : '), get_integer(_n), write('追加する要素値を入力してください : '), get_line(_要素), 要素をn番目に挿入(_要素,_n). '2.n番目を削除'(_実行前ならび,_削除後のならび) :- write('追加する要素番号を入力してください : '), get_integer(_n), n番目の要素を取り除く(_n,_削除後のならび). 先頭に結び目を加える(_要素) :- 新しい結び目を得る(_新しい結び目), retract(結び目(0,_次の結び目,_)), asserta(結び目(_新しい結び目,_次の結び目,_要素)), assertz(結び目(0,_新しい結び目,_)). 末尾に結び目を加える(_要素) :- 新しい結びを得る(_新しい結び目), retract(結び目(_末尾の結び目,0,_末尾の要素)), asserta(結び目(_末尾の結び目,_新しい結び目,_末尾の要素)), asserta(結び目(_新しい結び目,0,_要素)). 先頭の結び目を取り除く :- retract(結び目(0,_先頭の結び目,_)), retract(結び目(_先頭の結び目,_次の結び目,_要素)), asserta(結び目(0,_次の結び目,_)). 末尾の結び目を取り除く(_ならび,_末尾の要素,_末尾の要素を除いたならび) :- retract(結び目(_末尾の結び目,0,_末尾の要素)), retract(結び目(_末尾の一つ前の結び目,_末尾の結び目,_末尾の一つ前の要素)), asserta(結び目(_末尾の一つ前の結び目,0,_末尾の一つ前の要素)). n番目の要素を表示(_n,_n番目の要素) :- 結び目(0,_最初の結び目,_), n番目の要素を得る(1,_n,_最初の結び目,_n番目の要素). n番目の要素を得る(_n,_n,_n番目の結び目,_n番目の要素) :- 結び目(_n番目の結び目,_,_n番目の要素),!. n番目の要素を得る(_n_1,_n,_n_1番目の結び目,_n番目の要素) :- _n_1 < _n, 結び目(_n_1番目の結び目,_n_2番目の結び目,_n番目の要素), _n_2 is _n_1 + 1, n番目の要素を得る(_n_2,_n,_n_2番目の結び目,_n番目の要素). n番目の要素を取り除く(_n,_n番目の要素) :- 結び目(0,_最初の結び目,_), n番目の結び目を取り除く(1,_n,_最初の結び目). n番目の結び目を取り除く(_n,_n,_n番目の結び目) :- retract(結び目(_n番目の結び目,_n_2番目の結び目,_n番目の要素)), retract(結び目(_n_1番目の結び,_n番目の結び目,_n_1番目の要素)), asserta(結び目(_n_1番目の結び,_n_2番目の結び目,_n_1番目の要素)),!. n番目の結び目を取り除く(_n_1,_n,_n_1番目の結び目) :- _n_1 < _n, 結び目(_n_1番目の結び目,_n_2番目の結び目,_), _n_2 is _n_1 + 1, n番目の結び目を取り除く(_n_2,_n,_n_2番目の結び目,_n番目の要素). n番目の結び目を挿入(_n,_n番目の要素) :- 結び目(0,_最初の結び目,_), n番目の結び目を挿入(1,_n,_最初の結び目,_n番目の要素). n番目の結び目を挿入(_n,_n,_現在のn番目の結び目,_n番目の要素) :- retract(結び目(_n_1番目の結び目,_現在のn番目の結び目,_n_1番目の要素)), 新しい結び目(_新しい結び目), asserta(結び目(_新しい結び目,_現在のn番目の結び目,_新しい要素)), asserta(結び目(_n_1番目の結び目,_新しい結び目,_n_1番目の要素)),!. n番目の結び目を挿入(_n_1,_n,_n_1番目の結び目,_n番目の要素) :- _n_1 < _n, 結び目(_n_1番目の結び目,_n_2番目の結び目,_), _n_2 is _n_1 + 1, n番目の結び目を挿入(_n_2,_n,_n_2番目の結び目,_n番目の要素). 新しい結び目(_新しい結び目) :- _新しい結び目 is (random(40000)+1) * (random(40000)+1), \+(結び目(_新しい結び目,_,_)),!. 新しい結び目(_新しい結び目) :- 新しい結び目(_新しい結び目). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/617 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文: http://ime.nu/codepad.org/lwC4tzs0 # このコードの関数addNewNodeToHeadとdeleteFirstNodeの中身を完成させてください。 # /*------------------------------------------------ # 連結リストの実装例(リストヘッドによる方法) # ------------------------------------------------*/ # #include # #include # # //DATA型を定義(正体は int 型) # typedef int DATA; # # //NODE型の構造体定義 # typedef struct node { # struct node *next; // 次のノードへのポインタ # DATA data; // データ部 # } NODE; # # //リストの先頭ポインタを保持する変数の宣言 # NODE list_head; # # //関数のプロトタイプ宣言 # void addNewNodeToHead( DATA* ); // 先頭ノードを追加 # void deleteFirstNode(); // 先頭ノードを削除 # void showList(); //リストの表示 # # /*--------------------------------------- # メイン関数 # ---------------------------------------*/ # int main() # { # int key; # DATA value = 1; //格納する値を生成するための変数 # # // リストヘッドの初期化 # list_head.next = NULL; # # //終了の 9 が入力されるまで繰り返す # while( key != 9 ) { # # //リストの表示 # showList(); # # //メニューを表示 # printf("1.先頭に追加,2.先頭を削除,9.終了:"); # # //メニュー番号の入力と分岐 # scanf("%d",&key); # switch( key ) { # # case 1: //リストの先頭にデータを追加 # # //追加するDATA(いまは整数値)を引数に追加関数をよぶ # addNewNodeToHead( &value ); //注意:ノードを追加後,ついでに value をインクリメントしている # break; # # case 2: //先頭のデータを削除 # # //先頭の要素を削除する関数をよぶ # deleteFirstNode(); # break; # } # } # # return 0; # } # # //リストの先頭にノードを追加する # void addNewNodeToHead( DATA *d ) # { # NODE *newNode, *pos; # # # } # # // リストの先頭ノードを削除する # void deleteFirstNode() # { # NODE *pos, *prevNode; # # # } # # //連結リストの状態を表示する # void showList() # { # NODE *pos; //読み出し位置にあるノードへのポインタ変数 # # //最初のノードのアドレスを取得(注意: リストが空の場合は NULL が入っている) # pos = list_head.next; # # //末尾のノードまで繰り返す # while ( pos != NULL ) { # printf("%d ", pos->data); //データ参照して表示 # pos = pos->next; //次のノードに進む # } # # printf("\n\n"); # } # 実行結果 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:1 # 1: 1 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:2 # 2: 1 2 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:2 # 3: 1 3 2 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:2 # 2: 1 3 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:3 # 3番目の要素はありません。 # 2: 1 3 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:2 # 1: 1 # 1.n番目を追加、2.n番目を削除、9.終了:9 # [3.3] 言語: C言語 [4] 期限:5月25日 [5] その他の制限: よろしくお願いします。 # '終了の 9 が入力されるまで繰り返す'(_初期ならび,_実行終了時ならび) :- write('1.n番目を追加、2.n番目を削除、9.終了:1 \n'), get_integer(_メニュー番号), 実行の選択(_メニュー番号,_初期ならび,_実行終了時ならび). 実行の選択(9,_ならび,_ならび) :- !. 実行の選択(1,_実行前ならび,_実行終了時ならび) :- '1.n番目を追加'(_実行前ならび,_追加後のならび), '終了の 9 が入力されるまで繰り返す'(_追加後のならび,_実行終了時ならび). 実行の選択(2,_実行前ならび,_実行終了時ならび) :- '2.n番目を削除'(_実行前ならび,_削除後のならび), '終了の 9 が入力されるまで繰り返す'(_削除後のならび,_実行終了時ならび). '1.n番目を追加'(_実行前ならび,_追加後のならび) :- write('追加する要素番号を入力してください : '), get_integer(_n), write('追加する要素値を入力してください : '), get_line(_要素), 要素をn番目に挿入(_要素,_n,_ならび,_追加後のならび). '2.n番目を削除'(_実行前ならび,_削除後のならび) :- write('追加する要素番号を入力してください : '), get_integer(_n), n番目の要素を取り除く(_n,_ならび,_,_削除後のならび). 先頭に要素を加える(_要素,_ならび,[_要素|_ならび]). 末尾に要素を加える(_要素,_ならび,_末尾に要素を加えたならび) :- append(_ならび,[_要素],_末尾に要素を加えたならび). 先頭の要素を取り除く([_先頭の要素|_先頭の要素を除いたならび],_先頭の要素,_先頭の要素を除いたならび). 末尾の要素を取り除く(_ならび,_末尾の要素,_末尾の要素を除いたならび) :- append(_末尾の要素を除いたならび,[_末尾の要素],_ならび). n番目の要素を表示(_n,_ならび,_n番目の要素) :- length([_|L0],_n), append(L0,[_n番目の要素|_],_ならび), n番目の要素を取り除く(_n,_ならび,_n番目の要素,_n番目の要素を除いたならび) :- length([_|L0],_n), append(L0,[_n番目の要素|R],_ならび), append(L0,R,_n番目の要素を除いたならび). 要素をn番目に挿入(_要素,_n,_ならび,_要素をn番目に挿入されたならび) :- length([_|L1],_n), append(L1,L2,_ならび), append(L1,[_要素|L2],_要素をn番目に挿入されたならび). n番目の要素の置換(_n,_置換要素,_ならび,_n番目の要素を置換されたならび) :- length([_|L0],_n), append(L0,[_|R],_ならび), append(L0,[_置換要素|R],_n番目の要素を置換されたならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- get_line(_文字列), findsum([A,B,C],( sub_atom(_文字列,_,1,_,_文字), 文字種判定(_文字,A,B,C)), [_英字の数,_数字の数,_その他の文字の数]), writef('英字の数は %t,数字の数は %t,その他の文字の数は %t\n',[_英字の数,_数字の数,_その他の文字の数]). 文字種判定(_文字,1,0,0) :- 英字(_文字),!. 文字種判定(_文字,0,1,0) :- 数字(_文字),!. 文字種判定(_文字,0,0,1). % findsum/3 % 英字/1 % 数字/1 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- get_line(_文字列), count((sub_atom(_文字列,_,1,_,_文字),英字(_文字)),_英字の数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_数字の数), count((sub_atom(_文字列,_,1,_,_文字),\+(英字(_文字)),\+(数字(_文字))),_その他の文字の数), writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). % count/2 % 説明的でない述語表現。行き止まりの述語がならぶ。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- get_line(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- count((sub_atom(_文字列,_,1,_,_文字),英字(_文字)),_英字の数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_数字の数), count((sub_atom(_文字列,_,1,_,_文字),\+(英字(_文字)),\+(数字(_文字))),_その他の文字の数). % count/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力する。'(_文字列). '文字列を入力し'(_文字列) :- get_line(_文字列). 'その文字列に含まれる英字、数字、その他の文字の数を出力する'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力する(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- count((sub_atom(_文字列,_,1,_,_文字),英字(_文字)),_英字の数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_数字の数), count((sub_atom(_文字列,_,1,_,_文字),\+(英字(_文字)),\+(数字(_文字))),_その他の文字の数). 英字(_英字) :- _英字 @>= 'a', _英字 @=< 'z',!. 英字(_英字) :- _英字 @>= 'A', _英字 @=< 'Z'. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. 出力する(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). % count/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力する。'(_文字列). '文字列を入力し'(_文字列) :- get_line(_文字列). 'その文字列に含まれる英字、数字、その他の文字の数を出力する'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力する(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- findall(_文字種,( sub_atom(_文字列,_,1,_,_文字), 文字種判定(_文字,_文字種)), L), count(member(英,L),_英字の数), count(member(数,L),_数字の数), count(member(他,L),_その他の文字の数). 文字種判定(_英字,英) :- _英字 @>= 'a', _英字 @=< 'z',!. 文字種判定(_英字,英) :- _英字 @>= 'A', _英字 @=< 'Z'. 文字種判定(_数字,数) :- _数字 @>= '0', _数字 @=< '9'. 文字種判定(_その他の文字,他) :- \+(英字(_その他の文字)), \+(数字(_その他の文字)). 出力する(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). % count/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力する。'(_文字列). '文字列を入力し'(_文字列) :- get_line(_文字列). 'その文字列に含まれる英字、数字、その他の文字の数を出力する'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力する(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- atom_chars(_文字列,Chars), 'ならび要素の英字、数字、その他の文字の数を'(Chars,0,0,0,_英字の数,_数字の数,_その他の文字の数). 'ならび要素の英字、数字、その他の文字の数を'([],_英字の数,_数字の数,_その他の文字の数,_英字の数,_数字の数,_その他の文字の数). 'ならび要素の英字、数字、その他の文字の数を'([_文字|R],_英字の数_1,_数字の数_1,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数) :- 英字(_文字), _英字の数_2 is _英字の数_1 + 1, 'ならび要素の英字、数字、その他の文字の数を'(R,_英字の数_2,_数字の数_1,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数). 'ならび要素の英字、数字、その他の文字の数を'([_文字|R],_英字の数_1,_数字の数_1,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数) :- 数字(_文字), _数字の数_2 is _数字の数_1 + 1, 'ならび要素の英字、数字、その他の文字の数を'(R,_英字の数_1,_数字の数_2,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数). 'ならび要素の英字、数字、その他の文字の数を'([_文字|R],_英字の数_1,_数字の数_1,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数) :- \+(英字(_文字)), \+(数字(_文字)), _その他の文字の数_2 is _その他の文字の数_1 + 1, 'ならび要素の英字、数字、その他の文字の数を'(R,_英字の数_1,_数字の数_1,_その他の文字の数_2,_英字の数,_数字の数,_その他の文字の数). 出力する(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). 英字(_英字) :- _英字 @>= 'a', _英字 @=< 'z',!. 英字(_英字) :- _英字 @>= 'A', _英字 @=< 'Z'. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力する。'(_文字列). '文字列を入力し'(_文字列) :- get_line(_文字列). 'その文字列に含まれる英字、数字、その他の文字の数を出力する'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力する(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- atom_chars(_文字列,Chars), 'ならび要素の英字、数字、その他の文字の数を'(Chars,_英字の数,_数字の数,_その他の文字の数). 'ならび要素の英字、数字、その他の文字の数を'([],0,0,0). 'ならび要素の英字、数字、その他の文字の数を'([_文字|R],_英字の数,_数字の数,_その他の文字の数) :- 英字(_文字), 'ならび要素の英字、数字、その他の文字の数を'(R,_英字の数_1,_数字の数,_その他の文字の数), _英字の数 is _英字の数_1 + 1. 'ならび要素の英字、数字、その他の文字の数を'([_文字|R],_英字の数,_数字の数,_その他の文字の数) :- 数字(_文字), 'ならび要素の英字、数字、その他の文字の数を'(R,_英字の数,_数字の数_1,_その他の文字の数), _数字の数 is _数字の数_1 + 1. 'ならび要素の英字、数字、その他の文字の数を'([_文字|R],_英字の数,_数字の数,_その他の文字の数) :- \+(英字(_文字)), \+(数字(_文字)), 'ならび要素の英字、数字、その他の文字の数を'(R,_英字の数,_数字の数,_その他の文字の数_1), _その他の文字の数 is _その他の文字の数_1 + 1. 出力する(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). 英字(_英字) :- _英字 @>= 'a', _英字 @=< 'z',!. 英字(_英字) :- _英字 @>= 'A', _英字 @=< 'Z'. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力する。'(_文字列). '文字列を入力し'(_文字列) :- get_line(_文字列). 'その文字列に含まれる英字、数字、その他の文字の数を出力する'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,0,0,0,_英字の数,_数字の数,_その他の文字の数), 出力する(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'('',_英字の数,_数字の数,_その他の文字の数,_英字の数,_数字の数,_その他の文字の数) :- !. 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数_1,_数字の数_1,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数) :- sub_atom(_文字列,0,1,_残り文字数,_文字), sub_atom(_文字列,1,_残り文字数,0,_残り文字列), 文字数加算(_文字,_英字の数_1,_数字の数_1,_その他の文字の数_1,_英字の数_2,_数字の数_2,_その他の文字の数_2), 'その文字列に含まれる英字、数字、その他の文字の数を'(_残り文字列,_英字の数_2,_数字の数_2,_その他の文字の数_2,_英字の数,_数字の数,_その他の文字の数), 文字数加算(_文字,_英字の数_1,_数字の数,_その他の文字の数,_英字の数,_数字の数,_その他の文字の数) :- 英字(_文字), _英字の数 is _英字の数_1 + 1. 文字数加算(_文字,_英字の数,_数字の数_1,_その他の文字の数,_英字の数,_数字の数,_その他の文字の数) :- 数字(_文字), _数字の数 is _数字の数_1 + 1. 文字数加算(_文字,_英字の数,_数字の数,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数) :- \+(英字(_文字)), \+(数字(_文字)), _その他の文字の数 is _その他の文字の数_1 + 1. 出力する(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). 英字(_英字) :- _英字 @>= 'a', _英字 @=< 'z',!. 英字(_英字) :- _英字 @>= 'A', _英字 @=< 'Z'. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力する。'(_文字列). '文字列を入力し'(_文字列) :- get_line(_文字列). 'その文字列に含まれる英字、数字、その他の文字の数を出力する'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力する(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'('',0,0,0). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- sub_atom(_文字列,0,1,_残り文字数,_文字), sub_atom(_文字列,1,_残り文字数,0,_残り文字列), 'その文字列に含まれる英字、数字、その他の文字の数を'(_残り文字列,_英字の数_1,_数字の数_1,_その他の文字の数_1), 文字数加算(_文字,_英字の数_1,_数字の数_1,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数). 文字数加算(_文字,_英字の数_1,_数字の数,_その他の文字の数,_英字の数,_数字の数,_その他の文字の数) :- 英字(_文字), _英字の数 is _英字の数_1 + 1. 文字数加算(_文字,_英字の数,_数字の数_1,_その他の文字の数,_英字の数,_数字の数,_その他の文字の数) :- 数字(_文字), _数字の数 is _数字の数_1 + 1. 文字数加算(_文字,_英字の数,_数字の数,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数) :- \+(英字(_文字)), \+(数字(_文字)), _その他の文字の数 is _その他の文字の数_1 + 1. 出力する(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). 英字(_英字) :- _英字 @>= 'a', _英字 @=< 'z',!. 英字(_英字) :- _英字 @>= 'A', _英字 @=< 'Z'. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/592 # # {1] 授業単元:プログラミング言語演習 # [2] 問題文: # 整数aとbを入力し、a^bを求めるプログラムを作成しなさい # # 実行例↓ # # 整数aとbを入力してください # 100 2 # 100の2乗は10000です # # 2回目の実行例↓ # # 整数aとbを入力してください # 4 0 # 4の0乗は1です。 # # '整数aとbを入力し、a^bを求める' :- 整数aとbを入力し(_a,_b), 'a^bを求める'(_a,_b,_x), writef('%tの%t乗は%tです。\n',[_a,_b,_x]). 整数aとbを入力し(_a,_b) :- write('整数aとbを入力してください : '), get_line(Line), 整数aとbの入力診断(Line,_a,_b),!. 整数aとbを入力し(_a,_b) :- 整数aとbを入力し(_a,_b). 整数aとbの入力診断(Line,_a,_b) :- splie(Line,[' ',','],[_a,_b]), integer(_a), integer(_b),!. 整数aとbの入力診断(Line,_a,_b) :- writef('入力された %t からは二つの整数値が得られません。もう一度、カンマ区切りで二つの整数を入力して改行してください。\n',[Line]), fail. 'a^bを求める'(_a,0,1). 'a^bを求める'(_a,_b,_x) :- _b > 0, _b_1 is _b - 1, 'a^bを求める'(_a,_b_1,_x_1), _x is _a * _x_1. 'a^bを求める'(_a,_b,_x) :- _b < 0, _b_1 is _b + 1, 'a^bを求める'(_a,_b_1,_x_1), _x is _x_1 / _a. % 以下のサイトは # [1] 授業単元:プログラム設計 # [2] 問題文:以下の条件で売り上げ集計プログラムを作りなさい。 #  ・クラスを用いる(困難なら構造体で可) #  ・店舗毎に名前・売り上げを入力し、平均、標準偏差を計算 #  ・売り上げ毎に店舗を並び替える #  ・店舗数は任意。 #  ・並び替えは簡単でよい。店舗数が少ない場合、単純に比較するだけでよい。 # [3] コンパイラ名とバージョン: Microsoft Visual C++ # [4] 言語:C # [5] その他の制限: 特にありません。 '店舗(店舗数は任意)毎に名前・売り上げを入力し、平均、標準偏差を計算する'(_平均,_標準偏差) :- abolish(売り上げ/2), '店舗(店舗数は任意)毎に名前・売り上げを入力し', '平均、標準偏差を計算する'(_平均,_標準偏差), 売り上げ毎に店舗を並び替える. '店舗(店舗数は任意)毎に名前・売り上げを入力し' :- 店舗数は任意(_店舗数), length(Ln,_店舗数), '店舗(店舗数は任意)毎に名前・売り上げを入力し'(Ln,_店舗数). '店舗(店舗数は任意)毎に名前・売り上げを入力し'(Ln,_店舗数) :- append(L0,[_|R],Ln), '店舗名・売り上げを入力'(L0,_店舗数,_店舗名,_売り上げ), assertz(売り上げ(_店舗名,_売り上げ)), R = []. '店舗名・売り上げを入力'(L0,_店舗数,_店舗名,_売り上げ) :- length([_|L0],_何番目), writef('%t/%t番目の 店舗名,売り上げをカンマ区切りで入力してください : ',[_何番目,_店舗数]), readln([_店舗名,_売り上げ]). 店舗数は任意(_店舗数) :- write('店舗数を入力してください : '), get_integer(_店舗数). '平均、標準偏差を計算する'(_平均,_標準偏差) :- findall(_売り上げ,( 売り上げ(_,_売り上げ)), L), 相加平均(L,_平均), 標準偏差(L,_標準偏差). 売り上げ毎に店舗を並び替える :- 売り上げ毎に(_降順売り上げならび), 店舗を並び替える(_降順売り上げならび). 売り上げ毎に(_降順売り上げならび) :- findall([_売り上げ,_店舗名],( 売り上げ(_店舗名,_売り上げ)), _売り上げならび), sort(_売り上げならび,_昇順売り上げならび), reverse(_昇順売り上げならび,_降順売り上げならび). 店舗を並び替える(_降順売り上げならび) :- abolish(売り上げ/2), append(_,[[_売り上げ,_店舗名]|R],_降順売り上げならび), assertz(売り上げ(_店舗名,_売り上げ)), R = []. % 以下のサイトは # [1] 授業単元:プログラム設計 # [2] 問題文:以下の条件で売り上げ集計プログラムを作りなさい。 #  ・クラスを用いる(困難なら構造体で可) #  ・店舗毎に名前・売り上げを入力し、平均、標準偏差を計算 #  ・売り上げ毎に店舗を並び替える #  ・店舗数は任意。 #  ・並び替えは簡単でよい。店舗数が少ない場合、単純に比較するだけでよい。 # [3] コンパイラ名とバージョン: Microsoft Visual C++ # [4] 言語:C # [5] その他の制限: 特にありません。 '店舗(店舗数は任意)毎に名前・売り上げを入力し、平均、標準偏差を計算する'(_平均,_標準偏差) :- abolish(売り上げ/2), '店舗(店舗数は任意)毎に名前・売り上げを入力し', '平均、標準偏差を計算する'(_平均,_標準偏差). '店舗(店舗数は任意)毎に名前・売り上げを入力し' :- 店舗数は任意(_店舗数), '店舗(店舗数は任意)毎に名前・売り上げを入力し'(1,_店舗数). '店舗(店舗数は任意)毎に名前・売り上げを入力し'(N,_店舗数) :- N > _店舗数,!. '店舗(店舗数は任意)毎に名前・売り上げを入力し'(N,_店舗数) :- writef('%t番目の 店舗名,売り上げをカンマ区切りで入力してください : ',[N]), readln([_店舗名,_売り上げ]), assertz(売り上げ(_店舗名,_売り上げ)), N_2 is N + 1, '店舗(店舗数は任意)毎に名前・売り上げを入力し'(N_2,_店舗数). 店舗数は任意(_店舗数) :- write('店舗数を入力してください : '), get_integer(_店舗数). '平均、標準偏差を計算する'(_平均,_標準偏差) :- findall(_売り上げ,( 売り上げ(_,_売り上げ)), L), 相加平均(L,_平均), 標準偏差(L,_標準偏差). 売り上げ毎に店舗を並び替える :- 売り上げ毎に(_降順売り上げならび), 店舗を並び替える(_降順売り上げならび). 売り上げ毎に(_降順売り上げならび) :- findall([_売り上げ,_店舗名],( 売り上げ(_店舗名,_売り上げ)), _売り上げならび), sort(_売り上げならび,_昇順売り上げならび), reverse(_昇順売り上げならび,_降順売り上げならび). 店舗を並び替える(_降順売り上げならび) :- abolish(売り上げ/2), append(_,[[_売り上げ,_店舗名]|R],_降順売り上げならび), assertz(売り上げ(_店舗名,_売り上げ)), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/517 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/www1.axfc.net/uploader/Sc/so/347163 # # 学生番号 1 2 3 4 5 6 # グループA 35 63 25 62 73 53 # グループB 45 53 81 53 34 45 # グループC 56 76 34 45 67 65 # # 上記のグループ別学生毎の得点データを適当な整数型配列data[4][7]に読み込み、グループ別及び全体の平均点を計算せよ。 # '上記のグループ別学生毎の得点データを読み込み、グループ別及び全体の平均点を計算する' :- '上記のグループ別学生毎の得点データを読み込み'(LL), グループ別及び全体の平均点を計算する(LL,_グループ別平均点ならび,_全体の平均点), グループ別平均点を表示する(_グループ別平均点ならび), 全体の平均点を表示する(_全体の平均点). '上記のグループ別学生毎の得点データを読み込み'([]) :- at_end_of_stream(user_input),!. '上記のグループ別学生毎の得点データを読み込み'([L|R]) :- get_line(Line), split(Line,[' ','\t'],L), '上記のグループ別学生毎の得点データを読み込み'(R). グループ別及び全体の平均点を計算する(LL,_グループ別平均点ならび,_全体の平均点) :- グループ別平均点を計算する(LL,_グループ別平均点ならび), 全体の平均点を計算する(LL,_全体の平均点). グループ別平均点を計算する([_見出し部分|_グループ名付き得点表],_グループ別平均点ならび) :- findall([_グループ,_平均点],( member([_グループ|_得点ならび],_グループ名付き得点表), 相加平均(_得点ならび,_平均点)), _グループ別平均点ならび). 全体の平均点を計算する([_見出し部分|_グループ名付き得点表],_全体の平均点) :- findsum(_得点,( member([_グループ名|_得点ならび],_グループ名付き得点表]), member(_得点,_得点ならび)), _全体の平均点). グループ別平均点を表示する(_グループ別平均点ならび) :- append(_,[[_グループ,_平均点]|R],_グループ別平均点ならび), writef('%t の平均点: %t点\n',[_グループ,_平均点]), R = []. 全体の平均点を表示する(_全体の平均点) :- writef(' 全体の平均点: %t点\n',[_全体の平均点]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/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/405 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # # 繰り返し入力された文字列をリストに集めてそれを連結する。 # 文字列 quit が入力された時終了する # % % 一般には文字列を一旦リストに集めてそれから結合する % % 終了条件の ,!,fail; がポイント % '繰り返し入力された文字列を連結する。文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する' :- findall(_入力された文字列,( 入力された文字列(_入力された文字列), ( _入力された文字列 = quit,!,fail; true)), L), atomic_list_concat(L,_連結された文字列), writef('%t\n',[_連結された文字列]). 入力された文字列(_入力された文字列) :- write('文字列 ? '), get_line(_入力された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/405 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # malloc と realloc を用いて、繰り返し入力された文字列を連結していく。 # 文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示しなさい。 # 表示した後、free をする。 # '繰り返し入力された文字列を連結していく。文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する' :- 入力された文字列(_入力された文字列), '繰り返し入力された文字列を連結していく。文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する'(_入力された文字列,''). '繰り返し入力された文字列を連結していく。文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する'(_入力された文字列,_これまで連結された文字列) :- '文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する'(_入力された文字列,_これまで入力された文字列),!. '繰り返し入力された文字列を連結していく。文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する'(_入力された文字列,_これまで連結された文字列) :- atom_concat(_入力された文字列,_これまで連結された文字列,_連結された文字列), 入力された文字列(_新たに入力された文字列), '繰り返し入力された文字列を連結していく。文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する'(_新たに入力された文字列,_連結された文字列). '文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する'(quit,_これまで入力された文字列) :- writef('%t\n',[_これまで入力された文字列]). 入力された文字列(_入力された文字列) :- write('文字列 ? '), get_line(_入力された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/379 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/gFfm4dhN # 5人の身長をキーボートから入力するとその平均身長が出力されるよう、上記のプログラムを変更しなさい。 # '5人の身長をキーボートから入力するとその平均身長が出力される' :- '5人の身長をキーボートから入力すると'(_5人の身長), その平均身長が出力される(_5人の身長,0). '5人の身長をキーボートから入力すると'(_5人の身長) :- write('5人の身長をカンマ区切りで入力してください : '), readln(_5人の身長), '5人の身長診断'(_5人の身長),!. '5人の身長をキーボートから入力すると'(_5人の身長) :- '5人の身長をキーボートから入力すると'(_5人の身長). '5人の身長診断'([]). '5人の身長診断'([_身長|R]) :- number(_身長), _身長 > 0.0, '5人の身長診断'(R). その平均身長が出力される([],S) :- _平均身長 is S / 5, writef('平均身長 = %t\n',[_平均身長]). その平均身長が出力される([_身長|R],S1) :- S2 is S1 + _身長, その平均身長が出力される(R,S2). % 以下のサイトは # 出典:: 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/1309076891/945 # # # テキストフィールドから入力した学習時間の平均を求める。 # # ただし、テキストフィールドの入力が改行のみの時、入力は[]となり終了する。 # テキストフィールドから入力した学習時間の平均を求める(_学習時間の平均) :- テキストフィールドから入力した学習時間の(_学習時間ならび), 学習時間の平均を求める(_学習時間ならび,_学習時間の平均). テキストフィールドから入力した学習時間の(_学習時間ならび) :- テキストフィールドから入力した学習時間(_学習時間), テキストフィールドから入力した学習時間の(_学習時間,_学習時間ならび). テキストフィールドから入力した学習時間の(_入力,[]) :- 'テキストフィールドの入力が改行のみの時、入力は[]となり終了する'(_入力),!. テキストフィールドから入力した学習時間の(_学習時間,[_学習時間|R]) :- テキストフィールドから入力した学習時間(_学習時間_2), テキストフィールドから入力した学習時間の(_学習時間_2,R). テキストフィールドから入力した学習時間(_学習時間) :- write('学習時間をスペース区切りで _時 _分 _秒 : '), readln(L), テキストフィールドから入力した学習時間診断(L,_学習時間),!. テキストフィールドから入力した学習時間(_学習時間) :- テキストフィールドから入力した学習時間(_学習時間). テキストフィールドから入力した学習時間診断([],[]) :- !. テキストフィールドから入力した学習時間診断([_時,_分,_秒],[_時,_分,_秒]) :- 時の範囲内(_時), 分の範囲内(_分), 秒の範囲内(_秒),!. テキストフィールドから入力した学習時間診断(L,_学習時間) :- writef('%t Input Error: ',[L]), fail. 時の範囲内(_時) :- integer(_時), _時 >= 0. 分の範囲内(_分) :- integer(_分), _分 >= 0, _分 < 60,!. 秒の範囲内(_秒) :- integer(_秒), _秒 >= 0, _秒 < 60,!. 学習時間の平均を求める([],_) :- write('テキストフィールドから入力した学習時間が有りません\n'), fail,!. 学習時間の平均を求める(_学習時間ならび,_学習時間の平均) :- length(_学習時間ならび,_人数), findsum([_時,_分,_秒],( member([_時,_分,_秒],_学習時間ならび)), [_合計時,_合計分,_合計秒]), 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒). 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒) :- 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒), _平均秒 is truncate((_換算された秒 + 0.5) / _人数), '換算された秒を時、分、秒に還元'(_換算された秒,_平均時,_平均分,_平均日). 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒) :- _換算された秒 is _合計時 * 3600 + _合計分 * 60 + _合計秒. '換算された秒を時、分、秒に還元'(_換算された秒,_時,_分,_秒) :- _時 is _換算された秒 // 3600, _剰余_1 is _換算された秒 mod 3600, _分 is _剰余_1 // 60, _秒 is _剰余_1 mod 60. 'テキストフィールドの入力が改行のみの時、入力は[]となり終了する'([]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/945 # # 【課題】最終課題のプログラムを,テキストフィールドから入力した学習時間の平均を求めるように書き換えてみよう。 #      例えば,次のような仕様にするといいでしょう。(paintメソッドではなく,actionPerformedメソッドで合計していく) # # 仕様 # 合計時間を参照するMyTime型の変数を,アプレットクラスのフィールドとして用意しておき, actionPerformedメソッド内で,テキストフィールドから入力された時間データを加えていく。 # 学習時間を1人分ずつ(時間,分,秒)を3つのテキストフィールドから入力していく。 # 合計の学習時間も,テキストフィールドに表示する。 # 時間が入力されてEnterキーが押されると, actionPerfomedメソッドが呼び出されるので,そこでそれまでに入力された学習時間の平均を求めて,表示する。 # 「何人分のデータが入力されたか」なども表示するようにするといいかもしれません。 #      # 【形態】Javaアプレット # 【期限】2012年4月27日(金)15時まで # 【補足】Eclipse 3.1で動作できるソース # # # よろしくお願いします。 # # テキストフィールドから入力した学習時間の平均を求める(_学習時間の平均) :- テキストフィールドから入力した学習時間の(_学習時間ならび), 学習時間の平均を求める(_学習時間ならび,_学習時間の平均). テキストフィールドから入力した学習時間の(_学習時間ならび) :- テキストフィールドから入力した学習時間(_学習時間), テキストフィールドから入力した学習時間の(_学習時間,_学習時間ならび). テキストフィールドから入力した学習時間の([],[]) :- !. テキストフィールドから入力した学習時間の(_学習時間,[_学習時間|R]) :- テキストフィールドから入力した学習時間(_学習時間_2), テキストフィールドから入力した学習時間の(_学習時間_2,R). テキストフィールドから入力した学習時間(_学習時間) :- write('学習時間をスペース区切りで _時 _分 _秒 : '), readln(L), テキストフィールドから入力した学習時間診断(L,_学習時間),!. テキストフィールドから入力した学習時間(_学習時間) :- テキストフィールドから入力した学習時間(_学習時間). テキストフィールドから入力した学習時間診断([],[]) :- !. テキストフィールドから入力した学習時間診断([_時,_分,_秒],[_時,_分,_秒]) :- 時の範囲内(_時), 分の範囲内(_分), 秒の範囲内(_秒),!. テキストフィールドから入力した学習時間診断(L,_学習時間) :- writef('%t Input Error: ',[L]), fail. 時の範囲内(_時) :- integer(_時), _時 >= 0. 分の範囲内(_分) :- integer(_分), _分 >= 0, _分 < 60,!. 秒の範囲内(_秒) :- integer(_秒), _秒 >= 0, _秒 < 60,!. 学習時間の平均を求める([],_) :- write('テキストフィールドから入力した学習時間が有りません\n'), fail,!. 学習時間の平均を求める(_学習時間ならび,_学習時間の平均) :- length(_学習時間ならび,_人数), findsum([_時,_分,_秒],( member([_時,_分,_秒],_学習時間ならび)), [_合計時,_合計分,_合計秒]), 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒). 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒) :- 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒), _平均秒 is truncate((_換算された秒 + 0.5) / _人数), '換算された秒を時、分、秒に還元'(_換算された秒,_平均時,_平均分,_平均日). 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒) :- _換算された秒 is _合計時 * 3600 + _合計分 * 60 + _合計秒. '換算された秒を時、分、秒に還元'(_換算された秒,_時,_分,_秒) :- _時 is _換算された秒 // 3600, _剰余_1 is _換算された秒 mod 3600, _分 is _剰余_1 // 60, _秒 is _剰余_1 mod 60. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/945 # # 【課題】最終課題のプログラムを,テキストフィールドから入力した学習時間の平均を求めるように書き換えてみよう。 #      例えば,次のような仕様にするといいでしょう。(paintメソッドではなく,actionPerformedメソッドで合計していく) # # 仕様 # 合計時間を参照するMyTime型の変数を,アプレットクラスのフィールドとして用意しておき, actionPerformedメソッド内で,テキストフィールドから入力された時間データを加えていく。 # 学習時間を1人分ずつ(時間,分,秒)を3つのテキストフィールドから入力していく。 # 合計の学習時間も,テキストフィールドに表示する。 # 時間が入力されてEnterキーが押されると, actionPerfomedメソッドが呼び出されるので,そこでそれまでに入力された学習時間の平均を求めて,表示する。 # 「何人分のデータが入力されたか」なども表示するようにするといいかもしれません。 #      # 【形態】Javaアプレット # 【期限】2012年4月27日(金)15時まで # 【補足】Eclipse 3.1で動作できるソース # # # よろしくお願いします。 # # テキストフィールドから入力した学習時間の平均を求める(_学習時間の平均) :- テキストフィールドから入力した学習時間の(_学習時間ならび), 学習時間の平均を求める(_学習時間ならび,_学習時間の平均). テキストフィールドから入力した学習時間の(_学習時間ならび) :- テキストフィールドから入力した学習時間(_学習時間), テキストフィールドから入力した学習時間の(_学習時間,_学習時間ならび). テキストフィールドから入力した学習時間の([],[]) :- !. テキストフィールドから入力した学習時間の(_学習時間,[_学習時間|R]) :- テキストフィールドから入力した学習時間(_学習時間_2), テキストフィールドから入力した学習時間の(_学習時間_2,R). テキストフィールドから入力した学習時間(_学習時間) :- write('学習時間をスペース区切りで _時 _分 _秒 : '), readln(L), テキストフィールドから入力した学習時間診断(L,_学習時間),!. テキストフィールドから入力した学習時間(_学習時間) :- テキストフィールドから入力した学習時間(_学習時間). テキストフィールドから入力した学習時間診断([],[]) :- !. テキストフィールドから入力した学習時間診断([_時,_分,_秒],[_時,_分,_秒]) :- 時の範囲内(_時), 分の範囲内(_分), 秒の範囲内(_秒),!. テキストフィールドから入力した学習時間診断(L,_学習時間) :- writef('%t Input Error: ',[L]), fail. 時の範囲内(_時) :- integer(_時), _時 >= 0. 分の範囲内(_分) :- integer(_分), _分 >= 0, _分 < 60,!. 秒の範囲内(_秒) :- integer(_秒), _秒 >= 0, _秒 < 60,!. 学習時間の平均を求める([],_) :- write('テキストフィールドから入力した学習時間が有りません\n'), fail,!. 学習時間の平均を求める(_学習時間ならび,_学習時間の平均) :- length(_学習時間ならび,_人数), findsum([_時,_分,_秒],( member([_時,_分,_秒],_学習時間ならび)), [_合計時,_合計分,_合計秒]), 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒). 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒) :- 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒), _平均秒 is truncate((_換算された秒 + 0.5) / _人数), '換算された秒を時、分、秒に還元'(_換算された秒,_平均時,_平均分,_平均日). 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒) :- _換算された秒 is _合計時 * 3600 + _合計分 * 60 + _合計秒. '換算された秒を時、分、秒に還元'(_換算された秒,_時,_分,_秒) :- _時 is _換算された秒 // 3600, _剰余_1 is _換算された秒 mod 3600, _分 is _剰余_1 // 60, _秒 is _剰余_1 mod 60. % 以下のサイトは # 出典:: 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. % 以下のサイトは ?- '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). % 以下のサイトは # 出典:: 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). */ % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/557 # # 初めて書き込みます。よろしくお願い致します。固定長バイトの文字列の中の一部を抜き出すところがわかりませんでした。 # 1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上の # それぞれのテキストデータ・ファイルがある。 # 文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を # 比較し、 # 同じなら、文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を # 置き換える。 # 文字列Bの4カラム目が50バイト以下なら " "空白で埋める。 # 50バイトより大きい場合50バイトまでの大きさを対象とする。 # # 置き換え対象領域は日本語全角漢字含む文字列となる。 # 文字列Aの対象領域は2バイトx20文字+1バイト10文字で整形されている。 # 文字列AはSolaris10上のファイル。文字列BはエクセルファイルをCSV保存してFFFTPでSolaris10へコピーしたもの。 # 文字コード:文字列A(EUC-JP)、文字列B(sjis2eucで変換) # # 1ー77バイトが1バイト、77ー126が変換対象。126ー150が1バイトです。 '文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上のそれぞれのテキストデータ・ファイルがある。' :- get_lines('文字列A',Lines1), get_lines('文字列B',Lines2), '文字列Aの全行を置換する'(Lines1,Lines2,Lines3), 'Lines3を文字列Aに書き戻す'(Lines3,_文字列A),!. '文字列Aの全行を置換する'([],_,[]) :- !. '文字列Aの全行を置換する'([_文字列A|R1],Lines2,[_置換した文字列|R3]) :- 'Lines2を検索して文字列Aを置換する'(_文字列A,Lines2,_置換した文字列), '文字列Aの全行を置換する'(R1,Lines2,R3). 'Lines2を検索して文字列Aを置換する'(_文字列A,[],_文字列A) :- !. 'Lines2を検索して文字列Aを置換する'(_文字列A,[_文字列B|R2],_置換した文字列) :- '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列),!. 'Lines2を検索して文字列Aを置換する'(_文字列A,[_|R2],_置換した文字列) :- 'Lines2を検索して文字列Aを置換する'(_文字列A,R2,_置換した文字列),!. '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列) :- split(_文字列B,[' ',','],L), '文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を比較し同じなら'(_文字列A,L), '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列). '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列) :- sub_byte_atom(_文字列A,0,76,_,S1), sub_byte_atom(_文字列A,126,_,0,S3), '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2), concat_atom([S1,S2,S3],_置換された文字列),!. '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :- '文字列Bの4カラム目が'(L,S2_1), '50バイト以下なら'(S2_1), '" "空白で埋める'(S2_1,S2),!. '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :- nth1(4,L,S_1), sub_byte_atom(S_1,0,50,_,S2). '文字列Bの4カラム目が50バイト以下なら'(L) :- nth1(4,L,S_1), atom_byte_length(S_1,_長さ), _長さ =< 50,!. '" "空白で埋める'(S2_1,S2) :- length(L2,50), atom_byte_codes(S2_1,L_1), append(L_1,_,L2), 変数を空白に置換(L2), atom_byte_codes(S2,L2),!. 変数を空白に置換([]). 変数を空白に置換([' '|R]) :- 変数を空白に置換(R),!. 変数を空白に置換([A|R]) :- 変数を空白に置換(R). 'Lines3を文字列Aに書き戻す'(Lines3) :- put_lines('文字列A',Lines3). atom_byte_codes(Atom,ByteCodes) :- atom(Atom), atom_codes(Atom,Codes), バイトに分解(Codes,ByteCodes),!. atom_byte_codes(Atom,ByteCodes) :- \+(atom(Atom)), 'ByteCodes2Codes'(ByteCodes,Codes), atom_codes(Atom,Codes),!. 'ByteCodes2Codes'([],[]). 'ByteCodes2Codes'([A,B|R1],[C|R2]) :- A > 127, B > 127, C is 256 * A + B, 'ByteCodes2Codes'(R1,R2),!. 'ByteCodes2Codes'(R1,R2) :- 'ByteCodes2Codes'(R1,R2),!. atom_byte_length(Atom,ByteLength) :- atom_codes(_文字列,Codes), バイトに分解(Codes,ByteCodes), length(ByteCodes). atom_byte_codes(Atom,ByteCodes) :- atom_codes(Atom,Codes), バイトに分解(Code,ByteCodes). sub_byte_atom(_文字列,_スタートバイト位置,_バイト数,_残りバイト,_副文字列) :- atom_codes(_文字列,Codes), バイトに分解(Codes,ByteCodes), sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList), atom_code(_副文字列,SubList). sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList) :- length(L0,_スタートバイト位置), length(L1,_バイト数), append(L0,SubList,L2,ByteCodes), length(L2,_残りバイト),!. バイトに分解([],[]). バイトに分解([A|R1],[B,C|R2]) :- A > 255, B is A // 256, C is A mod 256, バイトに分解(R1,R2),!. バイトに分解([A|R1],[A|R2]) :- バイトに分解(R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/534 # # [1] 授業単元: - # [2] 問題文:http://ime.nu/judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0002&lang=jp # # Digit Number # 与えられた2つの整数 a と b の和の桁数を出力して終了するプログラムを作成して下さい。 # # Input # 複数のデータセットが与えられます。各データセットは1行に与えられます。各データセットは2つの整数 a と b が1つのスペースで区切られて与えられます。入力の終わりまで処理して下さい。a と b は非負の整数とします。 # # Output # 各データセットごとに、a + b の桁数を出力して下さい。 # # Sample Input # 5 7 # 1 99 # 1000 999 # Output for the Sample Input # 2 # 3 # 4 # '入力の終了まで、与えられた2つの整数 a と b の和の桁数を出力する' :- '与えられた2つの整数 a と b の'(_a,_b,_入力終了状態), '与えられた2つの整数 a と b の和の桁数を出力する'(_入力終了状態,_和の桁数). '与えられた2つの整数 a と b の和の桁数を出力する'(end_of_file,_,_) :- !. '与えられた2つの整数 a と b の和の桁数を出力する'(正常終了,_a,_b) :- '整数 a と b の和の桁数を'(_a,_b,_桁数), 出力する(_桁数), '入力の終了まで、与えられた2つの整数 a と b の和の桁数を出力する'. '与えられた2つの整数 a と b の和の桁数を'(_和の桁数) :- '与えられた2つの整数 a と b の'(_a,_b), '和の桁数を'(_a,_b,_和の桁数). '与えられた2つの整数 a と b の'(_a,_b,_終了状態) :- readln(L), '与えられた2つの整数 a と b の終了検査'(L,_a,_b,_終了状態),!. '与えられた2つの整数 a と b の'(_a,_b,_終了状態) :- write('入力エラー : 二つの整数を空白区切りで入力して下さい : '), '与えられた2つの整数 a と b の'(_a,_b,_終了状態). '与えられた2つの整数 a と b の終了検査'([],_,_,end_of_file) :- !. '与えられた2つの整数 a と b の終了検査'([_a,_b],_a,_b,正常終了) :- integer(_a), integer(_b),!. '整数 a と b の和の桁数を'(_a,_b,_和の桁数) :- _和 is _a + _b, number_chars(_和,L), length(L,_桁数). 出力する(_桁数) :- writef('%t\n',[_桁数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/522 # # [1] 授業単元: 情報処理 # [2] 問題文 # (1) # http://ime.nu/ideone.com/F0NZo # # 上記のプログラムはオープンするファイルが abc に限られている。 # キーボードからファイル名を読み込んで、そのファイルをオープンするように変更せよ。 # 'キーボードからファイル名を読み込んで、そのファイルをオープンする'(_ストリーム,_診断) :- 'キーボードからファイル名を読み込んで'(_ファイル名), 'そのファイルをオープンする'(_ファイル,_ストリーム,_診断). 'キーボードからファイル名を読み込んで'(_ファイル名) :- write('ファイル名を入力して下さい : '), get_line(Line), 'キーボードから読み込んだファイル名診断'(Line,_ファイル名,_診断). 'キーボードからファイル名を読み込んで'(_ファイル名) :- 'キーボードからファイル名を読み込んで'(_ファイル名). 'キーボードから読み込んだファイル名診断'(Line,Line,正常なファイル名) :- '入力文字列がファイル名として許された文字のみからなる'(Line), 'ピリオドは存在したとしても一箇所で、最初の文字と最後の文字はピリオドでない'(Line),!. 'キーボードから読み込んだファイル名診断'(Line,_,ファイル名になれない) :- writef('入力された %t はファイル名になりません。再入力をお願いします。\n',[Line]), fail. 'そのファイルをオープンする'(_ファイル,_ストリーム,正常終了) :- catch(open(_ファイル,read,_ストリーム),_エラー情報,オープンエラー(_エラー情報)),!. 'そのファイルをオープンする'(_,_,異常終了). '入力文字列がファイル名として許された文字のみからなる'(Line) :- atom_codes(Line,Codes), 全ての文字はアルファベット(Codes),!. 'ピリオドは存在したとしても一箇所で、最初の文字と最後の文字はピリオドでない'(Line) :- split(Line,['.'],[_,_]),!. 'ピリオドは存在したとしても一箇所で、最初の文字と最後の文字はピリオドでない'(Line) :- split(Line,['.'],[_]),!. オープンエラー(_エラー情報) :- writef('ファイルオープンエラー: %t\n',[_エラー情報]), fail. % 以下のサイトは # 出典:: 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/489 # # [1] 授業単元:C言語演習 # [2] 問題文: # キーボードで入力された名前をchar型の一次元の配列nameに入れていきます。 # 各名前の先頭アドレスをp_nameに入れます。 # p_nameのアドレスをptrptrに入れます。 # 最後に一番長い名前と一番短い名前、変数ptrptr、p_name、nameのアドレスを表示します。 # 実行例: # 名前を10個まで入力できます。桁数は最大30です。 # name1: tanaka # name2: nakabayashi # name3: hama #    ・ #    ・ # 一番長いのは"nakabayashi"で、11桁。 # 一番短いのは"hama"で、4桁。 # Adress of name: 231191 Adress of p_name: 231511 Adress of ptrptr: 231551 # # 'キーボードで入力された名前をならび_nameに入れていきます。一番長い名前と一番短い名前を表示します。' :- キーボードで入力されたならび_nameに入れていきます(_name), 一番長い名前と一番短い名前を表示します(_name). 一番長い名前と一番短い名前を表示します(_name) :- 一番長い名前(_name,_一番長い名前ならび), 一番短い名前(_name,_一番短い名前ならび), 表示します(_一番長い名前ならび,_一番短い名前ならび). 一番長い名前(_name,_一番長い名前ならび) :- findmax(_名前の長さ,( member(_名前,_name), sub_atom(_名前,0,_名前の長さ,0,_名前)), _一番長い長さ), findall(_名前,( member(_名前,_name), sub_atom(_名前,0,_一番長い長さ,_名前)), 一番長い名前ならび). 一番短い名前(_name,_一番短い名前ならび) :- findmin(_名前の長さ,( member(_名前,_name), sub_atom(_名前,0,_名前の長さ,0,_名前)), _一番短い長さ), findall(_名前,( member(_名前,_name), sub_atom(_名前,0,_一番短い長さ,_名前)), 一番短い名前ならび). 表示します(_一番長い名前ならび,_一番短い名前ならび) :- concat_atom(_一番長い名前ならび,' , ',_一番長い名前表示), writef('一番長い名前は %t です。\n',[_一番長い名前表示]), concat_atom(_一番短い名前ならび,' , ',_一番短い名前表示), writef('一番短い名前は %t です。\n',[_一番短い名前表示]). キーボードで入力された名前をならび_nameに入れていきます(_name) :- findall(_名前,( 名前を入力(_名前,_終了状態), ( _終了状態=終了,!,fail; true)), _name). 名前を入力(_名前,_終了状態) :- append(L0,_,_), length([_|L0],Nth), writef('名前[%t]: ',[Nth]), get_line(Line), 名前入力検査(Line,_名前,_終了状態). 名前入力検査('',_,終了) :- !. 名前入力検査(end_of_file,_,終了) :- !. 名前入力検査(名前,_名前,正常). % 以下のサイトは # 出典:: 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/829 # # プログラムに以下の機能を追加したプログラムを作成する. # (1) 各行ごとに1バイト空白 ' ',または,タブ '\t' で区切られた部分文字列が何個あるかカウントする関数を作成し, #   出力の際に,行番号の右側に表示する.(画面表示の例) # (2) 結果を画面表示すると共に,同等の内容をファイルに書き出す. #   ファイル形式は HTML ファイル(.html)とすること. #   ・ただし,HTMLファイルに用いるタグは FireFox や Safari などで,それなりの表示が得られる程度で良い # # #include <stdio.h> # #include <stdlib.h> # int main (void){ char fileName[] = "14-1.c"; # FILE *f; # f=fopen(fileName, "r"); # if(f==NULL){ # printf("ファイルが開けませんでした\n"); # exit(EXIT_FAILURE);} # int lineNum=1; # char str[256]; # while(fgets(str,255,f) !=NULL){ # printf("%03d :%s",lineNum,str); # lineNum++;} # printf("\n"); # char* line = "--------------------------------\n"; # printf("%s",line); # printf("lines: %d\n",lineNum-1); # printf("%s",line); # fclose(f); # return 0;} # [3]c言語 # [4]1/31 よろしくお願いします # # '(1) 各行ごとに1バイト空白または,タブで区切られた部分文字列が何個あるかカウントする関数を作成し,出力の際に,行番号の右側に表示する.'(_ファイル) :- 各行ごとに(_ファイル,Line,_行番号,R), '1バイト空白または,タブで区切られた部分文字列が何個あるかカウントする'(Line,_何個), '出力の際に,行番号の右側に表示する'(_行番号,_何個,Line), R = []. 各行ごとに(_ファイル,Line,_行番号,R) :- get_lines(_ファイル,Lines), append(L0,[Line|R],Lines), length([_|L0],_行番号). '1バイト空白または,タブで区切られた部分文字列が何個あるかカウントする'(Line,_何個) :- split(Line,[' ','\t'],L), length(L,_何個). '出力の際に,行番号の右側に表示する'(_行番号,_何個,Line) :- writef('%t:%t %t\n',[_行番号,_何個,Line]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/780 # # [2]構造体についての問題です # ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する. # 2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する. # 実行例 # ----------------------------------------------------- # [1] Aさんのデータを入力 # [2] Bさんのデータを入力 # [3] 結果表示 # [9] 終了 # ----------------------------------------------------- # #コマンドを入力して下さい:1 # Aさんの生れた年は?:1967 # Aさんの生れた月は?:8 # # #コマンドを入力して下さい:3 # まだBさんのデータが入力されていません! # # #コマンドを入力して下さい:2 # Bさんの生れた年は?:1987 # Bさんの生れた月は?:10 # # #コマンドを入力して下さい:3 # Aさんは 20年と2ヶ月 Bさんより年上です. # # #コマンドを入力して下さい:9 # [3]環境 #  [3.1] OS:Linux  [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C # [4]1/31 # よろしくお願いします # # '2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示す' :- 機能選択(_選択された機能), '2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示す'. 機能選択(_選択された機能) :- 機能選択表示, write('コマンドを入力して下さい:'), get_line(Line), 機能選択(Line,_選択された機能). 機能選択表示 :- write('----------------------------------------------------- \n'), write('[1] Aさんのデータを入力 \n'), write('[2] Bさんのデータを入力 \n'), write('[3] 結果表示 \n'), write('[9] 終了 \n'), write('----------------------------------------------------- \n'). 機能選択('1') :- '[1] Aさんのデータを入力'. 機能選択('2') :- '[2] Bさんのデータを入力'. 機能選択('3') :- '[3] 結果表示'. 機能選択('4') :- '[9] 終了'. '[1] Aさんのデータを入力' :- write('Aさんのデータを入力します。\n'), write('Aさんの生れた年は?:'), get_integer(_年), write('Aさんの生れた月は?: '), get_integer(_月),!. '[2] Bさんのデータを入力' :- write('Bさんのデータを入力します。\n'), write('Bさんの生れた年は?:'), get_integer(_年), write('Bさんの生れた月は?: '), get_integer(_月),!. '[3] 結果表示' :- findall([_氏名,_年,_月],( 生年月日(_氏名,_生年月日_年,_生年月日_月)), _生年月日ならび), 生年月日の差(_生年月日ならび,_年長氏名,_年下氏名,_年の差,_月の差), writef('%tさんは %t年と%tヶ月 %tさんより年上です.\n',[_年長氏名,_年下氏名,_年の差,_月の差]). 生年月日の差([[_氏名_1,_生年月日_年_1,_生年月日_月_1],[_氏名_2,_生年月日_年_2,_生年月日_月_2]],_年長氏名,_年下氏名,_年の差,_月の差) :- _紀元元年からの累積月_1 is _生年月日_年_1 * 12 + _生年月日_月_1, _紀元元年からの累積月_2 is _生年月日_年_2 * 12 + _生年月日_月_2, _月換算の差 is _生年月日累積月_1 - _生年月日累積月_2, 生年月日の差(_月換算の差,_年長氏名,_年下氏名,_年の差,_月の差). 生年月日の差(_月換算の差,'A','B',_年の差,_月の差) :- _月換算の差 >= 0, _年の差 is _月換算の差 // 12, _月の差 is _月換算の差 mod 12. 生年月日の差(_月換算の差,'B','A',_年の差,_月の差). _月換算の差 < 0, _年の差 is abs(_月換算の差) // 12, _月の差 is abs(_月換算の差) mod 12. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/668 # # [1] 授業単元:ソート # [2] 問題文(含コード&リンク): # 1. savadata.txt内にあるデータを読み取り、名前順にソートして # 全員分のLEVEL、PLAYER NAME、POINTを表示するプログラムを # 作成せよ. # # 2. savadata.txt内にあるデータを読み取り、レベル別にPOINTが上位3人までのPlayerNameとそのPOINTおよび # レベル別の全体の平均点(Average)を表示させるプログラムを作成せよ. # # 出力例) # ■EASY # Rank1 : Tanaka 1000 POINT # Rank2 : Onishi 875 POINT # Rank3 : KItano 685 POINT # Average : 256 POINT # # ■Normal # Rank1 : Kuriyama 900 POINT # Rank2 : Onishi 775 POINT # Rank3 : KItano 605 POINT # Average : 232 POINT # # savedata.txt # http://ime.nu/www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=downld&no=5099 # # HARD Ichihashi 230 # HARD Tanaka 170 # HELL Nakamura 10 # EASY kanzaki 130 # HARD Ichihashi 20 # VERY HARD Tamura 570 # HELL Ishii 1000 # EASY kanagawa 200 # HARD Kuriyama 250 # DETH Takeda 180 # HELL Nakanishi 10 # NORMAL kamida 450 # HARD Iguchi 290 # VERY HARD Tanaka 370 # DETH Murata 800 # VERY HARD THirano 290 # HARD Kanemoto 230 # NORNAL Yano 110 # HELL Kuji 10 # EASY Arai 130 # EASY Hamada 20 # VERY HARD Satoh 120 # NORNAL ishimura 900 # EASY Ushijima 200 # HARD Kumada 230 # NORNAL Nasuno 820 # HELL Hashimoto 0 # EASY Kim 130 # HARD John 20 # VERY HARD Kimura 170 # HARD Nishioka 470 # NORNAL Honda 400 # 'savadata.txt内にあるデータを読み取り、名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する' :- 'savadata.txt内にあるデータを読み取り'(LL), '名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL). 'savadata.txt内にあるデータを読み取り'(LL) :- get_lines('savadata.txt',Lines), Lines = [_見出し|_実データならび], '各行をLEVEL,PLAYER NAME,POINTに分割する'(1,_実データならび,LL). '各行をLEVEL,PLAYER NAME,POINTに分割する'(_,[],[]). '各行をLEVEL,PLAYER NAME,POINTに分割する'(N,[_行|R1],[[N,_LEVEL,_PLAYER_NAME,_POINT]|R2]) :- split(_行,[' ','\t'],L), 'LEVEL,PLAYER NAME,POINTに分割する'(L,_LEVEL,_PLAYER_NAME,_POINT), N2 is N + 1, '各行をLEVEL,PLAYER NAME,POINTに分割する'(N2,R1,R2). 'LEVEL,PLAYER NAME,POINTに分割する'(['VERY','HARD',_PLAYER_NAME,_POINT],'VERY HARD',_PLAYER_NAME,_POINT). 'LEVEL,PLAYER NAME,POINTに分割する'([_LEVEL,_PLAYER_NAME,_POINT],_LEVEL,_PLAYER_NAME,_POINT). '名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL) :- 名前を順に(LL,LL1), ソートして(LL1,LL2), '全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL2,LL). 名前を順に(LL,LL1) :- '鍵(名前)と行番号の対を作る'(LL,LL1). '鍵(名前)と行番号の対を作る'(LL,LL1) :- findall([_NAME,_行位置],( member([_行位置,_LEVEL,_PLAYER_NAME,_POINT],LL)), LL1). ソートして(LL1,LL2) :- 整列(LL1,LL2). '全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL1,LL) :- append(_,[[_,_行番号]|R],LL1), nth1(_行番号_1,LL,[_,_LEVEL,_PLAYER_NAME,_POINT]), writef('%t %t %t\n',[_LEVEL,_PLAYER_NAME,_POINT]), 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,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/581 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):ttp://www1.axfc.net/uploader/Sc/so/312148 # # データ例のように名前,性別, 5教科(国語,算数,理科,社会,英語)の試験の # 得点を格納したファイルがある.このデータを用いて実行例のような操作を行うことが # できるプログラムを作成せよ.ただし、構造体を用いてプログラム作成を行うこと # ※データは読み込み毎に上書きされる仕様でかまわない(保存する必要は無い) # # 【データ例】 # データファイル名は classA.txt # Andrew M 92 63 85 71 81 # Helen F 81 89 83 79 51 # Jane F 65 75 59 81 69 # John M 85 98 95 81 91 # Susan F 60 50 53 69 43 # Thomas M 72 62 79 66 72 # # # データファイル名は classB.txt # Ichiro M 82 65 75 81 41 # Jiro M 61 72 51 41 69 # Sabu M 55 68 85 81 81 # Hanako F 90 80 93 89 93 # # # 【実行例】 # ./a.out? # ----------------------- Menu -------------------------- # 1.データ読込 # 2.一覧表示 # 0.終了 # --------------------------------------------------------------- # コマンド >> 1 # [データ読込] # ファイル名を入力してください >> classA.txt # ファイル classA.txtからデータを読み込みました. # ----------------------- Menu -------------------------- # 1.データ読込 # 2.一覧表示 # 0.終了 # --------------------------------------------------------------- # コマンド >> 2 # [一覧表示 ] # 名前 性別 国語 数学 理科 社会 英語 平均点 # Andrew M 92 63 85 71 81 78.4 # Helen F 81 89 83 79 51 76.6 # Jane F 65 75 59 81 69 69.8 # John M 85 98 95 81 91 90.0 # Susan F 60 50 53 69 43 55.0 # Thomas M 72 62 79 66 72 70.2 # # ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ Menu ‐‐‐‐‐‐‐‐‐‐‐‐‐‐ # 1.データ読込 # 2.一覧表示 # 0.終了 # ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ # コマンド >> 0 # プログラムを終了します 操作の選択 :- repeat, メニュー表示, 操作の選択(_コマンド). メニュー表示 :- write('----------------------- Menu --------------------------\n1.データ読込\n2.一覧表示\n0.終了\n----------------------------------------------\n'), 操作の選択(0). 操作の選択(1) :- データの読み込み, fail. 操作の選択(2) :- 一覧表示, fail. コマンドの入力(_コマンド) :- write('コマンド >> '), get_line(_コマンド). 'データ読込' :- write('ファイル名を入力してください : '), get_line(_ファイル名), split(_ファイル名,['Class','.txt'],[_クラス名]), 既存データの削除(_クラス名), 'データ読込'(_ファイル名,_クラス名). 'データ読込'(_ファイル名,_クラス名) :- get_split_lines(_ファイル名,[' '],LL1), append(_,[L|R],LL1), P =.. [試験の得点,_クラス名|L], assertz(P), R = []. 既存データの削除(_クラス名) :- P =.. [試験の得点,_クラス名,_,_,_,_,_,_,_,_], retract(P), fail. 既存データの削除(_). 一覧表示 :- write('名前 性別 国語 数学 理科 社会 英語 平均点\n'), 試験の得点(_クラス,_名前,_性別,_国語,_数学,_理科,_社会,_英語,_平均点), writef('%10l %t %4r %4r %4r %4r %4r',[_名前,_性別,_国語,_数学,_理科,_社会,_英語]), format(' ~1f\n',[_平均点]), fail. 一覧表示. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/545 # # [1] 授業単元: 関数 # [2] 問題文: # 最大で5名の学生の名前、性別、身長と体重を登録し、BMIも計算して保存し、 # それらの結果を表示するプログラムを作成せよ。[BMI=体重(kg)/(身長(m)*身長(m))] # # プログラムを起動するとメニュー画面が現れ、 #  ・[1] 名前,性別,数値登録 #  ・[2] 登録内容訂正 #  ・[3] 一覧表示 #  ・[0] 終了 # が行えるようにすること。 ユーザには身長はcmで登録させること。 # # 各機能ごとに関数を分割する。登録と訂正に関わる関数、 # 一覧表示に関わる関数、main関数の3つに分けて作成せよ。 # # 訂正については、○人目のデータを指定し、内容(名前,性別,数値)を上書きする。 # # 'プログラムを起動するとメニュー画面が現れ、 ・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにすること。 ユーザには身長はcmで登録させること。 ' :- repeat, 'プログラムを起動するとメニュー画面が現れ', '・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにする'(_選択番号), 実行(_選択番号). 'プログラムを起動するとメニュー画面が現れ' :- write('選択してください\n'), write('・[1] 名前,性別,数値登録\n'), write('・[2] 登録内容訂正\n'), write('・[3] 一覧表示\n'), write('・[0] 終了\n'). '・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにする'(_選択番号) :- get_line(_選択番号), 選択番号診断(_選択番号),!. '・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにする'(_選択番号) :- '・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにする'(_選択番号). 選択番号診断(_選択番号) :- member(_選択番号,['0','1,','2','3']),!. 実行('0') :- !. 実行('1') :- '名前,性別,数値登録'. 実行('2') :- '登録内容訂正'. 実行('3') :- '一覧表示'. '名前,性別,数値登録' :- write('名前,性別,身長(cm)をカンマ区切りで入力して下さい\n'), readln(L), P = .. [身長|L], assertz(P), fail. '登録内容訂正' :- write('名前を入力して下さい\n'), get_line(_名前), '登録内容訂正'(_名前), fail. 登録内容訂正(_名前) :- findall([_名前,_性別,_身長],( 身長(_名前,_性別,_身長)), LL), 現在登録されている情報の開示(LL), 更新情報の入力(_名前,_性別,_身長), 登録内容の訂正(_名前,_性別,_身長). 更新情報の入力(_名前,_性別,_身長) :- write('性別,身長(cm)をカンマ区切りで入力して下さい\n'), readln([_更新された性別,_更新された身長]). 現在登録されている情報の開示(L) :- append(_,[[_名前,_性別,_身長]|R],L), writef('%12r,%t,%t\n',[_名前,_性別,_身長]), R = []. 登録内容の訂正(_名前,_性別,_身長) :- retract(身長(_名前,_性別,_身長)), assertz(身長(_名前,_更新された性別,_更新された身長)). 一覧表示 :- findall([_名前,_性別,_身長],( 身長(_名前,_性別,_身長)), LL), append(_,[[_名前,_性別,_身長]|R],LL), writef('%12r,%t,%t\n',[_名前,_性別,_身長]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/516 # # [1] 授業単元:キーボード入力 # [2] 問題文(含コード&リンク): # 打ち込む文章を表示して,それをユーザがそっくりに打ち込ませ # その正確さを判定するプログラムを作成せよ. # '打ち込む文章を表示して,それをユーザにそっくりに打ち込ませその正確さを判定する' :- 打ち込む文章を表示して(_打ち込む文章ファイル,_打ち込む文章), それをユーザにそっくりに打ち込ませ(_ユーザの打ち込んだ文章), その正確さを判定する(_打ち込む文章,_ユーザの打ち込んだ文章,_減点数,_正確さの判定), 判定を表示する(_減点数,_正確さの判定). 打ち込む文章を表示して(_打ち込む文章ファイル,_打ち込む文章) :- get_lines(_打ち込む文章ファイル,Lines), append(_,[_打ち込む文章|_],Lines), writef('%t\n',[_打ち込む文章]). それをユーザにそっくりに打ち込ませ(_ユーザの打ち込んだ文章) :- get_line(_ユーザの打ち込んだ文章). その正確さを判定する(_打ち込む文章,_ユーザの打ち込んだ文章,_減点数,_正確さの判定). atom_chars(_打ち込む文章,_打ち込む文章の文字ならび), atom_chars(_ユーザの打ち込んだ文章,_ユーザの打ち込んだ文章の文字ならび), 語彙判定(_打ち込む文章,_ユーザの打ち込んだ文章,_同一語彙数判定), 誤字脱字等判定(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字度数判定), 総合判定(_同一語彙数判定,_誤字脱字度数判定,_減点数,_正確さの判定). 同一語彙数判定(_打ち込む文章,_ユーザの打ち込んだ文章,_同一語彙数判定) :- 形態素解析(_打ち込む文章,_形態素解析_1), 形態素解析(_ユーザの打ち込んだ文章,_形態素解析_2), 語彙の出現数の差異(_形態素解析_1,_形態素解析_2,_語彙の出現数差異度数), _同一語彙数判定 is (-1) * 2 * _語彙の出現数差異度数. 語彙の出現数の差異(_形態素解析_1,_形態素解析_2,_語彙の出現数の差異度数) :- setof(_形態素,member(_形態素,_形態素解析_1),_整列した形態素), findall(_出現数差異,( member(_形態素,_整列した形態素), count(member(_形態素,_形態素解析_1),_度数_1), count(member(_形態素,_形態素解析_2),_度数_2), _出現数差異 is abs(_度数_1 - _度数_2)), _語彙の出現数の差異ならび), sum(_語彙の出現数の差異ならび,_語彙の出現数の差異度数). 誤字脱字等判定(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字度数判定) :- 誤字脱字度数(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字数ならび), findall(_文字数,( member([_,_文字数],_誤字脱字数ならび)), _誤字脱字文字数ならび), sum(_誤字脱字文字数ならび,_誤字脱字度数), _誤字脱字数判定 is (-1) * _誤字脱字度数. 誤字脱字度数([],[],[]). 誤字脱字度数([A,B|R1],[B|R2],[[脱字,1]|R3]) :- \+(A == B), 誤字脱字度数(R1,R2,R3). 誤字脱字度数([B|R1],[A,B|R2],[[誤字挿入,1]|R3]) :- \+(A == B), 誤字脱字度数(R1,R2,R3). 誤字脱字度数([A,B|R1],[C,B|R2],[[誤字,1]|R3]) :- \+(A == C), 誤字脱字度数(R1,R2,R3). 誤字脱字度数([A|R1],[A|R2],R3) :- 誤字脱字度数(R1,R2,R3). 総合判定(_同一語彙数判定,_誤字脱字度数判定,_減点数,_正確さの判定) :- _減点数 is _同一語彙数判定 + _誤字脱字度数判定, 分類判定(_減点数,_正確さの判定). 分類判定(0,'1級'). 分類判定(_減点数,'2級') :- _減点数 < 0, _減点数 >= (-3). 分類判定(_減点数,'3級') :- _減点数 < (-3), _減点数 >= (-7). 分類判定(_減点数,'4級') :- _減点数 < (-7), _減点数 >= (-12). 分類判定(_減点数,'5級') :- _減点数 < (-12). 判定を表示する(_減点数,_正確さの判定) :- writef('入力された文章の正確さ判定は誤り減点数 %t で %t です。\n',[_減点数,_正確さの判定]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/418 # # [1] 授業単元:コンピュータ工学 # [2] 問題文(含コード&リンク): # 例に示した通りに動作するプログラムを作成せよ。 # 例題の中にあるアンダーライン(_)は空白を示すものとする。 # input please-> 10_35_100_500・・・ # # message-> "10+35+100+500の合計は645です。" # '例に示した通りに動作するプログラム。 input please-> 10_35_100_500・・・ message-> "10+35+100+500の合計は645です。" ' :- write('input please-> '), readln(L), sum(L,_合計), concat_atom(L,'+',S), writef('%tの合計は%tです。\n',[S,_合計]). sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/357 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # scanf関数を用いて、次の文章を入力表示するプログラムを作成しなさい。 # # I am a student of Information Technology University. # # '次の文章を入力表示する I am a student of Information Technology University. ' :- get_line(Line), writef('%t\n',[Line]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/361 # # [2] 問題文(含コード&リンク): 構造体 # # ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する. 2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する. # 実行例 # ----------------------------------------------------- #  [1] Aさんのデータを入力 #  [2] Bさんのデータを入力 #  [3] 結果表示 #  [9] 終了 # ----------------------------------------------------- # # #コマンドを入力して下さい:1 # Aさんの生れた年は?:1967 # Aさんの生れた月は?:8 # # #コマンドを入力して下さい:3 # まだBさんのデータが入力されていません! # # #コマンドを入力して下さい:2 # Bさんの生れた年は?:1987 # Bさんの生れた月は?:10 # # #コマンドを入力して下さい:3 # Aさんは 20年と2ヶ月 Bさんより年上です. # # #コマンドを入力して下さい:9 # 留意点 # ・メニュー形式で実装. # ・関数化を行うこと. #  main 関数のみのプログラムは不可とします. # [3.3] 言語: c言語 # [4] 期限: 1月20日 # 'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する.' :- write('-----------------------------------------------------\n[1] Aさんのデータを入\n[2] Bさんのデータを入力\n[3] 結果表示\n[9] 終了\n-----------------------------------------------------\n'), コマンドの入力(_コマンド), コマンドの選択実行(_コマンド). 'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する.' :- 'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する.'. コマンドの入力(_コマンド) :- write('#コマンドを入力して下さい: '), get_line(_コマンド). コマンドの選択実行('9') :- !. コマンドの選択実行('1') :- get_integer(_生まれた年), get_integer(_生まれた月), 'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.'('A',_生まれた年,_生まれた月). コマンドの選択実行('2') :- get_integer(_生まれた年), get_integer(_生まれた月), 'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.'('B',_生まれた年,_生まれた月). コマンドの選択実行('3') :- '2人の年令の差(年,月まで)を 計算して以下のような結果を示す'. '2人の年令の差(年,月まで)を 計算して以下のような結果を示す' :- findall([_生まれた年,_生まれた月],( 'ある人の生まれた年,生まれた月'(_,_生まれた年,_生まれた月)), [[_Aの生まれた年,_Aの生まれた月],[_Bの生まれた年,_Bの生まれた月]]), 年齢差の計算(_Aの生まれた年,_Aの生まれた月,_Bの生まれた年,_Bの生まれた月,_表示文), writef('%t',[_表示文]). 'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.'(_ある人,_生まれた年,_生まれた月) :- assertz('ある人の生まれた年,生まれた月'(_ある人,_生まれた年,_生まれた月)). 年齢差の計算(_生まれた年,_生まれた月,_生まれた年,_生まれた月,'AさんとBさんは同じ年の同じ月の生まれです') :- !. 年齢差の計算(_Aの生まれた年,_Aの生まれた月,_Bの生まれた年,_Bの生まれた月,_表示文) :- M_1 is _Aの生まれた年 * 12 + _Aの生まれた月, M_2 is _Bの生まれた年 * 12 + _Bの生まれた月, 年齢差の計算(M_1,M_2,_表示文). 年齢差の計算(M_1,M_2,_表示文) :- M_1 > M_2, S is M_1 - M_2, _年 is S // 12, _月 is S mod 12, swritef(_表示文,'Aさんは %t年と%tヶ月 Bさん%tです.\n',[_年,_月,より年上]). 年齢差の計算(M_1,M_2,_表示文) :- M_1 < M_2, S is M_2 - M_1, _年 is S // 12, _月 is S mod 12, swritef(_表示文,'Aさんは %t年と%tヶ月 Bさん%tです.\n',[_年,_月,より年下]). % 以下のサイトは # 出典:: 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/222 # # 154代目の472の者です # 【質問テンプレ】 # [1] 授業単元:プログラム # [2] 問題文(含コード&リンク): # テキストファイルの内容をbuffの二次元配列に格納した後 # 1次元配列のAにbuffの内容を1行ずつ格納していきながら、2次元配列Xと # 1次元配列Yに書き込んでいくプログラムを作れ。 # 要するに # textfileには # XX abcd; # YY efd; # ZZ bcd; # というようになっています。 # 二次元配列Xに # 0 XX # 1 YY # 2 ZZ # というように3文字目のブランクの前の文字列を1行ずつ格納し # Yには # 0 a # 1 b # 2 c # というように3文字目のブランクの次の文字を格納したいのです。ただし、;はいれてはいけません。 # お願いします。 # 'テキストファイルの内容をbuffの二次元配列に格納した後、1次元配列のAにbuffの内容を1行ずつ格納していきながら、2次元配列Xと1次元配列Yに書き込んでいく。ただし、Xの要素は3文字目のブランクの前の文字列、Yの要素は3文字目のブランクの次の文字'(_テキストファイル,_X,_Y) :- 'テキストファイルの内容をbuffの二次元配列に格納した後'(_テキストファイル,_buff), '1次元配列のAにbuffの内容を1行ずつ格納していきながら、2次元配列Xと1次元配列Yに書き込んでいく。ただし、Xの要素は3文字目のブランクの前の文字列、Yの要素は3文字目のブランクの次の文字'(_buff,_X,_Y). 'テキストファイルの内容をbuffの二次元配列に格納した後'(_テキストファイル,_buff) :- open(_テキストファイル,read,Instream), get_Lines(Instream,_buff), close(Instream). get_Lines(Instream,[]) :- at_end_of_stream(Instream),!. get_Lines(Instream,[L|R]) :- get_char(Instream,Char), get_line(Instream,Char,L), get_Lines(Instream,R). get_line(Instream,Char,[Char]) :- at_end_of_stream(Instream),!. get_line(Instream,'\n',[]) :- !. get_line(Instream,Char,[Char|R]) :- get_char(Instream,Char2), get_line(Instream,Char2,R). '1次元配列のAにbuffの内容を1行ずつ格納していきながら、2次元配列Xと1次元配列Yに書き込んでいく。ただし、Xの要素は3文字目のブランクの前の文字列、Yの要素は3文字目のブランクの次の文字'([],[],[]) :- !. '1次元配列のAにbuffの内容を1行ずつ格納していきながら、2次元配列Xと1次元配列Yに書き込んでいく。ただし、Xの要素は3文字目のブランクの前の文字列、Yの要素は3文字目のブランクの次の文字'([_A|R1],_X,_Y) :- 'Xの要素は3文字目のブランクの前の文字列'(_A,_X,R2), 'Yの要素は3文字目のブランクの次の文字'(_A,_Y,R3), '1次元配列のAにbuffの内容を1行ずつ格納していきながら、2次元配列Xと1次元配列Yに書き込んでいく。ただし、Xの要素は3文字目のブランクの前の文字列、Yの要素は3文字目のブランクの次の文字'(R1,R2,R3). 'Xの要素は3文字目のブランクの前の文字列'(_A,_X,R) :- length([_|L0],3), append(L0,[' '|_],_A), _X = [L0|R]. 'Yの要素は3文字目のブランクの次の文字'(_A,_Y,R) :- length([_|L0],3), append(L0,[' '|[_文字|_]],_A), _Y = [_文字|R]. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/205 # # [1] 授業単元:楽しいC言語(ファイルからの読み込み) # [2] 問題文(含コード&リンク):以下の実行例のように,キーボードからファイル名を # 読み込み,そのファイル中の数字文字の個数をカウント # して画面に表示するプログラムを作成せよ.(’0’〜’9’ # のそれぞれの個数を別々に数える必要はない.) # # 【実行結果例】 # % cat intro.txt # Hello! # I’m Taro .MASAKI # I was born in Tokyo in 1991. # ./intro # ファイル名:intro.txt # ファイル中の数字文字の個数:4 # 'キーボードからファイル名を読み込み,そのファイル中の数字文字の個数をカウントして画面に表示する' :- write('ファイル名 : '), get_line(_ファイル名), get_chars(_ファイル名,Chars), count((member(A,Chars),数字(A)),_数字の度数). writef('ファイル中の数字文字の個数: %t\n',[_数字の度数]). 数字(A) :- char_code(A,Code), Code >= 48, Code =< 57. count(P,N) :- findall(1,P,L), length(L,N). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/205 # # [1] 授業単元:楽しいC言語(ファイルからの読み込み) # [2] 問題文(含コード&リンク):以下の実行例のように,キーボードからファイル名を # 読み込み,そのファイル中の数字文字の個数をカウント # して画面に表示するプログラムを作成せよ.(’0’〜’9’ # のそれぞれの個数を別々に数える必要はない.) # # 【実行結果例】 # % cat intro.txt # Hello! # I’m Taro .MASAKI # I was born in Tokyo in 1991. # ./intro # ファイル名:intro.txt # ファイル中の数字文字の個数:4 # 'キーボードからファイル名を読み込み,そのファイル中の数字文字の個数をカウントして画面に表示する' :- write('ファイル名 : '), get_line(_ファイル名), get_chars(_ファイル名,Chars), count((member(A,Chars),数字(A)),_数字の度数). writef('ファイル中の数字文字の個数: %t\n',[_数字の度数]). 数字(A) :- char_code(A,Code), Code >= 48, Code =< 57. count(P,N) :- findall(1,P,L), length(L,N). % 以下のサイトは # 出典:: 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/1325685876/177 # # [1] 授業単元:C++ # [2] 問題文(含コード&リンク): # 以下のxmlファイルからSysDataの格納パスを取得する # # <?xml version="1.0" encoding="utf-8"?> # <Data> # <Items> # <Key>SysConf</Key> # <Value>D:\tmp\conf</Value> # </Item> # <Items> # <Key>SysEtc</Key> # <Value>D:\tmp\etc</Value> # </Item> # <Items> # <Key>SysData</Key> # <Value>D:\tmp\data</Value> # </Item> # # </Data> # '以下のxmlファイルからSysDataの格納パスを取得する'(_ファイル,_格納パス) :- get_lines(_ファイル,Lines), append(_,['','SysData',Line,''|_],Lines), sub_atom(Line,_,_,_,S1,S2,S3,L1,[<,'V',a,l,u,e,>|R1],[<,/,'V',a,l,u,e,>,|_]), concat_atom(R1,_格納パス),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/129 # # [1] 授業単元:計算機アルゴリズム(ファイルへの追加書込み) # [2] 問題文(含コード&リンク):一言日記をファイルに書き込むプログラムを作成した # い.以下の要件を満たすプログラムを作成せよ. # 実行例 # 一言日記ファイル名:test.txt # ファイルがありません。新規作成しますか(Yes…1 / # No…0):0 # プログラムを終了します。 # (以下,diary.txt に既に日記が書かれているとする) # % cat diary.txt # 2011 年12 月6 日12 時23 分来週中間テスト # 2011 年12 月13 日10 時35 分これからテスト! # 2011 年12 月16 日9 時40 分風邪ひいた # # 一言日記ファイル名:diary.txt # ファイルが見つかりました。追記しますか(Yes…1 / # No…0):1 # 日記の文字列を入力:プログラミング演習中 # % cat diary.txt # 2011 年12 月6 日12 時23 分来週中間テスト # 2011 年12 月13 日10 時35 分これからテスト! # 2011 年12 月16 日9 時40 分風邪ひいた # 2011 年12 月22 日14 時28 分プログラミング演習中 # # # '一言日記をファイルに書き込む'(_一言日記ファイル) :- exists_file(_一言日記ファイル), write('ファイルが見つかりました。追記しますか(Yes…1\nNo…0):'), get_line(Line), '一言日記をファイルに追記'(Line,_一言日記ファイル),!. '一言日記をファイルに書き込む'(_一言日記ファイル) :- write('ファイルがありません。新規作成しますか(Yes…1\nNo…0):'), get_line(Line), 新規作成書き込み(Line,_一言日記ファイル),!. 新規作成書き込み('0',_) :- !. 新規作成書き込み('1',_一言日記ファイル) :- write('日記の文字列を入力:'), open(_一言日記ファイル,write,Outstream), 'eofになるまで書き込み'(Outstream), close(Outstream). '一言日記をファイルに追記'('0',_) :- !. '一言日記をファイルに追記'('1',_一言日記ファイル) :- write('日記の文字列を入力:'), open(_一言日記ファイル,append,Outstream), 'eofになるまで書き込み'(Outstream), close(Outstream). 'eofになるまで書き込み'(Outstream) :- at_end_of_stream(current_input),!. 'eofになるまで書き込み'(Outstream) :- get_line(Line), writef(Outstream,'%t\n',[Line]), 'eofになるまで書き込み'(Outstream). get_line(Line) :- get_char(Char), get_line(Char,Chars), atom_chars(Line,Chars). get_line('\n',[]) :- !. get_line(Char,[Char|R]) :- get_char(Char2), get_line(Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/159 # # ●正規表現の使用環境 # テキスト # # ●検索か置換か? # 置換 # # ●説明 # 文章内の指定した数の改行毎に、行を一段開けたい。 # 下記例文なら改行三つごとに行を一段開けたい。 # # ●対象データ # (例文) # 人は誰しも初体験にはほろ苦く、甘酸っぱい思い出があるものだが、人生の諸先輩方はどんな童貞喪失体験をしたのか? # 「シリーズ初体験」−−現在70歳の会社役員(兵庫県)が当時の思い出を語った。 # 中学2年の時、国語の女教師に「勉強を教えてあげるから家においで」といわれ、夏休みに入ってすぐに先生の家を訪れました。 # 教師になって3年目、美人ではないけれど、私にとっては優しいお姉さんのような存在でした。 # 何人かいるのかなと思ったんですが、先生の家に行くと私の他は誰もいませんでした。 # 勉強を教わり、夕食をご馳走になり、その日は泊めてもらいました。 # 夜中、下半身がもぞもぞするので目が覚めると、先生が私の浴衣の裾を広げていました。 # # ●希望する結果 # 人は誰しも初体験にはほろ苦く、甘酸っぱい思い出があるものだが、人生の諸先輩方はどんな童貞喪失体験をしたのか? # 「シリーズ初体験」−−現在70歳の会社役員(兵庫県)が当時の思い出を語った。 # 中学2年の時、国語の女教師に「勉強を教えてあげるから家においで」といわれ、夏休みに入ってすぐに先生の家を訪れました。 # # 教師になって3年目、美人ではないけれど、私にとっては優しいお姉さんのような存在でした。 # 何人かいるのかなと思ったんですが、先生の家に行くと私の他は誰もいませんでした。 # 勉強を教わり、夕食をご馳走になり、その日は泊めてもらいました。 # # 夜中、下半身がもぞもぞするので目が覚めると、先生が私の浴衣の裾を広げていました。 # ------------------------- # よろしくお願いします。 # # '文章内の指定した数の改行毎に、行を一段開ける'(_ファイル,_n行毎) :- get_lines(_ファイル,Lines), 'n行毎に改行を挿入する'(Lines,Lines2), 表示する(_ファイル,Lines2). 'n行毎に改行を挿入する'([A,B,C|R1],[A,B,C,'\n'|R2]) :- 'n行毎に改行を挿入する'(R1,R2),!. 'n行毎に改行を挿入する'(L,L). 表示する(_ファイル,Lines) :- put_lines(_ファイル,Lines). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/122 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # ttp://www.dotup.org/uploda/www.dotup.org2496567.txt.html # # 設問1-1 # プログラミング実習の出席回数と試験結果をそれぞれ別々のファイルに記録するプログラムを作成し、 # 10人分の適当なデータをキーボードから入力して実行しなさい。 # プログラムとしてはn(>0)人分のデータを記録できるように作成し、変数nの値はキーボードから入力できるようにしなさい。 # ただし、データはキーボードから入力しファイルに書き込むこととする。 # それぞれのファイルには、出席番号、前期の結果、後期の結果を次のように記録するものとする。 # # 出席の記録 # ファイル名:Class_Participation.txt # # 1, 12, 5 # 2, 10, 12 # 3, 11, 15 # 4, 4, 15 # 5, 8, 14 # # …, …, … # # 試験の記録 # ファイル名:Exams.txt # # 1, 88, 90 # 2, 96, 75 # 3, 40, 80 # 4, 40, 75 # 5, 90, 90 # # …, …, … # # 設問1-2 # 設問1-1のデータについて、成績は、((前期出席回数+後期出席回数)+(前期試験点数+後期試験点数))/2で評価するものとし、 # 設問1-1で作成したファイルからデータを読み込み、成績を計算表示するプログラムを作成し、実行してみなさい。 # 'プログラミング実習の出席回数と試験結果をそれぞれ別々のファイルに記録するプログラムを作成し、10人分の適当なデータをキーボードから入力して実行しなさい' :- 'n人分の適当なデータをキーボードから入力'(10,_n人分のデータ), 'プログラミング実習の出席回数と試験結果をそれぞれ別々のファイルに記録する'(_n人分のデータ). 'n人分の適当なデータをキーボードから入力'(_n人,_n人分のデータ) :- length(_n人分のデータ,_n人), findall(_データ,( append(Ln,[_データ|_],_n人分のデータ), データ入力([_|Ln],_データ)), _n人分のデータ). データ入力(Ln,[_学生番号,_前期出席数,_後期出席数,_前期成績,_後期成績]) :- length(Ln,_何番目), writef('第%t番目の 学生番号,前期出席数,後期出席数,前期成績,後期成績(5項目)をカンマ区切りで入力してください : ',[_何番目]), readln([_学生番号,_前期出席数,_後期出席数,_前期成績,_後期成績]),!. データ入力(Ln,_データ) :- write('もう一度入力しなおして下さい\n'), データ入力(Ln,_データ). 'プログラミング実習の出席回数と試験結果をそれぞれ別々のファイルに記録する'(_n人分のデータ) :- 'プログラミング実習の出席回数をファイルClass_Participation.txtに書きだす'(_n人分のデータ), 'プログラミング実習の試験結果をファイルExams.txtに書きだす'(_n人分のデータ). 'プログラミング実習の出席回数をファイルClass_Participation.txtに書きだす'(_n人分のデータ) :- open('Class_Participation.txt',write,Outstream), append(_,[[_学生番号,_前期出席数,_後期出席数,_,_]|R],_n人分のデータ), writef(Outstream,'%t,%t,%t\n',[_学生番号,_前期出席数,_後期出席数]), R = [], close(Outstream). 'プログラミング実習の出席回数をファイルExams.txtに書きだす'(_n人分のデータ) :- open('Exams.txt',write,Outstream), append(_,[[_学生番号,_,_,_前期成績,_後期成績]|R],_n人分のデータ), writef(Outstream,'%t,%t,%t\n',[_学生番号,_前期成績,_後期成績]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/87 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク): # 次のように1行に氏名、科目ごとの成績が記録されたファイル # (ファイル名:result.dat)があるとする。 # Name English Science Math Sociology # Ichiro 100 30 40 90 # Jiro 100 80 70 100 # Saburo 80 90 100 60 # Shiro 95 90 95 80 # Goro 73 85 90 98 # このファイルを読み込んで各生徒の平均点を求め、平均点の高い順に行を並べ替えて表示するプログラムを作成せよ。 # (表示には平均点を含む) # '1行に氏名、科目ごとの成績が記録されたファイル(ファイル名:result.dat)があるとする。このファイルを読み込んで各生徒の平均点を求め、平均点の高い順に行を並べ替えて表示する' :- get_lines('result.dat',[_第一行|LL]), findall([_平均点,_氏名],( member(Line,LL), split(Line,[' '],[_|_得点ならび]), avg(_得点ならび,_平均点)), _平均点ならび), 平均点の高い順に行をならび替えて表示する(_第一行,LL,_平均点ならび). 平均点の高い順に行をならび替えて表示する(_第一行,LL,_平均点ならび) :- 平均点の高い順に(_平均点ならび,_平均点の高い順の氏名ならび), 行をならび替えて(_第一行,LL,_平均点の高い順の氏名ならび,_表示行ならび), 表示する(_表示行ならび). 平均点の高い順に(_平均点ならび,LL,_行のならび) :- sort(_平均点ならび,_整列した平均点), reverse(_整列した平均点,_平均点の高い順にならび替えた行), findall(_氏名,( member([_,_氏名],_平均点の高い順にならび替えた行)), _平均点の高い順の氏名ならび). 行をならび替えて(_第一行,LL,_平均点の高い順の氏名ならび,[_第一行|_表示行ならび]) :- findall([_氏名,Line],( member(Line,LL), split(Line,[' '],[_氏名|_])), LL1), findall(L,( member(_氏名,_平均点の高い順の氏名ならび), member([_氏名,Line],LL1)), _表示行ならび). 表示する(_表示行ならび) :- append(_,[_表示行|R],_表示行ならび), writef('%t\n',[_表示行]), R = []. % 以下のサイトは # 出典:: 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/792 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # メンバとして映画のタイトル(文字列)と公開年(int # 型整数)をもつ構造体movie を宣言し,movie 型構造 # 体のメンバの値を設定してその構造体を返す関数struct movie set_movie(void)を作成しプログラムを完成させよ. # [実行例] # 映画のタイトルを入力してください:HAYABUSA # 公開年を入力してください:2011 # データを設定しました。 # タイトル:HAYABUSA 公開年:2011 # 'メンバとして映画のタイトル(文字列)と公開年(int型整数)をもつ構造体movie を宣言し,movie 型構造体のメンバの値を設定してその構造体を返す'(映画(_タイトル,_公開年)) :- 'メンバとして映画のタイトル(文字列)と公開年(int型整数)をもつ構造体movie を宣言し', 映画に値を設定する(_映画のタイトル,_公開年), assertz(映画(_映画のタイトル,_公開年)), write('データを設定しました。\n'), writef('タイトル:%t 公開年:%t\n',[_タイトル,_公開年]). 'メンバとして映画のタイトル(文字列)と公開年(int型整数)をもつ構造体movie を宣言し' :- assertz(データベース定義(映画,1,タイトル)), assertz(データベース定義(映画,2,公開年)). 値を設定する(_映画のタイトル,_公開年) :- 映画のタイトルの入力(_映画のタイトル), 公開年の入力(_公開年). 映画のタイトルの入力(_映画のタイトル) :- write('映画のタイトルを入力してください:'), get_line(_映画のタイトル). 公開年の入力(_公開年) :- write('公開年を入力してください:'), get_line(_公開年). % 以下のサイトは # 出典:: 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://toro.2ch.net/test/read.cgi/tech/1322562648/749 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/WOUG0 # # 文字列のソートを行うプログラム # 1) ファイル内の単語をソートする # 2) 半角小文字(aからzまで)だけで良いとする # 3) 1単語あたりの文字数は自由に指定してください # 4) ファイルからの読み込み等と、ソートそのものを別の関数として作成すること # 5) 採用したデータ構造について説明すること # 6) ソートのアルゴリズムについて説明すること ファイル内の単語をソートする(_ファイル) :- ファイルからの読み込み(_ファイル,_単語ならび), クイックソートアルゴリズムを用いてオンメモリで文字列のソートを行う(_単語ならび,_整列した単語ならび), ファイルへ書き戻す(_ファイル). ファイルからの読み込み(_ファイル,_単語ならび) :- open(_ファイル,read,Instream), ストリームからの読み込み(Instream,_単語ならび), close(Instream). ストリームからの読み込み(Instream,[]) :- at_end_of_stream(Instream),!. ストリームからの読み込み(Instream,[_単語|R]) :- get_line(Instream,_単語), ストリームからの読み込み(Instream,R). クイックソートアルゴリズムを用いてオンメモリで文字列のソートを行う(_単語ならび,_整列した単語ならび) :- ソート(_単語ならび,_整列した単語ならび). ソート([],[]). ソート(_ならび,_整列済みならび) :- 軸要素は先頭要素とする, _ならび = [_軸要素|R], 分割する(_軸要素,R,_軸要素より小さいならび,_軸要素と等しいか大きいならび), ソート(_軸要素より小さいならび,_整列した軸要素より小さいならび), ソート(_軸要素と等しいか大きいならび,_整列した軸要素と等しいか大きいならび), append(_整列した軸要素より小さいならび,[_軸要素|_整列した軸要素と等しいか大きいならび],_整列済みならび). 分割する(_軸要素,[],[],[]) :- '対象要素がなくなったら第三引数と第四引数の不確定要素を[]に単一化してならびを終止する'. 分割する(_軸要素,[_対象要素|R1],[_対象要素|R2],R3) :- 対象要素が軸要素より小さい場合は(_対象要素,_軸要素), 第三引数にコピー, 分割する(_軸要素,R1,R2,R3). 分割する(_軸要素,[_対象要素|R1],R2,[_対象要素|R3]) :- 対象要素が軸要素と等しいか大きい場合は(_対象要素,_軸要素), 第四引数にコピー, 分割する(_軸要素,R1,R2,R3). 対象要素が軸要素より小さい場合は(_対象要素,_軸要素) :- A @< _軸要素. 対象要素が軸要素と等しいか大きい場合は(_対象要素,_軸要素) :- A @>= _軸要素. ファイルへ書き戻す(_ファイル,_整列された単語ならび) :- open(_ファイル,write,Outstream), append(_,[_単語|R],_整列された単語ならび), writef(Outstream,'%t\n',[_単語]), R = [], close(Outstream). 軸要素は先頭要素とする. '対象要素がなくなったら第三引数と第四引数の不確定要素を[]に単一化してならびを終止する'. 第三引数にコピー. 第四引数にコピー. % 以下のサイトは # http://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://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 がその日のセットメニューの代金の最小値である. # # ※各入出力例のデータは,右クリック等によりファイルに保存して利用可能です. # '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種類のパスタの価格), readln([_パスタの価格])), _3種類のパスタの価格). '2種類のジュースの価格を得る'(_2種類のジュースの価格) :- length(_2種類のジュースの価格,2), findall(_ジュースの価格,( % _パスタの価格となっていた 12/23訂正 append(_,[_ジュースの価格|_],_2種類のジュースの価格), readln([_ジュースの価格])), _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. % 以下のサイトは # 出典:: 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/703 # # [1] 授業単元:C言語 # [2] 問題文:入力したxとyを交互に読み取り、zに出力するプログラムを作成せよ # 例 # x=いはほとりる # y=ろにへちぬを # z=いろはにほへとちりぬるを # '入力したxとyを交互に読み取り、zに出力する'(_z) :- write('xを入力して下さい : '), get_line(_x), write('yを入力して下さい : '), get_line(_y), 'xとyを交互に読み取り、zに出力する'(_x,_y,_z). 'xとyを交互に読み取り、zに出力する'(_x,_y,_z) :- 'xとyを交互に読み取り'(_x,_y,A,B,_x_2,_y_2), 'xとyを交互に読み取り、zに出力する'(_x_2,_y_2,_z_2), concat_atom([A,B,_z_2],_z). 'xとyを交互に読み取り、zに出力する'(_x,_y,_z) :- atom_concat(_x,_y,_z). 'xとyを交互に読み取り'(_x,_y,A,B,_x_2,_y_2) :- sub_atom(_x,0,1,R1,A), sub_atom(_y,0,1,R2,B), sub_atom(_x,1,R1,0,_x_2), sub_atom(_y,1,R2,0,_y_2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/700 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # (1)20個の適当な整数が空白で区切られて保存されているファイルを作成せよ。 # このファイルに含まれる整数のうち最大のものを出力せよ。 # # (2)15個の適当な整数が空白で区切られて保存されているファイルを作成せよ。 # このファイルに含まれる整数を,その保存されている順とは逆順に”result.txt”というファイルに出力せよ。 # # '15個の適当な整数が空白で区切られて保存されているファイルを作成せよ'(_ファイル) :- '15個の適当な整数'(_15個の適当な整数), 空白で区切られて(_15個の適当な整数,_空白で区切られた文字列), open(_ファイル,write,Outstream), writef(Outstream,'%t\n',[_空白で区切られた文字列]), close(Outstream). '15個の適当な整数'(_15個の適当な整数) :- length(_15個の適当な整数), findall(V,( append(_,[V|_],_15個の適当な整数), V is random(10001) - 500), _15個の適当な整数). 空白で区切られて(_15個の適当な整数,_空白で区切られた文字列) :- concat_atom(_15個の適当な整数,' ',_空白で区切られた文字列). このファイルに含まれる整数を,その保存されている順とは逆順に”result.txt”というファイルに出力せよ このファイルに含まれる整数のうち最大のものを出力せよ(_ファイル) :- open(_ファイル,read,Instream), get_lines(Instream,Lines), close(Instream), '整数を逆順に"result.txt"というファイルに出力せよ'(Lines). '整数を逆順に"result.txt"というファイルに出力せよ'(Lines) :- 整数を逆順に(Lines,_逆順整数表示文字列), open('result.txt',write,Outstream), writef(Outstream,'%t\n',[_表示文字列]), close(Outstream). 行ならびを整数ならびに変換(Lines,_整数ならび) :- findall(_要素ならび,( append(_,[_行|_],Lines), split(_行,[' '],_要素ならび)), LL), flat(LL,L), 整数を選別する(L,_整数ならび). 整数を選別する(_要素ならび,_整数ならび) :- findall(_整数,( append(_,[_要素|_],_要素ならび), integer(_要素)), _整数ならび). 整数を逆順に(Lines,_逆順整数表示文字列) :- 行ならびを整数ならびに変換(Lines,_整数ならび), reverse(_整数ならび,_逆順の整数ならび), concat_atom(_逆順の整数ならび,' ',_逆順整数表示文字列). % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/700 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # (1)20個の適当な整数が空白で区切られて保存されているファイルを作成せよ。 # このファイルに含まれる整数のうち最大のものを出力せよ。 # # (2)15個の適当な整数が空白で区切られて保存されているファイルを作成せよ。 # このファイルに含まれる整数を,その保存されている順とは逆順に”result.txt”というファイルに出力せよ。 # # '20個の適当な整数が空白で区切られて保存されているファイルを作成せよ'(_ファイル) :- '20個の適当な整数'(_20個の適当な整数), 空白で区切られて(_20個の適当な整数,_空白で区切られた文字列), open(_ファイル,write,Outstream), writef(Outstream,'%t\n',[_空白で区切られた文字列]), close(Outstream). '20個の適当な整数'(_20個の適当な整数) :- length(_20個の適当な整数), findall(V,( append(_,[V|_],_20個の適当な整数), V is random(10001) - 500), _20個の適当な整数). 空白で区切られて(_20個の適当な整数,_空白で区切られた文字列) :- concat_atom(_20個の適当な整数,' ',_空白で区切られた文字列). このファイルに含まれる整数のうち最大のものを出力せよ(_ファイル) :- open(_ファイル,read,Instream), get_lines(Instream,Lines), close(Instream), 整数のうち最大のものを出力せよ(Lines). 整数のうち最大のものを出力せよ(Lines) :- 行ならびを整数ならびに変換(Lines,_整数ならび), max(_整数ならび,_最大値), writef('%t\n',[_最大値]). 行ならびを整数ならびに変換(Lines,_整数ならび) :- findall(_要素ならび,( append(_,[_行|_],Lines), split(_行,[' '],_要素ならび)), LL), flat(LL,L), 整数を選別する(L,_整数ならび). 整数を選別する(_要素ならび,_整数ならび) :- findall(_整数,( append(_,[_要素|_],_要素ならび), integer(_要素)), _整数ならび). % 以下のサイトは # 出典:: 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://toro.2ch.net/test/read.cgi/tech/1309076891/620 # # 【 課題 】(源列を入力すると16進数が表示されるプログラム #       (例)I have a dream と入力するとI have a dreamが16進数で出力される。 #       16進数を入力すると文字列が表示されるプログラム(,竜侫弌璽献腑) # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】SWT # 【 期限 】12/20 まで # 【 Ver  】1.6.0_24 # 【 補足 】プログラム中でどのような操作がされているか #       コメントをつけてくださると嬉しいです。 # よろしくお願いします。 # # '文字列を入力すると16進数が表示される' :- write('文字列を入力して下さい : '), get_line(_文字列), '文字列を16進数表記ならびに変換する'(_文字列,_16進数表記ならび), 表示される(_16進数表記ならび). '文字列を16進数表記ならびに変換する'(_文字列,_16進数表記ならび) :- atom_codes(_文字列,Codes), 文字コードを16進数に変換(Codes,_16進数表記ならび), 文字コードを16進数に変換([],_16進数表記ならび,_16進数表記ならび). 文字コードを16進数に変換([Code|R1],R2,_16進数表記ならび) :- Code < 256, 文字コードを16進文字表記に変換(Code,_16進数文字表記), 文字コードを16進数に変換([Code|R1],[_16進数文字表記|R2],_16進数表記ならび). 文字コードを16進数に変換([Code|R1],R2,_16進数表記ならび) :- Code >= 256, Code1 is Code // 256, Code2 is Code mod 256, 文字コードを16進数に変換([Code1,Code2|R1],R2,_16進数表記ならび). 文字コードを16進文字表記に変換(Code,_16進数文字表記) :- Code1 is Code // 16, Code2 is Code mod 16, '10進数16進文字表記'(Code1,CodeA), '10進数16進文字表記'(Code2,CodeB), atom_concat(CodeA,CodeB,_16進数文字表記). '10進数16進文字表記'(0,'0'). '10進数16進文字表記'(1,'1'). '10進数16進文字表記'(2,'2'). '10進数16進文字表記'(3,'3'). '10進数16進文字表記'(4,'4'). '10進数16進文字表記'(5,'5'). '10進数16進文字表記'(6,'6'). '10進数16進文字表記'(7,'7'). '10進数16進文字表記'(8,'8'). '10進数16進文字表記'(9,'9'). '10進数16進文字表記'(10,'A'). '10進数16進文字表記'(11,'B'). '10進数16進文字表記'(12,'C'). '10進数16進文字表記'(13,'D'). '10進数16進文字表記'(14,'E'). '10進数16進文字表記'(15,'F'). 表示される(_16進数表記ならび) :- concat_atom(_16進数表記ならび,_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: 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/1322562648/526 # # [1] 授業単元:プログラミング言語 # [2] 問題文(含コード&リンク):m行n列のテキストファイル(1.txt)をそれぞれ二次元配列に入れ、その配列から新しいテキストファイル(2.txt)に1.txtと同じ内容を出力するようなプログラムを作成せよ。 # 'm行n列のテキストファイル(1.txt)をそれぞれ二次元配列に入れ、その配列から新しいテキストファイル(2.txt)に1.txtと同じ内容を出力する'(_m行,_n列,LL) :- get_lines('1.txt',Lines), length(Lines,_m行), 区切り要素のスパイ(Lines,_n列,_区切り要素), 配列に入れる(Lines,_区切り要素,LL), '配列から新しいテキストファイル(2.txt)に1.txtと同じ内容を出力する'(LL). 区切り要素のスパイ([Line|_],_n列,',') :- length(L,_n列), split(Line,',',L),!. 区切り要素のスパイ([Line|_],_n列,' ') :- length(L,_n列), split(Line,' ',L),!. '配列から新しいテキストファイル(2.txt)に1.txtと同じ内容を出力する'(LL,_区切り要素) :- open('2.txt',write,Outstream), 出力する(Outstream,LL,_区切り要素), close(Outstream). 出力する(Outstream,LL,_区切り要素) :- append(_,[L|R],LL), concat_atom(L,_区切り要素,Line), writef(Outstream,'%t\n',[Line]), R = []. % 以下のサイトは # 出典:: 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/tech/1322562648/501 # # [1] 授業単元:配列とポインタ(アルゴリズム) # [2] 問題文(含コード&リンク):以下の実行例のように,文字列を入力すると,その前 # 後に"を付けた文字列を生成するプログラムを,ライブ # ラリ関数strcpy とstrcat を用いて作成せよ.ただし, # プログラムは以下の要件を満たすこととする # ・ユーザに入力させる文字列を格納する配列をstr1[],前後に"を付けた文字列のための配列をstr2[] とする. # ・ユーザに入力させる文字列は30 字までとする。 # ・配列str2[] は初期化せずに宣言し,ライブラリ関数strcpy とstrcat を使って(添字演算子[] を使わずに)前後に"を付けた文字列を生成すること. #   実行例. # 文字列を入力してください:Tokyo # 文字列の前後に"を付けました。 # str2:"Tokyo" #  [3.1] OS: linux debian #  [3.2] コンパイラ名とバージョン: gcc4.3.2 #  [3.3] 言語:C言語 # [4] 期限: 12月13日 14時 # [5] その他の制限: # '文字列を入力すると,その前後に"を付けた文字列を生成するプログラムを,ライブラリ関数strcpy とstrcat を用いて作成せよ.ただし,プログラムは以下の要件を満たすこととする。 ・ユーザに入力させる文字列を格納する配列をstr1[],前後に"を付けた文字列のための配列をstr2[] とする. ・ユーザに入力させる文字列は30 字までとする。 ・配列str2[] は初期化せずに宣言し,ライブラリ関数strcpy とstrcat を使って(添字演算子[を使わずに)前後に"を付けた文字列を生成すること.' :- 文字列の入力(_文字列), concat_atom(['"',_文字列,'"'],_生成された文字列), writef('前後に"を付加された文字列は %t です\n',[_生成された文字列]). 文字列の入力(_文字列) :- write('文字列を入力して下さい : '), get_line(Line), 文字列入力診断(Line,_文字列),!. 文字列入力診断(文字列,_文字列) :- atom_length(_文字列,_長さ), _長さ =< 30,!. 文字列入力診断(Line,_文字列) :- sub_atom(Line,0,30,_,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/458 # # [1] 授業単元:配列とポインタ # [2] 問題文(含コード&リンク):1,2,3,4,5,6...と続くテキストファイルを読み込み、 # 8×8の2次元配列で表し、別のテキストファイルに結果を書き込みなさい。ただし、読み込むファイルのデータの数が64個に満たない場合は、0を代入しなさい。 # '1,2,3,4,5,6...と続くテキストファイルを読み込み、8×8の2次元配列で表し、別のテキストファイルに結果を書き込みなさい。ただし、読み込ファイルのデータの数が64個に満たない場合は、0を代入しなさい。'(_テキストファイル,_別のテキストファイル) :- '1,2,3,4,5,6...と続くテキストファイルを読み込み'(_テキストファイル,_文字列), '8×8の2次元配列で表し'(_文字列,LL), 別のテキストファイルに結果を書き込む(_別のテキストファイル,LL). '1,2,3,4,5,6...と続くテキストファイルを読み込み'(_テキストファイル,_文字列) :- get_lines(_テキストファイル,Lines), concat_atom(Lines,_文字列). '8×8の2次元配列で表し'(_文字列,LL) :- split(_文字列,[','],_数字ならび), length(LL,8), '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'(_数字ならび,LL). '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'(_,[]) :- !. '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'(L1,[L2|R2]) :- \+(L1 = [_,_,_,_,_,_,_,_|_]), length(L2,8), append(L0,L1,L2), all(L0,0), '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'([],R2). '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'([A,B,C,D,E,F,G,H|R1],[[A,B,C,D,E,F,G,H]|R2]) :- '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/378 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):↓ # # 文字列操作のライブラリ関数を使用して、指定したファイルで、 # 最も辞書順(ASCIIコード順)で最初に出てくる単語と、最後に出てくる単語を見つけて表示せよ。また、最も長い単語も表示せよ。 # ・同じ長さの単語が複数ある場合には、最初に見つけたものだけ表示するだけでよい。 # ・ただし,ここでいう単語とは、スペースや改行、タブで区切られる文字の列で必ずしも、英数字とはかぎらない。(このような区切りで、ファイルから文字列を読むために%sを用いる) # ・単語の長さは100文字以内と考えてよい。 # ・標準文字列関数を利用