このディレクトリの索引

# [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.