このディレクトリの索引

% 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0.0,200.0,_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), read_term_from_atom(_身長文字列,_身長,[]), read_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重) :- 収束条件を満たす(_体重_下,_体重_上,_体重),!. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下_1,_体重_上_1,_身長,_BMI,_体重) :- '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重). 収束条件を満たす(_体重_下,_体重_上,_体重) :- (_体重_上 - _体重_下) < 0.1, _体重 is (_体重_上 + _体重_下) / 2. '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上) :- '新しい体重とその時のBMIを計算する'(_体重_下_1,_体重_上_1,_身長,_BMI_2,_体重_2), '次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体重_上). '新しい体重とその時のBMIを計算する'(_体重_下,_体重_上,_身長,_BMI_2,_体重_2) :- _体重_2 is (_体重_下 + _体重_上) / 2, _BMI_2 is _体重_2 / ((_身長 / 100) ^ 2). '次の体重の計算区間を得る'(_体重_下,_,_体重_2,_BMI,_BMI_2,_体重_下,_体重_2) :- _BMI_2 =< _BMI,!. '次の体重の計算区間を得る'(_体重_下,_体重_上,_体重_2,_BMI,_BMI_2,_体重_2,_体重_上). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % これはsplitをわかりやすいように簡略化した定義です。 % より完全なsplit/3の定義はこちらをご覧ください % split(_文,_区切り語ならび,_区切られた語ならび) :- 区切り語ならびの変形(_区切り語ならび,SeparatersL), atom_chars(_文,_文字ならび), split_list_1(_文字ならび,SeparatersL,_区切られた語ならび). sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_list([],SeparatersL,[]). split_list(L1,SeparatersL,[L2|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), split_list(R2,SeparatersL,R). split_list(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list(R2,SeparatersL,X). split_list_1([],SeparatersL,[]). split_list_1(L1,SeparatersL,[A|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), atom_chars(A,L2), split_list_1(R2,SeparatersL,R). split_list_1(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list_1(R2,SeparatersL,X). split_list_2([],_,[],[]). split_list_2(L1,SeparatersL,[],R) :- member(L2,SeparatersL), append(L2,R,L1). split_list_2([A|R1],SeparatersL,[A|R2],R) :- \+((member(L2,SeparatersL),append(L2,_,[A|R1]))), split_list_2(R1,SeparatersL,R2,R). 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび), atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,NL), catch(atom_chars(C,NL),_,fail),!. split_5(B,C) :- concat_atom(B,C),!. split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42([],[],'',_,[]) :- !. numeric_list([],[]) :- !. numeric_list([A|R],[B|R1]) :- digit(A), char_code(A,B), numeric_list(R,R1),!. numeric_list(['.'|R],[46|R1]) :- numeric_list(R,R1),!. numeric_list([-|R],[45|R1]) :- numeric_list(R,R1),!. number(A,B) :- number_codes(A,B). % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重) :- '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0,_身長,_BMI,_体重_BMIとの差ならび), 'BMIの計算差が最小のものの体重'(_体重_BMIとの差ならび,_体重). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(2000,_身長,_BMI,[]) :- !. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(N,_身長,_BMI,[[N,_BMI_の計算差]|R]) :- '身長、体重から、BMIの計算差を得る'(N,_身長,_BMI,N_2,_体重,_BMIの計算差), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(N_2,_身長,_BMI,R). '身長、体重から、BMIの計算差を得る'(N,_身長,_BMI,N_2,_体重,_BMIの計算差) :- _BMIの計算差 is abs((N / 10) / ((_身長 / 100) ^ 2)) - _BMI), succ(N,N_2), _体重 is N / 10. 'BMIの計算差が最小のものの体重'(_N_BMIとの差ならび,_体重) :- select([_体重,_BMIの差],_N_BMIとの差ならび,R), forall(member([_,_BMIの差_1],R),_BMIの差 =< _BMIの差_1). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重) :- _体重 is _BMI * (_身長 / 100) ^ 2. 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/71 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/TO8Kg 問題です。 # http://ime.nu/ideone.com/ZvUuR 課題を提出したら関数の定義 #              をしろといわれました。 # http://ime.nu/ideone.com/Nd5ir 自分なりにやったのですが #              ここからができませんでしたので #              よろしくお願いします。 # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙するプログラムkadai12.c を書きなさい。ただしファイル名は画面から入力されるものとする(scanf()を使う)。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分からないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)/(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。ただしファイル名は画面から入力されるものとする。' :- '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL), 'BMI値を計算し'(LL,LL1), 'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1). '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL) :- write('データファイル名を入力してください : '), get_line(_データファイル名), get_split_lines(_データファイル名,[' ',','],LL). 'BMI値を計算し'(LL1,LL2) :- findall([_BMI値,_氏名],( member([_氏名,_身長,_体重],LL1), 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値)), LL2). /* 'BMI値を計算し'([],[]). 'BMI値を計算し'([[_氏名,_身長,_体重]|R1],[[_BMI値,_氏名]|R2]) :- 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値), 'BMI値を計算し'(R1,R2). */ 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値) :- _BMI値 is _体重 / _身長 ^ 2. 'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1) :- 'BMI値が大きいもの順に'(LL1,LL3), その人のBMI値および肥満か否かを列挙する(LL3). 'BMI値が大きいもの順に'(LL1,LL3) :- sort(LL1,LL2), reverse(LL2,LL3). その人のBMI値および肥満か否かを列挙する(LL3) :- append(_,[[_BMI値,_氏名]|R],LL3), 'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,_肥満判定), writef('%t は %t。\n',[_氏名,_肥満判定]), R = []. 'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,肥満です) :- _BMI値 > 25.0,!. 'このBMI値が25を越えると、肥満とみなされる。'(_,肥満ではない). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/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/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/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/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://hibari.2ch.net/test/read.cgi/tech/1322562648/280 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/www1.axfc.net/uploader/Sc/so/298224 # # 以下に与えるファイルdata.datを作業ディレクトリ内に作成し、data.datからデータを読み込み、 # BMIを計算しBMI値を判定し、全員のデータを標準出力に出力し、更に男性のデータをdata2.txtという # 名前のファイルに出力するプログラムを作成せよ。BMI判定は18.5未満なら1、18.5以上25未満なら2、 # 25以上30未満なら3、30以上なら4とする。BMIの計算では関数calc_bmiを各自作成して計算を行うこと。 # 尚、data.dat内のデータは左から名前、性別(M=男性、F=女性)、身長[cm]、体重[kg]を表す # ※data2.datへの出力の際は性別の記入は必要ない # # # data.dat # Andrew M 38 180.5 105.2 # Helen F 23 171.9 65.1 # Jane F 31 172.4 75.4 # John M 19 186.6 78.3 # Susan F 27 168.1 62.7 # Thomas M 43 189.2 65.1 # # # <作成したプログラムの実行結果> # 『標準出力への出力結果』 # 名前 性別 年齢 身長[m] 体重[kg] BMI BMI 判定 # Andrew M 38 1.805000 105.200000 32.289501 4 # Helen F 23 1.719000 65.100000 22.030748 2 # Jane F 31 1.724000 75.400000 25.368619 3 # John M 19 1.866000 78.300000 22.487361 2 # Susan F 27 1.681000 62.700000 22.188713 2 # Thomas M 43 1.892000 65.100000 18.186064 1 # # 『data2.txtへの出力結果』 # Andrew 38 1.805000 105.200000 32.289501 4 # John 19 1.866000 78.300000 22.487361 2 # Thomas 43 1.892000 65.100000 18.186064 1 # 'data.datからデータを読み込み、BMIを計算しBMI値を判定し、全員のデータを標準出力に出力し、更に男性のデータをdata2.txtという名前のファイルに出力する' :- write('名前 性別 年齢 身長[m] 体重[kg] BMI BMI 判定\n'), get_split_lines('data1.txt',[' '],LL), append(_,[[_名前,_性別,_年齢,_身長,_体重]|R],LL), _BMI値 is _体重 / (_身長 * _身長), 'BMI判定'(BMI,_BMI判定), writef('%14r %4r %4r %8r %6r %5r %2r\n',[_名前,_性別,_年齢,_身長,_体重,_BMI値,_BMI判定]), R = []. 'BMI判定'(_BMI値,1) :- _BMI値 < 18.5,!. 'BMI判定'(_BMI値,2) :- _BMI値 >= 18.5, _BMI値 < 25.0,!. 'BMI判定'(_BMI値,3) :- _BMI値 >= 25.0, _BMI値 < 30.0,!. 'BMI判定'(_BMI値,4) :- _BMI値 >= 30.0,!., % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/746 # # [1] 授業単元:プログラミング言語 # [2] 問題文(含コード&リンク):10人の学生の身長(m),体重(kg)のデータを入力し、 # 各学生の身長(m),BMI値を表示するプログラムを作成しなさい。 # '10人の学生の身長(m),体重(kg)のデータを入力し、各学生の身長(m),BMI値を表示する' :- '10人の学生の身長(m),体重(kg)のデータを入力し'(_10人の学生の身長体重ならび), '各学生の身長(m),BMI値を表示する'(_10人の学生の身長体重ならび). '10人の学生の身長(m),体重(kg)のデータを入力し'(_10人の学生の身長体重ならび) :- length(_10人の学生の身長体重ならび,10), findall([No,_身長,_体重],( append(Ln,[_|_],_10人の学生の身長体重ならび), length([_|Ln],No), writef('%t番目: 身長(m),体重(kg)を入力してください : '), readln([_身長,_体重])), _10人の学生の身長体重ならび),!. '各学生の身長(m),BMI値を表示する'([]). '各学生の身長(m),BMI値を表示する'([[No,_身長,_体重]|R]) :- 'BMI値の計算(_身長,_体重,_BMI値), writef('%t, 身長: %t, BMI値: %t\n',[No,_身長,_BMI値]), '各学生の身長(m),BMI値を表示する'(R). 'BMI値の計算'(_身長,_体重,_BMI値) :- _BMI値 is _体重 / (_身長 ^ 2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/586 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/3dkRTmjJ # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。 # このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人の # BMI値および肥満か否かを列挙するプログラムkadai13-1.cを書きなさい。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分から # ないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)÷(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 # rewind(FILE *stream); # # ○wh-list.dat の中身は以下の通りで、氏名 身長(cm) 体重(kg)が列挙されている。 # yamada 157 62.5 # tanaka 180 45.1 # yoneda 190 50.5 # yamashita 210 80.5 # toyama 140 80 # .... # # ○例えば画面表示は # toyama BMI=40.816326 himan # nagashima BMI=29.551020 himan # yamashita BMI=27.777779 himan # takenaka BMI=27.716263 himan # . # 中略 # . # nakano BMI=23.179012 # yamashita BMI=18.253969 # . # . # # 等と表示されるものとする。 # '生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する' :- user_parameters([_ファイル名]), 'ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_ファイル名,Instream), データの読み込み(Instream,Lines), 'BMIの算出と判定'(Lines,_BMIと判定ならび), 'BMIの大きい者順に並べ替える'(_BMIと判定ならび,_降順に整列したBMIと判定ならび), 画面表示(_降順に整列したBMIならび),!. 'ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_ファイル名,Instream) :- open(_ファイル名,read,Instream),!. データの読み込み(Instream,Lines) :- get_lines(Instream,Lines),!. 'BMIの算出と判定'([],[]) :- !. 'BMIの算出と判定'([Line|R1],[[_BMI,_名前,_判定]|R2]) :- split(Line,[' '],[_名前,_身長単位センチメートル,_体重]), _身長単位メートル is _身長単位センチメートル / 100, 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長単位メートル,_BMI値), 'BMI値が25を越えると、肥満とみなされる'(_BMI値,_判定), 'BMIの算出と判定'(R1,R2). 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長,_BMI値) :- _BMI値 is _体重 * _身長 ^ 2. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,肥満) :- _BMI値 > 25,!. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,''). 'BMIの大きい者順に並べ替える'(_BMIならび,_降順に整列したBMIならび) :- バブルソート(_BMIならび,_昇順に整列したBMIならび), reverse(_昇順に整列したBMIならび,_降順に整列したBMIならび). バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一), !, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). 画面表示(_降順に整列したBMIならび) :- append(_,[[_BMI,_名前,_判定]|R],_降順に整列したBMIならび), writef('%t %t %t\n',[_名前,_BMI,_判定]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/9 # # [1] 授業単元:構造体ポインタ[2] 問題文: # name (文字列50字) # height ←実数 # weight ←実数 # bmi ←実数 # これらをメンバとする構造体 pationdata の配列を定義する(charやintやdoubleなどをそれぞれの前につけます)。 # 複数の人のデータを入れれる構造体 pationdata の配列を作成する。 # datafile.dat からデータを読み込んで、配列に保存していく。 # ここで注意するのは、ここで上から下までデータを読み込んだ時、データ数に合わせた配列が出来るようにすること。 # 以下 datafile.dat の中身例 # tom 1.65 59.2 # jim 1.80 63.5 # (左から名前、身長、体重) # 配列に保存したデータを関数 BMI ( ) に渡す。 # この中で bmi を計算し、構造体の bmi メンバに保存する。 # 配列に入っているデータを datafile2.dat に出力する。 # 以下 datafile2.dat の中身例 # tom 1.65 59.2 21.70 # jim 1.80 63.9 22.10 # (右端にBMI数値を追加) # 最後にdatafile2.datを閉じる。 # # 尚、datafile.datの中身は自由に決めてよい。 # bmi = weight / height * height # (BMIは体重÷身長の2乗) # 'datafile.dat からデータを読み込んで、構造体として保存していく'(_構造体ならび) :- abolish(pationdata/4), see('datafile.dat'), readln(L,Status), 構造体として保存していく(L,Status), seen. 構造体として保存していく(_,end_of_file) :- !. 構造体として保存していく([_name,_height,_weight],_) :- _bmi is _weight / height * heigth, assertz(pationdata(name(_name),height(_height),weight(_weight),bmi(_bmi))), readln(L2,Status), 構造体として保存していく(L2,Status). '保存されているデータを datafile2.dat に出力する' :- tell('datafile2.dat'), pationdata(name(_name),height(_height),weight(_weight),bmi(_bmi)), writef('%t %t %t %t\n',[_name,_height,_weight,_bmi]), fail. '保存されているデータを datafile2.dat に出力する' :- told. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/729 # # [1] 授業単元:Cプログラミング # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1309111.txt.html # 構造体を用いて一人分の名前,性別,年齢,身長[m],体重[kg],BMI値,BMI判定を処理するプログラムを # 以下の手順(1)〜(4)に従って作成せよ.ただし,BMIの判定はBMI値が # 18.5未満なら1, 18.5以上25未満なら2,25以上30未満なら3,30以上なら4 とする. # # (1) 次のようなPERSON構造体を定義せよ # # 【PERSON構造体】 # # メンバ:名前を代入する配列 name # 性別を代入する変数 gender # 年齢を代入する変数 age # 身長を代入する変数 height # 体重を代入する変数 weight # BMI値を代入する変数 bmi # BMI判定結果を代入する変数judge # # (2) 以下の仕様を満たす関数makePersonalDataを作成せよ. # # ◎char *data = "Andrew M 38 1.805 105.2"; #  のように文字列で与えられている一人分の名前,性別,年齢,身長[m],体重[kg]のデータを引数として受け取る # # # ◎受け取った文字列を名前,性別,年齢,身長,体重のデータに分割し,PERSON構造体 #  変数のメンバ変数name, gender, age, height, weightに代入する # # ◎BMI値を計算し,メンバ変数bmiに代入する # # ◎BMI値を判定し,判定結果をメンバ変数judgeに代入する # # ※BMI値の計算と判定は以下に示す関数calc_bmiを利用する # # (3) 以下の仕様を満たす関数printPersonalDataを作成せよ. # ◎PERSON構造体変数を引数として受け取る # ◎PERSON構造体のメンバを1行で出力する.順番は名前,性別,年齢,身長,体重, #  BMI値,BMI判定とし,タブ区切り(’\t’を用いる)とする. #  Andrew M 38 1.805000 105.200000 32.289501 4 # # (4) (1)〜(3)で作成した構造体と関数が正しく動作することを次のmain関数を用いて確認せよ. # # 【実行結果】 # # Andrew M 38 1.805000 105.200000 32.289501 4 # # Jane F 31 1.724000 75.400000 25.368619 3 # # Thomas M 43 1.892000 65.100000 18.186064 1 # # 個人データの作成(_個人データ文字列,_名前,_性別,_年齢,_身長,_体重) :- split(_個人データ文字列,[' '],[_名前,_性別,_年齢,_身長,_体重]), 'BMI値の判定'(_身長,_体重,_BMI値,_BMI判定), assertz(個人データ(_名前,_性別,_年齢,_身長,_体重,_BMI値,_BMI判定)). 個人データの表示 :- 個人データ(_名前,_性別,_年齢,_身長,_体重,_BMI値,_BMI判定), write_formatted('%t\t%t\t%t\t%t\t%t\t%t\t%t\n',[_名前,_性別,_年齢,_身長,_体重,_BMI値,_BMI判定]), fail. 個人データの表示. 'BMI値の判定'(_身長,_体重,_BMI値,_BMI判定) :- _BMI値 is _体重 / ( _身長 * _身長), 'BMI値の判定'(_BMI値,_BMI判定). 'BMI値の判定'(_BMI値,1) :- _BMI値 < 18.5,!. 'BMI値の判定'(_BMI値,2) :- _BMI値 < 25.0,!. 'BMI値の判定'(_BMI値,3) :- _BMI値 < 30.0,!. 'BMI値の判定'(_BMI値,4). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/166 # # 表示例のように,名前,性別,身長,体重,腹囲(ウエスト)を3人分入力した後, 3名全員について入力データに加えてBMI値とメタボリック症候群の疑いの判定を 表示するプログラムを作成しなさい. # プログラムでは,名前,性別,身長,体重,腹囲をまとめて 個人データとして表すための構造体を定義して利用すること. # 注意 # " 体重はkg, 身長,腹囲はcmで入力する. # " 性別は 1 で男性,2で女性を表す. # " BMI値 = 体重(kg) / 身長(m)2 # " 男性は腹囲85cm以上,女性は腹囲90cm以上でメタボリック症候群の疑い がある # # 表示例 # データ1を入力してください # 名前: Hanako # 性別: 2 # 身長: 156.4 # 体重: 65.3 # 腹囲: 93.4 # 名前: Hanako, 性別: 女, 身長: 156.4, 体重: 65.3, 腹囲: 93.4, BMI: 26.7, メタボリック症候群の疑いがあります # コピペ終わり # 本当はデータ3つです。改行制限で割愛 # '名前,性別,身長,体重,腹囲(ウエスト)を3人分入力した後, 3名全員について入力データに加えてBMI値とメタボリック症候群の疑いの判定を表示する' :- '名前,性別,身長,体重,腹囲(ウエスト)を3人分入力'(L), '3名全員について入力データに加えてBMI値とメタボリック症候群の疑いの判定を表示する'(L). '名前,性別,身長,体重,腹囲(ウエスト)を3人分入力'(L) :- findall([_名前,_性別,_身長,_体重,_腹囲],( for(1,N,3), write('名前:'),get_line(Line),atom_to_term(Line,_名前,_), write('性別:'),get_line(Line),atom_to_term(Line,_性別,_), write('身長:'),get_line(Line),atom_to_term(Line,_身長,_), write('体重:'),get_line(Line),atom_to_term(Line,_体重,_), write('腹囲:'),get_line(Line),atom_to_term(Line,_腹囲,_)), L). '3名全員について入力データに加えてBMI値とメタボリック症候群の疑いの判定を表示する'([]) :- !. '3名全員について入力データに加えてBMI値とメタボリック症候群の疑いの判定を表示する'([[_名前,_性別,_身長,_体重,_腹囲]|R]) :- write_formatted('%t:%t, %t:%t, %t:%t, %t:%t,%t :%t, ',[名前,性別,身長,体重,腹囲,_名前,_性別,_身長,_体重,_腹囲]), _BMI値 = _体重 / ((_身長 / 100) ^ 2), write_formatted('%t:%t, ',['BMI値:',_BMI値]), 診断(_性別,_腹囲,_診断), write_formatted('%t\n',[_診断]), '3名全員について入力データに加えてBMI値とメタボリック症候群の疑いの判定を表示する'(R). 診断(1,_腹囲,メタボリック症候群の疑いがあります) :- _腹囲 >= 85,!. 診断(2,_腹囲,メタボリック症候群の疑いがあります) :- _腹囲 >= 90,!. 診断(_,_,''). % 以下のサイトは % 課題1 ターミナルから日本円の金額を読み込み,これをドルとユーロに変換して表示するプログラムを作成しなさい.  %    作成にあたっては,下図の構造体を用い,為替レートは図に示された初期値を用いなさい. % % struct rate { // 外国為替レート % double to_yen; // 対円 % double to_dollar; // 対ドル % double to_euro; // 対ユーロ % }; % % struct rate yen = {1.0, 0.0104, 0.007347,}; % /* 1$=96.15円, 1EURO=136.11円の場合の,各国通貨に対する円の為替レート */ % % % % 課題2 ターミナルから一文字を読み込み,それが'e'の場合は英語の国名を出力し,'f'の場合はフランス語で国名を出力する %    プログラムを作成しなさい.ただし,国名を格納した変数は下図に示すものを用いること. % % #define SLENGTH 20 % #define COUNTRIES 5 % % struct nation { % char en[SLENGTH]; /* 国名(英語) */ % char fr[SLENGTH]; /* 国名(仏語) */ % }; % % struct nation country[COUNTRIES] = { /* 国名の初期化 */ % {"Japan", "Japon", }, // 日本 % {"France", "France",}, // フランス % {"Germany", "Allemagne",}, // ドイツ % {"Spain", "Espagne",}, // スペイン % {"Italy", "Italie",}, // イタリア % }; % % % 課題3 氏名,身長,体重を収めるリストを構造体で作成し,BMI指数により標準体型と見なされる人の氏名とBMI指数を出力する %    プログラムを作成せよ. % %     ・登録できる人数の上限を16人とし,登録者数を入力してから,各人のデータを入力する. %     ・構造体の各要素は,name(氏名),height(身長),weight(体重)とする. %     ・氏名は,30文字以内とし,スペースを含まない. %     ・身長の単位は[cm],体重の単位は[Kg]とする. %     ・各項目は<スペース>で区切られて入力される. %     ・各項目は<スペース>で区切られて出力される. % % 課題1 対円レート(1.0, 0.0104, 0.007347). 外国為替レート(_円,_ドル,_ユーロ) :- 対円レート(_, _対ドル, _対ユーロ), not(var(_円)), _ドル is _円 * _対ドル, _ユーロ is _円 * _対ユーロ. % 課題2 課題2 :- read(X), 課題2_1(X). 課題2_1(e) :- country(L), member([Country,_],L), write(Country),nl, fail. 課題2_1(f) :- country(L), member([_,Country],L), write(Country),nl, fail. 課題2_1(_). country([['Japan', 'Japon'], % 日本 ['France', 'France'], % フランス ['Germany', 'Allemagne'], % ドイツ ['Spain', 'Espagne'], % スペイン ['Italy', 'Italie']]). % イタリア % 課題3 データ入力 :- abolish(個人データ/0), 構造体生成(_構造体1), read(X), split(X,[' '],[_名前,_身長,_体重]), データ入力(_名前,_身長,_体重,_構造体1,_構造体2), assertz(個人データ(_構造体2)), 'BMI標準メンバーの表示. 'BMI標準メンバーの表示' :- 個人データ(_構造体), member([_名前1,_身長1,_体重1],_構造体), 'BMI判定'(_身長1,_体重1,BMI,普通です), wr('%t %t %t %t\n',[_名前1,_身長1,_体重1,BMI]), fail; true. データ入力(end_of_file,_構造体,_構造体) :- !. データ入力(_入力行,_構造体1,_構造体) :- split(_入力行,[' '],[_名前,_身長,_体重]), sub_atom(_名前,0,30,_,_名前1), 構造体更新(_氏名,_身長1,_体重,_構造体1,_構造体2), read(X), データ入力(X,_構造体2,_構造体). 構造体生成([]). 構造体更新(_名前,_身長,_体重,_更新前,_更新後) :- length(_更新前,Len), Len < 16, _更新後=[[名前(_名前),身長(_身長),体重(_体重)]|_更新前]. 構造体更新(_名前,_身長,_体重,_,_) :- write('登録者がすでに16名います\n追加できません\n'). 'BMI判定'(_身長,_体重,BMI,_判定) :- BMI is _体重/_身長/_身長*10000, 'BMI判定'(BMI,_判定). 'BMI判定'(BMI,やせてます) :- BMI =< 18.5. 'BMI判定'(BMI,普通です) :- BMI > 18.5,BMI < 25.0. 'BMI判定'(BMI,レッツエクササイズ!) :- BMI >= 25.0. % 以下のサイトは 'BMI個人データの収集' :- write('+--------------------------------------+\n'), write('| 今から個人データを入力してもらいます |\n'), write('+--------------------------------------+\n'), repeat, 整数項目の取得(入力人数,'入力する人数を設定してください(1〜10)> ',_,nl,_入力人数), 'BMI個人データの収集'(1,_入力人数), write(' 何かキーを押してください '), get_line(_キー), sub_atom(_キー,0,1,_,q). 'BMI個人データの収集'(N,E) :- N > E,!. 'BMI個人データの収集'(N,E) :- 'BMI個人データの取得'(N), M is N+1, 'BMI個人データの収集'(M,E),!. 'BMI個人データの収集'(N,E) :- 'BMI個人データの収集'(N,E). 'BMI個人データの取得'(N) :- write_formatted('*** %t人目のデータを入力してください ***\n',[N]), 苗字の取得(_苗字), 名前の取得(_名前), 整数項目の取得(年齢,'・年齢を入力してください(整数)> ',_,true,_年齢), 整数項目の取得(身長,'・身長を入力してください(整数)> ',_,nl,_身長), 整数項目の取得(体重,'・体重を入力してください(整数)> ',_,nl,_体重), 'BMI判定'(_身長,_体重,BMI,_判定), 個人データの確認(N,_苗字,_名前,_年齢,_身長,_体重,BMI,_判定), assertz('BMI個人データ'(_苗字,_名前,_年齢,_身長,_体重,BMI,_判定)). 個人データの確認(N,_苗字,_名前,_年齢,_身長,_体重,BMI,_判定) :- write('+++ 個人データを確認します +++\n'), write_formatted('[%t人目]\n',[N]), write_formatted('苗字: %t\n',[_苗字]), write_formatted('名前: %t\n',[_名前]), write_formatted('年齢: %t歳\n',[_年齢]), write_formatted('身長: %tcm\n',[_身長]), write_formatted('体重: %tkg\n',[_体重]), write_formatted('BMI : %t [ %t ]\n',[BMI,_判定]), nl,!. 'BMI判定'(_身長,_体重,BMI,_判定) :- BMI is _体重/_身長/_身長*10000, 'BMI判定'(BMI,_判定). 'BMI判定'(BMI,やせてます) :- BMI =< 18.5. 'BMI判定'(BMI,普通です) :- BMI > 18.5,BMI < 25.0. 'BMI判定'(BMI,レッツエクササイズ!) :- BMI >= 25.0. 苗字の取得(_苗字) :- write('・苗字を入力してください(半角ローマ字)> '), get_line(_苗字). 名前の取得(_名前) :- write('・名前を入力してください(半角ローマ字)> '), get_line(_名前). 整数項目の取得(_項目名,_入力促進文字列,_入力文字列,_オプション,_値) :- write(_入力促進文字列), get_line(_入力文字列), 整数項目の取得_2(_項目名,_入力文字列,_値), call(_オプション),!. 整数項目の取得(_項目名,_入力促進文字列,_入力文字列,_オプション,_値) :- 整数項目の取得(_項目名,_入力促進文字列,_入力文字列,_オプション,_値). 整数項目の取得_2(_項目名,_入力文字列,_値) :- atoi(_入力文字列,_値),!. 整数項目の取得_2(_項目名,_入力文字列,_) :- write_formatted('%tの入力[%t]に問題があります\n再入力してください\n',[_項目名,_入力文字列]), fail. atoi(Atom,Integer) :- atom(Atom), atom_to_chars(Atom,Chars), number_to_chars(Integer,Chars), integer(Integer),!. atoi(Atom,Integer) :- integer(Integer), number_to_chars(Integer,Chars), concat_atom(Chars,Atom),!.