このディレクトリの索引

% 以下のサイトは # 出典:: 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) :- 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). '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- '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,土曜). % 以下のサイトは 標準入力から整数を得る(_催促文言,_検査述語,_整数) :- 催促文言を表示して標準入力から整数を得て検査述語を実行する(_催促文言,_検査述語,_整数),!. 標準入力から整数を得る(_催促文言,_検査述語,_整数) :- 標準入力から整数を得る(_催促文言,_検査述語,_整数). 催促文言を表示して標準入力から整数を得て検査述語を実行する(_催促文言,_検査述語,_整数) :- 催促文言を表示して標準入力から整数を得て(_催促文言,_整数), 検査述語を実行する(_検査述語). 催促文言を表示して標準入力から整数を得て(_催促文言,_整数) :- 催促文言を表示して(_催促文言), 標準入力から整数を得る(_整数). 催促文言を表示して(_催促文言) :- 催促文言の編集(_催促文言,_編集された催促文言), writef('%tを入力してください : ',[_編集された催促文言]). 催促文言の編集(表示しない,'') :- !. 催促文言の編集(_催促文言,_編集された催促文言) :- atom_concat(_催促文言,'を入力して下さい : ',_編集された催促文言). 検査述語を実行する(_検査述語) :- _検査述語. 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- 入力文字列から整数が得られる(_文字列,_整数),!. 整数入力検査(_文字列,_) :- 入力文字列から整数が得られない(_文字列,_). 入力文字列から整数が得られる(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[valiables(_入力された変数),valiable_names(_入力された変数名)]),E,fail), integer(_整数). 入力文字列から整数が得られない(_文字列,_) :- writef('入力された文字列 %t からは整数が得られません。再入力をお願いします: \n',[_文字列]), fail. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # 問題文 # 高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k−1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 # # 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べたいと思いました。 # # 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # N # A1 # A2 # : # AN # 1 行目には、硬貨の種類数 N(1≦N≦50) が、1 行で与えられる。 # 2 行目から N 行では、高橋君が各硬貨を何枚持っているかが与えられる。 このうち i(1≦i≦N) 行目では、 i 番目の硬貨を、高橋君が何枚持っているかを表す整数 Ai(0≦Ai≦50000)が与えられる。 # 出力 # 高橋君が払える金額の種類数を、 1000000007 で割った余りを 1 行で出力せよ。出力の末尾は改行をいれること。 # # 入力例1 # 2 # 2 # 1 # 出力例1 # 5 # 払える金額は、1 円, 2 円, 10 円, 11 円, 12 円の 5 通りとなります。 # # 0 円は含まないことに注意してください。 # # 入力例2 # 2 # 32 # 3 # 出力例2 # 62 # 1 円から 62 円の 62 通りの金額を支払うことが出来ます。 # # 入力例3 # 4 # 12 # 3 # 7 # 34 # 出力例3 # 12039 # 入力例4 # 10 # 1234 # 2 # 857 # 3858 # 1 # 5000 # 32 # 4 # 1 # 857 # 出力例4 # 969347336 # 1000000007 で割った余りを出力してください。 # '高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k‐1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べた いと思いました。 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるた め、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。' :- 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_種類別枚数ならび), 最大何通り(_種類別枚数ならび,_最大何通り), 最大可能性から重複を差し引く(_種類別枚数ならび,_最大何通り,_何通り), '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り). 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび) :- 標準入力から整数を得る(_何種類), findall([M,_整数],( between(1,_何種類,N), succ(M,N), 標準入力から整数を得る(_整数)), _枚数ならび). 最大何通り(_種類別枚数ならび,_最大何通り) :- 最大何通り(_種類別枚数ならび,1,_最大何通り). 最大何通り([],_最大何通り,_最大何通り). 最大何通り([[_,0]|R]],_最大何通り,_最大何通り) :- 最大何通り(R,_最大何通り,_最大何通り),!. 最大何通り([[A,B]|R],N,_最大何通り) :- N_2 is B * N, 最大何通り(R,N_2,_最大何通り). 最大可能性から重複を差し引く(_種類別枚数ならび,_最大何通り,_何通り) :- findsum(_差し引き数,( append(L1,[[_種類,_枚数]|L2],_種類別枚数ならび), 差し引き数(_種類,_枚数,L1,_差し引き数)), _重複差し引き数), _何通り is _最大何通り - _重複差し引き数. 差し引き数(_種類_1,_枚数_1,L1,_差し引き数)) :- findsum(_差し引き数_3,( member([_種類,_枚数],L1), _差し引き数_1 is _枚数_1 // (_種類_1 // _種類), _差し引き数_2 is _枚数 // (_種類_1 // _種類), 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_3)), _差し引き数). 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_1) :- _差し引き数_1 =< _差し引き数_2,!. 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_2). '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- writef('%t何通り\n',[_何通り]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- _何通り >= 1000000007, _何通りを1000000007で割った余り is _何通り mod 1000000007, writef('%t何通り\n',[_何通りを1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # 高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k−1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 # # 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べたいと思いました。 # # 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # N # A1 # A2 # : # AN # 1 行目には、硬貨の種類数 N(1≦N≦50) が、1 行で与えられる。 # 2 行目から N 行では、高橋君が各硬貨を何枚持っているかが与えられる。 このうち i(1≦i≦N) 行目では、 i 番目の硬貨を、高橋君が何枚持っているかを表す整数 Ai(0≦Ai≦50000)が与えられる。 # 出力 # 高橋君が払える金額の種類数を、 1000000007 で割った余りを 1 行で出力せよ。出力の末尾は改行をいれること。 # # 入力例1 # 2 # 2 # 1 # 出力例1 # 5 # 払える金額は、1 円, 2 円, 10 円, 11 円, 12 円の 5 通りとなります。 # # 0 円は含まないことに注意してください。 # # 入力例2 # 2 # 32 # 3 # 出力例2 # 62 # 1 円から 62 円の 62 通りの金額を支払うことが出来ます。 # # 入力例3 # 4 # 12 # 3 # 7 # 34 # 出力例3 # 12039 # 入力例4 # 10 # 1234 # 2 # 857 # 3858 # 1 # 5000 # 32 # 4 # 1 # 857 # 出力例4 # 969347336 # 1000000007 で割った余りを出力してください。 # '高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k‐1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べた いと思いました。 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるた め、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。' :- 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび), 硬貨の合計金額種類(_枚数ならび,_何通り), '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り). 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび) :- 標準入力から整数を得る(_何種類), findall(_整数,( between(1,_何種類,_), 標準入力から整数を得る(_整数)), _枚数ならび). 硬貨の合計金額種類(_枚数ならび,_何通り) :- findall(_合計金額,合計金額(0,_枚数ならび,0,_合計金額),L1), sort(L1,L2), length(L2,_何通り). 合計金額(N,[],_合計金額,_合計金額). 合計金額(N,[_枚数|R],_合計金額_1,_合計金額) :- '1から枚数分を増やして合計金額を非決定性に計算していく'(N,_枚数,_ご金額金額_1,_合計金額_2), succ(N,N_2), 合計金額(N_2,R,_合計金額_2,_合計金額). '1から枚数分を増やして合計金額を非決定的に計算していく'(N,_枚数,_合計金額_1,_合計金額_2) :- between(1,_枚数,M), _合計金額_2 is _合計金額_1 + 10 ^ N * M. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- writef('%t種類\n',[_種類]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- _種類 >= 1000000007, _種類を1000000007で割った余り is _種類 mod 1000000007, writef('%t種類\n',[_種類を1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 # # 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 # # この対面にある、底面に書かれた数字を出力してください。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # 1 行目には、サイコロの上の面に書かれている数字を表す 1 つの整数 A(1≦A≦6) が与えられる。 # 出力 # サイコロの底の面に書かれている数字を 1 行で出力せよ。出力の末尾には改行をいれること。 # # 入力例1 # 6 # 出力例1 # 1 # 6 の裏に書かれている数字は 1 です。 # # 入力例2 # 3 # 出力例2 # 4 # :- dynamic(対面にある数字/2). 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 この対面にある、底面に書かれた数字を出力してください。' :- 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。', '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A), 'この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字), 出力してください(_対面にある底面に書かれた数字). 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。' :- ' 1 から 6 までの数字が一つずつ書かれており、'(_1から6までの数字), 対面の和が 7 になるように作られています。'(_1から6までの数字). ' 1 から 6 までの数字が一つずつ書かれており、'(_1から6までの数字) :- between(1,6,_1から6までの数字). '対面の和が 7 になるように作られています。'(_1から6までの数字) :- '対面の和が 7 に'(_1から6までの数字,_対面にある数字), 'なるように作られています。'(_1から6までの数字,_対面にある数字). '対面の和が 7 に'(_1から6までの数字,_対面にある数字) :- length(L1,_1から6までの数字), length(_対面の和を表すならび,7), append(L1,L2,_対面の和を表すならび), length(L2,_対面にある数字). 'なるように作られています。'(_1から6までの数字,_対面にある数字) :- assertz(対面にある数字(_1から6までの数字,_対面にある数字)). '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A) :- 標準入力から整数を得る(_A). 'この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字) :- 対面にある数字(_A,_対面にある底面に書かれた数字). 出力してください(_対面にある底面に書かれた数字) :- writef('%t\n',[_対面にある底面に書かれた数字]). 標準入力から整数を得る(_A) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 # # 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 # # この対面にある、底面に書かれた数字を出力してください。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # 1 行目には、サイコロの上の面に書かれている数字を表す 1 つの整数 A(1≦A≦6) が与えられる。 # 出力 # サイコロの底の面に書かれている数字を 1 行で出力せよ。出力の末尾には改行をいれること。 # # 入力例1 # 6 # 出力例1 # 1 # 6 の裏に書かれている数字は 1 です。 # # 入力例2 # 3 # 出力例2 # 4 # 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 この対面にある、底面に書かれた数字を出力してください。' :- '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A), 'このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字), 出力してください(_対面にある底面に書かれた数字). '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A) :- 標準入力から整数を得る(_A). 'このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字) :- length(L1,_A), length(L2,_対面にある底面に書かれた数字), length(_対面の和を表すならび,7), append(L1,L2,_対面の和を表すならび). 出力してください(_対面にある底面に書かれた数字) :- writef('%t\n',[_対面にある底面に書かれた数字]). 標準入力から整数を得る(_A) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは # 出題場所 :: 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/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/1381909900/505 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): #  キーボードから正負の整数をデタラメに入力し、整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ # 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数の和,_5つの正の整数の平均) :- 'キーボードから正負の整数をデタラメに入力し、整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'(_5つの正の整数ならび), 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均). 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'(_5つの正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、整数のみを配列に格納し、'([],_5つの正の整数ならび), 'その個数が5個になったら入力を受け付けず、'(_5つの正の整数ならび),!. 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数), _整数 > 0, append(_正の整数ならび_1,[_整数],_正の整数ならび_2), 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、'(_正の整数ならび_2,_正の整数ならび). 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、'(_正の整数ならび_1,_正の整数ならび). '正の整数のみを配列に格納し、'(_正の整数ならび,_正の整数ならび). '正の整数のみを配列に格納し、'(_正の整数ならび_2,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、'(_正の整数ならび_2,_正の整数ならび). 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- get_line(Line), '診断 :: 整数'(Line,_整数),!. 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数). '診断 :: 整数'(Line,_整数) :- read_term_from_atom(Line,_整数,[]), integer(_整数),!. 'その個数が5個になったら入力を受け付けず、'(_5つの正の整数ならび) :- length(_5つの正の整数ならび,5),!. 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均) :- sum_list(_5つの正の整数のならび,_5つの正の整数の和), length(_5つの正の整数のならび,_5つの正の整数の要素数), _5つの正の整数の平均 is floor((_5つの正の整数の和 / _5つの正の整数の要素数) * 10 + 0.5) / 10. % 以下のサイトは # # フィボナッチ数列によるFizzBuzz # フィボナッチ数列を表示してのFizzBuzz(N) :- fibfizzbuzz(N). fibfizzbuzz(N) :- fibfizzbuzz_2(1,0,1,Y,FizzBuzz), writef('%t ',[FizzBuzz]), Y = N. fibfizzbuzz(N,_1,_2,Y,FizzBuzz) :- _4 is _1 + _2, fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz). fibfizzbuzz_2(1,0,1,1,1). fibfizzbuzz_2(N,_2,_4,N,FizzBuzz) :- N > 1, fizzbuzz診断(N,_4,FizzBuzz). fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz) :- N_2 is N + 1, fibfizzbuzz(N_2,_2,_4,Y,FizzBuzz). fizzbuzz診断(_,_4,'FizzBuzz') :- 0 is _4 mod 15,!. fizzbuzz診断(_,_4,'Fizz') :- 0 is _4 mod 3,!. fizzbuzz診断(_,_4,'Buzz') :- 0 is _4 mod 5,!. fizzbuzz診断(_,_4,_4). % 以下のサイトは # # フィボナッチ数列によるFizzBuzz # フィボナッチ数列番号と見てのFizzBuzz(N) :- fibfizzbuzz(N). fibfizzbuzz(N) :- fibfizzbuzz_2(1,0,1,Y,FizzBuzz), writef('%t ',[FizzBuzz]), Y = N. fibfizzbuzz(N,_1,_2,Y,FizzBuzz) :- _4 is _1 + _2, fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz). fibfizzbuzz_2(1,0,1,1,1). fibfizzbuzz_2(N,_2,_4,N,FizzBuzz) :- N > 1, fizzbuzz診断(N,_4,FizzBuzz). fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz) :- N_2 is N + 1, fibfizzbuzz(N_2,_2,_4,Y,FizzBuzz). fizzbuzz診断(_,_4,'FizzBuzz') :- 0 is _4 mod 15,!. fizzbuzz診断(_,_4,'Fizz') :- 0 is _4 mod 3,!. fizzbuzz診断(_,_4,'Buzz') :- 0 is _4 mod 5,!. fizzbuzz診断(N,_4,N). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1377511459/294 # # 縦横6マスのボックスがあります。 # 全てのマスを○×で埋めます。 # ○と×はそれぞれ連続2個まで繋がっててOK。 # 縦横の各列は○と×の数は同じにならなければいけない。 # ○と×の並び方が他の列と重複するのはNG。(縦と横を比較して同じなのはOK。縦と縦、横と横が同じ並びって言うのがNG) # これはどうやって解けばいいのか教えてください。 # # '縦横6マスのボックスがあります。 全てのマスを○×で埋めます。 ○と×はそれぞれ連続2個まで繋がっててOK。 縦横の各列は○と×の数は同じにならなければいけない。 ○と×の並び方が他の列と重複するのはNG。(縦と横を比較して同じなのはOK。縦と縦、横と横が同じ並びって言うのがNG) これはどうやって解けばいいのか教えてください。'(LL) :- 行候補ならびを得る(_行候補ならび), 面を規定する(LL), 転置(LL,_転置されたLL), 面候補を得る(_行候補ならび,LL), 転置診断(_転置されたLL,_行候補ならび). 行候補ならびを得る(_行候補ならび) :- findall(L,( 順列([○,○,○,×,×,×],6,L), \+(append(_,[A,A,A|_],L))), _重複があり得る行候補ならび), sort(_重複があり得る行候補ならび,_行候補ならび). 面を規定する(LL) :- length(LL,6), findall(L,( member(L,LL), length(L,6)), LL). 面候補を得る(_行候補ならび,[L1,L2,L3,L4,L5,L6]) :- member(L1,_行候補ならび), member(L2,_行候補ならび), member(L3,_行候補ならび), member(L4,_行候補ならび), member(L5,_行候補ならび), member(L6,_行候補ならび), sort([L1,L2,L3,L4,L5,L6],[_,_,_,_,_,_]). 転置診断(_転置されたLL,_行候補ならび) :- sort(_転置されたLL,[_,_,_,_,_,_]), findall(_,( member(L,_転置されたLL), member(L,_行候補ならび), \+(append(_,[A,A,A|_],L))), [_,_,_,_,_,_]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(A,Y,Z), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). % 以下のサイトは # 出典:: 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. % 以下のサイトは 素数生成(_素数) :- 素数生成(2,[],_素数). 素数生成(N,L,_素数) :- 素数検査(N,L,L_2,_診断), 素数生成(N,L_2,_診断,_素数). 素数検査(_素数,L,[_素数|L],素数) :- forall(member(_素数_1,L),\+(0 is _素数 mod _素数_1)),!. 素数検査(N,L,L,素数ではない). 素数生成(_素数,_,素数,_素数). 素数生成(N,L,_診断,_素数) :- N_2 is N + 1, 素数生成(N_2,L,_素数). % 以下のサイトは # 出典:: 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([]. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/512 # # [1] 授業単元:C言語基礎実習 # [2] 問題文(含コード&リンク):ある整数 a をその数自身を除く約数をすべて足したときに # その合計の値がaと同じになるとき、その数を和の完全数といいます。 # 512以下の和の完全数を見つけて表示するプログラムを作成しなさい。 # 出力は以下のようにする事。 # 6=1+2+3 # 28=1+2+4+7+14 # ・ # ・ # ・ # # 'ある整数 a をその数自身を除く約数をすべて足したときに その合計の値がaと同じになるとき、その数を和の完全数といいます 512以下の和の完全数を見つけて表示するプログラムを作成しなさい。 出力は以下のようにする事。 6=1+2+3 28=1+2+4+7+14 ・ ・ ・ ' :- between(1,512,_a), 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(_診断,_a,_約数ならび), 完全数を表示する(_診断,_a,_約数ならび), _a = 512,!. 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(和の完全数,_a,_約数ならび), _a_1 is _a - 1, findsum(_約数,( between(1,_a_1,_約数), 0 is _a mod _約数), _a),!. 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(和の完全数ではない,_,_). 完全数を表示する(和の完全数,_a,_約数ならび) :- atomic_list_concat(_約数ならび,' + ',_式表現文字列), writef('%t=%t\n',[_a,_式表現文字列]),!. 完全数を表示する(和の完全数ではない,_,_). % 以下のサイトは 加算器型相加平均(_累計,_相加平均) :- 加算器型相加平均([],0,_累計,_相加平均). 加算器型相加平均(Ln,_累計_1,_累計,_相加平均) :- 数を得る(_数), _累計_2 is _累計_1 + _数, _相加平均 is _累計_2 / Len, 加算器型相加平均_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] 問題文(含コード&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. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/868 # # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 発展課題 13..1 # ATM(Automated Teller Machine; 現金自動預け払い機)システムを実現するプログラムを考える。 # 氏名,口座番号,暗証番号,預金残高を要素とする構造体を宣言し, 512人分の口座が作成可能なようにせよ.また,初期値として次のように構造体の内容を設定せよ. # 立命太郎の口座番号は1234で,預金残高を1,234,560円に設定する. # 野路花子の口座番号は5678で,預金残高を987,600円に設定する. # 衣笠一郎の口座番号は9012で,預金残高を538,600円に設定する. # 暗証番号は口座番号に1111を足して10000で割った余りに設定する. # ここで暗証番号は、口座番号を引数としてとり、それに1111を足して10000で割った余りを計算する関数を作成して設定すること. # 上記の方法で初期値を設定し、設定された3人の預金残高を画面へ出力するプログラムを作成せよ.ただし、ひとり分の預金残高を表示する関数を作成して、これを繰り返し使って3人の預金残高を出力すること. # % ./initAccount 預金残高は次のとおりです. # 立命太郎 (1234) 1234560 円 # 野路花子 (5678) 987600 円 # 衣笠一郎 (9012) 538600 円 # % # :- dynamic([口座名義/2,暗証番号/2,口座残高/2]). '発展課題 13..1 ATM(Automated Teller Machine; 現金自動預け払い機)システムを実現する' :- 'ATM(Automated Teller Machine; 現金自動預け払い機)システム'. 'ATM(Automated Teller Machine; 現金自動預け払い機)システム' :- 口座番号を得る(_口座番号), '入金/出金/残高参照'(_口座番号), fail. 'ATM(Automated Teller Machine; 現金自動預け払い機)システム' :- 'ATM(Automated Teller Machine; 現金自動預け払い機)システム'. 口座番号を得る(_口座番号) :- 整数を得る('口座番号 : ',between(0,9999999,_口座番号),_口座番号), 口座名義(_口座番号,_口座名義), writef('%t 様ですね\n',[_口座名義]), 整数を得る('暗証番号 : ',between(0,9999,_暗証番号),_暗証番号), 暗証番号(_口座番号,_暗証番号),!. '入金/出金/残高参照'(_口座番号) :- メニュー表示, 整数を得る('0-4の数字',between(0,3,_選択),_選択), '入金/出金/残高参照'(_選択,_口座番号). メニュー表示 :- writef('\n0..終了\n\n1..入金\n2..出金\n3..残高参照\n\n'). '入金/出金/残高参照'(0,_) :- !. '入金/出金/残高参照'(1,_口座番号) :- 入金(_口座番号). '入金/出金/残高参照'(2,_口座番号) :- 出金(_口座番号). '入金/出金/残高参照'(3,_口座番号) :- 残高参照(_口座番号). 入金(_口座番号) :- write('紙幣を入力してください : '), 紙幣を数える(_入力額,正常終了), writef('%t 円入力されました : \n',[_入力額]), 口座残高の入金更新(_口座番号,_入金額). 口座残高の入金更新(_口座番号,_入金額) :- retract(口座残高(_口座番号,_口座残高)), _更新された口座残高 is _口座残高 + _入金額, assertz(口座残高(_口座番号,_更新された口座残高)). 出金(_口座番号) :- 整数を得る('出金額を入力してください : ',true,_出金額), '診断:: 出金額の入力'(_口座番号,_出金額), 紙幣を出力して口座残高の出金更新(_口座番号,_出金額),!. 出金(_口座番号) :- 出金(_口座番号). '診断:: 出金額の入力'(_口座番号,_出金額) :- 口座残高(_口座番号,_口座残高), _口座残高 >= _出金額,!. '診断:: 出金額の入力'(_口座番号,_出金額) :- writef('入力された出金額%tは残高不足です\n再入力をお願いします\n',[_出金額]), fail. 紙幣を出力して口座残高の出金更新(_口座番号,_出金額) :- 紙幣を出力して(_出金額,正常終了), 口座残高の出金更新(_口座番号,_出金額),!. 紙幣を出力して口座残高の出金更新(_口座番号,_出金額) :- write('現在紙幣の出力ができません。\nなお、口座残高は変更ございません\n'), fail. 口座残高の出金更新(_口座番号,_出金額) :- retract(口座残高(_口座番号,_口座残高)), _更新された口座残高 is _口座残高 - _出金額, assertz(口座残高(_口座番号,_更新された口座残高)). 残高参照(_口座番号) :- 個人口座残高の表示(_口座番号). 紙幣を数える(_入力額,正常終了). 紙幣を出力して(_出金額,正常終了). '立命太郎の口座番号は1234で,預金残高を1,234,560円に設定する.' :- assertz(口座名義(1234,立命太郎)), 暗証番号(1234,_暗証番号), assertz(暗証番号(1234,_暗証番号)), assertz(口座残高(1234,1234560)). '野路花子の口座番号は5678で,預金残高を987,600円に設定する.' :- assertz(口座名義(5678,野路花子)), 暗証番号(5678,_暗証番号), assertz(暗証番号(5678,_暗証番号)), assertz(口座残高(5678,987600)). '衣笠一郎の口座番号は9012で,預金残高を538,600円に設定する.' :- assertz(口座名義(9012,衣笠一郎)), 暗証番号(9012,_暗証番号), assertz(暗証番号(9012,_暗証番号)), assertz(口座残高(9012,538600)). '暗証番号は口座番号に1111を足して10000で割った余りに設定する. ここで暗証番号は、口座番号を引数としてとり、それに1111を足して10000で割った余りを計算する関数を作成して設定すること.'(_口座番号,_暗証番号) :- 暗証番号(_口座番号,_暗証番号). 暗証番号(_口座番号,_暗証番号) :- _暗証番号 is (_口座番号 + 1111) mod 10000. '上記の方法で初期値を設定し、設定された3人の預金残高を画面へ出力するプログラムを作成せよ.ただし、ひとり分の預金残高を表示する関数を作成して、これを繰り返し使って3人の預金残高を出力すること.' :- '立命太郎の口座番号は1234で,預金残高を1,234,560円に設定する.', '野路花子の口座番号は5678で,預金残高を987,600円に設定する.', '衣笠一郎の口座番号は9012で,預金残高を538,600円に設定する.', 設定された3人の預金残高を画面へ出力する. 設定された3人の預金残高を画面へ出力する :- 口座名義(_口座番号,_), 個人口座残高の表示(_口座番号), fail. 設定された3人の預金残高を画面へ出力する. 個人口座残高の表示(_口座番号) :- 口座名義(_口座番号,_口座名義), 口座残高(_口座番号,_口座残高), writef('%t (%t) %t 円\n',[_口座名義,_口座番号,_口座残高]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/431 # # UPDATE list SET target=1 WHERE id=1 # というので更新をかけたいのですが、id=1が複数あります。 # どれでもいいのでid=1のものを1つ更新をかけたいのですがそういったことは可能でしょうか? # 最後に「LIMIT 1」とつけたら # SQLSTATE[HY000]: General error: 1 near "LIMIT": syntax errorとエラーが表示されましたので間違っているとは思うのですが # こういったことが可能であれば構文的にご指摘いただけないでしょうか。 # # 'UPDATE list SET target=1 WHERE id=1 というので更新をかけたいのですが、id=1が複数あります。 どれでもいいのでid=1のものを1つ更新をかけたい' :- テーブルの更新(list,[id],[1],true,[target],[1]). テーブルの更新(_テーブル名,_鍵属性ならび,_鍵値ならび,_条件,_置換属性ならび,_置換値ならび) :- テーブル定義から実行項と引数ならびを得る(_テーブル名,P,_引数ならび), 鍵を設定する(_テーブル名,_鍵属性ならび,_鍵値ならび,_引数ならび), 条件に適合した節を削除する(P,_条件), 引数ならびの値を置換する(_テーブル名,_置換属性ならび,_置換値ならび,_引数ならび,_置換された引数ならび), 置換された節を先頭に加える(_テーブル名,_置換された引数ならび). 条件に適合した節を削除する(P,_条件) :- retract(P), '診断: 条件に適合した節を削除する'(P,_条件). '診断: 条件に適合した節を削除する'(P,_条件) :- call(_条件),!. '診断: 条件に適合した節を削除する'(P,_条件) :- asserta(P). テーブル定義から実行項と引数ならびを得る(_テーブル名,P,_引数ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_引数ならび), P =.. [_テーブル名|_引数ならび],!. 鍵を設定する(_,[],[],_引数ならび). 鍵を設定する(_テーブル名,[_鍵属性|R1],[_鍵値|R2],_引数ならび) :- テーブル定義(_テーブル名,_nth1,_鍵属性), nth1(_nth1,_引数ならび,_鍵値), 鍵を設定する(_テーブル名,R1,R2,_引数ならび). 引数ならびの値を置換する(_,[],[],_置換された引数ならび,_置換された引数ならび). 引数ならびの値を置換する(_テーブル名,[_置換属性|R1],[_置換値|R2],_引数ならび,_置換された引数ならび) :- テーブル定義(_テーブル名,_nth1,_置換属性), 要素番号によるならびの置換(_nth1,_置換値,_引数ならび,_引数ならび_2), 引数ならびの値を置換する(_テーブル名,R1,R2,_引数ならび_2,_置換された引数ならび). 要素番号によるならびの置換(_要素番号,_置換要素,_対象ならび,_置換ならび) :- length([_|L0],_要素番号), append(L0,[_|R],_対象ならび), append(L0,[_置換要素|R],_置換ならび),!. 置換された節を先頭に加える(_テーブル名,_置換された引数ならび) :- P =.. [_テーブル名|_置換された引数ならび], asserta(P). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/392 # # (1)C言語 # (2)問題:キーボードから正の整数を入力するとその桁数を表示するプログラムを作成せよ。 # (3)windows7 visual studio2010 # (4)期限:12月20日 # (5)よろしくお願いします。 # # 'キーボードから正の整数を入力するとその桁数を表示する' :- 'キーボードから正の整数を入力すると'(_正の整数), 'その桁数を表示する'(_正の整数). 'キーボードから正の整数を入力すると'(_正の整数) :- 整数を得る(正の整数,_正の整数 > 0,_正の整数). 'その桁数を表示する'(_正の整数) :- number_chars(_正の整数,Chars), length(Chars,_その桁数), writef('%t桁です\n',[_その桁数]). 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. get_line(Line) :- read_line_to_codes(user_input,Codes), atom_codes(Line,Codes). % 以下のサイトは # 出典:: http://toro.2ch.net/read.cgi/tech/1354393458/2 # # # お題:摂氏温度入力で華氏温度表示。 # 摂氏温度入力で華氏温度表示 :- 摂氏温度入力で(_摂氏温度), 華氏温度表示(_摂氏温度). 摂氏温度入力で(_摂氏温度) :- write('摂氏温度を入力してください : '), 一行の読み込み(Line), '診断: 摂氏温度入力'(Line,_摂氏温度),!. 摂氏温度入力で(_摂氏温度) :- 摂氏温度入力で(_摂氏温度). '診断: 摂氏温度入力'(Line,_摂氏温度) :- atom_to_term(Line,_摂氏温度,_), number(_摂氏温度),!. '診断: 摂氏温度入力'(Line,_) :- writef('摂氏温度は整数または実数ですが、入力された %t からは数値情報が得られません。再入力をお願いします。\n',[Line]), fail. 華氏温度表示(_摂氏温度) :- _華氏温度 is 9 * _摂氏温度 / 5 + 32, writef('華氏温度は %t です。\n',[_華氏温度]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/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/1354070278/49 # # [1] 授業単元:計算機実習 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/eMHdX9DL # 上記のプログラムを変更して,キーボードから(x, y)の座標とマスの状態を入力し,反映するようにしなさい. # 入力の際には座標や状態が範囲を超えていないか確認し,越えているときにはもう一度入力するようにしなさい. # # #include # int plot[8][8]; # char state[3][5] = {" ","○ ","● "}; # # # void print_board(){ # int x,y; # printf("\033[2J"); # printf("\033[%d;%dH",0,0); # for(y = 0;y < 8;y++){ # for (x = 0;x < 8;x++){ # printf("%s|",state[plot[x][y]]); # } # printf("\n"); # printf("--+--+--+--+--+--+--+--+\n"); # } # } # # int main(){ # int x,y; # # for(y = 0;y < 8;y++)for(x = 0;x < 8;x++)plot[x][y] = 0; # plot[3][3] = plot[4][4] = 1; # plot[3][4] = plot[4][3] = 2; # # print_board(); # } # # 1 2 3 4 5 6 7 8 # +--+--+--+--+--+--+--+--+ # 1 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 2 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 3 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 4 | | | |○|●| | | | # +--+--+--+--+--+--+--+--+ # 5 | | | |●|○| | | | # +--+--+--+--+--+--+--+--+ # 6 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 7 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 8 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # :- dynamic(ボード保存/1). 'キーボードから(x, y)の座標とマスの状態を入力し,反映するようにしなさい.入力の際には座標や状態が範囲を超えていないか確認し,越えているときにはもう一度入力するようにしなさい.' :- ボードの初期状態(_ボート), ボードゲーム(_ボード). ボードの初期状態(_ボート) :- findall(L,( between(1,8,_), length(L,8), all(L,' ')), _ボード). ボードゲーム(_現在のボード) :- ボード(_現在のボード,_一手進んだボード), ボードゲーム(_一手進んだボード),!. ボードゲーム(_現在のボード) :- ボード表示(_現在のボード), write('ゲーム終了です。\n'), 終了時点のボードを保存する(_現在のボード). ボード(_現在のボード) :- 着手するべきマスが残っている(_現在のボード), 'キーボードから(x, y)の座標とマスの状態を入力し'(X,Y), ボードを更新する(X,Y,_現在のボード,_一手進んだボード), ボードを表示する(_一手進んだボード),!. 着手するべきマスが残っている([L|R]) :- member(' ',L), 着手するべきマスが残っている(R),!. 'キーボードから(x, y)の座標とマスの状態を入力し'(X,Y,_マスの状態) :- 整数を得る('x(0は終了)',between(0,8,X),X), \+(X = 0), 整数を得る('y',between(1,8,Y),Y), マスの状態を得る(_マスの状態). マスの状態を得る(_マスの状態) :- write(' ..0か●..1か○..2を着手してください : '), get_Line(Line), '診断: マスの状態を得る'(Line,_マスの状態),!. マスの状態を得る(_マスの状態) :- マスの状態を得る(_マスの状態). '診断: マスの状態を得る'('0',' ') :- !. '診断: マスの状態を得る'('1','○') :- !. '診断: マスの状態を得る'('2','●') :- !. ボードを更新する(X,Y,_着手,_現在のボード,_一手進んだボード) :- '前の行ならび、対象行、後の行ならび'(Y,_現在のボード,_前の行ならび,_対象行,_後の行ならび), 対象行を更新する(X,_着手,_対象行,_更新された対象行), append(_前の行ならび,[_更新された対象行|_後の行ならび],_一手進んだボード). '前の行ならび、対象行、後の行ならび'(Y,_現在のボード,_前の行ならび,_対象行,_後の行ならび) :- append(_前の行ならび,[_対象行|_後の行ならび],_現在のボード), length([_|_前の行ならび],Y). 対象行を更新する(X,_着手,_対象行,_更新された対象行) :- append(L0,[_|R],_対象行), length([_|L0],X), append(L0,[_着手|R],_更新された対象行). ボード表示(_ボード) :- append(L0,[L|R],_ボード), ボードの一行を表示する(L0,L), R = [], writef(' +--+--+--+--+--+--+--+--+\n'),!. ボードの一行を表示する(L0,L) :- length([_|L0],N), writef(' +--+--+--+--+--+--+--+--+\n'), atomic_list_concat(L,'|',S), writef('%t %t|\n',[N,S]). 終了時点のボードを保存する(_現在のボード) :- asserta(ボード保存(終了時点のボードを保存する(_現在のボード)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1351769173/599 # # 2進数3桁のパスワードロックのプログラムを作るのですが、パスワード変更の機能も追加しなければなりません。どのようにプログラムを組めば良いのかわかりません。なにかアドバイス頂けませんか? # # :- dynamic(パスワード/4). パスワードの変更([],_ID) :- !,fail. パスワードの変更(Ln,_ID) :- パスワードを変更の手続き(_ID),!. パスワードの変更([_|Ln],_ID) :- パスワードの変更(Ln,_ID). パスワードを変更の手続き(_ID) :- 現在のパスワードの確認(_ID,_入力1,_入力2,_入力3), 新しいパスワードの入力(_入力1_2,_入力2_2,_入力3_2), 新しいパスワードの再入力(_入力1_2,_入力2_2,_入力3_2), パスワードの書き換え(_ID,_入力1_2,_入力2_2,_入力3_2),!. 新しいパスワードの再入力(_入力1_2,_入力2_2,_入力3_2) :- write('念のためもう一度新しいパスワードを入力してください : '), パスワードを入力する(_入力1_2,_入力2_2,_入力3_2). 現在のパスワードの確認(_ID,_入力1,_入力2,_入力3) :- write('現在のパスワードを入力してください : '), パスワードを入力する(_入力1,_入力2,_入力3), パスワード検査(_ID,_入力1,_入力2,_入力3,諾). 新しいパスワードの入力(_入力1_2,_入力2_2,_入力3_2) :- write('新しいパスワードを入力してください : '), パスワードを入力する(_入力1_2,_入力2_2,_入力3_2),!. 新しいパスワードの再入力(_入力1_2,_入力2_2,_入力3_2) :- write('念のため、もう一度、新しいパスワードを入力してください : '), パスワードを入力する(_入力1_2,_入力2_2,_入力3_2),!. パスワードの書き換え(_ID,_入力1_2,_入力2_2,_入力3_2) :- retract(パスワード(_ID,_,_,_)), assertz(パスワード(_ID,_入力1_2,_入力2_2,_入力3_2)). パスワード検査(_ID) :- パスワードを入力する(_入力1,_入力2,_入力3), パスワード検査(_ID,_入力1,_入力2,_入力3,_診断), パスワード検査表示(_ID,_診断). パスワードを入力する(_入力1,_入力2,_入力3) :- 整数を得る('0か1',between(0,1,_入力1),_入力1), 整数を得る('0か1',between(0,1,_入力2),_入力2), 整数を得る('0か1',between(0,1,_入力3),_入力3). パスワード検査(_ID,_入力1,_入力2,_入力3,諾) :- パスワード(_ID,_入力1,_入力2,_入力3),!. パスワード検査(_ID,_入力1,_入力2,_入力3,拒) :- \+(パスワード(_ID,_入力1,_入力2,_入力3)). パスワード検査表示(_ID,拒) :- writef('パスワードが違います\n'),!. パスワード検査表示(_ID,諾) :- !. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/872 # # [1] 授業単元:計算機実習 # [2] 問題文(含コード&リンク): # whileを用いて数当てゲームを作りなさい # ・コンピュータが乱数で1から1000までの数を用意する. # ・プレイヤがキーボードから数を入れる. # ・コンピュータの数より大きければ「大きい」,小さければ「小さい」と画面に表示する. # ・コンピュータの数とプレイヤの数が同じでなければ,繰り返す. # 「何回で当てられたか」を表示させる. # 'whileを用いて数当てゲームを作りなさい ・コンピュータが乱数で1から1000までの数を用意する. ・プレイヤがキーボードから数を入れる. ・コンピュータの数より大きければ「大きい」,小さければ「小さい」と画面に表示する. ・コンピュータの数とプレイヤの数が同じでなければ,繰り返す. 「何回で当てられたか」を表示させる.' :- コンピュータが乱数で1から1000までの数を用意する(_1から1000までの乱数), プレイヤがキーボードから数を入れる(0,_何回目,_数), 'コンピュータの数より大きければ「大きい」,小さければ「小さい」と画面に表示する'(_1から1000までの乱数,_数,_診断), 'コンピュータの数とプレイヤの数が同じでなければ,繰り返す'(_診断), writef('%t回で当てることができました。おめでとうございます。\n',[_何回目]). コンピュータが乱数で1から1000までの数を用意する(_1から1000までの乱数) :- _1から1000までの乱数 is random(1000) + 1. プレイヤがキーボードから数を入れる(N_1,N,_数) :- N is N_1 + 1, 整数を得る(数,(_数 >= 1,_数 =< 1000),_,_数). プレイヤがキーボードから数を入れる(N_1,N,_数) :- N_2 is N_1 + 1, プレイヤがキーボードから数を入れる(N_2,N,_数). 'コンピュータの数より大きければ「大きい」,小さければ「小さい」と画面に表示する'(_1から1000までの乱数,_数,大きい) :- 'コンピュータの数より大きければ「大きい」,小さければ「小さい」と'(_1から1000までの乱数,_数,_診断), 画面に表示する(_診断). writef('%t\n',[_診断]). 'コンピュータの数より大きければ「大きい」,小さければ「小さい」と'(_1から1000までの乱数,_数,大きい) :- _1から1000までの乱数 < _数. 'コンピュータの数より大きければ「大きい」,小さければ「小さい」と'(_1から1000までの乱数,_数,小さい) :- _1から1000までの乱数 > _数. 'コンピュータの数より大きければ「大きい」,小さければ「小さい」と'(_1から1000までの乱数,_数,コンピュータの数とプレイヤの数が同じ) :- _1から1000までの乱数 = _数. 'コンピュータの数とプレイヤの数が同じでなければ,繰り返す'(コンピュータの数とプレイヤの数が同じ). 画面に表示する(_診断) :- 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] 問題文( # キーボードから入力したメニュー番号に沿った図形を「*」で表示するプログラムを # 作成してください。なお、プログラム作成時は以下の仕様に従ってください。 # ファイル名: kadai3.c # 【 問題作成時の注意点 】 # ・メニュー番号と図形の種類は以下の通りとします。なお、キーボードから # 入力した値が以下の番号以外の場合、再びメニュー番号を入力するように # してください。 # 1 三角形 # 2 四角形 # ・図形の段数(高さ)は、キーボードから入力してください。なお、キーボード # から入力した数が1 以下の場合、エラーメッセージを表示し、exit 関数で # プログラムを終了してください。 # エラーメッセージの例) wrong number # ・図形の表示には関数を利用してください。関数のプロトタイプ宣言は以下の # 通りとします。 # void DrawTriangle(int); # void DrawRectangle(int); # [3] 環境 #  [3.1] OS: Windows #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C++ # [4] 期限: ([2006年11月2日17:30まで # [5] その他の制限:なし 'キーボードから入力したメニュー番号に沿った図形を「*」で表示するプログラムを 作成してください。なお、プログラム作成時は以下の仕様に従ってください。 l・メニュー番号と図形の種類は以下の通りとします。なお、キーボードから 入力した値が以下の番号以外の場合、再びメニュー番号を入力するように してください。 1 三角形 2 四角形 ・図形の段数(高さ)は、キーボードから入力してください。なお、キーボード から入力した数が1 以下の場合、エラーメッセージを表示し、exit 関数で プログラムを終了してください。' :- 'キーボードから入力した 1 三角形 2 四角形 のメニュー番号'(_メニュー番号), 'メニュー番号に沿った図形を「*」で表示する'(_メニュー番号). 'キーボードから入力した 1 三角形 2 四角形 のメニュー番号'(_メニュー番号) :- write('左側の数字で選択してください\n\n1 三角形\n2 四角形\n\n'), 整数を得る('メニュー番号[1/2]',member(_メニュー番号,[1,2]),_メニュー番号). 'メニュー番号に沿った図形を「*」で表示する'(1) :- 三角形の表示. 'メニュー番号に沿った図形を「*」で表示する'(2) :- 四角形の表示. 三角形の表示 :- '図形の段数(高さ)を入力してください'(_図形の高さ), 三角形の図形像(_図形の高さ,_図形像), 図形表示(_図形像). 三角形の図形像(_図形の高さ,_図形像,_図形像) :- findall(_表示星列,( between(1,_図形の段数,_現在の段), 三角形の表示星列(_現在の段,_表示星列)), _図形像). 三角形の表示星列(_現在の段,_表示星列) :- length(L,_現在の段), all(L,'*'), atomic_list_concat(L,_表示星列). 四角形の表示 :- 幅を入力してください(_図形の幅), '図形の段数(高さ)は、キーボードから入力してください'(_図形の高さ), 四角形の図形像(_図形の幅,_図形の高さ,_図形像), 図形の表示(_図形像). 四角形の図形像(_図形の幅,_図形の高さ,_図形像) :- 表示星列(_図形の幅,_表示星列), findall(_表示星列,( between(1,_図形の高さ,_), 四角形の表示星列(_図形の幅,_表示星列)), _図形像). 図形の表示(_図形像) :- append(_,[_表示星列|R],_図形像), writef('%t\n',[_表示星列]), R = []. 四角形の表示星列(_現在の段,_表示星列) :- length(L,_現在の段), all(L,'*'), atomic_list_concat(L,_表示星列). '図形の段数(高さ)を入力してください'(_図形の高さ) :- 整数を得る(図形の段数,_図形の高さ), 図形の高さ診断(_図形の高さ),!. '図形の段数(高さ)を入力してください'(_図形の高さ) :- '図形の段数(高さ)を入力してください'(_図形の高さ). 図形の高さ診断(_図形の高さ) :- _図形の高さ > 1,!. 図形の高さ診断(_図形の高さ) :- writef('入力された図形の高さ %t はこの図形の高さとして適切でありません。\n再入力をお願いします。\n',[_図形の高さ]), fail. '幅を入力してください'(_図形の幅) :- 整数を得る(図形の段数,_図形の幅), 図形の幅診断(_図形の幅),!. '幅を入力してください'(_図形の幅) :- '幅を入力してください'(_図形の幅). 図形の幅診断(_図形の幅) :- _図形の幅 > 1,!. 図形の幅診断(_図形の幅) :- writef('入力された図形の幅 %t はこの図形の幅として適切でありません。\n再入力をお願いします。\n',[_図形の幅]), fail. all([],_). all([A|R],A) :- all(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/829 # # 問題 # 数独の解答が9行9列の文字列で与えられたとき正しいかどうか判定せよ。 # # '数独の解答が9行9列の文字列で与えられたとき正しいかどうか'(_文字列) :- '数独の解答が9行9列の文字列で与えられたとき'(_文字列,L), 数独の回答が正しい(L). '数独の解答が9行9列の文字列で与えられたとき'(_9行9列の文字列,L) :- atom_chars(_9行9列の文字列,Chars), 改行を取り除きながら数字列を数値ならびに変換(Chars,L). 改行を取り除きながら数字列を数値ならびに変換([],[]). 改行を取り除きながら数字列を数値ならびに変換(['\n'|R1],R2) :- 改行を取り除きながら数字列を数値ならびに変換(R1,R2). 改行を取り除きながら数字列を数値ならびに変換([A|R1],[N|R2]) :- atom_number(A,N), 改行を取り除きながら数字列を数値ならびに変換(R1,R2). 数独の回答が正しい([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81]) :- 数独診断([[_1,_2,_3,_4,_5,_6,_7,_8,_9], [_10,_11,_12,_13,_14,_15,_16,_17,_18], [_19,_20,_21,_22,_23,_24,_25,_26,_27], [_28,_29,_30,_31,_32,_33,_34,_35,_36], [_37,_38,_39,_40,_41,_42,_43,_44,_45], [_46,_47,_48,_49,_50,_51,_52,_53,_54], [_55,_56,_57,_58,_59,_60,_61,_62,_63], [_64,_65,_66,_67,_68,_69,_70,_71,_72], [_73,_74,_75,_76,_77,_78,_79,_80,_81], [_1,_10,_19,_28,_37,_46,_55,_64,_73], [_2,_11,_20,_29,_38,_47,_56,_65,_74], [_3,_12,_21,_30,_39,_48,_57,_66,_75], [_4,_13,_22,_31,_40,_49,_58,_67,_76], [_5,_14,_23,_32,_41,_50,_59,_68,_77], [_6,_15,_24,_33,_42,_51,_60,_69,_78], [_7,_16,_25,_34,_43,_52,_61,_70,_79], [_8,_17,_26,_35,_44,_53,_62,_71,_80], [_9,_18,_27,_36,_45,_54,_63,_72,_81], [_1,_2,_3,_10,_11,_12,_19,_20,_21], [_4,_5,_6,_13,_14,_15,_22,_23,_24], [_7,_8,_9,_16,_17,_18,_25,_26,_27], [_28,_29,_30,_37,_38,_39,_46,_47,_48], [_31,_32,_33,_40,_41,_42,_49,_50,_51], [_34,_35,_36,_43,_44,_45,_52,_53,_54], [_55,_56,_57,_64,_65,_66,_73,_74,_75], [_58,_59,_60,_67,_68,_69,_76,_77,_78], [_61,_62,_63,_70,_71,_72,_79,_80,_81]]). 数独診断([]) :- !. 数独診断([L|R]) :- sort(L,L1), length(L1,9), 数独診断(R). 数独([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81]) :- 数独生成([[_1,_2,_3,_4,_5,_6,_7,_8,_9], [_10,_11,_12,_13,_14,_15,_16,_17,_18], [_19,_20,_21,_22,_23,_24,_25,_26,_27], [_28,_29,_30,_31,_32,_33,_34,_35,_36], [_37,_38,_39,_40,_41,_42,_43,_44,_45], [_46,_47,_48,_49,_50,_51,_52,_53,_54], [_55,_56,_57,_58,_59,_60,_61,_62,_63], [_64,_65,_66,_67,_68,_69,_70,_71,_72], [_73,_74,_75,_76,_77,_78,_79,_80,_81], [_1,_10,_19,_28,_37,_46,_55,_64,_73], [_2,_11,_20,_29,_38,_47,_56,_65,_74], [_3,_12,_21,_30,_39,_48,_57,_66,_75], [_4,_13,_22,_31,_40,_49,_58,_67,_76], [_5,_14,_23,_32,_41,_50,_59,_68,_77], [_6,_15,_24,_33,_42,_51,_60,_69,_78], [_7,_16,_25,_34,_43,_52,_61,_70,_79], [_8,_17,_26,_35,_44,_53,_62,_71,_80], [_9,_18,_27,_36,_45,_54,_63,_72,_81], [_1,_2,_3,_10,_11,_12,_19,_20,_21], [_4,_5,_6,_13,_14,_15,_22,_23,_24], [_7,_8,_9,_16,_17,_18,_25,_26,_27], [_28,_29,_30,_37,_38,_39,_46,_47,_48], [_31,_32,_33,_40,_41,_42,_49,_50,_51], [_34,_35,_36,_43,_44,_45,_52,_53,_54], [_55,_56,_57,_64,_65,_66,_73,_74,_75], [_58,_59,_60,_67,_68,_69,_76,_77,_78], [_61,_62,_63,_70,_71,_72,_79,_80,_81]]). 数独生成([]) :- !. 数独生成([L|R]) :- 変数に数値を埋める(L), 数独生成(R). 変数に数値を埋める(L) :- 既に使われている数値は候補から外す(L,[1,2,3,4,5,6,7,8,9],_数字候補), 変数に数値を埋める(_数字候補,L). 既に使われている数値は候補から外す([],L,L). 既に使われている数値は候補から外す([V|R1],L1,L) :- var(V), 既に使われている数値は候補から外す(R1,L1,L). 既に使われている数値は候補から外す([N|R1],L1,L) :- integer(N), select(N,L1,L2), 既に使われている数値は候補から外す(R1,L2,L). 変数に数値を埋める([],[]). 変数に数値を埋める(_数字候補,[N|R]) :- integer(N), 変数に数値を埋める(_数字候補,R). 変数に数値を埋める(_数字候補,[V|R]) :- var(V), select(V,_数字候補,_残り数字候補), 変数に数値を埋める(_残り数字候補,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/829 # # 問題 # 数独の解答が9行9列の文字列で与えられたとき正しいかどうか判定せよ。 # # '数独の解答が9行9列の文字列で与えられたとき正しいかどうか'(_文字列) :- '数独の解答が9行9列の文字列で与えられたとき'(_文字列,LL), 数独の回答が正しい(LL). '数独の解答が9行9列の文字列で与えられたとき'(_9行9列の文字列,LL) :- split(9行9列の文字列,['\n'],_行ならび), '9行9列の行ならびを行列に変換'(_行ならび,LL). '9行9列の行ならびを行列に変換'([],[]). '9行9列の行ならびを行列に変換'([_行|R1],[L|R2]) :- findall(N,( sub_atom(_行,_,1,_,A), atom_number(A,N)), L), '9行9列の行ならびを行列に変換'(R1,R2). 数独の回答が正しい(LL) :- '行・列要素の数独の解答は正しい'(LL), 矩形要素の数独の解答も正しい(LL). '行・列要素の数独の解答は正しい'(LL) :- 行要素の数独診断(LL), 転置(LL,LL2), 行要素の数独診断(LL2). 行要素の数独診断([]). 行要素の数独診断([L1|R]) :- 一意の数が9個(L1), 行要素の数独診断(R). 矩形要素の数独の解答も正しい([]). 矩形要素の数独の解答も正しい([L1,L2,L3|R1],L) :- 転置([L1,L2,L3],LL1), 矩形要素診断(LL1), 矩形要素の数独の解答も正しい(R1,R2). 矩形要素診断([]). 矩形要素診断([L1,L2,L3|R]) :- append(L1,L2,L3,L), 一意の数が9個(L), 矩形要素診断(R). 一意の数が9個(L1) :- sort(L1,L2), length(L2,9). % 以下のサイトは # 出典:: 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(_十進数表記文字列,_十進数). % 以下のサイトは # 出典:: 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/820 # # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):その他の制限:自分の番号と身長と体重を入力し (体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満) # で区別し これを終了するまで繰り返す 番号0と打ったら入力を終了し、それぞれ1種類ずつのBMIが一番大きい人の番号体重身長BMIを表示する # # '各々自分の番号と身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別し これを終了するまで繰り返す 番号0と打ったら入力を終了し、それぞれ1種類ずつのBMIが一番大きい人の番号体重身長BMIを表示する' :- '各々自分の番号を入力'(_番号), '身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別することを番号0と入力されるまで繰り返す'(_番号), 'それぞれ1種類ずつのBMIが一番大きい人の番号体重身長BMIを表示する'. '各々自分の番号を入力'(_番号) :- 整数を得る(自分の番号,_番号). '身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別することを番号0と入力されるまで繰り返す'('0') :- !. '身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別することを番号0と入力されるまで繰り返す'(_番号) :- 身長と体重を入力し(_身長,_体重), '身長・体重・BMIを登録する'(_番号,_身長,_体重,_BMI), '各々自分の番号を入力'(_次の番号), '身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別することを番号0と入力されるまで繰り返す'(_次の番号). 身長と体重を入力し(_身長,_体重) :- 身長を入力(身長,(_身長 > 0.0,_身長 =< 2.3),_身長), 体重を入力(体重,(_体重 > 0.0,_体重 =< 300.0),_体重). 身長を入力(_身長) :- 数を得る(身長,(_身長 > 0.0,_身長 =< 2.3),_身長). 体重を入力(_体重) :- 数を得る(体重,(_体重 > 0.0,_体重 =< 300.0),_体重). '身長・体重・BMIを登録する'(_番号,_身長,_体重) :- _BMI is _体重/(_身長*_身長), assertz(身長(_番号,_身長)), assertz(体重(_番号,_体重)), assertz(BMI(_番号,BMI)). 'それぞれ1種類ずつのBMIが一番大きい人の番号体重身長BMIを表示する' :- append(_,[_BMI種類|R],[軽体重,普通体重,前肥満,肥満]), 'BMI種類の表示'(_BMI種類), R = []. 'BMI種類の表示'(_BMI種類) :- findall([_BMI,_番号,_身長,_体重],( 'BMI種類に適合する番号'(_BMI種類,_番号,_身長,_体重,_BMI)), LL1), 降順整列(LL1,[[_BMI,_番号,_身長,_体重]|_]), writef('%tの人でBMIがもっとも大きい人 : 番号: %t, 身長: %t, 体重: %t, BMI: %t ',[_BMI種類,_番号,_身長,_体重,_BMI]). 'BMI種類に適合する番号'(_BMI種類,_番号,_身長,_体重,_BMI) :- 'BMI'(_番号,_BMI), 'BMI診断'(_BMI,_BMI種類), 身長(_番号,_身長), 体重(_番号,_体重). 'BMI診断'(_BMI,軽体重) :- _BMI < 18.5. 'BMI診断'(_BMI,普通体重) :- _BMI >= 18.5, _BMI < 25. 'BMI診断'(_BMI,前肥満) :- _BMI >= 25.0, 'BMI診断'(_BMI,肥満) :- _BMI >= 30.0. 降順整列(L1,L3) :- sort(L1,L2), reverse(L2,L3). % 以下のサイトは # 出典:: 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/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以外の数字が入力された場合には、入力し直す)'(_数字) :- get_line(Line), '診断: キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(Line,_数字),!. 'キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_数字) :- 'キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_数字). '診断: キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(Line,_数字) :- 'キーボードから0,1,2,3を入力した'(Line,_数字),!. '診断: キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(Line,_数字) :- '0,1,2,3以外の数字が入力された'(Line,_), fail. 'キーボードから0,1,2,3を入力した'(Line,_数字) :- atom_to_term(Line,_数字,_), integer(_数字), member(_数字,[0,1,2,3]),!. '0,1,2,3以外の数字が入力された'(Line,_) :- \+('キーボードから0,1,2,3を入力した'(Line,_数字)),!. 'それぞれ 春,夏,秋,冬 と表示する。'(_数字) :- 四季(_数字,_春_夏_秋_冬), writef('%t\n',[_春_夏_秋_冬]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/71 # # 数値比較を正規表現だけでやることになって、たった4桁なのに泣きそう。 # # '数値比較を正規表現だけでやることになって、たった4桁なのに泣きそう。'(_4桁ブラス4桁の数字列,_診断) :- atom_chars(_4桁ブラス4桁の数字列,[A,B,C,D,E,F,G,H]), '診断: 4桁の数字ならび比較'([A,B,C,D],[E,F,G,H],_診断),!. '診断: 4桁の数字ならび比較'(L,L,=) :- !. '診断: 4桁の数字ならび比較'(L1,L2,<) :- L1 @< L2,!. '診断: 4桁の数字ならび比較'(L1,L2,>) :- L1 @> L2,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/399 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # まず学生の人数(100人以下)を入力し、成績結果のファイルseiseki.txtを読み、 # それから国語または数学、英語の点数のどれかに注目した小から大への順番に従ってデータを並べ替えて、 # write.txtに出力するプログラムを作成しなさい。 # 例 # seiseki.txt # No. 国語 数学 英語 # 1  90 80 70 # 2   85 75 65 # 3   80 70 60 # 4   75 65 55 # 5   70 60 50 # # 学生の人数を入力してください。6 # 科目番号を入力してください。 # 1:国語、2:数学、3:英語 # 2 # # write.txt # 5 70 60 50 # 4 75 65 55 # 3 80 70 60 # 2 85 75 65 # 1 90 80 70 # 'まず学生の人数(100人以下)を入力し、成績結果のファイルseiseki.txtを読み、それから国語または数学、英語の点数のどれかに注目した小から大への順番に従ってデータを並べ替えて、write.txtに出力する' :- 'まず学生の人数(100人以下)を入力し'(_学生の人数), '成績結果のファイルseiseki.txtを読み'(_学生の人数,_成績ならび), 'それから国語または数学、英語の点数のどれかに注目'(_注目した科目,_成績ならび,_着目した科目の成績ならび), '小から大への順番に従ってデータを並べ替えて'(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび), 'write.txtに出力する'(_昇順に整列した着目した科目の成績ならび,_成績ならび). 'まず学生の人数(100人以下)を入力し'(_学生の人数) :- 整数を得る(学生の人数,_学生の人数 =< 100,_学生の人数). '成績結果のファイルseiseki.txtを読み'(_学生の人数,_成績ならび) :- get_split_lines('seiseki.txt',[' '],LL), 平坦化(LL,_成績ならび_1), 学生の人数分を切り取る(_学生の人数,_成績ならび_1,_成績ならび). 学生の人数分を切り取る(_学生の人数,_成績ならび_1,_成績ならび) :- length(_成績ならび_1,_要素数), _要素数 >= _学生の人数, length(_成績ならび,_学生の人数), append(_成績ならび,_,_成績ならび_1),!. 学生の人数分を切り取る(_学生の人数,_成績ならび,_成績ならび). 'それから国語または数学、英語の点数のどれかに注目'(_注目した科目,_成績ならび,_注目した科目の成績ならび) :- 注目した科目を選択する(_注目した科目), findall([_注目した科目の成績,_No],( member([_No,_国語,_数学,_英語],_成績ならび), 注目した科目成績を選択する(_注目した科目,[_国語,_数学,_英語],_注目した科目の成績)), _注目した科目の成績ならび). 注目した科目を選択する(_注目した科目) :- write('国語、数学、英語のうち、注目した科目を入力してください : '), get_line(Line), '診断: 注目した科目を選択する'(Line,_注目した科目),!. 注目した科目を選択する(_注目した科目) :- 注目した科目を選択する(_注目した科目). '診断: 注目した科目を選択する'(_注目した科目,_注目した科目) :- member(_注目した科目,[国語,数学,英語]),!. '診断: 注目した科目を選択する'(Line,_注目した科目) :- write('入力された %t は国語、数学、英語のいずれでもありません。再入力をお願いします。\n',[Line]), fail. 注目した科目成績を選択する(国語,[_国語,_数学,_英語],_国語). 注目した科目成績を選択する(数学,[_国語,_数学,_英語],_数学). 注目した科目成績を選択する(英語,[_国語,_数学,_英語],_英語). '小から大への順番に従ってデータを並べ替えて'(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび) :- 整列(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび). 整列([],[]). 整列([_軸要素|_着目した科目の成績ならび],_昇順に整列した着目した科目の成績ならび) :- 分割(_軸要素,_着目した科目の成績ならび,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび), 整列(_軸要素より小さい成績ならび,_整列した軸要素より小さい成績ならび), 整列(_軸要素より大きい成績ならび,_整列した軸要素より大きい成績ならび), append(_整列した軸要素より小さい成績ならび,[_軸要素|_整列した軸要素より大きい成績ならび],_昇順に整列した着目した科目の成績ならび). 分割(_,[],[],[]). 分割(_軸要素,[[_成績,_No]|R1],[[_成績,_No]|_軸要素より小さい成績ならび],_軸要素と等しいか大きい成績ならび) :- _成績 @<_軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 分割(_軸要素,[[_成績,_No]|R1],_軸要素より小さい成績ならび,[[_成績,_No]|_軸要素と等しいか大きい成績ならび]) :- _成績 @>= _軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 'write.txtに出力する'(_昇順に整列した着目した科目の成績ならび,_成績ならび) :- open('write.txt',write,Outstream), 'Outstreamへ出力'(Outstream,_昇順に整列した着目した科目の成績ならび,_成績ならび), close(Outstream). 'Outstreamへ出力'(Outstream,_昇順に整列した着目した科目の成績ならび,_成績ならび) :- append(_,[[_成績,_No]|R],_昇順に整列した着目した科目の成績ならび), member([_No,_国語,_数学,_英語],_成績ならび), writef(Outstream,'%t %t %t %t\n',[_No,_国語,_数学,_英語]), R = []. % 平坦化/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/930 # # ((角|丸)ゴシック|明朝) # # こういった入れ子?を書くと例えば丸ゴシックにマッチしますが丸にもマッチします # どのように書けばよいのでしょう '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,_適合文字列_1), '診断: 適合'(_適合文字列_1), sub_atom(_文字列,0,S,_,_前文字列_1), S_2 is S + Len, sub_atom(_文字列,S_2,R,0,_後文字列_1), '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_文字列,S,Len,R,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列). '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_文字列,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_後文字列_1,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). '診断: 適合'(_文字列) :- 接頭候補(_接頭候補), atomic_list_concat([_接頭候補,ゴシック],_文字列). '診断: 適合'(明朝). % 以下のサイトは # # 質問付き入力の一般型を示す。 # 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/77 # # [1] 授業単元: 数値解析 # [2] 問題文(含コード&リンク): # 表示や入力を目的とする関数以外では、関数の中で標準入力や # 標準出力への入出力は行わないこと. # 西暦の年を引数にとり、うるう年ならば1を返し、そうでないならば0を # 返す関数intercalary_year()を作成しなさい。 # 西暦が4の倍数ならばうるう年である。 # ただし、100の倍数ならばうるう年ではなく、 # さらに、400の倍数ならばうるう年である。 # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月20日 # お手数ですが、よろしくお願いします。 # # '西暦の年を引数にとり、うるう年ならば真、うるう年でなければ偽となる述語 うるう年/1 を作成しなさい。西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦,_診断) :- うるう年(_西暦). うるう年(_西暦) :- '西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦). '西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦) :- '西暦が4の倍数ならば'(_西暦), 'ただし、100の倍数ならばうるう年ではなく'(_西暦),!. '西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦) :- 'さらに、400の倍数ならばうるう年である'(_西暦). '西暦が4の倍数ならば'(_西暦) :- 0 is _西暦 mod 4. 'ただし、100の倍数ならばうるう年ではなく'(_西暦) :- 0 is _西暦 mod 100, fail. 'ただし、100の倍数ならばうるう年ではなく'(_西暦) :- \+(0 is _西暦 mod 100). 'さらに、400の倍数ならばうるう年である'(_西暦) :- 0 is _西暦 mod 400. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/77 # # [1] 授業単元: 数値解析 # [2] 問題文(含コード&リンク): # 表示や入力を目的とする関数以外では、関数の中で標準入力や # 標準出力への入出力は行わないこと. # 西暦の年を引数にとり、うるう年ならば1を返し、そうでないならば0を # 返す関数intercalary_year()を作成しなさい。 # 西暦が4の倍数ならばうるう年である。 # ただし、100の倍数ならばうるう年ではなく、 # さらに、400の倍数ならばうるう年である。 # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月20日 # お手数ですが、よろしくお願いします。 # # '西暦の年を引数にとり、うるう年ならば1を返し、そうでないならば0を返す述語 うるう年/2 を作成しなさい。西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦,_診断) :- うるう年(_西暦,_診断). うるう年(_西暦,1) :- '西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦),!. うるう年(_西暦,0). '西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦) :- '西暦が4の倍数ならば'(_西暦), 'ただし、100の倍数ならばうるう年ではなく'(_西暦),!. '西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦) :- 'さらに、400の倍数ならばうるう年である'(_西暦). '西暦が4の倍数ならば'(_西暦) :- 0 is _西暦 mod 4. 'ただし、100の倍数ならばうるう年ではなく'(_西暦) :- 0 is _西暦 mod 100, fail. 'ただし、100の倍数ならばうるう年ではなく'(_西暦) :- \+(0 is _西暦 mod 100). 'さらに、400の倍数ならばうるう年である'(_西暦) :- 0 is _西暦 mod 400. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/64 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク):身長(cm)と体重(kg)が、(170,85), (165,65), (180,78), #             (195,80), (188,72)の学生がいる。このデータを配列変数に保存し,身長 #             を入力すると体重を検索するプログラムを作成せよ。 #              該当する身長の学生がいない場合は「みつかりません。」を表示し #             繰り返しを終了せよ。 #             ここで,次のように配列宣言を行う。 #             int shincho[ ] = { 170, 165, 180, 195, 188, 0}; #             int taiju[ ] = { 85, 65, 78, 80, 72, 0}; # # データの最後は,データの個数である 5 を用いず、身長データが0になった # とき繰り返しを終了する方法を考えること。 # ヒント:for( i=0 ; shincho[i] != 0 ; i++)を使用する。 # # '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し,身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。' :- '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し'(_身長_体重ならび), '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび). '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し'(_身長_体重ならび) :- length(_身長_体重ならび,5), findall([_身長,_体重],( append(Ln,[_|_],_身長_体重ならび), 身長と体重の入力(Ln,_身長,_体重)), _身長体重ならび). 身長と体重の入力(Ln,_身長,_体重) :- length([_|Ln],N人目), writef('%t人目の 身長 : ',[N人目]), get_integer(_身長), write(' 体重 : '), get_integer(_体重). '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび) :- '身長を入力すると'(_身長), '体重を検索する'(_身長_体重ならび,_身長,_体重), writef('身長 %t の人の 体重は %t です。\n',[_身長,_体重]), '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび). '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび) :- writef('見つかりません\n'). '身長を入力すると'(_身長) :- write('身長を入力してください : '), get_line(Line), '診断: 身長を入力すると'(Line,_身長),!. '身長を入力すると'(_身長) :- '身長を入力すると'(_身長). '診断: 身長を入力すると'(Line,_身長) :- atom_to_term(Line,_身長,_), integer(_身長),!. '診断: 身長を入力すると'(Line,_身長) :- writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]), fail. '体重を検索する'(_身長_体重ならび,_身長,_体重) :- member([_身長,_体重],_身長_体重ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/49 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/5oepZpDW # 上記のプログラムに5人の得点(10点満点)を受け取ると、5人の得点の偏差値を戻すhensachi関数を追加せよ。 # そして5人のテストの得点を整数型配列data[5]の各要素それぞれ入力すると、5人の得点の平均点に加えて偏差値も出力するプログラムをheikin関数およびhensachi関数を利用して作成しなさい。 # '5人の得点(10点満点)を受け取ると、5人の得点の偏差値を戻す'(_5人の得点の偏差値) :- '5人の得点(10点満点)を受け取ると'(_5人の得点ならび), '5人の得点の偏差値を戻す'(_5人の得点ならび,_5人の得点の偏差値). '5人の得点(10点満点)を受け取ると'(_5人の得点ならび) :- length(_5人の得点ならび,5), findall(_得点,( append(Ln,[_|_],_5人の得点ならび), '得点(10点満点)を受け取る'(Ln,_得点)), _5人の得点ならび). '得点(10点満点)を受け取る'(Ln,_得点) :- length([_|Ln],_何人目), writef('%t人目の得点(10点満点)を入力してください : ',[_何人目]), get_line(Line), '診断: 得点(10点満点)を受け取る'(Line,_得点),!. '得点(10点満点)を受け取る'(Ln,_得点) :- '得点(10点満点)を受け取る'(Ln,_得点). '診断: 得点(10点満点)を受け取る'(Line,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 >= 0, _得点 =< 10,!. 偏差値(_標本値,_算術平均,_標準偏差,_偏差値) :- _偏差値 is 10 * (_標本値 - _算術平均) / _標準偏差 + 50. 偏差値(_標本ならび,_偏差値ならび) :- 平均値(_標本ならび,_平均値), 標準偏差(_標本ならび,_標準偏差), findall(_偏差値,( member(_値,_標本ならび), 偏差値(_値,_平均値,_標準偏差,_偏差値)), _偏差値ならび). 標準偏差(_標本ならび,V) :- length(_標本ならび,N), 平均値(_標本ならび,M), 標準偏差(_標本ならび,N,M,0.0,V). 標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!. 標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 標準偏差(R,N,M,S2,V). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/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人の得点ならび). 平均点を出力する(_五人の得点ならび) :- 平均点を戻す(_五人の得点ならび,_平均点), writef('平均点 = %t 人\n',[_平均点]). 平均点を戻す(_五人の得点ならび,_平均点) :- sum(_五人の得点ならび,_合計点), _平均点 is _合計点 / 5. 合格者数を出力する(_5人の得点ならび) :- 合格者数を戻す(_5人の得点ならび,_合格者数), writef('合格者数 = %t 人\n',[_合格者数]). '5人の得点(10点満点)を受け取ると'(_5人の得点ならび) :- length(_5人の得点ならび,5), findall(_得点,( append(L0,[_|_],_5人の得点ならび), 得点を受け取る(_得点)), _5人の得点ならび). 得点を受け取る(_得点) :- get_line(Line), '診断: 得点を受け取る'(Line,_得点),!. 得点を受け取る(_得点) :- 得点を受け取る(_得点). '診断: 得点を受け取る'(Line,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), member(_得点,[0,1,2,3,4,5,6,7,8,9,10]),!. '診断: 得点を受け取る'(Line,_得点) :- writef('入力された %t からは適切な得点が得られません。再入力をお願いします。\n',[Line]), fail. 合格者数を戻す(_5人の得点ならび,_合格者数) :- findall(_,( member(_得点,_5人の得点ならび), _得点 >= 6), L), length(L,_合格者数). % 以下のサイトは # 出典:: 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/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). % 以下のサイトは ?- '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/850 # # 3角形の3辺の長さがあたえられたとき、 # 正三角形、2等辺三角形、直角三角形か調べるプログラムをつくりなさい # ってな問題がでたことあるんだけど・・・ # 結構むずいよね。 # # '3角形の3辺の長さがあたえられたとき、正三角形、2等辺三角形、直角三角形か調べる'(_辺_1,_辺_2,_辺_3,_診断) :- 正三角形か調べる(_辺_1,_辺_2,_辺_3,_), 2等辺三角形か調べる(_辺_1,_辺_2,_辺_3,_2等辺三角形診断), 直角三角形か調べる(_辺_1,_辺_2,_辺_3,_直角三角形診断), 診断を編集する(_直角三角形診断,_2等辺三角形診断,_診断). 正三角形か調べる(_辺_1,_辺_2,_辺_3,_) :- 正三角形は2等辺三角形に属するからそちらで診断する. 正三角形は2等辺三角形に属するからそちらで診断する. '2等辺三角形か調べる'(_辺,_辺,_辺,'正') :- !. '2等辺三角形か調べる'(_辺,_辺,_,'2等辺') :- !. '2等辺三角形か調べる'(_,_辺,_辺,'2等辺') :- !. '2等辺三角形か調べる'(_辺,_,_辺,'2等辺') :- !. '2等辺三角形か調べる'(_,_,_,''). 直角三角形か調べる(_辺_1,_辺_2,_辺_3,直角) :- select(_長辺,[_辺_1,_辺_2,_辺_3],[_短辺_1,_短辺_2]), _長辺 * _長辺 =:= _短辺_1 * _短辺_1 + _短辺_2 * _短辺_2,!. 直角三角形か調べる(_,_,_,''). 診断を編集する('','','正三角形、2等辺三角形、直角三角形の何れでもない') :- !. 診断を編集する(_直角三角形診断,_2等辺三角形診断,_診断) :- atomic_list_concat([_直角三角形診断,_2等辺三角形診断,'三角形'],_診断). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/850 # # 3角形の3辺の長さがあたえられたとき、 # 正三角形、2等辺三角形、直角三角形か調べるプログラムをつくりなさい # ってな問題がでたことあるんだけど・・・ # 結構むずいよね。 # # '3角形の3辺の長さがあたえられたとき、正三角形、2等辺三角形、直角三角形か調べる'(_辺_1,_辺_2,_辺_3,_診断) :- 正三角形か(_辺_1,_辺_2,_辺_3,_), 2等辺三角形か(_辺_1,_辺_2,_辺_3,_2等辺三角形診断), 直角三角形か(_辺_1,_辺_2,_辺_3,_直角三角形診断), 調べる(_直角三角形診断,_2等辺三角形診断,_診断). 正三角形か(_辺_1,_辺_2,_辺_3,_) :- 正三角形は2等辺三角形に属するからそちらで診断する. 正三角形は2等辺三角形に属するからそちらで診断する. '2等辺三角形か'(_辺,_辺,_辺,'正') :- !. '2等辺三角形か'(_辺,_辺,_,'2等辺') :- !. '2等辺三角形か'(_,_辺,_辺,'2等辺') :- !. '2等辺三角形か'(_辺,_,_辺,'2等辺') :- !. '2等辺三角形か'(_,_,_,''). 直角三角形か(_辺_1,_辺_2,_辺_3,直角) :- select(_長辺,[_辺_1,_辺_2,_辺_3],[_短辺_1,_短辺_2]), _長辺 * _長辺 =:= _短辺_1 * _短辺_1 + _短辺_2 * _短辺_2,!. 直角三角形か(_,_,_,''). 調べる('','','正三角形、2等辺三角形、直角三角形の何れでもない') :- !. 調べる(_直角三角形診断,_2等辺三角形診断,_診断) :- atomic_list_concat([_直角三角形診断,_2等辺三角形診断,'三角形'],_診断). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/850 # # 3角形の3辺の長さがあたえられたとき、 # 正三角形、2等辺三角形、直角三角形か調べるプログラムをつくりなさい # ってな問題がでたことあるんだけど・・・ # 結構むずいよね。 # # '3角形の3辺の長さがあたえられたとき、正三角形、2等辺三角形、直角三角形か調べる'(_辺_1,_辺_2,_辺_3,_診断) :- 正三角形か調べる(_辺_1,_辺_2,_辺_3,_正三角形診断), 直角三角形か調べる(_辺_1,_辺_2,_辺_3,_直角三角形診断), '2等辺三角形か調べる'(_辺_1,_辺_2,_辺_3,_2等辺三角形診断), 診断を編集する(_正三角形診断,_直角三角形診断,_2等辺三角形診断,_診断). 正三角形か調べる(_辺,_辺,_辺,正) :- !. 正三角形か調べる(_,_,''). '2等辺三角形か調べる'(_辺,_辺,_,'2等辺') :- !. '2等辺三角形か調べる'(_,_辺,_辺,'2等辺') :- !. '2等辺三角形か調べる'(_辺,_,_辺,'2等辺') :- !. '2等辺三角形か調べる'(_,_,_,''). 直角三角形か調べる(_辺_1,_辺_2,_辺_3,直角) :- select(_長辺,[_辺_1,_辺_2,_辺_3],[_短辺_1,_短辺_2]), _長辺 * _長辺 =:= _短辺_1 * _短辺_1 + _短辺_2 * _短辺_2,!. 直角三角形か調べる(_,_,_,''). 診断を編集する('','','','正三角形、2等辺三角形,直角三角形の何れでもない') :- !. 診断を編集する(正,_,_,正三角形) :- !. 診断を編集する(_,_直角三角形診断,_2等辺三角形診断,_診断) :- atomic_list_concat([_直角三角形診断,_2等辺三角形診断,'三角形'],_診断),!. % % 一つ問題なのは、「正三角形は直角三角形にはならない」という事を分かって % しまっている定義だということだ。課題のどこを見てもそんな記述はない。 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/850 # # 3角形の3辺の長さがあたえられたとき、 # 正三角形、2等辺三角形、直角三角形か調べるプログラムをつくりなさい # ってな問題がでたことあるんだけど・・・ # 結構むずいよね。 # # '3角形の3辺の長さがあたえられたとき、正三角形、2等辺三角形、直角三角形か調べる'(_辺_1,_辺_2,_辺_3,_診断) :- 正三角形か(_辺_1,_辺_2,_辺_3,_正三角形診断), 直角三角形か(_辺_1,_辺_2,_辺_3,_直角三角形診断), '2等辺三角形か'(_辺_1,_辺_2,_辺_3,_2等辺三角形診断), 調べる(_正三角形診断,_直角三角形診断,_2等辺三角形診断,_診断). 正三角形か(_辺,_辺,_辺,正) :- !. 正三角形か(_,_,''). '2等辺三角形か'(_辺,_辺,_,'2等辺') :- !. '2等辺三角形か'(_,_辺,_辺,'2等辺') :- !. '2等辺三角形か'(_辺,_,_辺,'2等辺') :- !. '2等辺三角形か'(_,_,_,''). 直角三角形か(_辺_1,_辺_2,_辺_3,直角) :- select(_長辺,[_辺_1,_辺_2,_辺_3],[_短辺_1,_短辺_2]), _長辺 * _長辺 =:= _短辺_1 * _短辺_1 + _短辺_2 * _短辺_2,!. 直角三角形か(_,_,_,''). 調べる('','','','正三角形、2等辺三角形,直角三角形の何れでもない') :- !. 調べる(正,_,_,正三角形) :- !. 調べる(_,_直角三角形診断,_2等辺三角形診断,_診断) :- atomic_list_concat([_直角三角形診断,_2等辺三角形診断,'三角形'],_診断),!. % % 一つ問題なのは、「正三角形は直角三角形にはならない」という事を分かって % しまっている定義だということだ。課題のどこを見てもそんな記述はない。 % % 以下のサイトは # 出典:: 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/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水素原子量=%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/662 # # [2]ある病院の健康診断の受診料は、20歳未満および65歳以上は1000円、それ以外は1500円である。 # ただし、年齢が5の倍数の場合は500円の血液検査が追加される。 # また、40歳以上60歳未満は300円の腹囲測定が追加される。 # 年齢を入力すると受診料を表示するプログラムを作成せよ。 # 入力される数値として非負整数値に対応すること。 # [3.1]os windows7/vista # [3.3]c/c++ # [4]期限:2012年5月28 # お願いします。 # ' ある病院の健康診断の受診料は、20歳未満および65歳以上は1000円、それ以外は1500円である。ただし、年齢が5の倍数の場合は500円の血液検査が追加される。また、40歳以上60歳未満は300円の腹囲測定が追加される。年齢を入力すると受診料を表示するプログラムを作成せよ。入力される数値として非負整数値に対応すること。' :- 年齢を入力する(_年齢), 'ある病院の健康診断の受診料は、20歳未満および65歳以上は1000円、それ以外は1500円である。'(_年齢,_健康保険の受診料), 'ただし、年齢が5の倍数の場合は500円の血液検査が追加される。'(_年齢,_健康保険の受診料,_血液検査料金,_健康保険の受診料_1), 'また、40歳以上60歳未満は300円の腹囲測定が追加される。'(_年齢,_健康保険の受診料_1,_腹囲測定料金,_健康保険の受診料_2), 受診料を表示する(_年齢,_健康保険の受診料,_血液検査料金,_腹囲測定料金,_健康保険の受診料_2). 年齢を入力する(_年齢) :- write('年齢を入力してください : '), get_integer(_年齢), integer(_年齢), _年齢 >= 0,!. 年齢を入力する(_年齢) :- 年齢を入力する(_年齢). 'ある病院の健康診断の受診料は、20歳未満および65歳以上は1000円、それ以外は1500円である。'(_年齢,_健康保険の受診料) :- '20歳未満および65歳以上'(_年齢), _健康保険の受診料 = 1000. 'ある病院の健康診断の受診料は、20歳未満および65歳以上は1000円、それ以外は1500円である。'(_年齢,_健康保険の受診料) :- それ以外は(_年齢), _健康保険の受診料 = 1500. '20歳未満および65歳以上'(_年齢) :- _年齢 < 20. '20歳未満および65歳以上'(_年齢) :- _年齢 >= 65. それ以外は(_年齢) :- \+('20歳未満および65歳以上'(_年齢)). 'ただし、年齢が5の倍数の場合は500円の血液検査が追加される。'(_年齢,_料金,_血液検査料金,_追加された料金) :- 年齢が5の倍数の場合は(_年齢), 血液検査料金(_血液検査料金), _追加された料金 is _料金 + _血液検査料金,!. 'ただし、年齢が5の倍数の場合は500円の血液検査が追加される。'(_年齢,_料金,0,_料金). 年齢が5の倍数の場合は(_年齢) :- 0 is _年齢 mod 5. 血液検査料金(500). 'また、40歳以上60歳未満は300円の腹囲測定が追加される。'(_年齢,_料金,_腹囲測定料金,_追加された料金) :- '40歳以上60歳未満'(_年齢), 腹囲測定料金(_腹囲測定料金), _追加された料金 is _料金 + _腹囲測定料金,!. 'また、40歳以上60歳未満は300円の腹囲測定が追加される。'(_年齢,_料金,0,_料金). '40歳以上60歳未満'(_年齢) :- _年齢 >= 40, _年齢 < 60. 腹囲測定料金(300). 受診料を表示する(_年齢,_健康保険の受診料,_血液検査料金,_腹囲測定料金,_健康保険の受診料_2) :- write('年齢は=%t歳,血液検査料金=%t円,腹囲測定料金=%t円,健康保険受診料は%t円です\n',[_年齢,_健康保険の受診料,_血液検査料金,_腹囲測定料金,_健康保険の受診料_2]). % 以下のサイトは # 出典:: 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/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. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/589 # # [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.先頭に追加、2.先頭を削除、9.終了:1 # 1 # 1.先頭に追加、2.先頭を削除、9.終了:1 # 2 1 # 1.先頭に追加、2.先頭を削除、9.終了:2 # 1 # 1.先頭に追加、2.先頭を削除、9.終了:2 # # 1.先頭に追加、2.先頭を削除、9.終了:2 # 削除するデータがありません # 1.先頭に追加、2.先頭を削除、9.終了:9 # リストの先頭にデータを追加(_データ,_リスト,[_データ|_リスト]). 先頭のデータを削除([_データ|_リスト],_取り除かれたデータ,_リスト). 先頭のデータを削除([],_,[]) :- write('データがありません。\n'). リストヘッドの初期化(_,[]). 実行(_現在のリスト,_実行後のリスト) :- メニューを表示, メニュー番号の入力と分岐(_現在のリスト,_メニュー番号,_実行後のリスト_1), リストの表示(_実行後のリスト_1), 実行の終了診断(_メニュー番号,_実行後のリスト_1,_実行後のリスト). 実行の終了診断(9,_実行後リスト_1,_実行後のリスト) :- !. 実行の終了診断(_,_実行後リスト_1,_実行後のリスト) :- 実行(_実行後リスト_1,_実行後のリスト). リストの表示(_リスト) :- length(_リスト,_リストの長さ), 表示パターンの生成(_リストの長さ,_表示パターン), writef(_表示パターン,_リスト), write('\n'). 表示パターンの生成(_リストの長さ,_表示パターン) :- length(L1,_リストの長さ), all(L1,'%t'), atomic_list_concat(L1,',',_表示パターン). メニューを表示 :- write('1.先頭に追加,2.先頭を削除,9.終了:'). メニュー番号の入力と分岐(_現在のリスト,_メニュー番号,_実行後のリスト) :- メニュー番号の入力(_メニュー番号), 分岐(_メニュー番号,_現在のリスト,_実行後のリスト). メニュー番号の入力(_メニュー番号) :- get_integer(_メニュー番号). 分岐(1,_現在のリスト,_実行後のリスト) :- 追加するデータを得る(_データ), リストの先頭にデータを追加(_データ,_現在のリスト,_実行後のリスト). 分岐(2,_現在のリスト,_実行後のリスト) :- 先頭のデータを削除(_現在のリスト,_,_実行後のリスト). 分岐(9,_リスト,_リスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/961 # # 【課題】ttp://www.dotup.org/uploda/www.dotup.org3000377.txt.html # 【形態】1. Javaアプリケーション(main()で開始) # 【GUI】4. 制限なし # 【期限】提出期限:5月21日 22時まで # 【Ver】java version "1.7.0_03" # 【 補足 】Java初心者なので教えていただけると幸いです。 # # Janken.java # # switch構文を使用して、じゃんけんの勝敗を決めるプログラムを作る。 # グー、チョキ、パーを、それぞれchar型の値'G' 'C' 'P'で表す。 # char型の変数 p1 と p2 にキーボードからG,C,Pのいずれかを入力し代入する。 # 結果の表示はどちらがどちらに勝ったか、また引き分けか、表示する。 # (重要) # 条件演算子を用いて、Janken.javaのswitch文をできるだけ少なくでお願いします。 # じゃんけんの勝敗を決める :- 'キーボードからG,C,Pのいずれかを入力する'(_P1,_P2), '結果の表示はどちらがどちらに勝ったか、また引き分けか、表示する'(_P1,_P2). 'キーボードからG,C,Pのいずれかを入力する'(_P1,_P2) :- ジャンケンの入力(_P1), ジャンケンの入力(_P2). 'ジャンケンの入力'(_P1) :- write('P1? '), get_char(_P1), 'ジャンケンの入力診断'(_P1),!. 'ジャンケンの入力'(_P1) :- 'ジャンケンの入力'(_P1). 'ジャンケンの入力診断'('G'). 'ジャンケンの入力診断'('C'). 'ジャンケンの入力診断'('P'). '結果の表示はどちらがどちらに勝ったか、また引き分けか、表示する'(_P1,_P2) :- '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_P1,_P2,_結果), writef('%t\n',[_結果]). '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_P,_P,'引き分けです') :- !. '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_P1,_P2,'P1の勝ちです'). append(_,[_P1,_P2|_],['G','C','P','G']),!. '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_,_,'P2の勝ちです'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/961 # # 【課題】ttp://www.dotup.org/uploda/www.dotup.org3000377.txt.html # 【形態】1. Javaアプリケーション(main()で開始) # 【GUI】4. 制限なし # 【期限】提出期限:5月21日 22時まで # 【Ver】java version "1.7.0_03" # 【 補足 】Java初心者なので教えていただけると幸いです。 # # Janken.java # # switch構文を使用して、じゃんけんの勝敗を決めるプログラムを作る。 # グー、チョキ、パーを、それぞれchar型の値'G' 'C' 'P'で表す。 # char型の変数 p1 と p2 にキーボードからG,C,Pのいずれかを入力し代入する。 # 結果の表示はどちらがどちらに勝ったか、また引き分けか、表示する。 # (重要) # 条件演算子を用いて、Janken.javaのswitch文をできるだけ少なくでお願いします。 # じゃんけんの勝敗を決める :- 'キーボードからG,C,Pのいずれかを入力する'(_P1,_P2), '結果の表示はどちらがどちらに勝ったか、また引き分けか、表示する'(_P1,_P2). 'キーボードからG,C,Pのいずれかを入力する'(_P1,_P2) :- ジャンケンの入力(_P1), ジャンケンの入力(_P2). 'ジャンケンの入力'(_P1) :- write('P1? '), get_char(_P1), 'ジャンケンの入力診断'(_P1),!. 'ジャンケンの入力'(_P1) :- 'ジャンケンの入力'(_P1). 'ジャンケンの入力診断'('G'). 'ジャンケンの入力診断'('C'). 'ジャンケンの入力診断'('P'). '結果の表示はどちらがどちらに勝ったか、また引き分けか、表示する'(_P1,_P2) :- '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_P1,_P2,_結果), writef('%t\n',[_結果]). '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_P,_P,'引き分けです') :- !. '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_P1,_P2,'P1の勝ちです'). append(_,[_P1,_P2|_],['G','C','P','G']),!. '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_,_,'P2の勝ちです'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/501 # # ../test/read.cgi/tech/1335517816/496 ../test/read.cgi/tech/1335517816/498 # ありがとうございます。 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、 # リターンキーを押すと数字のみ#に置き換えられた文字列が出力されるプログラムを作成しなさい。 # 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、リターンキーを押すと数字のみ#に置き換えられた文字列が出力される' :- 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列), '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列), 出力される(_置き換えられた文字列). 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列) :- length(Ln,48), get_char(_文字), 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(Ln,_文字,_文字ならび), atom_chars(_文字列,_文字ならび). 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_,'\n',[]) :- !. 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'([_],_文字,[_文字]) :- !. 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'([_|Ln],_文字,[_文字|R]) :- 'アルファベット、数字、空白が混在した文字'(_文字_2), 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(Ln,_文字_2,R). 'アルファベット、数字、空白が混在した文字'(_文字) :- get_char(_文字), 'アルファベット、数字、空白が混在した文字診断'(_文字),!. 'アルファベット、数字、空白が混在した文字'(_文字) :- 'アルファベット、数字、空白が混在した文字'(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- アルファベット(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 数字(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 空白(_文字). アルファベット(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. アルファベット(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 数字(_文字) :- member(_文字,['0','1','2','3','4','5','6','7','8','9']). 空白(' '). '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列) :- findall(_数字のみ置き換えられた文字,( sub_atom(_文字列,_,1,_,_文字), '数字のみ#の置き換える'(_文字,_数字のみ置き換えられた文字)), L), atomic_list_concat(L,_置き換えられた文字列). '数字のみ#の置き換える'(_文字,'#') :- 数字(_文字),!. '数字のみ#の置き換える'(_文字,_文字). 出力される(_置き換えられた文字列) :- writef('置き換えられた文字列 = "%t"\n',[_置き換えられた文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/501 # # ../test/read.cgi/tech/1335517816/496 ../test/read.cgi/tech/1335517816/498 # ありがとうございます。 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、 # リターンキーを押すと数字のみ#に置き換えられた文字列が出力されるプログラムを作成しなさい。 # 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、リターンキーを押すと数字のみ#に置き換えられた文字列が出力される' :- 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列), '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列), 出力される(_置き換えられた文字列). 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列) :- length(L,48), findall(_文字,( append(L0,[_|_],L), 'アルファベット、数字、空白が混在した文字'(_文字), ( _文字='\n',!,fail; true)), _文字ならび), atom_chars(_文字列,_文字ならび). 'アルファベット、数字、空白が混在した文字'(_文字) :- get_char(_文字), 'アルファベット、数字、空白が混在した文字診断'(_文字),!. 'アルファベット、数字、空白が混在した文字'(_文字) :- 'アルファベット、数字、空白が混在した文字'(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- アルファベット(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 数字(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 空白(_文字). アルファベット(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. アルファベット(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 数字(_文字) :- member(_文字,['0','1','2','3','4','5','6','7','8','9']). 空白(' '). '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列) :- findall(_数字のみ置き換えられた文字,( sub_atom(_文字列,_,1,_,_文字), '数字のみ#の置き換える'(_文字,_数字のみ置き換えられた文字)), L), atomic_list_concat(L,_置き換えられた文字列). '数字のみ#の置き換える'(_文字,'#') :- 数字(_文字),!. '数字のみ#の置き換える'(_文字,_文字). 出力される(_置き換えられた文字列) :- 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/390 # # [1] 授業単元: 初級プログラミング演習 # [2] 問題文:反復処理 # 異なる整数2つ、a,bを入力。実行例に記すように aからbまで順に数字を表示するプログラムを作成しなさい # 【実行例】 # 整数を2つ入力してください # a=22, b=28 # 22 # 23 # 24 # 25 # 26 # 27 # 28 # # '異なる整数2つ、a,bを入力。aからbまで順に数字を表示する' :- '異なる整数2つ、a,bを入力'(_a,_b), aからbまで順に数字を\表示する(_a,_b). '異なる整数2つ、a,bを入力'(_a,_b) :- 整数aの入力(_a), 整数bの入力(_a,_b). 整数aの入力(_a) :- write('整数aを入力してください : '), get_integer(_a),!. 整数bの入力(_a,_b) :- writef('整数aとは異なる整数bを入力してください : '), get_integer(_b), 整数b入力診断(_a,_b),!. 整数bの入力(_a,_b) :- 整数bの入力(_a,_b). 整数b入力診断(_a,_b) :- \+(_a = _b). aからbまで順に数字を表示する(_a,_b) :- for(_a,N,_b), writef('%t\n',[N]), N = _b. % for/3 % 以下のサイトは # 出典:: 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/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/309 # # 1から5の間の自然数を10個入力する。このとき入力された数の個数を棒グラフで次のように表示させる。 # 例: 1の入力が4回、2では2回、3では3回、4では0回、5では1回の場合 # * # * * # * * * # * * * * # 1 2 3 4 5 # という感じです。全くできないので助けてください # '1から5の間の自然数を10個入力する。このとき入力された数の個数を棒グラフで次のように表示させる' :- '1から5の間の自然数を10個入力する'(L), 横方向棒グラフを作る(L,LL1), 転置(LL1,LL2), 棒グラフ表示(LL2). '1から5の間の自然数を10個入力する'(L) :- length(L,10), findall(N,( append(L0,[N|_],L), '1から5の間の自然数を'(L0,N)), L). '1から5の間の自然数を'(L0,_自然数分の星ならび) :- length([_|L0],M), concat_atom([M,'1から5の間の自然数([',M,'/10] : '],_催促文), '1から5の間の自然数を'(_催促文,M,N),!. '1から5の間の自然数を'(_催促文,M,N) :- writef('%t',[_催促文]), get_line(Line), '1から5の間の自然数入力診断'(Line,N),!. '1から5の間の自然数を'(_催促文,M,N) :- '1から5の間の自然数を'(_催促文,M,N). '1から5の間の自然数入力診断'(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 1, N =< 5,!. '1から5の間の自然数入力診断'(Line,N) :- writef('入力された%tからは1から5の間の自然数が得られません\n',[Line]), fail. 横方向棒グラフを作る([],[]). 横方向棒グラフを作る([N|R1],[L|R2]) :- length(L,5), length(L1,N), all(L1,'*'), append(L0,L1,L), all(L0,' '), 横方向棒グラフを作る(R1,R2). 棒グラフ表示(LL) :- append(_,[L|R],LL), concat_atom(L,' ',_行表示文字列), writef('%t\n',[_行表示文字列]), R = [], write('1 2 3 4 5\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/306 # # [1] 授業単元:C # [2] n個の数の総和 # n個の数の総和を求める。総和が限界数を超えた時には計算を打ち切り、その時の総和を表示する。 # 総和の限界(1000). 'n個の数の総和を求め表示する。総和が限界数を超えた時には計算を打ち切り、その時の総和を表示する' :- 'n個の数'(_n,L), 総和の限界(_総和の限界), 総和を求める。総和が限界数を超えた時には計算を打ち切る'(L,_総和の限界,_加算対象数値ならび,_総和), 総和を表示する(_加算対象数値ならび,_総和,_総和の限界). 'n個の数'(_n,L) :- length(L,_n), findall(N,( m個目の数(L,N)), L). m個目の数(L,N) :- append(L0,[N|_],L), length([_|L0],_m個目), swritef(_催促,'%t/%t個目の数字 : ',[_m個目,_n]), 催促付き整数入力(_催促,N). 催促付き整数入力(_催促,N) :- writef('%t : ',[_催促]), get_line(Line), 整数入力検査(Line,N),!. 催促付き整数入力(_催促,N) :- get_integer(_催促,N). 整数入力検査(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数入力検査(Line,N) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '総和を求める。総和が限界数を超えた時には計算を打ち切る'(L,_総和の限界,_加算対象数値ならび,_総和) :- '総和を求める。総和が限界数を超えた時には計算を打ち切る'(L,_総和の限界,_加算対象数値ならび,0,_総和). '総和を求める。総和が限界数を超えた時には計算を打ち切る'([],_総和の限界,[],_総和,_総和). '総和を求める。総和が限界数を超えた時には計算を打ち切る'(_,_総和の限界,[],_総和,_総和) :- _総和 > _総和の限界,!. '総和を求める。総和が限界数を超えた時には計算を打ち切る'([N|R1],_総和の限界,[N|R2],_総和1,_総和) :- _総和2 is _総和1 + N, '総和を求める。総和が限界数を超えた時には計算を打ち切る'(R1,_総和の限界,R2,_総和2,_総和). 総和を表示する(_加算対象数値ならび,_総和,_総和の限界) :- _総和 > _総和の限界, concat_atom(_加算対象数値ならび,'+',_加算対象項文字列), writef('(総和の限界=%t) %t=%t\n',[_総和の限界,_加算対象項文字列,_総和]),!. 総和を表示する(_加算対象数値ならび,_総和,_総和の限界) :- concat_atom(_加算対象数値ならび,'+',_加算対象項文字列), writef('%t=%t\n',[_加算対象項文字列_総和]),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/167 # # [1] 情報科学入門 # [2] (1)1から1000までの間に、3と7の倍数の値がいくつ含まれているのか求めるプログラムを書け。 #    (2)キーボードから西暦年を入力し、その年がサッカーワールドカップ開催年かどうかを判定するプログラムを作成せよ。 # 第一回ワールドカップ開催年(1930). 前回ワールドカップ開催年(2010). 'キーボードから西暦年を入力し、その年がサッカーワールドカップ開催年かどうかを判定する' :- 第一回ワールドカップ開催年(_第一回ワールドカップ開催年), 前回ワールドカップ開催年(_前回ワールドカップ開催年), キーボードから西暦年を入力し(_西暦), その年がサッカーワールドカップ開催年かどうかを判定する(_西暦,_第一回ワールドカップ開催年,_前回ワールとカップ開催年,_判定), writef('入力された %t年は%t。\n',[_西暦,_判定]). キーボードから西暦年を入力し(_西暦) :- write('西暦年を入力して下さい : '), get_line(Line), 西暦年入力検査(Line,_西暦年),!. キーボードから西暦年を入力し(_西暦) :- キーボードから西暦年を入力し(_西暦). 西暦年入力検査(Line,_西暦年) :- atom_to_term(Line,_西暦年,_), integer(_西暦年),!. 西暦年入力検査(Line,_西暦年) :- writef('入力された %t は整数でありません。整数を入力して下さい。\n',[Line]), fail. その年がサッカーワールドカップ開催年かどうかを判定する(_西暦,_第一回ワールドカップ開催年,_,第一回ワールドカップが開催されるより前です) :- _西暦 < _第一回ワールドカップ開催年,!. その年がサッカーワールドカップ開催年かどうかを判定する(_西暦,_第一回ワールドカップ開催年,_,開催年に当たりますがまだ開催されていません) :- _西暦 > _前回ワールドカップ開催年, 0 is (_西暦 - _第一回ワールドカップ開催年) mod 4,!. その年がサッカーワールドカップ開催年かどうかを判定する(_西暦,_第一回ワールドカップ開催年,_前回ワールドカップ開催年,開催される予定のない年です) :- _西暦 > _前回ワールドカップ開催年, 0 is (_西暦 - _第一回ワールドカップ開催年) mod 4,!. その年がサッカーワールドカップ開催年かどうかを判定する(_西暦,_第一回ワールドカップ開催年,_前回ワールドカップ開催年,開催されました) :- _西暦 =< _前回ワールドカップ開催年, 0 is (_西暦 - _第一回ワールドカップ開催年) mod 4,!. その年がサッカーワールドカップ開催年かどうかを判定する(_西暦,_第一回ワールドカップ開催年,_前回ワールドカップ開催年,開催されていません) :- _西暦 =< _前回ワールドカップ開催年, \+(0 is (_西暦 - _第一回ワールドカップ開催年) mod 4),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/151 # # [1] 授業単元:プログラミング演習 # [2]複数の人の名前と体重、身長を質問してBMI値を計算して、「名前、体重、身長、BMI値、判定結果(やせている、普通、肥満、等)」をファイルに保存しなさい。 # 人数は最初に質問して入力させること。 # 実行の結果作成されたファイルは、メモ帳などで開いて内容を確認すること。 # BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。 # 身長と体重は小数点以下まで扱えるものとする。 # # BMI値=体重(kg)/(身長(m))^2 # '複数の人の名前と体重、身長を質問してBMI値を計算して、「名前、体重、身長、BMI値、判定結果(やせている、普通、肥満、等)」をファイルに保存しなさい。 人数は最初に質問して入力させること。'(_保存ファイル名) :- 人数は質問して入力(_人数), '複数の人の名前と体重、身長を質問して'(_人数,_名前_身長_体重ならび), 'BMI値を計算して、「名前、体重、身長、BMI値、判定結果(やせている、普通、肥満、等)」をファイルに保存'(_保存ファイル名,_名前_身長_体重ならび). 人数は質問して入力(_人数) :- write('対象人数を入力して下さい : '), get_integer(_人数). '複数の人の名前と体重、身長を質問して'(_人数,_名前_身長_体重ならび) :- length(_名前_身長_体重ならび,_人数), findall([_名前,_身長,_体重],( '名前・身長・体重を得る'(_名前,_身長,_体重), append(_,[[_名前,_身長,_体重]|_],_名前_身長_体重ならび)), _名前_身長_体重ならび). '名前・身長・体重を得る'(_名前,_身長,_体重) :- 名前を得る(_名前), 身長を得る(_身長), 体重を得る(_体重). 名前を得る(_名前) :- write('名前を入力して下さい : '), get_line(_名前). 身長を得る(_身長) :- write('身長を入力して下さい : '), get_line(Line), 身長入力診断(Line,_身長),!. 身長を得る(_身長) :- 身長を得る(_身長). 身長入力診断(Line,_身長) :- atom_to_term(Line,_身長,_), number(_身長), _身長 > 0, _身長 =< 240.0,!. 身長入力診断(Line,_) :- writef('入力された %t からは適切な身長が得られませんでした。再入力をお願いします。\n',[Line]), fail. 体重を得る(_体重) :- write('体重を入力して下さい : '), get_line(Line), 体重入力診断(Line,_体重),!. 体重を得る(_体重) :- 体重を得る(_体重). 体重入力診断(Line,_体重) :- atom_to_term(Line,_体重,_), number(_体重), _体重 > 0, _体重 =< 250.0,!. 体重入力診断(Line,_体重) :- writef('入力された %t からは適切な体重が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'BMI値を計算して、「名前、体重、身長、BMI値、判定結果(やせている、普通、肥満、等)」をファイルに保存'(_保存ファイル名,_名前_身長_体重ならび) :- open(_保存ファイル名,write,Outstream), append(_,[[_名前,_身長,_体重]|R],_名前_身長_体重ならび), 'BMI値の計算判定'(_身長,_体重,_BMI値,_BMI値判定), writef(Outstream,'%t,%t,%t,%t,%t\n',[_名前,_身長,_体重,_BMI値,_BMI値判定]), R = [], close(Outstram). 'BMI値の計算判定'(_身長,_体重,_BMI値,_BMI値判定) :- 'BMI値の計算'(_身長,_体重,_BMI値), 'BMI値の判定'(_BMI値,_BMI値の判定). 'BMI値の計算'(_身長,_体重,_BMI値) :- _身長 > 3, _BMI値 is _体重 / ((_身長 / 100) ^ 2). 'BMI値の計算'(_身長,_体重,_BMI値) :- _身長 =< 3, _BMI値 is _体重 / (_身長 ^ 2). 'BMI値の判定'(_BMI値,_BMI値の判定) :- 'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,_BMI値の判定). 'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,やせています) :- 'BMI値が20未満なら'(_BMI値),!. 'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,普通です) :- 'BMI値が20〜24未満なら'(_BMI値),!. 'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,やや肥満です) :- 'BMI値が24〜26.5未満なら'(_BMI値),!. 'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,肥満です) :- 'BMI値が26.5以上なら'(_BMI値),!. 'BMI値が20未満なら'(_BMI値) :- _BMI値 < 20.0. 'BMI値が20〜24未満なら'(_BMI値) :- _BMI値 >= 20.0, _BMI値 < 24. 'BMI値が24〜26.5未満なら'(_BMI値) :- _BMI値 >= 24.0, _BMI値 < 26.5. 'BMI値が26.5以上なら'(_BMI値) :- _BMI値 >= 26.5. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/588 # # [1] プログラミング # [2] 営業キロを入力したら料金を表示するプログラムを作りなさい。なお、営業キロは小数点以下はすべて切り上げで計算されます。 #   営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。 # [3] Linux C言語 # [4] 期限:2012年1月25日 # [5] 構造体の使用は無し、運賃と距離は配列を使用する。 # # 一応途中まで作ってみましたが、dis[0]のときfare[0]の値は出ますがそれ以外が出ません。。。助けてください。 # # #include<stdio.h> # int main(void){ # int fare[100]; # int dis[100]; # int j; # float n; # # fare[0]=140; fare[1]=180; fare[2]=190; # fare[3]=230; fare[4]=320; fare[5]=400; # fare[6]=480; fare[7]=570; fare[8]=650; # fare[9]=710; fare[10]=820; fare[11]=950; # fare[12]=1110; fare[13]=1280; fare[14]=1450; # fare[15]=1620; fare[16]=1890; fare[17]=2210; # fare[18]=2520; fare[19]=2940; fare[20]=3260; # fare[21]=3570; fare[22]=3890; fare[23]=4310; # fare[24]=4620; fare[25]=4940; fare[26]=5250; # fare[27]=5460; fare[28]=5780; fare[29]=6090; # fare[30]=6300; fare[31]=6620; fare[32]=6830; # fare[33]=7140; fare[34]=7350; fare[35]=7670; # fare[36]=7980; fare[37]=8190; fare[38]=8510; # fare[39]=8720; fare[40]=9030; fare[41]=9350; # fare[42]=9560; fare[43]=9870; fare[44]=10190; # fare[45]=10500; fare[46]=10820; fare[47]=11030; # fare[48]=11340; fare[49]=11600; fare[50]=11970; # fare[51]=12290; fare[52]=12600; fare[53]=12810; # fare[54]=13130; fare[55]=13440; fare[56]=13760; # fare[57]=14070; fare[58]=14390; fare[59]=14600; # fare[60]=14910; # # dis[0]=3; dis[1]=6; dis[2]=10; # dis[3]=15; dis[4]=20; dis[5]=25; # dis[6]=30; dis[7]=35; dis[8]=40; # dis[9]=45; dis[10]=50; dis[11]=60; # dis[12]=70; dis[13]=80; dis[14]=90; # dis[15]=100; dis[16]=120; dis[17]=140; # dis[18]=160; dis[19]=180; dis[20]=200; # dis[21]=220; dis[22]=240; dis[24]=260; # dis[24]=280; dis[25]=300; dis[26]=320; # dis[27]=340; dis[28]=360; dis[29]=380; # dis[30]=400; dis[31]=420; dis[32]=440; # dis[33]=460; dis[34]=480; dis[35]=500; # dis[36]=520; dis[37]=540; dis[38]=560; # dis[39]=580; dis[40]=600; dis[41]=640; # dis[42]=680; dis[43]=720; dis[44]=760; # dis[45]=800; dis[46]=840; dis[47]=880; # dis[48]=920; dis[49]=960; dis[50]=1000; # dis[51]=1040; dis[52]=1080; dis[53]=1120; # dis[54]=1160; dis[55]=1200; dis[56]=1240; # dis[57]=1280; dis[58]=1320; dis[59]=1360; # dis[60]=1400; # 営業キロならび([3,6,10,15,20,25,30,35,40,45,50,60,70,80,90,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380,400,420,440,460,480,500,520,540,560,580,600,640,680,720,760,800,840,880,920,960,1000,1040,1080,1120,1160,1200,1240,1280,1320,1360,1400]). 料金ならび([140,180,190,230,320,400,480,570,650,710,820,950,1110,1280,1450,1620,1890,2210,2520,2940,3260,3570,3890,4310,4620,4940,5250,5460,5780,6090,6300,6620,6830,7140,7350,7670,7980,8190,8510,8720,9030,9350,9560,9870,10190,10500,10820,11030,11340,11600,11970,12290,12600,12810,13130,13440,13760,14070,14390,14600]). '営業キロを入力したら料金を表示するプログラムを作りなさい。 なお、営業キロは小数点以下はすべて切り上げで計算されます。営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。' :- 営業キロならびは昇順である(_営業キロならび), 料金ならびは昇順である(_料金ならび), 営業キロはキーボードからの入力とし(_営業キロ), 料金を表示する(_営業キロ,_営業キロならび,_料金ならび). 営業キロはキーボードからの入力とし(_営業キロ) :- write('営業キロを入力して下さい : '), get_line(Line), 営業キロ入力診断(Line,_営業キロ),!. 営業キロはキーボードからの入力とし(_営業キロ) :- 営業キロはキーボードからの入力とし(_営業キロ). 営業キロ入力診断(Line,_営業キロ) :- atom_to_term(Line,_営業キロ), integer(_営業キロ), _営業キロ > 0,!. 営業キロ入力診断(Line,_営業キロ) :- writef('入力された %t から適切な営業キロが得られませんでした。再入力をお願いしす。\n',[Line]), fail. 料金を表示する(_入力営業キロ,_営業キロならび,_料金ならび) :- 料金を計算する(_入力営業キロ,_営業キロならび,_料金ならび,_料金), writef('%t 円です。\n',[_料金]). 料金を計算する(_入力営業キロ,_営業キロならび,_料金ならび,14910) :- _入力営業キロ >= 1400,!. 料金を計算する(_入力営業キロ,[_営業キロ|_],[_料金|_],_料金) :- _営業キロ > _入力営業キロ,!. 料金を計算する(_入力営業キロ,[_|R1],[_|R2],_料金) :- 料金を計算する(_入力営業キロ,R1,R2,_料金). 営業キロならびは昇順である(_営業キロならび) :- 営業キロならび(_営業キロならび_1), 営業キロならびは昇順である(_営業キロならび_1,_営業キロならび). 営業キロならびは昇順である(_営業キロならび,_営業キロならび) :- 昇順検査(_営業キロならび),!. 営業キロならびは昇順である(_営業キロならび_1,_営業キロならび) :- 整列(_営業キロならび_1,_営業キロならび). 料金ならびは昇順である(_料金ならび) :- 料金ならびは昇順である(_料金ならび_1), 料金ならびは昇順である(_料金ならび_1,_料金ならび). 料金ならびは昇順である(_料金ならび,_料金ならび) :- 昇順検査(_料金ならび),!. 料金ならびは昇順である(_料金ならび_1,_料金ならび) :- 整列(_料金ならび_1,_料金ならび),!. 昇順検査([_]) :- !. 昇順検査([A,B|R]) :- B @>= A, 昇順検査([B|R]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/588 # # [1] プログラミング # [2] 営業キロを入力したら料金を表示するプログラムを作りなさい。なお、営業キロは小数点以下はすべて切り上げで計算されます。 #   営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。 # [3] Linux C言語 # [4] 期限:2012年1月25日 # [5] 構造体の使用は無し、運賃と距離は配列を使用する。 # # 一応途中まで作ってみましたが、dis[0]のときfare[0]の値は出ますがそれ以外が出ません。。。助けてください。 # # #include<stdio.h> # int main(void){ # int fare[100]; # int dis[100]; # int j; # float n; # # fare[0]=140; fare[1]=180; fare[2]=190; # fare[3]=230; fare[4]=320; fare[5]=400; # fare[6]=480; fare[7]=570; fare[8]=650; # fare[9]=710; fare[10]=820; fare[11]=950; # fare[12]=1110; fare[13]=1280; fare[14]=1450; # fare[15]=1620; fare[16]=1890; fare[17]=2210; # fare[18]=2520; fare[19]=2940; fare[20]=3260; # fare[21]=3570; fare[22]=3890; fare[23]=4310; # fare[24]=4620; fare[25]=4940; fare[26]=5250; # fare[27]=5460; fare[28]=5780; fare[29]=6090; # fare[30]=6300; fare[31]=6620; fare[32]=6830; # fare[33]=7140; fare[34]=7350; fare[35]=7670; # fare[36]=7980; fare[37]=8190; fare[38]=8510; # fare[39]=8720; fare[40]=9030; fare[41]=9350; # fare[42]=9560; fare[43]=9870; fare[44]=10190; # fare[45]=10500; fare[46]=10820; fare[47]=11030; # fare[48]=11340; fare[49]=11600; fare[50]=11970; # fare[51]=12290; fare[52]=12600; fare[53]=12810; # fare[54]=13130; fare[55]=13440; fare[56]=13760; # fare[57]=14070; fare[58]=14390; fare[59]=14600; # fare[60]=14910; # # dis[0]=3; dis[1]=6; dis[2]=10; # dis[3]=15; dis[4]=20; dis[5]=25; # dis[6]=30; dis[7]=35; dis[8]=40; # dis[9]=45; dis[10]=50; dis[11]=60; # dis[12]=70; dis[13]=80; dis[14]=90; # dis[15]=100; dis[16]=120; dis[17]=140; # dis[18]=160; dis[19]=180; dis[20]=200; # dis[21]=220; dis[22]=240; dis[24]=260; # dis[24]=280; dis[25]=300; dis[26]=320; # dis[27]=340; dis[28]=360; dis[29]=380; # dis[30]=400; dis[31]=420; dis[32]=440; # dis[33]=460; dis[34]=480; dis[35]=500; # dis[36]=520; dis[37]=540; dis[38]=560; # dis[39]=580; dis[40]=600; dis[41]=640; # dis[42]=680; dis[43]=720; dis[44]=760; # dis[45]=800; dis[46]=840; dis[47]=880; # dis[48]=920; dis[49]=960; dis[50]=1000; # dis[51]=1040; dis[52]=1080; dis[53]=1120; # dis[54]=1160; dis[55]=1200; dis[56]=1240; # dis[57]=1280; dis[58]=1320; dis[59]=1360; # dis[60]=1400; # 料金表([[3,140],[6,180],[10,190],[15,230],[20,320],[25,400],[30,480],[35,570],[40,650],[45,710],[50,820],[60,950],[70,1110],[80,1280],[90,1450],[100,1620],[120,1890],[140,2210],[160,2520],[180,2940],[200,3260],[220,3570],[240,3890],[260,4310],[280,4620],[300,4940],[320,5250],[340,5460],[360,5780],[380,6090],[400,6300],[420,6620],[440,6830],[460,7140],[480,7350],[500,7670],[520,7980],[540,8190],[560,8510],[580,8720],[600,9030],[640,9350],[680,9560],[720,9870],[760,10190],[800,10500],[840,10820],[880,11030],[920,11340],[960,11600],[1000,11970],[1040,12290],[1080,12600],[1120,12810],[1160,13130],[1200,13440],[1240,13760],[1280,14070],[1320,14390],[1360,14600]]). '営業キロを入力したら料金を表示するプログラムを作りなさい。 なお、営業キロは小数点以下はすべて切り上げで計算されます。営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。' :- 料金表は昇順にならんでいる(_料金表), 営業キロはキーボードからの入力とし(_営業キロ), 料金を表示する'(_営業キロ,_料金表). 料金表は昇順にならんでいる(_料金表) :- 料金表(_料金表), 昇順検査(_料金表),!. 料金表は昇順にならんでいる(_料金表) :- 料金表(_料金表_1), 整列(_料金表_1,_料金表). 営業キロはキーボードからの入力とし(_営業キロ) :- write('営業キロを入力して下さい : '), get_line(Line), 営業キロ入力診断(Line,_営業キロ),!. 営業キロはキーボードからの入力とし(_営業キロ) :- '営業キロはキーボードからの入力とし'(_営業キロ). 営業キロ入力診断(Line,_営業キロ) :- atom_to_term(Line,_営業キロ), integer(_営業キロ), _営業キロ > 0,!. 営業キロ入力診断(Line,_営業キロ) :- writef('入力された %t から適切な営業キロが得られませんでした。再入力をお願いしす。\n',[Line]), fail. 料金を表示する(_営業キロ,_料金表) :- 料金を計算する(_入力営業キロ,_料金表,_料金), writef('%t 円です。\n',[_料金]). 料金を計算する(_入力営業キロ,_,14910) :- _入力営業キロ >= 1400,!. 料金を計算する(_入力営業キロ,[[_営業キロ,_料金]|_],_料金) :- _営業キロ > _入力営業キロ,!. 料金を計算する(_入力営業キロ,[_|R],_料金) :- 料金を計算する(_入力営業キロ,R,_料金). 昇順検査([_]) :- !. 昇順検査([A,B|R]) :- B @>= A, 昇順検査([B|R]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/588 # # [1] プログラミング # [2] 営業キロを入力したら料金を表示するプログラムを作りなさい。なお、営業キロは小数点以下はすべて切り上げで計算されます。 #   営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。 # [3] Linux C言語 # [4] 期限:2012年1月25日 # [5] 構造体の使用は無し、運賃と距離は配列を使用する。 # # 一応途中まで作ってみましたが、dis[0]のときfare[0]の値は出ますがそれ以外が出ません。。。助けてください。 # # #include<stdio.h> # int main(void){ # int fare[100]; # int dis[100]; # int j; # float n; # # fare[0]=140; fare[1]=180; fare[2]=190; # fare[3]=230; fare[4]=320; fare[5]=400; # fare[6]=480; fare[7]=570; fare[8]=650; # fare[9]=710; fare[10]=820; fare[11]=950; # fare[12]=1110; fare[13]=1280; fare[14]=1450; # fare[15]=1620; fare[16]=1890; fare[17]=2210; # fare[18]=2520; fare[19]=2940; fare[20]=3260; # fare[21]=3570; fare[22]=3890; fare[23]=4310; # fare[24]=4620; fare[25]=4940; fare[26]=5250; # fare[27]=5460; fare[28]=5780; fare[29]=6090; # fare[30]=6300; fare[31]=6620; fare[32]=6830; # fare[33]=7140; fare[34]=7350; fare[35]=7670; # fare[36]=7980; fare[37]=8190; fare[38]=8510; # fare[39]=8720; fare[40]=9030; fare[41]=9350; # fare[42]=9560; fare[43]=9870; fare[44]=10190; # fare[45]=10500; fare[46]=10820; fare[47]=11030; # fare[48]=11340; fare[49]=11600; fare[50]=11970; # fare[51]=12290; fare[52]=12600; fare[53]=12810; # fare[54]=13130; fare[55]=13440; fare[56]=13760; # fare[57]=14070; fare[58]=14390; fare[59]=14600; # fare[60]=14910; # # dis[0]=3; dis[1]=6; dis[2]=10; # dis[3]=15; dis[4]=20; dis[5]=25; # dis[6]=30; dis[7]=35; dis[8]=40; # dis[9]=45; dis[10]=50; dis[11]=60; # dis[12]=70; dis[13]=80; dis[14]=90; # dis[15]=100; dis[16]=120; dis[17]=140; # dis[18]=160; dis[19]=180; dis[20]=200; # dis[21]=220; dis[22]=240; dis[24]=260; # dis[24]=280; dis[25]=300; dis[26]=320; # dis[27]=340; dis[28]=360; dis[29]=380; # dis[30]=400; dis[31]=420; dis[32]=440; # dis[33]=460; dis[34]=480; dis[35]=500; # dis[36]=520; dis[37]=540; dis[38]=560; # dis[39]=580; dis[40]=600; dis[41]=640; # dis[42]=680; dis[43]=720; dis[44]=760; # dis[45]=800; dis[46]=840; dis[47]=880; # dis[48]=920; dis[49]=960; dis[50]=1000; # dis[51]=1040; dis[52]=1080; dis[53]=1120; # dis[54]=1160; dis[55]=1200; dis[56]=1240; # dis[57]=1280; dis[58]=1320; dis[59]=1360; # dis[60]=1400; # 料金(3,140). 料金(6,180). 料金(10,190). 料金(15,230). 料金(20,320). 料金(25,400). 料金(30,480). 料金(35,570). 料金(40,650). 料金(45,710). 料金(50,820). 料金(60,950). 料金(70,1110). 料金(80,1280). 料金(90,1450). 料金(100,1620). 料金(120,1890). 料金(140,2210). 料金(160,2520). 料金(180,2940). 料金(200,3260). 料金(220,3570). 料金(240,3890). 料金(260,4310). 料金(280,4620). 料金(300,4940). 料金(320,5250). 料金(340,5460). 料金(360,5780). 料金(380,6090). 料金(400,6300). 料金(420,6620). 料金(440,6830). 料金(460,7140). 料金(480,7350). 料金(500,7670). 料金(520,7980). 料金(540,8190). 料金(560,8510). 料金(580,8720). 料金(600,9030). 料金(640,9350). 料金(680,9560). 料金(720,9870). 料金(760,10190). 料金(800,10500). 料金(840,10820). 料金(880,11030). 料金(920,11340). 料金(960,11600). 料金(1000,11970). 料金(1040,12290). 料金(1080,12600). 料金(1120,12810). 料金(1160,13130). 料金(1200,13440). 料金(1240,13760). 料金(1280,14070). 料金(1320,14390). 料金(1360,14600). '営業キロを入力したら料金を表示するプログラムを作りなさい。 なお、営業キロは小数点以下はすべて切り上げで計算されます。営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。' :- '営業キロはキーボードからの入力とし'(_営業キロ), '料金を表示する'(_営業キロ,_料金). '営業キロはキーボードからの入力とし'(_営業キロ) :- write('営業キロを入力して下さい : '), get_line(Line), 営業キロ入力診断(Line,_営業キロ),!. '営業キロはキーボードからの入力とし'(_営業キロ) :- '営業キロはキーボードからの入力とし'(_営業キロ). 営業キロ入力診断(Line,_営業キロ) :- atom_to_term(Line,_営業キロ), integer(_営業キロ), _営業キロ > 0,!. 営業キロ入力診断(Line,_営業キロ) :- writef('入力された %t から適切な営業キロが得られませんでした。再入力をお願いしす。\n',[Line]), fail. 料金を表示する(_営業キロ,_料金) :- 料金を計算する(_入力営業キロ,_料金), writef('%t 円です。\n',[_料金]). 料金を計算する(_入力営業キロ,14910) :- _入力営業キロ >= 1400,!. 料金を計算する(_入力営業キロ,_料金) :- findall([_営業キロ,_金額],( 料金(_営業キロ,_料金), _入力営業キロ < _営業キロ), LL), min(LL,[_営業キロ,_料金]). % 料金/2述語の節の順序は必ずしも営業キロ数の小さい順であるとは % 言えない。それでこういうプログラムとなる。 % 小さい順だとするためには、最初にその検査が必要だろう。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/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/1309076891/713 # # 【 課題 】 # 2012年 センター試験 プログラム # http://ime.nu/www.toshin.com/center/sugaku-2b_mondai_6.html # 解答 # http://ime.nu/www.toshin.com/center/sugaku-2b_ans.html # # このプログラムをjavaアプリケーションで記述して下さい。 # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】1/18 6:00まで # 【 Ver  】java version "1.6.0_21" # # # 与えられた二つの自然数M,Nについて,Mから始まるN個の連続した自然数の積M*(M+1)*(M+2)*...*(M+N-1)が8で割り切れるかどうか調べ、その結果を出力するプログラム '与えられた二つの自然数M,Nについて,Mから始まるN個の連続した自然数の積M*(M+1)*(M+2)*...*(M+N-1)が8で割り切れるかどうか調べ、その結果を出力する'(M,N) :- Max is M + N - 1, 'Mから始まるN個の連続した自然数の積M*(M+1)*(M+2)*...*(M+N-1)が8で割り切れるかどうか調べ'(M,Max,8,_診断), 出力する(_診断). 'Mから始まるN個の連続した自然数の積M*(M+1)*(M+2)*...*(M+N-1)が8で割り切れるかどうか調べ'(Max,Max,_積,_診断) :- '8で割り切れるかどうかの診断'(_積,_診断),!. 'Mから始まるN個の連続した自然数の積M*(M+1)*(M+2)*...*(M+N-1)が8で割り切れるかどうか調べ'(M,Max,_積_1,_診断) :- _積_2 is _積_1 * (M + 1), M2 is M + 1, 'Mから始まるN個の連続した自然数の積M*(M+1)*(M+2)*...*(M+N-1)が8で割り切れるかどうか調べ'(M2,Max,_積_2,_診断). '8で割り切れるかどうかの診断'(_積,ます) :- 0 is _積 mod 8. '8で割り切れるかどうかの診断'(_積,ません) :- \+(0 is _積 mod 8). 出力する(_文字列) :- writef('8で割り切れ%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/194 # # [1] 授業単元:C言語入門 # [2] 問題文: http://ime.nu/codepad.org/hsA7qgRQ # 課題3 # # キーボードからintの整数を入力する.入力された整数と,整数9699690との最大公約数を表示するプログラムを作成せよ.ただし整数9699690よりも大きい数が入力された場合はerrorと表示すること.マイナスの数を入力された場合は正の数として計算すること. # また,次の関数プロトタイプにしたがう自作の関数gcdを使うようにプログラムすること # # int gcd(int m, int x); //m>xとしてmとxの最大公約数を求めて返す関数 # このgcdを使うとmain関数は次のようにできる. # # int main(void) # { # int m,n,g; # m=9699690; # scanf("%d", &n); # g = gcd( m, n); # printf("%d\n",g); # } # 関数gcdの本体定義部分を自分で追加して全体としてプログラムを完成させること. # # 実行例 # 実行開始 # 60 ←キーボードから60と入力 # 30 ←9699690との最大公約数30を表示 # # ヒント # 最大公約数を求める有名なアルゴリズムとして,ユークリッドの互除法がある.二つの整数a,b(a>bとする)の最大公約数dを求める. # # ?Step 1. もしb=0であればd=|a|として終了 # ?Step 2. aをbで割った余りをrとする # ?Step 3. a=b, b=rとして、Step 1.へ # # # 'キーボードからintの整数を入力する.入力された整数と,整数9699690との最大公約数を表示する' :- 整数を入力する(_整数), 最大公約数をユークリッドの互除法で求める(9699690,_整数,_最大公約数), writef('最大公約数は %t です\n',[_最大公約数]). 整数を入力する(_整数) :- write('整数を入力して下さい : ), get_line(Line), 整数を入力する(Line,_整数),!. 整数を入力する(_整数) :- 整数を入力する(_整数). 整数を入力する(Line,_整数) :- atom_to_term(Line,_整数_1,_), integer(_整数), 整数入力検査(_整数_1,_整数),!. 整数を入力する(Line,_) :- writef('入力された %t からは適切な整数が得られません。再入力をお願いします\n',[Line]), fail. 整数入力検査(_整数_1,_整数) :- 9699690 > _整数_1, write('error\n'),!, fail. 整数入力検査(_整数_1,_整数) :- _整数_1 < 0, _整数 is abs(_整数_1),!. 整数入力検査(_整数,_整数) :- _整数 > 0,!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/903 # # [1] 授業単元:計算機アルゴリズムファイルへの書き込み # [2] 問題文(含コード&リンク):以下の実行例のように、キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数) # を次々と読み込んで、そのデータをファイルに書きこむプログラムを作成せよ。 # # 以下の要件を満たすとする # ・書きこむのファイル名をユーザに入力させる # ・同じ名前の友人の情報がすでに入力されたかどうかは確認しなくても良い。 # ・同じ名前のファイルはすでに存在する場合には、内容を上書きするものとする。 # ・作成されたファイルの中身は以下の実行例(catコマンドの結果)のようにするものとする。 # ・以下の実行例のように,1人文のデータを入力するごとに「続けますか(yse...1/NO...0:)」のように表示を促し1が入力されたら処理を続けるプログラムとする。 # # [5] その他の制限:[実行例] # 書きこむファイル名:friends.txt # 友人の名前:Goro # 誕生日(yyyymmdd):19911001 # 続けますか?(yes...1/NO...0):1 # 友人の名前:Taro # 誕生日(yyyymmdd):19890505 # 続けますか?(yes...1/NO...0):1 # 友人の名前:Akira # 誕生日(yyyymmdd):19920222 # 続けますか?(yes...1/NO...0):0 # # %cat freinds.txt # Goro 19911001 # Taro 19890505 # Akira 19920222 # 宜しくお願いします。 # 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで、そのデータをファイルに書きこむ'(_ファイル) :- 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_名前_生年月日ならび), 'そのデータをファイルに書きこむ'(_ファイル,_名前_生年月日ならび). 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_名前_生年月日ならび) :- 友人の名前を読み込む(_友人の名前), 生年月日を読み込む(_生年月日), 続行するか終了するか問う(_答え), 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_答え,_友人の名前,_生年月日,_名前_生年月日ならび). 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(0,[]). 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_,_友人の名前,_生年月日,[[_友人の名前,_生年月日]|R]) :- 友人の名前を読み込む(_友人の名前_2), 生年月日を読み込む(_生年月日_2), 続行するか終了するか問う(_答え), 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_答え,_友人の名前_2,_生年月日_2,R). 友人の名前を読み込む(_友人の名前) :- write('友人の名前:'), get_line(_友人の名前). 生年月日を読み込む(_生年月日) :- write('誕生日(yyyymmdd):'), get_line(_生年月日). 続行するか終了するか問う(_答え) :- write('続けますか?(yes...1/NO...0):'), get_line(Line), 続行するか終了するか診断(Line,_答え),!. 続行するか終了するか問う(_答え) :- 続行するか終了するか問う(_答え). 続行するか終了するか診断(Line,_答え) :- atom_to_term(Line,_答え,_), integer(_答え), _答え >= 0, _答え =< 1,!. 続行するか終了するか診断(Line,_答え) :- fail. 'そのデータをファイルに書きこむ'(_ファイル,_名前_生年月日ならび) :- open(_ファイル,write,Outstream), append(_,[[_友人の名前,_生年月日]|R],_名前_生年月日ならび), writef('%t %t\n',[_友人の名前,_生年月日]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/779 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # キーボードから整数値を受け取り、その数値に該当する月の略称("Jan", "Feb",・・・)を表示するプログラムを作成しなさい。 # なお、月の略称はポインタ配列「 char *month[ ]={"Jan.", "Feb.", "Mar.", "Apr.", "May.", "Jun.", "Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."};」で定義するものとする。 # 'キーボードから整数値を受け取り、その数値に該当する月の略称("Jan", "Feb",・・・)を表示する。なお、月の略称はポインタ配列「 char *month[ ]={"Jan.", "Feb.", "Mar.", "Apr.", "May.", "Jun.", "Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."};」で定義するものとする。' :- 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値), 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値). 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値) :- get_line(Line), キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値),!. 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値) :- 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値). キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値) :- atom_to_term(Line,_キーボードから受け取った整数値,_), integer(_キーボードから受け取った整数値),!. キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値) :- writef('入力された %t からは月数に相当する数値が得られません。再入力をお願いします。\n',[Line]), fail. 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値) :- 数値に該当するピリオド付き月の略称ストリング(_キーボードから受け取った整数値,_ピリオド付き月の略称ストリング), append(L1,[_],_ピリオド付き月の略称ストリング), string_to_atom(L1,_その数値に該当する月の略称), writef('キーボードから受け取った数字 %t(月),該当する月の略称 %t\n',[_キーボードから受け取った整数値,_その数値に該当する月の略称]),!. 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値,_) :- writef('キーボードからの入力 %t に該当する月は存在しません。\n',[_キーボードから受け取った整数値,[_キーボードから受け取った整数値]). 数値に該当する月の略称ストリング(1,"Jan."). 数値に該当する月の略称ストリング(2,"Feb."). 数値に該当する月の略称ストリング(3,"Mar."). 数値に該当する月の略称ストリング(4,"Apr."). 数値に該当する月の略称ストリング(5,"May."). 数値に該当する月の略称ストリング(6,"Jun."). 数値に該当する月の略称ストリング(7,"Jul."). 数値に該当する月の略称ストリング(8,"Aug."). 数値に該当する月の略称ストリング(9,"Sep."). 数値に該当する月の略称ストリング(10,"Oct."). 数値に該当する月の略称ストリング(11,"Nov."). 数値に該当する月の略称ストリング(12,"Dec."). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/779 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # キーボードから整数値を受け取り、その数値に該当する月の略称("Jan", "Feb",・・・)を表示するプログラムを作成しなさい。 # なお、月の略称はポインタ配列「 char *month[ ]={"Jan.", "Feb.", "Mar.", "Apr.", "May.", "Jun.", "Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."};」で定義するものとする。 # 'キーボードから整数値を受け取り、その数値に該当する月の略称("Jan", "Feb",・・・)を表示する。なお、月の略称はポインタ配列「 char *month[ ]={"Jan.", "Feb.", "Mar.", "Apr.", "May.", "Jun.", "Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."};」で定義するものとする。' :- 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値), 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値). 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値) :- get_line(Line), キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値),!. 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値) :- 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値). キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値) :- atom_to_term(Line,_キーボードから受け取った整数値,_), integer(_キーボードから受け取った整数値),!. キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値) :- writef('入力された %t からは月数に相当する数値が得られません。再入力をお願いします。\n',[Line]), fail. 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値) :- 数値に該当するピリオド付き月の略称ストリング(_キーボードから受け取った整数値,_ピリオド付き月の略称ストリング), append(L1,[_],_ピリオド付き月の略称ストリング), string_to_atom(L1,_その数値に該当する月の略称), writef('キーボードから受け取った数字 %t(月),該当する月の略称 %t\n',[_キーボードから受け取った整数値,_その数値に該当する月の略称]),!. 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値,_) :- writef('キーボードからの入力 %t に該当する月は存在しません。\n',[_キーボードから受け取った整数値,[_キーボードから受け取った整数値]). 数値に該当する月の略称ストリング(1,"Jan."). 数値に該当する月の略称ストリング(2,"Feb."). 数値に該当する月の略称ストリング(3,"Mar."). 数値に該当する月の略称ストリング(4,"Apr."). 数値に該当する月の略称ストリング(5,"May."). 数値に該当する月の略称ストリング(6,"Jun."). 数値に該当する月の略称ストリング(7,"Jul."). 数値に該当する月の略称ストリング(8,"Aug."). 数値に該当する月の略称ストリング(9,"Sep."). 数値に該当する月の略称ストリング(10,"Oct."). 数値に該当する月の略称ストリング(11,"Nov."). 数値に該当する月の略称ストリング(12,"Dec."). % 以下のサイトは # http://www.ioi-jp.org/joi/2011/2012-yo/2012-yo-t1/2012-yo-t1.html # 問題 # 1    ランチ (Lunch) # 問題 # # JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが # 好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと # 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を # 引いた金額が代金となる. # # ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの # 代金の最小値を求めるプログラムを作成せよ. # # 入力 # # 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. # 1 行目の整数は 1 つ目のパスタの値段である. # 2 行目の整数は 2 つ目のパスタの値段である. # 3 行目の整数は 3 つ目のパスタの値段である. # 4 行目の整数は 1 つ目のジュースの値段である. # 5 行目の整数は 2 つ目のジュースの値段である. # ただし,与えられる入力データにおいては全てのパスタとジュースの値段は # 100 円以上 2000 円以下であることが保証されている. # # 出力 # # その日のセットメニューの代金の最小値を 1 行で出力せよ. # # 入出力例 # # 入力例 1 入力例 2 # 800 1999 # 700 1999 # 900 100 # 198 189 # 330 100 # # 出力例 1 出力例 2 # 848 150 # # # 入出力例 1 では,2 つ目のパスタと 1 つ目のジュースを組み合わせた場合の 700 + 198 - 50 = 848 がその日のセットメニューの代金の最小値である. # # 入出力例 2 では,3 つ目のパスタと 2 つ目のジュースを組み合わせた場合の 100 + 100 - 50 = 150 がその日のセットメニューの代金の最小値である. # # ※各入出力例のデータは,右クリック等によりファイルに保存して利用可能です. # program :- 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める'. 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める' :- '3書類のパスタと2種類のジュースの価格を得る'(_3種類のパスタの価格,_2種類のジュースの価格), 最小値を探しだす(_セットメニューの代金,( セットメニューを代金を得る(_3種類のパスタの価格,_2種類のジュースの価格,_セットメニューの代金)), _その日のセットメニューの代金の最小値), writef('%t\n',[_その日のセットメニューの代金の最小値]). '3書類のパスタと2種類のジュースの価格を得る'(_3種類のパスタの価格,_2種類のジュースの価格) :- '3種類のパスタの価格を得る'(_3種類のパスタの価格), '2種類のジュースの価格を得る'(_2種類のジュースの価格). '3種類のパスタの価格を得る'(_3種類のパスタの価格) :- length(_3種類のパスタの価格,3), findall(_パスタの価格,( append(_,[_パスタの価格|_],_3種類のパスタの価格), 整数入力(_パスタの価格)), _3種類のパスタの価格). '2種類のジュースの価格を得る'(_2種類のジュースの価格) :- length(_2種類のジュースの価格,2), findall(_ジュースの価格,( % _パスタの価格となっていた 12/23訂正 append(_,[_ジュースの価格|_],_2種類のジュースの価格), 整数入力(_ジュースの価格)), _2種類のジュースの価格). 最小値を探しだす(_対象となる値,_副目標,_最小値) :- findall(_対象となる値,_副目標,L), 最小値(L,_最小値). 最小値(L,_最小値) :- append(L1,[_最小値|L2],L), \+((append(_,[A|_],L1),A @< _最小値)), \+((append(_,[B|_],L2),B @< _最小値)),!. セットメニューを代金を得る(_3種類のパスタの価格,_2種類のジュースの価格,_セットメニューの代金) :- append(_,[_パスタの価格|_],_3種類のパスタの価格), append(_,[_ジュースの価格|_],_2種類のジュースの価格), _セットメニューの代金 is _パスタの価格 + _ジュースの価格 - 50. 整数入力(N) :- get_line(Line), 整数入力診断(Line,N),!. 整数入力(N) :- 整数入力(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数入力診断(Line,N) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. get_line(Line) :- get_char(Char), get_line_2(Char,Chars), atom_chars(Line,Chars). get_line_2(end_of_file,[]) :- !. get_line_2('\n',[]) :- !. get_line_2(Char,[Char|R]) :- get_char(Char2), get_line_2(Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/743 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/uhaD9 # # キーボードから5 個の整数を入力し,最大値,最小値,平均値を計算するプログラムを,以下の条件に従って作成せよ. # 1) キーボードからn個の整数を入力して配列arrayに格納する関数 # 「void input( int *array,int n)」を作成すること. # 2) n 個の要素からなる配列array に対して,最大値を算出して返す関数 # 「int max( int *array, int n )」を作成すること. # 3) n 個の要素からなる配列array に対して,最小値を算出して返す関数 # 「int min( int *array, int n )」を作成すること. # 4) n 個の要素からなる配列array に対して,平均値を算出して返す関数 # 「double avg( int *array, int n )」を作成すること. # 5) main関数では,1)~4)の関数をすべて呼び出すこと. program :- 'キーボードからn個の整数を入力してならびに格納する'(5,_ならび), 'ならびの最大値を返す'(_ならび,_最大値), 'ならびの最小値を返す'(_ならび,_最小値), 'ならび要素の平均値を返す'(_ならび,_平均値), writef('ならび要素は%t\n最大値は%t\n最小値は%t\n平均値は%t\n',[_ならび,_最大値,_最小値,_平均値]). 'キーボードからn個の整数を入力してならびに格納する'(_n,_ならび) :- length(_ならび,_n), findall(_整数,( append(_,[_整数|_],_ならび), 整数入力(_整数)), _ならび). 整数入力(_整数) :- write('整数を入力して下さい : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数入力(_整数) :- 整数入力(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]), fail. 'ならびの最大値を返す'(_ならび,_最大値) :- max(_ならび,_最大値). 'ならびの最小値を返す'(_ならび,_最小値) :- min(_ならび,_最小値). 'ならび要素の平均値を返す'(_ならび,_平均値) :- avg(_ならび,_平均値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/743 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/uhaD9 # # キーボードから5 個の整数を入力し,最大値,最小値,平均値を計算するプログラムを,以下の条件に従って作成せよ. # 1) キーボードからn個の整数を入力して配列arrayに格納する関数 # 「void input( int *array,int n)」を作成すること. # 2) n 個の要素からなる配列array に対して,最大値を算出して返す関数 # 「int max( int *array, int n )」を作成すること. # 3) n 個の要素からなる配列array に対して,最小値を算出して返す関数 # 「int min( int *array, int n )」を作成すること. # 4) n 個の要素からなる配列array に対して,平均値を算出して返す関数 # 「double avg( int *array, int n )」を作成すること. # 5) main関数では,1)~4)の関数をすべて呼び出すこと. program :- 'キーボードからn個の整数を入力してならびに格納する'(5,_ならび), 'ならびの最大値を返す'(_ならび,_最大値), 'ならびの最小値を返す'(_ならび,_最小値), 'ならび要素の平均値を返す'(_ならび,_平均値), writef('ならび要素は%t\n最大値は%t\n最小値は%t\n平均値は%t\n',[_ならび,_最大値,_最小値,_平均値]). 'キーボードからn個の整数を入力してならびに格納する'(_n,_ならび) :- length(_ならび,_n), findall(_整数,( append(_,[_整数|_],_ならび), 整数入力(_整数)), _ならび). 整数入力(_整数) :- write('整数を入力して下さい : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数入力(_整数) :- 整数入力(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]), fail. 'ならびの最大値を返す'(_ならび,_最大値) :- append(L1,[_最大値|L2],_ならび), \+((member(A,L1),B @> _最大値)), \+((member(B,L2),A @> _最大値)),!. 'ならびの最小値を返す'(_ならび,_最小値) :- append(L1,[_最小値|L2],_ならび), \+((member(A,L1),B @< _最小値)), \+((member(B,L2),A @< _最小値)),!. 'ならび要素の平均値を返す'(_ならび,_平均値) :- sum(_ならび,_合計), length(_ならび,_要素数), _平均値 is _合計 / _要素数. sum([],0). sum([V|R],Sum) :- sum(R,Sum_1), Sum is Sum_1 + V. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/556 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 氏名、体重、身長の入力を受けつけ、ファイル # に書き込むプログラムをかけ。 # '氏名、体重、身長の入力を受けつけ、ファイルに書きこむ'(_ファイル) :- '氏名、体重、身長の入力を受けつけ'(_氏名,_体重,_身長), ファイルに書きこむ(_ファイル,_氏名,_体重,_身長). '氏名、体重、身長の入力を受けつけ'(_氏名,_体重,_身長) :- 氏名の入力(_氏名), 体重の入力(_体重), 身長の入力(_身長). 氏名の入力(_氏名) :- get_line(_氏名). 体重の入力(_体重) :- get_line(Line), 体重入力診断(Line,_体重),!. 体重の入力(_体重) :- 体重の入力(_体重). 体重入力診断(Line,_体重) :- atom_to_term(Line,_体重,_), number(_体重), _体重 > 0,!. 体重入力診断(Line,_体重) :- writef('入力された %t からは適切な体重が得られません。再入力をお願いします。\n'), fail. 身長の入力(_身長) :- get_line(Line), 身長入力診断(Line,_身長),!. 身長の入力(_身長) :- 身長の入力(_身長). 身長入力診断(Line,_身長) :- atom_to_term(Line,_身長,_), number(_身長), _身長 > 0,!. 身長入力診断(Line,_身長) :- writef('入力された %t からは適切な身長が得られません。再入力をお願いします。\n'), fail. ファイルに書きこむ(_ファイル,_氏名,_体重,_身長) :- open(_ファイル,write,Outstream), writef(Outstrem,'氏名は %q \n体重は %t Kg\n身長は %t cm\n',[_氏名,_体重,_身長]), close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/593 # # 【 課題 】ttp://edu.net.c.dendai.ac.jp/ad1/2011/kadai.html # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】1/10 20:00まで # 【 Ver  】java version "1.6.0_21" # 【 補足 】課題2をお願いします # <課題1> # 通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、 # また円レートを設定すると、等価な円オブジェクトを返します。 # # <課題2> # 順序木を利用し、キーの値で値を整列するデータ構造を作成することを考えます。 # そのためには、java.util.Map を実装し、 java.util.AbstractMap を継承し、 # 最小限のプログラムで動作させます。 まず、文字列をキーとして、整数値を # 整列するような TDUMap3 を目標とします。 完成した後、Generics を利用した # 任意の型のキーと値を使用できる TDUMap を作成します。 '通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、また円レートを設定すると、等価な円オブジェクトを返します。'(_値,_通貨記号,_円レート,_円) :- '値を入れると'(_値), '通貨記号を含めて表示し'(_値,_通貨記号を含む表示), '円レートを設定すると'(_通貨記号を含む表示,_円レート), '等価な円オブジェクトを返す'(_値,_円レート,_円). '通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、また円レートを設定すると、等価な円オブジェクトを返します。'(_値,_通貨記号,_円レート,_円) :- '通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、また円レートを設定すると、等価な円オブジェクトを返します。'(_値,_通貨記号,_円レート,_円). '値を入れると'(_値) :- write('値を入力して下さい : '), get_line(Line), '値入力診断'(Line,_値). '値を入れると'(_値) :- '値を入れると'(_値). '値入力診断'(Line,_値) :- atom_to_term(Line,_値,_), number(_値), _値 >= 0. 通貨記号を含めて表示し(_値) :- 通貨(_通貨記号), concat_atom([_通貨記号,_値],_通貨記号を含む表示), writef('%t : ',[_通貨記号を含む表示]). '円レートを設定すると'(_通貨記号を含む表示,_円レート) :- writef('%t 円レートを入力して下さい : ',[_痛か木子を含む表示]), get_line(Line), '円レート入力診断'(Line,_円レート),!. '円レートを設定すると'(_通貨記号を含む表示,_円レート) :- '円レートを設定すると'(_通貨記号を含む表示,_円レート). '円レート入力診断'(Line,_円レート) :- atom_to_term(Line,_円レート,_), number(_円レート), _円レート >= 0,!. '等価な円オブジェクトを返す'(_値,_円レート,_円) :- _円 is _値 * _円レート. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/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/245 # # [1] 授業単元:2分探索 # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/YJwRQ # データが昇順ではなく、降順に並んでいる場合の2分探索をプログラムを作成せよ # 'データが昇順ではなく、降順に並んでいる場合の2分探索をプログラム'(_降順ならび,_鍵,_値) :- ならびの二分(_降順ならび,L1,[(A,B)|L2]), '降順に並んでいる場合の2分探索診断'(_鍵,A,B,L1,L2,_値). '降順に並んでいる場合の2分探索診断'(_鍵,_鍵,_値,L1,L2,_値) :- !. '降順に並んでいる場合の2分探索診断'(_鍵,A,B,L1,L2,_値) :- _鍵 @< A, 'データが昇順ではなく、降順に並んでいる場合の2分探索をプログラム'(L2,_鍵,_値). '降順に並んでいる場合の2分探索診断'(_鍵,A,B,L1,L2,_値) :- _鍵 @> A, 'データが昇順ではなく、降順に並んでいる場合の2分探索をプログラム'(L1,_鍵,_値). ならびの二分(L,L1,L2) :- length(L,Len), Len1 is Len // 2, length(L1,Len1), append(L1,L2,L). % 以下のサイトは ?- 'a##'. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/122 # # 1] 授業単元: # [2] 問題文(含コード&リンク): # # (1) # #include <stdio.h> # #define NUMBER 5 # int tensu[NUMBER]; # int top(void); # int main(void) # { # extern int tensu[]; # int i; # printf("%d人の点数を入力してください。\n", NUMBER); # for (i = 0; i < NUMBER; I++) { printf("%d:",i + 1); scanf("%d", &tensu[i]); } printf("最高点=%d\n", top()); return (0); # } # int top(void) # { extern int tensu[]; int i; int max = tensu[0]; for (i = 1; i < NUMBER; i++) if (tensu[i] > max) max = tensu[i]; return (max); # } # 上のプログラムを参考にして、5人の点数の平均点を返す関数 double ave(void)を作成せよ。 # その関数を用いて、読み込んだ5人の点数の平均値を出力するプログラムを作成せよ。 # (2) # 2つの 3成分ベクトル a, b の外積 c を求める関数 void acrossb(double a[], double b[], double c[]) を作成せよ。 # この関数を用いて次の二つのベクトル va=(1.0, 2.0, 1.0) , vb=(-2.0, 0.5, 1.0) の外積を計算するプログラムを作成せよ。 # '5人の点数の平均点を返す' :- '5人の点数'(_5人の点数), 平均点を返す(_5人の点数,_平均点), writef('平均点は %t です。\n',[_平均点]). '5人の点数'(_5人の点数) :- length(_5人の点数,5), findall(_点数,( append(L0,[_点数|_],_5人の点数), 点数の入力(L0,_点数)), _5人の点数). 点数の入力(L0,_点数) :- length([_|L0],N), writef('%t人目の点数を入力して下さい : ',[N]), get_line(Line), 点数入力診断(Line,_点数),!. 点数の入力(L0,_点数) :- 点数の入力(L0,_点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0, _点数 =< 100,!. 点数入力診断(Line,_点数) :- writef('入力された %t からは適切な点数が得られません。再入力をお願いします。\n',[Line]), fail. 平均点を返す(_5人の点数,_平均点) :- 平均点を返す(_5人の点数,0,_平均点). 平均点を返す([],_合計,_平均点) :- _平均 is _合計 / 5,!. 平均点を返す([_点数|R],_合計_1,_平均点) :- _合計_2 is _点数 + _合計_1, 平均点を返す(R,_合計_2,_平均点). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/95 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):http://ime.nu/i.imgur.com/hnQll.jpg # # 演習 9-2 整数(最大100まで)をmainプログラムで用意し、キーボードから # 100個以下の整数を任意の個数、入力する。ただし、最初に入力する # データの個数を入力する。 # データの入った配列とデータ数を以下の関数に渡して、配列の中の # 最大値と最小値、および平均値を計算するプログラムを作成せよ。 # 'キーボードから100個以下の整数(最大100まで)を任意の個数、入力する。ただし、最初に入力するデータの個数を入力する。 データの入ったならびとデータ数を受け取りならびの中の最大値と最小値、および平均値を計算する' :- '個数を入力する'(_データ数), length(_データの入ったならび,_データ数), データを入力する(_データの入ったならび), 'データの入ったならびとデータ数を受け取りならびの中の最大値と最小値、および平均値を計算する'(_データの入ったならび,_データ数,_最大値,_最小値,_平均値), writef('最大値 = %t,最小値 = %t,平均値 = %t\n',[_最大値,_最小値,_平均値]). データを入力する(L) :- findall(_100以下の整数,( append(L0,[_|R],L), '100以下の整数を入力する'(L0,_100以下の整数)), L). '100以下の整数を入力する'(L0,_100以下の整数) :- length([_|L0],Nth), writef('%t番目の整数 : ',[Nth]), get_line(Line), '100以下の整数入力診断'(Line,_100以下の整数),!. '100以下の整数を入力する'(L0,_100以下の整数) :- '100以下の整数を入力する'(L0,_100以下の整数). '個数を入力する'(_個数) :- write('入力する整数の個数は : '), get_line(Line), '100以下の整数入力診断'(Line,_個数),!. '個数を入力する'(_個数) :- '個数を入力する'(_個数). '100以下の整数入力診断'(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), _整数 > 0, _整数 =< 100,!. '100以下の整数入力診断'(Line,_) :- write('入力された%tからは適切な個数が得られません。再入力をお願いします。\n',[Line]), fail. 'データの入ったならびとデータ数を受け取りならびの中の最大値と最小値、および平均値を計算する'(_データの入ったならび,_データ数,_最大値,_最小値,_平均値) :- 最大値(_データの入ったならび,_最大値), 最小値(_データの入ったならび,_最小値), 平均値(_データの入ったならび,_データ数,_平均値). 最大値(_データの入ったならび,_最大値) :- append(L1,[_最大値|L2],_データの入ったならび), '全てのデータがAより小さいか等しい'(L1,_最大値), '全てのデータがAより小さいか等しい'(L2,_最大値). 最小値(_データの入ったならび,_最小値) :- append(L1,[_最大値|L2],_データの入ったならび), '全てのデータがAより大きいか等しい'(L1,_最小値), '全てのデータがAより大きいか等しい'(L2,_最小値). 平均値(_データの入ったならび,_データ数,_平均値) :- sum(_データの入ったならび,_合計), _平均値 is _合計 / _データ数. '全てのデータがAより小さいか等しい'([],A). '全てのデータがAより小さいか等しい'([B|R],A) :- B @=< A, '全てのデータがAより小さいか等しい'(R,A). '全てのデータがAより大きいか等しい'([],A). '全てのデータがAより大きいか等しい'([B|R],A) :- B @>= A, '全てのデータがAより大きいか等しい'(R,A). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/42 # # [1] 授業単元:楽しいC(ポインタと関数) # [2] 問題文(含コード&リンク): # 秒数を与えると,それが何日何時間何分何秒にあた # るかを計算する関数 # calctime(long sec, int *dp, int *hp, int *mp, # int *sp); # を作成せよ.例えば # calctime(100000, &d, &h, &m, &s); # として呼び出すとd=1, h=3,m=46,s=40 となる # (100,000 秒=1 日3 時間46 分40 秒).以下の実行例の # ように,関数の動作を確認できるmain 関数も作成すること. # (出力例) # 秒数を入力してください:100000 # 100000 秒= 1 日3 時間46 分40 秒 # 秒数を入力してください:3725 # 3725 秒= 0 日1 時間2 分5 秒 # '秒数を与えると,それが何日何時間何分何秒にあたるかを計算する' :- 秒数の入力(_秒数), '秒数を与えると,それが何日何時間何分何秒にあたるかを計算する'(_秒数,_日数,_時間,_分,_秒), '0は表示せず日数,時間,分,秒を表示する'(_日数,_時間,_分,_秒). 秒数の入力(_秒数) :- write('秒数を入力してください : '), get_line(Line), 秒数の入力診断(Line,_秒数),!. 秒数の入力(_秒数) :- 秒数の入力(_秒数). 秒数の入力診断(Line,_秒数) :- atom_to_term(Line,_秒数,_), integer(_秒数), _秒数 >= 0,!. 秒数の入力診断(Line,_秒数) :- writef('入力された %t からは適切な秒数が得られません。再入力をお願いします。\n',[Line]), fail. '秒数を与えると,それが何日何時間何分何秒にあたるかを計算する'(_秒数,_日数,_時間,_分,_秒) :- _日数 is _秒数 // 86400, _余り_1 is _日数 mod 86440, _時間 is _余り_1 // 3600, _余り_2 is _余り_1 mod 3600, _分 is _余り_2 // 60, _秒 is _余り_2 mod 60. '0は表示せず日数,時間,分,秒を表示する'(_日数,_時間,_分,_秒) :- append(_,[[N,S]|R],[[_日数,日],[_時間,時間],[_分,分],[_秒,秒]]), 表示(N,S), R = [], write('\n'). 表示(0,_) :- !. 表示(N,S) :- writef('%t%t ',[N,S]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/860 # # [1] 授業単元: C言語とアルゴリズム # [2] 問題文(含コード&リンク): # 文字列st が回文(前から読んでも後ろから読んでも # 同じ)であれば1 を,そうでなければ0 を返す関数 # int isPalindrome(const char st[]) # を作成せよ.以下の実行例のように,関数の動作を確認 # できるmain 関数も作成すること. # <実行例> # ./5-4 # 文字列を入力してください:AKASAKA # その文字列は回文です。 # # % ./5-4 # 文字列を入力してください:tomato # その文字列は回文ではありません。 # 回文述語の動作確認 :- write('文字列を入力して下さい : '), get_line(_文字列), 回文(_文字列,_診断), 回文診断(_診断). 回文(_文字列,1) :- atom_chars(Chars), reverse(Chars,Chars),!. 回文(_文字列,0). 回文診断(1) :- write('文字列は回文です。\n'). 回文診断(0) :- write('文字列は回文ではありません。\n'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- 回文(_文字列,1). 回文('',1). 回文(_文字列,_診断) :- 文字列の先頭と末尾から一文字取り出す(_文字列,A,_中間部分文字列,A), 回文(_中間部分文字列,_診断). 文字列の先頭と末尾から一文字取り出す(_文字列,_先頭,_中間部分文字列,_末尾) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_,1,0,_末尾文字). '文字列の先頭と末尾からN文字取り出した中間部分'(_文字列,1,_中間部分文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列の先頭と末尾から一文字取り出す(_文字列,_先頭,_末尾) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_,1,0,_末尾文字). '文字列の先頭と末尾からN文字取り出した中間部分'(_文字列,_N文字,_中間部分文字列) :- sub_atom(_文字列,_N文字,_,_N文字,_中間部分文字列). 文字列の先頭から一文字取り出す(_文字列,_先頭文字,_残り文字列) :- sub_atom(_文字列,0,1,R,_文字), sub_atom(_文字列,1,R,0,_残り文字列). 文字列の先頭からN文字取り出す(_文字列,_N文字,_先頭からの文字列,_残り文字列) :- sub_atom(_文字列,0,_N文字,R,_先頭からの文字列), sub_atom(_文字列,_N文字,R,0,_残り文字列). 文字列の末尾から一文字取り出す(_文字列,_末尾文字,_残り前方文字列) :- sub_atom(_文字列,R,1,0,_末尾文字), sub_atom(_文字列,0,R,1,_残り前方文字列). 文字列の末尾部分N文字取り出す(_文字列,_N文字,_末尾部分文字列,_残り前方文字列) :- sub_atom(_文字列,R,_N文字,0,_末尾部分文字列), sub_atom(_文字列,0,R,_N文字,_残り前方文字列). 文字列の末尾から逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列,_残り前方文字列) :- 文字列の末尾部分を逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列), sub_atom(_文字列,0,R,_N文字,_残り前方文字列). 文字列の末尾部分を逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列) :- 文字列の末尾部分を逆順にN文字取り出す(_文字列,0,_N文字,_末尾からの逆順文字列). 文字列の末尾部分を逆順にN文字取り出す(_文字列,N,N,'') :- !. 文字列の末尾部分を逆順にN文字取り出す(_文字列,M,_N文字,_末尾からの逆順文字列) :- sub_atom(_文字列,_,1,M,_文字), M_2 is M + 1, 文字列の末尾部分を逆順にN文字取り出す(_文字列,M_2,_N文字,_末尾からの逆順文字列_2), atom_concat(_末尾からの逆順文字列_2,_文字,_末尾からの逆順文字列). % % sub_atom/5はPrologの中でも極めてスーパーな組込述語である。この述語を % 使っての文字列操作について、いくつか述語定義をしてみた。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/824 # # [1] 授業単元: C言語とアルゴリズム # [2] 問題文(含コード&リンク): # 初速v、仰角θを入力。着弾距離、着弾するまでの時間を求める。 # <問題の意味> # vx=vcos(θ),vy=-gt+vsin(θ) # x=vtcos(θ),y=-gt^2/2+vtsin(θ)+y0 # y=0,y0=0のとすると、 # 着弾するまでの時間は gt^2/2=vtsin(θ) > t=2*vsin(θ)/g # 着弾距離はtがわかれば x=vtcos(θ)で求まる # '初速v、仰角θを入力。着弾距離、着弾するまでの時間を求める' :- 初速vの入力(_v), 仰角thetaの入力(_theta), '初速v、仰角θを入力。着弾距離、着弾するまでの時間を求める'(_v,_theta,_着弾距離,_着弾するまでの時間), writef('着弾距離は %t m\n着弾するまでの時間は %t 秒です。\n',[_着弾距離,_着弾するまでの時間]). '初速v、仰角θを入力。着弾距離、着弾するまでの時間を求める'(_v,_theta,_着弾距離,_着弾するまでの時間) :- _着弾するまでの時間 is _v * sin(_theta) / 9.80665. _着弾距離 is _v * cos(_theta) * _着弾するまでの時間. 初速vの入力(_v) :- write('初速vを入力して下さい : '), get_line(Line), 初速vの入力診断(Line,_v),!. 初速vの入力(_v) :- 初速vの入力(_v). 初速vの入力診断(Line,_v) :- atom_to_term(Line,_v,_), number(_v), _v > 0.0,!. 初速vの入力診断(Line,_v) :- writef('入力された%tは初速vとして適切でありません。再入力をお願いします。\n',[Line]), fail. 仰角thetaの入力(_theta) :- write('仰角thetaを入力して下さい : '), get_line(Line), 仰角thetaの入力診断(Line,_theta),!. 仰角thetaの入力(_theta) :- 仰角thetaの入力(_theta). 仰角thetaの入力診断(Line,_theta) :- atom_to_term(Line,_theta,_), number(_theta), _theta >= 0.0, _theta =< pi,!. 仰角thetaの入力診断(Line,_theta) :- writef('入力された%tは仰角thetaとして適切でありません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/712 # # [1] 授業単元: C言語実習 # [2] 問題文(含コード&リンク): # 整数値を読み取り,4桁毎に 兆,億,万 を挿入して表示せよ. # # 例 # 入力:114514 # 出力:11万4514 # 入力:810 # 出力:810 # # '整数値を読み取り,4桁毎に 兆,億,万 を挿入して表示する' :-  整数値を読み取り(_整数値), '4桁毎に 兆,億,万 を挿入して表示する'(['',万,億,兆],_整数値). '4桁毎に 兆,億,万 を挿入して表示する'([_,_,_,_],0) :- writef('%t\n',[0]),!. '4桁毎に 兆,億,万 を挿入して表示する'(_,0) :- !. '4桁毎に 兆,億,万 を挿入して表示する'([_単位|R],N) :- M is N mod 10000, N_1 is N // 10000, '4桁毎に 兆,億,万 を挿入して表示する'(R,N_1), 表示する(_単位,M). 表示する(_,0) :- !. 表示する('',M) :- writef('%t\n',[M]),!. 表示する(_単位,M) :- writef('%t%t',[M,_単位]). 整数値を読み取り(_整数値) :- writef('整数を入力して下さい : '), get_line(Line), 整数値読み取り診断(Line,_整数値),!. 整数値を読み取り(_整数値) :- 整数値を読み取り(_整数値). 整数値を読み取り診断(Line,_整数値) :- atom_to_term(Line,_整数値,_), integer(_整数値),!. 整数値を読み取り診断(Line,_整数値) :- writef('入力された %t からは整数値が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/712 # # [1] 授業単元: C言語実習 # [2] 問題文(含コード&リンク): # 整数値を読み取り,4桁毎に 兆,億,万 を挿入して表示せよ. # # 例 # 入力:114514 # 出力:11万4514 # 入力:810 # 出力:810 # # '整数値を読み取り,4桁毎に 兆,億,万 を挿入して表示する' :-  整数値を読み取り(_整数値), '4桁毎に 兆,億,万 を挿入して表示する'(_整数値). '4桁毎に 兆,億,万 を挿入して表示する'(_整数値) :- number_chars(_整数値,Chars), '4桁毎に 兆,億,万 を挿入して'([[兆,12],[億,8],[万,4]],Chars,Chars2), 表示する(Chars2). '4桁毎に 兆,億,万 を挿入して'([],Chars_1,Chars_2) :- 頭部のゼロならびを取り除く(Chars_1,Chars_2),!. '4桁毎に 兆,億,万 を挿入して'([[_単位,_桁]|R],Chars_1,Chars_2) :- length(L2,_桁), append(L1,L2,Chars_1), 頭部のゼロならびを取り除く(L1,L1_2), \+(L1_2 = []), '4桁毎に 兆,億,万 を挿入して'(R,L2,Chars_1_2), append(L1_2,[_単位|Chars_1_2],Chars_2),!. '4桁毎に 兆,億,万 を挿入して'([[_,_桁]|R],Chars_1,Chars_2) :- length(L2,_桁), '4桁毎に 兆,億,万 を挿入して'(R,L2,Chars_2),!. '4桁毎に 兆,億,万 を挿入して'([_|R],Chars_1,Chars_2) :- '4桁毎に 兆,億,万 を挿入して'(R,Chars_1,Chars_2). 頭部のゼロならびを取り除く([0,0,0,0],[]) :- !. 頭部のゼロならびを取り除く([0,0,0|R],R) :-!. 頭部のゼロならびを取り除く([0,0|R],R) :-!. 頭部のゼロならびを取り除く([0|R],R) :-!. 整数値を読み取り(_整数値) :- writef('整数を入力して下さい : '), get_line(Line), 整数値読み取り診断(Line,_整数値),!. 整数値を読み取り(_整数値) :- 整数値を読み取り(_整数値). 整数値を読み取り診断(Line,_整数値) :- atom_to_term(Line,_整数値,_), integer(_整数値),!. 整数値を読み取り診断(Line,_整数値) :- writef('入力された %t からは整数値が得られません。再入力をお願いします。\n',[Line]), fail. 表示する(_単位を挿入された整数ならび) :- concat_atom(_単位を挿入された整数ならび,_表示文字列), writef('%t\n',[_表示文字列]). % % いつも通り文字ならびに変換した結果迷走した。 % こんな問題は単純に整数のまま処理した方がいい。 http://nojiriko.asia/prolog/c153_712_1.html % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/625 # # [1] 授業単元:C言語 # [2] 問題文:123, 1.23, 1.2.3という数字を入力したとき、 #        整数、小数、使用できない数字という分類に分けよ。 # '123, 1.23, 1.2.3という数字を入力したとき、整数、小数、使用できない数字という分類に分けよ。'(_整数分類ならび,_小数分類ならび,_使用できない数字分類ならび) :- split('123, 1.23, 1.2.3',[',',' '],L), '整数、小数、使用できない数字という分類'(L,_整数分類ならび,_小数分類ならび,_使用できない数字分類ならび). '整数、小数、使用できない数字という分類'([],[],[],[]). '整数、小数、使用できない数字という分類'([A|R1],[A|R2],R3,R4) :- 整数である(A), '整数、小数、使用できない数字という分類'(R1,R2,R3,R4),!. '整数、小数、使用できない数字という分類'([A|R1],R2,[A|R3],R4) :- 小数である(A), '整数、小数、使用できない数字という分類'(R1,R2,R3,R4). '整数、小数、使用できない数字という分類'([A|R1],R2,R3,[A|R4]) :- '整数、小数、使用できない数字という分類'(R1,R2,R3,R4),!. 整数である(A) :- 第一文字が符号で残りの文字列をA2とすると(A,A2), 文字列が符号を含まない数字だけから構成される(A2),!. 整数である(A) :- 文字列が符号を含まない数字だけから構成される(A2),!. 小数である(A) :- 第一文字が符号で残りの文字列をA2とすると(A,A2), 数字から始まる小数点表現文字列(A2),!. 小数である(A) :- 数字から始まる小数点表現文字列(A2),!. 数字から始まる小数点表現文字列(A) :- 間にピリオドがひとつだけあり他は数字である文字列(A),!. 数字から始まる小数点表現文字列(A) :- atom_chars(A,Chars), 指数部表現が適切(Chars). 指数部表現が適切(Chars) :- append(L0,[e,+|R],Chars), 'L0部の診断'(L0), 空ではなくかつ全て数字(R). 指数部表現が適切(Chars) :- append(L0,[e,-|R],Chars), 'L0部の診断'(L0), 空ではなくかつ全て数字(R). 'L0部の診断'(L0) :- 空ではなくかつ全て数字(L0),!. 'L0部の診断'(L0) :- append(L01,['.'|R],L0), 空ではなくかつ全て数字(L0), 空ではなくかつ全て数字(R),!. 間にピリオドがひとつだけあり他は数字である文字列(A) :- atom_chars(A,Chars), append(L0,['.'|R],Chars), 空ではなくかつ全て数字(L0), 空ではなくかつ全て数字(R),!. 第一文字が符号で残りの文字列をA2とすると(A,A2) :- sub_atom(A,0,1,R,_符号), member(_符号,[+,-]), sub_atom(A,1,R,0,A2). 文字列が符号を含まない数字だけから構成される(_文字列) :- atom_chars(_文字列,Chars), 空ではなくかつ全て数字(Chars). 空ではなくかつ全て数字([]) :- !,fail. 空ではなくかつ全て数字(L) :- 全て数字(L). 全て数字([]). 全て数字([A|R]) :- member(A,['0','1','2','3','4','5','6','7','8','9']), 全て数字([R]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/624 # # [1] 授業単元:リスト構造体 # [2] 問題文(含コード&リンク): # enqueue()とdequeue()を用いて実行結果が # # Please input E(登録) or D(削除): E # Input number and name: 8 Nakamura # Please input E(登録) or D(削除): E # Input number and name: 3 Saito # Please input E(登録) or D(削除): D # Number=8 Name=Nakamura # Please input E(登録) or D(削除): D # Number=3 Name=Saito # Please input E(登録) or D(削除): D # No Data! # Please input E(登録) or D(削除): E # ・ # ・ # ・ # のように動作するプログラムを作成せよ # 'enqueue()とdequeue()を用いて実行' :- start_queue, 要求の取得(_要求), 'enqueue()とdequeue()を用いて実行'(_要求). 要求の取得(_要求) :- write('Please input E(登録) or D(削除): '), get_line(_要求),!. 'enqueue()とdequeue()を用いて実行'(q) :- !. 'enqueue()とdequeue()を用いて実行'('E') :- enqueue, fail. 'enqueue()とdequeue()を用いて実行'('D') :- dequeue, fail. 'enqueue()とdequeue()を用いて実行'(_) :- 要求の取得(_要求), 'enqueue()とdequeue()を用いて実行'(_要求). start_queue :- キューの生成(一時的). enqueue :- write('Input number and name: ' 'Input number and name'(_number,_name), キューに追加(一時的,[_number,_name]). 'Input number and name'(_number,_name) :- readln([_number,_name]). dequeue :- キューからの取り出し(一時的,_値), dequeue(_項), dequeue診断(_項,_診断), writef('%t\n',[_診断]). dequeue診断([],' No Data!') :- !. dequeue診断([_number,_name],_表示文字列) :- concat_atom(['nunmber = ',_number,' name = ',_name],_表示文字列). キューの生成(_キューの名前) :- キュー(_キューの名前,_), writef('%tというキューは既に存在します。登録できません。\n',[_キューの名前]),!. キューの生成(_キューの名前) :- asserta(キュー(_キューの名前,[])). キューからの取り出し(_キューの名前,_取り出した項) :- retract(キュー(_キューの名前,[_項|R])), asserta(キュー(_キューの名前,R)),!. キューからの取り出し(_キューの名前,[]). キューへの追加(_キュー名,_追加する項) :- retract(キュー(_キューの名前,_キュー)), append(_キュー,[_追加する項],_追加されたキュー), asserta(キュー(_キューの名前,_追加されたキュー)). キューを空にする(_キュー名) :- retract(キュー(_キューの名前,_)), asserta(キュー(_キューの名前,[])). % % キューは引数内の論理変数として重リストを使って定義し、 % それを更新しながら持ちまわるのが普通だが、 % ここでは愚直に、キューを述語としてassertし、reatract/assertを % 繰り返して値を出入りさせる述語群を定義してみた。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/523 # # 【 課題 】キーボードで生徒のデータを入力するプログラムを作成せよ # データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。 # 【 形態 】Javaアプリケーション(main()で開始 # 【 GUI  】制限なし # 【 期限 】2011年11月24日(木) # 【 Ver  】java version 1.6.0_22 # 【 補足 】作ってみたものの、上手く行きません。 # http://ime.nu/ideone.com/8gqKi # 何処がどう間違っているか指摘していただければ幸いです。 # # 'キーボードで生徒のデータを入力する。データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。' :- repeat, 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断), 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,_診断),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 指示に従い一行入力する('名前,ID,学年,電話番号 をカンマ区切りで入力して下さい(終了したい時は改行のみ) : ',Line), 入力診断(Line,_名前,_ID,_学年,_電話番号,_診断), \+(_診断 = 再入力),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断). 指示に従い一行入力する(_指示,Line) :- writef('%t',[_指示]), get_line(Line),!. 入力診断('',_名前,_ID,_学年,_電話番号,終了) :- !. 入力診断(Line,_名前,_ID,_学年_1,_電話番号,入力完了) :- split(Line,[','],[_名前,_ID,_学年,_電話番号]), 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年),!. 入力診断(Line,_名前,_ID,_学年,_電話番号,再入力) :- writef('入力された %t からは求める生徒データが得られません。再入力をお願いします。\n',[Line]). 学年の入力が負の場合メッセージを表示して中断する(_学年,_学年) :- _学年 >= 0,!. 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年) :- _学年_1 < 0, writef('学年データ%tが負数です。再入力をしますか? y or n : ',[_学年_1]), get_line(y), 学年の再入力(_学年),!. 学年の再入力(_学年) :- write('学年を入力して下さい : '), get_line(Line), 学年再入力診断(Line,_学年),!. 学年再入力診断(Line,_学年) :- atom_to_term(Line,_学年,_), integer(_学年), _学年 >= 0,!. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,終了) :- !. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,入力完了) :- assertz(生徒のデータ(_名前,_ID,_学年,_電話番号)), fail. % % http://nojiriko.asia/prolog/j71_523.html とは僅かな違い。 % 何処が違うのか、捜すのさえ難しいくらいだが。 % どちらが好ましい表現かという問題。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/523 # # 【 課題 】キーボードで生徒のデータを入力するプログラムを作成せよ # データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。 # 【 形態 】Javaアプリケーション(main()で開始 # 【 GUI  】制限なし # 【 期限 】2011年11月24日(木) # 【 Ver  】java version 1.6.0_22 # 【 補足 】作ってみたものの、上手く行きません。 # http://ime.nu/ideone.com/8gqKi # 何処がどう間違っているか指摘していただければ幸いです。 # # 'キーボードで生徒のデータを入力する。データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。' :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断), 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,_診断),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 指示に従い一行入力する('名前,ID,学年,電話番号 をカンマ区切りで入力して下さい(終了したい時は改行のみ) : ',Line), 入力診断(Line,_名前,_ID,_学年,_電話番号,_診断), \+(_診断 = 再入力). 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断). 指示に従い一行入力する(_指示,Line) :- writef('%t',[_指示]), get_line(Line),!. 入力診断('',_,_,_,_,終了) :- !. 入力診断(Line,_名前,_ID,_学年_1,_電話番号,入力完了) :- split(Line,[','],[_名前,_ID,_学年,_電話番号]), 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年),!. 入力診断(Line,_名前,_ID,_学年,_電話番号,再入力) :- writef('入力された %t からは求める生徒データが得られません。再入力をお願いします。\n',[Line]). 学年の入力が負の場合メッセージを表示して中断する(_学年,_学年) :- _学年 >= 0,!. 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年) :- _学年_1 < 0, writef('学年データ%tが負数です。再入力をしますか? y or n : ',[_学年_1]), get_line('学年データ%tが負数です。再入力をしますか? y or n : ',y), 学年の再入力(_学年),!. 学年の再入力(_学年) :- write('学年を入力して下さい : '), get_line(Line), 学年再入力診断(Line,_学年),!. 学年再入力診断(Line,_学年) :- atom_to_term(Line,_学年,_), integer(_学年), _学年 >= 0,!. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,終了) :- !. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,入力完了) :- assertz(生徒のデータ(_名前,_ID,_学年,_電話番号)), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/544 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):5 つの要素を持つdouble 型配列vx[] に対し # て,その各要素の正負を反転するプログラムを, # ポインタ演算を用いて作成せよ.例えばvx[] が # {1.1, 2.2, -3.3, 4.4, -5.5}であったとき,プログ # ラムの結果vx[] は{-1.1, -2.2, 3.3, -4.4, 5.5} # となる.ただし,プログラムは以下の要件を満たすこと # とする. # # 解答例等 # 5 つの実数を入力してください # vx[0] = 1.1 # vx[1] = 2.2 # vx[2] = -3.3 # vx[3] = 4.4 # vx[4] = -5.5 # 正負を反転させました。 # vx[0] = -1.100000 # vx[1] = -2.200000 # vx[2] = 3.300000 # vx[3] = -4.400000 # vx[4] = 5.500000 # '5 つの要素を持つならびに対して,その各要素の正負を反転する' :- '5 つの要素を持つならびに対して'(_ならび), 'その各要素の正負を反転する'(_ならび,_正負を反転したならび), '正負を反転したならびを表示する'(_正負を反転したならび). '5 つの要素を持つならびに対して'(_ならび) :- length(_ならび,5), write('5 つの実数を入力してください\n'), findall(_値,( '5 つの要素を実数で埋める'(_ならび,_値)), _ならび). '5 つの要素を実数で埋める'(_ならび,_値) :- append(L0,[_値|_],_ならび), length(L0,Len), writef('vx[%t] = ',[Len]), 実数の入力(_値). 実数の入力(_値) :- get_line(Line), 実数入力診断(Line,_値),!. 実数の入力(_値) :- 実数の入力(_値). 実数入力診断(Line,_値) :- atom_to_term(Line,_値,_), float(_値),!. 実数入力診断(Line,_値) :- writef('入力された %t からは実数が得られません。再入力をお願いします。\n',[Line]), fail. 'その各要素の正負を反転する'([],[]). 'その各要素の正負を反転する'([A|R1],[B|R2]) :- B is A * -1, 'その各要素の正負を反転する'(R1,R2). '正負を反転したならびを表示する'(_正負を反転したならび) :- append(L0,[_正負を反転された値|R],_正負を反転したならび), length(L0,Nth), writef('vx[%t] = %t\n',[Nth,_正負を反転された値]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/454 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 線形リスト構造で、整数を1つ入れる度にソートし、出力するプログラムを作成せよ # 配列はitem[11]とnext[11]を用意する。 # '線形リスト構造で、整数を1つ入れる度にソートし、出力する'(_線形リスト,_挿入されたリスト) :- writef('線形リストの初期値 = %t\n',[[]]), '整数を1つ入れる度に'(_整数), '線形リスト構造で、整数を1つ入れる度にソートし、出力する'(_線形リスト,_整数,_挿入されたリスト), 出力する(_挿入されたリスト). '線形リスト構造で、整数を1つ入れる度にソートし、出力する'([],_挿入整数,[_挿入整数]). '線形リスト構造で、整数を1つ入れる度にソートし、出力する'([A|R1],_挿入整数,[_挿入整数|R1]) :- A >= _挿入整数,!. '線形リスト構造で、整数を1つ入れる度にソートし、出力する'([A|R1],_挿入整数,[A|R1]) :- A < _挿入整数, '線形リスト構造で、整数を1つ入れる度にソートし、出力する'([A|R1],_挿入整数,R2). '整数を1つ入れる度に'(_整数) :- write('整数を1つ入れて下さい : '), get_line(Line), 整数入力診断(Line,_整数),!. '整数を1つ入れる度に'(_整数) :- '整数を1つ入れる度に'(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 出力する(_挿入されたリスト) :- writef('整列された線形リスト = %t\n',[[_挿入されたリスト]]). /* '線形リスト構造で、整数を1つ入れる度にソートし'(_線形リスト,_挿入整数,_挿入された線形リスト) :- append(L0,[A|R],_線形リスト), _挿入整数 =< A, append(L0,[_挿入整数,A|R],_挿入された線形リスト),!. '線形リスト構造で、整数を1つ入れる度にソートし'(_線形リスト,_挿入整数,_挿入された線形リスト) :- append(_線形リスト,[_挿入整数],_挿入された線形リスト). */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/421 # # [1] 授業単元:C言語 # [2] 問題文:ガウスの消去法を使ってn元連立方程式を解け # http://ime.nu/ideone.com/2GwBp # ガウスの消去法を使ってn元連立方程式を解け(_n元,_解ならび) :- 拡大係数行列を得る(_n元,_拡大係数行列), 既約ガウス行列に変形(_拡大係数行列,_既約ガウス行列), 最終列を取り出す(_既約ガウス行列,_解ならび). 拡大係数行列を得る(_n元,_拡大係数行列) :- M is _n元 + 1, length(_拡大係数行列,_n元), findall(_行,( append(Ln,[_行|R],_拡大係数行列), length(_行,M), length([_|Ln],_何行目), 係数の入力(_何行目,1,_n元,_行)), _拡大係数行列). 係数の入力(_何行目,1,_n元,_行) :- writef('%t行目 : ',[_何行目]), findall(_係数,( for(1,N,_n元), writef('A * X[%t] : ',[N]), 数を得る(_係数)), _係数ならび), write(' = A :'), 数を得る(_最後の係数), append(_係数ならび,[_最後の係数],_行),!. 最終列を取り出す(_行列,_最終列) :- 転置(_行列,_最終列), append(_,[_最終列],_転置された行列). 数を得る(_数) :- get_line(Line), 数を得る診断(Line,_数),!. 数を得る(_数) :- 数を得る(_数). 数を得る診断(Line,_数) :- atom_to_term(Line,_数,_), 数の形式検査(_数),!. 数を得る診断(Line,_数) :- writef('入力された %t からは適切な係数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 数の形式検査(_数) :- number(_数),!. 数の形式検査(_数1 / _数2) :- number(_数1), number(_数2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/400 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): #  入力された数値が素数か否かを判定し,結果を画面に出力せよ.ただし # #  .襦璽很仁瓩鮖箸κ法 #  ∈撞⊇萢を使う方法 #  上記のどちらも使わない方法 # #  のいずれについても解答する事. # '入力された数値が素数か否かを判定し,結果を画面に出力する'(_数) :- 入力された数値が(_入力された数値), '素数か否かを判定し,結果を画面に出力する'(_入力された数値). 入力された数値が(_入力された数値) :- write('1以上の整数を入力して下さい : '), get_line(Line), 入力された数値診断(Line,_入力された数値),!. 入力された数値が(_入力された数値) :- 入力された数値が(_入力された数値). 入力された数値診断(Line,_入力された数値) :- atom_to_term(Line,_入力された数値,_), integer(_入力された数値), _入力された数値 >= 1,!. 入力された数値診断(Line,_入力された数値) :- writef('入力された %t からは1以上の整数が得られません。再入力をお願いします\n',[Line]), fail. '素数か否かを判定し,結果を画面に出力する'(_入力された数値) :- 素数(_入力された数値), writef('%tは素数です\n',[_入力された数値]),!. '素数か否かを判定し,結果を画面に出力する'(_入力された数値) :- \+(素数(_入力された数値)), writef('%tは素数ではありません\n',[_入力された数値]). 素数(_数) :- 約数の個数(_数,_約数の個数), _約数の個数 =< 2. 約数の個数(_数,_約数の個数) :- _数_1 is _数 - 1, count(( for(1,N,_数_1), 0 is _数 mod N)), _約数の個数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/335 # # [1] 授業単元:楽しいプログラミング # [2] 問題文(含コード&リンク): 以下の実行例のように,三角形の2 辺の長さとその2 # 辺のなす角(0〜180[deg])を入力すると,もう1 辺の # 長さと,三角形の面積を表示するプログラムを作成せ # よ.π = 3.14159265 とする. #  [3.1] OS: linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限:2011年11月17日 9:00まで # [5] その他の制限: while, if, for, 配列まで # # 例 #  三角形の2 辺の長さを入力してください。 # 辺1:-3.0 # 正の値を入力してください。辺1:3.0 # 辺2:6.0 # 2 辺のなす角度[deg] を入力してください:200.0 # 0<角度[deg]<180 の値を入力してください。30.0 # もう1 辺の長さ= 3.717941 # 三角形の面積= 4.500000 # # '三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると,もう1 辺の長さと,三角形の面積を表示するプログラムを作成せよ.π = 3.14159265 とする' :- '三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると'(_辺の長さ_1,_辺の長さ_2,_2辺のなす角), もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角). '三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると'(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :- write('三角形の2 辺の長さを入力してください。 '), 辺の長さ_1の入力(_辺の長さ_1), 辺の長さ_2の入力(_辺の長さ_2), '2辺のなす角の入力'(_2辺のなす角). 辺の長さ_1の入力(_辺の長さ_1) :- write('辺[1] : '), get_line(Line), 辺の長さ_1の入力診断(Line,_辺の長さ_1),!. 辺の長さ_1の入力(_辺の長さ_1) :- 辺の長さ_1の入力(_辺の長さ_1). 辺の長さ_2の入力(_辺の長さ_2) :- write('辺[2] : '), get_line(Line), 辺の長さの入力診断(Line,_辺の長さ_2),!. 辺の長さ_2の入力(_辺の長さ_2) :- 辺の長さ_2の入力(_辺の長さ_2). 辺の長さの入力診断(Line,_辺の長さ) :- atom_to_term(Line,_辺の長さ,_), number(_辺の長さ), _辺の長さ > 0.0,!. 辺の長さの入力診断(Line,_辺の長さ) :- writef('入力された %t からは三角形の辺にあたる情報が得られません。再入力をお願いします。\n',[Line]), fail. '2辺のなす角の入力'(_2辺のなす角) :- write('2辺のなす角度を入力して下さい (0<角度<180) : '), get_line(Line), '2辺のなす角の入力診断'(Line,_2辺のなす角),!. '2辺のなす角の入力'(_2辺のなす角) :- '2辺のなす角の入力(_2辺のなす角). '2辺のなす角の入力診断'(Line,_2辺のなす角) :- atom_to_term(Line,_2辺のなす角), number(_2辺のなす角), _2辺のなす角 > 0.0, _2辺のなす角 < 180.0,!. '2辺のなす角の入力診断'(Line,_2辺のなす角) :- writef('入力された%t からは2辺のなす角を得られません。再入力をお願いします。\n',[Line]), fail. もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :- _辺の長さ_2 >= _辺の長さ_1, もう1辺の長さ(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_もう1辺の長さ), 三角形の面積(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_三角形の面積), 表示する(_もう1辺の長さ,_三角形の面積),!. もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :- _辺の長さ_2 < _辺の長さ_1, もう1辺の長さと三角形の面積を表示する(_辺の長さ_2,_辺の長さ_1,_2辺のなす角). もう1辺の長さ(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_もう1辺の長さ) :- _三角形の高さ is _辺の長さ_1 * sin(_2辺のなす角 / 180 * pi), _辺の長さ_2_1 is _辺の長さ_1 * cos(_2辺のなす角 / 180 * pi), _辺の長さ_2_2 is _辺の長さ_2 - _辺の長さ_2_1, _もう1辺の長さ is sqrt(_辺の長さ_2_2 * _辺の長さ_2_2 + _三角形の高さ * _三角形の高さ). 三角形の面積(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_三角形の面積) :- _三角形の高さ is _辺の長さ_1 * sin(_2辺のなす角 / 180 * pi), _三角形の面積 is _辺の長さ_2 * _三角形の高さ / 2. 表示する(_もう1辺の長さ,_三角形の面積) :- writef('%16c : %12r\n%16c : %12r\n',[もう1辺の長さ,_もう1辺の長さ,三角形の面積,_三角形の面積]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/211 # # [1] 授業単元:プログラミング入門 # [2] 問題文:秒数を与えると,それが何日何時間何分何秒にあた # るかを計算する関数 # calctime(long sec, int *dp, int *hp, int *mp, # int *sp); # を作成せよ.例えば # calctime(100000, &d, &h, &m, &s); # として呼び出すとd=1, h=3,m=46,s=40 となる # (100,000 秒=1 日3 時間46 分40 秒).以下の実行例の # ように,関数の動作を確認できるmain 関数も作成しろ # 実行例.秒数を入力してください:100000 # 100000 秒= 1 日3 時間46 分40 秒 # '秒数を与えると,それが何日何時間何分何秒にあたるかを計算する' 秒数を与えると(_秒数), それが何日何時間何分何秒にあたるかを計算する(_秒数,_何日,_何時間,_何分), 何日何時間何分にあたるかを表示する(_秒数,_何日,_何時間,_何分). 秒数を与えると(_秒数) :- write('秒数を入力してください:\n'), get_line(Line), 秒数入力診断(Line,_秒数),!. 秒数を与えると(_秒数) :- 秒数を与えると(_秒数). 秒数入力診断(Line,_秒数) :- atom_to_term(Line,_秒数,_), integer(_秒数), _秒数 >= 0,!. 秒数入力診断(Line,_秒数) :- writef('入力された %t からは適切な秒数が得られません。再入力をお願いします。\n',[Line]), fail. それが何日何時間何分何秒にあたるかを計算する(_秒数,_何日,_何時間,_何分) :- _何日 is _秒数 // 86400, _余りの一 is _秒数 mod 86400, _何時間 is _余り // 3600, _余りの二 is _余り mod 3600, _何分 is _余り // 60. 何日何時間何分にあたるかを表示する(_秒数,_何日,_何時間,_何分) :- writef('%t 秒= %t日%t時間%t分\n',[_秒数,_何日,_何時間,_何分]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/137 # # [1] 授業単元:基礎プロ # [2] 問題文(含コード&リンク): # キーボードから自然数 n を読み込む. # 読み込んだ自然数 n の階乗を計算する. # 計算結果を以下の実行例のように出力する. # # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > # # この動作をするプログラムを作成せよ # 'キーボードから自然数 n を読み込む.読み込んだ自然数 n の階乗を計算する.計算結果を以下の実行例のように出力する.' 'キーボードから自然数 n を読み込む'(_n), '読み込んだ自然数 n の階乗を計算する.'(_n,_階乗式の文字列表現,_nの階乗), '計算結果を以下の実行例のように出力する.'(_n,_階乗式の文字列表現,_nの階乗). 'キーボードから自然数 n を読み込む'(_n) :- 自然数を読み込む(_n). '読み込んだ自然数 n の階乗を計算する.'(_n,_1からnまでの数ならび,_nの階乗) :- findall(N,for(1,N,_n),_1からnまでの数ならび), mult(_1からnまでの数ならび,_nの階乗). /* findmult(_対象項,_実行項,_解) :- findall(_対象項,_実行項,L), mult(L,_解). */ mult([],1). mult([A|R],X) :- mult(R,Y), X is A * Y. '計算結果を以下の実行例のように出力する.'(_n,_1からnまでの数ならび,_nの階乗) :- concat_atom(_1からnまでのならび,' × ',_階乗式の表示用文字列), writef('%t! = %t = %t\n',[_n,_階乗式の表示用文字列,_nの階乗]). 自然数を読み込む(_自然数) :- write('自然数を入力 : '), get_line(Line), 自然数を読み込み診断(Line,_自然数),!. 自然数を読み込む(_自然数) :- 自然数を読み込む(_自然数). 自然数を読み込み診断(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 0,!. 自然数を読み込み診断(Line,_自然数) :- writef('入力された %t からは自然数が得られません。再入力をお願いします。\n',[Line]), fail. % % 何故findmult/3を使わなかったか? % % 目下の課題は以下の実行例をどのように述語定義の中に取り込むかだ % コメントはそのまま引数ゼロの述語として定義し、副目標として書いて置けばよいが % このような改行のある事例は述語アトムとして見やすいものにならない。 % /* # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/137 # # [1] 授業単元:基礎プロ # [2] 問題文(含コード&リンク): # キーボードから自然数 n を読み込む. # 読み込んだ自然数 n の階乗を計算する. # 計算結果を以下の実行例のように出力する. # # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > # # この動作をするプログラムを作成せよ # 'キーボードから自然数 n を読み込む.読み込んだ自然数 n の階乗を計算する.計算結果を以下の実行例のように出力する.' 'キーボードから自然数 n を読み込む'(_n), '読み込んだ自然数 n の階乗を計算する.'(_n,_階乗式の文字列表現,_nの階乗), '計算結果を以下の実行例のように出力する.'(_n,_階乗式の文字列表現,_nの階乗). 'キーボードから自然数 n を読み込む'(_n) :- 自然数を読み込む(_n). '読み込んだ自然数 n の階乗を計算する.'(_n,_1からnまでの数ならび,_nの階乗) :- findall(N,for(1,N,_n),_1からnまでの数ならび), concat_atom(_1からnまでの数ならび,'*',_階乗式の文字列表現), atom_to_term(_階乗式の文字列表現,_式,_), _nの階乗 is _式. '計算結果を以下の実行例のように出力する.'(_n,_1からnまでの数ならび,_nの階乗) :- concat_atom(_1からnまでのならび,' × ',_階乗式の表示用文字列), writef('%t! = %t = %t\n',[_n,_階乗式の表示用文字列,_nの階乗]). 自然数を読み込む(_自然数) :- write('自然数を入力 : '), get_line(Line), 自然数を読み込み診断(Line,_自然数),!. 自然数を読み込む(_自然数) :- 自然数を読み込む(_自然数). 自然数を読み込み診断(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 0,!. 自然数を読み込み診断(Line,_自然数) :- writef('入力された %t からは自然数が得られません。再入力をお願いします。\n',[Line]), fail. % % 目下の課題は以下の実行例をどのように述語定義の中に取り込むかだ % コメントはそのまま引数ゼロの述語として定義し、副目標として書いて置けばよいが % このような改行のある事例は述語アトムとして見やすいものにならない。 % /* # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/100 # # [1] 授業単元:C言語 # [2] 問題文 # 整数n(>=1)を入力し,nの約数の個数を返す関数int divisor(int)を用いてnが素数かどう # かを判定し,その結果を画面表示するプログラムを作成せよ. # '整数n(>=1)を入力し,nの約数の個数を返す述語を用いてnが素数かどうか判定する' :- '整数n(>=1)を入力し'(_n), 約数の個数(_n,_約数の個数), 素数かどうか判定する(_約数の個数,_判定), writef('%tは%t\n',[_n,_判定]). '整数n(>=1)を入力し'(_n) :- write('整数(>=1)を入力して下さい : '), get_line(Line), '整数n(>=1)を入力診断'(Line,_n),!. '整数n(>=1)を入力し'(_n) :- '整数n(>=1)を入力し'(_n). '整数n(>=1)を入力診断'(Line,_n) :- atom_to_term(Line,_n,_), integer(_n), _n >= 1,!. '整数n(>=1)を入力診断'(Line,_n) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '約数の個数'(_数,_約数の個数) :- _数_1 is _数 - 1, count(( for(1,N,_数_1), 0 is _数 mod N)), _約数の個数). 素数かどうか判定する(_約数の個数,素数です) :- _約数の個数 =< 2,!. 素数かどうか判定する(_約数の個数,素数ではない). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/84 # # [1] 授業単元:C言語 # [2] 問題文:10個の要素が格納できる配列を2つ宣言し、それぞれ任意の整数で初期化せよ。 # その後、この2つの配列の中身を入れ替えよ。 # '10個の要素が格納できるならびを2つ宣言し、それぞれ任意の整数で初期化する'(L1,L2) :- '10個の要素が格納できるならびを2つ宣言し'(_宣言名1,_宣言名2), 'それぞれ任意の整数で初期化する'(_宣言名1,_宣言名2). '10個の要素が格納できるならびを2つ宣言し'(_宣言名1,_宣言名2) :- '10個の要素が格納できるならびを宣言する'(_宣言名1), '10個の要素が格納できるならびを宣言する'(_宣言名2),!. '10個の要素が格納できるならびを宣言する'(_宣言名) :- length(L1,10), P =.. [_宣言名,L1], assertz(P). 'それぞれ任意の整数で初期化する'(_宣言名1,_宣言名2) :- 任意の整数で初期化する(_宣言名1), 任意の整数で初期化する(_宣言名2). 任意の整数で初期化する(_宣言名) :- P =.. [_宣言名,L], retract(P), 変数ならびを任意の整数で初期化する(L), assertz(P),!. 変数ならびを任意の整数で初期化する([]) :- !. 変数ならびを任意の整数で初期化する([N|R]) :- get_integer(N), 変数ならびを任意の整数で初期化する(R). get_integer(N) :- get_line(Line), 整数入力診断(Line,N),!. get_integer(N) :- get_integer(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数入力診断(Line,N) :- writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]), fail. 'その後、この2つのならびの中身を入れ替える'(_宣言名1,_宣言名2) :- 'この2つのならびの中身を'(_宣言名1,_宣言名2,L1,L2), 入れ替える(_宣言名1,_宣言名2,L1,L2),!. 'この2つのならびの中身を'(_宣言名1,_宣言名2,L1,L2) :- P1 =.. [_宣言名1,L1), P2 =.. [_宣言名2,L2), retract(P1), retract(P2),!. 入れ替える(_宣言名1,_宣言名2,L1,L2) :- P1_2 =.. [_宣言名1,L2], P2_2 =.. [_宣言名2,L1], assertz(P1_2), assertz(P2_2),!. % Prologにとって難題。 % % 実は「入れ替える」ということが普通にはできない。 % % 宣言するという事を述語としてassertすることとして捉えてみた。 % 'この2つの中味を'述語のretractのタイミングが相当に怪しい。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/59 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # プログラム例7.3.1をswitch文を使わずにif文、else if文を使うプログラムに変更しなさい。 # #include # # int main(void) # { # int x, z; # x=5; # z= x % 2; # switch(z) # { # case 0: # printf("x= %d は偶数です.\n",x); # break; # case 1: # printf("x= %dは奇数です.\n",x); # break; # default: # printf("xは負の数である可能性があります.\n"); # } # return 0; # # 変数xの値をキーボードから入力するように機能変更しなさい。 # プログラム例7.3.1 # http://www.dotup.org/uploda/www.dotup.org2233167.txt.html # '変数xの値をキーボードから入力して、奇数か偶数かを表示しなさい' :- '変数xの値をキーボードから入力して'(_x), '奇数か偶数かを表示しなさい'(_x). '変数xの値をキーボードから入力して'(_x) :- write('整数を入力して下さい : '), get_line(Line), '変数xの値をキーボードから入力診断'(Line,_x),!. '変数xの値をキーボードから入力して'(_x) :- '変数xの値をキーボードから入力して'(_x). '変数xの値をキーボードから入力診断'(Line,_x) :- atom_to_term(Line,_x,_), integer(_x),!. '変数xの値をキーボードから入力診断'(Line,_x) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '奇数か偶数かを表示しなさい'(_x) :- 0 is _x mod 2, writef('%tは偶数です.\n',[_x]),!. '奇数か偶数かを表示しなさい'(_x) :- 1 is _x mod 2, writef('%tは奇数です.\n',[_x]),!. '奇数か偶数かを表示しなさい'(_x) :- writef('%tは負の数である可能性があります.\n',[_x]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/10 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):例に示すように、二つの整数値を読み込んで、 #               小さい方の数以上で大きいほうの数以下の整数 #               を全て加えた値を表示するプログラムを作成せよ。 #               (例) #                  二つの整数を入力してください。 #                  整数1: 37 # 整数2: 28 # 28以上37以下の全整数の和は325です。 #                # '二つの整数値を読み込んで、小さい方の数以上で大きいほうの数以下の整数を全て加えた値を表示する' :- '二つの整数値を読み込んで、'(_二つの整数値), 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を(_二つの整数値,_小さい方の数,_大きい方の数,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値), 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を表示する(_小さい方の数,_大きい方の数,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値). '二つの整数値を読み込んで、'(_二つの整数値) :- write('二つの整数を入力して下さい。\n'), findall(_整数,( for(1,_何番目,2), 整数入力(_何番目,_整数)), _二つの整数値). 整数入力(_何番目,_整数) :- writef('整数%t: ',[_何番目]), get_line(Line), 整数入力診断(Line,_整数),!. 整数入力(_何番目,_整数) :- 整数入力(_何番目,_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を([N1,N2],N1,N2,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値) :- N1 =< N2, findsum(N,( for(N1,N,N2)), _小さい方の数以上で大きいほうの数以下の整数を全て加えた値). 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を([N1,N2],N2,N1,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値) :- N1 > N2, findsum(N,( for(N2,N,N1)), _小さい方の数以上で大きいほうの数以下の整数を全て加えた値). 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を表示する(_小さい方の数,_大きい方の数,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値) :- writef('%t以上%t以下の全整数を加えた値は%tです。\n',[_小さい方の数,_大きい方の数,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/980 # # [1] 授業単元:基礎C # [2] 問題文(含コード&リンク):以下の実行例のように,姓と名を入力すると,2 つの # 間にスペースを入れて連結した文字列を生成するプロ # グラムを作成せよ.姓と名はそれぞれ配列family[] と # first[] に,連結した文字列は配列fullname[] に格納 # すること.入力できる姓と名の長さはそれぞれ30 字ま # でとする。 # 例. Family name: Kouka # First name: Dai # Kouka Dai # '姓と名を入力すると,2つの間にスペースを入れて連結した文字列を生成する' :- 姓の入力(_姓), 名の入力(_名), '姓と名を入力すると,2つの間にスペースを入れて連結した文字列を生成する'(_姓,_名,_連結した文字列), writef('間にスペース入れて連結した文字列は「%t」\n',[_連結した文字列]). '姓と名を入力すると,2つの間にスペースを入れて連結した文字列を生成する'(_姓,_名,_間にスペースを入れて連結した文字列) :- concat_atom([_姓,_名],' ',_間にスペースを入れて連結した文字列). 姓の入力(_姓) :- write('姓名の姓を入力して下さい : '), get_line(_姓), 姓の入力診断(_姓),!. 姓の入力(_姓) :- 姓の入力(_姓). 姓の入力診断(_姓) :- atom(_姓), sub_atom(_姓,0,Len,0,_姓), Len =< 30,!. 姓の入力診断(_姓) :- writef('入力された %t は姓名の姓として適切でありません。再入力をお願いします。\n',[_姓]), fail. 名の入力(_名) :- write('姓名の名を入力して下さい : '), get_char(_名), 名の入力診断(_名),!. 名の入力(_名) :- 名の入力(_名). 名の入力診断(_名) :- atom(_名), sub_atom(_名,0,Len,0,_名), Len =< 30,!. 名の入力診断(_名) :- writef('入力された %t は姓名の名として適切でありません。再入力をお願いします。\n',[_名]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/929 # # [1] プログラミング # [2] 入力された整数が偶数だったら2で割り、奇数ならば3倍してから1足す # これを1になるまで繰り返し、かつ過程も出力するプログラムを作れ # '入力された整数が偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する' :- 入力された整数が(_入力された整数), '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_入力された整数). '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(1) :- 過程も出力する('受け取り整数が 1 になった為終了します。\n),!. '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_受け取り整数) :- 過程も出力する('新たに受け取った整数は %t です\n',[_受け取り整数]), 偶数だったら2で割り(_受け取り整数,_2で割った整数), '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_2で割った整数). '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_受け取り整数) :- 奇数ならば3倍してから1足す(_受け取り整数,_3倍してから1足した整数), '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_3倍してから1足した整数). 偶数だったら2で割り(_受け取り整数,_2で割った整数) :- 偶数だったら(_受け取り整数), 過程も出力する('%t は偶数でした\n',[_受け取り整数]), '2で割り'(_受け取り整数,_2で割った整数), 過程も出力する('受け取り整数 %t を2で割った整数は %t となりました\n',[_受け取り整数,_2で割った整数]),!. 奇数ならば3倍してから1足す(_受け取り整数,_3倍してから1足した整数) :- 奇数ならば(_受け取り整数), 過程も出力する('%t は奇数でした\n',[_受け取り整数]), '3倍してから1足す'(_受け取り整数,_3倍してから1足した整数), 過程も出力する('受け取り整数 %t を3倍してから1足した整数は %t となりました\n',[_受け取り整数,_3倍してから1足した整数]),!. 偶数だったら(_受け取り整数) :- 0 is _受け取り整数 mod 2. '2で割り'(_受け取り整数,_2で割った整数) :- _2で割った整数 is _受け取り整数 // 2. 奇数ならば(_受け取り整数) :- 1 is _受け取り整数 mod 2. '3倍してから1足す'(_受け取り整数,_3倍してから1足した整数) :- _3倍してから1足した整数 is _受け取り整数 * 3 + 1. 入力された整数が(_入力された整数) :- write('整数を入力して下さい : '), get_line(Line), 入力された整数診断(Line,_入力された整数),!. 入力された整数が(_入力された整数) :- 入力された整数が(_入力された整数). 入力された整数診断(Line,_入力された整数) :- atom_to_term(Line,_入力された整数,_), integer(_入力された整数),!. 入力された整数診断(Line,_入力された整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 過程も出力する(_出力フォーマット,_値ならび) :- writef(_出力フォーマット,_値ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/926 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # # 1以上の整数値を入力すると、以下の条件を満たすピラミッドをoxを使って表示するピラミッドを出力するプログラムを作成せよ # # *条件 # 1以上の奇数が入力された時のみピラミッドを表示し、それ以外の場合は「条件をみたしていないので表示しない」と出力する。 # ピラミッドの底辺の長さは入力された数値とする。 # # *実行例 # xxxo # xxooo # xooooo # ooooooo # # '1以上の整数値を入力すると、以下の条件を満たすピラミッドをoxを使って表示するピラミッドを出力する *条件 1以上の奇数が入力された時のみピラミッドを表示し、それ以外の場合は「条件をみたしていないので表示しない」と出力する。ピラミッドの底辺の長さは入力された数値とする。' :- '1以上の整数値を入力すると'(_1以上の整数), 'ピラミッドを表示する'(_1以上の整数). '1以上の整数値を入力すると'(_1以上の整数) :- write('1以上の整数値(奇数)を入力して下さい : '), get_line(Line), '1以上の整数値を入力診断,(Line,_1以上の整数),!. '1以上の整数値を入力すると'(_1以上の整数) :- '1以上の整数値を入力すると'(_1以上の整数). '1以上の整数値を入力診断'(Line,_1以上の整数) :- atom_to_term(Line,_1以上の整数,_), '1以上の奇数が入力された時のみ'(_1以上の整数),!. '1以上の整数値を入力診断'(Line,_1以上の整数) :- write('条件をみたしていないので表示しない\n'), fail. '1以上の奇数が入力された時のみ'(_1以上の整数),!. _1以上の整数 >= 1, 奇数である(_1以上の整数),!. ピラミッドを表示する(_1以上の整数) :- length(L,_1以上の整数), append(L1,[_|L1],L), length(L1,Len), all(L1,'x'), ピラミッドを表示する(_1以上の整数,L1). ピラミッドを表示する(_1以上の整数,[]) :- length(L,_1以上の整数), all(L,o), put_list_ln(L). ピラミッドを表示する(_1以上の整数,[A|L1]) :- length(L,_1以上の整数), append([A|L1],L2,[A|L1],L), all(L2,o), put_list_ln(L), ピラミッドを表示する(_1以上の整数,L1). 奇数である(N) :- 1 is N mod 2. put_list_ln([]) :- write('\n'). put_list_ln([A|R]) :- put_char(A), put_list_ln(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/926 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # # 1以上の整数値を入力すると、以下の条件を満たすピラミッドをoxを使って表示するピラミッドを出力するプログラムを作成せよ # # *条件 # 1以上の奇数が入力された時のみピラミッドを表示し、それ以外の場合は「条件をみたしていないので表示しない」と出力する。 # ピラミッドの底辺の長さは入力された数値とする。 # # *実行例 # xxxo # xxooo # xooooo # ooooooo # # '1以上の整数値を入力すると、以下の条件を満たすピラミッドをoxを使って表示するピラミッドを出力する *条件 1以上の奇数が入力された時のみピラミッドを表示し、それ以外の場合は「条件をみたしていないので表示しない」と出力する。ピラミッドの底辺の長さは入力された数値とする。' :- '1以上の整数値を入力すると'(_1以上の整数), 'ピラミッドを表示する'(_1以上の整数). '1以上の整数値を入力すると'(_1以上の整数) :- write('1以上の整数値(奇数)を入力して下さい : '), get_line(Line), '1以上の整数値を入力診断,(Line,_1以上の整数),!. '1以上の整数値を入力すると'(_1以上の整数) :- '1以上の整数値を入力すると'(_1以上の整数). '1以上の整数値を入力診断'(Line,_1以上の整数) :- atom_to_term(Line,_1以上の整数,_), '1以上の奇数が入力された時のみ'(_1以上の整数),!. '1以上の整数値を入力診断'(Line,_1以上の整数) :- write('条件をみたしていないので表示しない\n'), fail. '1以上の奇数が入力された時のみ'(_1以上の整数),!. _1以上の整数 >= 1, 奇数である(_1以上の整数),!. ピラミッドを表示する(_1以上の整数) :- length(L,_1以上の整数), append(L1,[_|L1],L), length(L1,Len), all(L1,'x'), ピラミッドを表示する(_1以上の整数,L1). ピラミッドを表示する(_1以上の整数,[]) :- length(L,_1以上の整数), all(L,o), put_list_ln(L). ピラミッドを表示する(_1以上の整数,[A|L1]) :- length(L,_1以上の整数), append([A|L1],L2,[A|L1],L), all(L2,o), put_list_ln(L), ピラミッドを表示する(_1以上の整数,L1). 奇数である(N) :- 1 is N mod 2. put_list_ln([]) :- write('\n'). put_list_ln([A|R]) :- put_char(A), put_list_ln(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/881 # # 【2】 # # # 2次元配列の問題です # m行n列の配列aの # 各行ごとの合計 gyouwa[i] i=0,1,・・・,m # 各列ごとの合計 retuwa[j] j=0,1,・・・,n # を計算するプログラムの作成をお願いします # # •行列サイズ m,n は実行時に 100以内であれば自由に設定してデータを再入力させる機能をつける # ◦配列サイズの上限はプログラム中で配列を宣言するとき「100 個」として下さい。これは,プログラム中で大き目の配列を宣言しておいて,指定されたサイズに応じて必要分を使うための練習です。 # # 【3】c言語 # 【4】10月30日まで # # 'm行n列の配列aの各行ごとの合計 gyouwa[i] i=0,1,・・・,m各列ごとの合計 retuwa[j] j=0,1,・・・,nを計算する'(LL,_行の和ならび,_列の和ならび) :- 行の和ならびを求める(LL,_行の和ならび), 列の和ならびを求める(LL,_列の和ならび). 行の和ならびを求める(LL,_行の和ならび) :- findall(_行の和,( append(_,[L|_],LL), sum(L,_行の和)), _行の和ならび). 列の和ならびを求める(LL,_列の和ならび) :- 転置(LL,LL2), 行の和ならびを求める(LL2,_列の和ならび). '指定したサイズの行列にキーボードから入力して、各行ごとの合計と各列ごとの合計を求める'(_行列,_行の和ならび,_列の和ならび) :- '指定したサイズの行列にキーボードから入力して'(_行列), 行の和ならびを求める(_行列,_行の和ならび), 列の和ならびを求める(_行列,_列の和ならび). '指定したサイズの行列にキーボードから入力して'(_行列) :- 指定したサイズの(_行数,_列数), 行列にキーボードから入力して(_行数,_列数,_行列). '指定したサイズの行列に乱数を使って値を埋め、各行ごとの合計と各列ごとの合計を求める'(_行列,_行の和ならび,_列の和ならび) :- '指定したサイズの行列に乱数を使って値を埋め'(_行列), 行の和ならびを求める(_行列,_行の和ならび), 列の和ならびを求める(_行列,_列の和ならび). '指定したサイズの行列に乱数を使って値を埋め'(_行列) :- 指定したサイズの(_行数,_列数), 行列に乱数を使って値を埋め(_行数,_列数,_行列). 指定したサイズの(_行数,_列数) :- 行数の入力(_行数), 列数の入力(_列数). 行数の入力(_行数) :- write('行数を入力してください : '), get_line(Line), 行数の入力診断(Line,_行数),!. 行数の入力(_行数) :- 行数の入力(_行数). 行数の入力診断(Line,_行数) :- atom_to_term(Line,_行数,_), integer(_行数), _行数 >= 1, _行数 =< 100,!. 行数の入力診断(Line,_行数) :- write('入力された%tからは適切な行数が得られません。再入力をお願いします。\n',[Line]), fail. 列数の入力(_列数) :- write('列数を入力してください : '), get_line(Line), 列数の入力診断(Line,_列数),!. 列数の入力(_列数) :- 列数の入力(_列数). 列数の入力診断(Line,_列数) :- atom_to_term(Line,_列数,_), integer(_列数), _列数 >= 1, _列数 =< 100,!. 列数の入力診断(Line,_列数) :- write('入力された%tからは適切な列が得られません。再入力をお願いします。\n',[Line]), fail. 行列にキーボードから入力して(_行数,_列数,_行列) :- length(_行列,_行数), findall(_行,( append(L01,[_行|_],_行列), 行の値をキーボードから入力する(_行,L01,_列数)), _行列). 行の値をキーボードから入力する(_行,L01,_列数) :- length(_行,_列数), findall(_列の値,( append(L02,[_|_],_行), 行列要素の値の入力(L01,L02,_列の値)), _行). 行列要素の値の入力(L01,L02,_列の値) :- 行列要素の位置を求める(L01,L02,M行,N列), writef('%t行%t列の値 : ',[M行,N列]), get_integer(_列の値). 行列要素の位置を求める(L01,L02,M行,N列) :- length([_|L01],M行), length([_|L02],N列). 行列に乱数を使って値を埋め(_行数,_列数,_行列) :- length(_行列,_行数), findall(_行,( append(_,[_行|_],_行列), 行を乱数値で埋める(_行,_列数)), _行列). 行を乱数値で埋める(_行,_列数) :- length(_行,_列数), findall(_列の値,( append(_,[_|_],_行), '-100~100の範囲の値を入力'(_列の値)), _行). '-100~100の範囲の値を入力'(_列の値) :- _列の値 is (random(200)+1) - 100). % % 行列の転置述語は 転置/2 は http://nojiriko.asia/prolog/gyoretsu_no_tenchi.html % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/876 # # [1] 授業単元:プログラム作成 # [2]D, C, B, A, S, Invalid という成績を表す列挙体 # enum result を定義し,点数(int 型)を引数として # enum result 型の値を返す関数 # seiseki_hantei(int sc) # と,enum result 型の値を引数として,成績を表示する関数も作成する # 点数と成績は以下の通とする # 0〜59 点: D # 60〜69 点: C # 70〜79 点: B # 80〜89 点: A # 90〜100 点: S # それ以外: Invalid # # # る関数 # print_seiseki(enum result res) # を作成せよ.この2 つの関数を使用して,以下の実行例 # のように点数を入力すると成績を表示するmain 関数も # 作成すること.点数と成績の関係は以下の通りとする. # 例. # 点数(整数)を入力してください:91 # 成績はS です。 # '成績を入力して判定し、それを表示する' :- 成績を入力して(_成績), 成績を判定し(_成績,_判定), 判定を表示する(_判定). 成績を入力して(_成績) :- write('点数(整数)を入力してください:'), get_line(Line), 成績入力診断(Line,_成績),!. 成績を入力して(_成績) :- 成績を入力して(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績),!. 成績入力診断(Line,_成績) :- writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[Line]), fail. 成績判定を判定し(_成績,'D') :- _成績 >= 0, _成績 =< 59,!. 成績判定を判定し(_成績,'C') :- _成績 >= 60, _成績 =< 69,!. 成績判定を判定し(_成績,'B') :- _成績 >= 70, _成績 =< 79,!. 成績判定を判定し(_成績,'A') :- _成績 >= 80, _成績 =< 89,!. 成績判定を判定し(_成績,'S') :- _成績 >= 90, _成績 =< 100,!. 成績判定を判定し(_,異常値). 判定を表示する(_判定) :- writef('判定は%tです\n',[_判定]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/876 # # [1] 授業単元:プログラム作成 # [2]D, C, B, A, S, Invalid という成績を表す列挙体 # enum result を定義し,点数(int 型)を引数として # enum result 型の値を返す関数 # seiseki_hantei(int sc) # と,enum result 型の値を引数として,成績を表示する関数も作成する # 点数と成績は以下の通とする # 0〜59 点: D # 60〜69 点: C # 70〜79 点: B # 80〜89 点: A # 90〜100 点: S # それ以外: Invalid # # # る関数 # print_seiseki(enum result res) # を作成せよ.この2 つの関数を使用して,以下の実行例 # のように点数を入力すると成績を表示するmain 関数も # 作成すること.点数と成績の関係は以下の通りとする. # 例. # 点数(整数)を入力してください:91 # 成績はS です。 # 成績判定表(0,59,'D'). 成績判定表(60,69,'C'). 成績判定表(70,79,'B'). 成績判定表(80,89,'A'). 成績判定表(90,100,'S'). 成績判定表(minint,maxint,異常値). '成績を入力して判定し、それを表示する' :- 成績を入力して(_成績), 成績を判定し(_成績,_判定), 判定を表示する(_判定). 成績を入力して(_成績) :- write('点数(整数)を入力してください:'), get_line(Line), 成績入力診断(Line,_成績),!. 成績を入力して(_成績) :- 成績を入力して(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績),!. 成績入力診断(Line,_成績) :- writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[Line]), fail. 成績を判定し(_点数,_判定) :- 成績判定表(_下限,_上限,_判定), _成績 >= _下限, _成績 =< _上限,!. 判定を表示する(_判定) :- writef('判定は%tです\n',[_判定]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/876 # # [1] 授業単元:プログラム作成 # [2]D, C, B, A, S, Invalid という成績を表す列挙体 # enum result を定義し,点数(int 型)を引数として # enum result 型の値を返す関数 # seiseki_hantei(int sc) # と,enum result 型の値を引数として,成績を表示する関数も作成する # 点数と成績は以下の通とする # 0〜59 点: D # 60〜69 点: C # 70〜79 点: B # 80〜89 点: A # 90〜100 点: S # それ以外: Invalid # # # る関数 # print_seiseki(enum result res) # を作成せよ.この2 つの関数を使用して,以下の実行例 # のように点数を入力すると成績を表示するmain 関数も # 作成すること.点数と成績の関係は以下の通りとする. # 例. # 点数(整数)を入力してください:91 # 成績はS です。 # 判定ならび(['D','C','B','A','S','異常値']). 成績判定表(0,59,'D'). 成績判定表(60,69,'C'). 成績判定表(70,79,'B'). 成績判定表(80,89,'A'). 成績判定表(90,100,'S'). 成績判定表(minint,maxint,異常値). '成績を入力して判定し、それを表示する' :- 成績を入力して(_成績), 判定ならび(_判定ならび), member(_判定,_判定ならび), 成績を判定し(_成績,_判定), 判定を表示する(_判定). 成績を入力して(_成績) :- write('点数(整数)を入力してください:'), get_line(Line), 成績入力診断(Line,_成績),!. 成績を入力して(_成績) :- 成績を入力して(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績),!. 成績入力診断(Line,_成績) :- writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[Line]), fail. 成績を判定し(_点数,_判定) :- 成績判定表(_下限,_上限,_判定), _成績 >= _下限, _成績 =< _上限,!. 判定を表示する(_判定) :- writef('判定は%tです\n',[_判定]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/876 # # [1] 授業単元:プログラム作成 # [2]D, C, B, A, S, Invalid という成績を表す列挙体 # enum result を定義し,点数(int 型)を引数として # enum result 型の値を返す関数 # seiseki_hantei(int sc) # と,enum result 型の値を引数として,成績を表示する関数も作成する # 点数と成績は以下の通とする # 0〜59 点: D # 60〜69 点: C # 70〜79 点: B # 80〜89 点: A # 90〜100 点: S # それ以外: Invalid # # # る関数 # print_seiseki(enum result res) # を作成せよ.この2 つの関数を使用して,以下の実行例 # のように点数を入力すると成績を表示するmain 関数も # 作成すること.点数と成績の関係は以下の通りとする. # 例. # 点数(整数)を入力してください:91 # 成績はS です。 # 判定ならび(['D','C','B','A','S','異常値']). 成績判定表(0,59,'D'). 成績判定表(60,69,'C'). 成績判定表(70,79,'B'). 成績判定表(80,89,'A'). 成績判定表(90,100,'S'). 成績判定表(minint,maxint,異常値). '成績を入力して判定し、それを表示する' :- 成績を入力して(_成績), 成績を判定し(_成績,_判定), 判定を表示する(_判定). 成績を入力して(_成績) :- write('点数(整数)を入力してください:'), get_line(Line), 成績入力診断(Line,_成績),!. 成績を入力して(_成績) :- 成績を入力して(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績),!. 成績入力診断(Line,_成績) :- writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[Line]), fail. 成績を判定し(_点数,_判定) :- 判定ならび(_判定ならび), member(_判定,_判定ならび), 成績判定表(_下限,_上限,_判定), _成績 >= _下限, _成績 =< _上限,!. 判定を表示する(_判定) :- writef('判定は%tです\n',[_判定]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/876 # # [1] 授業単元:プログラム作成 # [2]D, C, B, A, S, Invalid という成績を表す列挙体 # enum result を定義し,点数(int 型)を引数として # enum result 型の値を返す関数 # seiseki_hantei(int sc) # と,enum result 型の値を引数として,成績を表示する関数も作成する # 点数と成績は以下の通とする # 0〜59 点: D # 60〜69 点: C # 70〜79 点: B # 80〜89 点: A # 90〜100 点: S # それ以外: Invalid # # # る関数 # print_seiseki(enum result res) # を作成せよ.この2 つの関数を使用して,以下の実行例 # のように点数を入力すると成績を表示するmain 関数も # 作成すること.点数と成績の関係は以下の通りとする. # 例. # 点数(整数)を入力してください:91 # 成績はS です。 # :- op(250,xfx,'〜'). :- op(280,xf,'点'). :- op(300,xfx,':'). 成績判定表(0 〜 59 点 : 'D'). 成績判定表(60 〜 69 点 : 'C'). 成績判定表(70 〜 79 点 : 'B'). 成績判定表(80 〜 89 点 : 'A'). 成績判定表(90 〜 100 点 : 'S'). '成績を入力して判定し、それを表示する' :- 成績を入力して(_成績), 成績を判定し(_成績,_判定), 判定を表示する(_判定). 成績を入力して(_成績) :- write('点数(整数)を入力してください:'), get_line(Line), 成績入力診断(Line,_成績),!. 成績を入力して(_成績) :- 成績を入力して(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績),!. 成績入力診断(Line,_成績) :- writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[Line]), fail. 成績を判定し(_点数,_判定) :- 成績判定表(_下限 〜 _上限 点 : _判定), _成績 >= _下限, _成績 =< _上限,!. 成績を判定し(_,成績が異常値). 判定を表示する(_判定) :- writef('判定は%tです\n',[_判定]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/858 # # # 5人の学生の成績(100点満点)の値をキーボードから読み込み,それらの平均点と分散(標準偏差の二乗)を求めるプログラムを作れ。 # # # 授業の課題です # 解説付きでお願いします。 # # '5人の学生の成績(100点満点)の値をキーボードから読み込み,それらの平均点と分散(標準偏差の二乗)を求める' :- '5人の学生の成績(100点満点)の値をキーボードから読み込み'(_5人の学生の成績ならび), 'それらの平均点と分散(標準偏差の二乗)を求める'(_5人の学生の成績ならび,_平均点,_分散), append(_5人の学生の成績ならび,[_平均点,_分散],_表示情報), writef('%t,%t,%t,%t,%t の 平均点は %t, 分散は %t です。\n,_表示情報). '5人の学生の成績(100点満点)の値をキーボードから読み込み'(_5人の学生の成績ならび) :- length(_5人の学生の成績ならび,5), findall(_成績,( append(L0,[_成績|_],_5人の学生の成績ならび), length([_|L0],_何個目), write('成績(0-100点)の[%t個目]を入力してください : ',[_何個目]), 成績入力(_成績)), _5人の学生の成績ならび). 成績入力(_成績) :- get_line(Line), 成績入力診断(Line,_成績),!. 成績入力(_成績) :- 成績入力(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績), _成績 >= 0, _成績 =< 100,!. 成績入力診断(Line,_成績) :- writef('入力された %t からは成績(0-100点)が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'それらの平均点と分散(標準偏差の二乗)を求める'(_5人の学生の成績ならび,_平均点,_分散) :- それらの平均点と(_5人の学生の成績ならび,_平均点), 分散を求める(_5人の学生の成績ならび,_分散). それらの平均点と(_5人の学生の成績ならび,_平均点) :- findavg(_成績,( append(_,[_成績|_],_5人の学生の成績ならび)), _平均点). 分散を求める(_5人の学生の成績ならび,_平均点,_分散) :- findavg(_偏差,( append(_,[_成績|_],_5人の学生の成績ならび), _偏差 is (_成績 - _平均点) * (_成績 - _平均点)), _分散). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/849 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # プログラム例6.3.1を配列変数xの要素数(変数memberの値)と各要素の値をキーボードから入力するように変更しなさい。 # プログラム例6.3.1 # #include <stdio.h> # # int main(void) # { # int x[10] = {80, 56, 68, 75, 45, 100, 92, 73, 63, 95}; # int member = 10; # int total; # float average; # int i; # for (i = 0, total = 0; i < member; ++i ) # total += x[i]; # average = (float)total / (float)member; # printf("総和=%d\n",total); # printf("平均点=%7.2f\n", average); # return 0; # } # # 設問1-2 # 上記設問1-1と同じ配列変数xの要素をその並びを逆順にして配列変数yへ代入し、yの全要素を表示するプログラムを作りなさい。 # '要素数と各要素の値を逆順にキーボードから入力して、その総和と平均点を求める' :- '要素数とならびの各要素を逆順に入力して'(_要素数,_ならび), 全要素を表示する(_逆順ならび). '要素数とならびの各要素を逆順に入力して'(_要素数,_逆順ならび) :- 要素数の入力(_要素数), length(Ln,_要素数), ならびを逆順に入力([],Ln,[],_逆順ならび). 要素数の入力(_要素数) :- write('要素数を入力してください : '), get_line(Line), 要素数入力診断(Line,_要素数),!. 要素数の入力(_要素数) :- 要素数の入力(_要素数). 要素数入力診断(Line,_要素数) :- atom_to_term(Line,_要素数,_), integer(_要素数), _要素数 > 0,!. 要素数入力診断(Line,_要素数) :- writef('入力された %t からは適切な要素数が得られませんでした。再入力をお願いします。\n',[Line]), fail. ならびを逆順に入力(Ln,Ln,_逆順ならび,_逆順ならび) :- !. ならびを逆順に入力(L0,Ln,L,_逆順ならび) :- length([_|L0],_何番目), writef('%t番目の数値を入力してください : '), 値の入力(_値), ならびを逆順に入力([_|L0],Ln,[_値|L],_逆順ならび). 値の入力(_値) :- get_line(Line), 値の入力診断(Line,_値),!. 値の入力(_値) :- 値の入力(_値). 値の入力診断(Line,_値) :- atom_to_term(Line,_値,_), number(_値),!. 値の入力診断(Line,_値) :- writef('入力された%tからは数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. 全要素を表示する([]). 全要素を表示する([_要素]) :- writef('%t\n',[_要素]),!. 全要素を表示する([_要素|R]) :- writef('%t ',[_要素]), 全要素を表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/849 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # プログラム例6.3.1を配列変数xの要素数(変数memberの値)と各要素の値をキーボードから入力するように変更しなさい。 # プログラム例6.3.1 # #include <stdio.h> # # int main(void) # { # int x[10] = {80, 56, 68, 75, 45, 100, 92, 73, 63, 95}; # int member = 10; # int total; # float average; # int i; # for (i = 0, total = 0; i < member; ++i ) # total += x[i]; # average = (float)total / (float)member; # printf("総和=%d\n",total); # printf("平均点=%7.2f\n", average); # return 0; # } # # 設問1-2 # 上記設問1-1と同じ配列変数xの要素をその並びを逆順にして配列変数yへ代入し、yの全要素を表示するプログラムを作りなさい。 # '要素数と各要素の値をキーボードから入力して、その総和と平均点を求める' :- '要素数とならびの各要素を入力して'(_要素数,_ならび), その総和と平均点を求める(_要素数,_ならび,_総和,_平均点), writef('総和=%t 平均点= %7c\n',[_総和,_平均点]). '要素数とならびの各要素を入力して'(_要素数,_ならび) :- 要素数の入力(_要素数), ならびの入力(_要素数,_ならび). 要素数の入力(_要素数) :- write('要素数を入力してください : '), get_line(Line), 要素数入力診断(Line,_要素数),!. 要素数の入力(_要素数) :- 要素数の入力(_要素数). 要素数入力診断(Line,_要素数) :- atom_to_term(Line,_要素数,_), integer(_要素数), _要素数 > 0,!. 要素数入力診断(Line,_要素数) :- writef('入力された %t からは適切な要素数が得られませんでした。再入力をお願いします。\n',[Line]), fail. ならびの入力(_要素数,_ならび) :- length(_ならび,_要素数), findall(_値,( append(L0,[_値|_],_ならび), length([_|L0],_何番目), writef('%t番目の数値を入力してください : '), 値の入力(_値)), _ならび). 値の入力(_値) :- get_line(Line), 値の入力診断(Line,_値),!. 値の入力(_値) :- 値の入力(_値). 値の入力診断(Line,_値) :- atom_to_term(Line,_値,_), number(_値),!. 値の入力診断(Line,_値) :- writef('入力された%tからは数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. その総和と平均点を求める(_要素数,_ならび,_総和,_平均点) :- sum(_ならび,_総和), _平均点 is _総和 / _要素数. sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/845 # # 台形近似法を用いてf(x)=cos(x)を任意の範囲で積分するプログラムを # ユーザ関数を定義して作成しなさい. # その際の区分間距離も任意に入力できるようにすること。 # # 実行例 # 積分範囲を入力せよ # x0 = 0 # xl = 10 # 区分間距離を入力せよ # length = 1 # ans = 9.949055 # 積分範囲を入力せよ # x0 = 0 # xl = 100 # 区分間距離を入力せよ # length = 5 # ans = 49.588107 # # お願いします。 # # f(X,Y) :- Y is cos(X). '台形近似法を用いてf(x)=cos(x)を任意の範囲で積分する 区分間距離は任意に入力できるようにする' :- 積分範囲を入力する(_積分範囲下限,_積分範囲上限), 区分間距離を入力する(_区分間距離), f(_積分範囲下限,Y_1), '台形近似法を用いて積分する'(_積分範囲下限,Y_1,_積分範囲上限,_区分間距離,_積分値), writef('f(x)=cos(x) x範囲 %t-%t の積分値は %t です。\n',[_積分範囲下限,_積分範囲上限,_積分値]). 積分範囲を入力する(_積分範囲下限,_積分範囲上限) :- write('積分範囲を入力してください\n積分範囲下限(実数) : '), 実数入力(_積分範囲下限), write('積分範囲上限(実数) : '), 実数入力(_積分範囲上限), _積分範囲上限 > _積分範囲下限,!. 積分範囲を入力する(_積分範囲下限,_積分範囲上限) :- 積分範囲を入力する(_積分範囲下限,_積分範囲上限). 実数入力(_実数) :- get_line(Line), 実数入力診断(Line,_実数),!. 実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 実数入力診断(Line,_実数) :- writef('入力された %t は実数表現になっていません。再入力をお願いします。\n',[Line]), fail. 区分間距離を入力する(_区分間距離) :- write('区分間距離を入力してください : '), 実数入力(_区分間距離),!. 区分間距離を入力する(_区分間距離) :- 区分間距離を入力する(_区分間距離). '台形近似法を用いて積分する'(K,_,_積分範囲上限,_区分間距離,0.0) :- K >= _積分範囲上限,!. '台形近似法を用いて積分する'(X_1,Y_1,_積分範囲上限,_区分間距離,_積分値) :- X_2 is X_1 + _区分間距離, f(X_2,Y_2), _台形面積 is (_Y_1 + _Y_2) * _区分間距離 / 2, '台形近似法を用いて積分する'(X_2,Y_2,_積分範囲上限,_区分間距離,_積分値_2), _積分値 is _台形面積 + _積分値_2. % 以下のサイトは # [1] 授業単元:C言語基礎 # [2] 問題文(含コード&リンク): # # 明治元年以降の西暦年を4桁の数で入力すると、 # 和暦で年を表示するプログラムを作成せよ。 # ただし、2つの元号を持つ年 # は両方の年を表示すること。 # (例: 1989年 → 昭和64年、平成元年) # # (2つの元号を持つ年の扱いについては # 余裕がある人は、月、日も入れて、その日の正しい # 元号を表示することによって元号を一つ表示す # るプログラムとしてもよい。) # 提出例 # === プログラム === # #include <stdio.h> # int main() # { # '明治元年以降の西暦年を4桁の数で入力すると、和暦で年を表示するプログラムを作成せよ。ただし、2つの元号を持つ年は両方の年を表示すること。' :- '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年), '入力された西暦を示す4桁の数から和暦で年を表示する'(_西暦年). '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年) :- write('明治元年以降の西暦年を4桁の数で入力 : '), 整数を得る(_西暦年), '明治元年以降の西暦年を4桁の数入力検査'(_西暦年),!. '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年) :- '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年). '明治元年以降の西暦年を4桁の数入力検査'(_西暦年) :- _西暦年 =< 9999, 元号期間(明治,_明治元年の西暦,_,_,_,_,_), _西暦年 >= _明治元年の西暦,!. '明治元年以降の西暦年を4桁の数入力検査'(Line,_西暦年) :- writef('入力された %t からは明治元年以降の西暦を示す整数は得られません。再入力をお願いします。\n',[Line]), fail. '入力された西暦を示す4桁の数から和暦で年を表示する'(_西暦年) :- findall(_和暦,( 西暦から和暦を得る(_西暦年,_和暦)), _和暦ならび), 和暦を表示する(_西暦年,_和暦ならび). '西暦から和暦を得る'(_西暦年,_和暦) :- 元号期間(_元号,_開始年,_,_,_終了年,_,_), _西暦年 >= _開始年, _西暦年 =< _終了年, 元号の開始年から和暦を得る(_西暦,_開始年,_和暦年), atomic_list_concat([_元号,_和暦年],_和暦). 元号の開始年から和暦年を得る(_西暦年,_開始年,_和暦年) :- _元号年 is _西暦年 - _開始年 + 1, 数字年和暦年変換(_元号年,_和暦年). 数字年和暦年変換(1,元年) :- !. 数字年和暦年変換(_西暦,_和暦年) :- 九十九までの和数字変換(_数字,_和数字), atomic_list_concat([_和数字,年],_和暦年),!. 九十九までの和数字変換(0,''). 九十九までの和数字変換(1,一). 九十九までの和数字変換(2,ニ). 九十九までの和数字変換(3,三). 九十九までの和数字変換(4,四). 九十九までの和数字変換(5,五). 九十九までの和数字変換(6,六). 九十九までの和数字変換(7,七). 九十九までの和数字変換(8,八). 九十九までの和数字変換(9,九). 九十九までの和数字変換(_数字,_和数字) :- 十から十九までの和数字変換(数字,_和数字). 九十九までの和数字変換(_数字,_和数字) :- 二十以上の和数字変換(_数字,_和数字). 十から十九までの和数字変換(_数字,_和数字) :- _数字 >= 10, _数字 =< 19, M is _数字 mod 10, 九十九までの和数字変換(M,M2), atomic_list_concat([十,_和数字一の桁],_和数字). 二十以上の和数字変換(_数字,_和数字) :- _数字 >= 20, _数字 =< 99, 一の桁の変換(_数字,_和数字一の桁), 十の桁の変換(_数字,_和数字十の桁), atomic_list_concat([_和数字十の桁,十,_和数字一の桁],_和数字). 一の桁の変換(_数字,_和数字一の桁) :- _一の桁の数字 is _数字 mod 10, 九十九までの和数字変換(_一の桁の数字,_和数字一の桁). 十の桁の変換(_数字,_和数字十の桁) :- _十の桁の数字 is _数字 // 10, 九十九までの和数字変換(_十の桁の数字,_和数字十の桁). 和暦を表示する(_西暦,[_和暦]) :- writef('西暦%t年は和暦では%tです。\n',[_西暦,_和暦]),!. 和暦を表示する(_西暦,[_和暦_1,_和暦_2]) :- writef('西暦%t年は和暦では%tか%tです。\n',[_西暦,_和暦_1,_和暦_2]),!. 元号の最終日と元号の開始日が一致する日(_年,_月,_日,_先の元号,_後の元号,_改元施行注釈) :- 元号期間(_先の元号,_年,_月,_日,_), 元号期間(_後の元号,_年,_月,_日,_改元施行注釈),!. 元号期間(明治,1868,1,1,1912,7,30). 元号期間(大正,1912,7,30,1926,12,25). 元号期間(昭和,1926,12,25,1989,1,7). 元号期間(平成,1989,1,8,_年,_月,_日) :- 今日(_年,_月,_日). 改元日(明治,1868,1,25,'改元は1月1日に遡って施行された') :- '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'. 改元日(大正,1912,7,30,'改元は即日施行された') :- '改元は即日施行された'. 改元日(昭和,1926,12,25,'改元は即日施行された') :- '改元は即日施行された'. 改元日(平成,1989,1,7,'改元は翌日から施行された') :- '改元は翌日から施行された'. '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'. '改元は即日施行された'. '改元は翌日から施行された'. 今日(_年,_月,_日) :- shs(date,S), split(S,[' ',年,月,日],[_年,_月,_日|_]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/829 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # ユーザーに入力させた半角英数字の文字列を、char型配列に入れ、一字ずつずらして表示させるプログラムの作成。 # 入力された順番と同じになったら表示終了とする。 # 例 abcd # bcda # cdab #   dabc # abcd # # ポインタを使うと思います。それから、strlen(c)を使うようです。 # 'ユーザーに入力させた半角英数字の文字列を、char型配列に入れ、一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。' :- 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列). 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列) :- write('半角英数字の文字列を入力してください : '), get_line(Line), 'ユーザーに入力させた半角英数字の文字列入力検査'(Line,_半角英数字の文字列),!. 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列) :- 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列). 'ユーザーに入力させた半角英数字の文字列入力検査'(Line,Line) :- atom_codes(Line,Codes), \+((append(_,[N|_],Codes), 半角英数字のコード(N))),!. 'ユーザーに入力させた半角英数字の文字列入力検査'(Line,_半角英数字の文字列) :- writef('入力された %t には半角英数字以外の文字が含まれています。再入力をお願いします。\n',[Line]), fail. 半角英数字のコード(N) :- N >= 48,N =< 57,!. 半角英数字のコード(N) :- N >= 65,N =< 90,!. 半角英数字のコード(N) :- N >= 97,N =< 122,!. '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列) :- 入力された文字列を表示する(_半角英数字の文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列,_一文字ずらした文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_一文字ずらした文字列,_半角英数字の文字列). '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_文字列,_文字列) :- 入力された順番と同じになったら表示終了とする。',!. '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_文字列,_半角英数字の文字列) :- '一字ずつずらして表示させる'(_文字列,_一文字ずらした文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_一文字ずらした文字列,_半角英数字の文字列). '一字ずつずらして表示させる'(_文字列,_一文字ずらした文字列) :- sub_atom(_文字列,0,1,R,_先頭文字), sub_atom(_文字列,1,R,0,_残り文字列), concat_atom([_残り文字列,_先頭文字],_一文字ずらした文字列), writef('%t\n',[_一文字ずらした文字列]). 入力された文字列を表示する(_半角英数字の文字列) :- writef('%t\n',[_半角英数字の文字列]). 入力された順番と同じになったら表示終了とする。'. % % 一文字ずらしてというところが、「先読み」的な制御となり、ややこしい。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/809 # # [1] 授業単元:C言語 繰り返し # [2] 問題文(含コード&リンク): # 1.キーボードから正の整数を2つ(x  y)入力し、縦x個、横y個の文字'*' # からなる長方形を表示するプログラムを多重ループを用いて作成せよ。 # # 2.キーボードから入力した10進整数(0以上2^31 -1以下)を二進数にせよ # for文を使うこと。例えば2で割った余りと商の値によって下の桁のビットから求める等 # # 'キーボードから入力した10進整数(0以上2^31 -1以下)を二進数にする'(_二進数数値ならび,_二進数表示) :- 'キーボードから入力した10進整数(0以上2^31 -1以下)を'(_10進整数), '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,_二進数数値ならび,_二進数表示). 'キーボードから入力した10進整数(0以上2^31 -1以下)を'(_10進整数) :- write('10進整数(0以上2^31 -1以下)を入力してください : '), get_line(Line), '10進整数(0以上2^31 -1以下)入力検査'(Line,_10進整数),!. 'キーボードから入力した10進整数(0以上2^31 -1以下)を'(_10進整数) :- 'キーボードから入力した10進整数(0以上2^31 -1以下)を'(_10進整数). '10進整数(0以上2^31 -1以下)入力検査'(Line,_10進整数) :- atom_to_term(Line,_10進整数,_), _10進整数 >= 0,!. '10進整数(0以上2^31 -1以下)入力検査'(Line,_10進整数) :- writef('入力された %t からは(0以上2^31 -1以下)の10進整数は得られません。再入力をお願いします。\n',[Line]), fail. '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,_二進数数値ならび,_二進数表示) :- '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,[],_二進数表示). '10進整数(0以上2^31 -1以下)を二進数にする'(0,_二進数数値ならび,_二進数数値ならび,_二進数表示) :- concat_atom(['0x|_二進数数値ならび],_二進数表示). '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,L,_二進数数値ならび,_二進数表示) :- _二進数の一桁 is _10進整数 mod 2, '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,L,_二進数表示) :- _二進数の一桁 is _10進整数 mod 2, _二で割った商 is _10進整数 // 2, '10進整数(0以上2^31 -1以下)を二進数にする'(_ニで割った商,[_二進数の一桁|L],_二進数数値ならび,_二進数表示). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/809 # # [1] 授業単元:C言語 繰り返し # [2] 問題文(含コード&リンク): # 1.キーボードから正の整数を2つ(x  y)入力し、縦x個、横y個の文字'*' # からなる長方形を表示するプログラムを多重ループを用いて作成せよ。 # # 2.キーボードから入力した10進整数(0以上2^31 -1以下)を二進数にせよ # for文を使うこと。例えば2で割った余りと商の値によって下の桁のビットから求める等 # # 'キーボードから正の整数を2つ(x  y)入力し、縦x個、横y個の文字'*'からなる長方形を表示する' :- 'キーボードから正の整数を2つ(x  y)入力し'(_x,_y), '縦x個、横y個の文字'*'からなる長方形を表示する'(_x,_y). 'キーボードから正の整数を2つ(x y)入力し'(_x,_y) :- write('正の整数を2つ(x y) 入力してください : '), 正の整数を入力(_x), 正の整数を入力(_y),!. 'キーボードから正の整数を2つ(x y)入力し'(_x,_y) :- 'キーボードから正の整数を2つ(x y)入力し'(_x,_y). 正の整数を入力(_正の整数) :- get_line(Line), 正の整数入力検査(Line,_正の整数),!. 正の整数入力検査(Line,_正の整数) :- atom_to_term(Line,_正の整数,_), integer(_正の整数), _正の整数 > 0,!. 正の整数入力検査(Line,_正の整数) :- writef('入力された%tからは正の整数が得られません。もう一度最初から入力してください。\n',[Line]), fail. '縦x個、横y個の文字'*'からなる長方形を表示する'(_x,_y) :- for(1,M,_x), for(1,N,_y), write(*), N = _y, nl, M = _x. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/651 # # [1] 授業単元:C言語システムプログラミング # [2] 問題文(含コード&リンク): # 複数の整数を入力した後,その一覧に最大(Max)と最小(Min)の印を付けて表示するプログラムを作成せよ. # 但し,初めに入力する個数を入力する.(入力数は最大10とする) # 実行例↓ # Number? 4 # Score1? 40 # Score2? 90 # Score3? 80 # Score4? 30 # ***Result*** # 1 40 # 2 90 Max # 3 80 # 4 30 Min # '複数の整数を入力した後,その一覧に最大(Max)と最小(Min)の印を付けて表示する' :- '複数の整数を入力した後'(_整数ならび), 'その一覧に最大(Max)と最小(Min)の印を付けて表示する'(_整数ならび). '複数の整数を入力した後'(_整数ならび) :- '整数の個数を入力する'(_整数の個数), '複数の整数を入力した後'(_整数の個数,_整数ならび). '整数の個数を入力する'(_整数の個数) :- write('整数の個数を入力してください : '), get_line(Line), '整数の個数を入力検査'(Line,_整数の個数),!. '整数の個数を入力する'(_整数の個数) :- '整数の個数を入力する'(_整数の個数). '整数の個数を入力検査'(Line,_整数の個数) :- atom_to_term(Line,_整数の個数,_), integer(_整数の個数), _整数の個数 > 0,!. '整数の個数を入力検査'(Line,_整数の個数) :- writef('入力された%tからは適切な整数の個数は得られませんでした。再入力をお願いします。\n',[Line]), fail. '複数の整数を入力した後'(_整数の個数,_整数ならび) :- length(_整数ならび,_整数の個数), findall(_整数,( append(_,[_整数|_],_整数ならび), 整数を入力する(_整数)), _整数ならび). 'その一覧に最大(Max)と最小(Min)の印を付けて表示する'(_整数ならび) :- 最大値(_整数ならび,_最大値), 最小値(_整数ならび,_最小値), append(_,[_整数,|R],_整数ならび), writef('%4c ',[_整数]), 最大値の表示(_整数,_最大値), 最小値の表示(_整数,_最小値), write('\n'), R = []. 最大値の表示(_最大値,_最大値) :- writef('Max ',[_最大値]),!. 最大値の表示(_,_). 最小値の表示(_最小値,_最小値) :- writef('Min ',[_最小値]),!. 最小値の表示(_,_). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/645 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # ■プログラム1: # りんごが30個中、腐ったりんごが10個あったとき、 # 腐ってないりんごを3人で分けると、 # 一人当たりのりんごの個数は何個になるか、計算し、 # "一人あたりのりんごの個数"と"残ったりんごの個数"を # 出力するプログラム。 # (C言語の足し算、引き算、かけ算、割り算はそれぞれ、 +, -, *, / を使うが、 # 割った余り(剰余) は % で計算できる。 (例: n を m で割った余りは n % m )) # ■プログラム2: # 上記プログラム1 のリンゴの個数などの数を scanfを使ってキーボードから # 入力することで、任意の個数に対して計算できるように改良したプログラム。 # ただし両プログラムの変数名は、最初のりんごの個数をapple、 # 腐っていたりんごの個数を bad_apple、人数をpersons、 # 一人当たりのりんごの個数を apple_for_one、余りをrest とすること。 # 'りんごの個数を入力し、その中の腐ったりんごの個数を入力する。人数を入力して、腐ってないりんごをこの人数で分けると、一人当たりのりんごは何個になるかを計算し、"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する' :- りんごの個数を入力し(_りんごの個数), 腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数), 人数を入力して(_分割する人数), '腐ってないりんごを何人かで分ける'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数), '"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する'(_一人当たりのりんごの個数,_残ったりんごの個数). りんごの個数を入力し(_りんごの個数) :- write('りんごの個数を入力してください : '), get_line(Line), りんごの個数入力検査(Line,_りんごの個数),!. りんごの個数を入力し(_りんごの個数) :- りんごの個数を入力し(_りんごの個数). りんごの個数入力検査(Line,_りんごの個数) :- atom_to_term(Line,_りんごの個数,_), integer(_りんごの個数), _りんごの個数 > 0,!. りんごの個数入力検査(Line,_りんごの個数) :- writef('入力された%tからは適切なりんごの個数が得られません。再入力をお願いします。\n',[Line]), fail. 腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数) :- writef('腐ったりんごの個数を入力してください( >%t ) : ',[_りんごの個数]), get_line(Line), 腐ったりんごの個数入力検査(Line,_腐ったりんごの個数),!. 腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数) :- 腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数). 腐ったりんごの個数入力検査(Line,_りんごの個数,_腐ったりんごの個数) :- atom_to_term(Line,_腐ったりんごの個数,_), integer(_腐ったりんごの個数), _腐ったりんごの個数 < _りんごの個数,!. 腐ったりんごの個数入力検査(Line,_りんごの個数,_腐ったりんごの個数) :- writef('入力された%tからは適切な腐ったりんごの個数は得られません。再入力をお願いします。\n',[Line]), fail. 人数を入力して(_分割する人数) :- write('分割する人数を入力してください : '), get_line(Line), 人数入力検査(Line,_分割する人数),!. 人数を入力して(_分割する人数) :- 人数を入力して(_分割する人数). 人数入力検査(Line,_分割する人数) :- atom_to_term(Line,_分割する人数,_), integer(_分割する人数), _分割する人数 > 0,!. 人数入力検査(Line,_分割する人数) :- writef('入力された%tからは適切な分割する人数が得られません。再入力をお願いします。\n',[Line]), '腐ってないりんごを何人かで分ける'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数) :- '腐っないりんごを'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数), '何人かで分ける'(_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数). '腐っないりんごを'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数) :- _腐っていないりんごの個数 is _りんごの個数 - _腐ったりんごの個数. '何人かで分ける'(_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数) :- _一人当たりのりんごの個数 is _腐っていないりんごの個数 // _分割する人数, _残ったりんごの個数 is _腐っていないりんごの個数 mod _分割する人数. '"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する'(_一人当たりのりんごの個数,_残ったりんごの個数) :- 出力する('一人あたりのりんごの個数 = %t\n',_一人当たりのりんごの個数), 出力する('残ったりんごの個数 = %t\n',_残ったのりんごの個数). 出力する(_表示パターン,_表示項目) :- writef(_表示パターン,[_表示項目]). % このプログラムは http://nojiriko.asia/prolog/c152_645_1.html のどこを変更 % したかを確認してこそ、意味のあるものです。 % 最初の述語名が大きく異なっていること。これが一番重要だと思います。 % それから具体値を一般化した場合の述語名の書き換え方。 % やはり、Prologは国語だ。 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/627 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # scanf で n を受け取り, 要素数 n の乱数配列を作成し, 指定した 2 つの要素番号にある要素を交換するプログラムを作成せよ. # 'n を受け取り, 要素数 n の乱数ならびを作成し, 指定した 2 つの要素番号にある要素を交換する' :- 'n を受け取り'(_n), '要素数 n の乱数配列を作成し'(_n,_乱数ならび), '指定した 2 つの要素番号にある要素を交換する'(_n,_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび), 表示する(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび),!. 'n を受け取り'(_n) :- write('要素数nを入力してください : '), get_line(Line), 'n受け取り検査'(Line,_n),!. 'n を受け取り'(_n) :- 'n を受け取り'(_n). 'n受け取り検査'(Line,_n) :- atom_to_term(Line,_n,_), integer(_n), _n > 0,!. 'n受け取り検査'(Line,_n) :- writef('入力された%tからは適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. '要素数 n の乱数配列を作成し'(_n,_乱数ならび) :- length(_乱数ならび,_n), findall(_乱数,( append(_,[_乱数|_],_乱数ならび), _乱数 is random(100) + 1), _乱数ならび). '指定した 2 つの要素番号にある要素を交換する'(_n,_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2), '2 つの要素番号にある要素を交換する'(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび). '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2) :- writef('2つの要素番号[1~%t]をカンマ区切りで入力してください : ',[_n]), get_line(Line), '指定した 2 つの要素番号入力検査'(Line,_n,_要素番号_1,_要素番号_2),!. '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2) :- '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2). '指定した 2 つの要素番号入力検査'(Line,_n,_要素番号_1,_要素番号_2) :- '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2), '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2),!. '指定した 2 つの要素番号入力検査'(Line,_要素番号_1,_要素番号_2) :- write('再入力をお願いします\n'), fail. '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2) :- split(Line,[','],[_要素番号_1,_要素番号_2]),!. '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2) :- writef('入力された%tからは2要素の要素番号が得られません。\n',[Line]), fail. '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2) :- _要素番号_1 > 0, _要素番号_1 =< _n, _要素番号_2 > 0, _要素番号_2 =< _n,!. '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2) :- writef('入力された要素には[1~%t]の範囲を逸脱しているものが有ります。\n',[Line,_n]), fail. '2 つの要素番号にある要素を交換する'(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- 要素番号を変数に置換(_乱数ならび,_要素番号_1,_元の値_1,_変数_1,_乱数ならびの一), 要素番号を変数に置換(_乱数ならびの一,_要素番号_2,_元の値_2,_変数_2,_2要素が交換された乱数ならび), _変数_1 = _元の値_2, _変数_2 = _元の値_1,!. 要素番号を変数に置換(_ならび,_要素番号,_元の値,_変数,_置換されたならび) :- length([_|L0],_要素番号), append(L0,[_元の値|R],_ならび), append(L0,[_変数|R],_置換されたならび). 表示する(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- writef('元の乱数ならびは: %t\n',[_乱数ならび]), writef('%t番目と%t番目の要素を交換する\n',[_要素番号_1,_要素番号_2]), writef('2要素が交換された乱数ならびは: %t\n',[_2要素が交換された乱数ならび]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/588 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算するプログラムを作成せよ. # ただし, 一つの行の合計は, 行の先頭を指す整数型のポインタ a と列数をあらわす整数 n を受け取り, 一行の合計を返す 関数 int row_sum( int* a, int n ) を作成し計算せよ. (関数の引数と返り値の型を指定されたもので作ること) # # '3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算する'(_指定した行位置,_行の和) :- '3x4 の行列を二次元配列で定義し', '3x4 の行列'(_行列), '3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算する'(_行列,_指定した行位置,_行の和). '行列の指定した行の和を計算する'(_行列,_指定した行位置,_行の和) :- nth1(_指定した行位置,_行列,_指定した行), sum(_指定した行,_行の和). '3x4 の行列を二次元配列で定義し' :- length(LL,3), findall(L,( append(L0,[L|_],LL), length([_|L0],_行位置), length(L,4), 列を埋める(_行位置,L)), LL), assertz('3x4 の行列'(LL)). 列を埋める(_行位置,L) :- findall(_値,( append(L0,[_値|_],L), length([_|L0],_列位置), 整数入力(_行位置,_列位置,_値)), L). 整数入力(_行位置,_列位置,_値) :- writef('[%t][%t]: ',[_行位置,_列位置]), get_line(Line), 整数入力検査(Line,_値),!. 整数入力(_行位置,_列位置,_値) :- 整数入力(_行位置,_列位置,_値). 整数入力検査(Line,_値) :- atom_to_term(Line,_値,_), integer(_値),!. 整数入力検査(Line,_値) :- writef('入力された%tからは数値が得られません。再入力をお願いします。\n',[Line]), fail. sum([],0). sum([V|R],S) :- sum(R,S2), S is V + S2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/588 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算するプログラムを作成せよ. # ただし, 一つの行の合計は, 行の先頭を指す整数型のポインタ a と列数をあらわす整数 n を受け取り, 一行の合計を返す 関数 int row_sum( int* a, int n ) を作成し計算せよ. (関数の引数と返り値の型を指定されたもので作ること) # # '3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算する'(_n行目,_行の和) :- '3x4 の行列を二次元配列で定義し'(LL), nth1(_n行目,LL,L), sum(L,_行の和). '3x4 の行列を二次元配列で定義し'(LL) :- length(LL,3), findall(L,( append(L0,[L|_],LL), length([_|L0],_行位置), length(L,4), 列を埋める(_行位置,L)), LL). 列を埋める(_行位置,L) :- findall(_値,( append(L0,[_値|_],L), length([_|L0],_列位置), 整数入力(_行位置,_列位置,_値)), L). 整数入力(_行位置,_列位置,_値) :- writef('[%t][%t]: ',[_行位置,_列位置]), get_line(Line), 整数入力検査(Line,_値),!. 整数入力(_行位置,_列位置,_値) :- 整数入力(_行位置,_列位置,_値). 整数入力検査(Line,_値) :- atom_to_term(Line,_値,_), integer(_値),!. 整数入力検査(Line,_値) :- writef('入力された%tからは数値が得られません。再入力をお願いします。\n',[Line]), fail. sum([],0). sum([V|R],S) :- sum(R,S2), S is V + S2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/563 # # http://ime.nu/codepad.org/bsGYVXWW # # 4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する。 # '4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する' :- '4名の学生別に3科目の成績を入力して'(LL), 'その学生別平均と'(LL,_学生別平均ならび), '科目別平均を'(LL,_科目別平均ならび), '表示する'(_学生別平均ならび,_科目別平均ならび). '4名の学生別に3科目の成績を入力して'(LL) :- '4名の'(LL,4), findall(L,( 学生別に(LL,L), '3科目の成績を入力する'(L)), LL). '4名の'(LL) :- length(LL,4). 学生別に(LL,L) :- append(_,[L|_],LL). '3科目の成績を入力する'(L) :- '3科目の'(L), findall(_成績,( 成績を(L,_成績), 入力する(_成績)), L). '3科目の'(L) :- length(L,3). 成績を(L,_成績) :- append(_,[_成績|_],L). 入力する(_成績) :- get_line(Line), 成績入力検査(Line,_成績),!. 入力する(_成績) :- 入力する(_成績). 成績入力検査(Line,_成績) :- atom_to_term(Line,_成績,_), '成績は0点以上100点以下の整数とする'(_成績),!. 成績入力検査(Line,_成績) :- writef('入力された%tからは科目成績として適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. '成績は0点以上100点以下の整数とする'(_成績) :- integer(_成績), _成績 >= 0, _成績 =< 100. 'その学生別平均と'(LL,_学生別平均ならび) :- findall(_平均,( append(_,[L|_],LL), 相加平均(L,_平均)), _学生別平均ならび). '科目別平均を'(LL,_科目別平均ならび) :- 転置(LL,LL1), findall(_平均,( append(_,[L|_],LL1), 相加平均(L,_平均)), _科目別平均ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0,M). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/563 # # http://ime.nu/codepad.org/bsGYVXWW # # 4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する。 # # '4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する' :- '4名の学生別に3科目の成績を入力して'(LL), 'その学生別平均と'(LL,_学生別平均ならび), '科目別平均を'(LL,_科目別平均ならび), '表示する'(_学生別平均ならび,_科目別平均ならび). '4名の学生別に3科目の成績を入力して'(LL) :- '4名の'(LL,4), findall(L,( 学生別に(LL,L), '3科目の成績を入力する'(L)), LL). '4名の'(LL) :- length(LL,4). 学生別に(LL,L) :- append(_,[L|_],LL). '3科目の成績を入力する'(L) :- '3科目の'(L), findall(_成績,( 成績を(L,_成績), 入力する(_成績)), L). '3科目の'(L) :- length(L,3). 成績を(L,_成績) :- append(_,[_成績|_],L). 入力する(_科目別成績) :- get_line(Line), 入力検査(Line,_科目別成績),!. 入力する(_科目別成績) :- 入力する(_科目別成績). 入力検査(Line,_科目別成績) :- atom_to_term(Line,_科目別成績,_), integer(_科目別成績), _科目別成績 >= 0, _科目別成績 =< 100,!. 入力検査(Line,_科目別成績) :- writef('入力された%tからは科目成績として適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'その学生別平均と'(LL,_学生別平均ならび) :- findall(_平均,( append(_,[L|_],LL), 相加平均(L,_平均)), _学生別平均ならび). '科目別平均を'(LL,_科目別平均ならび) :- 転置(LL,LL1), findall(_平均,( append(_,[L|_],LL1), 相加平均(L,_平均)), _科目別平均ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/563 # # http://ime.nu/codepad.org/bsGYVXWW # # #include # #define student 4 # #define score 3 # int main(){ # int i, j; # int a[student][score]; # int num[3]; # for(i=0; i= 0, _成績 =< 100,!. 成績入力検査(Line,_成績) :- writef('入力された%tからは科目成績として適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'その学生別平均と'(LL,_学生別平均ならび) :- findall(_平均,( append(_,[L|_],LL), 相加平均(L,_平均)), _学生別平均ならび). '科目別平均を'(LL,_科目別平均ならび) :- 転置(LL,LL1), findall(_平均,( append(_,[L|_],LL1), 相加平均(L,_平均)), _科目別平均ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0,M). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/563 # # http://ime.nu/codepad.org/bsGYVXWW # # #include # #define student 4 # #define score 3 # int main(){ # int i, j; # int a[student][score]; # int num[3]; # for(i=0; i= 0, _科目別成績 =< 100,!. 入力検査(Line,_科目別成績) :- writef('入力された%tからは科目成績として適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'その学生別平均と'(LL,_学生別平均ならび) :- findall(_平均,( append(_,[L|_],LL), 相加平均(L,_平均)), _学生別平均ならび). '科目別平均を'(LL,_科目別平均ならび) :- 転置(LL,LL1), findall(_平均,( append(_,[L|_],LL1), 相加平均(L,_平均)), _科目別平均ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/531 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 平成○年の値を入力し、西暦に変換するプログラムを作成 # '平成○年の値を入力し、西暦に変換する' :- '平成○年の値を入力し'(_漢数字年), 漢数字を数字に変換する(_年,_数字), '平成元年は西暦1989年であることから西暦を得る'(_数字,_西暦), writef('西暦は %t です。\n',[_西暦]). '平成○年の値を入力し'(_漢数字年) :- write('平成○年を入力してください : '), 漢数字年を得る(_漢数字年). 漢数字年を得る(_漢数字年) :- get_line(Line), 漢数字年入力検査(Line,_漢数字年). 漢数字年を得る(_漢数字年) :- 漢数字年を得る(_漢数字年). 漢数字年入力検査(元,元) :- !. 漢数字年入力検査(Line,_漢数字年) :- atom_to_term(Line,_漢数字年,_), '漢数字・数字'(_漢数字年,_),!. 漢数字年入力検査(Line,_漢数字年) :- writef('入力された %t からは漢数字が得られませんでした。再入力をお願いします。\n',[Line]), fail. 漢数字を数字に変換する(元,1) :- !. 漢数字を数字に変換する(_年,_数字) :- sub_atom(_年,0,1,1,_十の桁の漢数字), sub_atom(_年,1,1,0,_一の桁の漢数字), '漢数字・数字'(_十の桁の漢数字,_十の桁の数字), '漢数字・数字'(_十の桁の漢数字,_一の桁の数字), _数字 is _十の桁の数字 * 10 + _一の桁の数字,!. 漢数字を数字に変換する(_年,_数字) :- sub_atom(_年,0,1,0,_一の桁の漢数字), '漢数字・数字'(_一の桁の漢数字,_数字). '平成元年は西暦1989年であることから西暦を得る'(_数字,_西暦) :- _西暦 is _数字 + 1989 - 1. '漢数字・数字'(一,1). '漢数字・数字'(ニ,2). '漢数字・数字'(三,3). '漢数字・数字'(四,4). '漢数字・数字'(五,5). '漢数字・数字'(六,6). '漢数字・数字'(七,7). '漢数字・数字'(八,8). '漢数字・数字'(九,9). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/350 # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク):整数 mとnを入力して m+(m+1)+(m+2)+…+n # を出力するプログラムを作成しろ # % 馬鹿正直に、m+(m+1)+(m+2)+…+n をプログラムとして書こうとしたら % どのような困難があるかということを示す。 '整数 mとnを入力して m+(m+1)+(m+2)+…+nを出力するプログラムを作成しろ' :- '整数 mとnを入力して'(_m,_n), 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S), '_m,_n,の値と適用するための工夫をする'(S,S2), 文字列を項に変換する(S2,P,VL), '表示文字列Xの表すものは変数Xである'(VL,X), call(P), '_mをmに_nをnに変換すると'(S,S3), writef('%t = %t\n',[S3,X]). 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S) :- _n_1 is _n - _m - 1, findall(S1,( for(1,N,_n_1), concat_atom(['(_m+',N,')'],S1)), L), concat_atom(L,'+',S),!. '_m,_n,の値と適用するための工夫をする'(S1,S2) :- concat_atom(['_m=',_m,',_n=',_n,',',X is S1,'+_n'],S2),!. '表示文字列Xの表すものは変数Xである'(VL,X) :- member('X'=X,VL). 文字列を項に変換する(S,P,VL) :- atom_to_term(S,P,VL),!. '_mをmに_nをnに変換すると'(S1,S2) :- atom_chars(S1,Chars), 'ならびの_mをmに_nをnに変換すると'(L1,L2), atom_chars(S2,L2),!. 'ならびの_mをmに_nをnに変換すると'([],[]) :-!. 'ならびの_mをmに_nをnに変換すると'(['_',m|R1],[m|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'(['_'|n],[n|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'([A|R1],[A|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. '整数 mとnを入力して'(_m,_n) :- write('m + 1 < n となるように'), 整数を入力(_m), 整数を入力(_n), '整数 mとnを入力診断'(_m,_n),!. '整数 mとnを入力して'(_m,_n) :- '整数 mとnを入力して'(_m,_n). 整数を入力(_整数) :- write('整数を入力しなさい : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数を入力(_整数) :- 整数を入力(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '整数 mとnを入力診断'(_m,_n) :- _n > _m + 1,!. '整数 mとnを入力診断'(_m,_n) :- write('m + 1 < n でなくてはなりません。再入力をお願いします。'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/350 # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク):整数 mとnを入力して m+(m+1)+(m+2)+…+n # を出力するプログラムを作成しろ # % 馬鹿正直に、m+(m+1)+(m+2)+…+n をプログラムとして書こうとしたら % どのような困難があるかということを示す。 '整数 mとnを入力して m+(m+1)+(m+2)+…+nを出力するプログラムを作成しろ' :- '整数 mとnを入力して'(_m,_n), 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S), '_m,_n,の値と適用するための工夫をする'(S,S2), 文字列を項に変換する(S2,P,VL), '表示文字列Xの表すものは変数Xである'(VL,X), call(P), '_mをmに_nをnに変換すると'(S,S3), writef('%t = %t\n',[S3,X]). 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S) :- _n_1 is _n - _m - 1, findall(S1,( for(1,N,_n_1), concat_atom(['(_m+',N,')'],S1)), L), concat_atom(L,'+',S),!. '_m,_n,の値と適用するための工夫をする'(S1,S2) :- concat_atom(['_m=',_m,',_n=',_n,',',X is S1,'+_n'],S2),!. '表示文字列Xの表すものは変数Xである'(VL,X) :- member('X'=X,VL). 文字列を項に変換する(S,P,VL) :- atom_to_term(S,P,VL),!. '_mをmに_nをnに変換すると'(S1,S2) :- atom_chars(S1,Chars), 'ならびの_mをmに_nをnに変換すると'(L1,L2), atom_chars(S2,L2),!. 'ならびの_mをmに_nをnに変換すると'([],[]) :-!. 'ならびの_mをmに_nをnに変換すると'(['_',m|R1],[m|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'(['_'|n],[n|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'([A|R1],[A|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. '整数 mとnを入力して'(_m,_n) :- write('m + 1 < n となるように'), 整数を入力(_m), 整数を入力(_n), '整数 mとnを入力診断'(_m,_n),!. '整数 mとnを入力して'(_m,_n) :- '整数 mとnを入力して'(_m,_n). 整数を入力(_整数) :- write('整数を入力しなさい : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数を入力(_整数) :- 整数を入力(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '整数 mとnを入力診断'(_m,_n) :- _n > _m + 1,!. '整数 mとnを入力診断'(_m,_n) :- write('m + 1 < n でなくてはなりません。再入力をお願いします。'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/340 # # 1C言語学習 # 2 2つの整数を入力して、その2つの最大公約数を求めよ # 3環境 は Linux gcc C言語です # 4期限は 明日までです # 5 配列には入っていません # ならったところまでの総合問題です # 初心者なので、簡略化しないで頂きたいです お願いします # # '2つの整数を入力して、その2つの最大公約数を求める' :- '2つの整数を入力して'(_整数_1,_整数_2), 'その2つの最大公約数を求める'(_整数_1,_整数_2,_最大公約数), 最大公約数を表示する(_整数_1,_整数_2,_最大公約数). '2つの整数を入力して'(_整数_1,_整数_2) :- 整数を入力して(_整数_1), 整数を入力して(_整数_2). 整数を入力して(_整数) :- write('整数を入力してください : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数を入力して(_整数) :- 整数を入力して(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 'その2つの最大公約数を求める'(_整数,_整数,_整数) :- !. 'その2つの最大公約数を求める'(_整数_1,_整数_2,_最大公約数) :- _整数_1 > _整数_2, 小さい整数を初期値として下降しながら2整数の公約数を捜す(_整数_2,_整数_1,_整数_2,_最大公約数),!. 'その2つの最大公約数を求める'(_整数_1,_整数_2,_最大公約数) :- _整数_1 < _整数_2, 小さい整数を初期値として下降しながら2整数の公約数を捜す(_整数_1,_整数_1,_整数_2,_最大公約数),!. 小さい整数を初期値として下降しながら2整数の公約数を捜す(_初期値,_整数_1,_整数_2,_最大公約数) :- for(_初期値,_最大公約数,1), 0 is _整数_1 mod _最大公約数, 0 is _整数_2 mod _最大公約数,!. 最大公約数を表示する(_整数_1,_整数_2,_最大公約数) :- writef('%t と %t の最大公約数は %t\n',[_整数_1,_整数_2,_最大公約数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/340 # # 1C言語学習 # 2 2つの整数を入力して、その2つの最大公約数を求めよ # 3環境 は Linux gcc C言語です # 4期限は 明日までです # 5 配列には入っていません # ならったところまでの総合問題です # 初心者なので、簡略化しないで頂きたいです お願いします # # '2つの整数を入力して、その2つの最大公約数を求める' :- '2つの整数を入力して'(_整数_1,_整数_2), 'その2つの最大公約数を求める'(_整数_1,_整数_2,_最大公約数), 最大公約数を表示する(_整数_1,_整数_2,_最大公約数). '2つの整数を入力して'(_整数_1,_整数_2) :- 整数を入力して(_整数_1), 整数を入力して(_整数_2). 整数を入力して(_整数) :- write('整数を入力してください : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数を入力して(_整数) :- 整数を入力して(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 'その2つの最大公約数を求める'(_整数_1,_整数_2,_最大公約数) :- 最大公約数をユークリッドの互除法で求める(_整数_1,_整数_2,_最大公約数). 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最大公約数を表示する(_整数_1,_整数_2,_最大公約数) :- writef('%t と %t の最大公約数は %t\n',[_整数_1,_整数_2,_最大公約数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/338 # # 急ぎなのですが # 1 考えるC # 2 整数m(mが2以上)を入力し、m以下の素数を全て表示するプログラムを作れ。 # 3 環境はlinux gcc C言語です # # 4期限は今日の夕方まで # 5進んだところは # 配列はまだやっていません # 総合問題みたいらしいです # # ぐぐればすぐサンプルがあるらしいのですが、それを使わずにかけといっていました # (簡単にかけるらしいので) # # よろしくお願いします # % 失敗駆動の例 '整数m(mが2以上)を入力し、m以下の素数を全て表示する' :- '整数m(mが2以上)を入力し'(_m), 'm以下の素数を全て表示する'(_m). '整数m(mが2以上)を入力し'(_m) :- write('整数m(mが2以上)を入力してください : '), get_line(Line), '整数m(mが2以上)を入力診断'(Line,_m),!. '整数m(mが2以上)を入力し'(_m) :- '整数m(mが2以上)を入力し'(_m). '整数m(mが2以上)を入力診断'(Line,_m) :- atom_to_term(Line,_m,_), integer(_m), _m >= 2,!. '整数m(mが2以上)を入力診断'(Line,_m) :- writef('入力された %t からは2以上の整数が得られません。再入力をお願いします。\n',[Line]), fail. 'm以下の素数を全て表示する'(_m) :- for(2,N,_m), 'Nは素数である'(2,N), writef('%t\n',[N]), N = _m,!. 'm以下の素数を全て表示する'(_). 'Nは素数である'(N) :- for(2,M,N), 'NはMで割り切れる'(N,M), !, M = N. 'NはMで割り切れる'(N,M) :- 0 is N mod M. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/338 # # 急ぎなのですが # 1 考えるC # 2 整数m(mが2以上)を入力し、m以下の素数を全て表示するプログラムを作れ。 # 3 環境はlinux gcc C言語です # # 4期限は今日の夕方まで # 5進んだところは # 配列はまだやっていません # 総合問題みたいらしいです # # ぐぐればすぐサンプルがあるらしいのですが、それを使わずにかけといっていました # (簡単にかけるらしいので) # # よろしくお願いします # '整数m(mが2以上)を入力し、m以下の素数を全て表示する' :- '整数m(mが2以上)を入力し'(_m), 'm以下の素数を全て表示する'(_m). '整数m(mが2以上)を入力し'(_m) :- write('整数m(mが2以上)を入力してください : '), get_line(Line), '整数m(mが2以上)を入力診断'(Line,_m),!. '整数m(mが2以上)を入力し'(_m) :- '整数m(mが2以上)を入力し'(_m). '整数m(mが2以上)を入力診断'(Line,_m) :- atom_to_term(Line,_m,_), integer(_m), _m >= 2,!. '整数m(mが2以上)を入力診断'(Line,_m) :- writef('入力された %t からは2以上の整数が得られません。再入力をお願いします。\n',[Line]), fail. 'm以下の素数を全て表示する'(_m) :- for(2,N,_m), 'Nは素数である'(2,N), writef('%t\n',[N]), N = _m,!. 'm以下の素数を全て表示する'(_). 'Nは素数である'(N,N) :- !. 'Nは素数である'(M,N) :- 0 is N mod M,!, fail. 'Nは素数である'(M,N) :- M2 is M + 1, 'Nは素数である'(M2,N). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/338 # # 急ぎなのですが # 1 考えるC # 2 整数m(mが2以上)を入力し、m以下の素数を全て表示するプログラムを作れ。 # 3 環境はlinux gcc C言語です # # 4期限は今日の夕方まで # 5進んだところは # 配列はまだやっていません # 総合問題みたいらしいです # # ぐぐればすぐサンプルがあるらしいのですが、それを使わずにかけといっていました # (簡単にかけるらしいので) # # よろしくお願いします # '整数m(mが2以上)を入力し、m以下の素数を全て表示する' :- '整数m(mが2以上)を入力し'(_m), 'm以下の素数を全て表示する'(_m). '整数m(mが2以上)を入力し'(_m) :- write('整数m(mが2以上)を入力してください : '), get_line(Line), '整数m(mが2以上)を入力診断'(Line,_m),!. '整数m(mが2以上)を入力し'(_m) :- '整数m(mが2以上)を入力し'(_m). '整数m(mが2以上)を入力診断'(Line,_m) :- atom_to_term(Line,_m,_), integer(_m), _m >= 2,!. '整数m(mが2以上)を入力診断'(Line,_m) :- writef('入力された %t からは2以上の整数が得られません。再入力をお願いします。\n',[Line]), fail. 'm以下の素数を全て表示する'(_m) :- findall(N,( for(2,N,_m)), L1), エラトステネスの篩(L1,L2), append(_,[_素数|R],L2), writef('%t\n',[_素数]), R = []. エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/8 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):自然数n>0を入力し、その自明でない約数(1とn以外の約数)をひとつ出力するプログラムを作成せよ。 # '自然数n>0を入力し、その自明でない約数(1とn以外の約数)をひとつ出力する' :- 自然数を入力し(_n), 'その自明でない約数(1とn以外の約数)をひとつ出力する'(_n). 'その自明でない約数(1とn以外の約数)をひとつ出力する'(_n) :- _m is _n // 2, _m >= 2, for(_m,N,2), Mod is _n mod N, Mod = 0, writef('%t\n',[N]). 'その自明でない約数(1とn以外の約数)をひとつ出力する'(_n) :- writef('%tは素数です\n',[_n]). 自然数を入力し(_n) :- write('自然数を入力してください : '), get_line(Line), 自然数入力診断(Line,_n),!. 自然数を入力し(_n) :- 自然数を入力し(_n). 自然数入力診断(Line,_n) :- atom_to_term(Line,_n,_), integer(_n), _n > 0,!. 自然数入力診断(Line,_n) :- writef('入力された%tからは自然数nが得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/7 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):自然数n > 1 と整数g, x >= 0 を入力として, g^x をn で割った余りg^x mod n を求めて表 # 示するプログラムを作成せよ. # '自然数n > 1 と整数g, x >= 0 を入力として, g^x をn で割った余りg^x mod n を求めて表示する' :- '自然数n > 1 と整数g, x >= 0 を入力して、'(_n,_g,_x), 'g^x をn で割った余りg^x mod nを求めて表示する'(_n,_g,_x,_余り), writef('%t = %t^%t mod %t\n',[_余り,_g,_x,_n]). '自然数n > 1 と整数g, x >= 0 を入力して、'(_n,_g,_x) :- '自然数n > 1 と'(_n), '整数g>=0'(_g), '整数x>=0'(_x). '自然数n > 1 と'(_n) :- write('1より大きい自然数を入力してください : '), get_line(Line), '1より大きい自然数の入力診断'(Line,_n),!. '自然数n > 1 と'(_n) :- '自然数n > 1 と'(_n). '1より大きい自然数の入力診断'(Line,_n) :- atom_to_term(Line,_n,_), integer(_n), _n > 1,!. '1より大きい自然数の入力診断'(Line,_n) :- writef('入力された%tから1より大きい自然数が得られません。再入力をお願いします。\n',[Line]), fail. '整数g>=0'(_x) :- write('0以上の整数を入れてください : '), get_line(Line), '0以上の整数入力診断'(Line,_g),!. '整数g>=0'(_x) :- '整数g>=0'(_x). '整数x>=0'(_x) :- write('0以上の整数を入れてください : '), get_line(Line), '0以上の整数入力診断'(Line,_x),!. '整数x>=0'(_x) :- '整数x>=0'(_x). '0以上の整数入力診断'(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 0,!. '0以上の整数入力診断'(Line,N) :- writef('入力された%tからは0以上の整数は得られません。再入力をお願いします。\n',[Line]),!,fail. 'g^x をn で割った余りg^x mod nを求めて表示する'(_n,_g,_x,_余り) :- _余り is truncate(_g ^ _x) mod _n. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/805 # # [1]授業単元:プログラミング # [2]問題文:番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存 # 全データ一覧 # 入力した番号の点数のみ表示 # 新しいデータを入力しリストの最後に追加 # 番号のみを入力してデータ削除 ← 可能ならば、出来てなくても大丈夫です # プログラム終了 # # 始めから与えられているデータを入れ忘れました。申し訳ありませんでした # 番号  数学  英語 # N0003  82  100 # N0006  73  91 # N0020  69  83 # N0011  44  70 # N0025  34  62 # N0022  32  52 # N0015  16  12 # N0013  61  100 # N0001  70  88 # (本当はデータ数が25個程あるのですが、これだけでお願いします) # 全データ一覧ではリスト通りの表示でOKです # 成績('N0003',82,100). 成績('N0006',73,91). 成績('N0020',69,83). 成績('N0011',44,70). 成績('N0025',34,62). 成績('N0022',32,52). 成績('N0015',16,12). 成績('N0013',61,100). 成績('N0001',70,88). 成績管理 :- 成績管理メニュー表示, get_integer(_選択), 成績管理選択実行(_選択). 成績管理メニュー表示 :- write('左側の番号で選択してください\n'), write('1..番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存\n'), write('2..全データ一覧\n'), write('3..入力した番号の点数のみ表示\n'), write('4..新しいデータを入力しリストの最後に追加\n'), write('5..番号のみを入力してデータ削除\n'), write('9..終了\n'),!. 成績管理選択実行(1) :- '番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存'. 成績管理選択実行(2) :- 全テータ一覧. 成績管理選択実行(3) :- 入力した番号の点数のみ表示. 成績管理選択実行(4) :- 新しいデータを入力しリストの最後に追加. 成績管理選択実行(5) :- 番号のみを入力してデータ削除. 成績管理選択実行(9). '番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存' :- findall([_番号,_数学点数,_英語点数],( 成績(_番号,_数学点数,_英語点数)), LL), open('生成保存.pro',write,Outstream), writef(Outstream,'%q.\n',[LL]), close(Outstream). 全データ一覧 :- write('番号  数学  英語\n'), 成績(_番号,_数学点数,_英語点数), writef('%t %4r %4r\n',[_番号,_数学点数,_英語点数]), fail. 全データ一覧. 入力した番号の点数のみ表示 :- 入力した番号(_入力した番号), write('番号  数学  英語\n'), 成績(_番号,_数学点数,_英語点数), writef('%t %4r %4r\n',[_番号,_数学点数,_英語点数]), fail. 入力した番号の点数のみ表示. 入力した番号(_入力した番号) :- get_line(_入力した番号),!. 新しいデータを入力しリストの最後に追加 :- 番号の入力(_番号), 数学点数の入力(_数学点数), 英語点数の入力(_英語点数), 新しいデータを入力しリストの最後に追加(_番号,_数学点数,_英語点数). 新しいデータを入力しリストの最後に追加(_番号,_数学点数,_英語点数) :- assertz(成績(_番号,_数学点数,_英語点数)). 番号の入力(_番号) :- write('番号を入力してください : '), get_line(_番号),!. 数学点数の入力(_数学点数) :- write('数学点数(0~100)を入力してください : '), get_line(Line), 点数入力診断(Line,_数学点数), 数学点数の入力(_数学点数) :- 数学点数の入力(_数学点数). 英語点数の入力(_英語点数) :- write('英語点数(0~100)を入力してください : '), get_line(Line), 点数入力診断(Line,_英語点数),!. 英語点数の入力(_英語点数) :- 英語点数の入力(_英語点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0, _点数 =< 100,!. 点数入力診断(Line,_点数) :- write('入力された %t から点数として適切な整数を得られません。再入力をお願いします。\n',[Line]), fail. '番号のみを入力してデータ削除 ← 可能ならば、出来てなくても大丈夫です' :- 番号のみ入力して(_番号), retract(成績(_番号,_,_)), fail. '番号のみを入力してデータ削除 ← 可能ならば、出来てなくても大丈夫です'. 番号のみ入力して(_番号) :- get_line(_番号),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/731 # # ../test/read.cgi/tech/1311089619/726 # すみません。提出することが出来ました。 # 明日に行う課題を出されました。 # 出来れば教えていただけますか? # [1] 授業単元:C言語プログラミング # [2] 問題文:4つの数値をを入力して結果が20になる数式(+,-,*,/)を全て表示させる. # ()は考えない。 # 組み合わせがない場合はエラー表示とする。入力できる数値は一桁のみとする。 # '4つの数値を入力して結果が20になる数式(+,-,*,/)を全て表示させる' :- '4つの数値を入力して'(_数値1,_数値2,_数値3,_数値4), '結果が20になる数式(+,-,*,/)を全て'(_数値1,_数値2,_数値3,_数値4,_式ならび), 表示させる(_数値1,_数値2,_数値3,_数値4,_式ならび). '結果が20になる数式(+,-,*,/)を全て'(_数値1,_数値2,_数値3,_数値4,_式ならび) :- findall(_式,( 順列([_数値1,_数値2,_数値3,_数値4],4,L1), 順列(['+','-','*','/'],3,L2), 式を構成する(L1,L2,_式), 20 is truncate(_式))), _式ならび). '4つの数値を入力して'(_数値1,_数値2,_数値3,_数値4) :- 整数入力(_数値1), 整数入力(_数値2), 整数入力(_数値3), 整数入力(_数値4),!. 式を構成する(L1,L2,_式) :- 演算子を挿入する(L1,L2,L3), concat_atom(L3,S), atom_to_term(S,_式,_). 演算子を挿入する([A],_,[A]) :- !. 演算子を挿入する([_,0|R1],[/|R2],R3) :- !,fail. 演算子を挿入する([A|R1],[B|R2],[A,B|R3]) :- 演算子を挿入する(R1,R2,R3). 表示させる(_数値1,_数値2,_数値3,_数値4,[]) :- writef('この4つの数値 %t,%t,%t,%t からは解が得られません\n',[_数値1,_数値2,_数値3,_数値4]),!. 表示させる(_数値1,_数値2,_数値3,_数値4,_式ならび) :- append(_,[_式|R],_式ならび), writef('20 = %t.\n',[_式]), R = []. 整数入力(_整数) :- write('整数を入力してください : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数入力(_整数) :- 整数入力(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 順列(Y,0,_,[]). 順列(Y,N,EL,[A|X]) :- \+(member(A,EL)), del(Z = Y - A), M is N - 1, 順列(Z,M,EL,X). 順列(Y,N,EL,[_|X]) :- member(A,EL), 順列(Z,M,EL,X). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(Z = Y - A), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). del(X = [A|X] - A). del([B|Y] = [B|X] - A) :- del(Y = X - A). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/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/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/662 # # 次の式を計算するプログラムを作れ。 # Sum = 12 + 22 + ... + N2 # (注意) Nの値は、キーボードから入力できるようにすること。 # Q:\prog> calcsum (注) この例ではプログラムの名前をcalcsumとした。 # Input N? 10 Nの値として10を入力する # Sum is 385 12 + 22 + 32 + 42 + 52 + 62 + 72 + 82 + 92 + 102 を計算すると385になる。 # # 'Nの値をキーボードから入力して Sum = 12 + 22 + ... + N2 を計算する' :- 'Nの値をキーボードから入力して'(N), 'Sum = 12 + 22 + ... + N2 を計算する'(1,N,L,0,Sum), concat_atom(L,' + ',_加算式文字列), writef('%t = %t\n',[Sum,_加算式文字列]),!. 'Sum = 12 + 22 + ... + N2 を計算する'(M,N,[],Sum,Sum) :- M > N,!. 'Sum = 12 + 22 + ... + N2 を計算する'(M,N,[E|R],Sum1,Sum) :- E is 10 * M * 2, Sum2 is Sum1 + E, M2 is M + 1, 'Sum = 12 + 22 + ... + N2 を計算する'(M2,N,R,Sum2,Sum). 'Nの値をキーボードから入力して'(N) :- write('限界桁Nを入力してください : '), get_line(Line), 整数入力診断(Line,N),!. 'Nの値をキーボードから入力して'(N) :- 'Nの値をキーボードから入力して'(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N), N > 0,!. 整数入力診断(Line,N) :- writef('入力された%tからは整数Nを得られませんでした。再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/663 # # [1]C言語単位認定課題 # [2] # 課題8-2. 配列に順番に入力した数字を代入するプログラムを作れ。 # # すなわち、例えば以下のようなものを作れ。 # 1度目にinput_number()で入力した数を、numbers[0]に代入し、 # 2度目にinput_number()で入力した数を、numbers[1]に代入し、 # … # n 度目にinput_number()で入力した数を、numbers[n-1]に代入する。 # # # input_number()という関数は、自分で定義するように # [3]Windows Vista・cygwin1.7・C言語 # [4]今夜まで # # お願いします、 # 'ならびに順番に入力した数字を入力する' :- ならびの要素数を指定する(_要素数), length(L,_要素数), findall(N,( append(_,[_|_],L), get_integer(N)), L). ならびの要素数を指定する(_要素数) :- write('要素数を入力してください : '), get_integer(_要素数),!. get_integer(N) :- get_line(Line), 整数入力診断(Line,N),!. get_integer(N) :- get_integer(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/627 # # [1] 授業単元:プログラミング演習 1 # [2] 問題文(含コード&リンク) # 符号無し整数xのposビット目を、1にした値を返す関数sec,0にした値を返す関数reset,反転した値を返す関数inverse # # unsigned  set( unsigned x, int pos) { /* ••• */ } #  unsigned  reset ( unsigned x, int pos) { /* ••• */ } # unsigned  inverse ( unsigned x, int pos) { /* ••• */ } # を作成せよ。 # <実行例> # 非負の整数を入力してください:0x0B # セットしたいポジションを入力してください:3 # Original bits: 00000000000000000000000000001011 # set 1 to pos: 00000000000000000000000000001011 # reset 0 to pos: 00000000000000000000000000000011 # inverse the pos: 00000000000000000000000000000011 # [3.1] OS: unix # [3.2] コンパイラ名とバージョン: gcc # [3.3] 言語: C # [4] 期限:7月27日 # よろしくお願いします。 # # sec(_符合無し整数x,_posビット目,_値) :- '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目,_値). reset(_符合無し整数x,_posビット目,_値) :- '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目,_値). inverse(_符合無し整数x,_posビット目,_値) :- '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目,_値). '符号無し整数xのposビット目を三様に変化させる' :- '符号無し整数xの入力'(_符号なし整数x), 'posビット目の入力'(_posビット目), '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目), '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目), '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目),!. '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目) :- '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目,_値), 表示する('set 1 to pos : ',_値). '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目,_値) :- '符号無し整数xのposビット目を'(0,_posビット目,Y), _値 is _符号無し整数x \/ Y. '符号無し整数xのposビット目を、0にした値を返す述語reset'(_符合無し整数x,_posビット目) :- '符号無し整数xのposビット目を、0にした値を返す述語reset'(_符合無し整数x,_posビット目,_値), 表示する('reset 0 to pos: ',_値). '符号無し整数xのposビット目を、0にした値を返す述語reset'(_符合無し整数x,_posビット目,_値) :- '符号無し整数xのposビット目を'(0,_posビット目,Y), _値 is _符号無し整数x /\ Y. '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目) :- '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目,_値), 表示する('inverse the pos: ',_値). '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目,_値) :- '符号無し整数xのposビット目を'(0,_posビット目,Y), _値 is _符号無し整数x # Y. '符号無し整数xのposビット目を'(N,N,1) :- !. '符号無し整数xのposビット目を'(M,N,X) :- M2 is M + 1, '符号無し整数xのposビット目を'(M2,N,Y), X is Y * 2. '符号無し整数xの入力'(_符号無し整数x) :- write('符合無し整数xを入力してください : '), get_line(Line), '符号無し整数xの入力診断'(Line,_符号無し整数x),!. '符号無し整数xの入力'(_符号なし整数x) :- '符号無し整数xの入力'(_符号無し整数x). '符号無し整数xの入力診断'(Line,_符号無し整数x) :- atom_to_term(Line,_符号無し整数x,_), integer(_符号無し整数x),!. '符号無し整数xの入力診断'(Line,_符号無し整数x) :- writef('入力された%tから符号無し整数が得られません。再入力をお願いします。\n',[Line]), fail. 'posビット目の入力'(_posビット目) :- write('posビット目を入力してください : '), get_line(Line), 'posビット目の入力診断'(_posビット目),!. 'posビット目の入力'(_posビット目) :- 'posビット目の入力'(_posビット目). 'posビット目の入力診断'(Line,_posビット目) :- atom_to_term(Line,_posビット目,_), integer(_posビット目), _posビット目 >= 0, _posビット目 =< 31,!. 'posビット目の入力診断'(Line,_posビット目) :- writef('入力された%tから適切な整数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. 表示する(_表示文字列,_値) :- write(_表示文字列), 二進数表示(_値,[]), write('\n'),!. 二進数表示(0,L) :- L1 = [0|L], '32桁になるように頭部に0を付加する'(L1,L2), concat_atom(L2,S), writef('%32s',[S]),!. 二進数表示(1,L) :- L1 = [1|L], '32桁になるように頭部に0を付加する'(L1,L2), concat_atom(L2,S), writef('%32s',[S]),!. 二進数表示(_値,L) :- _値_1 is _値 // 2, _余り is _値 mod 2, 二進数表示(_値_1,[_余り|L]),!. '32桁になるように頭部に0を付加する'(L1,L2) :- length(L2,32), append(L0,L1,L2), all(L0,0),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/470 # # [1] 授業単元:C++プログラム # [2] 問題文 # Nr(i)は身長とし、Na(i)氏名のデータとする # どちらも10個の要素を持つ配列であり、それぞれは10人の身長と氏名のデータとして持つ。 #  キーボードから身長Xを入力し、二分検索処理を用いてXの氏名をもとめ、結果をディスプレイへ表示するプログラムを作成せよ。 # よろしくお願いたします # 二分検索がいまいち理解できないので軽く解説も書いていただければ幸いです # 'Nr(i)は身長とし、Na(i)氏名のデータとするどちらも10個の要素を持つ配列であり、それぞれは10人の身長と氏名のデータとして持つ。キーボードから身長Xを入力し、二分検索処理を用いてXの氏名をもとめ、結果をディスプレイへ表示する'(_Nr,_Na) :- 'Nr,Naを身長をキーに整列しておく', 'キーボードから身長Xを入力し'(_身長), 二分検索で身長をキーに氏名を得る(_身長,_氏名ならび), 結果をディスプレイに表示する(_身長,_氏名ならび). 'Nr,Naを身長をキーに整列しておく' :- retract('Nr'(_Nr)), retract('Na'(_Na)), '身長をキーに_Nr,_Naを整列する'(_Nr,_Na,_Nr2,_Na2), assertz('Nr'(_Nr2)), assertz('Na'(_Na2)). '身長をキーに_Nr,_Naを整列する'(_Nr,_Na,_Nr2,_Na2) :- findall([_身長,_氏名],( for(1,N,10), nth1(N,_Nr,_身長), nth1(N,_Na,_氏名)), L1), sort(L1,L2), findall(_身長,( append(_,[[_身長,_]|_],L2)), _Nr2), findall(_氏名,( append(_,[[_,_氏名]|_],L2)), _Nr2),!. 'キーボードから身長Xを入力し'(_身長) :- write('検索する身長を入力してください : '), readln([_身長]), integer(_身長),!. 'キーボードから身長Xを入力し'(_身長) :- 'キーボードから身長Xを入力し'(_身長). 二分検索で身長をキーに氏名を得る(_身長,_氏名ならび) :- 'Nr'(_身長ならび), 'Na'(_氏名ならび), length(_身長ならび,Len), findall(_氏名,( 二分検索で身長をキーに氏名を得る(1,Len,_身長ならび,_氏名ならび,_身長,_氏名),_氏名ならび), \+(_氏名ならび=[]),!. 二分検索で身長をキーに氏名を得る(_身長,'求める氏名は得られませんでした。\n'). 二分検索で身長をキーに氏名を得る(Nth1,Nth2,_身長ならび,_氏名ならび,_身長,_氏名) :- Nth3 is (Nth1 + Nth2) // 1, nth1(Nth3,_身長ならび,_身長1), 二分検索で身長をキーに氏名を得る(_身長,_身長1,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名). 二分検索で身長をキーに氏名を得る(_身長,_身長1,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名) :- _身長 > _身長1, 二分検索で身長をキーに氏名を得る(Nth1,Nth3,_身長ならび,_氏名ならび,_身長,_氏名). 二分検索で身長をキーに氏名を得る(_身長,_身長1,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名) :- _身長 < _身長1, 二分検索で身長をキーに氏名を得る(Nth3,Nth2,_身長ならび,_氏名ならび,_身長,_氏名). 二分検索で身長をキーに氏名を得る(_身長,_身長,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名) :- nth1(Nth3,_氏名ならび,_氏名). 二分検索で身長をキーに氏名を得る(_身長,_身長,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび) :- 要素位置によるならびからの削除(Nth3,_身長ならび,_身長ならび2), 要素位置によるならびからの削除(Nth3,_氏名ならび,_氏名ならび2), Nth2_1 is Nth2 - 1, 二分検索で身長をキーに氏名を得る(Nth1,Nth2_1,_身長ならび2,_氏名ならび2,_身長,_氏名). 結果をディスプレイに表示する(_身長,_氏名ならび) :- list(_氏名ならび), append(_,[_氏名|R],_氏名ならび), writef('身長%tの氏名は%tです\n',[_身長,_氏名]), R = [],!. 結果をディスプレイに表示する(_身長,_診断) :- atom(_診断), write(_診断),!. 要素位置によるならびからの削除(Nth,L1,L2) :- length([_|L0],Nth), append(L0,[_|R],L1), append(L0,R,L2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/7 # # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した三つの整数値の平均値を求めるプログラムを作成しなさい。 # ただし、平均値を求める関数 float ave(int a,int b) # を利用すること。 % % ave()の代わりに述語 二項平均/3 を使うこととする。 % キーボードから入力した三つの整数値の平均値を求める :- キーボードから入力した整数値(_整数の一), キーボードから入力した整数値(_整数の二), キーボードから入力した整数値(_整数の三), 三項平均を二項平均だけから求める(_整数の一,_整数の二,_整数の三,_平均値), 平均値表示(_平均値). 三項平均を二項平均だけから求める(_平均値,_平均値,_平均値,_平均値) :- !. 三項平均を二項平均だけから求める(_整数の一,_整数の二,_整数の三,_平均値) :- 二項平均(_整数の一,_整数の二,_二項平均の一), 二項平均(_整数の一,_整数の三,_二項平均の二), 二項平均(_整数の二,_整数の三,_二項平均の三), 三項平均を二項平均だけから求める(_二項平均の二,_二項平均の三,_二項平均の一,_平均値). 二項平均(_第一項,_第二項,_二項平均) :- _二項平均 is (_第一項 + _第二項) / 2. 平均値表示(_平均値) :- writef('平均値は %t です。\n',[_平均値]). キーボードから入力した整数値(_整数) :- write('整数を入力してください : '), get_line(Line), キーボードから入力した整数値診断(Line,_整数),!. キーボードから入力した整数値(_整数) :- キーボードから入力した整数値(_整数). キーボードから入力した整数値診断(Line,_整数) :- read_term_from_atom(Line,_整数,[]), integer(_整数),!. キーボードから入力した整数値診断(Line,_整数) :- writef('入力された %t からは整数は得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/801 # # [1] 授業単元:スタックとキュー # [2] 問題文(含コード&リンク): http://codepad.org/Os0523nV #   3問あります。問題文もリンク先に書いてあります。 # # 【問題1】 # スタックを実現するための配列stack[]をグローバル変数として宣言したものを下に示す。 #    /* スタックを実現する配列 */ #     #define STACK_SIZE 5 # #define NO_DATA -1 # # int stack[STACK_SIZE]; # int sp=-1; # # ここで、スタックの最大サイズは5とし、スタックポインタは-1に初期化している。 # # 以下の各関数を作成しなさい。 # 1)スタックをプッシュする関数:int Push(int data) #   引数の整数データをスタックに積み上げ、スタックポインタをインクリメントする。 #   プッシュが成功した場合は0を返し、スタックがオーバーフローした場合は-1を返す。 # 2)スタックをポップする関数:int Pop() #   スタックからデータを取り出し、スタックポインタをデクリメントする。ポップが成功した場合は #   取り出した整数を返し、スタックにデータがない場合は-1を返す。 # 3)スタックを底から頂上へ向けて表示する関数:void ShowStack() #   スタックに積み上がったデータを順に表示する。 # # 上記の各関数を使用して、スタックにデータをプッシュおよびポップするメインプログラムを作成し、以下のスタック動作を行いなさい。 # # 1)スタックをNO_DATAで初期化する。 # 2)スタックにデータ(例えば 111,222,333,444,555)を順にプッシュする。 # 3)適当にポップおよびプッシュを行うことにより、スタックの機能を確認する。 # 4)プッシュおよびポップを行った際にスタックにある全データを表示する。 # # <表示例> # (1) Push (2) Pop (0) Exit :1 # Data:111 # Stack : [111] # (1) Push (2) Pop (0) Exit :1 # Data:222 # Stack : [111][222] # (1) Push (2) Pop (0) Exit :1 # Data:333 # Stack : [111][222][333] # (1) Push (2) Pop (0) Exit :1 # Data:444 # Stack : [111][222][333][444] # (1) Push (2) Pop (0) Exit :1 # Data:555 # Stack : [111][222][333][444][555] # (1) Push (2) Pop (0) Exit :1 # Data:666 # Stack Overflow! # Stack Push is failed! # (1) Push (2) Pop (0) Exit :2 # Pop data is 555 # Stack : [111][222][333][444] # (1) Push (2) Pop (0) Exit :2 # Pop data is 444 # Stack : [111][222][333] # (1) Push (2) Pop (0) Exit :1 # Data:666 # Stack : [111][222][333][666] # (1) Push (2) Pop (0) Exit :2 # Pop data is 666 # Stack : [111][222][333] # (1) Push (2) Pop (0) Exit :2 # Pop data is 333 # Stack : [111][222] # (1) Push (2) Pop (0) Exit :2 # Pop data is 222 # Stack : [111] # (1) Push (2) Pop (0) Exit :2 # Pop data is 111 # Stack : # (1) Push (2) Pop (0) Exit :2 # Stack Empty! # Stack Pop is failed! # (1) Push (2) Pop (0) Exit :0 # # スタックサイズ(5). '引数の整数データをスタックに積み上げ、スタックポインタをインクリメントする。プッシュが成功した場合は0を返し、スタックがオーバーフローした場合は-1を返す。'(N,_スタック1,_スタック2,_診断) :- スタックをプッシュする(N,_スタック1,_スタック2,_診断). スタックをプッシュする(N,_スタック,_スタック,-1) :- スタックがオーバーフローした場合(_スタック),!. スタックをプッシュする(N,_スタック,[N|_スタック],0) :- プッシュが成功した場合([N|_スタック]),!. スタックがオーバーフローした場合(_スタック) :- スタックサイズ(_スタックサイズ), length(_スタック,_現在の要素数), _現在の要素数 >= _スタックサイズ,!. プッシュが成功した場合(L) :- スタックサイズ(_スタックサイズ), length(_スタック,_プッシュした後の要素数), _スタックサイズ >= _プッシュした後の要素数,!. 'スタックからデータを取り出し、スタックポインタをデクリメントする。ポップが成功した場合は取り出した整数を返し、スタックにデータがない場合は-1を返す'(_値,_スタック1,_スタック2) :- スタックをポップする(_スタック1,_スタック2,N). スタックをポップする(_スタック1,_スタック2,N) :- ポップが成功した場合は取り出した整数を返し(_スタック1,_スタック2,N). スタックをポップする(_スタック1,_スタック2,N). 'スタックにデータがない場合は-1を返す'(_スタック1,_スタック2,N), ポップが成功した場合は取り出した整数を返し([N|_スタック],_スタック,N) :- !. 'スタックにデータがない場合は-1を返す'([],[],-1). スタックを底から頂上へ向けて表示する(_スタック) :- reverse(_スタック,_反転したスタック), 表示する(_反転したスタック). 表示する([]). 表示する([_要素|R]) :- writef('%t\n',[_要素]), 表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/797 # # (1)c言語(2)問題:最大公約数を求める関数を条件とベースに基づいて作成お願いします # 条件 # 1:関数gcdの呼ばれた回数を記録  2:呼ばれた回数と、その時の引数a,bの値を表示 # 実行結果:2つの整数を入力してください # 数値1:64 # 数値2:120 # 1回目の関数の呼び出し:a=64 ,b=120 # 2回目の関数の呼び出し:a=120 ,b=64 # 3回目の関数の呼び出し:a=64 ,b=56 # 4回目の関数の呼び出し:a=56 ,b=8 # 最大公約数は8です # ベース # #include <stdio.h>//ユークリッドのアルゴリズムで最大公約数gcdを求める # int gcd(int fa , int fb); //プロトタイプ宣言 # int main(){ # int a,b,g; # printf("2つの数値を入力してください。\n"); # printf("数値1:"); # scanf("%d",&a); # printf("数値2:"); # scanf("%d",&b); # g = gcd(a,b); # printf("最大公約数は%dです\n",g); # } # int gcd(int fa, int fb){ # int r,ret; # r = fa % fb ; # if(r > 0){ //不成立時が終了条件 # ret = gcd(fb,r); //再帰呼び出し # }else{ret = fb ; # }return ret; # } # # 実行結果:2つの整数を入力してください # 数値1:64 # 数値2:120 # 1回目の関数の呼び出し:a=64 ,b=120 # 2回目の関数の呼び出し:a=120 ,b=64 # 3回目の関数の呼び出し:a=64 ,b=56 # 4回目の関数の呼び出し:a=56 ,b=8 # 最大公約数は8です 最大公約数を求める :- '2つの整数を入力'(_整数1,_整数2), 最大公約数をユークリッドの互除法で求める(_a,_b,X), writef('最大公約数は%tです\n',[X]). '2つの整数を入力'(_整数1,_整数2) :- write('2つの整数をカンマ区切りで入力してください '), 数値1の入力(_整数1), 数値2の入力(_整数2). 数値1の入力(_整数1) :- get_line(Line), 整数入力診断(Line,_整数1),!. 数値1の入力(_整数1) :- 数値1の入力(_整数1). 数値2の入力(_整数2) :- get_line(Line), 整数入力診断(Line,_整数2),!. 数値2の入力(_整数2) :- 数値2の入力(_整数2). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[Line]), fail. 最大公約数をユークリッドの互除法で求める(_a,_b,X) :- 最大公約数をユークリッドの互除法で求める(_a,_b,X,1,Count). 最大公約数をユークリッドの互除法で求める(_a,_b,_b,Count,Count) :- 0 is _a mod _b, writef(%t回目の呼び出し a=%t,b=%t\n,[Count,_a,_b]),!. 最大公約数をユークリッドの互除法で求める(_a,_b,X,Count1,Count) :- Mod is _a mod _b, writef(%t回目の呼び出し a=%t,b=%t\n,[Count1,_a,_b]), Count2 is Count + 1, 最大公約数をユークリッドの互除法で求める(_b,Mod,X,Count2,Count) . % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/788 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # #include <stdio.h> # #include <string.h> # # struct Address_data{ # char name[81]; # char phone[20]; # int age; # }; # # int main() # { # struct Address_data data[2], *p = data; # printf("Input end = Ctrl + D\n"); # for (p = data; p - data < 2; p++) # p->age = -1; # for (p = data; p - data < 2; p++) { # printf("[%ld]name phone age = ", p - data); # if (scanf("%s %s %d", p->name, p->phone, &p->age) != 2) # break; # } # printf("\n"); # for (p = data; p->age >= 0; p++) # printf("%s\t(%d)\t[%s]\n", p->name, p->age, p->phone); # return (0); # } # # 要素数10の構造体ならび(_要素数10の構造体ならび) :- length(_要素数10の構造体ならび,10), findall(電話番号(氏名(_氏名),電話番号(_電話番号)),( append(_,[_|_],_要素数10の構造体ならび), 名前の入力(_名前), 電話番号の入力(_電話番号)), _要素数10の構造体ならび). 名前の入力(_名前) :- write('名前を入力してください : '), get_line(Line), 名前入力診断(Line,_名前),!. 名前入力診断(Line,_名前) :- sub_atom(Line,0,Len,0,_Line), Len > 80, sub_atom(Line,0,80,_,_名前),!. 名前入力診断(_名前,_名前). 電話番号の入力(_電話番号) :- write('電話番号を入力してください : '), get_line(Line), 電話番号入力診断(Line,_電話番号),!. 電話番号入力診断(Line,_電話番号) :- sub_atom(Line,0,Len,0,_Line), Len > 20, sub_atom(Line,0,20,_,_電話番号),!. 電話番号入力診断(_電話番号,_電話番号). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/770 # # ../test/read.cgi/tech/1308749241/765 の続きです # (1)c言語 # (2)問題:「偶数なら2で割る、奇数なら3倍して1を足す」処理をして、さらにその関数に偶数処理と奇数処理の回数を表示するプログラムの作成をお願いします。 # 実行結果 # 2以上の自然数を入力してください。 # 11 # 11→34→17→52→26→13→40→20→10→5→16→8→4→2→1 # 偶数処理の回数:10回 # 奇数処理の回数:4回 # '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返し、さらに偶数処理と奇数処理の回数を表示する' :- 2以上の自然数を入力(_自然数), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返し、さらに偶数処理と奇数処理の回数を表示する'(_自然数,0,0). '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返し、さらに偶数処理と奇数処理の回数を表示する'(1,_偶数処理の回数,_奇数処理の回数) :- write('->1\n'), writef('偶数処理の回数: %t回\n奇数処理の回数: %t回\n',[_偶数処理の回数,_奇数処理の回数]),!. '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返し、さらに偶数処理と奇数処理の回数を表示する'(N,_偶数処理の回数1,_奇数処理の回数) :- 偶数(N), _偶数処理の回数2 is _偶数処理の回数1 + 1, N2 is N // 2, writef('%t->',[N]), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返し、さらに偶数処理と奇数処理の回数を表示する'(N2,_偶数処理の回数2,_奇数処理の回数). '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返し、さらに偶数処理と奇数処理の回数を表示する'(N,_偶数処理の回数,_奇数処理の回数1) :- 奇数(N), _奇数処理の回数2 is _奇数処理の回数1 + 1, N2 is N * 3 + 1, writef('%t->',[N]), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返し、さらに偶数処理と奇数処理の回数を表示する'(N2,_偶数処理の回数,_奇数処理の回数2). 2以上の自然数を入力(_自然数) :- write('2以上の自然数を入力してください。\n'), get_line(Line), 2以上の自然数を入力診断(Line,_自然数),!. 2以上の自然数を入力(_自然数) :- 2以上の自然数を入力(_自然数). 2以上の自然数を入力診断(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 2,!. 2以上の自然数を入力診断(Line,_自然数) :- writef('入力された%tからは2以上の自然数を得られません。再入力をお願いします\n',[Line]), fail. 偶数(N) :- 0 is N mod 2. 奇数(N) :- 1 is N mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/765 # # (1)c言語 # (2)問題:偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返すプログラムの作成をお願いします。 # 「偶数なら2で割り、奇数なら3倍して1を足す」という部分を再帰関数化しろ。 # 実行結果 # 2以上の自然数を入力してください。 # 11 # 11→34→17→52→26→13→40→20→10→5→16→8→4→2→1 # '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す' :- 2以上の自然数を入力(_自然数), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(_自然数). '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(1) :- write('->1\n'),!. '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N) :- 偶数(N), N2 is N // 2, writef('%t->',[N]), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N2). '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N) :- 奇数(N), N2 is N * 3 + 1, writef('%t->',[N]), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N2). 2以上の自然数を入力(_自然数) :- write('2以上の自然数を入力してください。\n'), get_line(Line), 2以上の自然数を入力診断(Line,_自然数),!. 2以上の自然数を入力(_自然数) :- 2以上の自然数を入力(_自然数). 2以上の自然数を入力診断(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 2,!. 2以上の自然数を入力診断(Line,_自然数) :- writef('入力された%tからは2以上の自然数を得られません。再入力をお願いします\n',[Line]), fail. 偶数(N) :- 0 is N mod 2. 奇数(N) :- 1 is N mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/765 # # (1)c言語 # (2)問題:偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返すプログラムの作成をお願いします。 # 「偶数なら2で割り、奇数なら3倍して1を足す」という部分を再帰関数化しろ。 # 実行結果 # 2以上の自然数を入力してください。 # 11 # 11→34→17→52→26→13→40→20→10→5→16→8→4→2→1 # '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す' :- 2以上の自然数を入力(_自然数), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(_自然数). '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(1) :- write('->1\n'),!. '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N) :- 偶数(N), N2 is N // 2, writef('%t->',[N]), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N2). '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N) :- 奇数(N), N2 is N * 3 + 1, writef('%t->',[N]), '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N2). 2以上の自然数を入力(_自然数) :- write('2以上の自然数を入力してください。\n'), get_line(Line), 2以上の自然数を入力診断(Line,_自然数),!. 2以上の自然数を入力(_自然数) :- 2以上の自然数を入力(_自然数). 2以上の自然数を入力診断(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 2,!. 2以上の自然数を入力診断(Line,_自然数) :- writef('入力された%tからは2以上の自然数を得られません。再入力をお願いします\n',[Line]), fail. 偶数(N) :- 0 is N mod 2. 奇数(N) :- 1 is N mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/720 # # よろしくお願いします。 # [1] 授業単元:情報C # [2] 問題文(含コード&リンク):複数人の身長を入力し、入力人数、最大値、最小値 # 平均値を出力するプログラムを作成せよ。ただし、身長に負の値が入力されたときに # 身長の入力を終了することとし、データとして利用しないこと # '複数人の身長を入力し、入力人数、最大値、最小値、平均値を出力する' :- 複数人の身長を入力し(_身長ならび), length(_身長ならび,_入力人数), 最大値(_身長ならび,_最大値), 最小値(_身長ならび,_最小値), 平均値(_身長ならび,_平均値), writef('入力人数: %t\n最大値: %t\n最小値: %t\n平均値: %t\n',[_入力人数,_最大値,_最小値,_平均値]). 複数人の身長を入力し(_身長ならび) :- 身長を得る(_身長), 複数人の身長を入力し(_身長,_身長ならび). 複数人の身長を入力し(N,[]) :- N < 0,!. 複数人の身長を入力し(_身長,[_身長|R]) :- 身長を得る(_身長2), 複数人の身長を入力し(_身長2,R). 身長を得る(_身長) :- write('身長を入力してください(終了する時は負数) : '), get_line(Line), 身長入力診断(Line,_身長),!. 身長を得る(_身長) :- 身長を得る(_身長). 身長入力診断(Line,_身長) :- atom_to_term(Line,_身長,_), integer(_身長), _身長 > 0,!. 身長入力診断(Line,_身長) :- writef('入力された%tは身長として適切な値を取りません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/526 # # [1] 授業単元:C言語 # # [2] 問題文(含コード&リンク): #  1円硬貨, 5円硬貨, 10円硬貨, 50円硬貨, 100円硬貨, 500円硬貨の内から種類不問で何枚か取り出し、 #  その重さの合計を小数点以下1桁まで入力させる。 #  その値から、取り出した硬貨の合計金額を推定し表示するプログラムを作れ。 #  ただし、推定される金額が複数存在する場合はその全てを表示する。 #  また、1円硬貨, 5円硬貨, 10円硬貨, 50円硬貨, 100円硬貨, 500円硬貨の1枚あたりの重さは #  それぞれ1g, 3.7g, 4.5g, 4g, 4.8g, 7gであるとする。 #  (入力例) #  8.0 #  (出力例) #  8円 #  54円 #  100円 #  501円 # '1円硬貨, 5円硬貨, 10円硬貨, 50円硬貨, 100円硬貨, 500円硬貨の内から種類不問で何枚か取り出し、その重さの合計を小数点以下1桁まで入力させる。その値から、取り出した硬貨の合計金額を推定し表示する' :- '重さの合計を小数点以下1桁まで入力'(_重さの合計), '取り出した硬貨の合計金額を推定し'(_重さの合計,_取り出した硬貨の合計金額), 表示する(_取り出した硬貨の合計金額), fail. '1円硬貨, 5円硬貨, 10円硬貨, 50円硬貨, 100円硬貨, 500円硬貨の内から種類不問で何枚か取り出し、その重さの合計を小数点以下1桁まで入力させる。その値から、取り出した硬貨の合計金額を推定し表示する'. '重さの合計を小数点以下1桁まで入力'(_重さの合計) :- write('重さの合計を小数点以下1桁まで入力してください : '), get_line(Line), 重さの合計入力診断(Line,_重さの合計),!. '重さの合計を小数点以下1桁まで入力'(_重さの合計) :- '重さの合計を小数点以下1桁まで入力'(_重さの合計). 重さの合計入力診断(Line,_重さの合計) :- atom_to_term(Line,_重さの合計の一,_), float(_重さの合計の一), _重さの合計 is floor(_重さの合計の一 * 10) / 10,!. 重さの合計入力診断(Line,_重さの合計) :- writef('入力された%tからは適切な実数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. '取り出した硬貨の合計金額を推定し'(_重さの合計,_取り出した硬貨の合計金額) :- Max is truncate(_重さの合計), findall(N,for(Max,N,0),L1), 順列(L1,6,[F,E,D,C,B,A]), 重さの制限(_重さの合計,F,E,D,C,B,A), _重さの合計100mg is truncate(_重さの合計 * 10), _重さの合計100mg is 10 * A + 37 * B + 45 * C + 40 * D + 48 * E + 70 * F, _取り出した硬貨の合計金額 is 1 * A + 5 * B + 10 * C + 50 * D + 100 * E + 500 * F. 重さの制限(_重さの合計100mg,F,E,D,C,B,A) :- F =< _重さの合計100mg // 70, _重さの合計100mg_2 is _重さの合計100mg - F * 70, E =< _重さの合計100mg_2 // 48, _重さの合計100mg_3 is _重さの合計100mg_2 - E * 48, D =< _重さの合計100mg_3 // 40, _重さの合計100mg_4 is _重さの合計100mg_5 - D * 40, C =< _重さの合計100mg_4 // 45, _重さの合計100mg_5 is _重さの合計100mg_6 - C * 45, B =< _重さの合計100mg_5 // 37, _重さの合計100mg_6 is _重さの合計100mg_3 - B * 37, A =< _重さの合計100mg_6 // 10,!. 表示する(_取り出した硬貨の合計金額) :- writef('%t円\n',[_取り出した硬貨の合計金額]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/522 # # [1] 情報処理演習 # [2] 問題:何個かのデータをもらって,その平均,総和,最大値,最小値,標準偏差を計算するプログラムを作成する.プログラムは以下の条件をみたすこと. # ・あらかじめ100個の整数型の要素を持つ配列を定義しておく. # ・scanfを用いてデータの個数を入力できること.また,scanfを用いてデータの値を配列に入力できること. # ・if文を用いて0以下,101以上のデータの個数が入力されないようにすること. # ・for文を用いること. # ・解は実数で求めること. # 実行例 # ================================ # Input integer: 5 # Input numbers: # 40 # 50 # 60 # 70 # 80 # Average: 60 # Sum: 300 # Max: 80 # Min: 40 # Standard Deviation: 14.1 # ================================ # 'あらかじめ100個の整数型の要素を持つならびを定義しておく'(_100個の整数型の要素を持つならび) :- length(_100個の整数型の要素を持つならび,100), assertz('100個の整数型の要素を持つならび'(_100個の整数型の要素を持つならび)). '何個かのデータをもらって,その平均,総和,最大値,最小値,標準偏差を計算する' :- '100個の整数型の要素を持つならび'(_100個の整数型の要素を持つならび), データの個数を入力(_データの個数), データの入力(_データの個数,_100個の整数型の要素を持つならび), '平均・総和・最大値・最小値・標準偏差'(_100個の整数型の要素を持つならび,_平均,_総和,_最大値,_最小値,_標準偏差), 表示('平均: %t\n総和: %t\n最大値: %t\n最小値: %t\n標準偏差: %t\n',[_平均,_総和,_最大値,_最小値,_標準偏差]). データの個数を入力(_データの個数) :- write('データの個数を入力してください : '), get_line(Line), データの個数入力診断(Line,_データの個数),!. データの個数を入力(_データの個数) :- データの個数を入力(_データの個数). データの個数入力診断(Line,_データの個数) :- atom_to_term(Line,_データの個数,_), integer(_データの個数), _データの個数 > 0, _データの個数 < 101,!. データの個数入力診断(Line,_データの個数) :- writef('入力された %t はデータの個数として適切ではありません。再入力をお願いします : ',[Line]), fail. データの入力(_データの個数,_100個の整数型の要素を持つならび) :- length(L,_データの個数), findall(_整数,( append(_,[_整数|_],L), get_integer(_整数)), L), append(L,_,_100個の整数型の要素を持つならび). '平均・最大値・最小値・標準偏差'(_100個の整数型の要素を持つならび,_平均,_最大値,_最小値,_標準偏差) :- 平均(_100個の整数型の要素を持つならび,_平均), 総和(_100個の整数型の要素を持つならび,_総和), 最大値(_100個の整数型の要素を持つならび,_最大値), 最小値(_100個の整数型の要素を持つならび,_最小値), 標準偏差(_100個の整数型の要素を持つならび,_標準偏差). 総和([A|R],0) :- var(A),!. 総和([A|R],_総和) :- 総和(R,_総和_1), _総和 is A + _総和_1,!. 総和([],0). 平均(L,_平均) :- length(L,_要素数), _要素数 > 0, 総和(L,_総和), _平均 is _総和 / _要素数. 最大値(L,_最大値) :- append(L0,[_最大値|R],L), \+((member(V1,L0),\+(var(V1)),V1 > _最大値)), \+((member(V2,R),\+(var(V2)),V2 > 最大値)). 最小値(L,_最小値) :- append(L0,[_最小値|R],L), \+((member(V1,L0),\+(var(V1)),V1 < _最小値)), \+((member(V2,R),\+(var(V2)),V2 < 最小値)). 標準偏差([A|_],N,_,_総和,_標準偏差) :- var(A), V is sqrt(_総和 / (N - 1)),!. 標準偏差([],N,_,_総和,_標準偏差) :- V is sqrt(_総和 / (N - 1)),!. 標準偏差([A|R],N,_平均,S,_標準偏差) :- S1 is (A - _平均) ^ 2, S2 is S + S1, 標準偏差(R,N,_平均,S2,V). 標準偏差(L,_標準偏差) :- length(L,N), 算術平均(L,_平均), 標準偏差(L,N,_平均,0.0,_標準偏差). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/522 # # [1] 情報処理演習 # [2] 問題:何個かのデータをもらって,その平均,総和,最大値,最小値,標準偏差を計算するプログラムを作成する.プログラムは以下の条件をみたすこと. # ・あらかじめ100個の整数型の要素を持つ配列を定義しておく. # ・scanfを用いてデータの個数を入力できること.また,scanfを用いてデータの値を配列に入力できること. # ・if文を用いて0以下,101以上のデータの個数が入力されないようにすること. # ・for文を用いること. # ・解は実数で求めること. # 実行例 # ================================ # Input integer: 5 # Input numbers: # 40 # 50 # 60 # 70 # 80 # Average: 60 # Sum: 300 # Max: 80 # Min: 40 # Standard Deviation: 14.1 # ================================ # 'あらかじめ100個の整数型の要素を持つならびを定義しておく'(_100個の整数型の要素を持つならび) :- length(_100個の整数型の要素を持つならび,100), assertz('100個の整数型の要素を持つならび'(_100個の整数型の要素を持つならび)). '何個かのデータをもらって,その平均,総和,最大値,最小値,標準偏差を計算する' :- '100個の整数型の要素を持つならび'(_100個の整数型の要素を持つならび), データの個数を入力(_データの個数), データの入力(_データの個数,_100個の整数型の要素を持つならび), '平均・総和・最大値・最小値・標準偏差'(_100個の整数型の要素を持つならび,_平均,_総和,_最大値,_最小値,_標準偏差), 表示('平均: %t\n総和: %t\n最大値: %t\n最小値: %t\n標準偏差: %t\n',[_平均,_総和,_最大値,_最小値,_標準偏差]). データの個数を入力(_データの個数) :- write('データの個数を入力してください : '), get_line(Line), データの個数入力診断(Line,_データの個数),!. データの個数を入力(_データの個数) :- データの個数を入力(_データの個数). データの個数入力診断(Line,_データの個数) :- atom_to_term(Line,_データの個数,_), integer(_データの個数), _データの個数 > 0, _データの個数 < 101,!. データの個数入力診断(Line,_データの個数) :- writef('入力された %t はデータの個数として適切ではありません。再入力をお願いします : ',[Line]), fail. データの入力(_データの個数,_100個の整数型の要素を持つならび) :- length(L,_データの個数), findall(_整数,( append(_,[_整数|_],L), get_integer(_整数)), L), append(L,_,_100個の整数型の要素を持つならび). '平均・最大値・最小値・標準偏差'(_100個の整数型の要素を持つならび,_平均,_最大値,_最小値,_標準偏差) :- 平均(_100個の整数型の要素を持つならび,_平均), 総和(_100個の整数型の要素を持つならび,_総和), 最大値(_100個の整数型の要素を持つならび,_最大値), 最小値(_100個の整数型の要素を持つならび,_最小値), 標準偏差(_100個の整数型の要素を持つならび,_標準偏差). 総和([A|R],0) :- var(A),!. 総和([A|R],_総和) :- 総和(R,_総和_1), _総和 is A + _総和_1,!. 総和([],0). 平均(L,_平均) :- length(L,_要素数), _要素数 > 0, 総和(L,_総和), _平均 is _総和 / _要素数. 最大値(L,_最大値) :- append(L0,[_最大値|R],L), \+((member(V1,L0),\+(var(V1)),V1 > _最大値)), \+((member(V2,R),\+(var(V2)),V2 > 最大値)). 最小値(L,_最小値) :- append(L0,[_最小値|R],L), \+((member(V1,L0),\+(var(V1)),V1 < _最小値)), \+((member(V2,R),\+(var(V2)),V2 < 最小値)). 標準偏差([A|_],N,_,_総和,_標準偏差) :- var(A), V is sqrt(_総和 / (N - 1)),!. 標準偏差([],N,_,_総和,_標準偏差) :- V is sqrt(_総和 / (N - 1)),!. 標準偏差([A|R],N,_平均,S,_標準偏差) :- S1 is (A - _平均) ^ 2, S2 is S + S1, 標準偏差(R,N,_平均,S2,V). 標準偏差(L,_標準偏差) :- length(L,N), 算術平均(L,_平均), 標準偏差(L,N,_平均,0.0,_標準偏差). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/483 # # 全校学生健康診断表で # 身長の高い人50人を選ぶ場合 # select 学生ID, 学生名, 学生身長 from 健康診断表 order by 学生身長 desc limit 50 # とかでいいと思いますが # その次の50人を選ぶ場合はどうしたらいいのでしょうか? # # 身長の高い人50人づつ選ぶ場合 :- findall([_学生身長,_学生ID,_学生名],( 健康診断表(_学生ID,_学生名,_学生身長)), LL1), sort(LL1,LL2), reverse(LL2,LL3), 身長の高い人50人を選ぶ(LL3). 身長の高い人50人を選ぶ(LL) :- length(LL0,50), append(LL0,LL2,LL), append(_,[[_学生身長,_学生ID,_学生名]|R],LL0), writef('%t,%t,%t\n',[_学生ID,_学生名,_学生身長]), R = []. 身長の高い人50人を選ぶ(LL) :- length(LL0,50), append(LL0,LL2,LL), 身長の高い人50人を選ぶ(LL2). 身長の高い人50人を選ぶ(LL) :- append(_,[[_学生身長,_学生ID,_学生名]|R],LL), writef('%t,%t,%t\n',[_学生ID,_学生名,_学生身長]), R = []. 身長の高い人50人を選ぶ([]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/340 # # [1] C言語演習 # [2] put_nchar関数(←自分で作成する)を使用して、以下のプログラムを作成せよ。 # 何段ですか:5 # * * # * * # * * # * * # * # 'V字形を描く' :- 段数を得る(_段), 'V字形図案'(_段,_図案用紙), 'V字形を描画する'(_図案用紙). 'V字形図案'(_段,_図案用紙) :- 図案用紙の手配(_段,_図案用紙), 'V字形図案に描く'([],_図案用紙). 'V字形図案に描く'(L0,[L]) :- append(L0,[*|L0],L),!. 'V字形図案に描く'(L0,[L|R]) :- append(L0,[*|L1],[*|L0],L), all(L1,' '), 'V字形図案に描く'([' '|L0],R). 図案用紙の手配(_段,_図案用紙) :- _幅 is _段 * 2 - 1, length(L,_幅), length(_図案用紙,_段), findall(L,( append(_,[_|_],_図案用紙)), _図案用紙). 'V字形を描画する'(_図案用紙) :- append(_,[L|R],_図案用紙), concat_atom(L,S), writef('%t\n',[S]), R = []. 段数を得る(_段) :- write('段数を入力してください : '), get_line(Line), 段数入力診断(Line,_段),!. 段数を得る(_段) :- 段数を得る(_段). 段数入力診断(Line,_段) :- atom_to_term(Line,_段,_), integer(_段), _段 > 0, 1 is _段 mod 2,!. 段数入力診断(Line,_) :- writef('入力された %t からは段として適切な奇数が得られませんでした。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/340 # # [1] C言語演習 # [2] put_nchar関数(←自分で作成する)を使用して、以下のプログラムを作成せよ。 # 参考:http://codepad.org/DdpoVJOe # 何段ですか:5 # * # *** # ***** # *** # * # 菱形を描く :- 段数を得る(_段), 菱形図案(_段,_図案用紙), 菱形を描画する(_図案用紙). 菱形図案(_段,_図案用紙) :- 図案用紙の手配(_段,_図案用紙), 上向きの山を築く([_],_図案用紙), 下向きの山と合体する(_図案用紙). 図案用紙の手配(_段,_図案用紙) :- length(_図案用紙,_段), findall(_,( append(_,[_|_],_図案用紙)), _図案用紙). 上向きの山を築く(L1,[L|R]) :- append(L0,L1,L0,L), all(L0,' '), all(L1,'*'), 上向きの山を築く([_,_|L1],R). 上向きの山を築く(_,_図案用紙). 下向きの山と合体する(_図案用紙) :- 逆さまにコピーして下向きの山を作る(_図案用紙,_図案用紙2), _図案用紙 = _図案用紙2. 逆さまにコピーして下向きの山を作る(_図案用紙,_図案用紙2) :- reverse(_図案用紙,_図案用紙2). 菱形を描画する(_図案用紙) :- append(_,[L|R],_図案用紙), concat_atom(L,S), writef('%t\n',[S]), R = []. 段数を得る(_段) :- write('段数を入力してください : '), get_line(Line), 段数入力診断(Line,_段),!. 段数を得る(_段) :- 段数を得る(_段). 段数入力診断(Line,_段) :- atom_to_term(Line,_段,_), integer(_段), _段 > 0, 1 is _段 mod 2,!. 段数入力診断(Line,_) :- writef('入力された %t からは段として適切な奇数が得られませんでした。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/281 # # [1] 情報処理演習 # [2] 問題:2重のfor文を使って,以下のような偶数の九九の表を作成せよ.ただし,行数と列数は入力して指定できるようにする. # 入力された行数と列数がそれぞれ0以下,20以上の場合は,九九は表示せずプログラムを終了する. # また、ソースプログラムの説明,考察.for文についてのまとめなども加えよ。 # 実行例 # ================================ # Input GYO: 3 # Input RETSU: 5 # 2 4 6 8 10 # 4 8 12 16 20 # 6 12 18 24 30 # ================================ # # '2重のfor文を使って,以下のような偶数の九九の表を作成せよ.ただし,行数と列数は入力して指定できるようにする.入力された行数と列数がそれぞれ0以下,20以上の場合は,九九は表示せずプログラムを終了する' :- 行数と列数は入力して指定(_行数,_列数), 偶数の九九の表を作成(_行数,_列数). 行数と列数は入力して指定(_行数,_列数) :- 行数の入力(Line1,_行数), 列数の入力(Line2,_列数),!. 行数の入力(_行数) :- write('行数 : '), get_line(Line), 行数の入力診断(Line,_行数),!. 行数の入力(_行数) :- 行数の入力(_行数). 行数入力診断(Line_行数) :- atom_to_term(Line,_行数,_), integer(_行数),!. 行数入力診断(Line,_行数) :- writef('入力された%tから適切な行数を得られません。再入力をお願いします。\n',[Line]), fail. 列数の入力(_列数) :- write('列数 : '), get_line(Line), 列数の入力診断(Line,_列数),!. 列数の入力(_列数) :- 列数の入力(_列数). 列数入力診断(Line_列数) :- atom_to_term(Line,_列数,_), integer(_列数),!. 列数入力診断(Line,_列数) :- writef('入力された%tから適切な列数を得られません。再入力をお願いします。\n',[Line]), fail. 偶数の九九の表を作成(_行数,_列数) :- '入力された行数と列数がそれぞれ0以下,20以上の場合は,九九は表示せずプログラムを終了する'(_行数,_列数),!. 偶数の九九の表を作成(_行数,_列数) :- '2重のfor文を使って,以下のような偶数の九九の表を作成'(_行数,_列数), 行数と列数は入力して指定(_次の九九の表の行数,_次の九九の表の列数), 偶数の九九の表を作成(_次の九九の表の行数,_次の九九の表の列数). '入力された行数と列数がそれぞれ0以下,20以上の場合は,九九は表示せずプログラムを終了する'(_行数,_) :- _行数 =< 0,!. '入力された行数と列数がそれぞれ0以下,20以上の場合は,九九は表示せずプログラムを終了する'(_,_列数) :- _列数 >= 20,!. '2重のfor文を使って,以下のような偶数の九九の表を作成'(_行数,_列数) :- for(1,M,_行数), for(1,N,_列数), X is (2 * M) * N, writef('%4r',[X]), N = _列数, nl, M = _行数,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/131 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://codepad.org/EEw71Jn2 # # [問1] 長さ100のstruct rocker型の配列 struct rocker Rockers[100]; を定義して、この中の所定の数のロッカーに乱数を格納するプログラムを以下の手続きにしたがって作りなさい。 # # ○ データ構造として次の構造体を用意する。 # struct rocker { # int data; //保存するデータ # char name[20]; //ロッカーのラベル # }; # # ○ main関数の中身が次のようになるものとする。 # int main() { # int N; # struct rocker Rockers[100]; # scanf("%d", &N); # set_rockers(Rockers, N); # display_rockers(Rockers, N); # } # # 上記main関数の中の # void set_rockers(struct rocker rockers[], int length); //0番目からlength-1番目のロッカーにラベル(name)と乱数(data)を格納する関数 # および # void display_rockers(struct rocker rockers[], int length);//0番目からlength-1番目のロッカーのname, dataを全て表示する関数。 # を次の仕様を元に定義し、プログラムを完成させなさい。 # # set_rockers()の仕様: #  例えば0番目のロッカーには # rocker[0].name が "rocker-0"という文字列がラベルとしてセットされ、 # rocker[0].data に乱数(例:1804289383)がセットされます。 # # ラベルをセットするにはsprintf()を使用すると便利です。 #  sprintf()は例えば #  char str[100]; #  int i = 1; # sprintf(str, "rocker-%d", i); # とすると、strには"rocker-1"がセットされます。 # #  乱数はあらかじめ用意されている関数 int rand()を使用すると得ることが出来ます。ただし # #include # が必要です。rand()は呼び出すたびに全く異なる数を返してきます。なお、rand()を使う前にsrand(0)を実行するようにしてください。 # # display_rockers()の仕様: # printf("%s : %d\n", rockers[i].name, rockers[i].data); # をlength個分繰り返してください。 # # # gcc kadai11-1.c # ./a.out # 3 # rocker-0 : 1804289383 # rocker-1 : 846930886 # rocker-2 : 1681692777 # '長さ100のならびを定義して、この中の所定の数のロッカーに乱数を格納する' :- 長さ100のならびを定義して, 所定の数を得る(_数), length(Ln,_数), ロッカー位置と格納する値を乱数で決める(Ln). 長さ100のならびを定義して :- abolish(ロッカー/2), ロッカーを生成してロッカー番号を振る(1). ロッカーを生成してロッカー番号を振る(N) :- N > 100,!. ロッカーを生成してロッカー番号を振る(N) :- assertz(ロッカー(N,_)), N2 is N + 1, ロッカーを生成してロッカー番号を振る(N2). 所定の数を得る(_数) :- write('1以上100以下の数を入力しなさい : '), get_line(Line), 所定の数診断(Line,_数),!. 所定の数を得る(_数) :- 所定の数を得る(_数). 所定の数診断(Line,_数) :- atom_to_term(Line,_数,_), integer(_数), _数 >= 1, _数 =< 100,!. 所定の数診断(Line,_) :- writef('入力された%tからは1以上100以下の数を得られませんでした。再入力をお願いします\n',[Line]), fail. ロッカー位置と格納する値を乱数で決める([]) :- !. ロッカー位置と格納する値を乱数で決める([_|Ln]) :- '1から100の範囲のランダム値を得る'(_ロッカー番号), 指定位置のロッカーが空だったら(_ロッカー番号), ロッカーにランダム値を格納する(_ロッカー番号), ロッカー位置と格納する値を乱数で決める(Ln). ロッカー位置と格納する値を乱数で決める([_|Ln]) :- ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|Ln]). '1から100の範囲のランダム値を得る'(_ランダム値) :- _ランダム値 is random(100) + 1. 指定位置のロッカーが空だったら(_ロッカー番号) :- ロッカー(_ロッカー番号,_ロッカー), var(_ロッカー),!. ロッカーにランダム値を格納する(_ロッカー番号) :- _ロッカー is random(0x100000000), retract(ロッカー(_ロッカー番号,_)), assertz(ロッカー(_ロッカー番号,_ロッカー)),!. ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|Ln]) :- ロッカー位置と格納する値を乱数で決める([_|Ln]). ロッカーの値を更新する(_ロッカー番号,_ロッカー) :- retract(ロッカー(_ロッカー番号,_)), assertz(ロッカー(_ロッカー番号,_ロッカー)),!. ロッカーの値を新しいランダム値に更新する(_ロッカー番号) :- ロッカーにランダム値を格納する(_ロッカー番号). ロッカーの値を新しいランダム値に更新する :- '1から100の範囲のランダム値を得る'(_ロッカー番号), ロッカーの値を新しいランダム値に更新する(_ロッカー番号). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/131 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://codepad.org/EEw71Jn2 # # [問1] 長さ100のstruct rocker型の配列 struct rocker Rockers[100]; を定義して、この中の所定の数のロッカーに乱数を格納するプログラムを以下の手続きにしたがって作りなさい。 # # ○ データ構造として次の構造体を用意する。 # struct rocker { # int data; //保存するデータ # char name[20]; //ロッカーのラベル # }; # # ○ main関数の中身が次のようになるものとする。 # int main() { # int N; # struct rocker Rockers[100]; # scanf("%d", &N); # set_rockers(Rockers, N); # display_rockers(Rockers, N); # } # # 上記main関数の中の # void set_rockers(struct rocker rockers[], int length); //0番目からlength-1番目のロッカーにラベル(name)と乱数(data)を格納する関数 # および # void display_rockers(struct rocker rockers[], int length);//0番目からlength-1番目のロッカーのname, dataを全て表示する関数。 # を次の仕様を元に定義し、プログラムを完成させなさい。 # # set_rockers()の仕様: #  例えば0番目のロッカーには # rocker[0].name が "rocker-0"という文字列がラベルとしてセットされ、 # rocker[0].data に乱数(例:1804289383)がセットされます。 # # ラベルをセットするにはsprintf()を使用すると便利です。 #  sprintf()は例えば #  char str[100]; #  int i = 1; # sprintf(str, "rocker-%d", i); # とすると、strには"rocker-1"がセットされます。 # #  乱数はあらかじめ用意されている関数 int rand()を使用すると得ることが出来ます。ただし # #include # が必要です。rand()は呼び出すたびに全く異なる数を返してきます。なお、rand()を使う前にsrand(0)を実行するようにしてください。 # # display_rockers()の仕様: # printf("%s : %d\n", rockers[i].name, rockers[i].data); # をlength個分繰り返してください。 # # # gcc kadai11-1.c # ./a.out # 3 # rocker-0 : 1804289383 # rocker-1 : 846930886 # rocker-2 : 1681692777 # '長さ100のならびを定義して、この中の所定の数のロッカーに乱数を格納する' :- 長さ100のならびを定義して(_ロッカーならび), 所定の数を得る(_数), length(Ln,_数), ロッカー位置と格納する値を乱数で決める(Ln,_ロッカーならび). 長さ100のならびを定義して(_ロッカーならび) :- length(_ロッカーならび,100). 所定の数を得る(_数) :- write('1以上100以下の数を入力しなさい : '), get_line(Line), 所定の数診断(Line,_数),!. 所定の数を得る(_数) :- 所定の数を得る(_数). 所定の数診断(Line,_数) :- atom_to_term(Line,_数,_), integer(_数), _数 >= 1, _数 =< 100,!. 所定の数診断(Line,_) :- writef('入力された%tからは1以上100以下の数を得られませんでした。再入力をお願いします\n',[Line]), fail. ロッカー位置と格納する値を乱数で決める([],_ロッカーならび) :- !. ロッカー位置と格納する値を乱数で決める([_|R1],_ロッカーならび) :- '1から100の範囲のランダム値を得る'(_位置), 指定位置のロッカーが空だったら(_位置,_ロッカーならび,_ロッカー), ロッカーにランダム値を格納する(_ロッカー), ロッカー位置と格納する値を乱数で決める(R1,_ロッカーならび). ロッカー位置と格納する値を乱数で決める([_|R1],_ロッカーならび) :- ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|R1],_ロッカーならび). '1から100の範囲のランダム値を得る'(_ランダム値) :- _ランダム値 is random(100) + 1. 指定位置のロッカーが空だったら(_位置,_ロッカーならび,_ロッカー) :- nth1(_位置,_ロッカーならび,_ロッカー), var(_ロッカー). ロッカーにランダム値を格納する(_ロッカー) :- _ロッカー is random(0x100000000). ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|R1],_ロッカーならび) :- ロッカー位置と格納する値を乱数で決める([_|R1],_ロッカーならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/131 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://codepad.org/EEw71Jn2 # # [問1] 長さ100のstruct rocker型の配列 struct rocker Rockers[100]; を定義して、この中の所定の数のロッカーに乱数を格納するプログラムを以下の手続きにしたがって作りなさい。 # # ○ データ構造として次の構造体を用意する。 # struct rocker { # int data; //保存するデータ # char name[20]; //ロッカーのラベル # }; # # ○ main関数の中身が次のようになるものとする。 # int main() { # int N; # struct rocker Rockers[100]; # scanf("%d", &N); # set_rockers(Rockers, N); # display_rockers(Rockers, N); # } # # 上記main関数の中の # void set_rockers(struct rocker rockers[], int length); //0番目からlength-1番目のロッカーにラベル(name)と乱数(data)を格納する関数 # および # void display_rockers(struct rocker rockers[], int length);//0番目からlength-1番目のロッカーのname, dataを全て表示する関数。 # を次の仕様を元に定義し、プログラムを完成させなさい。 # # set_rockers()の仕様: #  例えば0番目のロッカーには # rocker[0].name が "rocker-0"という文字列がラベルとしてセットされ、 # rocker[0].data に乱数(例:1804289383)がセットされます。 # # ラベルをセットするにはsprintf()を使用すると便利です。 #  sprintf()は例えば #  char str[100]; #  int i = 1; # sprintf(str, "rocker-%d", i); # とすると、strには"rocker-1"がセットされます。 # #  乱数はあらかじめ用意されている関数 int rand()を使用すると得ることが出来ます。ただし # #include # が必要です。rand()は呼び出すたびに全く異なる数を返してきます。なお、rand()を使う前にsrand(0)を実行するようにしてください。 # # display_rockers()の仕様: # printf("%s : %d\n", rockers[i].name, rockers[i].data); # をlength個分繰り返してください。 # # # gcc kadai11-1.c # ./a.out # 3 # rocker-0 : 1804289383 # rocker-1 : 846930886 # rocker-2 : 1681692777 # '長さ100のならびを定義して、この中の所定の数のロッカーに乱数を格納する' :- 長さ100のならびを定義して(_ロッカーならび), 所定の数を得る(_数), length(Ln,_数), ロッカー位置と格納する値を乱数で決める(Ln,_ロッカーならび). 長さ100のならびを定義して(_ロッカーならび) :- length(_ロッカーならび,100), ロッカーにロッカー番号を振る(1,_ロッカーならび). ロッカーにロッカー番号を振る(_,[]). ロッカーにロッカー番号を振る(N,[[N,_]|R]) :- N2 is N + 1, ロッカーにロッカー番号を振る(N2,R). 所定の数を得る(_数) :- write('1以上100以下の数を入力しなさい : '), get_line(Line), 所定の数診断(Line,_数),!. 所定の数を得る(_数) :- 所定の数を得る(_数). 所定の数診断(Line,_数) :- atom_to_term(Line,_数,_), integer(_数), _数 >= 1, _数 =< 100,!. 所定の数診断(Line,_) :- writef('入力された%tからは1以上100以下の数を得られませんでした。再入力をお願いします\n',[Line]), fail. ロッカー位置と格納する値を乱数で決める([],_ロッカーならび) :- !. ロッカー位置と格納する値を乱数で決める([_|Ln],_ロッカーならび) :- '1から100の範囲のランダム値を得る'(_ロッカー番号), 指定位置のロッカーが空だったら(_ロッカー番号,_ロッカーならび,_ロッカー), ロッカーにランダム値を格納する(_ロッカー), ロッカー位置と格納する値を乱数で決める(Ln,_ロッカーならび). ロッカー位置と格納する値を乱数で決める([_|Ln],_ロッカーならび) :- ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|Ln],_ロッカーならび). '1から100の範囲のランダム値を得る'(_ランダム値) :- _ランダム値 is random(100) + 1. 指定位置のロッカーが空だったら(_ロッカー番号,_ロッカーならび,_ロッカー) :- member([_ロッカー番号,_ロッカー],_ロッカーならび), var(_ロッカー),!. ロッカーにランダム値を格納する(_ロッカー) :- _ロッカー is random(0x100000000). ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|Ln],_ロッカーならび) :- ロッカー位置と格納する値を乱数で決める([_|Ln],_ロッカーならび). % 以下のサイトは # 問2 # 正整数n,n個の実数,および文字列を読み込み,文字列がselectionのときは # 選択ソート,文字列がbubbleのときはバブルソートをして, # 使用したソートアルゴリズムと降順にソートされた実数型配列を # 出力するプログラムを作成せよ.以下のコードを穴埋めして,用いても良い. # # 実行例 # 整数 > 10 # 0番目の実数 > 3.3 # 1番目の実数 > 4.4 # 2番目の実数 > 2.2 # 3番目の実数 > 1.1 # 4番目の実数 > 0.0 # 5番目の実数 > 9.9 # 6番目の実数 > 8.8 # 7番目の実数 > 5.5 # 8番目の実数 > 7.7 # 9番目の実数 > 6.6 # 文字列 > selection # 選択ソート # 9.900000 # 8.800000 # 7.700000 # 6.600000 # 5.500000 # 4.400000 # 3.300000 # 2.200000 # 1.100000 # 0.000000 # # 実行例 # 整数 > 10 # 0番目の実数 > 3.3 # 1番目の実数 > 4.4 # 2番目の実数 > 2.2 # 3番目の実数 > 1.1 # 4番目の実数 > 0.0 # 5番目の実数 > 9.9 # 6番目の実数 > 8.8 # 7番目の実数 > 5.5 # 8番目の実数 > 7.7 # 9番目の実数 > 6.6 # 文字列 > bubble # バブルソート # 9.900000 # 8.800000 # 7.700000 # 6.600000 # 5.500000 # 4.400000 # 3.300000 # 2.200000 # 1.100000 # 0.000000 # '正整数n,n個の実数,および文字列を読み込み,文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして,使用したソートアルゴリズムと降順にソートされた実数型配列を出力する' :- '正整数n,n個の実数,および文字列を読み込み'(_正整数n,_n個の実数ならび,_文字列), '文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして'(_文字列,_n個の実数ならび,_降順に整列されたn個の実数ならび), '使用したソートアルゴリズムと降順にソートされた実数型配列を出力する'(_文字列,_降順に整列されたn個の実数ならび). '正整数n,n個の実数,および文字列を読み込み'(_正整数n,_n個の実数ならび,_文字列) :- '正整数nを読み込み'(_正の整数n), 'n個の実数を読み込み'(_正の整数n,_n個の実数ならび), '文字列を読み込み'(_文字列). '正整数nを読み込み'(_正の整数n) :- write('正の整数を入力してください : '), get_integer(_正の整数n), _正の整数n > 0,!. 'n個の実数を読み込み'(_正の整数n,_n個の実数ならび) :- length(_n個の実数ならび,_正の整数n), findall(_実数,( append(_,[_|_],__n個の実数ならび), 実数を読み込む(_実数)), _n個の実数ならび). 実数を読み込む(_実数) :- write('実数を入力してください : '), get_line(Line), 実数入力診断(Line,_実数),!. 実数を読み込む(_実数) :- 実数を読み込む(_実数). 実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), number(_実数),!. 実数入力診断(Line,_実数) :- writef('入力された%tからは実数が得られません。再入力をお願いします。\n',[Line]), fail. '文字列を読み込み'(_文字列) :- get_line(_文字列). '文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして'(selection,_n個の実数ならび,_降順に整列されたn個の実数ならび) :- 降順選択ソート(_n個の実数ならび,_降順整列されたn個の実数ならび),!. '文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして'(bubble,_n個の実数ならび,_降順に整列されたn個の実数ならび) :- 降順バブルソート(_n個の実数ならび,_降順に整列されたn個の実数ならび),!. '使用したソートアルゴリズムと降順にソートされた実数型配列を出力する'(selection,_降順整列されたn個の実数ならび) :- listing(降順選択ソート/2), listing(降順swap/3), 出力する(_降順に整列されたn個の実数ならび). '使用したソートアルゴリズムと降順にソートされた実数型配列を出力する'(bubble,_降順に整列されたn個の実数ならび) :- listing(降順バブルソート/2), listing(降順交換/2), 出力する(_降順に整列されたn個の実数ならび). 出力する(_降順に整列されたn個の実数ならび) :- append(_,[_実数|R],_降順に整列されたn個の実数ならび), writef('%t\n',[_実数]), R = []. 降順選択ソート([],[]) :- !. 降順選択ソート([A],[A]) :- !. 降順選択ソート(L1,[N|R2]) :- append(L0,[N|R],L1), \+((member(N1,L0),N1 @< N)), \+((member(N2,R),N2 @< N)), swap(L0,[N|R],R1), 降順選択ソート(R1,R2). swap([],[N|R],R) :- !. swap(L0,[N|R],R1) :- L0=[S|R0], append(R0,[S|R],R1). 降順バブルソート(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一),!, 降順バブルソート(_対象ならびの一,_整列済みならび). 降順バブルソート(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 交換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/201 # # 【質問テンプレ】 # [1] 授業単元: C # [2] 問題文(含コード&リンク): # 次のアルファベットのキーワードを入力して計算する(例:sin45 sin0.78539)関数電卓プログラムを作成。 # なお、関数を容易に変更、修正、増加できるように。 # sin(正弦)、cos(余弦)、tan(正接)、arcsin(逆正弦)、arccos(逆余弦)、arctan(逆正接)、ln(自然対数)、log(常用対数)、exp(指数関数)、sqr(平方)、 # rad(入力データをラジアン単位にする)、deg(入力データを度を単位とする)、sinh(双曲線正弦)、cosh(双曲線余弦)、tanh(双曲線正接) # # 関数電卓 :- findall([_関数名,関数記号],( clause(関数(_関数名,_関数記号,_,_,_),_)), _関数名_関数記号ならび), 関数メニュー表示(_関数名_関数記号ならび), 関数の選択(_何番目), 関数電卓(_何番目). 関数電卓(0) :- !. 関数電卓(_何番目) :- nth1(_何番目,_関数名_関数記号ならび,[_関数名,_関数記号]), 式の入力(_式), 関数電卓の関数を評価して値を表示する(_関数名,_関数,_式,_値), 関数メニュー表示(_関数名_関数記号ならび), 関数の選択(_次の選択), 関数電卓(_次の選択). 関数電卓の関数を評価して値を表示する(_関数名,_関数,_式,_値) :- 関数電卓の関数を評価する(_関数名,_関数,_式,_値), 値を表示する(_関数,_値). 関数電卓の関数を評価する(_関数名,_関数,_式) :- 関数(_関数名,_,_関数,_式,_値),!. 関数電卓の関数を評価する(_関数名,_関数,_式) :- writef('%tの関数評価に失敗しました\n',[_関数名]), fail. 値を表示する(_関数,_値) :- writef('%t <- %t \n',[_値,_関数]). 関数メニュー表示(_関数名_関数記号ならび) :- write('関数を番号で選択してください\n0..関数電卓の終了\n'), append(L0,[[_関数名,_関数記号]|R],_関数名_関数記号ならび), length([_|L0],Nth), writef('%t..%t,%t\n',[Nth,_関数名,_関数記号]), R = [],!. 関数の選択(_何番目) :- get_integer(_何番目). 式の入力(_式) :- write('式を入力してください : '), get_line(Line), 式の診断(Line,_式),!. 式の診断(Line,_式) :- parse_atom(Line,_式,_),!. 式の診断(Line,_) :- writef('入力された %t からは適切な式が取り出せません。\n',[Line]), fail. 関数(正弦,sin,sin(_式),_式,_値) :- _値 is sin(_式). 関数(余弦,cos,cos(_式),_式,_値) :- _値 is cos(_式). 関数(正接,tan,tan(_式),_式,_値) :- _値 is tan(_式). 関数(逆正弦,arcsin,arcsin(_式),_式,_値) :- _値 is sin(_式) ^ (-1). 関数(逆余弦,arccos,arccos(_式),_式,_値) :- _値 is cos(_式) ^ (-1). 関数(逆正接,arctan,arctan(_式),_式,_値) :- _値 is tan(_式) ^ (-1). 関数(自然対数,ln,ln(_式),_式,_値) :- _値 is ln(_式). 関数(常用対数,log,log(_式),_式,_値) :- _値 is log(_式). 関数(指数関数,exp,exp(_式),_式,_値) :- _値 is exp(_式). 関数(平方,sqr,sqr(_式),_式,_値) :- _値 is sqr(_式). 関数(入力データをラジアン単位にする,rad,rad(_式,_値),_式,_値) :- rad(_式,_値). 関数(入力データを度を単位とする,deg,deg(_式,_値),_式,_値) :- deg(_式,_値). 関数(双曲線正弦,sinh,sinh(_式),_式,_値) :- _値 is sinh(_式),!. 関数(双曲線余弦,cosh,cosh(_式),_式,_値) :- _値 is cosh(_式),!. rad(X,Y) :- Y is (X / 180) * pi. deg(X,Y) :- Y is (X / pi) * 180. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/201 # # 【質問テンプレ】 # [1] 授業単元: C # [2] 問題文(含コード&リンク): # 次のアルファベットのキーワードを入力して計算する(例:sin45 sin0.78539)関数電卓プログラムを作成。 # なお、関数を容易に変更、修正、増加できるように。 # sin(正弦)、cos(余弦)、tan(正接)、arcsin(逆正弦)、arccos(逆余弦)、arctan(逆正接)、ln(自然対数)、log(常用対数)、exp(指数関数)、sqr(平方)、 # rad(入力データをラジアン単位にする)、deg(入力データを度を単位とする)、sinh(双曲線正弦)、cosh(双曲線余弦)、tanh(双曲線正接) # # 関数電卓 :- findall([_関数名,関数記号],( clause(関数(_関数名,_関数記号,_,_,_),_)), _関数名_関数記号ならび), 関数メニュー表示(_関数名_関数記号ならび), 関数の選択(_何番目), 関数電卓(_何番目). 関数電卓(0) :- !. 関数電卓(_何番目) :- nth1(_何番目,_関数名_関数記号ならび,[_関数名,_関数記号]), 式の入力(_式), 関数電卓の関数を評価して値を表示する(_関数名,_関数,_式,_値), 関数メニュー表示(_関数名_関数記号ならび), 関数の選択(_次の選択), 関数電卓(_次の選択). 関数電卓の関数を評価して値を表示する(_関数名,_関数,_式,_値) :- 関数電卓の関数を評価する(_関数名,_関数,_式,_値), 値を表示する(_関数,_値). 関数電卓の関数を評価する(_関数名,_関数,_式) :- 関数(_関数名,_,_関数,_式,_値),!. 関数電卓の関数を評価する(_関数名,_関数,_式) :- writef('%tの関数評価に失敗しました\n',[_関数名]), fail. 値を表示する(_関数,_値) :- writef('%t <- %t \n',[_値,_関数]). 関数メニュー表示(_関数名_関数記号ならび) :- write('関数を番号で選択してください\n0..関数電卓の終了\n'), append(L0,[[_関数名,_関数記号]|R],_関数名_関数記号ならび), length([_|L0],Nth), writef('%t..%t,%t\n',[Nth,_関数名,_関数記号]), R = [],!. 関数の選択(_何番目) :- get_integer(_何番目). 式の入力(_式) :- write('式を入力してください : '), get_line(Line), 式の診断(Line,_式),!. 式の診断(Line,_式) :- parse_atom(Line,_式,_),!. 式の診断(Line,_) :- writef('入力された %t からは適切な式が取り出せません。\n',[Line]), fail. 関数(正弦,sin,sin(_式),_式,_値) :- _値 is sin(_式). 関数(余弦,cos,cos(_式),_式,_値) :- _値 is cos(_式). 関数(正接,tan,tan(_式),_式,_値) :- _値 is tan(_式). 関数(逆正弦,arcsin,arcsin(_式),_式,_値) :- _値 is sin(_式) ^ (-1). 関数(逆余弦,arccos,arccos(_式),_式,_値) :- _値 is cos(_式) ^ (-1). 関数(逆正接,arctan,arctan(_式),_式,_値) :- _値 is tan(_式) ^ (-1). 関数(自然対数,ln,ln(_式),_式,_値) :- _値 is ln(_式). 関数(常用対数,log,log(_式),_式,_値) :- _値 is log(_式). 関数(指数関数,exp,exp(_式),_式,_値) :- _値 is exp(_式). 関数(平方,sqr,sqr(_式),_式,_値) :- _値 is sqr(_式). 関数(入力データをラジアン単位にする,rad,rad(_式,_値),_式,_値) :- rad(_式,_値). 関数(入力データを度を単位とする,deg,deg(_式,_値),_式,_値) :- deg(_式,_値). 関数(双曲線正弦,sinh,sinh(_式),_式,_値) :- _値 is sinh(_式),!. 関数(双曲線余弦,cosh,cosh(_式),_式,_値) :- _値 is cosh(_式),!. rad(X,Y) :- Y is (X / 180) * pi. deg(X,Y) :- Y is (X / pi) * 180. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/183 # # [2]xy平面上の10 個の点(0〜9 番とする) の(x, y) 座標を入力させ # つぎのようにソートするプログラムを作れ. # 大きさ10の配列x, y を用いて,i番目の点の座標をそれぞれx[i], y[i] に入れる. # # (梅) x座標の値の昇順 # # (原点より近い点から遠い点の順) # 注意:点を入れ替える時には,x 座標だけでなく,y座標も入れ替えること. # '座標点ならびを確保して、座標点を10個入力し、原点から近い順に整列する'(_整列された座標点ならび) :- '座標点ならびを確保して'(_座標点ならび), '座標点を10個入力し'(_座標点ならび), '原点から近い順に整列する'(_座標点ならび,_整列された座標点ならび). '座標点ならびを確保して'(_座標点ならび) :- length(_座標点ならび,10). '座標点を10個入力し'(_座標点ならび) :- findall((X,Y),( append(L0,[(X,Y)|_],_座標点ならび), 座標点の入力(L0,X,Y)), _座標点ならび). 座標点の入力(L0,X,Y) :- length([_|L0],_個目), writef('[%t個目] x,y座標をカンマ区切りで入力してください : ',[_個目]), get_line(Line), 座標点入力診断(Line,X,Y),!. 座標点の入力(L0,X,Y) :- 座標点の入力(L0,X,Y). 座標点入力診断(Line,X,Y) :- split(Line,[',',' '],[X,Y]), number(X), number(Y),!. 座標点入力診断(Line,X,Y) :- writef('入力された%tからは適切な座標点が得られませんでした。再入力をお願いします。\n',[Line]), fail. '原点から近い順に整列する'(_座標点ならび,_整列された座標点ならび) :- 原点からの距離を付加する(_座標点ならび,_原点からの距離を付加された座標点ならび), 整列(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび), 距離を削除する(_整列した原点からの距離を付加された座標点ならび,_整列された座標点ならび). 原点からの距離を付加する([],[]) :- !. 原点からの距離を付加する([(X,Y)|R1],[(D,X,Y)|R2]) :- D is sqrt(X^2+Y^2), 原点からの距離を付加する(R1,R2). 整列(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび) :- sort(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび). 距離を削除する([],[]). 距離を削除する([(_,X,Y)|R1],[(X,Y)|R2]) :- 距離を削除する(R1,R2). % 以下のサイトは # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): キーボードから入力した数値(10進数)を # 2進数に変換して画面に出力するコードを作成しなさい。 # # また,キーボードから入力した2進数の数値を # 10進数に変換して画面に出力するコードを作成しなさい。 # # また、必要に応じて再帰を使っても使わなくてもよい。 'キーボードから入力した数値(10進数)を2進数に変換して画面に出力する' :- 'キーボードから入力した数値(10進数)を'(_10進数), '2進数に変換して'(_10進数,_2進数表示), 画面に出力する(_2進数表示). 'キーボードから入力した数値(10進数)を'(_10進数) :- get_line(Line), 入力した数値診断(Line,_10進数),!. 入力した数値診断(Line,_10進数) :- atom_to_term(Line,_10進数), integer(_10進数),!. '2進数に変換して'(_10進数,_2進数表示) :- _10進数 >= 0, '10進数を2進数ならび表現に変換'(_10進数,[],L), concat_atom(L,_2進数表示). '2進数に変換して'(_10進数,_2進数表示) :- _10進数 < 0, _10進数_1 is 2147483648 + _10進数, '10進数をn桁の2進数ならび表現に変換'(_10進数_1,31,[],L), concat_atom([1|L],_2進数表示). '10進数を2進数ならび表現に変換'(0,L,L) :- !. '10進数を2進数ならび表現に変換'(N,L1,L) :- M1 is N mod 2, N2 is N // 2, '10進数を2進数ならび表現に変換'(N2,[M1|L1],L). '10進数をn桁の2進数ならび表現に変換'(0,_n桁,L) :- length(L,_n桁), '10進数を2進数ならび表現に変換'(_10進数,[],L1), append(L0,L1,L), all(L0,0),!. 画面に出力する(_2進数表示) :- writef('%t\n',[_2進数表示]). % 以下のサイトは # [1]授業単元: 関数入門 # [2]問題文: # 100点満点の試験を入力して、5段階評価を返す関数 hyouka を作成せよ。 # 5段階評価は、100〜90までは5、89〜80は4、79〜70は3、69〜60は2、60未満は1とする。 # この関数を利用して、学生10人の試験の点数を入力して、 # それぞれの5段階評価を求め一覧表を表示するプログラム quality.cpp を作成せよ。 '学生10人の試験の点数を入力して、それぞれの5段階評価を求め一覧表を表示する' :- '学生10人の試験の点数を入力して'(_10人の試験の点数), それぞれの5段階評価を求め(_10人の試験の点数,_評価ならび), 一覧表を表示する(_評価ならび). '学生10人の試験の点数を入力して'(_10人の試験の点数) :- length(_10人の試験の点数,10), 学生番号・点数を入力(_10人の試験の点数). 学生番号・点数を入力(_10人の試験の点数) :- findall([_学生番号,_点数], append(_,[_|_],_10人の試験の点数), 学生番号を入力(_学生番号), 点数を入力(_点数)), _10人の試験の点数). 学生番号を入力(_学生番号) :- write('学生番号を入力してください : '), get_line(_学生番号). 点数を入力(_点数) :- get_line(Line), 点数入力診断(Line,_点数),!. 点数を入力(_点数) :- 点数を入力(_点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0, _点数 =< 100,!. 点数入力診断(Line,_点数) :- writef('入力された%tから点数が得られません。再入力をお願いします。[Line]), fail. それぞれの5段階評価を求め(_10人の試験の点数,_評価ならび) :- findall([_学生番号,_試験の点数,_5段階評価],(           append(_,[[_学生番号,_試験の点数]|_],_10人の試験の点数), '5段階評価'(__100点満点の試験の点数,_5段階評価)), _評価ならび). '5段階評価'(_試験の点数,5) :- '5段階評価は、100〜90までは5'(_試験の点数). '5段階評価'(_試験の点数,4) :- '5段階評価は、89〜80は4'(_試験の点数). '5段階評価'(_試験の点数,3) :- '5段階評価は、79〜70は3'(_試験の点数). '5段階評価'(_試験の点数,2) :- '5段階評価は、69〜60は2'(_試験の点数). '5段階評価'(_試験の点数,1) :- '5段階評価は、60点未満は1'(_試験の点数). '5段階評価は、100〜90までは5'(_試験の点数) :- _試験の点数 >= 90, _試験の点数 =< 100,!. '5段階評価は、89〜80は4'(_試験の点数) :- _試験の点数 >= 80, _試験の点数 =< 89,!. '5段階評価は、79〜70は3'(_試験の点数) :- _試験の点数 >= 70, _試験の点数 =< 79,!. '5段階評価は、69〜60は2'(_試験の点数) :- _試験の点数 >= 60, _試験の点数 =< 69,!. '5段階評価は、60点未満は1'(_試験の点数) :- _試験の点数 < 60. 一覧表を表示する(_評価ならび) :- 見出し表示, それぞれの評価を表示する(_評価ならび). 見出し表示 :- writef('%12r %12r %12r\n',[学生番号,試験成績,'5段階の評価']). それぞれの評価を表示する([]). それぞれの評価を表示する([[_学生番号,_試験の成績,_5段階の評価]|R]) :- writef('%12r %12r %12r\n',[_学生番号,_試験の成績,_5段階の評価]), それぞれの評価を表示する(R). % 以下のサイトは # ・以下の実行結果になるようプログラムを作成せよ。 # # 実行結果 # 人数 > 5 # 0人目: # 名前 > Taro # 電話番号 > 090-111-1111 # 1人目: # 名前 > Hanako # 電話番号 > 090-222-2222 # 2人目: # 名前 > Ichiro # 電話番号 > 090-333-3333 # 3人目: # 名前 > Jiro # 電話番号 > 090-444-4444 # 4人目: # 名前 > Hanayo # 電話番号 > 090-555-5555 # # 電話帳: # Taro, 090-111-1111 # Hanako, 090-222-2222 # Ichiro, 090-333-3333 # Jiro, 090-444-4444 # Hanayo, 090-555-5555 # # 名前 > Hanayo # Hanayo, 090-555-5555 # # 実行結果 # 人数 > 2 # 0人目: # 名前 > Taro # 電話番号 > 090-111-1111 # 1人目: # 名前 > Taro # 電話番号 > 090-222-2222 # # 電話帳: # Taro, 090-111-1111 # Taro, 090-222-2222 # # 名前 > Taro # Taro, 090-111-1111 # Taro, 090-222-2222 # # 実行結果 # 人数 > 0 # # 電話帳: # # 名前 > Taro # 該当者なし '電話番号を登録し、それを表示し、さらに検索する' :- 電話番号登録, 電話番号表示, 電話番号検索. 電話番号登録 :- abolish(電話帳/2), 処理人数を入力する(_人数), length(Ln,_人数), append(L0,[_|R],Ln), length(L0,_人目), writef('%t人目:\n',[_人目]), 名前を入力する(_名前), 電話番号を入力する(_電話番号), assertz(電話帳(_名前,_電話番号)), R = [],!. 電話番号登録. 処理人数を入力する(_人数) :- write('\n人数 > '), get_line(Line), 処理人数入力診断(Line,_人数),!. 処理人数を入力する(_人数) :- 処理人数を入力する(_人数). 処理人数入力診断(Line,_人数) :- atom_to_term(line,_人数,_), integer(_人数), _人数 > 0,!. 処理人数入力診断(Line,_人数) :- writef('入力された %t から適切な人数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 名前を入力する(_名前) :- write('名前 > '), get_line(_名前). 電話番号を入力する(_電話番号) :- write('電話番号 > '), get_line(Line), 電話番号入力診断(Line,_電話番号),!. 電話番号を入力(_電話番号) :- 電話番号を入力する(_電話番号). 電話番号入力診断(Line,Line) :- split(Line,['(',')','-',' '],L), concat_atom(L,S), atom_chars(S,Chars), 全てが数字(Chars),!. 電話番号入力診断(Line,_電話番号) :- writef('入力された%tは電話番号として不適切です。再入力をお願いします。\n',[Line]), fail. 電話番号表示 :- writef('\n電話帳 >\n'), 電話帳(_名前,_電話番号), writef('%t, %t\n',[_名前,_電話番号]), fail. 電話番号表示. 電話番号検索 :- 名前を鍵に電話番号を得る. 名前を鍵に電話番号を得る :- 名前を入力(_名前), 電話番号の検索と出力(_名前),!. 電話番号の検索と出力(_名前,_電話番号) :- 電話帳(_名前,_電話番号), 名前と電話番号を出力する(_名前,_電話番号), fail. 電話番号の検索と出力(_名前,_電話番号) :- \+(電話帳(_名前,_電話番号)), write('該当者なし\n'),!. 電話番号の検索と出力(_,_). 名前と電話番号を出力する(_名前,_電話番号) :- writef('%t, %t\n',[_名前,_電話番号]). 全てが数字([]) :- !. 全てが数字([A|R]) :- member(A,['0','1','2','3','5','5','6','7','8','9']), 全てが数字(R). % 以下のサイトは # [1] 授業単元: プログラミング  # [2] 問題文(含コード&リンク):入力仕様を、入力座標は最大2桁までの整数を # 最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う # プログラムの作成。 '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(_入力座標ならび) :- length(Ln,10), 座標入力(_座標), '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(Ln,_座標,_入力座標ならび). '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(_,end_of_file,[]) :- !. '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'([_],_座標,[_座標]) :- !. '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'([_|Ln],_座標,[_座標|R2]) :- 座標入力(_座標2), '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(Ln,_座標2,R2). 座標入力(_座標) :- get_line(Line), 座標入力診断(Line,_座標),!. 座標入力(_座標) :- 座標入力(_座標). 座標入力診断(Line,_座標) :- atom_to_term(Line,_座標,_), integer(_座標), number_chars(_座標,Chars), length(Chars,Len), len >= 1, Len =< 2,!. 座標入力診断(Line,_) :- writef('入力された%tからは2桁までの座標値は得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # [1] 授業単元: プログラミング 〜構造体〜 # [2] 問題文(含コード&リンク): 3名の名前と性別、10桁の会員番号を入力し表示せよ # *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ # 入力(1234567890)→出力(12-3456-7890) # *入力された会員番号が10桁に満たない場合、 # または大きい場合は再度入力する指示を入れること '3名の名前と性別、10桁の会員番号を入力し表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示する' :- '3名のならびを確保'(_名前・性別・会員番号ならび), '3名の名前と性別、10桁の会員番号を入力し'(_名前・性別・会員番号ならび), 表示する(_名前・性別・会員番号ならび). '3名のならびを確保'(_名前・性別・会員番号ならび) :- length(_名前・性別・会員番号ならび,3). '3名の名前と性別、10桁の会員番号を入力し'([]). '3名の名前と性別、10桁の会員番号を入力し'([[_名前,_性別,_会員番号]|R]) :- 名前入力(_名前), 性別入力(_性別), 会員番号入力(_会員番号), '3名の名前と性別、10桁の会員番号を入力し'(R). 名前入力(_名前) :- write('名前を入力してください : '), get_line(Line), 名前入力診断(Line,_名前),!. 性別入力(_性別), write('性別(男/女)を入力してください : '), get_line(_性別),!. 会員番号入力(_会員番号) :- write('会員番号を入力してください(数字10桁) : '), get_line(Line), 会員番号入力診断(Line,_会員番号),!. 会員番号入力(_会員番号) :- 会員番号入力(_会員番号). 会員番号入力診断(Line,Line) :- atom_chars(Line,Chars), length(Chars,10), 全て数字(Chars),!. 会員番号入力診断(Line,_) :- writef('入力された%tからは会員番号(10桁)を得られません。再入力をお願いします。\n',[Line]), fail. 全て数字([]) :- !. 全て数字([A|R]) :- member(A,['0','1','2','3','4','5','6','7','8','9']), 全て数字(R). 表示する(_名前・性別・会員番号ならび) :- append(_,[[_名前,_性別,_会員番号]|R],_名前・性別・会員番号ならび), atom_chars(_会員番号,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), concat_atom([_1,_2,'-',_3,_4,_5,_6,'-',_7,_8,_9,_10],_会員番号表示), writef('名前=%t,性別=%t,会員番号=%t\n',[_名前,_性別,_会員番号表示]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/981 # # [1] 授業単元:C言語応用 # [2] 問題文(含コード&リンク): # キーボードから入力した数だけのロッカーを割り付け、各ロッカーにキーボードから入力したデータを保存し、最後に保存した内容を表示するプログラムkadai10-1.cを次のステップにしたがって作成せよ。 # 但し、各ロッカーには次のロッカーへのポインター(次のロッカーの鍵と思えばわかりやすい)も荷物に相当するデータといっしょに保存するものとする。 # ./a.out # 3      説明:ロッカーの数を入力 # 1 3 4       データ入力 # 'キーボードから入力した数だけのロッカーを割り付け、各ロッカーにキーボードから入力したデータを保存し、最後に保存した内容を表示する' :- キーボードから入力した数だけのロッカーを割り付け(_ロッカーならび), 各ロッカーにキーボードから入力したデータを保存し(_ロッカーならび), 最後に保存した内容を表示する(_ロッカーならび). キーボードから入力した数だけのロッカーを割り付け(_ロッカーならび) :- キーボードから入力した数(_キーボードから入力した数), ロッカーを割り付け(_ロッカーならび). キーボードから入力した数(_キーボードから入力した数) :- get_line(Line), キーボードから入力した数診断(Line,_キーボードから入力した数),!. キーボードから入力した数(_キーボードから入力した数) :- キーボードから入力した数(_キーボードから入力した数). キーボードから入力した数診断(Line,_キーボードから入力した数) :- atom_to_term(Line,_キーボードから入力した数), integer(_キーボードから入力した数), _キーボードから入力した数 > 0,!. キーボードから入力した数診断(Line,_キーボードから入力した数) :- writef('入力された %t からロッカーの数が得られませんでした。再入力をお願いします。\n',[Line]), fail. ロッカーを割り付け(_キーボードから入力した数,_ロッカーならび) :- length(_ロッカーならび,_キーボードから入力した数). 各ロッカーにキーボードから入力したデータを保存し(_ロッカーならび) :- readln(_入力したデータならび), データを保存(_入力したデータならび,_ロッカーならび). データを保存(_入力したデータならび,_ロッカーならび) :- ロッカーは入力データより大きいか等しい(_入力したデータならび,_ロッカーならび),!. データを保存(_入力したデータならび,_ロッカーならび) :- 入力データの方がロッカーよりも多い場合は(_入力したデータならび,_ロッカーならび). ロッカーは入力データより大きいか等しい(_入力したデータならび,_ロッカーならび) :- append(_入力したデータならび,_,_ロッカーならび). 入力データの方がロッカーよりも多い場合は(_入力したデータならび,_ロッカーならび) :- append(_ロッカーならび,_,入力したデータならび). 最後に保存した内容を表示する([]) :- !. 最後に保存した内容を表示する([_データ|R]) :- writef('%t\n',[_データ]), 最後に保存した内容を表示する(R). % 以下のサイトは # 【課題】キーボードから入力された1〜9までを九九にし、 # 答えを1行に3個ずつ表示する。半角数字以外が入力された場合、 # 任意のエラーメッセージを表示させること。 # 【形態】public class Kuku1{で始める # 【期限】4月11日 # 【Ver 】jdk1.6.0_24 # 【注】変数、if,for,whileまで学習。 # # 単なる九九の計算のプログラムはできるのですが、例えば、3と入力して # 3の段の答えだけを表示するやり方、エラーを表示させるやり方、 # 3つずつというのが全くわかりません。 'キーボードから入力された1〜9までを九九にし、答えを1行に3個ずつ表示する' :- 'キーボードから入力された1〜9までを'(_1〜9までの数), append(_,[[N1,N2,N3]|R],[[1,2,3],[4,5,6],[7,8,9]]), M1 is N1 * _1〜9までの数, M2 is N2 * _1〜9までの数, M3 is N3 * _1〜9までの数, writef('%t %t %t\n',[M1,M2,M3]), R = []. 'キーボードから入力された1〜9までを'(_1〜9までの数) :- get_line(Line), 'キーボードからの入力診断'(Line,_1〜9までの数),!. 'キーボードから入力された1〜9までを'(_1〜9までの数) :- 'キーボードから入力された1〜9までを'(_1〜9までの数). 'キーボードからの入力診断'(Line,_1〜9までの数) :- atom_to_term(Line,_1〜9までの数,_), integer(_1〜9までの数), _1〜9までの数 >= 1, _1〜9までの数 =< 9,!. 'キーボードからの入力診断'(Line,_1〜9までの数) :- writef('入力された %t からは1〜9までの数が得られません。再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/962 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 読み込むファイルはinput.txtに固定されていたが、それを拡張する。 # プログラム実行時に、ファイル名を入力させ、ファイルが読み込み出来ない場合には、ファイル名を繰り返し再入力させるように改良しなさい。 # 'プログラム実行時に、ファイル名を入力させ、ファイルが読み込み出来ない場合には、ファイル名を繰り返し再入力させる'(Lines) :- ファイル名を入力させ(File), 全行を読み込む(File,Lines),!. 'プログラム実行時に、ファイル名を入力させ、ファイルが読み込み出来ない場合には、ファイル名を繰り返し再入力させる'(Lines) :- 'プログラム実行時に、ファイル名を入力させ、ファイルが読み込み出来ない場合には、ファイル名を繰り返し再入力させる'(Lines). 全行を読み込む(File,Lines) :- get_lines(File,Lines),!. 全行を読み込む(File,Lines) :- writef('%tの入力に失敗しました\nファイル名の入力に戻ってください\n',[File]), fail. ファイル名を入力させ(File) :- write('ファイル名を入力してください : '), get_line(Line), ファイル名を入力診断(Line,File),!. ファイル名を入力させ(File) :- ファイル名を入力させ(File). ファイル名を入力診断(Line,File) :- Line = File, exists(File,read),!. ファイル名を入力診断(Line,File) :- write('入力された%tというファイルはありません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/910 # # 【1】c言語 # 【2】入力された小数点をmy roundという関数を使って含む数値を四捨五入するプログラムを作成せよ。 # my_round関数の仕様 # int my_round(float x){     # #    int ret; # #    四捨五入の処理    # #    return( ret ); # # } # # # 実行結果 # # 小数点を含む数値を入力してください。 # 数値:1.89 # 1.890000は2に四捨五入されました # # '入力された小数点をmy roundという関数を使って含む数値を四捨五入する' :- 入力された小数点を(_小数点数), 四捨五入する(_小数点数,_四捨五入された小数点数). _四捨五入された整数 is truncate(_四捨五入された小数点数), writef('%t は %f に四捨五入されました。\n',[_小数点数,_四捨五入された整数]). 入力された小数点を(_小数点数) :- write('小数点を含む数値を入力してください。 \n数値: '), get_line(Line), 入力された小数数診断(Line,_小数点数),!. 入力された小数点を(_小数点数) :- 入力された小数点を(_小数点数). 入力された小数数診断(Line,_小数点数) :- atom_to_term(Line,_小数点数,_), float(_小数点数),!. 入力された小数数診断(Line,_小数点数) :- writef('入力された %t からは小数点数を得られませんでした。再入力をお願いします。\n',[Line]), fail. 四捨五入する(_小数点数,_四捨五入された小数点数) :- _四捨五入された小数点数 is floor(_小数点数 + 0.5). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/889 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/MysbRMqT # # キーボードから入力した数だけのロッカーを割り付け、各ロッカーにキーボード # から入力したデータを保存し、最後に保存した内容を表示するプログラム # kadai10-1.cを次のステップにしたがって 作成せよ。但し、各ロッカーには # 次のロッカーへのポインター(次のロッカーの鍵と思えばわかりやすい)も # 荷物に相当するデータといっしょに保存するものとする。 # # 1-1 データ構造として次の構造体を用意する。 # struct rocker { # int data; //保存するデータ # struct rocker *next; //次のボックスのアドレス(鍵) # }; # # 1-2 最初の鍵として次のポインターを大域変数として用意する。 # struct rocker *head; # # 1-3 1個のロッカーを割り当てて、最後に割り当てたロッカーに新しく割り当てた # ロッカーのアドレス(鍵)を保存する関数 struct rocker *new_rocker(struct rocker *last_rocker)を定義しなさい。 # ただし引数 last_rockerは最後に作ったボックスのポインターとする。この間数は # 新しく割り当てたロッカーのアドレスを返すものとする。 # # 1-4 全てのロッカーに保存したデータを最初のロッカーから順番に表示していく # 関数 void display_rockers(struct rocker *pt)を定義しなさい。 # ただし、実行結果が次のようになるように定義しなさい。 # # gcc kadai10-1.c # ./a.out # 3      説明:ロッカーの数を入力 # 1 3 4       データ入力 # [ data = 1 ]->[ data = 3 ]->[ data = 4 ]       表示 # # ※ 表示部分では printf("[ data = %d ]->", xxxxx); もしくは printf("[ data = %d ]\n", xxxxxx);を使用する # 'キーボードから入力した数だけのロッカーを割り付け、各ロッカーにキーボードから入力したデータを保存し、最後に保存した内容を表示する' :- キーボードから入力した数だけのロッカーを割り付け(_ロッカーならび), 各ロッカーにキーボードから入力したデータを保存し(_ロッカーならび), 最後に保存した内容を表示する(_ロッカーならび). キーボードから入力した数だけのロッカーを割り付け(_ロッカーならび) :- キーボードから入力した数(_キーボードから入力した数), length(_ロッカーならび,_キーボードから入力した数). キーボードから入力した数(_キーボードから入力した数) :- write('ロッカーの数を入力してください : '), get_line(Line), キーボードから入力した数診断(Line,_キーボードから入力した数),!. キーボードから入力した数(_キーボードから入力した数) :- キーボードから入力した数(_キーボードから入力した数). キーボードから入力した数診断(Line,_キーボードから入力した数) :- atom_to_term(Line,_キーボードから入力した数,_), integer(_キーボードから入力した数), _キーボードから入力した数 >= 1,!. キーボードから入力した数診断(Line,_キーボードから入力した数) :- writef('入力された %t から適切な整数が得られません。再入力をお願いします。\n',[Line]), fail. 各ロッカーにキーボードから入力したデータを保存し([]). 各ロッカーにキーボードから入力したデータを保存し([Line|R]) :- キーボードから入力したデータを(Line), 各ロッカーにキーボードから入力したデータを保存し(R). 最後に保存した内容を表示する(_ロッカーならび) :- append(L0,[_データ|R],_ロッカーならび), length([_|L0],_n番目), writef('ロッカー[%t]: %t\n',[_n番目,_データ]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/883 # # あと、もうひとつ問題 # 2.201003121(10進数9桁)、性別(男:1、女:2)、年令(未成年:0,成年:1,高齢:2,後期高齢:3)、 # 職業(無:0、有:1)で個々人が16分類される。それぞれを数字(コード)で入力させ、 # その人の状態を一旦ディスプレイに表示し、if文を使って、自然な文章で最後に表示するプログラムを作れ # 'それぞれを数字(コード)で入力させ、その人の状態を一旦ディスプレイに表示し、if文を使って、自然な文章で最後に表示する' :- 'それぞれを数字(コード)で入力させ'(_個人ID,_分類コード), 分類コードの生成([_分類コード,_性別,_年齢,_職業],_分類表示), writef('%t\n',[_分類表示]), 自然な文章で最後に表示する(_個人ID,_性別,_年齢,_職業). 'それぞれを数字(コード)で入力させ'(_個人ID,_分類コード) :- 個人IDの入力(_個人ID), 分類コードの入力(_分類コード),!. 個人IDの入力(_個人ID) :- write('個人IDを入力してください : '), get_line(Line), 個人ID入力診断(Line,_個人ID),!. 個人IDの入力(_個人ID) :- 個人IDの入力(_個人ID). 個人ID入力診断(Line,_個人ID) :- atom_to_term(Line,_個人ID,_), integer(_個人ID), _個人ID >= 100000000, _個人ID =< 999999999,!. 個人ID入力診断(Line,_個人ID) :- writef('入力された %t からは適切な個人IDが得られませんでした。再入力をお願いします。\n',[Line]), fail. 分類コードの入力(_分類コード) :- 分類コード表示, write('分類コードを入力してください : '), get_line(Line), 分類コード入力診断(Line,_分類コード),!. 分類コードの入力(_分類コード) :- 分類コードの入力(_分類コード). 分類コード入力診断(Line,_分類コード) :- atom_to_term(Line,_分類コード,_), integer(_分類コード), _分類コード >= 0, _分類コード =< 15,!. 分類コード入力診断(Line,_分類コード) :- writef('入力された %t からは分類コードが得られませんでした。再入力をお願いします。\n',[Line]), fail. 分類コードの生成([_分類コード,_性別,_年齢,_職業],_分類表示) :- append(L01,[_性別|_],['男','女']), append(L02,[_年齢|_],['未成年','青年','高齢者','後期高齢者']), append(L03,[_職業|_],['無','有']), length(L01,N1), length(L02,N2), length(L03,N3), _分類コード is N1 * 8 + N2 * 2 + N3, concat_atom(['分類コード ',_分類コード,' [','性別:',_性別,' ','年齢: ',_年齢,' ','職業: ',_職業,']'],_分類表示). 分類コード表示 :- 分類コードの生成([_分類コード,_性別,_年齢,_職業],_分類表示), writef('%t\n',[_分類表示]), fail. 分類コード表示. 自然な文章で最後に表示する(_個人ID,_性別,_年齢,_職業) :- writef('個人IDが%tの人は、%tで',[_個人ID,_性別]), 自然な年齢表現(_年齢), 自然な職業表現(_職業). 自然な年齢表現(_年齢) :- writef('年齢分類は%t、',[_年齢]). 自然な職業表現(有) :- write('職業に就いています。\n'). 自然な職業表現(無) :- write('無職です。\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/858 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # 1行の入力は、すべて英字とし、最大80文字とする。 # 初めに入力した1行の文字列に対して、2行目に入力した文字を3行目に入力した文字列に置換した文字列を作成し、結果を表示するプログラムを作成しなさい。 # '1行の入力は、すべて英字とし、最大80文字とする。初めに入力した1行の文字列に対して、2行目に入力した文字を3行目に入力した文字列に置換した文字列を作成し、結果を表示する' :- '1行の入力は、すべて英字とし、最大80文字とする。初めに入力した1行の文字列に対して'(_初めに入力した1行の文字列), '2行目に入力した文字を'(_2行目に入力した文字), '3行目に入力した文字列に'(_3行目に入力した文字列), '置換した文字列を作成し'(_初めに入力した1行の文字列,_2行目に入力した文字,_3行目に入力した文字列,_置換した文字列), '結果を表示する'(_置換した文字列). '1行の入力は、すべて英字とし、最大80文字とする。初めに入力した1行の文字列に対して'(_初めに入力した1行の文字列) :- length(L1,80), '英字か改行文字の入力'(_英字か改行文字), '1行の入力は、すべて英字とし、最大80文字'(L1,_英字か改行文字,Chars), atom_chars(_初めに入力した1行の文字列,Chars). '1行の入力は、すべて英字とし、最大80文字'([],_,[]) :- !. '1行の入力は、すべて英字とし、最大80文字'(_,'\n',[]) :- !. '1行の入力は、すべて英字とし、最大80文字'([_|R1],_英字,[_英字|R2]) :- 英字の入力(_英字か改行文字2), '1行の入力は、すべて英字とし、最大80文字'(R1,_英字か改行文字2,R2). 英字か改行文字の入力(_英字か改行文字) :- get_char(Char), 英字か改行文字の入力診断(Char,_英字か改行文字),!. 英字か改行文字の入力(_英字か改行文字) :- 英字か改行文字の入力(_英字か改行文字). 英字か改行文字の入力診断('\n','\n') :- !. 英字か改行文字の入力診断(Char,Char) :- Char @>= 'a', char @=< 'z',!. 英字か改行文字の入力診断(Char,Char) :- Char @>= 'A', char @=< 'Z',!. 英字か改行文字の入力診断(Char,_) :- writef('%tは英字ではありません。この入力を無視します\n',[Char]), fail. '2行目に入力した文字を'(_2行目に入力した文字) :- get_char(_2行目に入力した文字). '3行目に入力した文字列に'(_3行目に入力した文字列) :- get_line(_3行目に入力した文字列). '置換した文字列を作成し'(_初めに入力した1行の文字列,_2行目に入力した文字,_3行目に入力した文字列,_置換した文字列) :- atom_chars(_初めに入力した1行の文字列,Chars), '置換した文字ならびを作成し'(_初めに入力した1行の文字ならび,_2行目に入力した文字,_3行目に入力した文字列,_置換した文字ならび), concat_atom(_置換した文字ならび,_置換した文字列). '置換した文字ならびを作成し'([],_,_,[]) :- !. '置換した文字ならびを作成し'([_2行目に入力した文字|R1],_2行目に入力した文字,_3行目に入力した文字列,[_3行目に入力した文字列|R4]) :- '置換した文字ならびを作成し'(R1,_2行目に入力した文字,_3行目に入力した文字列,R4). '置換した文字ならびを作成し'([_文字|R1],_2行目に入力した文字,_3行目に入力した文字列,[_文字|R4]) :- '置換した文字ならびを作成し'(R1,_2行目に入力した文字,_3行目に入力した文字列,R4). '結果を表示する'(_初めに入力した1行の文字列,_2行目に入力した文字,_3行目に入力した文字列,_置換した文字列) :- writef('初めに入力した1行の文字列 %t\n',[_初めに入力した1行の文字列]), writef('2行目に入力した文字 %t\n',[_2行目に入力した文字]), writef('3行目に入力した文字列 %t\n',[_3行目に入力した文字列]), writef('置換した文字列 %t\n',[_置換した文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/621 # # [1] C言語演習 # [2] http://ime.nu/codepad.org/QMwiwwtp を改良して、 #   80〜100:優 70〜 79:良 60〜 69:可 0〜 59:不可 #  の分布グラフを表示するプログラムを作成しなさい。 # 【実行結果】 # 点数を入力してください。 # 1番:17 # 2番:38 # 3番:100 # 4番:95 # 5番:23 # □ 分布グラフ □ #  優:** #  良: #  可: # 不可:*** # ◆´,魏造して、「不可一覧表」も表示できるようにしなさい。 # 【実行結果】 # ,離廛蹈哀薀爐硫爾 # 不可一覧表 # 1番 ( 17点) # 2番 ( 38点) # 5番 ( 23点) # と表示させる。 #  配列を利用して、23番目までのフィボナッチ数列を画面に整列させた状態で表示させなさい。 # 1,1,2,3,5,8,13,21,34,… #  [3.1] Windows7 #  [3.3] C言語 # [4] 木曜19時まで # [5] 配列まで # わかる方どうかよろしくお願いします。 # # '入力する人数を得て、その人数分の点数を入力する。それを80〜100:優 70〜 79:良 60〜 69:可 0〜 59:不可 の分布グラフとして表示しなさい。さらに不可一覧表も表示しなさい' :- 入力する人数を得る(_人数), n人分の点数を得る(_人数,_点数ならび), グラフ分布(_点数ならび,L1,L2,L3,L4), グラフ表示(L1,L2,L3,L4), 不可一覧表表示(_点数ならび). 入力する人数を得る(_人数) :- write('入力する人数を入れてください : '), get_line(Line), 入力する人数診断(Line,_人数),!. 入力する人数を得る(_人数) :- 入力する人数を得る(_人数). 入力する人数診断(Line,_人数) :- atom_to_term(Line,_人数,_), integer(_人数), _人数 > 0,!. 入力する人数診断(Line,_人数) :- writef('入力された %t から人数が得られません。再入力をお願いします。\n',[Line]), fail. n人分の点数を得る(_n人分,_点数ならび) :- length(_点数ならび,_n人分), findall(_点数,( append(_,[_点数|_],_点数ならび), 点数を入力してください(_点数)), _点数ならび). 点数を入力してください(_点数) :- writef('点数を入力してください : '), get_line(Line,_点数,_), 点数入力診断(Line,_点数),!. 点数を入力してください(_点数) :- 点数を入力してください(_点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0, _点数 =< 100,!. 点数入力診断(Line,_点数) :- writef('入力された %t から適切な点数が得られません。再入力をお願いします。\n',[Line]), fail. グラフ分布([],[],[],[],[]). グラフ分布([_点数|R],[*|L1],L2,L3,L4) :- _点数 >= 80,_点数 =< 100, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,[*|L2],L3,L4) :- _点数 >= 70,_点数 =< 79, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,L2,[*|L3],L4) :- _点数 >= 60,_点数 =< 69, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,L2,L3,[*|L4]) :- _点数 >= 0,_点数 =< 59, グラフ分布(R,L1,L2,L3,L4). グラフ表示(L1,L2,L3,L4) :- concat_atom(L1,_優), concat_atom(L2,_良), concat_atom(L3,_可), concat_atom(L4,_不可), writef(' 優: %t\n 良: %t\n 可: %t\n不可: %t\n',[_優,_良,_可,_不可]). 不可一覧表表示(_点数ならび) :- append(L0,[_点数|_],_点数ならび), _点数 < 60, length([_|L0],_n番目), writef('[%t番目] %t点\n',[_n番目,_点数]), fail. 不可一覧表表示(_点数ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/571 # # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文: # 台形則により関数 f(x)=xe^xをx=0からx=1まで数値積分するプログラムを作成。 # ただし、積分区間の分割数nはキーボードから入力する。 # func(X,Y) :- Y is X * exp(X). '台形則により関数 f(x)=xe^xをx=0からx=1まで数値積分する'(X) :- 積分区間の分割数nはキーボードから入力する(_分割数), 台形公式による積分(_分割数,0,1,X). 積分区間の分割数nはキーボードから入力する(_分割数) :- 項目名・制約付き整数入力(分割数,(_分割数 > 1,0 is _分割数 mod 2),_分割数). 台形公式による積分(_分割数,X0,Xn,S) :- _分割数 > 1, 0 is _分割数 mod 2, Xn > X0, 台形則(_分割数,X0,Xn,S). 台形則(N,X0,Xn,X) :- _間隔 is (Xn-X0) / N, 台形則(1,_分割数,_間隔,X0,Xn,0.0,S), func(X0,F0), func(Xn,Fn), X is (F0 + Fn + S + S ) * _間隔 * 0.5. 台形則(N,_分割数,_,_,_,X,X) :- N > _分割数,!. 台形則(N,_分割数,_間隔,X0,Xn,Y,X) :- U is _間隔 * N + X0, func(U,F), Y2 is Y + F, N2 is N + 1, 台形則(N2,_分割数,_間隔,X0,Xn,Y2,X). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 項目名・制約付き整数入力(_項目名,_制約,_整数) :- writef('%tを入力してください : '), get_line(Line), 項目名・制約付き整数入力診断(Line,_項目名,_制約,_整数),!. 項目名・制約付き整数入力(_項目名,_制約,_整数) :- 項目名・制約付き整数入力(_項目名,_制約,_整数). 項目名・制約付き整数入力診断(Line,_項目名,_制約,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), call(_制約),!. 項目名・制約付き整数入力診断(Line,_項目名,_制約,_整数) :- writef('入力された %t からは適切な%tが得られませんでした。再入力をお願いします。\n',[Line,_項目名]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/564 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した数だけの長さのint型の配列を用意して、 # 同じくキーボードから値を入力し、表示するプログラムkadai9-1.cを作りなさい。 # 但し長さlengthのint型の配列の内容を表示する関数 # void display_array(int *data, int length)を定義して使用すること。 # 実行例: # gcc kadai9-1.c # ./a.out # 3 <- 長さを入力 # 1 3 4 <-データ入力 # 1 <-ここから表示 # 3 # 4 # # 'キーボードから入力した数だけの長さのint型の配列を用意して、同じくキーボードから値を入力し、表示する' :- キーボードから入力した数(_入力した数), 'だけの長さのint型の配列を用意して'(_入力した数,_ならび), 同じくキーボードから値を入力し(_ならび), 表示する(_ならび). キーボードから入力した数(_入力した数) :- get_line(Line), 整数入力診断(Line,_入力した数),!. キーボードから入力した数(_入力した数) :- キーボードから入力した数(_入力した数) . 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'だけの長さのint型の配列を用意して'(_入力した数,_ならび) :- length(_ならび,_入力した数). 同じくキーボードから値を入力し(_ならび) :- 一行で数を入力する(ならび),!. 同じくキーボードから値を入力し(_ならび) :- 同じくキーボードから値を入力し(_ならび). 一行で数を入力する(_ならび) :- get_line(Line), 一行で数を入力診断(Line,_ならび),!. 一行で数を入力診断(Line,_ならび) :- get_split_line([' ',','],_ならび), すべて整数(_ならび),!. 一行で数を入力診断(Line,_ならび) :- length(_ならび,N), writef('入力された %t から %t個の整数を得られませんでした。再入力をお願いします。\n',[Line,N]), fail. 数を入力する(_数) :- get_line(Line), 整数数入力診断(Line,_数),!. 数を入力する(_数) :- 整数を入力する(_数). 表示する(_ならび) :- append(_,[_値|R],_ならび), writef('%t\n',[_値]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/565 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/6wsr2CEj # 国語と数学の2科目のテストの成績を処理するプログラムにおいて、生徒数を # キーボードから入力した後に、そのデータを入力し、最後に入力したデータ全てを # 表示する。 # '国語と数学の2科目のテストの成績を処理するプログラムにおいて、生徒数をキーボードから入力した後に、そのデータを入力し、最後に入力したデータ全てを表示する' :- 生徒数をキーボードから入力した(_生徒数), 後に, そのデータを入力し(_生徒数,_入力したデータ), 最後に入力したデータ全てを表示する(_入力したデータ). 生徒数をキーボードから入力した(_生徒数) :- get_line(Line), 生徒数入力診断(Line,_生徒数),!. 生徒数をキーボードから入力した(_生徒数) :- 生徒数をキーボードから入力した(_生徒数). 生徒数入力診断(Line,_生徒数) :- atom_to_term(Line,_生徒数,_), integer(_生徒数),!. 生徒数入力診断(Line,_生徒数) :- writef('入力された %t から生徒数が得られませんでした。再入力をお願いします。',[Line]), fail. 後に :- true. そのデータを入力し(_生徒数,_入力したデータ) :- length(_入力したデータ,_生徒数), そのデータを入力し(_入力したデータ). そのデータを入力し([]). そのデータを入力し([[_国語,_数学]|R]) :- 国語点数を入力(_国語), 数学点数を入力(_数学), そのデータを入力し(R). 国語点数を入力(_国語点数) :- get_line(Line), 国語点数入力診断(Line,_国語点数),!. 国語点数を入力(_国語点数) :- 国語点数を入力(_国語点数). 国語点数入力診断(Line,_国語点数) :- atom_to_term(Line,_国語点数,_), integer(_国語点数),!. 国語点数入力診断(Line,_国語点数) :- writef('入力された %t から国語点数が得られませんでした。再入力をお願いします。',[Line]), fail. 数学点数を入力(_数学点数) :- get_line(Line), 数学点数入力診断(Line,_数学点数),!. 数学点数を入力(_数学点数) :- 数学点数を入力(_数学点数). 数学点数入力診断(Line,_数学点数) :- atom_to_term(Line,_数学点数,_), integer(_数学点数),!. 数学点数入力診断(Line,_数学点数) :- writef('入力された %t から数学点数が得られませんでした。再入力をお願いします。',[Line]), fail. 最後に入力したデータ全てを表示する(_入力したデータ) :- append([_,[[_国語,_数学]|R],_入力したデータ), writef('%t,%t\n',[_国語,_数学]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/506 # # [1] 授業単元: # [2] 問題文:平面上の点,直線,円の位置関係を判定するプログラムを作れ. # 判定結果としては,カッコ内の文字列を表示せよ. # 点のxy-座標および円の半径と中心のxy-座標を入力し,その点と円の位置関係を, # (a) 点は円の外部にある('gaibu') # (b) 点は円周上にある('enshuujou') # (c) 点は円の内部にある('naibu') # のいずれかに分類せよ. # '平面上の点,直線,円の位置関係を判定する'(_判定) :- '点のxy-座標および円の半径と中心のxy-座標を入力し'(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標), その点と円の位置関係を判定する(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標,_判定), write('%t\n',[_判定]). '点のxy-座標および円の半径と中心のxy-座標を入力し'(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標) :- '点のxy-座標を入力'(_点x座標,_点y座標), '円の半径を入力'(_円の半径), '円の中心のxy-座標を入力'(_中心のx座標,_中心のy座標). その点と円の位置関係を判定する(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標,点は円の外部にある) :- 点は円の外部にある(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標),!. その点と円の位置関係を判定する(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標,点は円周上にある) :- 点は円周上にある(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標),!. その点と円の位置関係を判定する(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標,点は円の内部にある) :- 点は円の内部にある(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標),!. '点のxy-座標を入力'(_点x座標,_点y座標) :- '点のx座標の入力'(_点x座標), '点のy座標の入力'(_点y座標),!. '円の半径の入力'(_円の半径) :- write('円の半径を入力してください : '), get_line(Line), 数値入力診断(Line,_円の半径),!. '円の半径を入力'(_円の半径) :- '円の半径を入力'(_円の半径). '円の中心のxy-座標を入力'(_中心のx座標,_中心のy座標) :- '円の中心のx座標を入力'(_中心のx座標), '円の中心のy座標を入力'(_中心のy座標),!. '点のx座標の入力'(_点x座標) :- write('点のxy-座標を入力してください x座標 : '), get_line(Line), 数値入力診断(Line,_点x座標),!. '点のx座標を入力'(_点x座標) :- '点のx座標を入力'(_点x座標). '点のy座標の入力'(_点y座標) :- write(' y座標 : '), get_line(Line), 数値入力診断(Line,_点y座標),!. '点のy座標を入力'(_点y座標) :- '点のy座標を入力'(_点y座標). '円の中心のx座標の入力'(_中心のx座標) :- write('円の中心のxy-座標を入力してください x座標 : '), get_line(Line), 数値入力診断(Line,_中心のx座標),!. '円の中心のx座標を入力'(_中心のx座標) :- '円の中心のx座標を入力'(_中心のx座標). '円の中心のy座標の入力'(_中心のy座標) :- write(' y座標 : '), get_line(Line), 数値入力診断(Line,_中心のy座標),!. '円の中心のy座標を入力'(_中心のy座標) :- '円の中心のy座標を入力'(_中心のy座標). 数値入力診断(Line,_座標点) :- atom_to_term(Line,_座標点,_), number(_座標点),!. 数値入力診断(Line,_座標点) :- writef('入力された %t から数値が得られません。再入力をお願いします。\n',[Line]), fail. 点は円の外部にある(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標) :- X is (_点x座標 - _中心のx座標) * (_点x座標 - _中心のx座標), Y is (_点y座標 - _中心のy座標) * (_点y座標 - _中心のy座標), X + Y > _円の半径 * _円の半径,!. 点は円周上にある(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標) :- X is (_点x座標 - _中心のx座標) * (_点x座標 - _中心のx座標), Y is (_点y座標 - _中心のy座標) * (_点y座標 - _中心のy座標), X + Y =:= _円の半径 * _円の半径,!. 点は円の内部にある(_点x座標,_点y座標,_円の半径,_中心のx座標,_中心のy座標) :- X is (_点x座標 - _中心のx座標) * (_点x座標 - _中心のx座標), Y is (_点y座標 - _中心のy座標) * (_点y座標 - _中心のy座標), X + Y < _円の半径 * _円の半径,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/386 # # [1] 授業単元:課題 # [2] 問題文: # 読み込んだ2つの正整数の最大公約数を出力するプログラムを作成せよ.ただし,以下の関数 gcd() を再帰を用いて定義し,使用すること. # 書式 # int gcd(int m, int n); # 返り値 # 正整数m, nの最大公約数 # 実行結果1 # 2正整数 > 8 12 # 4 # 実行結果2 # 2正整数 > 81 64 # 1 # 読み込んだ2つの正整数の最大公約数を出力する :- 読み込んだ2つの正整数(_1つ目の正整数,_2つ目の正整数), 最大公約数(_1つ目の正整数,_2つ目の正整数,_最大公約数), 出力する(_最大公約数). 読み込んだ2つの正整数(_1つ目の正整数,_2つ目の正整数) :- write('2つの正の整数を空白で区切り一行で入力してください : '), get_line(Line), 2つの正整数を読み込み診断(Line,_1つめの正整数,_2つ目の正整数),!. 読み込んだ2つの正整数(_1つ目の正整数,_2つ目の正整数) :- 読み込んだ2つの正整数(_1つ目の正整数,_2つ目の正整数). '2つの正整数を読み込み診断'(Line,_1つめの正整数,_2つ目の正整数) :- split(Line,[' '],[_1つ目の正整数,_2つ目の正整数]), integer(_1つ目の正整数), integer(_2つ目の正整数), _1つ目の正整数 > 0, _2つ目の正整数 > 0,!. '2つの正整数を読み込み診断'(Line,_,_) :- writef('入力された %t から2つの正整数を得ることができません。再入力をお願いします。\n',[Line]), fail. 最大公約数(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). 出力する(_最大公約数) :- writef('%t\n',[_最大公約数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/384 # # # [1] 授業単元:2次元配列の利用 # [2] 問題文(含コード&リンク): # 新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示するプログラムを作成しなさい。 # なお、駅番号は、東京が1、新横浜が2、名古屋が3、京都が4、新大阪が5とする。 # 但し、料金を表示してから後で、1を入力すると上記の処理を繰り返し、0を入力するとプログラムを終了するものとする。 #     新大阪 京都  名古屋 新横浜 # 東京  14920 14390 11540  3180 # 新横浜 14600 13660 10910 # 名古屋 6840 6100 # 京都  3240 # :- のぞみ料金表の生成('のぞみ料金表.txt'). 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する :- 出発駅を得る(_出発駅), 到着駅を得る(_到着駅), のぞみ料金(_出発駅,_到着駅,_料金), 料金を表示する(_出発駅,_到着駅,_料金), write('0..終了 1..別の料金を検索する : '), get_line('0'),!. 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する :- 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する. 出発駅を得る(_出発駅) :- 駅番号駅名表示(_駅番号駅名表示), writef('出発駅を番号で選択してください。%t : ',[_駅番号駅名表示]), 駅番号で入力する(_駅番号), 駅番号(_駅番号,_出発駅),!. 出発駅を得る(_出発駅) :- 出発駅を得る(_出発駅). 到着駅を得る(_到着駅) :- 駅番号駅名表示(_駅番号駅名表示), writef('到着駅を番号で選択してください。%t : ',[_駅番号駅名表示]), 駅番号で入力する(_駅番号), 駅番号(_駅番号,_到着駅),!. 到着駅を得る(_到着駅) :- 到着駅を得る(_到着駅). 駅番号駅名表示(_駅番号駅名表示) :- findall(S,( 駅番号(_駅番号,_駅名), concat_atom([_駅番号,'..',_駅名],S)), L), concat_atom(L,' ',_駅番号駅名表示),!. 駅番号で入力する(_駅番号) :- get_line(Line), 駅番号入力診断(Line,_駅番号),!. 駅番号入力診断(Line,_駅番号) :- atom_to_term(Line,_駅番号,_), integer(_駅番号), _駅番号 >= 1, _駅番号 =< 5,!. 駅番号入力診断(Line,_駅番号) :- writef('入力された %t から適切な駅番号が得られません。再入力をお願いします\n',[Line]), fail. 料金を表示する(_出発駅,_到着駅,_料金) :- writef('%t から %t までの料金は %t 円です。\n',[_出発駅,_到着駅,_料金]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% のぞみ料金表の作成(File) :- get_split_lines(File,[' '],Lines), Lines = [_駅名横ならび|R1], findall(_駅名,( append(LL0,[[_駅名|_]|R],R1)), _駅名縦ならび), 駅番号の登録(_駅名縦ならび), findall(_料金ならび,( append(LL0,[[_|_料金ならび]|_],R1)), _料金表), のぞみ料金表の作成(_駅名縦ならび,_駅名横ならび,_料金表). 駅番号の登録(_駅名縦ならび) :- append(_駅名縦ならび,[新大阪],_駅名縦ならびのニ), append(L0,[_駅名|R],_駅名縦ならびのニ), length([_|L0],Len), assertz((駅番号(Len,_駅名) :- !)), R = []. のぞみ料金表の作成([],_,_) :- !. のぞみ料金表の作成([_駅名|R1],_駅名横ならび,[L3|R3]) :- 駅単位料金表(_駅名,_駅名横ならび,L3), のぞみ料金表の作成(R1,_駅名横ならび,R3). 起点駅単位料金登録(_,_,[]) :- !. 起点駅単位料金登録(_駅名,[_駅名2|R2],[_料金|R3]) :- assertz(のぞみ料金(_駅名,_駅名2,_料金)), assertz(のぞみ料金(_駅名2,_駅名,_料金)), 起点駅単位料金表(_駅名,R2,R3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/342 # # ごめんなさい。よろしくお願いします。 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という # 名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理と、 # 続いてそのファイルを開いてデータを読み込み、指定した番号の人のデータを # 以下のように表示する処理をするプログラムを作りなさい。 # (実行後meibo.txt の中身は # # 1 # 168.000000 # 55.000000 # 2 # 170.000000 # 66.000000 # 3 # 158.000000 # 45.000000 # # と書かれている) # # 実行例です # http://ime.nu/uproda.2ch-library.com/387866eaw/lib387866.jpg # # '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理と、続いてそのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する' :- '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理', 続いて, 'そのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する'. '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理' :- '学籍番号(整数)、身長(実数)、体重(実数)を入力すると'(_学籍番号・身長・体重ならび), 'meibo.txt という名前のファイルを作り'(Outstream), 'その中に学籍番号、身長、体重を記録する'(Outstream,_学籍番号・身長・体重ならび),!. そのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する :- そのファイルを開いてデータを読み込み(_データ), 指定した番号の人のデータを以下のように表示する(_データ). '学籍番号(整数)、身長(実数)、体重(実数)を入力すると'(_学籍番号・身長・体重ならび) :- 登録人数を得る(_登録人数), 学籍番号・身長・体重ならびを形作る(_学籍番号・身長・体重ならび,_登録人数), 学籍番号・身長・体重ならびを得る(_学籍番号・身長・体重ならび). 学籍番号・身長・体重ならびを形作る(_学籍番号・身長・体重ならび,_登録人数) :- length(_学籍番号・身長・体重ならび,_登録人数). 学籍番号・身長・体重ならびを得る([]). 学籍番号・身長・体重ならびを得る([[_学籍番号・身長・体重ならび]|R]) :- 学籍番号を得る(_学籍番号), 身長を得る(_身長), 体重を得る(_体重), 学籍番号・身長・体重ならびを得る(R). 'meibo.txt という名前のファイルを作り'(Outstream) :- open('meibo.txt',write,Outstream),!. 'その中に学籍番号、身長、体重を記録する'(Outstream,_学籍番号・身長・体重ならび) :- append(_,[[_学籍番号,_身長,_体重]|R],_学籍番号・身長・体重ならび), writef(Outstream,'%t\n%t\n%t\n',[_学籍番号,_身長,_体重]), R = [], close(Outstream),!. そのファイルを開いてデータを読み込み(_データ) :- get_lines('meibo.txt',_データ). 指定した番号の人のデータを以下のように表示する(_データ) :- 指定した番号の人(_学籍番号), 指定した番号の人のデータを以下のように表示する(_学籍番号,_データ),!. 指定した番号の人のデータを以下のように表示する('',_) :- !. 指定した番号の人のデータを以下のように表示する(end_of_file,_) :- !. 指定した番号の人のデータを以下のように表示する(_学籍番号,_データ) :- append(_,[[_学籍番号,_身長,_体重]|_],_データ), writef('%t %t %t\n',[_学籍番号,_身長,_体重]), 指定した番号の人(_学籍番号2), 指定した番号の人のデータを以下のように表示する(_学籍番号2,_データ),!. 指定した番号の人(_学籍番号) :- write('検索する学籍番号を入れてください : '), get_integer(_学籍番号),!. 登録人数を得る(_登録人数) :- write('最初に登録人数を決めてください : '), get_line(Line), 登録人数入力診断(Line,_登録人数),!. 登録人数入力診断(Line,_登録人数) :- atom_to_term(Line,_登録人数,_), integer(_登録人数), _登録人数 >= 1, _登録人数 =< 10,!. 登録人数入力診断(Line,_登録人数) :- 再入力指示(Line,[登録人数]). 学籍番号を得る(_学籍番号) :- repeat, write('学籍番号(整数) : '), get_line(Line), 学籍番号入力検査(Line,_学籍番号),!. 学籍番号入力検査(Line,_学籍番号) :- 再入力指示(Line,学籍番号), fail. 身長を得る(_身長) :- repeat, write('身長(実数) : '), get_line(Line), 学籍番号入力検査(Line,_身長),!. 体重を得る(_体重) :- repeat, write('体重(実数) : '), get_line(Line), 学籍番号入力検査(Line,_体重),!. 学籍番号入力検査(Line,_学籍番号) :- atom_to_term(Line,_学籍番号,_), integer(_学籍番号),!. 学籍番号入力検査(Line,_学籍番号) :- 再入力指示(Line,学籍番号), fail. 身長入力検査(Line,_身長) :- atom_to_term(Line,_身長,_), float(_身長),!. 身長入力検査(Line,_身長) :- 再入力指示(Line,身長), fail. 体重入力検査(Line,_体重) :- atom_to_term(Line,_体重,_), float(_体重),!. 体重入力検査(Line,_体重) :- 再入力指示(Line,体重), fail. 再入力指示(Line,_項目名) :- writef('入力された %t からは%tが得られません。再入力をお願いします。\n',[Line,_項目名]). 続いて :- true. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/277 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): # 入力する値は0以上の整数とし、下記の動作するプログラムを作成しなさい。 # 要素数10の整数型配列を作成し、入力された0以外の数値のうち、これまで入力されていない値だけを追加、記憶させる。 # 追加登録を行った場合には、現在何個の数値が記憶されているかを表示させる。 # 0が入力された場合、または10個の値の登録が完了した場合は、記憶している全ての情報を表示して、プログラムを終了させる。 # 例:5                 例:1 #   1個登録                1個登録 #   5                   2 #   既に登録あり              2個登録 #   3                   … #   2個登録                10 #   0                   10個登録 #   [5 3]を登録しました          登録上限に到達 #                       [1 2 3 4 5 6 7 8 9 10] # '入力する値は0以上の整数とし、下記の動作するプログラムを作成しなさい。要素数10の整数型配列を作成し、入力された0以外の数値のうち、これまで入力されていない値だけを追加、記憶させる。追加登録を行った場合には、現在何個の数値が記憶されているかを表示させる。0が入力された場合、または10個の値の登録が完了した場合は、記憶している全ての情報を表示して、プログラムを終了させる' :- 数の記憶([],L,_診断), 記憶内容の表示(L,_診断). 数の記憶(L1,[],正常終了) :- length(L1,10),!. 数の記憶(L1,L,_診断) :- get_integer(N), 数の記憶(N,L1,L,_診断). 数の記憶(0,_,[],途中終了) :- !. 数の記憶(N,L1,L,_診断) :- append(_,[N|_],L1), write('既に登録あり\n'), 数の記憶(L1,L,_診断). 数の記憶(N,L1,[N|R],_診断) :- \+(append(_,[N|_],L1)), length([N|L2],Len), writef('%t個登録\n',[Len]), 数の記憶([N|L1],R,_診断). 記憶内容の表示(L,正常終了) :- concat_atom(L,' ',S), writef('[%t]\n',[S]),!. 記憶内容の表示(L,途中終了) :- concat_atom(L,' ',S), writef('[%t]を登録しました\n',[S]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/269 # # # [1] 授業単元:Cプログラミング # [2] 問題文:2つの正の整数値を入力させ四則演算の結果を表示させる。 # 2つの正の整数値を入力させ四則演算の結果を表示させる :- 2つの正の整数値を入力させ([N1,N2]), 四則演算の結果を(N1,N2,_四則演算の結果), 表示させる(_四則演算の結果). 2つの正の整数値を入力させ(L) :- length(L,_要素数), 2つ(_要素数),!. 2つの正の整数値を入力させ([_正の整数値|R]) :- 正の整数値を入力させ(_正の整数値), 2つの正の整数値を入力させ(R). 2つ(2). 正の整数値を入力させ(_正の整数値) :- write('正の整数値を入力してください : '), get_line(Line), 正の整数値診断(Line,_正の整数値),!. 正の整数値診断(Line,_正の整数値) :- atom_to_term(Line,_正の整数値,_), integer(_正の整数値), _正の整数値 > 0,!. 正の整数値診断(Line,_正の整数値) :- writef('入力された %t からは正の整数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. 四則演算の結果を(N1,N2,_四則演算の結果) :- findall([_演算,_式],四則演算(_演算,_式),_四則演算の結果). 四則演算(加算,N1 + N2 = _演算結果) :- _演算結果 is N1 + N2. 四則演算(減算,N1 - N2 = _演算結果) :- _演算結果 is N1 - N2. 四則演算(乗算,N1 * N2 = _演算結果) :- _演算結果 is N1 * N2. 四則演算(除算,N1 / N2 = _演算結果) :- _演算結果 is N1 + N2. 表示させる(_四則演算の結果) :- append(_,[[_演算,_式]|R],_四則演算の結果), writef('%t %t\n',[_演算,_式]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/270 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): # 要素数10の整数型配列を作成し、初期化の時に10個の任意の数値を代入して置く。 # 1つの整数を入力させ、その整数が、配列の中に何個あるか、または、存在しないかを表示するプログラムを作成しなさい。 # 例:配列が{9, 1, 2, 3, 4, 5, 6, 7, 8, 9}のとき # 1を入力したら、「1個あります」→終了 # 9を入力したら、「2個あります」→終了 # 10を入力したら、「存在しません」→終了 # '要素数10の整数型配列を作成し、初期化の時に10個の任意の数値を代入して置く。1つの整数を入力させ、その整数が、配列の中に何個あるか、または、存在しないかを表示する' :- 要素数10の整数型配列を作成し(L), 初期化の時に10個の任意の数値を代入して置く(L), 1つの整数を入力させ(_整数), その整数が、配列の中に何個あるか、または、存在しないか(_整数,L,_診断), 表示する(_診断). 要素数10の整数型配列を作成し(L) :- length(L,10). 初期化の時に10個の任意の数値を代入して置く([]). 初期化の時に10個の任意の数値を代入して置く([N|R]) :- N is random(20), 初期化の時に10個の任意の数値を代入して置く(R). その整数が、配列の中に何個あるか、または、存在しないか(_整数,L,_何個) :- findall(1,append(_,[_整数|_],L),L2), length(L2,Len), Len > 0, 全角整数表現(Len,_全角整数表現), concat_atom([_全角整数表現,個あります],_何個),!. その整数が、配列の中に何個あるか、または、存在しないか(_整数,L,存在しません). 1つの整数を入力させ(_整数) :- write('1つの整数を入力してください : '), get_line(Line), 整数入力診断(Line,_整数),!. 1つの整数を入力させ(_整数) :- 1つの整数を入力させ(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t から整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 表示する(_診断) :- writef('%t\n',[_診断]). 全角整数表現(_整数値,_全角整数表現) :- number_chars(_整数値,Chars), findall(_全角数字,( append(_,[A|_],Chars), 半角数字全角数字(A,_全角数字)), L), concat_atom(L,_全角整数表現). 半角数字全角数字('0',0). 半角数字全角数字('1',1). 半角数字全角数字('2',2). 半角数字全角数字('3',3). 半角数字全角数字('4',4). 半角数字全角数字('5',5). 半角数字全角数字('6',6). 半角数字全角数字('7',7). 半角数字全角数字('8',8). 半角数字全角数字('9',9). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/235 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # キーボードから西暦を表す4桁の数字を数値として読み込み、閏年かどうか判定する。 # 入力された西暦年が1000年以上4000年いかでなければ、その旨を指示してプログラムを終了する。  # 閏年の条件:4で割り切れるが100で割り切れない年を閏年とする。ただし400で割り切れる年を閏年とする。 # それ以外の年は平年とする。 # # キーボードから西暦を表す4桁の数字を数値として読み込み、閏年かどうか判定する。 :- キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字), 閏年かどうか判定する(_4桁の数字,_閏年か否か). キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字) :- write('西暦を表す4桁の数字を入力してください : '), 西暦を表す4桁の数字を数値として読み込み(_4桁の数字),!. キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字) :- キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字). 西暦を表す4桁の数字を数値として読み込み(_4桁の数字) :- get_line(Line), 西暦を表す4桁の数字診断(Line,_4桁の数字),!. 西暦を表す4桁の数字診断(Line,_4桁の数字) :- atom_to_term(Line,_4桁の数字,_), integer(_4桁の数字), 西暦範囲検査(_4桁の数字),!. 西暦を表す4桁の数字診断(Line,_4桁の数字) :- atom_to_term(Line,_4桁の数字,_), \+(integer(_4桁の数字)), writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]),!,fail. 西暦を表す4桁の数字診断(Line,_) :- fail. 西暦範囲検査(_4桁の数字) :- _4桁の数字 >= 1000, _4桁の数字 =< 4000,!. 西暦範囲検査(_4桁の数字) :- writef('入力された数字 %t は 1000以上4000以下の範囲にありません。再入力をお願いします。\n',[_4桁の数字]),!, fail. 閏年かどうか判定する(_4桁の数字,閏年) :- 閏年(_4桁の数字),!. 閏年かどうか判定する(_,閏年ではない). 閏年(_年,閏年) :- 0 is _年 mod 400,!. 閏年(_年,閏年) :- 0 is _年 mod 100, !,fail . 閏年(_年,閏年) :- 0 is _年 mod 4,!. 閏年(_年,閏年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/232 # # [1] 授業単元:配列の並び替え # [2] 問題文(含コード&リンク): # ../test/read.cgi/tech/1307166756/189のシステムを以下のように拡張する。 # 指定済みの座標を入力した場合、「先手の負け」または「後手の負け」と表示する。 # 全てのマスが埋まったら、「試合終了」と表示する。 # この段階でも、勝ち負けの判定も行わない。 '先手、後手の順番で、x=1,2,3 y=1,2,3の座標の整数値をx yの順番で与えると、その場所に先手ならA、後手ならBを表示して、3目並べを実現する' :- length(LL,3), findall(L,(append(_,[L|_],LL),length(L,3)),LL), 3目並べを実現する(後手,LL,_診断). 3目並べを実現する(_,_,_診断) :- \+(var(_診断)),!. 3目並べを実現する(_,LL,正常終了) :- 打つところがない(LL), write('試合終了),!. 3目並べを実現する(_前の手番,LL,正常終了) :- 三目ならび完成(LL), writef('%tの勝ちです\n',[_前の手番]),!. 3目並べを実現する(_前の手番,LL,_診断) :- \+(三目ならび完成(LL)), 手番(_前の手番,_手番), 座標値を与える(_手番,LL,_診断), 3目並べを実現する(_手番,LL,_診断). 打つところがない([]). 打つところがない([L|R]) :- 全て変数(L), 打つところがない(R). すべて変数([]). すべて変数([V|R]) :- var(V), すべて変数(R). 三目ならび完成([[_,_,A],[_,A,_],[A,_,_]]) :- \+(var(A)),!. 三目ならび完成([[A,_,_],[_,A,_],[_,_,A]]) :- \+(var(A)),!. 三目ならび完成([[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,_,[A,A,A]]) :- \+(var(A)),!. 三目ならび完成(L) :- 転置(L,L1), 三目ならび完成(L1). 手番(先手,後手). 手番(後手,先手). 着手記号(先手,'O'). 着手記号(後手,'@'). 座標値を与える(_手番,LL,_診断) :- 盤面表示(LL), writef('%t の手番です : \n',[_手番]), 座標値を得る(_x,_y), 座標値診断(_手番,_x,_y,LL),!. 座標値を得る(_x,_y) :- get_line(Line), split(Line,[' ',','],[_x,_y]),!. 座標値診断(_手番,_x,_y,LL,_診断) :- nth1(_y,LL,L), nth1(_x,L,V), var(V), 着手記号(_手番,_記号), V = _記号,!. 座標値診断(_手番,_,_,_,異常終了) :- write('%tの負けです。\n',[_手番]),!. 盤面表示(LL) :- write('---------\n'), append(_,[[A,B,C]|R],LL), 変数は空白に変換([A,B,C],[A2,B2,C2]), concat_atom([A2,B2,C2],'|',S), writef('|%t|\n',[S]), R = [], write('---------\n'),!. 変数は空白に変換([],[]). 変数は空白に変換([V|R1],[' '|R2]) :- var(V), 変数は空白に変換(R1,R2). 変数は空白に変換([V|R1],[V|R2]) :- \+(var(V)), 変数は空白に変換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/189 # # [1] 授業単元:配列の並び替え # [2] 問題文(含コード&リンク): # 先手、後手の順番で、x=1,2,3 y=1,2,3の座標の整数値をx yの順番で与えると、その場所に先手ならO、後手なら@を表示して、3目並べを実現するプログラムを作成しなさい。 # 操作は、先手・後手が交互に座標の数値を1ずつ与えるものとし、入力ミスは考えない。 # すでに指定済みの座標かどうかについては判定し、指定済みの座標を入力した場合は、「異常終了」と表示し、プログラムを終了することとする。 # この段階では、勝ち負けの判定も行わない。 # '先手、後手の順番で、x=1,2,3 y=1,2,3の座標の整数値をx yの順番で与えると、その場所に先手ならA、後手ならBを表示して、3目並べを実現する' :- length(LL,3), findall(L,(append(_,[L|_],LL),length(L,3)),LL), 3目並べを実現する(後手,LL,_診断), 診断値表示(_診断). 3目並べを実現する(_,_,_診断) :- \+(var(_診断)),!. 3目並べを実現する(_前の手番,LL,正常終了) :- 三目ならび完成(LL), writef('%tの勝ちです\n',[_前の手番]),!. 3目並べを実現する(_前の手番,LL,_診断) :- \+(三目ならび完成(LL)), 手番(_前の手番,_手番), 座標値を与える(_手番,LL,_診断), 3目並べを実現する(_手番,LL,_診断). 三目ならび完成([[_,_,A],[_,A,_],[A,_,_]]) :- \+(var(A)),!. 三目ならび完成([[A,_,_],[_,A,_],[_,_,A]]) :- \+(var(A)),!. 三目ならび完成([[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,_,[A,A,A]]) :- \+(var(A)),!. 三目ならび完成(L) :- 転置(L,L1), 三目ならび完成(L1). 手番(先手,後手). 手番(後手,先手). 着手記号(先手,'O'). 着手記号(後手,'@'). 座標値を与える(_手番,LL,_診断) :- 盤面表示(LL), writef('%t の手番です : \n',[_手番]), 座標値を得る(_x,_y), 座標値診断(_手番,_x,_y,LL),!. 座標値を得る(_x,_y) :- get_line(Line), split(Line,[' ',','],[_x,_y]),!. 座標値診断(_手番,_x,_y,LL,_診断) :- nth1(_y,LL,L), nth1(_x,L,V), var(V), 着手記号(_手番,_記号), V = _記号,!. 座標値診断(_,_,_,_,異常終了). 診断値表示(異常終了) :- write('異常終了\n'),!. 診断値表示(_). 盤面表示(LL) :- write('---------\n'), append(_,[[A,B,C]|R],LL), 変数は空白に変換([A,B,C],[A2,B2,C2]), concat_atom([A2,B2,C2],'|',S), writef('|%t|\n',[S]), R = [], write('---------\n'),!. 変数は空白に変換([],[]). 変数は空白に変換([V|R1],[' '|R2]) :- var(V), 変数は空白に変換(R1,R2). 変数は空白に変換([V|R1],[V|R2]) :- \+(var(V)), 変数は空白に変換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/119 # # [1] 授業単元:配列の並び替え # [2] 問題文(含コード&リンク): # 次の処理を順に行うプログラムを作成しなさい。 # 要素数5の整数型配列に、すべて異なる整数を入力させる。 # 入力された順に、配列の中身を表示しなさい。 # 次に、配列の中身を入れ替え、昇順に並び替えなさい。 # 並び替えた配列の中身を表示しなさい。 # '要素数5の整数型配列に、すべて異なる整数を入力させる。入力した順に、配列の中身を表示する。次に、配列の中身を入れ替え、昇順に並び替える。 並び替えた配列の中身を表示する' :- 要素数5の整数型配列に、すべて異なる整数を入力させる(L), 入力された順に、配列の中身を表示する(L), 配列の中身を入れ替え、昇順に並び替える(L,L2), 並び替えた配列の中身を表示する(L2). '要素数5の整数型配列に、すべて異なる整数を入力させる'(_要素数5の整数ならび) :- length(_要素数5の整数ならび,5), '要素数5の整数型配列に、すべて異なる整数を入力させる'([],_要素数5の整数ならび). '要素数5の整数型配列に、すべて異なる整数を入力させる'([],[]). '要素数5の整数型配列に、すべて異なる整数を入力させる'(L1,[N|R]) :- length([_|L1],Nth), writef('整数[%t番目]を入力してください : ',[Nth]), get_line(Line), 整数入力検査(Line,L1,N),!. '要素数5の整数型配列に、すべて異なる整数を入力させる'(L1,L) :- '要素数5の整数型配列に、すべて異なる整数を入力させる'(L1,L). 整数入力検査(Line,L1,N) :- atom_to_term(Line,N,_), integer(N), \+(append(_,[N|_],L1)),!. 整数入力検査(Line,L1,N) :- \+(atom_to_term(Line,N,_)), !, writef('入力された %t からは整数を得られません。再入力をお願いします。\n',[Line]), fail. 整数入力検査(Line,L1,N) :- atom_to_term(Line,N,_), append(_,[N|_],L1), writef('入力された %t は既に入力があります。再入力をお願いします。\n',[N]), fail. 入力された順に、配列の中身を表示する(L) :- concat_atom(L,' ',S), writef('%t\n',[S]),!. 配列の中身を入れ替え、昇順に並び替える([],[]) :- !. 配列の中身を入れ替え、昇順に並び替える([A],[A]) :- !. 配列の中身を入れ替え、昇順に並び替える(L1,[A|R]) :- append(L0,[A|R0],L1), append(L0,R0,L2), min(L2,B), B @>= A, 配列の中身を入れ替え、昇順に並び替える(L2,R). 並び替えた配列の中身を表示する(L) :- concat_atom(L,' ',S), writef('%t\n',[S]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/17 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): # 10人の身長(cm単位の実数)を入力させ、配列に記憶する。 # その後、平均身長を求めて表示した後、10人分の身長を表示するプログラムを作成しなさい。 # '10人の身長(cm単位の実数)を入力させ、配列に記憶する。その後、平均身長を求めて表示した後、10人分の身長を表示する' :- 'n人分の身長(cm単位の実数)を入力させ、配列に記憶する'(10,_10人分の身長ならび), その後、平均身長を求めて表示(_10人分の身長ならび), '10人分の身長を表示する'(_10人分の身長ならび). 'n人分の身長(cm単位の実数)を入力させ、配列に記憶する'(_n,_n人分の身長ならび) :- writef('%t人分の身長(実数)をカンマ区切りで入力してください : ',[_n]), get_line(Line), 入力診断(Line,_n,_n人分の身長ならび),!. 'n人分の身長(cm単位の実数)を入力させ、配列に記憶する'(_n,_n人分の身長ならび) :- 'n人分の身長(cm単位の実数)を入力させ、配列に記憶する'(_n,_n人分の身長ならび). 入力診断(Line,_n,_n人分の身長ならび) :- split(Line,[',',' '],L1), 全て実数化(L1,L2), 入力診断のニ(L2,_n,_n人分の身長ならび). 入力診断(Line,_n,_) :- writef('入力された %t から%t個の実数が得られません。再入力をお願いします。\n',[Line,_n]), fail. 入力診断のニ(L1,_n,_n人分の身長ならび) :- length(_n人分の身長ならび,_n), append(_n人分の身長ならび,L2,L1), length(L2,_n_2), writef('入力要素が10項を越えました。%t項を切り取ります\n',[_n_2]),!. 入力診断のニ(L1,_n,_n人分の身長ならび) :- length(_n人分の身長ならび,_n), append(L1,L2,_n人分の身長ならび), length(L2,_n_2), writef('入力が%t項足りません\n',[_n_2]), 補充の身長を入力する(_n_2,L2). 補充の身長を入力する(_n,_n人分の身長ならび) :- '身長(cm単位の実数)を入力させ、配列に記憶する'(_n,_n人分の身長ならび). すべて実数化([],[]). すべて実数化([V|R1],[V|R2]) :- real(V), すべて実数化(R1,R2). すべて実数化([N|R1],[V|R2]) :- integer(N), V is N * 1.0, すべて実数化(R1,R2). その後、平均身長を求めて表示(L) :- findavg(A,append(_,[A|_],L),_平均身長), writef('平均身長は %t \n',[_平均身長]). '10人分の身長を表示する'(L) :- concat_atom(L,' ',S), writef('入力された10人の身長は %t です\n',[S]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/13 # # [1] 授業単元:繰り返し・条件分岐 # [2] 問題文(含コード&リンク): # 3以上40未満の整数Nを入力したとき、「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画するプログラムを作成しなさい。 # 例: 3 # *** # * * # *** # '3以上40未満の整数Nを入力したとき、「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する' :- '3以上40未満の整数Nを入力したとき'(_N), '「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する'(_N). '3以上40未満の整数Nを入力したとき'(_N) :- write('3以上40未満の整数を入力してください : '), get_line(Line), '3以上40未満の整数Nを入力診断'(Line,_N),!. '3以上40未満の整数Nを入力したとき'(_N) :- '3以上40未満の整数Nを入力したとき'(_N). '3以上40未満の整数Nを入力診断'(Line,_N) :- atom_to_term(Line,_N,_), integer(_N), _N >= 3, _ < 40,!. '3以上40未満の整数Nを入力診断'(Line,_N) :- writef('入力された %t からは3以上40未満の整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. '「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する'(_N) :- 一辺の長さがNの(_N,LL), 中を塗りつぶさない正方形を描画する(LL). 一辺の長さがNの(_N,LL) :- length(LL,_N), findall(L,( append(_,[L|_],LL), length(L,_N)), LL),!. 中を塗りつぶさない正方形を描画する([L|R]) :- all(L,'*'), 中を塗りつぶさいない正方形を(R), 描画する([L|R]). 中を塗りつぶさない正方形を([L]) :- all(L,'*'),!. 中を塗りつぶさない正方形を([['*'|R1]|R]) :- last(R1,'*'), 変数を空白に変換(R1,' '), 中を塗りつぶさない正方形を(R). 変数を空白に変換([]) :- !. 変数を空白に変換([' '|R]) :- 変数を空白に変換(R),!. 変数を空白に変換([_|R]) :- 変数を空白に変換(R). 描画する([]). 描画する([L|R]) :- concat_atom(L,S), writef('%t\n',[S]), 描画する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/13 # # [1] 授業単元:繰り返し・条件分岐 # [2] 問題文(含コード&リンク): # 3以上40未満の整数Nを入力したとき、「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画するプログラムを作成しなさい。 # 例: 3 # *** # * * # *** # '3以上40未満の整数Nを入力したとき、「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する' :- '3以上40未満の整数Nを入力したとき'(_N), '「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する'(_N). '3以上40未満の整数Nを入力したとき'(_N) :- write('3以上40未満の整数を入力してください : '), get_line(Line), '3以上40未満の整数Nを入力診断'(Line,_N),!. '3以上40未満の整数Nを入力したとき'(_N) :- '3以上40未満の整数Nを入力したとき'(_N). '3以上40未満の整数Nを入力診断'(Line,_N) :- atom_to_term(Line,_N,_), integer(_N), _N >= 3, _ < 40,!. '3以上40未満の整数Nを入力診断'(Line,_N) :- writef('入力された %t からは3以上40未満の整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. '「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する'(_N) :- 一辺の長さがNの(_N,LL), 中を塗りつぶさない正方形を描画する(LL). 一辺の長さがNの(_N,LL) :- length(LL,_N), findall(L,( append(_,[L|_],LL), length(L,_N)), LL),!. 中を塗りつぶさない正方形を描画する([L|R]) :- all(L,'*'), 中を塗りつぶさいない正方形を(R), 描画する([L|R]). 中を塗りつぶさない正方形を([L]) :- all(L,'*'),!. 中を塗りつぶさない正方形を([['*'|R1]|R]) :- last(R1,'*'), 変数を空白に変換(R1,' '), 中を塗りつぶさない正方形を(R). 変数を空白に変換([]) :- !. 変数を空白に変換([' '|R]) :- 変数を空白に変換(R),!. 変数を空白に変換([_|R]) :- 変数を空白に変換(R). 描画する([]). 描画する([L|R]) :- concat_atom(L,S), writef('%t\n',[S]), 描画する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/894 # # [1] 授業単元: Cプログラミング1 # [2] 問題文:2つの n 次元ベクトル a,b の内積を求めるプログラムを作成せよ。尚、n の個数は未定であるので、動的メモリを利用せよ。 # (入力例) # 何個入力しますか? : 5 # a input num[0] : 12.3 # a input num[1] : 5.6 # a input num[2] : 7.89 # a input num[3] : 9.51 # a input num[4] : 62.7 # b input num[0] : 0.12 # b input num[1] : 34.56 # b input num[2] : 7.89 # b input num[3] : 75.3 # b input num[4] : 86.1 # (出力) # inner product : 6371.837100 # # '2つの n 次元ベクトル a,b の内積を求める' :- 'n 次元ベクトルを得る'(_n), '2つの n 次元ベクトル a,b を入力する'(_n,_a,_b), ベクトルの内積(_a,_b,_内積), 内積を表示する(a,_a,b,_b,_内積). 'n 次元ベクトルを得る'(_n) :- write('何次元のベクトルを入力しますか? : '), get_integer(_n),!. '2つの n 次元ベクトル a,b を入力する'(_n,_a,_b) :- 'n 次元ベクトルを入力する'(_n,a,_a), 'n 次元ベクトルを入力する'(_n,b,_b),!. 'n 次元ベクトルを入力する'(_n,_ベクトル名,_ベクトル) :- length(_ベクトル,_n), writef('%t次元ベクトル%tの入力 ',[_n,_ベクトル名]), findall([V],( append(L0,[_|_],_ベクトル), length([_|L0],Nth), 値の入力(Nth,_n,V)), _ベクトル),!. 値の入力(Nth,_n,V) :- writef('[%t-%t] : ',[Nth,_n]), get_line(Line), 値の入力診断(Line,V),!. 値の入力(Nth,_n,V) :- 値の入力(Nth,_n,V). 値の入力診断(Line,V) :- atom_to_term(Line,V,_), number(V),!. 値の入力診断(Line,V) :- writef('入力された %t からは適切な値が得られませんでした。再入力をお願いします。\n',[Line]), fail. ベクトルの内積([],[],0) :- !. ベクトルの内積([[A]|R1],[[B]|R2],X) :- ベクトルの内積(R1,R2,Y), X is Y + A * B. 内積を表示する(a,_a,b,_b,_内積) :- writef('ベクトル%t %t と ベクトル%t %t の内積は %t です\n',[a,_a,b,_b,_内積]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/874 # # [1] 授業単元: Cプログラミング1 # [2] 問題文(含コード&リンク): キーボードより整数 a を入力して、 a×a の2次元配列を動的メモリ確保し、その配列の中に a×a の九九の計算結果を代入し、その内容を表示するプログラムを作成せよ。 # (入力例) # input num : 3 # (出力) # 1 2 3 # 2 4 6 # 3 6 9 # # 'キーボードより整数 a を入力して、 a×a の2次元配列を動的メモリ確保し、その配列の中に a×a の九九の計算結果を代入し、その内容を表示する' :- 'キーボードより整数 a を入力して'(_a), 'a×a の2次元配列を動的メモリ確保し'(_a,LL), 'その配列の中に a×a の九九の計算結果を代入し'(_a,LL), その内容を表示する(_a,LL). 'キーボードより整数 a を入力して'(_a) :- write('input num : '), get_line(Line), 整数入力検査(Line,_a),!. 'キーボードより整数 a を入力して'(_a) :- 'キーボードより整数 a を入力して'(_a). 整数入力検査(Line,_a) :- atom_to_term(Line,_a,_), integer(_a), _a > 0,!. 整数入力検査(Line,_a) :- writef('入力された %t からは適切な整数が得られませんでした。再入力をお願いします\n',[Line]), fail. 'a×a の2次元配列を動的メモリ確保し'(_a,LL) :- length(LL,_a), findall(L,( append(_,[L|_],LL), length(L,_a)), LL). 'その配列の中に a×a の九九の計算結果を代入し'(_a,LL) :- findall(L,( append(L0,[L|_],LL), findall(V,( append(L01,[V|_],L), ならびの掛け算([_|L0],[_|L01],LX), length(LX,V)), L)), LL). ならびの掛け算(L1,L2,LX) :- findall(L2,( append(_,[_|_],L1)), LL), flat(LL,LX). その内容を表示する(_a,LL) :- 表示パターンを生成する(_a,_表示パターン), append(_,[N|R],L), writef(_表示パターン,[N]), R = []. その内容を表示する(_a,LL) :- 表示パターンを生成する(_a,_表示パターン), append(_,[N|R],L), writef(_表示パターン,[N]), R = []. 表示パターンを生成する(_a,_表示パターン) :- length(L,_a), all(L,'%t '), append(L,['\n'],L2), concat_atom(L2,_表示パターン),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/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文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字), sub_atom(_文字列,S,_,_,_ある特定の文字), sub_atom(_文字列,S,_,0,_ある特定の文字が最初に表れる位置からそれ以降の部分文字列). キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- write('10文字以内の任意の文字列とある特定の文字を空白区切りで入力してください : '), get_line(Line), 文字列入力診断(Line,_文字列,_ある特定の文字),!. キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字). 文字列入力診断(Line,_文字列,_ある特定の文字) :- split(Line,[' ',','],[_文字列,_ある特定の文字]), atom(_文字列), sub_atom(_ある特定の文字,0,1,0,_ある特定の文字), sub_atom(_文字列,_,_文字列の長さ,_,_文字列), 文字列の長さ診断(_文字列,_文字列の長さ),!. 文字列入力診断(Line,_,_) :- writef('入力された %t から適切な情報が得られません。再入力をお願いします。\n',[Line]), fail. 文字列の長さ診断(_文字列,_文字列の長さ) :- _文字列の長さ =< 10,!. 文字列の長さ診断(_文字列,_文字列の長さ) :- writef('入力された文字列 %t は%t文字あります。10文字以下の長さで再入力をお願いします\n',[Line,_文字列の長さ]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/719 # # # (1)%で始まっていればコマンドに応じた処理ができるように分岐処理を書く # %Q:プログラムの終了 # %C:メモリ中に保持しているデータの登録数を出力 # %P:0~99番目までの100人分のデータが登録されている場合 # %P 8 …0番目→7番目の順で表示 # %P -10 …90番目→99番目の順で表示 # 出力例: # # ID : 100023 # Name : Tokyo # Date : 1900/1/1 # Addr : Tokyoto....... # Memo : aaeiou 1234566.... # # ID : 100048 # Name : Osaka # Date : 1900/2/2 # Addr : Osakafu....... # Memo : abcde 124816.... # # (2)%で始まっていなければデータを格納 # (3)ループするようにしておいて何行でも入力可能にする(%Qでプログラムを終了) # # # # 以下プログラムですが実行してもうまくいきません。 # とりあえずどういった感じで作っているか雰囲気だけでも分かってもらえればと思います。 # プログラム :- データまたはコマンドの入力(_データまたはコマンド行), コマンドループ(_データまたはコマンド行,_診断), _診断 = 終了. データまたはコマンドの入力(_データまたはコマンド行) :- get_line(_データまたはコマンド行). コマンドループ(_データまたはコマンド行,_診断) :- sub_atom(_データまたはコマンド行,0,1,_,'%'), split(_データまたはコマンド行,['%',' '],[_コマンド|_引数], コマンドの実行(_コマンド,_引数,_診断). コマンドループ(_データまたはコマンド行,_診断) :- \+(sub_atom(_データまたはコマンド行,0,1,_,'%')), データ入力(_データまたはコマンド行,_診断). コマンドループ(_,_診断) :- データまたはコマンドの入力(_データまたはコマンド行), コマンドループ(_データまたはコマンド行,_診断). コマンドの実行('Q',_,終了) :- コマンドの実行('C',_,true) :- count(clause(データ(_),_),_登録データ数), writef('登録データ数 = %t\n',[_登録データ数]). コマンドの実行('P',[N],true) :- N < 0, N >= -50, M1 is 100 + N, M2 is 0 - N - 1, for(M1,M,M2), データ(M,_データ), writef('%t\n',[_データ]), M = M2,!. コマンドの実行('P',[N],true) :- N >= 0, N =< 100, M1 is 0, M2 is N - 1, for(M1,M,M2), データ(M,_データ), writef('%t\n',[_データ]), M = M2,!. コマンドの実行(_,_,false). データ入力(_データ,true) :- findmax(N,データ(N,_),Max), Max2 is Max + 1, assertz(データ(Max2,_データ)),!. データ入力(_データ,true) :- assertz(データ(0,_データ)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/555 # # 内容: # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 正の整数を入力したとき、その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と表示するプログラムを作成しなさい # 入力した値が0または負の整数であれば、繰り返し再入力させるようにプログラムを作成すること # '正の整数を入力したとき、その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と表示する' :- '正の整数を入力する'(_1以上の正の整数), その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と(_1以上の正の整数,_診断), 表示する(_診断). 正の整数を入力する(_1以上の正の整数) :- write('1以上の正の整数を入力してください : '), get_line(Line), 正の整数入力診断(Line,_1以上の正の整数),!. 正の整数を入力する(_1以上の正の整数) :- 正の整数を入力する(_1以上の正の整数). 正の整数入力診断(Line,_1以上の正の整数) :- atom_to_term(Line,_1以上の正の整数,_), integer(_1以上の正の整数), _1以上の正の整数 >= 1,!. 正の整数入力診断(Line,_1以上の正の整数) :- writef('入力された %t からは1以上の正の整数が得られません。再入力をお願いします。\n',[Line]), fail. その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と(_その数値,_診断) :- _その数値 > 0, Y is _その数値 - 1, 階乗(Y,Z), 0 is (Z + 1) mod _その数値,!. その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と(_その数値,素数ではありません) :- _その数値 > 0, Y is _その数値 - 1, 階乗(Y,Z), \+(0 is (Z + 1) mod _その数値),!. 階乗(M,N,1) :- M > N, !. 階乗(M,N,X) :- M2 is M + 1, 階乗(M2,N,Y), X is M * Y. 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1, 階乗(N2,Y), X is N * Y,!. 表示する(_診断) :- writef('%t\n',[_診断]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/436 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 今回は、単方向リストを用いて電話帳のプログラムを作ってもらいます。 # 実装するのは、入力、削除、表示、終了、load、saveです # 1.入力は、名前、電話番号を入力する。(可能ならばソートを行う) # 2.saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する) # 3.loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする # 4.ヒント(mallocの意味を調べること) # 単方向リストを用いた電話帳(入力,_更新前電話帳,_更新後電話帳) :- '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳). 単方向リストを用いた電話帳(save,_ファイル名,_電話帳) :- 'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳). 単方向リストを用いた電話帳(load,_ファイル名,_電話帳) :- 'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳). '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳) :- 名前を入力する(_名前), 電話番号を入力する(_電話番号), ソートされた状態を保って入力する(_名前,_電話番号,_更新前電話帳,_更新後電話帳). 名前を入力する(_名前) :- get_line(_名前). 電話番号を入力する(_電話番号) :- get_line(Line), 電話番号入力診断(Line,_電話番号),!. 電話番号を入力する(_電話番号) :- 電話番号を入力する(_電話番号). 電話番号入力診断(Line,_電話番号) :- 構成文字は数字かハイフンだけ(Line),!. 電話番号入力診断(Line,_電話番号) :- 数字かハイフン以外の構成文字を選別する(Line,_電話番号にふさわしくない文字ならび), writef('入力された %t には電話番号としてふさわしくない文字 %t が含まれています。再入力をお願いします。\n',[Line,_電話番号に相応しくない文字ならび]). 数字かハイフン以外の構成文字を選別する(Line,_電話番号にふさわしくない文字ならび) :- atom_chars(Line,Chars), 数字かハイフン以外の構成文字を選別する(Chars,[],_電話番号にふさわしくない文字ならび). 数字かハイフン以外の構成文字を選別する([],L,L) :- !. 数字かハイフン以外の構成文字を選別する([_文字|R1],L1,_電話番号にふさわしくない文字ならび) :- \+(数字かハイフン(_文字)), \+(append(_,[_文字|_],L1)), 数字かハイフン以外の構成文字を選別する(R1,[_文字|L1],_電話番号にふさわしくない文字ならび). 数字かハイフン以外の構成文字を選別する([_文字|R1],L1,_電話番号にふさわしくない文字ならび) :- (数字かハイフン(_文字);append(_,[_文字|_],L1)), 数字かハイフン以外の構成文字を選別する(R1,L1,_電話番号にふさわしくない文字ならび). 数字かハイフン('-') :- !. 数字かハイフン(_文字) :- append(_,[_文字|_],['0','1','2','3','4','5','6','7','8','9']),!. ソートされた状態を保って入力する(_名前,_電話番号,[],[[_名前,_電話番号]]) :- !. ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R],[[_名前,_電話番号],[_名前1,_電話番号1]|R]) :- _名前 @=< _名前1,!. ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R1],[[_名前1,_電話番号1]|R2]) :- _名前 @> _名前1, ソートされた状態を保って入力する(_名前,_電話番号,R1,R2). 'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳) :- tell(_ファイル名), writef('%q.\n',[_電話帳]), told. 'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳) :- see(_ファイル名), read(_電話帳), seen. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/436 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 今回は、単方向リストを用いて電話帳のプログラムを作ってもらいます。 # 実装するのは、入力、削除、表示、終了、load、saveです # 1.入力は、名前、電話番号を入力する。(可能ならばソートを行う) # 2.saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する) # 3.loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする # 4.ヒント(mallocの意味を調べること) # 単方向リストを用いた電話帳(入力,_更新前電話帳,_更新後電話帳) :- '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳). 単方向リストを用いた電話帳(save,_ファイル名,_電話帳) :- 'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳). 単方向リストを用いた電話帳(load,_ファイル名,_電話帳) :- 'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳). '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳) :- 名前を入力する(_名前), 電話番号を入力する(_電話番号), ソートされた状態を保って入力する(_名前,_電話番号,_更新前電話帳,_更新後電話帳). 名前を入力する(_名前) :- get_line(_名前). 電話番号を入力する(_電話番号) :- get_line(Line), 電話番号入力診断(Line,_電話番号),!. 電話番号を入力する(_電話番号) :- 電話番号を入力する(_電話番号). 電話番号入力診断(Line,_電話番号) :- 構成文字は数字かハイフンだけ(Line),!. 電話番号入力診断(Line,_電話番号) :- 数字かハイフン以外の構成文字を選別する(Line,_電話番号にふさわしくない文字ならび), writef('入力された %t には電話番号としてふさわしくない文字 %t が含まれています。再入力をお願いします。\n',[Line,_電話番号に相応しくない文字ならび]). 数字かハイフン以外の構成文字を選別する(Line,_電話番号にふさわしくない文字ならび) :- atom_chars(Line,Chars), 数字かハイフン以外の構成文字を選別する(Chars,[],_電話番号にふさわしくない文字ならび). 数字かハイフン以外の構成文字を選別する([],L,L) :- !. 数字かハイフン以外の構成文字を選別する([_文字|R1],L1,_電話番号にふさわしくない文字ならび) :- \+(数字かハイフン(_文字)), \+(append(_,[_文字|_],L1)), 数字かハイフン以外の構成文字を選別する(R1,[_文字|L1],_電話番号にふさわしくない文字ならび). 数字かハイフン以外の構成文字を選別する([_文字|R1],L1,_電話番号にふさわしくない文字ならび) :- (数字かハイフン(_文字);append(_,[_文字|_],L1)), 数字かハイフン以外の構成文字を選別する(R1,L1,_電話番号にふさわしくない文字ならび). 数字かハイフン('-') :- !. 数字かハイフン(_文字) :- append(_,[_文字|_],['0','1','2','3','4','5','6','7','8','9']),!. ソートされた状態を保って入力する(_名前,_電話番号,[],[[_名前,_電話番号]]) :- !. ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R],[[_名前,_電話番号],[_名前1,_電話番号1]|R]) :- _名前 @=< _名前1,!. ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R1],[[_名前1,_電話番号1]|R2]) :- _名前 @> _名前1, ソートされた状態を保って入力する(_名前,_電話番号,R1,R2). 'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳) :- tell(_ファイル名), writef('%q.\n',[_電話帳]), told. 'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳) :- see(_ファイル名), read(_電話帳), seen. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/423 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 3つの異なる値の実数を入力させる。それがどんな順番で入力されたとしても、昇順に並び替えて表示するプログラムを作成しなさい # なお、プログラムの末尾には、このプログラムが正しいことを確認するためには、何パターンのデータを試す必要があるかを考え、必要なテストを行った結果を記録しなさい # 3つの異なる値の実数を入力させる。それがどんな順番で入力されたとしても、昇順に並び替えて表示する :- 3つの異なる値の実数を入力させる(V1,V2,V3), '3sort'(V1,V2,V3,_1,_2,_3), writef('%t %t %t\n',[_1,_2,_3]). '3sort'(_1,_2,_3,_1,_2,_3) :- _1 =< _2,_2 =< _3,!. '3sort'(_1,_2,_3,_1,_3,_2) :- _1 =< _3,_3 =< _2,!. '3sort'(_1,_2,_3,_2,_1,_3) :- _2 =< _1,_1 =< _3,!. '3sort'(_1,_2,_3,_2,_3,_1) :- _2 =< _3,_3 =< _1,!. '3sort'(_1,_2,_3,_3,_1,_2) :- _3 =< _1,_1 =< _2,!. '3sort'(_1,_2,_3,_3,_2,_1) :- _3 =< _2,_2 =< _1,!. 3つの異なる値の実数を入力させる(V1,V2,V3) :- 実数を入力する(1,[],V1), 実数を入力する(2,[V1],V2), 実数を入力する(3,[V1,V2],V3),!. 実数を入力する(_N番目,L,V) :- writef('実数を入力してください[%t番目] : ',[_N番目]), get_line(Line), 実数入力検査(Line,L,V),!. 実数を入力する(_N番目,L,V) :- 実数を入力する(_N番目,L,V). 実数入力検査(Line,L,_実数) :- atom_to_term(Line,_実数,_), 実数入力検査のニ(Line,L,_実数),!. 実数入力検査のニ(Line,L,_実数) :- float(_実数), \+(append(_,[_実数|_],L)),!. 実数入力検査のニ(Line,L,_実数) :- \+(float(_実数)),!, writef('入力された %t からは実数値が得られません。\n',[Line]), fail. 実数入力検査のニ(Line,L,_実数) :- float(_実数),!, append(_,[_実数|_],L), writef('実数 %t は既に入力されています\n',[_実数]), fail. テスト :- テストパターン(N,_,[V1,V2,V3],L,[X1,X2,X3]), L = [V1,V2,V3], \+('3sort'(V1,V2,V3,X1,X2,X3)), writef('no%t, Error %t,%t,%t\n',[V1,V2,V3]), fail. テスト. テストパターン(1,(1 < 2,2 < 3),[1.0,2.0,3.0],[A,B,C],[A,B,C]). テストパターン(2,(1 < 3,3 < 2),[1.0,3.0,2.0],[A,C,B],[A,B,C]). テストパターン(3,(2 < 1,1 < 3),[2.0,1.0,3.0],[B,A,C],[A,B,C]). テストパターン(4,(2 < 3,3 < 1),[2.0,3.0,1.0],[B,C,A],[A,B,C]). テストパターン(5,(3 < 1,1 < 2),[3.0,1.0,2.0],[C,A,B],[A,B,C]). テストパターン(6,(3 < 2,2 < 1),[3.0,2.0,1.0],[C,B,A],[A,B,C]). テストバターン(7,(1 = 2,2 < 3),[1.0,1.0,3.0],[A,A,C],[A,A,C]). テストパターン(8,(1 = 3,3 < 2),[1.0,1.0,2.0],[A,A,B],[A,B,A]). テストパターン(9,(2 = 3,3 < 1),[2.0,2.0,1.0],[B,B,A],[A,B,B]. テストパターン(10,(1 < 2,2 = 3),[1.0,2.0,2.0],[A,B,B],[A,B,B]). テストパターン(11,(2 < 1,1 = 3),[2.0,1.0,1.0],[B,A,A],[A,B,B]). テストパターン(12,(3 < 2,2 = 1),[3.0,1.0,1.0],[C,A,A],[A,A,C]). テストパターン(13,(1 = 2,2 = 3),[A,A,A],[A,A,A]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/276 # # [1] 授業単元:繰り返し処理 # [2] 問題文: # 五者択一の自作の問題文章を表示させ、整数入力を受けつけ、正解・不正解の判定を行う。 # ただし、正解が入力されるまで、「不正解」と表示した後、同じ問題を正解となるまで繰り返し表示し、回答を入力させる。 # 問題が2問である上記のようなプログラムを作成しなさい。 # # 五者択一の自作の問題文章を表示させ、整数入力を受けつけ、正解・不正解の判定を行う :- 五者択一の自作問題を表示([]), 整数入力を受けつけ([],_整数), 五者択一の自作の問題文章を表示させ、整数入力を受けつけ、正解・不正解の判定を行う(_整数,[]). 五者択一の自作の問題文章を表示させ、整数入力を受けつけ、正解・不正解の判定を行う(_整数,L) :- 正解・不正解の判定を行う(_整数,正解),!. 五者択一の自作の問題文章を表示させ、整数入力を受けつけ、正解・不正解の判定を行う(_整数,L) :- 五者択一の自作問題を表示([_整数|L]), 整数入力を受けつけ([_整数|L],_整数2), 五者択一の自作の問題文章を表示させ、整数入力を受けつけ、正解・不正解の判定を行う(_整数2,[_整数|L]). 自作問題(3,'キシュウローレルは桜花賞馬にはなれなかった'). 自作問題(5,'ニホンピロエースは1966年の皐月賞馬である'). 自作問題(1,'タニノハローモアは阪神三歳ステークスで一番人気だった'). 自作問題(2,'ダコタはNHK杯の勝ち馬だった'). 自作問題(4,'ヤマノオーはダービーでは同着の2着だった'). 五者択一の自作問題を表示(L) :- write('以下の文で正しくないものの文番号を入力しなさい\n'), append(_,[_番号|R],[1,2,3,4,5]), \+(append(_,[_番号|_],L)), 自作問題を表示(_番号), R = [],!. 自作問題を表示(_番号) :- 自作問題(_番号,_問題), writef('%t .. %t\n',[_番号,_問題]),!. 整数入力を受けつけ(L,_整数) :- write('整数 : '), get_line(Line), 整数入力を受けつけ診断(Line,L,_整数),!. 整数入力を受けつけ(L,_整数) :- 整数入力を受けつけ(L,_整数). 整数入力を受けつけ診断(Line,L,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), \+(append(_,[_整数|_],L)), _整数 >= 1, _整数 =< 5,!. 整数入力を受けつけ診断(Line,L,_整数) :- writef('入力された %t からは1~5の整数が得られません。再入力をお願いします。',[Line]), fail. 正解・不正解の判定を行う(_解答,正解) :- 正解(_解答),!. 正解・不正解の判定を行う(_解答,不正解). 正解(2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/220 # # 全然わからなくて困ってます。よろしくお願いします。 # [1] 授業単元:実用プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力された2つの整数と演算番号(1〜4)に対して、ポインタを使って以下の処理をするプログラムを作りなさい。 # ただし、演算番号として1〜4以外の値が入力された場合は、"該当する番号がありません.確認して下さい" # と表示してプログラムを終了させることとする。 # (↓からプログラム実行例。_が後ろの数字に付いてる所はキーボードからの入力を表す) # # 2つの実数a,bを入力してください. # a=3_ # b=5_ # 計算の種類を選んでください. # 1:a+b # 2:a-b # 3:a*b # 4:a/b # ==>4_ # a/b=0.600000 # 'キーボードから入力された2つの整数と演算番号(1〜4)に対して、ポインタを使って以下の処理をする' :- write('a='), 'キーボードから整数を入力'(_a), write('b='), 'キーボードから整数を入力'(_b), write('計算の種類を選んでください\n'), write('1:a+b\n2:a-b\n3:a*b\n4:a/b\n'), write('==>'), '演算番号(1〜4)の取得'(_演算番号), 演算(_演算番号,_a,_b,_答え), writef('%t\n',[_答え]),!. 'キーボードから入力された2つの整数と演算番号(1〜4)に対して、ポインタを使って以下の処理をする'. 'キーボードから整数を入力'(_整数) :- get_line(Line), 'キーボードから整数を入力診断'(Line,_整数). 'キーボードから整数を入力'(_整数) :- 'キーボードから整数を入力'(_整数). 'キーボードから整数を入力診断'(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 'キーボードから整数を入力診断'(Line,_整数) :- writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]), fail. '演算番号(1〜4)の取得'(_演算番号) :- get_line(Line), '演算番号(1〜4)の取得診断'(Line,_演算番号). '演算番号(1〜4)の取得診断'(Line,_演算番号) :- atom_to_term(Line,_演算記号,_), integer(_演算記号), _演算記号 >= 1, _演算記号 =< 4. '演算番号(1〜4)の取得診断'(Line,_演算番号) :- write('該当する番号がありません.確認して下さい\n'), fail. 演算(1,_a,_b,_答え) :- _x is _a + _b, concat_atom([_a,'+',_b,'=',_x],_答え). 演算(2,_a,_b,_答え) :- _x is _a - _b, concat_atom([_a,'-',_b,'=',_x],_答え). 演算(3,_a,_b,_答え) :- _x is _a * _b, concat_atom([_a,'*',_b,'=',_x],_答え). 演算(4,_a,_b,_答え) :- _x is _a / _b, concat_atom([_a,'/',_b,'=',_x],_答え). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/146 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   for文を用いて、下の実行結果のように、定価(price)を入力すると #   1〜9割引の価格(kakaku)を表示するプログラムを作成せよ # #   定価の入力:500 # 1割引=450 # 2割引=400 # 3割引=350 # 4割引=300 # 5割引=250 # 6割引=200 # 7割引=150 # 8割引=100 # 9割引=50 # # 'for文を用いて、下の実行結果のように、定価を入力すると1〜9割引の価格を表示する' :- 定価を入力(_定価), for(1,N,9), _割引率 is 0.5 * N, _価格 is _定価 * ( 1 - _割引率), writef('%t割引 = %t\n',[N,_価格]), N = 9. 定価を入力(_定価) :- write('定価を入力してください : '), get_line(Line), 定価入力診断(Line,_定価),!. 定価を入力(_定価) :- 定価を入力(_定価). 定価入力診断(Line,_定価) :- atom_to_term(Line,_定価,_), number(_定価), _定価 >= 0,!. 定価入力診断(Line,_定価) :- writef('入力された文字列 %t から定価に相応しい値を得られませんでした。再入力をお願いします\n',[Line]), fail. % % for/3とbetween/3の違いはbetween(Start,End,N)はEnd >= Startでなくてはならないのに % 対して % for/3はStart < Endが許される。この場合Nは降順に呼び出される。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/16 # # [1]授業単元:課題 # [2]問題文:文字列を読み込み,各文字をアルファベットの辞書順にn文字循環シフトして出力するプログラム. # ただし'b'が'a'+1であると仮定してはならない. # 整数 > 5 # 変換前の文字列 > ayzfvwhbpqrcegiklmnjostdux # 変換後の文字列: fdekabmguvwhjlnpqrsotxyizc # # 文字列を読み込み,各文字をアルファベットの辞書順にn文字循環シフトして出力する :- 文字列を読み込み(_文字列), 各文字をアルファベットの辞書順にn文字循環シフトして(_文字列,_変換された文字列), 出力する(_変換された文字列). 文字列を読み込み(_文字列) :- write('英小文字文字列を入力してください : '), get_line(_文字列), 文字列診断(_文字列),!. 文字列を読み込み(_文字列) :- 文字列を読み込み(_文字列). 文字列診断(_文字列) :- atom_chars(_文字列,Chars), すべてが英小文字(Chars),!. 文字列診断(_文字列) :- write('入力された %t には英小文字以外の文字が存在します。再入力をお願いします。\n'), fail. すべてが英小文字([]). すべてが英小文字([_文字|R]) :- member(_文字,[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]), すべてが英小文字(R). 各文字をアルファベットの辞書順にn文字循環シフトして(_文字列,_変換された文字列) :- atom_chars(_文字列,Chars), 文字ならびの各文字をアルファベットの辞書順にn文字循環シフトして(Chars,Chars2), concat_atom(Chars2,_変換された文字列). 文字ならびの各文字をアルファベットの辞書順にn文字循環シフトして([],[]). 文字ならびの各文字をアルファベットの辞書順にn文字循環シフトして([_文字|R1],[_変換された文字|R2]) :- 英小文字循環シフト(_文字,_変換後文字), 文字ならびの各文字をアルファベットの辞書順にn文字循環シフトして(R1,R2). 英小文字循環シフト(_変換前文字,_変換後文字) :- ならびの回転(左方向,1,[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],[_変換前文字|R]), ならびの回転(左方向,5,[_変換前文字|R],[_変換後の文字|_]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/12 # # [1]c言語 # [2]英文字を読み込み、その一つ一つの文字の個数を求めるプログラム。 # # 実行結果 # 英文字 BBACC # 変換後 B2A1C2 英文字を読み込み、その一つ一つの文字の個数を求める :- 英文字を読み込み(_英文字列), その一つ一つの文字の個数を求める(_英文字列,_その一つ一つの文字の個数), 表示する(その一つ一つの文字の個数). 英文字を読み込み(_英文字列) :- write('英文字列を入力してください : '), get_line(_英文字列), 英文字読み込み診断(_英文字列),!. 英文字を読み込み(_英文字列) :- 英文字を読み込み(_英文字列). 英文字読み込み診断(_英文字列) :- atom_chars(_英文字列,Chars), 全て英文字(Chars),!. 英文字読み込み診断(_文字列) :- writef('読み込まれた文字列 %t に英文字以外の文字が含まれています。\n再入力をお願いします\n',[_文字列]),fail. 全て英文字([]). 全て英文字([A|R]) :- member(A,['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]), 全て英文字(R). その一つ一つの文字の個数を求める(_英文字列,_その一つ一つの文字の個数) :- atom_chars(_英文字列,Chars), setof(_文字,member(_文字,Chars),L1), findall(_文字の個数,( member(_文字,L1), count(member(_文字,Chars),Count), concat_atom([_文字,Count],_文字の個数)), L2), concat_atom(L2,_その一つ一つの文字の個数). 表示する(_その一つ一つの文字の個数) :- writef('%t\n',[_その一つ一つの文字の個数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/680 # # 1]授業単元:プログラミング # [2]問題文:自己参照型構造体を用いて、以下の処理をするプログラムを作成せよ。 # # 正の数入力→連結リストを辿り、初めて入力された数ならばカウンタを1増やす。同じ数が続けて入力されたらその数のカウンタをさらに1増やす。 # 負の数入力→負の数の絶対値と同じ回数入力された数のデータを削除(例えば、-3を入力し、それ以前に14が3回入力されていたら、それを削除) # 0を入力→データを出力して終了。 # # データ出力→終了の流れはどうにかなりましたが、それ以外で上手い発想が思いつきません。 # # http://ime.nu/codepad.org/yayuXIUa # # 期限は明日までです。 # # 正の数入力後連結リストを辿り、初めて入力された数ならばカウンタを1増やす。負の数入力後負の数の絶対値と同じ回数入力された数のデータを削除0を入力後データを出力して終了 :- 数入力(_数), 連結リストとカウンタを更新していく(_数,[],0,_連結リスト,_カウンタ), データを出力して終了(_連結リスト,_カウンタ),!. 連結リストとカウンタを更新していく(_数,L_1,_カウンタ_1,L,_カウンタ) :- 負の数が入力されたら負の数の絶対値と同じ回数入力された数のデータを削除して連結リストの最後に0を加える(_数,L_1,_カウンタ_1,L,_カウンタ),!. 連結リストとカウンタを更新していく(_数,L_1,_カウンタ_1,L,_カウンタ) :- 初めて入力された数ならばカウンタを1増やす(_数,L_1,_カウンタ_1,L_2,_カウンタ_2), 数入力(_数_2), 連結リストとカウンタを更新していく(_数_2,L_2,_カウンタ_3,L,_カウンタ). 連結リストとカウンタを更新していく(_数,L_1,_カウンタ_1,L,_カウンタ) :- \+(初めて入力された数ならばカウンタを1増やす(_数,L_1,_カウンタ_1,L,_カウンタ)), 数入力(_数_2), 連結リストの最後に数を追加(_数,L_1,L_2), 連結リストとカウンタを更新していく(_数_2,L_2,_カウンタ_1,L,_カウンタ). データを出力して終了(_連結リスト,_カウンタ) :- writef('実行後の連結リストは %t です\nその時点のカウンタは %t です\n',[_連結リスト,_カウンタ]),!. 負の数が入力されたら負の数の絶対値と同じ回数入力された数のデータを削除して連結リストの最後に0を加える(_負の数,L_1,_カウンタ_1,L_2,_カウンタ_2) :- _負の数 < 0, _負の数の絶対値 is abs(_負の数), 負の数の絶対値と同じ回数入力された数のデータを削除(_負の数の絶対値,L_1,L_3), 連結リストの最後に0を加える(L3,L2),!. 連結リストの最後に0を加える(L3,L2) :- append(L_3,[0],L_2),!. 負の数の絶対値と同じ回数入力された数のデータを削除(_負の数の絶対値,L_1,L_2) :- 既に入力された重複しない数ならびを得る(L_1,_数ならび), 削除する数を選択する(_負の数の絶対値,_数ならび,L_1,_削除する数候補), 連結リストからデータを削除(_削除する数候補,L_1,L_2). 既に入力された重複しない数ならびを得る(L_1,_数ならび) :- findsetof(_数,append(_,[_数|_],L_1),_数ならび),!. 削除する数を選択する(_負の数の絶対値,_数ならび,L_1,_削除する数候補) :- findall(_数,( append(_,[_数|_],_数ならび), 負の数の絶対値に要素数が一致する数(_負の数の絶対値,L_1,_数)), _削除する数候補),!. 負の数の絶対値に要素数が一致する数(_負の数の絶対値,L_1,_数) :- count(append(_,[_数|_],L_1),_負の数の絶対値)),!. 連結リストからデータを削除([],L,L) :- !. 連結リストからデータを削除([_数|R],L_1,L) :- ならびから削除(_数,L_1,L_2), 連結リストからデータを削除(R,L_2,L). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. 初めて入力された数ならばカウンタを1増やす(_数,L_1,_カウンタ_1,L_2,_カウンタ_3) :- \+(append(_,[_数|_],L_1)), _カウンタ_2 is _カウンタ_1 + 1, 同じ数が続けて入力されたらその数のカウンタをさらに1増やす(_数,L_1,_カウンタ_2,_カウンタ_3), 連結リストの最後に数を追加(_数,L_1,L_2),!. 同じ数が続けて入力されたらその数のカウンタをさらに1増やす(_数,L_1,_カウンタ_1,_カウンタ_2) :- last(L_1,_数), _カウンタ_2 is _カウンタ_1 + 1,!. 同じ数が続けて入力されたらその数のカウンタをさらに1増やす(_,_,_カウンタ_1,_カウンタ_1). 連結リストの最後に数を追加(_数,L_1,L_2) :- append(L_1,[_数],L_2). 数入力(_数) :- write('数を入力してください : '), get_line(Line), 数入力診断(Line,_数),!. 数入力(_数) :- 数入力(_数). 数入力診断(Line,_数) :- atom_to_term(Line,_数,_), number(_数),!. 数入力診断(Line,_数) :- writef('入力された %t からは数値が得られません。再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/483 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # ttp://www.dotup.org/uploda/www.dotup.org1575096.jpg # 'ヒット&ブロー' :- コンピュータが四桁の整数を決める(_数字ならびの一), 遊び手が数字を入力する(_数字ならびのニ), 'ヒット&ブロー診断'(_数字ならびの一,_数字ならびのニ). コンピュータが四桁の整数を決める(_数字ならび) :- M is random mod 10000, number_chars(M,L), 頭部に零を詰める(L,_数字ならび). 頭部に零を詰める(L,_数字ならび) :- length(_数字ならび,4), append(L0,L,_数字ならび), all(L0,'0'). 遊び手が数字を入力する(_数字ならび) :- get_line(Line), findall(A,( append(_,[A|_],Line)), _数字ならび). 'ヒット&ブロー診断'(_数字ならびの一,_数字ならびのニ) :- ヒット数(_数字ならびの一,_数字ならびのニ,_ヒット数), ブロー数(_数字ならびの一,_数字ならびのニ,_ブロー数), 'ヒット&ブロー表示'(_ヒット数,_ブロー数),!. ヒット数(L1,L2,_ヒット数) :- count(( append(L0_1,[A|_],L1), append(L0_2,[A|_],L2), length(L0_1,N), length(L0_2,N)), _ヒット数). ブロー数(L1,L2,_ブロー数) :- count(( append(L0_1,[A|R_1],L1), append(L0_2,[A|R_2],L2), length(L0_1,N_1), length(L0_2,N_2), \+(N_1 == N_2)), _ブロー数). 'ヒット&ブロー表示'(4,_) :- writef('ゲームオーバー\n',[]),!. 'ヒット&ブロー表示'(_ヒット数,_ブロー数) :- writef('%tH%tB\n',[_ヒット数,_ブロー数]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/458 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # # x>0,y>0という条件でxとyを入力 # xからy間の数字で2の倍数のみを出力 # 例 # x=4 # y=9 # # 2の倍数 # 4 8 # 'x>0,y>0という条件でxとyを入力 xからy間の数字で2の倍数のみを出力' :- 'xの入力'(_x), 'yの入力'(_y), writef('x=%t\ny=%t\n\n2の倍数\n',[_x,_y]), for(_x,N,_y), '4の倍数のみを出力'(N), N=_y, nl. 'xの入力'(_x) :- 催促付き入力('x=',_x), 'xの入力診断'(Line,_x),!. 'xの入力'(_x) :- 'xの入力'(_x). 'xの入力診断'(Line,_x) :- atom_to_term(Line,_x,_), integer(_x), _x > 0,!. 'xの入力診断'(Line,_y) :- writef('入力された%tからは正の整数が得られませんでした\n',[Line]), fail. 'yの入力'(_y) :- 催促付き入力('y=',Line), 'yの入力診断'(Line,_y),!. 'yの入力'(_y) :- 'yの入力診断'(_y),!. 'yの入力診断'(Line,_y) :- atom_to_term(Line,_y,_), integer(_y), _y > 0,!. 'yの入力診断'(Line,_) :- writef('入力された%tからは正の整数が得られませんでした\n',[Line]), fail. '4の倍数のみを出力'(N) :- 0 is N mod 4, writef('%t ',[N]),!. '4の倍数のみを出力'(_). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/305 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/deaimail.from.tv/up/src/up3988.jpg # # 12個の整数をxに読み込み、平均値、標準偏差を計算して、出力せよ。 '12個の整数をxに読み込み、平均値、標準偏差を計算して、出力する' :- '12個の整数をxに読み込み'(_x), 平均値を計算(_x,_平均値), 標準偏差を計算(_x,_平均値,_標準偏差), write_formatted('x=%t, 平均値=%t, 標準偏差=%t\n',[_x,_平均値,_標準偏差]). '12個の整数をxに読み込み'(_x) :- length(_x,12), 'xに読み込み'(_x). 'xに読み込み'([]) :- !. 'xに読み込み'([N|R]) :- 整数を読み込む(N), 'xに読み込み'(R). 整数を読み込む(N) :- write('整数を入力してください : '), get_line(Line), 整数入力診断(Line,N),!. 整数を読み込む(N) :- 整数を読み込む(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数入力診断(Line,N) :- write_formatted('入力された %t から整数が得られませんでした。再入力をお願いします\n',[Line]), fail. 平均値を計算(L,_平均値) :- length(L,_要素数), 合計(L,_合計値), _平均値 is _合計値 / _要素数. 合計([],0) :- !. 合計([N|R],X) :- 合計(R,Y), X is N + Y. 標準偏差を計算(L,_平均値,V) :- 標準偏差(L,N,_平均値,0.0,V). 標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!. 標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 標準偏差(R,N,M,S2,V). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/83 # # [1] 授業単元:整数演算 # [2] 問題文(含コード&リンク):1個以上32個以下の正整数の最大・最小・最小公倍数・最大公約数を求めよ # 1個以上32個以下の正整数の最大・最小・最小公倍数・最大公約数を求めよ(_N個,_整数ならび,_最大,_最小,_最小公倍数,_最大公約数) :- _N個 >= 1,_N個 =< 32, 'N個の正の整数を得る'(_N個,_整数ならび), _整数ならび = [_最初の整数|_残りならび], 最大値と最小値を同時に取得する(_残りならび,_最初の整数,_最初の整数,_最大値,_最小値), 最大公約数(_整数ならび,_最大公約数), 最小公倍数(_整数ならび,_最小公倍数). 'N個の正の整数を得る'(_N個,_整数ならび) :- length(L,_N個), _整数ならび = L, findall(_正の整数,( append(_,[_正の整数|R],L), length([_正の整数|R],_残り個数), 正の整数を得る(_残り個数,_正の整数)), L). 正の整数を得る(_残り個数,_正の整数) :- write_formatted('正の整数を入力してください(残り%t個) : ',[_残り個数]), get_line(Line), 正の整数診断(Line,_正の整数),!. 正の整数を得る(_残り個数,_正の整数) :- 正の整数を得る(_残り個数,_正の整数). 正の整数診断(Line,_正の整数) :- atom_to_term(Line,_正の整数,_), integer(_正の整数), _正の整数 > 0,!. 正の整数診断(Line,_正の整数) :- write_formatted('入力された %t から正の整数は得られません。再入力をお願いします。',[Line]), fail. 最大公約数([N1|R],_最大公約数) :- 最大公約数の三(R,N1,_最大公約数). 最大公約数の三([],_最大公約数,_最大公約数). 最大公約数の三([N|R],_最大公約数_1,_最大公約数) :- 最大公約数(N,_最大公約数_1,_最大公約数_2), 最大公約数の三(R,_最大公約数_2,_最大公約数). 最小公倍数([N1|R],_最小公倍数) :- 最小公倍数の三(R,N1,_最小公倍数). 最小公倍数の三([],_最小公倍数,_最小公倍数). 最小公倍数の三([N|R],_最小公倍数_1,_最小公倍数) :- 最小公倍数(N,_最小公倍数_1,_最小公倍数_2), 最小公倍数の三(R,_最小公倍数_2,_最小公倍数). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最小公倍数(A,B,X) :- integer(A), integer(B), 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最大値と最小値を同時に取得する([],_最大値,_最小値,_最大値,_最小値) :- 最大値と最小値を同時に取得する([N|R],_最大値_1,_最小値_1,_最大値,_最小値) :- N > _最大値, 最大値と最小値を同時に取得する(R,N,_最小値_1,_最大値,_最小値),!. 最大値と最小値を同時に取得する([N|R],_最大値_1,_最小値_1,_最大値,_最小値) :- N < _最小値, 最大値と最小値を同時に取得する(R,_最大値_1,N,_最大値,_最小値),!. 最大値と最小値を同時に取得する([N|R],_最大値_1,_最小値_1,_最大値,_最小値) :- 最大値と最小値を同時に取得する(R,_最大値_1,_最小値_1,_最大値,_最小値),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/7 # # [1] 授業単元:暇つぶし # [2] 問題文(含コード&リンク): # 下記のような2chへの書き込み時刻のログを標準入力より受け取り、 # EOF がきたら現在の !ninja レベルがいくつであるか出力せよ # # !ninja レベルについて # 最初の書き込み時にはレベル1である # 最後にレベルアップした書き込み時刻から24時間以上経過して書き込むと1レベルアップする # # 条件1 一番最初の書き込み時刻以前にはクッキーは存在しないものとする # 条件2 ●無しとする # 条件3 書き込み時刻のログは古いものから順に並んでいるものとする # # 2011/02/11 22:33:44 # 2011/02/12 01:23:45 # 2011/02/14 18:19:20 # '下記のような2chへの書き込み時刻のログを標準入力より受け取り、 EOF がきたら現在の !ninja レベルがいくつであるか出力せよ' :- 一番最初の書き込み時刻以前にはクッキーは存在しないものとする(_ninja_1), get_lines(Lines), ninjaレベルの計測(Lines,_ninja_1,_ninja), writef('現在の !ninja レベルは %t です\n',[_ninja]),!. ninjaレベルの計測([],_ninja,_ninja) :- !. ninjaレベルの計測([_],_ninja,_ninja) :- !. ninjaレベルの計測([_時刻_1,_時刻_2|R],_ninja_1,_ninja) :- '24時間以上経過'(_時刻_1,_時刻_2), _ninji_2 is _ninja_1 + 1, ninjaレベルの計測([_時刻_2|R],_ninja_2,_ninja),!. ninjaレベルの計測([_時刻_1,_時刻_2|R],_ninja_1,_ninja) :- \+('24時間以上経過'(_時刻_1,_時刻_2)), ninjaレベルの計測([_時刻_2|R],_ninja_1,_ninja),!. 一番最初の書き込み時刻以前にはクッキーは存在しないものとする(1). '24時間以上経過'(_時刻_1,_時刻_2) :- sub_atom(_時刻_1,0,10,_,_年月日_1), sub_atom(_時刻_2,0,10,_,_年月日_2), sub_atom(_時刻_1,11,8,_,_時分秒_1), sub_atom(_時刻_1,11,8,_,_時分秒_2), '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2), '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2) :- _年月日_1 @< _年月日_2, _時分秒_1 @=< _時分秒_2,!. '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2) :- \+(_月末日(_年月日_1)), _時分秒_1 @> _時分秒_2, 翌日(_年月日_1,_翌日_1), _翌日_1 @< _年月日_2,!. 翌日(_年月日,_翌日の表示表現) :- sub_atom(_年月日,0,4,_年), sub_atom(_年月日,5,2,_月), sub_atom(_年月日,8,2,_日), 翌日(_年,_月,_日,_翌日の表示表現). 翌日(_年,'12','31',_翌日の表示表現) :- atom_to_term(_年,_年整数,_), _年整数_2 is _年整数 + 1, concat_atom([_年整数_2,/,'01',/,'01'],_翌日の表示表現),!. 翌日(_年,_月,_日,_翌日の表示表現) :- 月末日(_月,_日), 次の数字に対応する二文字の頭部零文字列(_月,_翌月), concat_atom([_年,/,_翌月,/,'01'],_翌日の表示表現),!. 翌日(_年,_月,_日,_翌日の表示表現) :- \+(月末日(_月,_日)), 次の数字に対応する二文字の頭部零文字列(_日,_翌日), concat_atom([_年,/,_翌月,/,_翌日],_翌日の表示表現),!. 次の数字に対応する二文字の頭部零文字列(_数値文字列,_次の数値文字列) :- length(L,2), atom_to_term(_数値文字列,_整数,_), _整数_2 is _整数 + 1, number_chars(_整数_2,Chars), append(L0,Chars,L), all(L0,'0'). 月末日(_年,'02','29') :- atom_to_term(_年,_年整数,_), うるう年(_年整数),!. 月末日(_年,'02','28') :- atom_to_term(_年,_年整数,_), \+(うるう年(_年整数)),!. 月末日(_年,_月,30) :- append(_,[_月|_],['04','06','09','11']),!. 月末日(_年,_月,31) :- append(_,[_月|_],['01','03','05','07','08','10','12']),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail . うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1258320456/189 # # 解答お願いします。 # # 1. 下記のような九九の計算表を出力するプログラムを作成し、実行してください。このときforループを使用するもの(q11.py)と、whileループを使用するもの(q12.py)の2種類を作成してください。 # 1の段 1 2 3 4 5 6 7 8 9 # 2の段 2 4 6 8 10 12 14 16 18 # ..........中略.... # 9の段 9 18 27 36 45 54 63 72 81 # # 2. 次のような手順で、キーボードから入力した数値の合計を求めるものとします。実際に Python プログラム (q2.py) の形にして、実行してください。 # 合計に使う変数を 0 にする。 # キーボードから数値を入れる。 # 入力した数値が 0 より大きい間次のブロックを繰り返す: # 合計に数値を加える。 # キーボードから数値を入れる。 # 合計を印刷する # 3. turtleを使用して、図形を表示するスクリプトg.pyを作成してください。どのような図形を作成するか記述(少なくとも6角形よりは複雑である事)して、スクリプトの内容をメールに含めてください。なお、スクリプトには、必ず for ループを含むようにしてください # # # キーボードから入力した数値の合計 :- キーボードから入力した数値の合計(0). キーボードから入力した数値の合計(S1) :- 数値を入力する(N), N > 0, S2 is S1 + N, キーボードから入力した数値の合計(S2). キーボードから入力した数値の合計(S) :- write_formatted('合計は %t\n',[S]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% キーボードから入力した数値の合計 :- 数値を入力する(N), キーボードから入力した数値の合計(N,0). キーボードから入力した数値の合計(N,S) :- N =< 0, write_formatted('合計は %t\n',[S]),!. キーボードから入力した数値の合計(N,S1) :- S2 is S1 + N, 数値を入力する(N2), キーボードから入力した数値の合計(N2,S2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% キーボードから入力した数値の合計 :- キーボードから入力した数値の合計(0,S), write_formatted('合計は %t\n',[S]). キーボードから入力した数値の合計(S1,S) :- 数値を入力する(N), N > 0, S2 is S1 + N, キーボードから入力した数値の合計(S2,S). キーボードから入力した数値の合計(S,S). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% キーボードから入力した数値の合計 :- 数値を入力する(N), キーボードから入力した数値の合計(N,0,S), write_formatted('合計は %t\n',[S]). キーボードから入力した数値の合計(N,S,S) :- N =< 0,!. キーボードから入力した数値の合計(N,S1,S) :- S2 is S1 + N, 数値を入力する(N2), キーボードから入力した数値の合計(N2,S2,S). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数値を入力する(_数値) :- get_line(Line), 数値入力診断(Line,_数値),!. 数値を入力する(_数値) :- 数値を入力する(_数値). 数値入力診断(Line,_数値) :- atom_to_term(Line,_数値,_), number(_数値),!. 数値入力診断(Line,_) :- write_formatted('入力された %t からは数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/181 # # [1] 授業単元:プログラミング C言語 # [2] 問題文(含コード&リンク):明治以降の和暦を指定して、西暦に変換するプログラム #               まず元号(M,T,S,H)を数字(1〜4)で選んで年を入力し、 #               西暦を表示させる。元号選択時に1〜4以外を選んだら #               エラーメッセージをだして終了させます。 # # 明治以降の和暦を指定して、西暦に変換するプログラム :- '元号をM,T,S,Hで得る'(_元号略記), 年を得る(_年), 明治以降の和暦を西暦に変換する(_元号略記,_年,_西暦年), write_formatted('%t%t年は西暦%t年となります。\n',[_元号略記,_年,_西暦年). '元号をM,T,S,Hで得る'(_元号略記) :- write('元号を数値で 1..明治 2..大正 3..昭和 4..平成 の左側の数字で入力してください : '), get_line(Line), 元号略記(Line,_元号略記),!. 元号略記(Line,_元号略記) :- atom_to_term(Line,_入力番号,_), integer(A), 入力番号から元号略記へ(_入力番号,_元号略記). 入力番号から元号略記へ(1,'M'). 入力番号から元号略記へ(2,'T'). 入力番号から元号略記へ(3,'S'). 入力番号から元号略記へ(4,'H'). 入力番号から元号略記へ(X,_) :- \+((X>=1,X=<4)), write_formatted('入力された%tからは元号が得られませんでした\n',[X]),!, fail. 年を得る(_年) :- write('年を入力してください : '), get_line(Line), 年を得るの診断(Line,_年),!. 年を得るの診断(Line,_年) :- atom_to_term(Line,_年,_), integer(_年),!. 年を得るの診断(Line,_年) :- write_formatted('入力された %t からは年を得られませんでした\n',[Line]), fail. 明治以降の和暦を西暦に変換する('M',_年,_西暦年) :- _西暦年 is 1867 + _年,!. 明治以降の和暦を西暦に変換する('T',_年,_西暦年) :- _西暦年 is 1911 + _年,!. 明治以降の和暦を西暦に変換する('S',_年,_西暦年) :- _西暦年 is 1925 + _年,!. 明治以降の和暦を西暦に変換する('H',_年,_西暦年) :- _西暦年 is 1988 + _年,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/147 # # [1] 授業単元:ポインタ # [2] 問題文(含コード&リンク): # ランダムな数値が格納された配列を昇順にソートし、結果を画面に出力する。(コマンドプロンプト) # 課題ファイルのmain関数・昇順ソート関数・ソート結果表示関数に、仮引数と関数の中身を追加する。基本的に、main関数内は、関数呼び出しのみとする。 # 課題ファイル http://ime.nu/uproda.2ch-library.com/lib339300.txt.shtml # # #include # # void Sort_func( int * ); /* ソート処理関数の定義 */ # void Disp_func( int * ); /* ソート結果表示関数の定義 */ # # # /* # ※ 2つの関数を呼出しソート結果を画面に出力する。 # 関数を完成させよ。 # 定義済の関数宣言・変数の変更(移動)を禁止する。 # */ # # void main() # { # /* # 配列変数 intNumFrom に格納された数値を、 # 昇順となるようにintNumFrom を変更せよ。 # */ # # int intNumFrom[8] = {88,52,6,43,65,38,46,16}; # # # Sort_func( intNumFrom ); /* ソート処理関数呼出し*/ # # Disp_func( &intNumFrom[1] ); /* ソート結果表示関数呼出し */ # # return; # } # # void Sort_func( ###### ) # { # # } # # # void Disp_func( ###### ) # { # # } 'ランダムな数値が格納されたならびを昇順にソートし、結果を画面に出力する。' :- ランダムな数値が格納されたならびを(_ランダムな数値が格納されたならび), 昇順にソートし(_ランダムな数値が格納されたならび,[],_昇順に整列したならび), 画面に出力する(_昇順に整列したならび). ランダムな数値が格納されたならびを(_ランダムな数値が格納されたならび) :- ならびの要素数を入力する(_要素数), length(L,_要素数), findall(_ランダムな数値,( append(_,[_ランダムな数値|_],L), ランダムな数値(_ランダムな数値)), _ランダムな数値が格納されたならび). ランダムな数値(_ランダム数値) :- 1 is random mod 2, _ランダムな数値 is ( random mod 10000 ) / 100),!. ランダムな数値(_ランダム数値) :- _ランダムな数値 is random mod 100,!. ならびの要素数を入力する(_要素数) :- 範囲指定付き整数入力(要素数,'要素数を入力してください : ',1,100,_要素数). 昇順にソートし([],_昇順に整列したならび,_昇順に整列したならび) :- !. 昇順にソートし([_値1|R1],L1,_昇順に整列したならび) :- 昇順に挿入(_値1,L1,L2), 昇順にソートし(R1,L2,_昇順に整列したならび). 昇順に挿入(V,[],[V]) :- !. 昇順に挿入(V,[V1|R1],[V,V1|R1]) :- V =< V1,!. 昇順に挿入(V,[V1|R1],[V1|R2]) :- V > V1, 昇順に挿入(V,R1,R2). 画面に出力する(L) :- append(_,[_数値|R],L), write_formatted('%t ',[_数値]), R = [], nl. 範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値) :- write(_催促), get_line(Line), 範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値),!. 範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値) :- 範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値). 範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値) :- atom_to_term(Line,_値,_), integer(_値), _値 >= _範囲下限, _値 =< _範囲上限,!. 範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値) :- write_formatted('入力された %t からは、%tから%tの範囲の適切な%tを得られませんでした。再入力をお願いします。\n',[Line,_範囲下限,_範囲上限,_入力項目名]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/122 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1311028.txt.html # # Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 # 県と県の間を半角開ける # # 1.北海道 2.青森県・・・47.沖縄県を表示 # 一行につき6県 # # (例) # _1.北海道____2.鹿児島県__3. # # ↑ # 桁が上がったとき用 # # # 43.□□□___44.□□ # # # 次に47都道府県のうち出発地と目的地の入力を要求する. # # 「出発の県を入力してください」 # 「目的の県を入力してください」 # # # # # 次に結果を表示. # # ・距離と経路を出力 # # 経路 # □□□□→□□□□→・・・→□□□□ # # -10byte-- # # 経路は7県まで # # # # とする # # # # map.datの中身は↓です # # 北海道,青森県,岩手県,宮城県,秋田県,山形県,福島県,茨城県,栃木県,群馬県,埼玉県,千葉県,東京都,神奈川県,新潟県,富山県,石川県,福井県,山梨県,長野県,岐阜県,静岡県,愛知県,三重県,滋賀県,京都府,大阪府,兵庫県,奈良県,和歌山県,鳥取県,島根県,岡山県,広島県,山口県,徳島県,香川県,愛媛県,高知県,福岡県,佐賀県,長崎県,熊本県,大分県,宮崎県,鹿児島県,沖縄県 # # 北海道,0,426,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 青森県,426,0,187,-1,190,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岩手県,-1,187,0,193,108,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 宮城県,-1,-1,193,0,258,72,84,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 秋田県,-1,190,108,258,0,212,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山形県,-1,-1,-1,72,212,0,102,-1,-1,-1,-1,-1,-1,-1,169,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 福島県,-1,-1,-1,84,-1,102,0,203,172,275,-1,-1,-1,-1,189,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 茨城県,-1,-1,-1,-1,-1,-1,203,0,76,-1,-1,116,128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 栃木県,-1,-1,-1,-1,-1,-1,172,76,0,109,100,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 群馬県,-1,-1,-1,-1,-1,275,-1,109,0,103,-1,-1,-1,220,-1,-1,-1,-1,151,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 埼玉県,-1,-1,-1,-1,-1,-1,116,100,103,0,69,24,-1,-1,-1,-1,-1,157,215,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 千葉県,-1,-1,-1,-1,-1,-1,128,-1,-1,69,0,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 東京都,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,50,0,37,-1,-1,-1,-1,133,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 神奈川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,37,0,-1,-1,-1,-1,134,-1,-1,240,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 新潟県,-1,-1,-1,-1,169,189,-1,-1,220,-1,-1,-1,-1,0,250,-1,-1,-1,208,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 富山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,250,0,61,-1,-1,196,294,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 石川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,61,0,83,-1,-1,235,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 福井県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,83,0,-1,-1,160,-1,-1,-1,176,188,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山梨県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,164,-1,126,134,-1,-1,-1,-1,0,162,-1,109,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 長野県,-1,-1,-1,-1,-1,-1,-1,-1,-1,151,220,-1,-1,-1,208,196,-1,-1,162,0,295,271,272,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岐阜県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,294,235,160,-1,295,0,-1,43,113,128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 静岡県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,167,-1,-1,-1,-1,109,271,-1,0,181,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 愛知県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,272,43,181,0,82,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 三重県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,-1,82,0,95,107,-1,-1,91,91,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 滋賀県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,176,-1,-1,128,-1,-1,95,0,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 京都府,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,188,-1,-1,-1,-1,-1,107,14,0,49,75,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 大阪府,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,49,0,45,33,80,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 兵庫県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,75,45,0,-1,-1,180,-1,139,-1,-1,115,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 奈良県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,-1,48,33,-1,0,98,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 和歌山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,-1,-1,-1,-1,98,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 鳥取県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,180,-1,-1,0,128,167,296,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # 島根県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,80,-1,128,0,-1,212,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岡山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,139,-1,-1,167,-1,0,165,-1,-1,70,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 広島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,296,212,165,0,131,-1,-1,190,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山口県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,131,0,250,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 徳島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,-1,-1,-1,-1,-1,-1,250,0,73,191,161,-1,-1,-1,-1,-1,-1,-1,-1 # # 香川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,-1,-1,73,0,156,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 愛媛県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,190,-1,191,156,0,156,-1,-1,-1,-1,-1,-1,-1,-1 # # 高知県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,161,-1,156,0,-1,-1,-1,-1,-1,-1,-1,-1 # # 福岡県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,165,-1,-1,-1,-1,0,61,-1,117,159,-1,-1,-1 # # 佐賀県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,61,0,109,-1,-1,-1,-1,-1 # # 長崎県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,109,0,-1,-1,-1,-1,-1 # # 熊本県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,117,-1,-1,0,218,192,187,-1 # # 大分県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,159,-1,-1,218,0,181,-1,-1 # # 宮崎県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,192,181,0,158,-1 # # 鹿児島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,187,-1,158,0,733 # # 沖縄県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,733,0 # '47都道府県のうち出発地と目的地の入力して最短経路を求めて距離と順路を表示する(ただし経路は7以下とする)' :- 'Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 県と県の間を半角 開ける'(_都道府県名ならび), '47都道府県のうち出発地と目的地の入力する'(_都道府県名ならび,_出発地,_目的地), 最短経路(_出発地,_目的地,_距離,_順路), 距離と経路の表示(_出発地,_目的地,_距離,_順路). '47都道府県のうち出発地と目的地の入力する'(_都道府県名ならび,_出発地,_目的地) :- 出発地を入力する(_都道府県名ならび,_出発地), 目的地を入力する(_都道府県名ならび,_目的地). 出発地を入力する(_都道府県名ならび,_出発地) :- write('出発地の都道府県名番号を入力してください : '), get_line(Line), 出発地を入力診断(Line,_都道府県名ならび,_出発地),!. 出発地を入力する(_都道府県名ならび,_出発地) :- 出発地を入力する(_都道府県名ならび,_出発地). 出発地を入力診断(Line,_都道府県名ならび,_出発地) :- atom_to_term(Line,_出発地番号,_), integer(_出発地番号), _出発地番号 > 1, _出発地番号 =< 47, list_nth(_出発地番号,_都道府県名ならび,_出発地),!. 出発地を入力診断(Line,_都道府県名ならび,_出発地) :- write_formatted('入力された %t から適切な出発地を得ることができません。再入力をお願いします。\n',[Line]), fail. 目的地を入力する(_都道府県名ならび,_目的地) :- write('目的地の都道府県名番号を入力してください : '), get_line(Line), 目的地を入力診断(Line,_都道府県名ならび,_目的地), 目的地を入力する(_都道府県名ならび,_目的地) :- 目的地を入力する(_都道府県名ならび,_目的地). 目的地を入力診断(Line,_都道府県名ならび,_目的地) :- atom_to_term(Line,_目的地番号,_), integer(_目的地番号), _目的地番号 > 1, _目的地番号 =< 47,!. 目的地を入力診断(Line,_,_目的地) :- write_formatted('入力された %t から適切な目的地を得ることができません。再入力をお願いします。\n',[Line]), fail. 距離と経路の表示(_出発地,_目的地,_距離,_順路) :- write_formatted('距離は %t,経路は %t',[_距離,_出発地]), append(_,[[A,B]|R],_順路), write_formatted(' -> %t ',[B]), R = [], write('\n'),!. 'Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 県と県の間を半角 開ける'(_都道府県名ならび) :- get_split_lines('Map.dat',[','],LL), 第要素は都道府県名、残りは経路情報(LL,_都道府県名ならび,_経路情報ならび), append(L0,[[_県名|_隣接情報ならび]|R2],_経路情報ならび), 隣接情報の登録(_県名,_都道府県名ならび,_隣接情報ならび), length([_|L0],_都道府県番号), write('%2d.%t ',[_都道府県番号,_県名]), R2 = [], write('\n'). 第一要素は都道府県名、残りは経路情報(LL,_都道府県名ならび,_経路情報ならび) :- LL = [_都道府県名ならび|_経路情報ならび],!. 隣接情報の登録(_都道府県名,_都道府県名ならび,L1) :- abolish(隣接県距離/3), append(L0,[_距離|R],L1), \+(_距離 = (-1)), \+(_距離 = 0), length([_|L0],Nth), list_nth(Nth,_都道府県名ならび,_都道府県名2), assertz(隣接県距離(_都道府県名,_件名2,_距離)), fail. 隣接情報の登録(_,_,_). 最短経路(_出発地,_目的地,_距離,_順路) :- findall([_順路,_距離],( 到達(_出発地,_目的地,_距離,[],_順路)), _順路・距離ならび), findmin(_距離,append(_,[[_,_距離]|_],_順路・距離ならび),_最短距離), append(_,[[_順路,_最短距離]|_],_順路距離ならび). 到達(_都道府県名1,_都道府県名2,_距離,_順路1,_順路) :- 隣接県距離(_都道府県名1,_都道府県名2,_距離), append(_順路1,[[_都道府県名1,_都道府県名2]],_順路),!. 到達(_都道府県名1,_都道府県名2,_距離,_順路1,_順路) :- length(_順路1,_経路数), _経路数 < 7, 隣接県距離(_都道府県名1,_都道府県名3,_距離1), この経路は選択されたことがない(_都道府県名1,_都道府県名2), append(_順路1,[[_都道府県名1,_都道府県名3]],_順路2), 到達(_都道府県名1,_都道府県名2,_距離2,_順路2,_順路), _距離 is _距離1 + _距離2. この経路は選択されたことがない(_都道府県名1,_都道府県名2) :- \+(append(_,[[_都道府県名1,_都道府県名3]|_],_順路1)), \+(append(_,[[_都道府県名3,_都道府県名1]|_],_順路1)),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/899 # # 【 課題 】要素型がint型である配列を作り、全要素を1〜10の乱数で埋め尽くす(1以上10以下の値を # 代入する) # 【 形態 】1. Javaアプリケーション(main()で開始)/2. Applet/3. Servlet/ #        4. 携帯(開発環境のver.必須)/5. その他(明記のこと) 《必ず選択》 # 【 GUI  】1. AWTのみ/2. Swing/3. SWT/4. 制限なし/ 5. その他(明記すること) #        《GUIの課題の場合必ず選択》 # 【 期限 】提出期限、解答希望日を書きます。「できるだけ早く」はNG。 《必須》 # 【 Ver  】コンソールでjava -versionを実行し、その結果を貼ります。 《必須》 # 【 用語 】数学用語、専門用語の意味、説明を書きます。 《あれば必須》 # 【 補足 】課題について自分なりに補足する事、何か思う事があれば書きます。 #        丸投げでない場合は、途中までのソースとその経過報告、 #        質問点、疑問点を書きます(なるべく丸投げにしてください)。 # # # 要素型がint型であるならびを作り、全要素を1〜10の乱数で埋め尽くす(L) :- ならびの長さを得る(_長さ), length(L,_長さ), findall(N,( append(_,[N|_],L), N is (random mod 10) + 1), L). ならびの長さを得る(_長さ) :- write('ならびの長さを入力してください : '), get_line(Line), ならびの長さ診断(Line,_長さ),!. ならびの長さを得る(_長さ) :- ならびの長さを得る(_長さ). ならびの長さ診断(Line,_長さ) :- atom_to_term(Line,_長さ,_), integer(_長さ), _長さ > 0,!. ならびの長さ診断(Line,_長さ) :- write_formatted('入力された %t からならびの長さとして適切な整数を得られませんでした。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/11 # # [1] 授業単元:C言語の基礎 # [2] 問題文 #  「複数の異なるデータ型を持つ情報に対して、情報の回覧と追加ができ、 #  ファイルの読込とができるプログラムを作成しなさい。 #  たとえば名簿のような物で、氏名、電話番号、住所、整理番号などを #  読込、書込、保存をする。可能なら、検索もできるようにすると良い。 #  複数のデータを扱うために、構造体を持つ配列を使うこと。 #  また、メンバ数は6個以上の情報を扱うこと。 #  ファイル形式は、CSV形式で、1つの情報の関連データ(メンバ)はカンマで区切り、 #  別の情報データ(行)は改行で区別しなさい。ファイル名の拡張子はcsv。 #  データファイルはプログラム起動時にコマンドラインから入力できること。 #  また、そうではないことにも対応すること。」 # リーディング情報の読み込み(_データファイル,LL) :- get_split_lines(_データファイル,[','],LL), append(_,[L|R],LL), P =.. [リーディング情報|L], assertz(P), R = [],!. リーデング情報の保存(_データファイル) :- open(_データファイル,write,Outstream), リーデング情報の書き込み(Outstream), close(Outstream). リーデング情報の書き込み(Outstream) :- リーデング情報(_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数), concat_atom([_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数],',',S), write_formatted(Output,'%t\n',[S]), fail. リーデング情報の書き込み(Outstream). 情報の回覧(LL) :- write('順位,種牡馬名,毛色,産地,出走頭数,勝馬頭数,出走回数,勝利回数,賞金,1出走賞金,1頭平均賞金,勝馬率,アーニング・インデックス\n'), リーデング情報(_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数), _1出走賞金 is truncate(_賞金 / _出走回数), _1頭平均賞金 is truncate(_賞金 / _出走頭数) _勝馬率 is _勝馬頭数 / _出走頭数, アーニング・インデックスの算出(_種牡馬名,_アーニング・インデックス), write_formatted('%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t\n',[_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_1出走賞金,1頭,_平均賞金,_勝馬率,_アーニング・インデックス]), fail. 情報の回覧(LL). リーディング情報の追加 :- write('指示に従い各項目を入力してください\n'), リーディング情報項目(_項目,_項目のタイプ), リーディング情報項目の入力(_項目,_項目のタイプ,_項目値ならび), P =.. [リーデング情報|_項目値ならび], assertz(P),!. リーディング情報項目の入力(_項目,_項目のタイプ,_項目値ならび) :- findall(_項目値,( リーディング情報項目(_項目,_項目のタイプ), 項目の入力(_項目,_項目のタイプ,_項目値)), _項目値ならび). 項目の入力(_項目,文字列,_項目値) :- write_formatted('%t (文字列) を入力してください : ',[_項目]), get_line(_項目値),!. 項目の入力(_項目,整数,_項目値) :- write_formatted('%t (整数)を入力してください : ',[_項目]), get_line(Line), 項目の入力診断(_項目,整数,Line,_項目値),!. 項目の入力(_項目,整数,_項目値) :- 項目の入力(_項目,整数,_項目値). 項目の入力診断(_項目,整数,Line,_項目値) :- atom_to_term(Line,_項目値,_), integer(_項目値),!. 項目の入力診断(_項目,整数,Line,_項目値) :- write_formatted('入力された%tからは%tにふさわしい整数を得られませんでした。再入力をお願いします。\n',[Line,_項目]), fail. % 産駒の総収得賞金/2,産駒の出走頭数/2,全出走馬収得賞金/1,総出走頭数/1 は未定義である。 % これらの述語をデータベースと定義した上で、アーニング・インデックスを算出する。 アーニング・インデックスの算出(_種牡馬名,_アーニングインデックス) :- 産駒の総収得賞金(_種牡馬名,_産駒の総収得賞金), 産駒の出走頭数(_種牡馬名,産駒の出走頭数), 全出走馬収得賞金(_全出走馬収得賞金), 総出走頭数(_総出走頭数), _アーニング・インデックス is ( _産駒の総収得賞金 / _産駒の出走頭数 ) / ( _全出走馬収得賞金 / _総出走頭数),!. リーディング情報項目(順位,整数). リーディング情報項目(種牡馬名,文字列). リーディング情報項目(毛色,文字列). リーディング情報項目(産地,文字列). リーディング情報項目(出走頭数,整数). リーディング情報項目(勝馬頭数,整数). リーディング情報項目(出走回数,整数). リーディング情報項目(勝利回数,整数). リーディング情報項目(賞金,整数). /* リーディング情報項目(1出走賞金,整数). リーディング情報項目(1頭平均賞金,整数). リーディング情報項目(勝馬率,浮動小数点数).). リーディング情報項目(アーニング・インデックス,浮動小数点数). */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/965 # # [1] 授業単元: cプログラム # [2] 問題文(含コード&リンク):100点満点の試験の得点データが学生の人数分ある。これを「不定個数のデータの読み込み」の #  どちらかの方法(最初にデータの個数を読み込むか、データの終わりを特別な値で知らせるか) #  で読み込み、10点刻みでの度数分布表を作成しなさい。 # '100点満点の試験の得点データが学生の人数分ある。これを「不定個数のデータの読み込み」のどちらかの方法(最初にデータの個数を読み込むか、データの終わりを特別な値で知らせるか)で読み込み、10点刻みでの度数分布表を作成する' :- 最初にデータの個数を読み込む(_データの個数), length(_得点ならび,_データの個数), 得点データを読み込む(_得点ならび), '10点刻みでの度数分布表を作成する'(_得点ならび,_度数分布ならび), 度数分布表の表示(_度数分布ならび). 最初にデータの個数を読み込む(_データの個数) :- write('データの個数を入力してください : '), get_line(Line), データの個数読み込み診断(Line,_データの個数),!. 最初にデータの個数を読み込む(_データの個数) :- 最初にデータの個数を読み込む(_データの個数). データの個数読み込み診断(Line,_データの個数) :- atom_to_term(Line,_データの個数,_), integer(_データの個数), _データの個数 > 0,!. データの個数読み込み診断(Line,_データの個数) :- write_formatted('入力された %t から正の整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 得点データを読み込む(L) :- findall(_得点,( append(L0,[_得点|_]),L), 得点データを読み込む([_|L0],_得点)), L). 得点データを読み込む(Ln,_得点) :- length(Ln,Len), write_formatted('%t人目の得点を入力してください : ',[Len]), get_line(Line), 得点データ診断(Line,_得点),!. 得点データを読み込む(Ln,_得点) :- 得点データを読み込む(Ln,_得点). 得点データ診断(Line,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 >= 0, _得点 =< 100,!. 得点データ診断(Line,_) :- write_formatted('入力された %t から0以上100以下の整数の得点は得られませんでした。\n再入力をお願いします\n',[Line]), fail. '10点刻みでの度数分布表を作成する'(L,_データの個数,_度数分布表) :- '10点刻みでの度数ならびを作成する'(L,[0,0,0,0,0,0,0,0,0,0,0],_度数ならび), findall(U,( append(_,[A|_],_度数ならび), U is truncate(floor((A * 100 / _データの個数) + 0.5))), _度数分布表). '10点刻みでの度数ならびを作成する'([],L,L) :- !. '10点刻みでの度数ならびを作成する'([A|R],L1,L) :- 度数ならびの更新(A,L1,L2), '10点刻みでの度数ならびを作成する'(R,L2,L). 度数ならびの更新(_得点,L1,L2) :- _位置 is _点数 // 10, append(L0,[_度数|R],L1), length(L0,_位置), _度数2 is _度数 + 1, append(L0,[_度数2|R],L2),!. 度数分布表の表示(_度数分布表) :- write('階級 , 度数\n'), 度数分布表の表示(0,_度数分布表). 度数分布表の表示(_,[]) :- !. 度数分布表の表示(100,[_度数|R]) :- write_formatted('%2d ,%3d\n',[N,N1,_度数]),!. 度数分布表の表示(N,[_度数|R]) :- N1 is N + 9, write_formatted('%2d-%2d,%3d\n',[N,N1,_度数]), N2 is N + 10, 度数分布表の表示(N2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/890 # # [1] 授業単元:プログラミングB # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1384922.txt.html # # 問.構造体を使ったアドレス帳プログラムを以下の条件で作成せよ。 # ・名前(全角10文字以内)読み(半角アルファベット・ローマ字・半角30文字以内) # メールアドレス(半角30文字以内)電話番号(半角13文字以内) # ・10人以上の登録が可能 # ・データの一覧表示が可能 # # (本当に初心者で申し訳ありませんがどうぞよろしくお願いいたしますorz) アドレス帳(登録) :- 名前を得る(_名前), 読みを得る(_名前,_読み), メールアドレスを得る(_メールアドレス), 電話番号を得る(_電話番号), assertz(アドレス帳(_名前,_読み,_アドレス,_電話番号)). アドレス帳(一覧表示) :- write('%30sアドレス一覧表\n'), write_formatted('%20s %30s %30s %13s\n',[名前,読み,メールアドレス,電話番号]), アドレス帳(_名前,_読み,_アドレス), write_formatted('%20s %30s %30s %13s\n',[_名前,_読み,_メールアドレス,_電話番号]), fail. アドレス帳(一覧表示). 名前を得る(_名前) :- write('名前を 全角10文字以内 で入力してください : '), get_line(Line), 名前を得る診断(Line,_名前),!. 名前を得る(_名前) :- 名前を得る(_名前). 名前を得る診断(_名前,_名前) :- atom_length(_名前,_文字列の長さ), _文字列の長さ =< 10,!. 名前を得る診断(Line,_) :- write_formatted('%t は文字数が大きすぎます。再入力をお願いします。\n',[Line]), fail. 読みを得る(_読み) :- write('読みを 半角アルファベット・ローマ字・半角30文字以内 で入力してください : '), get_line(Line), 読みを得る診断(Line,_読み),!. 読みを得る(_読み) :- 読みを得る(_読み). 読みを得る診断(Line,_読み) :- すべてが半角アルファベット・ローマ字・半角文字(Line), 文字列の長さがn文字以内(Line,30),!. すべてが半角アルファベット・ローマ字・半角文字(Line) :- atom_chars(Line,Codes), すべてのコードが127以下(Codes). すべてが半角アルファベット・ローマ字・半角文字(Line) :- write_formatted('入力された %t には半角文字以外の文字があります\n',[Line]), fail. すべてのコードが127以下([]) :- !. すべてのコードが127以下([Code|R]) :- Code >= 32, Code =< 127, すべてのコードが127以下(R). 文字列の長さがn文字以内(Line,_n) :- atom_length(Line,_長さ), _長さ =< _n,!. 文字列の長さがn文字以内(Line) :- write_formatted('入力された %t は文字数が%tを越えています\n',[Line,_n]), fail. メールアドレスを得る(_読み) :- write('メールアドレスを 半角アルファベット・ローマ字・30文字以内 で入力してください : '), get_line(Line), メールアドレス診断(Line,_読み),!. メールアドレスを得る(_読み) :- メールアドレスを得る(_読み). メールアドレス診断(Line,_読み) :- すべてが半角アルファベット・ローマ字・半角文字(Line), 文字列の長さがn文字以内(Line,30),!. 電話番号を得る(_読み) :- write('電話番号を 半角13文字以内 で入力してください : '), get_line(Line), 電話番号診断(Line,_読み),!. 電話番号を得る(_読み) :- 電話番号を得る(_読み). 電話番号診断(Line,_読み) :- すべてが半角数字かハイフン(Line), 文字列の長さがn文字以内(Line,13),!. すべてが半角数字かハイフン(Line) :- atom_chars(Line,Chars), 半角数字・ハイフン(Chars),!. すべてが半角数字かハイフン(Line) :- write_formatted('%t に半角数字とハイフン以外の文字が混入しています\n',[Line]), fail. 半角数字・ハイフン([]) :- !. 半角数字・ハイフン(['-'|R]) :- 半角数字・ハイフン(R),!. 半角数字・ハイフン([A|R]) :- A @>= '0', A @=< '9', 半角数字・ハイフン(R),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/823 # # [1] 授業単元:ネットワークプログラミング # [2] 問題文(含コード&リンク): # ネットワーク対戦型ゲームを実装せよ # 宛先ホスト,ポート番号をコマンドライン引数として扱う. # serverとclientの1対1通信でOK # getaddrinfo()を使用すること # localhost内で動作すればOK # ゲームに関して # じゃんけん # ○×ゲーム # などなど・・・ # 提出物 # サーバ側,クライアント側のプログラム # 碁盤サーバ :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket), open(NewSocket,read,Instream), open(NewSocket,write,Outstream), get_line(Instream,Line), ゲーム(Instream,Outstream,Line), close(Instream), close(Outstream), socket_shutdown(Socket), socket_shutdown(NewSocket). ゲーム(_,_,ありません) :- !. ゲーム(Instream,Outstream,Line) :- exception_handler(atom_to_term(Line,Term,Varlist),Ex, Term = Ex), call(Term), 自分の手番(_次の手), write_formatted(Outstream,'着手(%q). ',[_次の手]), flush_output(Outstream), get_line(Instream,Line2), ゲーム(Instream,Outstream,Line2). 着手((A,B)) :- write_formatted('相手の着手は%t%tです\n',[A,B]), 盤面表示(A,B),!. 自分の手番(_次の手) :- write('次の手をカンマ区切りで入力してください : '), get_line(Line), 自分の着手診断(Line,_次の手),!. 自分の手番(_次の手) :- 自分の手番(_次の手). 自分の着手診断(Line,(A,B)) :- split(Line,[',',' '],[A,B]), A @>= 'A', A @=< 'S', B >= 0, B =< 19,!. 自分の着手診断(Line,_次の手) :- write_formatted('%t は適切な盤面表現ではありません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/853 # # 【 課題 】(1)三科目の点数を入力し、平均点を表示するプログラムを作成せよ。 # (2)まず人数を入力、その人数分の三科目の点数を入力、個人ごとの平均点を表示するプログラムを作成せよ。 #   (3)(2)を継承。オーバーライドを使用し、入力する科目を五科目に増やし、さらに合計点も表示するプログラムを作成せよ。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】本日九時 # 【 Ver  】java version "1.6.0_21" #   Java(TM) SE Runtime Environment (build 1.6.0_21-b07) #   Java HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing) # 【 補足 】問題が口頭だったため、文章におかしいところがあるかも知れませんが、よろしくお願いします。 まず人数を入力、その人数分の三科目の点数を入力、個人ごとの平均点を表示する :- まず人数を入力(_人数), その人数分の三科目の点数を入力(_人数,_その人数分の三科目の得点ならび), 個人ごとの平均点を表示する(_その人数分の三科目の得点ならび). まず人数を入力(_人数) :- write('人数を入力してください : '), get_line(Line), 人数入力診断(Line,_人数),!. まず人数を入力(_人数) :- まず人数を入力(_人数). 人数入力診断(Line,_人数) :- atom_to_term(Line,_人数,_), integer(_人数), _人数 > 0,!. 人数入力診断(Line,_人数) :- write_formatted('入力された文字列 %t からは人数を得られませんでした。再入力をお願いします。\n',[Line]), fail. その人数分の三科目の点数を入力(_人数,_その人数分の三科目の得点ならび) :- length(_その人数分の三科目の得点ならび,_人数), findall(_三科目の得点,( append(_,[_三科目の得点|_],_その人数分の三科目の得点ならび), 三科目の点数を入力し(_三科目の得点)), _その人数分の三科目の得点ならび). 個人ごとの平均点を表示する(_その人数分の三科目の得点ならび) :- append(L0,[_三科目の得点|R],_その人数分の三科目の得点ならび), 個人idを付加して表示(L0), 平均点を表示する(_三科目の得点), R = []. 個人idを付加して表示(L0) :- length([_|L0],_何番目]), write_formatted('%t : ',[_何番目]). 三科目の点数を入力し(_三科目の得点) :- write('三科目の点数をカンマ区切りで一行で入力してください : '), get_split_line([','],_三科目の得点). 平均点を表示する(_三科目の点数) :- 平均点を(_三科目の点数,_平均点), 表示する(_平均点). 平均点を([_第一科目の点数,_第二科目の点数,_第三科目の点数],_平均点) :- _平均点 is (_第一科目の点数 + _第二科目の点数 + _第三科目の点数) / 3. 表示する(_平均点) :- write_formatted('三科目の平均は %t です\n',[_平均点]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/804 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1380209.txt.html # # データ例のように名前,性別,5教科の試験の得点を格納した.txtファイルを用意し、 # # そのデータを用いて実行例のような操作を行うことができるプログラムを作成せよ. # # このプログラムに細かい指定は無く、データ構造や関数は各自適切と考えるものを作成すればよい. # # 【データ例】 # ファイル名:classA.txt # Andrew M 92 63 85 71 81 # # Helen F 81 89 83 79 51 # # Jane F 65 75 59 81 69 # # John M 85 98 95 81 91 # # Susan F 60 50 53 69 43 # # Thomas M 72 62 79 66 72 # # ファイル名:classB.txt # Ichiro M 82 65 75 81 41 # # Jiro M 61 72 51 41 69 # # Sabu M 55 68 85 81 81 # # Hanako F 90 80 93 89 93 # # 【実行例】 # $はコマンドプロンプトを指す # # $ ./report (プログラムの実行) # # -------------Menu----------------- # 1.データ読み込み # 2.一覧表示 # 0.終了 # ---------------------------------- # コマンド>> 1 (ここでコマンドを入力できるようにする。以下同じ) # [データ読み込み] # ファイル名を入力してください>> classA.txt (読み込みたいファイル名の入力。以下同じ) # ファイルclassA.txtからデータを読み込みました。 # # -------------Menu----------------- # 1.データ読み込み # 2.一覧表示 # 0.終了 # ---------------------------------- # コマンド>> 2 # 名前 性別 国語 数学 理科 社会 英語 平均点 # Andrew  M    92    63   85    71   81    78.4 # Helen  F    81    89   83    79   51    76.6 # Jane   F    65    75   59    81   69    69.8 # John   M    85    98   95    81   91    90.0 # Susan  F    60    50   53    69   43    55.0 # Thomas  M 72 62 79 66 72 70.2 # -------------Menu----------------- # 1.データ読み込み # 2.一覧表示 # 0.終了 # ---------------------------------- # コマンド>> 1 # [データ読み込み] # ファイル名を入力してください>> classB.txt # ファイルclassB.txtからデータを読み込みました. # -------------Menu----------------- # 1. データ読込 # 2. 一覧表示 # 0. 終了 # ---------------------------------- # コマンド >> 2 # [一覧表示] # 名前 性別 国語 数学 理科 社会 英語 平均点 # Ichiro M 82 65 75 81 41 68.8 # Jiro M 61 72 51 41 69 58.8 # Sabu M 55 68 85 81 81 74.0 # Hanako F 90 80 93 89 93 89.0 # -------------Menu----------------- # 1. データ読込 # 2. 一覧表示 # 0. 終了 # ---------------------------------- # コマンド >> 0 # [終了] # # $ # # ※ファイル名を入力するところで存在しないファイル名を入力(classC.txtなど)した場合、 #  入力されたファイルは存在しない、という旨をきちんと表示させること # 選択された機能を実行する :- メニュー表示, コマンド番号を得る(_コマンド番号), 実行(_コマンド番号), 選択された機能を実行する. 選択された機能を実行する. 実行(1) :- テータ読み込み. 実行(2) :- 一覧表示. 実行(0) :- 終了, fail. メニュー表示 :- write('-------------Menu-----------------\n'), write('1.データ読み込み\n'), write('2.一覧表示\n'), write('0.終了\n'), write('----------------------------------\n'),!. コマンド番号を得る(_コマンド番号) :- write('コマンド>> '), get_integer(_コマンド番号), _コマンド番号 >= 0, _コマンド番号 =< 2,!. データ読み込み :- ファイル名を得る(_ファイル名), get_split_lines(_ファイル名,[' '],LL), length(L,8), データ述語削除(データ,_ファイル名,L), 述語定義(データ,_ファイル名,LL), write_formatted('ファイル%tからデータを読み込みました.\n',[_ファイル名]),!. データ読み込み(Lines) :- データ読み込み(Lines). ファイル名を得る(_ファイル名) :- write('[データ読み込み]\n'), write('ファイル名を入力してください>> '), get_line(_ファイル名), ファイル名診断(_ファイル名). ファイル名診断(_ファイル名) :- get_file_info(_ファイル名,L), append(_,[mode(L2)|_],L), ファイル名はファイルとして存在する(_ファイル名,L2), ファイル名は読み込み可能である(_ファイル,L2),!. ファイル名はファイルとして存在する(_ファイル名,L) :- append(_,[ifreg|_],L),!. ファイル名はファイルとして存在する(_ファイル名,L) :- write_formatted('ファイル %t は存在しません\n',[_ファイル名]), fail. ファイル名は読み込み可能である(_ファイル名,L) :- append(_,[irusr|_],L),!. ファイル名は読み込み可能である(_ファイル名,L) :- write_formatted('ファイル %t は存在しますが、現在読み込みができません\n',[_ファイル名]), fail. 述語定義(_述語名,_ファイル名,LL) :- append(_,[L|R],LL), P =.. [_述語名,_ファイル名|L], assertz(P), R = [],!. 一覧表示 :- write('名前 性別 国語 数学 理科 社会 英語 平均点\n'), データ(_ファイル名,名前,_性別,_国語,_数学,_理科,_社会,_英語,_平均点), write_formatted('%t %t %t %t %t %t %t %t %t\n',[名前,_性別,_国語,_数学,_理科,_社会,_英語,_平均点]), fail. 一覧表示. データ述語削除(_述語名,_ファイル名,L) :- P =.. [_述語名,_ファイル名|L]), retract(P), fail. データ述語削除(データ,_ファイル名). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/626 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # # 問題1メイン関数でキーボードから二つの整数n1とn2を読み込み,それらをexponent関数を呼び出して, # n1のn2乗を計算し,結果をメイン関数で表示するプログラムを書きなさい. # <実行例> # 二つの整数を入力してください. # n1 = 5 # n2 = 2 # 5の2乗は25です. # 問題2 5人の点数を読み込んでいき、その最高点を表示するプログラムを作成しなさい。 # 問題3 円の面積の一覧表を計算するプログラムを作成しなさい。 # <実行結果> # 半径 --- 面積 # 1.0 --- 3.14 # 1.1 --- 3.80 # 1.2 --- 4.52 # 1.3 --- 5.31 # 問題4 球の体積を計算するプログラムを作成しなさい。 # 実行例 # 体積 = 1766.25 '5人の点数を読み込んでいき、その最高点を表示する' :- '5人の点数を読み込んでいき'(_5人の点ならび), 最高点を表示する(_5人の点ならび). '5人の点数を読み込んでいき'(_5人の点ならび) :- length(_5人の点ならび,5), findall(_点数,( append(L0,[_点数|_],_5人の点ならび), 点数を得る(L0,_点数)), _5人の点ならび),!. 点数を得る(L0,_点数) :- length([_|L0],N人目), writef('%t人目の点数を入力してください : ',[N人目]), get_line(Line), 点数の入力診断(Line,_点数),!. 点数を得る(L0,_点数) :- 点数を得る(L0,_点数). 点数の入力診断(Line,_) :- atom_to_term(Line,_点数,_), number(_点数),!. 点数の入力診断(Line,_点数) :- writef('入力された %t からは点数が得られません。再入力をお願いします\n',[Line]), fail. 最高点を表示する(_5人の点ならび) :- 最高点を(_5人の点ならび,_最高点), 表示する(_最高点). 最高点を(_5人の点ならび,_最高点) :- sort(_5人点ならび,_昇順に整列した5人の点ならび), last(_昇順に整列した5人の点ならび,_最高点). 表示する(_最高点) :- writef('最高点は%tです\n',[_最高点]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/626 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # # 問題1メイン関数でキーボードから二つの整数n1とn2を読み込み,それらをexponent関数を呼び出して, # n1のn2乗を計算し,結果をメイン関数で表示するプログラムを書きなさい. # <実行例> # 二つの整数を入力してください. # n1 = 5 # n2 = 2 # 5の2乗は25です. # 問題2 5人の点数を読み込んでいき、その最高点を表示するプログラムを作成しなさい。 # 問題3 円の面積の一覧表を計算するプログラムを作成しなさい。 # <実行結果> # 半径 --- 面積 # 1.0 --- 3.14 # 1.1 --- 3.80 # 1.2 --- 4.52 # 1.3 --- 5.31 # 問題4 球の体積を計算するプログラムを作成しなさい。 # 実行例 # 体積 = 1766.25 'メイン関数でキーボードから二つの整数n1とn2を読み込み,それらをexponent関数を呼び出して,n1のn2乗を計算し,結果をメイン関数で表示する' :- メイン. メイン :- キーボードから二つの整数n1とn2を読み込み(_n1,_n2), exponent(_n1,_n2,_結果), writef('%tの%t乗は%tです\n',[_n1,_n2,_結果]). キーボードから二つの整数n1とn2を読み込み(_n1,_n2) :- キーボードからn1を読み込み(_n1), キーボードからn2を読み込み(_n2). キーボードからn1を読み込み(_n1) :- write('n1 = '), get_line(Line), キーボードからn1を読み込み診断(Line,_n1),!. キーボードからn1を読み込み(_n1) :- キーボードからn1を読み込み(_n1). キーボードからn1を読み込み診断(Line,_n1) :- atom_to_term(Line,_n1,_), integer(_n1),!. キーボードからn1を読み込み診断(Line,_n1) :- writef('入力された %t からは整数が得られません。再入力をお願いします\n',[Line]), fail. キーボードからn2を読み込み(_n2) :- write('n2 = '), get_line(_n2), キーボードからn2を読み込み診断(Line,_n2),!. キーボードからn2を読み込み(_n2) :- キーボードからn2を読み込み(_n2). キーボードからn2を読み込み診断(Line,_n2) :- atom_to_term(Line,_n2,_), integer(_n2),!. キーボードからn2を読み込み診断(Line,_n2) :- writef('入力された %t からは整数が得られません。再入力をお願いします\n',[Line]), fail. exponent(_n1,0,1) :- !. exponent(_n1,1,_n1) :- !. exponent(_n1,_n2,_結果) :- exponentで定数が整数の時は(_n1,_n2,_結果). exponent(_n1,_n2,_結果) :- exponentで定数が負数の時は(_n1,_n2,_結果). exponentで定数が整数の時は(_n1,_n2,_結果). _n2 > 0, _n2_1 is _n2 - 1, exponent(_n1,_n2_1,_結果_1), _結果 is _n1 * _結果_1. exponentで定数が負数の時は(_n1,_n2,_結果) :- _n2 < 0, _n2_1 is _n2 + 1, exponent(_n1,_n2_1,_結果_1), _結果 is _結果_1 / _n1. % get_line/1 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/455 # # [1] 授業単元: Cプログラミング演習2 # [2] 問題文(含コード&リンク): 2つ unsighned char型のポインタ変数を用意する。 # キーボードから数値を入力し、 malloc を用いて、1つめのポインタに入力数値バイト分のメモリを確保する。 # 次に2つめのポインタに固定バイト数(いくつでも良いが、例えば16)分のメモリを確保する。 # この時、2つのポインタが指すアドレスが連続しているかどうか確認するプログラムを作成せよ。 # '2つ unsighned char型のポインタ変数を用意する。キーボードから数値を入力し、 malloc を用いて、1つめのポインタに入力数値バイト分のメモリを確保する。次に2つめのポインタに固定バイト数(いくつでも良いが、例えば16)分のメモリを確保する。この時、2つのポインタが指すアドレスが連続しているかどうか確認する' :- get_integer(_数値), malloc(_数値,_先頭アドレス), _続きのアドレス is _先頭アドレス + _数値, malloc(16,_先頭アドレス2), '2つのポインタが指すアドレスが連続しているかどうか確認する'(_続きのアドレス,_先頭アドレスの二,_診断), wr('%t\n',[_診断]). '2つのポインタが指すアドレスが連続しているかどうか確認する'(_アドレス,_アドレス,連続しています) :- !. '2つのポインタが指すアドレスが連続しているかどうか確認する'(_,_,連続していません) :- !. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/277 # # [1] 授業単元:プログラミング言語(C) # [2] 問題文(含コード&リンク): # Cプログラミングの基礎[新訂版]発行:サイエンス社 著:蓑原隆より # P48 3.1 3.2 3.3 3.4 P55 4.1 P88 5.1 P104 6.1 6.2 # http://ime.nu/upload.jpn.ph/upload/img/u72273.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72276.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72274.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72275.jpg # # 3.2 身長と体重を入力すると、次の判定方法で肥満度を判定するプログラムを # 作成せよ。 # # 標準体重(kg) = (身長(cm) - 100) * 0.9 # # 肥満度(%) = ((体重-標準体重) / 標準体重)) * 100. # 肥満度20%以上はふとり過ぎ。肥満度10~20%はふとりぎみ。 # 肥満度±10%以内は標準。肥満度-10~~-20%はやせぎみ。 # 肥満度20%以下はやせすぎ。 身長と体重を入力すると、次の判定方法で肥満度を判定する :- 身長と体重を入力する(_身長,_体重), その身長の標準体重を得る(_身長,_標準体重), 肥満度を得る(_身長,_体重,_標準体重,_肥満度), 肥満度を判定する(_肥満度,_判定), write_formatted('あなたは肥満度%tで、%tです。\n',[_肥満度,_判定]). 身長と体重を入力する(_身長,_体重) :- 身長を入力する(_身長), 体重を入力する(_体重). 身長を入力する(_身長) :- write('身長を入力してください : '), get_line(Line), 身長入力診断(Line,_身長),!. 身長を入力する(_身長) :- 身長を入力する(_身長). 身長入力診断(Line,_身長) :- atom_to_term(Line,_身長,_), number(_身長),!. 身長入力診断(Line,_身長) :- write_formatted('入力された文字列%tからは身長が得られませんでした。再入力をお願いします。\n',[Line]), fail. 体重を入力する(_体重) :- write('体重を入力してください : '), get_line(Line), 体重入力診断(Line,_体重),!. 体重を入力する(_体重) :- 体重を入力する(_体重). 体重入力診断(Line,_体重) :- atom_to_term(Line,_体重,_), number(_体重),!. 体重入力診断(Line,_体重) :- write_formatted('入力された文字列%tからは体重が得られませんでした。再入力をお願いします。\n',[Line]), fail. その身長の標準体重を得る(_身長,_標準体重) :- _標準体重 = (_身長 - 100) * 0.9. 肥満度を得る(_身長,_体重,_標準体重,_肥満度) :- _肥満度 is ((_体重-_標準体重) / _標準体重)) * 100. 肥満度を判定する(_肥満度,ふとりすぎ) :- _肥満度 >= 20.0. 肥満度を判定する(_肥満度,ふとりすぎ) :- _肥満度 >= 10.0, _肥満度 < 20.0. 肥満度を判定する(_肥満度,ふつう) :- _肥満度 > -10.0, _肥満度 < 10.0. 肥満度を判定する(_肥満度,やせぎみ) :- _肥満度 =< -10.0, _肥満度 > -20.0. 肥満度を判定する(_肥満度,やせすぎ) :- _肥満度 =< -20.0. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/277 # # [1] 授業単元:プログラミング言語(C) # [2] 問題文(含コード&リンク): # Cプログラミングの基礎[新訂版]発行:サイエンス社 著:蓑原隆より # P48 3.1 3.2 3.3 3.4 P55 4.1 P88 5.1 P104 6.1 6.2 # http://ime.nu/upload.jpn.ph/upload/img/u72273.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72276.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72274.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72275.jpg # # 3.1 気温と温度を入力すると、不快指数の値とその値で不快に感じる人の割合を # 表示するプログラムを作成せよ。 # (不快指数) = 0.81 * 気温 + 0.01 * 湿度 * (0.99 * 気温 - 14.3) + 46.3 # 不快指数の値によって次の表に示す割合の人が不快に感じるといわれている。 # 不快指数 割合 # 77未満 約9% # 77以上85未満 約65% # 85以上 約93% '気温と温度を入力すると、不快指数の値とその値で不快に感じる人の割合を表示する' :- 気温と温度を入力する(_気温,_湿度), 不快指数(_気温,_湿度,_不快指数), 不快に感じる人の割合(_不快指数,_不快に感じる人の割合), write_formatted('不快指数は %t, この状態を不快に感じる人の割合は 約%t%%です\n',[_不快指数,_不快に感じる人の割合]). 気温と湿度を入力する(_気温,_湿度) :- 気温を入力する(_気温), 湿度を入力する(_湿度). 気温を入力する(_気温) :- write('気温を入力してください : '), get_line(Line), 湿度入力診断(Line,_気温),!. 気温を入力する(_気温) :- 気温を入力する(_気温). 湿度を入力する(_湿度) :- write('湿度を入力してください : '), get_line(Line), 湿度入力診断(Line,_湿度),!. 湿度を入力する(_湿度) :- 湿度を入力する(_湿度). 気温入力診断(Line,_気温) :- atom_to_term(Line,_気温,_), integer(_気温),!. 気温入力診断(Line,_) :- write_formatted('入力された文字列 %t からは気温を得られませんでした。再入力をお願いします。\n',[Line]), fail. 湿度入力診断(Line,_湿度) :- atom_to_term(Line,_湿度,_), integer(_湿度),!. 湿度入力診断(Line,_) :- write_formatted('入力された文字列 %t からは湿度を得られませんでした。再入力をお願いします。\n',[Line]), fail. 不快指数(_気温,_湿度,_不快指数) :- _不快指数 is 0.81 * _気温 + 0.01 * _湿度 * (0.99 * _気温 - 14.3) + 46.3. 不快に感じる人の割合(_不快指数,9) :- _不快指数 < 77,!. 不快に感じる人の割合(_不快指数,65) :- _不快指数 >= 77, _不快指数 < 85,!. 不快に感じる人の割合(_不快指数,85) :- _不快指数 >= 85. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/21 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org1340661.txt # # 2.問題1を利用して、キーボードから実数aと正の整数nを入力しa^1 + a^2 + a^3 +... + a^nを作成せよ。 '問題1を利用して、キーボードから実数aと正の整数nを入力しa^1 + a^2 + a^3 +... + a^nを作成せよ。'(_解) :- キーボードから実数aと正の整数nを入力し(_実数a,_整数n), 'a^1 + a^2 + a^3 +... + a^nを作成せよ。'(1,_正の整数n,_実数a,0,_解). 'a^1 + a^2 + a^3 +... + a^nを作成せよ。'(_正の整数n,_整数n,_実数a,X) :- power(_実数a,_正の整数n,X),!. 'a^1 + a^2 + a^3 +... + a^nを作成せよ。'(M,_正の整数n,_実数a,_解1) :- power(_実数a,M,Y), M2 is M + 1, 'a^1 + a^2 + a^3 +... + a^nを作成せよ。'(M2,_正の整数n,_実数a,_解2), _解1 is _解2 + Y. キーボードから実数aと正の整数nを入力し(_実数a,_正の整数n) :- キーボードから実数aを入力(_実数a), キーボードから正の整数nを入力(_正の整数n). キーボードから実数aを入力(_実数a) :- write('a^1 + a^2 + a^3 +... + a^nの計算をします。実数aを入力してください : '), get_line(Line), 実数a入力診断(Line,_実数a),!. キーボードから実数aを入力(_実数a) :- キーボードから実数aを入力(_実数a). 実数a入力診断(Line,_実数a) :- atom_to_term(Line,_実数a,_), float(_実数a),!. 実数a入力診断(Line,_) :- write_formatted('入力された %t から実数が得られません。再入力をお願いします。\n',[Line]), fail. キーボードから正の整数nを入力(_正の整数n) :- write('正の整数nを入力してください : '), get_line(Line), 整数n入力診断(Line,_正の整数n),!. キーボードから正の整数nを入力(_正の整数n) :- キーボードから正の整数nを入力(_正の整数n). 整数n入力診断(Line,_正の整数n) :- atom_to_term(Line,_正の整数n,_), integer(_正の整数n), _正の整数n > 0,!. 整数n入力診断(Line,_) :- write_formatted('入力された %t から正の整数が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/972 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 5列5行の多次元配列(0または1が適当に並べられているもの)を用意し # 1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更し # そうでない場合は1のままにする この操作を10回行った配列を求めるプログラムを作成する # またこの配列は上下左右繋がっていて1,1の配列の場合上は1,5、左は5.1である # % http://nojiriko.asia/prolog/c144_919.html から述語を借用する。 '5列5行の行列(0または1が適当に並べられているもの)を用意し1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにする。この操作を10回行う'(_ならび) :- '5列5行の行列(0または1が適当に並べられているもの)を用意し'(LL1), length(Ln,10), '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにするこの操作を10回行う'(Ln,LL1,LL2). '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにするこの操作を10回行う'([],LL,LL) :- !. '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにするこの操作を10回行う'([_|Ln],LL1,LL) :- '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにする'(LL1,LL2), '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにするこの操作を10回行う'(Ln,LL2,LL). '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにする'(LL1,LL2) :- length(LL2,5), findall(_マス目の値2,( length(Line,5), append(L00,[Line|_],LL2), append(L01,[_マス目の値2|_],Line), length(L00,_行の一), length(L01,_列の一), _行 is _行の一 + 1, _列 is _列の一 + 1, マス目の周囲(LL1,_行,_列,_マス目の値1,_マス目の周辺), マス目の状態診断(_マス目の値1,_マス目の周辺,_マス目の値2)), LL2). '5列5行の行列(0または1が適当に並べられているもの)を用意し'(LL) :- length(LL,5), findall(L,( length(L,5), append(_,[A|_],L), A is random 2), LL). マス目の周囲(LL,1,_マス目の列,_マス目の値,_マス目の周辺ならび) :- append(LL0,[L],LL), append(LL,[L],LL1), マス目の周囲(LL,2,_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲(LL,5,_マス目の列,_マス目の値,_マス目の周辺ならび) :- LL = [L1|R], append(R,L1,LL2), マス目の周囲(LL,4,_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲(LL,_マス目の行,_マス目の列,_マス目の値,_マス目の周辺ならび) :- _マス目の行 >= 2, _マス目の行 =< 4, Nth1 is _マス目の行 - 2, length(L0,Nth1), append(L0,[Line1,Line2,Line3|_],LL), マス目の周囲([Line1,Line2,Line3],_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],1,_マス目の値,_マス目の周辺ならび),!. length(L0,4), findall(L,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,L1,Line), append(L1,L0,L)), LL), マス目の周囲(Line1,Line2,Line3,2,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],5,_マス目の値,_マス目の周辺ならび) :- length(L1,4), findall(L,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,L1,Line), append(L1,L0,L)), LL), マス目の周囲(Line1,Line2,Line3,4,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],_マス目の列,_マス目の値,[A2,A4,A6,A8]) :- _マス目の列 >= 2, _マス目の列 =< 4, Nth1 is _マス目の列 - 2, length(L0,Nth1), findall(U,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,[A,B,C|_],Line), append(_,[U|_],[A,B,C])), L), L = [A1,A2,A3,A4,_マス目の値,A6,A7,A8,A9],!. マス目の状態診断(_マス目の値,_マス目の周囲,0) :- '1のマス目の周囲に2つか3つの1のマス目があれば0に変更される'(_マス目の値,_マス目の周囲,'0'),!. マス目の状態診断(_マス目の値,_マス目の周囲,_マス目の値). '1のマス目の周囲に2つか3つの1のマス目があれば0に変更される'(1,_マス目の周囲) :- count((append(_,[1|_],_マス目の周囲),Count), Count >= 2, Count =< 3,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/401 # # PHP5で使います # # $numには、 # # +数字 # -数字 # 数字 # # というようなパターンの時のみマッチさせたいです # 数字のところは 0〜999999999までの値が入ってきますが、0以外の時に頭に0がある場合0123とかは除外したいです # 試行錯誤して下記のようにしてみましたが、思った結果が得られません。エラー出まくりでなみだ目です # どうかよろしくお願いします # # # preg_match('/^(([^+]*)*(++[^-][^+]*)*)*?[^0-9]*$/',$num) # '+数字 -数字 数字 というようなパターンの時のみマッチさせたいです。数字のところは 0〜999999999までの値が入ってきますが、0以外の時に頭に0がある場合0123とかは除外したいです'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_文字列,_前文字列,_適合文字列,_後文字列,L1,L2,L3), 適合診断(L2), \+((append(_,[A],L1),数字(A))), \+((L3 = [B|_],数字(B))). 適合診断([+|R]) :- すべて数字(R),!. 適合診断([-|R]) :- すべて数字(R),!. 適合診断([A|R]) :- A @>= '1', A @=< '9', すべて数字(R),!. すべて数字([]) :- !. すべて数字([A|R]) :- A @>= '0', A @=< '9', すべて数字(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/919 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/v82fx # # 以下のパズルを解くプログラムを作りなさい. # 30x30の格子状のマス目を考える.各マス目はONまたはOFFのどちらかの状態をとる. # パズルの問題として30x30(すなわち900個)のマス目のON,OFFの状態が与えられる. # この初期状態から以下のルールを用いて各マス目のON,OFFの状態を変化させる. # ルール1: OFFのマス目の周囲に3つのONのマス目があれば次のステップではONになる. # ルール2: ONのマス目の周囲に2つか3つのONのマス目があれば次のステップでもONが維持される. # ルール3: 上以外の場合には次のステップではOFFになる. # 但し,ここでの周囲とはマスに接している8マスを指し,30x30のマスのうち上端と下端, 右端と左端は接続されているものとする. # # この変化を100回繰り替えした時の各マスの状態を求めよ 'パズルの問題として30x30(すなわち900個)のマス目のON,OFFの状態が与えられる. この初期状態から以下のルールを用いて各マス目のON,OFFの状態を変化させる.'(LL1,LL2) :- length(LL2,30), findall(_マス目の値2,( length(Line,30), append(L00,[Line|_],LL2), append(L01,[_マス目の値2|_],Line), length(L00,_行の一), length(L01,_列の一), _行 is _行の一 + 1, _列 is _列の一 + 1, マス目の周囲(LL1,_行,_列,_マス目の値1,_マス目の周辺), マス目の状態診断(_マス目の値1,_マス目の周辺,_マス目の値2)), LL2). マス目の周囲(LL,1,_マス目の列,_マス目の値,_マス目の周辺ならび) :- append(LL0,[L],LL), append(LL,[L],LL1), マス目の周囲(LL,2,_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲(LL,30,_マス目の列,_マス目の値,_マス目の周辺ならび) :- LL = [L1|R], append(R,L1,LL2), マス目の周囲(LL,29,_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲(LL,_マス目の行,_マス目の列,_マス目の値,_マス目の周辺ならび) :- _マス目の行 >= 2, _マス目の行 =< 29, Nth1 is _マス目の行 - 2, length(L0,Nth1), append(L0,[Line1,Line2,Line3|_],LL), マス目の周囲([Line1,Line2,Line3],_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],1,_マス目の値,_マス目の周辺ならび),!. length(L0,29), findall(L,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,L1,Line), append(L1,L0,L)), LL), マス目の周囲(Line1,Line2,Line3,2,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],30,_マス目の値,_マス目の周辺ならび) :- length(L1,29), findall(L,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,L1,Line), append(L1,L0,L)), LL), マス目の周囲(Line1,Line2,Line3,29,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],_マス目の列,_マス目の値,[A1,A2,A3,A4,A6,A7,A8,A9]) :- _マス目の列 >= 2, _マス目の列 =< 29, Nth1 is _マス目の列 - 2, length(L0,Nth1), findall(U,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,[A,B,C|_],Line), append(_,[U|_],[A,B,C])), L), L = [A1,A2,A3,A4,_マス目の値,A6,A7,A8,A9],!. マス目の状態診断(_マス目の値,_マス目の周囲,'ON') :- 'OFFのマス目の周囲に3つのONのマス目があれば次のステップではONになる'(_マス目の値,_マス目の周囲,OFF). マス目の状態診断(_マス目の値,_マス目の周囲,'ON') :- 'ONのマス目の周囲に2つか3つのONのマス目があれば次のステップでもONが維持される'(_マス目の値,_マス目の周囲,'ON'),!. マス目の状態診断(_,_マス目の周囲,'OFF') :- 上以外の場合には次のステップではOFFになる. 上以外の場合には次のステップではOFFになる. 'OFFのマス目の周囲に3つのONのマス目があれば次のステップではONになる'('OFF',_マス目の周囲,'ON') :- count((append(_,['ON'|_],_マス目の周囲),2),!. 'ONのマス目の周囲に2つか3つのONのマス目があれば次のステップでもONが維持される'('ON',_マス目の周囲) :- count((append(_,['ON'|_],_マス目の周囲),Count), Count >= 2, Count =< 3,!. 'この変化を100回繰り替えした時の各マスの状態を求めよ'(LL1,LL2) :- length(Ln,100), 'この変化を100回繰り替えした時の各マスの状態を求めよ'(Ln,LL1,LL2). 'この変化を100回繰り替えした時の各マスの状態を求めよ'([],LL,LL) :- !. 'この変化を100回繰り替えした時の各マスの状態を求めよ'([_|Ln],LL1,LL2) :- 'パズルの問題として30x30(すなわち900個)のマス目のON,OFFの状態が与えられる. この初期状態から以下のルールを用いて各マス目のON,OFFの状態を変化させる.'(LL1,LL3), 'この変化を100回繰り替えした時の各マスの状態を求めよ'(Ln,LL3,LL2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/924 # # [1] 授業単元:C言語 関数 # [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org1330457.txt # # 8桁までの整数を表わす文字列(例: "-3246") を整数値(例:3246) に変換する関数を作りたい。 # # 1. 整数を表わす文字列はつぎの条件を全て同時に満たすと考えられる。 # (1) 文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である # (2) 文字列の2 文字目以降は’0’〜’9’ である # (3) 符号を除いた文字列の長さは1 以上8 以下である # # 文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時 # (整数として文字列にエラーがある場合)は0を戻り値として返す関数check() を作れ。 # # 2. 変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、 # 負の時には-1を、整数として文字列にエラーがある場合には0 を返す関数sign() を作れ。 # # 3. 問1, 2 を利用し8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す関数 # myatoi() を作成せよ '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(_文字列,_整数値) :- '文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時は0を戻り値として返す'(_文字列,_診断値), '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、負の時には-1を、整数として文字列にエラーがある場合には0 を返す'(_文字列,_返り値), atom_chars(_文字列,Chars), '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(Chars,_診断値,_返り値,0,_整数値の一), _整数値 is _整数値の一 * _返り値. '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'([A],_診断値,_返り値,Y,X) :- 文字数値変換(A,N), X is 10 * Y + N,!. '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(['+'|R],_診断値,_返り値,Y,X) :- '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(R,_診断値,_返り値,Y,X),!. '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(['-'|R],_診断値,_返り値,Y,X) :- '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(R,_診断値,_返り値,Y,X),!. '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'([A|R],_診断値,_返り値,Y,X) :- 文字数値変換(A,N), Y2 is 10 * Y + N, '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(R,_診断値,_返り値,Y2,X). '文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時は0を戻り値として返す'(_文字列,_診断値) :- sub_atom(_文字列,0,1,R,_符号), append(_,[_符号|_],['+','-']), \+(R = 0), count(( sub_atom(_文字列,St,1,_,A), St >= 1, \+(文字数値変換(A,_))),0), _診断値 = 1,!. '文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時は0を戻り値として返す'(_文字列,0). '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、負の時には-1を、整数として文字列にエラーがある場合には0 を返す'(_文字列,-1) :- sub_atom(_文字列,0,1,_,'-'),!. '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、負の時には-1を、整数として文字列にエラーがある場合には0 を返す'(_文字列,1). 文字数値変換('0',0). 文字数値変換('1',1). 文字数値変換('2',2). 文字数値変換('3',3). 文字数値変換('4',4). 文字数値変換('5',5). 文字数値変換('6',6). 文字数値変換('7',7). 文字数値変換('8',8). 文字数値変換('9',9). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/884 # # 分からないプログラミング課題があります。 # 問)N個の文字列を入力すると文字列の長さが短い順、同じ長さの時は順不同、に #   並べ替えて表すプログラムを作りなさい。 # # 二次元配列とポインタ配列を使うらしいんですけど、コンパイル時にエラーばかり出てしまいます。 # どなたか分かる方いらっしゃいますか? # 'N個の文字列を入力すると文字列の長さが短い順、同じ長さの時は順不同、に並べ替えて表す' :- 'N個の文字列を入力すると'(_N個の文字列), '文字列の長さが短い順、同じ長さの時は順不同、に並べ替えて'(_N個の文字列,_長さ順に並べ替えた文字列), 表す(_長さ順に並べ替えた文字列). 'N個の文字列を入力すると'(_N個の文字列) :- 'N個の'(_N個), length(_N個の文字列,_N個), 'N個の文字列を入力する'(_N個の文字列). 'N個の'(_N個) :- write('何個の文字列を入力しますか : '), get_line(Line), 'N個の入力診断'(Line,_N個),!. 'N個の'(_N個) :- 'N個の'(_N個). 'N個の入力診断'(Line,_N個) :- atom_to_term(Line,_N個,_), integer(_N個), _N個 > 0,!. 'N個の入力診断'(Line,_N個) :- write_formatted('入力された %t からは正の整数が得られません。再入力をお願いします。\n',[Line]), fail. 'N個の文字列を入力する'([]) :- !. 'N個の文字列を入力する'([_文字列|R]) :- 'N個の文字列を入力する'(R). '文字列の長さが短い順、同じ長さの時は順不同、に並べ替えて'(_N個の文字列,_長さの短い順に並べ替えた文字列ならび) :- findall([_長さ,_文字列],( append(_,[_文字列|_],_N個の文字列), sub_atom(_文字列,0,_長さ,0,_文字列)), _長さを鍵に整列したならび), sort(長さを鍵に整列した,_長さの短い順に並べ替えた文字列ならび). 表す(_長さの短い順に並べ替えた文字列ならび) :- append(_,[[_|_文字列]|R],_長さの短い順に並べ替えた文字列ならび), write_formatted('%t\n',[_文字列]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/785 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 2*2行列 X の逆行列を計算し、出力するプログラムを作れ # (公式を使って構わない) # # ただし、行列 X の要素は全て浮動小数点型であるとする # 要素の値は標準入力で与える # # ヒント # 逆行列が定義できないときはエラーを出力して終わる # '2*2行列Xの逆行列を計算し、出力する' :- 行列の入力([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]), '2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]), 逆行列表示([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]),!. '2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]) :- '2×2行列の行列式の計算'([[X11,X12],[X21,X22]],_行列式の値), '2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],_行列式の値,[[Y11,Y12],[Y21,Y22]]). '2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],0.0,[[Y11,Y12],[Y21,Y22]]) :- write('逆行列は作れません\n'),!,fail. '2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],0,[[Y11,Y12],[Y21,Y22]]) :- write('逆行列は作れません\n'),!,fail. '2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],_行列式の値,[[Y11,Y12],[Y21,Y22]]) :- Y11 is X22 / _行列式の値, Y12 is ((-1) * X12) / _行列式の値, Y21 is ((-1) * X21) / _行列式の値, Y22 is X11 / _行列式の値. '2×2行列の行列式の計算'([[X11,X12],[X21,X22]],_行列式の値) :- _行列式の値 is X11 * X22 - X12 * X21. 行列の入力(LL) :- length(LL,2), findall(L1, append(L0,[L1|_],LL), length([_|L0],Nth), write_formatted('行列の%t行目をカンマ区切りで2列入力してください\n',[Nth]), カンマ区切りによる二項入力(L1)), LL). カンマ区切りによる二項入力(L) :- get_line(Line), カンマ区切りによる二項入力診断(Line,L),!. カンマ区切りによる二項入力(L) :- カンマ区切りによる二項入力(L). カンマ区切りによる二項入力診断(Line,L) :- split(Line,[','],L), length(L,2), すべて数値(L),!. カンマ区切りによる二項入力診断(Line,L) :- write('入力された%tからは二項を取り出すことができません。再入力をお願いします。\n'), fail. すべて数値([]) :- !. すべて数値([V|R]) :- number(V),すべて数値(R). 逆行列表示([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]) :- 行列表示([[X11,X12],[X21,X22]]), write('の逆行列は\n'), 行列表示([[Y11,Y12],[Y21,Y22]]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/778 # # 1] 授業単元:Cプロ実習 # [2] 問題文(含コード&リンク): # 2つの4×4行列を2次元配列に格納し、それらの積を求めるプログラムを作成せよ。 # 以下の関数を必ず利用すること。 # 関数の引数の型では1次元目が空白になっているが、 #  main関数では4×4の通常の2次元配列を用いればよい。 # '2つの4×4行列を2次元配列に格納し、それらの積を求める' :- 行列一の入力(LL1), 行列二の入力(LL2), 行列の積(LL1,LL2,LL3), 結果の表示(LL1,LL2,LL3). 行列一の入力(LL1) :- length(LL1,4), findall(L1, append(L0,[L1|_],LL1), length([_|L0],Nth), write_formatted('第二行列の%t行目をカンマ区切りで4列入力してください\n',[Nth]), カンマ区切りによる四項入力(L1)), LL1). 行列二の入力(LL2) :- length(LL2,4), findall(L2, append(L0,[L2|_],LL2), length([_|L0],Nth), write_formatted('第二行列の%t行目をカンマ区切りで4列入力してください\n',[Nth]), カンマ区切りによる四項入力(L2)), LL2). カンマ区切りによる四項入力(L) :- get_line(Line), カンマ区切りによる四項入力診断(Line,L),!. カンマ区切りによる四項入力(L) :- カンマ区切りによる四項入力(L). カンマ区切りによる四項入力診断(Line,L) :- split(Line,[','],L), length(L,4), すべて数値(L),!. カンマ区切りによる四項入力診断(Line,L) :- write('入力された%tからは四項を取り出すことができません。再入力をお願いします。\n'), fail. すべて数値([]) :- !. すべて数値([V|R]) :- number(V),すべて数値(R). 行列の積(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) :- S1 is A * B, 行列の積_3(R1,R2,S2), S is S1 + S2. 行列の転置([],[],[]) :- !. 行列の転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 行列の転置(R2,R3,R4). 行列の転置([[]|_],[]) :- !. 行列の転置(L,[L1|R2]) :- 行列の転置(L,L2,L1), 行列の転置(L2,R2). 結果の表示(LL1,LL2,LL3) :- 行列の表示(LL1), write(' ×\n'), 行列の表示(LL2), write(' =\n'), 行列の表示(LL3). 行列の表示(LL) :- write('['), 行列の表示の一(LL). 行列の表示の一([]) :- write(']\n'),!. 行列の表示の一([L]) :- write_formatted(' %t]\n',[L]),!. 行列の表示の一([L|R]) :- write_formatted(' %t\n',[L]), 行列の表示の一(R),! % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/746 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 問題1  非負の整数値を読み込んで、その数を逆順に表示するプログラムを作成しなさい(while文または for文) [オプション機能(任意)] 負の数を読み込んだ場合は再入力を促すこと(do-while文) #  <実行例> # 非負の整数値を入力してください;-4673 # 負の値を入力しないでください。 # 非負の整数値を入力してください;12345 # 逆から読むと54321です。 # <ヒント> # 一の位の数字を求める方法 # 1963 % 10 -> 3 # 196 % 10 -> 6 # 19 % 10 -> 9 # 1 % 10 -> 1 非負の整数値を読み込んで、その数を逆順に表示する :- 非負の整数値を読み込んで(_非負の整数値), その数を逆順に(_非負の整数値,_非負の整数値の逆順表示), 表示する(_非負の整数値の逆順表示). 非負の整数値を読み込んで(_非負の整数値) :- 催促付き整数入力('非負の整数値を入力してください;',_非負の整数値), 非負の整数入力診断(_非負の整数値),!. 非負の整数値を読み込んで(_非負の整数値) :- 非負の整数値を読み込んで(_非負の整数値). 非負の整数入力診断(_非負の整数値) :- _非負の整数値 >= 0,!. 非負の整数入力診断(_非負の整数値) :- write('入力されたのは負の整数でした。再入力をお願いします。\n'), fail. その数を逆順に(_非負の整数値,_非負の整数値の逆順表示) :- number_chars(_非負の整数値,Chars), reverse(Chars,_非負の整数値の逆順ならび), concat_atom(_非負の整数値の逆順ならび,_非負の整数値の逆順表示). 表示する(_非負の整数値の逆順表示) :- write_formatted('%t\n',[_非負の整数値の逆順表示]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/691 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):キーボードからいくつかの浮動小数点を読み込み、そのうち正の数値だけの # 合計を求めて表示するプログラムを作りなさい。数値の個数は事前には分からないものと # し、0が入力されたら、合計すべき数値が尽きたものとする。 # 'キーボードからいくつかの浮動小数点を読み込み、そのうち正の数値だけの合計を求めて表示するプログラムを作りなさい。数値の個数は事前には分からないものとし、0が入力されたら、合計すべき数値が尽きたものとする。' :- findsum(_浮動小数点数,( キーボードからいくつかの浮動小数点を読み込み(_浮動小数点数), ( _浮動小数点数 = 0.0,!,fail; _浮動小数点数 > 0.0)), _合計), write_formatted('入力された浮動小数点数の合計は %t です。\n',[_合計]),!. キーボードからいくつかの浮動小数点を読み込み(_浮動小数点数) :- write('浮動小数点数を入力してください : '), get_line(Line), 浮動小数点数の入力診断(Line,_浮動小数点数). キーボードからいくつかの浮動小数点を読み込み(_浮動小数点数) :- キーボードからいくつかの浮動小数点を読み込み(_浮動小数点数). 浮動小数点数の入力診断(Line,0.0) :- atom_to_term(Line,0,_),!. 浮動小数点数の入力診断(Line,0.0) :- atom_to_term(Line,_浮動小数点数,_),!. float(_浮動小数点数),!. 浮動小数点数の入力診断(Line,_) :- write_formatted('入力された%tからは浮動小数点数を得られません。'), write('再入力をおねがいします。\n'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/651 # # [1] 授業単元: プログラミング # [2] 問題文: # 配列によるスタックを実現する。出来るだけ簡単なアルゴリズムで # ポップとプッシュの操作が可能なプログラムを作れ。正し配列は100要素 # 程度とする。 # # % PSI のKL0言語のデータ管理命令を使ってみる。 :- op(600,fx,push). '配列によるスタックを実現する。出来るだけ簡単なアルゴリズムでポップとプッシュの操作が可能なプログラムを作れ。正し配列は100要素' :- new_heap_vector(_HeapVector,100), スタック操作コマンド(_HeapVector,0). スタック操作(_,満杯) :- !. スタック操作(_,空) :- !. スタック操作(_HeapVector,_スタックポインタ) :- write('? '), get_line(Line), atom_to_term(Line,Term,_), スタック操作コマンド(_HeapVector,_スタックポインタ,Term,_診断), スタック操作(_HeapVector,_診断). スタック操作コマンド(_HeapVector,_スタックポインタ,push(_要素),_実行後スタックポインタ) :- push(push(_HeapVector,_要素,_スタックポインタ,_実行後スタックポインタ), write_formatted('%t >> \n',[_要素]),!. スタック操作コマンド(_HeapVector,_スタックポインタ,pop,_実行後スタックポインタ) :- pop(_HeapVector,_スタックポインタ,_実行後スタックポインタ,_要素), write_formatted('%t << \n',[_要素]),!. push(_HeapVector,_要素,100,満杯) :- !. push(_HeapVector,_要素,_実行前スタックポインタ,_実行後スタックポインタ) :- set_vector_element(_HeapVector,_実行前スタックポインタ,_要素), _実行後スタックポインタ is _実行前スタックポインタ + 1. pop(_HeapVector,0,_実行後スタックポインタ,空) :- !. pop(_HeapVector,_実行前スタックポインタ,_実行後スタックポインタ,_要素) :- set_vector_element(_HeapVector,_実行前スタックポインタ,_要素), _実行後スタックポインタ is _実行前スタックポインタ - 1. %% リストによるStackの処理 %% push(_挿入要素,_現在のスタック,_挿入後のスタック) :- _挿入後のスタック = [_挿入要素|_現在のスタック]. pop(_現在のスタック,_取り出し要素,_取り出し後のスタック) :- _現在のスタック = [_取り出し要素|_取り出し後のスタック],!. pop([],[],[]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/456 # # ../test/read.cgi/tech/1291471791/400 IEだと文字化けしてたのではりなおします…(´・ω・`) # # 問題3:キーボードから入力させた長さの同じ文字列2つを1文字ずつ交互に1つの文字配列に格納し表示する # # 'キーボードから入力させた長さの同じ文字列2つを1文字ずつ交互に1つの文字配列に格納し表示する' :- キーボードから入力させた長さの同じ文字列2つを(_文字列1,_文字列2), atom_chars(_文字列1,_文字ならび1), atom_chars(_文字列2,_文字ならび2), '1文字ずつ交互に1つの文字配列に格納し'(_文字ならび1,_文字ならび2,_交互に格納された文字ならび), 表示する(_交互に格納された文字ならび). キーボードから入力させた長さの同じ文字列2つを(_文字列1,_文字列2) :- write('文字列1を入力してください : '), get_line(_文字列1), 長さの同じ文字列を(_長さ,_文字列2),!. 長さの同じ文字列を(_長さ,_文字列2) :- write_formatted('長さ%t文字の文字列2を入力してください : ',[_長さ]), get_line(_文字列2), キーボードから入力させた文字列の長さ診断(_長さ,_文字列2),!. 長さの同じ文字列を(_長さ,_文字列2) :- 長さの同じ文字列を(_長さ,_文字列2). キーボードから入力させた文字列の長さ診断(_長さ,_文字列2) :- length(_文字列2,_長さ),!. キーボードから入力させた文字列の長さ診断(_長さ,_文字列2) :- length(_文字列2,_長さ2), write_formatted('入力された文字列は長さ %t ありました。要求された長さの文字列を再入力してください : '), fail. '1文字ずつ交互に1つの文字配列に格納し'([],[],[]) :- !. '1文字ずつ交互に1つの文字配列に格納し'([_文字1|R1],[_文字2|R2],[_文字1,_文字2|R3]) :- '1文字ずつ交互に1つの文字配列に格納し'(R1,R2,R3). 表示する(_交互に格納された文字ならび) :- atom_chars(_交互に格納された文字列,_交互に格納された文字ならび), write_formatted('%t\n',_交互に格納された文字列). % 以下のサイトは # 配列分からないので助けてください! # [1] 授業単元:Cプログラミング(配列) # [2] 問題文(含コード&リンク): http://www.dotup.org/uploda/www.dotup.org1291228.txt # [3] 環境 #  [3.1] Linux #  [3.2] gcc #  [3.3] 言語: C # 問題5:実数xの値をキーボードから入力し数列an=1/n! (n=0...9)を係数に持つ多項式 # f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を計算して表示するプログラム。forループを使うこと # 配列分からないので助けてください! '実数xの値をキーボードから入力し数列an=1/n! (n=0...9)を係数に持つ多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を計算して表示する' :- '実数xの値をキーボードから入力し'(_実数x), '数列an=1/n! (n=0...9)を係数に持つ多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(_実数x,_多項式の項表示ならび,_多項式の値), 表示する(_実数x,_多項式の項表示ならび,_多項式の値). '実数xの値をキーボードから入力し'(_実数x) :- 催促付き実数入力('実数値を入力してください : ',_実数x),!. '数列an=1/n! (n=0...9)を係数に持つ多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(_実数x,_多項式の項表示ならび,_多項式の値) :- '数列an=1/n! (n=0...9)を係数に持つ'(_係数ならび), '多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(0,_係数ならび,_実数x,_多項式の項表示ならび,0.0,_多項式の値). '数列an=1/n! (n=0...9)を係数に持つ'(_係数ならび) :- findall(1/U,( for(0,N,9), 階乗(N,U)), _係数ならび). '多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(_,[],_,[],_多項式の値,_多項式の値) :- !. '多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(N,[_係数|R],[_項表示|R2],_実数x,S1,_多項式の値) :- S2 is S1 + _係数 * (_実数X ^ N), write_formatted_atom(_項表示,'%t*x^%1d',[_係数,N]), N_1 is N - 1, '多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(N_1,R,_実数x,R2,S2,_多項式の値). 催促付き実数入力(_催促文,_実数) :- write(_催促文), get_line(Line), 催促付き実数入力診断(Line,_実数),!. 催促付き実数入力(_催促文,_実数) :- 催促付き実数入力(_催促文,_実数). 催促付き実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 催促付き実数入力診断(Line,_実数) :- write_formatted('入力された %t から実数値は得られませんでした。再入力をお願いします。\n',[Line]), fail. 表示する(_実数x,_多項式の項表示ならび,_多項式の値) :- concat_atom(_多項式の項表示ならび,'+',_多項式表示), write_formatted('f(x)=%t に於いて、 x=%t\n',[_多項式表示,_実数x]), write_formatted('f(%t)=%t\n',[_実数x,_多項式の値]). 催促付き実数入力(_催促文,_実数) :- write(_催促文), get_line(Line), 催促付き実数入力診断(Line,_実数),!. 催促付き実数入力(_催促文,_実数) :- 催促付き実数入力(_催促文,_実数). 催促付き実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 催促付き実数入力診断(Line,_実数) :- write_formatted('入力された %t から実数値は得られませんでした。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 配列分からないので助けてください! # [1] 授業単元:Cプログラミング(配列) # [2] 問題文(含コード&リンク): http://www.dotup.org/uploda/www.dotup.org1291228.txt # [3] 環境 #  [3.1] Linux #  [3.2] gcc #  [3.3] 言語: C # 問題4:実数xの値をキーボードから入力し数列an=n+1(n=0...9)を係数に持つ多項式 # f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して表示するプログラム。forループを使うこと # '実数xの値をキーボードから入力し数列an=n+1(n=0...9)を係数に持つ多項式f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して表示する' :- '実数xの値をキーボードから入力し'(_実数x), '数列an=n+1(n=0...9)を係数に持つ多項式f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して'(_実数x,_多項式の値,_多項式の項標示ならび), 表示する(_実数x,_多項式の項表示ならび,_多項式の値). '実数xの値をキーボードから入力し'(_実数) :- 催促付き実数入力('実数を入力してください : ',_実数),!. '数列an=n+1(n=0...9)を係数に持つ多項式f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して'(_実数x,_多項式の値,_多項式の項標示ならび) :- '数列an=n+1(n=0...9)を係数に持つ'(_係数ならび), '多項式f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して'(9,_係数ならび,_実数x,0.0,_多項式の値,_多項式の項表示ならび). '数列an=n+1(n=0...9)を係数に持つ'(_係数ならび) :- findall(U,( for(0,N,9), U is N + 1), L), reverse(L,_係数ならび). '多項式f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して'(N,_,_,[],_多項式の値,_多項式の値) :- N < 0,!. '多項式f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して'(N,[_係数|R],_実数x,[_項表示|R2],S1,_多項式の値) :- U is _係数 * (_実数x ^ N), write_formatted_atom(_項表示,'%1dx%1d',[_係数,N]), S2 is S1 + U, N_1 is N - 1, '多項式f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して'(N_1,[_係数|R],_実数x,R2,S2,_多項式の値). 表示する(_実数x,_多項式の項表示ならび,_多項式の値) :- concat_atom(_多項式の項表示ならび,'+',_多項式表示), write_formatted('f(x)=%t に於いて、 x=%t\n',[_多項式表示,_実数x]), write_formatted('f(%t)=%t\n',[_実数x,_多項式の値]). 催促付き実数入力(_催促文,_実数) :- write(_催促文), get_line(Line), 催促付き実数入力診断(Line,_実数),!. 催促付き実数入力(_催促文,_実数) :- 催促付き実数入力(_催促文,_実数). 催促付き実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 催促付き実数入力診断(Line,_実数) :- write_formatted('入力された %t から実数値は得られませんでした。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 配列分からないので助けてください! # [1] 授業単元:Cプログラミング(配列) # [2] 問題文(含コード&リンク): http://www.dotup.org/uploda/www.dotup.org1291228.txt # [3] 環境 #  [3.1] Linux #  [3.2] gcc #  [3.3] 言語: C # 問題3:サイズ2×2の2つの行列A,Bを配列A[2][2] B[2][2]を用いて作り各要素8個を # キーボードから入力すると行列の和A+Bの結果を表示する。 # 'サイズ2×2の2つの行列A,Bを配列A[2][2] B[2][2]を用いて作り各要素8個をキーボードから入力すると行列の和A+Bの結果を表示する。' :- 'サイズ2×2の2つの行列A,Bを配列A[2][2] B[2][2]を用いて作り'(A,B), '各要素8個をキーボードから入力すると'(A,B), '行列の和A+Bの結果を'(A,B,_行列の和), 表示する(_行列の和). 'サイズ2×2の2つの行列A,Bを配列A[2][2] B[2][2]を用いて作り'(A,B) :- length(A,2), findall(AX,append(_,[AX|_],A),A), length(B,2), findall(BX,append(_,[BX|_],A),A),!. '各要素8個をキーボードから入力すると'(A,B) :- write('Aの入力をします\n'), 'Aの入力'([],A), write('Bの入力をします\n'), 'Bの入力'([],B). 'Aの入力'(Ln1,[]) :- !. 'Aの入力'(Ln1,[L|R]) :- 'Aの入力'(Ln1,[],L), 'Aの入力'([_|Ln1],R). 'Aの入力'(Ln1,Ln2,[]) :- !. 'Aの入力'(Ln1,Ln2,[A|R]) :- length(Ln1,N1), length(Ln2,N2), write_formatted('A[%t][%t]を入力してください : ',[N1,N2]), 催促付き数値入力(_催促文,A), 'Aの入力'(Ln1,[_|L2],R). 'Bの入力'(Ln1,[]) :- !. 'Bの入力'(Ln1,[L|R]) :- 'Bの入力'(Ln1,[],L), 'Bの入力'([_|Ln1],R). 'Bの入力'(Ln1,Ln2,[]) :- !. 'Bの入力'(Ln1,Ln2,[B|R]) :- length(Ln1,N1), length(Ln2,N2), write_formatted_atom(_催促文,'B[%t][%t]を入力してください : ',[N1,N2]), 催促付き数値入力(_催促文,B), 'Bの入力'(Ln1,[_|L2],R). 催促付き数値入力(_催促文,_値) :- write(_催促文), get_line(Line), 数値の入力診断(Line,_値),!. 催促付き数値入力(_催促文,_値) :- 催促付き数値入力(_催促文,_値). 数値の入力診断(Line,_値) :- atom_to_term(Line,_値,_), number(_値),!. 数値の入力診断(Line,_) :- write_formatted('入力された %t からは数値を得られませんでした。再入力をおねがいします。\n',[Line]), fail. '行列の和A+Bの結果を'([],[],[]) :- !. '行列の和A+Bの結果を'([Aの行|R1],[Bの行|R2],[_加算された行|R3]) :- ならび加算(Aの行,Bの行,_加算された行), '行列の和A+Bの結果を'(R1,R2,R3). 表示する([]) :- !. 表示する([L|R]) :- write_formatted('| %t %t |\n',L), 表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/137 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # # c言語の問題について # 10桁以上ある2進数をユーザに入力させ, # それを4桁ずつ区切って(16進数で)表示するプログラムを作成せよ # # 実行例です。 # H:\> prog0904 000111101001001 # 0001 = 1 # 1110 = e # 1001 = 9 # 001 = 1 # # '10桁以上ある2進数をユーザに入力させ,それを4桁ずつ区切って(16進数で)表示する' :- '10桁以上ある2進数をユーザに入力させ'(_10桁以上ある2進数), '4桁ずつ区切って(16進数で)表示する'(_10桁以上ある2進数). '10桁以上ある2進数をユーザに入力させ'(_10桁以上ある2進数) :- write('0または1が並ぶ2進数値を入力してください : \n'), get_line(Line), '10桁以上ある2進数入力診断'(Line,_10桁以上ある2進数),!. '10桁以上ある2進数をユーザに入力させ'(_10桁以上ある2進数) :- '10桁以上ある2進数をユーザに入力させ'(_10桁以上ある2進数). '10桁以上ある2進数入力診断'(Line,_10桁以上ある2進数) :- atom_length(Line,_文字列の長さ), _文字列の長さ < 10, write_formatted('入力された %t は10桁に達しません。再入力をお願いします。\n',[Line]),!, fail. '10桁以上ある2進数入力診断'(Line,_10桁以上ある2進数) :- atom_codes(Line,Codes), findall(N,( append(_,[Code|_],Codes), N is Code-48), _10桁以上ある2進数), '要素は0か1だけである'(_10桁以上ある2進数),!. '10桁以上ある2進数入力診断'(Line,_10桁以上ある2進数) :- write_formatted('入力された文字列 %t には0,1以外の文字が含まれています。再入力をお願いします。\n',[Line]), fail. '要素は0か1だけである'([]) :- !. '要素は0か1だけである'([0|R]) :- '要素は0か1だけである'(R),!. '要素は0か1だけである'([1|R]) :- '要素は0か1だけである'(R),!. '4桁ずつ区切って(16進数で)表示する'([]) :- !. '4桁ずつ区切って(16進数で)表示する'([A]) :- '16進数'([0,0,0,A]), write_formatted('%t = %t\n',[A,X]),!. '4桁ずつ区切って(16進数で)表示する'([A,B]) :- '16進数'(0,0,A,B,X), write_formatted('%t%t = %t\n',[A,B,X]),!. '4桁ずつ区切って(16進数で)表示する'([A,B,C]) :- '16進数'(0,A,B,C,X), write_formatted('%t%t%t = %t\n',[A,B,C,X]),!. '4桁ずつ区切って(16進数で)表示する'([A,B,C,D|R]) :- '16進数'(A,B,C,D,X), write_formatted('%t%t%t%t = %t\n',[A,B,C,D,X]), '4桁ずつ区切って(16進数で)表示する'(R). '16進数'(A,B,C,D,X) :- _値 is 8 * A + 4 * B + 2 * C + D, '16進数表示'(_値,X). '16進数表示'(N,X) :- N < 10, number_to_atom(N,X). '16進数表示'(10,'A'). '16進数表示'(11,'B'). '16進数表示'(12,'C'). '16進数表示'(13,'D'). '16進数表示'(14,'E'). '16進数表示'(15,'F'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/121 # # [1] 授業単元:情報 # [2] 問題文(含コード&リンク):整数i, j,実数x,y それぞれに任意の値を入力し、 # i+j, i-j, およびx+y,x/yを計算し、その結果を出力するプログラムを作成せよ # 入力にはscanf関数、出力にはprintf関数を用いること # 出力結果は # i+j=計算結果の数字 # i-j=計算結果の数字 # x*y=計算結果の数字 # x/y=計算結果の数字 # '整数i, j,実数x,y それぞれに任意の値を入力し i+j, i-j, およびx+y,x/yを計算し、その結果を出力する' :- '整数i, j,実数x,y それぞれに任意の値を入力し'(_整数i,_整数j,_実数x,_実数y), 'i+j, i-j, およびx+y,x/yを計算し'(_整数i,_整数j,_実数x,_実数y,_計算結果ならび), その結果を出力する(_計算結果ならび). '整数i, j,実数x,y それぞれに任意の値を入力し'(_整数i,_整数j,_実数x,_実数y) :- 催促付き整数入力('整数iを入力してください : ',_整数i), 催促付き整数入力('整数jを入力してください : ',_整数j), 催促付き整数入力('実数xを入力してください : ',_実数x), 催促付き整数入力('実数yを入力してください : ',_実数y),!. 'i+j, i-j, およびx+y,x/yを計算し'(_整数i,_整数j,_実数x,_実数y,_計算結果ならび) :- findall(_計算結果,( append(_,[_式|_],[_整数i+_整数j,_整数i-_整数j,_実数x*_実数y,_実数x/_実数y]), _値 is _式, write_formatted_atom(_計算結果,'%t=%t',[_式,_値])), _計算結果ならび). その結果を出力する([]) :- !. その結果を出力する([_計算結果|R]) :- write_formatted('%t\n,[_計算結果]), その結果を出力する(R). 催促付き整数入力(_催促文,_整数) :- write_formatted('%t',_催促文]), get_line(Line), 催促付き整数入力診断(Line,_整数),!. 催促付き整数入力(_催促文,_整数) :- 催促付き整数入力(_催促文,_整数). 催促付き整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 催促付き整数入力診断(Line,_整数) :- write_formatted('入力された %t から整数を得られませんでした。再入力をお願いします。\n',[Line]), fail. 催促付き実数入力(_催促文,_実数) :- write_formatted('%t',_催促文]), get_line(Line), 催促付き実数入力診断(Line,_実数),!. 催促付き実数入力(_催促文,_実数) :- 催促付き実数入力(_催促文,_実数). 催促付き実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), integer(_実数),!. 催促付き実数入力診断(Line,_実数) :- write_formatted('入力された %t から実数を得られませんでした。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/111 # # [1] 授業単元:アルゴリズム # [2] 問題文 # ・正の値をキーボードから入力。-の値の場合停止。 # ・入力された値をヒープ配列(入力された値の並びをヒープに)に格納。配列の大きさはランダムにしておく。 # そして降順に並びかえて画面に出力 # '正の値をキーボードから入力。-の値の場合停止。入力された値をヒープ配列(入力された値の並びをヒープに)に格納。配列の大きさはランダムにしておく。そして降順に並びかえて画面に出力 ' :- 配列を生成, 値をキーボードから入力(_値), '入力された値をヒープ配列(入力された値の並びをヒープに)に格納。配列の大きさはランダムにしておく。配列の大きさはランダムにしておく。'(_値). 降順に並びかえて画面に出力. '入力された値をヒープ配列(入力された値の並びをヒープに)に格納'(_負の値) :- '-の値の場合停止'(_負の値),!. '入力された値をヒープ配列(入力された値の並びをヒープに)に格納'(_正の値) :- retract(heap(L1)), append(L1,[V|R],L2), var(V), 全要素が変数でない(L1), V = _正の値, assertz(heap(L2)), 値をキーボードから入力(_値の二), '入力された値をヒープ配列(入力された値の並びをヒープに)に格納'(_値の二),!. 配列を生成 :- _要素数 is (random mod 90) + 10, length(L,_要素数), assertz(heap(L)). '-の値の場合停止'(_負の値) :- _負の値 < 0,!. '値をキーボードから入力'(_値) :- write('整数を入力してください : '), get_line(Line), 値をキーボードから入力の診断(Line,_値),!. '値をキーボードから入力'(_値) :- '値をキーボードから入力'(_値). 値をキーボードから入力の診断(Line,_値) :- atom_to_term(Line,_値,_), integer(_値),!. 値をキーボードから入力の診断(Line,_値) :- write_formatted('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '降順に並びかえて画面に出力' :- heap(L1), append(L0,[V|_],L1), var(V), 全要素が変数でない(L0), 降順に並びかえて(L0,L2), 画面に出力(L2). 全要素が変数ではない(L) :- 全要素が変数でない(L). 全要素が変数でない([]) :- !. 全要素が変数でない([A|R]) :- \+(var(A)), 全要素が変数でない(R). 降順に並びかえて(L1,L2) :- sort(L1,L3), reverse(L3,L2). 画面に出力([]) :- nl,!. 画面に出力([A|R]) :- write_formatted('%t '\n',[A]), 画面に出力(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/3 # # 1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):問い2:キーボードから入力された整数に対して「偶数なら2で割り、 # 奇数なら3倍して1加える」という作業を行いこれを結果が1になるまで繰り返すプログラムを作成し # 途中の変化の値を表示させよ # 'キーボードから入力された整数に対して「偶数なら2で割り、奇数なら3倍して1加える」という作業を行いこれを結果が1になるまで繰り返すプログラムを作成し途中の変化の値を表示させよ' :- 'キーボードから入力された整数'(_整数), 途中の変化の値を表示(_整数), 「偶数なら2で割り、奇数なら3倍して1加える」という作業を行い結果が1になるまで繰り返す(_整数),!. キーボードから入力された整数(_整数) :- write('整数を入力したください : '), get_line(Line), キーボードから入力された整数診断(Line,_整数),!. キーボードから入力された整数(_整数) :- キーボードから入力された整数(_整数). キーボードから入力された整数診断(Line,_整数) :- atom_to_integer(Line,_整数,_), integer(_整数),!. キーボードから入力された整数診断(Line,_整数) :- write_formatted('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 「偶数なら2で割り、奇数なら3倍して1加える」という作業を行い結果が1になるまで繰り返す(1) :- !. 「偶数なら2で割り、奇数なら3倍して1加える」という作業を行い結果が1になるまで繰り返す(_整数) :- 偶数(_整数), '2で割り'(_整数,_結果), 途中の変化の値を表示(偶数,_整数,'2で割り',_結果), 途中の変化の値を表示(_整数), 「偶数なら2で割り、奇数なら3倍して1加える」という作業を行い結果が1になるまで繰り返す(_結果),!. 「偶数なら2で割り、奇数なら3倍して1加える」という作業を行い結果が1になるまで繰り返す(_整数) :- 奇数(_整数), '3倍して1加える'(_整数,_結果), 途中の変化の値を表示(奇数,_整数,'3倍して1加える',_結果), 「偶数なら2で割り、奇数なら3倍して1加える」という作業を行い結果が1になるまで繰り返す(_結果). 偶数(_整数) :- 0 is _整数 mod 2. 奇数(_整数) :- 1 is _整数 mod 1. '2で割り'(_整数,_結果) :- _結果 is _整数 // 2. '3倍して1加える'(_整数,_結果) :- _結果 is _整数 * 3 + 1. 途中の変化の値を表示(_偶数または奇数,_整数,'2で割り',_結果), write_formatted('%tなら %t を %t 結果は %t\n',[_偶数または奇数,_整数,'2で割り',_結果]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/604 # # 【 課題 】label5 に,もう一つのlabel を追加し,新しいラベルに # 正解数(累積で計算),および正解率(累積で計算) # をするように改造してみよう. # 【 形態 】1. Javaアプリケーション # 【 GUI  】1. AWTのみ # 【 期限 】明日午前中 # 【 Ver  】java version "1.5.0_09" # 【 補足 】正解数と正解率のlabelは作ってあります。 # ソースです # http://ime.nu/www.dotup.org/uploda/www.dotup.org1278921.zip.html # # eclipseを使って作っているのですが、 # わからないので急ですがよろしくお願いします。 # 問(1,'17+25=?',[37,43,47],3). 問(2,日本の都道府県の数は?,[37,43,47],3). 問(3,日本一大きな湖があるのは?,[千葉,滋賀,佐賀],2). すべての問題に解答して問題数、正解数、正解率を得る(_問題数,_正解数,_正解率) :- findcount(問(_,_,_),_問題数), findcount(( for(1,_問題番号,_問題数), 問題に答える(_問題番号,_問題文,_選択文ならび,_正解,_解答), 解答診断(_選択文ならび,_正解,_解答,正解)), _正解数), _正解率 is _正解数 / _問題率 * 100,!. 問題に答える(_問題番号,_問題文,_選択文ならび,_正解,_解答) :- 問(_問題番号,_問題文,_選択文ならび,_正解), write_formatted('問題 %t \n'), 解答番号を選択する(_選択文ならび,_解答). 解答番号を選択する(_選択文ならび,_解答) :- 選択文表示([_],_選択文ならび), write('答えは? '), get_Line(Line), 解答番号を選択診断(Line,_解答),!. 解答番号を選択する(_選択文ならび,_解答) :- 解答番号を選択する(_選択文ならび,_解答). 解答番号を選択診断(Line,_解答) :- atom_to_term(Line,_解答,_), integer(_解答),!, 解答番号の範囲診断(Line,_解答). 解答番号を選択診断(Line,_解答) :- write_formatted('入力された %t は整数ではありません。再入力をお願いします。\n',[Line]), fail. 解答番号の範囲診断(_解答) :- _解答 >= 1, _解答 =< 3,!. 解答番号の範囲診断(_解答) :- write_formatted('入力された解答%tは選択番号にありません。再入力が必要です。\n',[_解答]), fail. 選択文表示(Ln,[]) :- !. 選択文表示(Ln,[_文|R]) :- length(Ln,N), write_formatted('%t .. %t\n',[N,_文]), 選択文表示([_|Ln],R). 解答診断(_選択文ならび,_正解,_正解,正解) :- write('正解です!!!\n'),!. 解答診断(_選択文ならび,_正解,_解答,不正解) :- \+(_正解=_解答), list_nth(_正解,_選択文ならび,_正解文), write_formatted('不正解です!!! 正解は %t..%t でした。\n',[_正解,_正解文]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/698 # # [1] 授業単元:コンピュータ基礎 # [2] 問題文(含コード&リンク): # キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求めるプログラムを作成せよ。 # ただし、総和を求める部分はmain関数と別の関数を作ること。(たとえばN=3とする) # (注)2次元配列の入力には注意が必要。 # scanf("%if",&x); # a[i][j] =x; # のように2段構えの入力が必要になる場合もある。 # # 'キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求める'(N,_総和) :- 'N×Nの枠を得る'(LL), 各要素に値を入力する(LL), 総和を求める(LL,_総和),!. 'N×Nの枠を得る'(LL) :- length(LL,N), findall(L,( append(_,[L|_],LL), length(L,N)), LL),!. 各要素に値を入力する(LL) :- findall(L,( append(L0,[L|_],LL), length(L0,N0), _行 is N0 + 1, 行データを得る(L)), LL),!. 行データを得る(L) :- findall(_実数,( append(L01,[_実数|_],L), length(L01,N01), _列 is N01 + 1, 実数を得る(_行,_列,_実数)), L). 実数を得る(_行,_列,_実数) :- writef('%t行,%t列の実数を入力してください : ',[_行,_列]), get_line(Line), 実数入力診断(Line,_実数),!. 実数を得る(_行,_列,_実数) :- 実数を得る(_行,_列,_実数). 実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 実数入力診断(Line,_実数) :- writef('入力された %t からは実数値を得られませんでした。再入力をお願いします。\n',[Line]), fail. 総和を求める(L,_総和) :- findsum(Sum,( append(_,[L1|_],L), sum(L1,Sum)), _総和),!. % この例のように % 行列の枠組みの生成から始まる課題では findall/3 を重ねて使用すればよい。 % Prologとはappend/3とfindall/3で書くものだ。 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/432 # # [1] 授業単元: 情報処理概論 # [2] 問題文(含コード&リンク): # 大、中、小の3 個のさいころを同時にふった時、出た目の和がm になるような目の出方をすべて求めるプログラムを作りなさい。 # ただし、m の値はキーボードから入力するものとする。表示を工夫して見やすい出力にすること。 # '大、中、小の3 個のさいころを同時にふった時、出た目の和がm になるような目の出方をすべて求めるプログラムを作りなさい。ただし、m の値はキーボードから入力するものとする。' :- 'm の値はキーボードから入力する'(_m), findall([_大の目,_中の目,_小の目],( for(1,_大の目,6), for(1,_中の目,6), for(1,_小の目,6), _m is _大の目 + _中の目 + _小の目), L), append(_,[[_大の目,_中の目,_小の目]|R],L), write_formatted('mが%2dの時、大=%t,中=%t,小=%t\n',[_m,_大の目,_中の目,_小の目]), R = []. 'm の値はキーボードから入力する'(_m) :- get_line(Line), 'm の入力診断'(Line,_m),!. 'm の値はキーボードから入力する'(_m) :- 'm の値はキーボードから入力する'(_m). 'm の入力診断'(Line,_m) :- atom_to_term(Line,_m,_), integer(_m), _m >= 3, _m =< 18,!. 'm の入力診断'(Line,_m) :- write_formatted('入力された %t からは適切な数値が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/256 # # [1] 授業単元:情報処理概論 # [2] 問題文(含コード&リンク): # つると亀が合わせてn匹います。足の数は合わせてmです。 # nとmを入力して、つると亀がそれぞれ何匹いるのか求めるプログラムを作りなさい。 # もし解がない場合は、その旨を出力するようプログラムすること。 # つると亀が合わせてn匹います。足の数は合わせてmです。nとmを入力して、つると亀がそれぞれ何匹いるのか求めるプログラムを作りなさい。 :- つると亀が合わせてn匹います(_n), 足の数は合わせてmです(_m), for(0,_つるの数,_n), for(0,_亀の数,_n), _m is 2 * _つるの数 + 4 * _亀の数, write_formatted('つるの数は %t 羽、亀の数は %t 匹です。\n',[_つるの数,_亀の数]),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% つると亀が合わせてn匹います(_つると亀が合わせてn匹) :- write('つると亀合わせて何匹いますか? : '), get_line(Line), つると亀が合わせてn匹入力の診断(Line,_つると亀が合わせてn匹),!. つると亀が合わせてn匹入力の診断(Line,_つると亀が合わせてn匹) :- atom_to_term(Line,_つると亀が合わせてn匹,_), integer(_つると亀が合わせてn匹), _つると亀が合わせてn匹 > 0,!. つると亀が合わせてn匹入力の診断(Line,_つると亀が合わせてn匹) :- write_formatted('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 足の数は合わせてmです(_足の数は合わせてm) :- write('足の数は合わせて? : '), get_line(Line), 足の数は合わせてmの診断(Line,_足の数は合わせてm),!. 足の数は合わせてmです(_足の数は合わせてm) :- 足の数は合わせてmです(_足の数は合わせてm). 足の数は合わせてmの診断(Line,_足の数は合わせてm) :- atom_to_term(Line,_足の数は合わせてm,_), integer(_足の数は合わせてm), _足の数は合わせてm >= 0,!. 足の数は合わせてmの診断(Line,_足の数は合わせてm) :- write_formatted('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/256 # # [1] 授業単元:情報処理概論 # [2] 問題文(含コード&リンク): # つると亀が合わせてn匹います。足の数は合わせてmです。 # nとmを入力して、つると亀がそれぞれ何匹いるのか求めるプログラムを作りなさい。 # もし解がない場合は、その旨を出力するようプログラムすること。 # つると亀が合わせてn匹います。足の数は合わせてmです。nとmを入力して、つると亀がそれぞれ何匹いるのか求めるプログラムを作りなさい。 :- つると亀が合わせてn匹います(_n), 足の数は合わせてmです(_m), ガウス行列に変形([[2,4,_m],[1,1,_n]],_ガウス行列), 既約ガウス行列に変形(_ガウス行列,[[_,_,_,_つるの数],[_,_,_,_亀の数]]), write_formatted('つるの数は %t 羽、亀の数は %t 匹です。\n',[_つるの数,_亀の数]),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% つると亀が合わせてn匹います(_つると亀が合わせてn匹) :- write('つると亀合わせて何匹いますか? : '), get_line(Line), つると亀が合わせてn匹入力の診断(Line,_つると亀が合わせてn匹),!. つると亀が合わせてn匹入力の診断(Line,_つると亀が合わせてn匹) :- atom_to_term(Line,_つると亀が合わせてn匹,_), integer(_つると亀が合わせてn匹), _つると亀が合わせてn匹 > 0,!. つると亀が合わせてn匹入力の診断(Line,_つると亀が合わせてn匹) :- write_formatted('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 足の数は合わせてmです(_足の数は合わせてm) :- write('足の数は合わせて? : '), get_line(Line), 足の数は合わせてmの診断(Line,_足の数は合わせてm),!. 足の数は合わせてmです(_足の数は合わせてm) :- 足の数は合わせてmです(_足の数は合わせてm). 足の数は合わせてmの診断(Line,_足の数は合わせてm) :- atom_to_term(Line,_足の数は合わせてm,_), integer(_足の数は合わせてm), _足の数は合わせてm >= 0,!. 足の数は合わせてmの診断(Line,_足の数は合わせてm) :- write_formatted('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/256 # # [1] 授業単元:情報処理概論 # [2] 問題文(含コード&リンク): # つると亀が合わせてn匹います。足の数は合わせてmです。 # nとmを入力して、つると亀がそれぞれ何匹いるのか求めるプログラムを作りなさい。 # もし解がない場合は、その旨を出力するようプログラムすること。 # 'つると亀が合わせてn匹います。足の数は合わせてmです。nとmを入力して、つると亀がそれぞれ何匹いるのか求めるプログラムを作りなさい。' :- つると亀が合わせてn匹います(_つると亀が合わせてn匹), 足の数は合わせてmです(_足の数は合わせてm), '全部亀だと考えよう。実際の足の数はそれより少ないかもしれない。この全部の中の亀一匹をつる一羽に置き換えると足が2本少なくなる。置き換えた一匹・一羽について2本づつすくなくなるということは差を2で割った数がつるの数だ'(_つると亀合わせてn匹,_足の数合わせてm,_つるの数,_亀の数), writef('つるは %t 羽、亀は %t 匹です。\n',[_つるの数,_亀の数]),!. '全部亀だと考えよう。実際の足の数はそれより少ないかもしれない。この全部の中の亀一匹をつる一羽に置き換えると足が2本少なくなる。置き換えた一匹・一羽について2本づつすくなくなるということは差を2で割った数がつるの数だ'(_つると亀合わせてn匹,_足の数合わせてm,_つるの数,_亀の数) :- '全部亀だと考えよう。'(_つると亀合わせて,_全部亀だとした場合の足の数), '実際の足の数はそれより少ないかもしれない。'(_全部亀だとした場合の足の数,_足の数合わせてm,_差), '置き換えた一匹・一羽について2本づつ少なくなるのだから、差を2で割った数がつるの数だ'(_差,_つるの数), 亀の数は(_つると亀が合わせてn匹,_つるの数,_亀の数). '全部亀だと考えよう。'(_つると亀合わせてn匹,_全部亀だとした場合の足の数) :- _全部亀だとした場合の足の数 is 4 * _つると亀合わせてn匹. '実際の足の数はそれより少ないかもしれない。'(_全部亀だとした場合の足の数,_足の数合わせてm,_差) :- _差 is _全部亀だとした場合の足の数 - _足の数合わせてm. '置き換えた一匹・一羽について2本づつ少なくなるのだから、差を2で割った数がつるの数だ'(_差,_つるの数) :- _つるの数 is _差 // 2. 亀の数は(_つると亀が合わせてn匹,_つるの数,_亀の数) :- _亀の数 is _つると亀が合わせてn匹 - _つるの数. つると亀が合わせてn匹います(_つると亀が合わせてn匹) :- write('つると亀合わせて何匹いますか? : '), get_line(Line), つると亀が合わせてn匹入力の診断(Line,_つると亀が合わせてn匹),!. つると亀が合わせてn匹入力の診断(Line,_つると亀が合わせてn匹) :- atom_to_term(Line,_つると亀が合わせてn匹,_), integer(_つると亀が合わせてn匹), _つると亀が合わせてn匹 > 0,!. つると亀が合わせてn匹入力の診断(Line,_つると亀が合わせてn匹) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 足の数は合わせてmです(_足の数は合わせてm) :- write('足の数は合わせて? : '), get_line(Line), 足の数は合わせてmの診断(Line,_足の数は合わせてm),!. 足の数は合わせてmです(_足の数は合わせてm) :- 足の数は合わせてmです(_足の数は合わせてm). 足の数は合わせてmの診断(Line,_足の数は合わせてm) :- atom_to_term(LIne,_足の数は合わせてm,_), integer(_足の数は合わせてm), _足の数は合わせてm >= 0,!. 足の数は合わせてmの診断(Line,_足の数は合わせてm) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/152 # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク): # 無限ループを用い、1〜50までの数値を任意に10個入力し、その度数分布を求めよ。但し、度数分布は5等分(例;1〜10に4個, 11〜20に3個, 21〜30・・・41〜50に0個)して表示せよ。 # '無限ループを用い、1〜50までの数値を任意に10個入力し、その度数分布を求めよ。但し、度数分布は10等分(例;1〜10に4個, 11〜20に3個, 21〜30・・・41〜50に0個)して表示せよ。' :- length(L,10), '1〜50までの数値を得る'(N), 無限ループを用い、1〜50までの数値を任意に10個入力し、(N,[],L), 度数分布を求める(L,[1-10,11-20,21-30,31-40,41-50],_度数分布ならび), 度数分布の表示(_度数分布ならび). 無限ループを用い、1〜50までの数値を任意に10個入力し、(N,L1,[N|L1]). 無限ループを用い、1〜50までの数値を任意に10個入力し、(N,L1,L) :- '1〜50までの数値を得る'(N2), 無限ループを用い、1〜50までの数値を任意に10個入力し、(N2,[N|L1],L). '1〜50までの数値を得る'(N) :- write('1〜50までの数値を入力してください : '), get_line(Line), 数値入力診断(Line,N),!. '1〜50までの数値を得る'(N) :- '1〜50までの数値を得る'(N). 数値入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 1,N =< 50,!. 数値入力診断(Line,N) :- write_formatted('入力された %t からは1〜50までの数値は得られませんでした。再入力をお願いします。\n',[Line]), fail. 度数分布を求める(L,[],[]) :- !. 度数分布を求める(L,[_階級下限-_階級上限|R1],[[_階級下限-_階級上限,_度数]|R2]) :- count((append(_,[N|_],L),N>=_階級下限,N=<_階級上限),_度数), 度数分布を求める(L,R1,R2). 度数分布の表示([]) :- !. 度数分布の表示([[_階級下限-_階級上限,_度数]|R]) :- write_formatted('%t~%t : %t\n,[_階級下限,_階級上限,_度数]), 度数分布の表示(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/93 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # # 関数int yokin(int yen, double rishi, int year)を定義しなさい。 # この関数はyen円を年利rishiの定期預金にyear年預けた後に戻ってくる金額を返す関数である。 # 引数はすべて0より大きいと仮定してよい。 # rishiは,5%の場合には0.05となる。 # 利子は端数(小数点以下の値)があったとしても切り捨てられる。 # 端数の切り捨ては,毎年行われる。 main関数は次の処理をしなさい。 # 入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。 # int yokin(int yen, double rishi, int year)を利用して,預け入れ後に受け取れる金額を出力せよ。 # # 入力例1: 10000 0.05 3 # 入力例1に対する出力:11576 # 入力例2: 10000 0.05 5 # 入力例2に対する出力:12761 # 入力例3: 10000 0.035 10 # 入力例3に対する出力:14101 # # '入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。預け入れ後に受け取れる金額を出力せよ。' :- '入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。預け入れ後に受け取れる金額を出力せよ。'(1). '入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。預け入れ後に受け取れる金額を出力せよ。'(N) :- '預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(N,_預け入れる金額を表す整数,_利子を表す実数,_年数), 預け入れ後に受け取れる金額('預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(_預け入れる金額を表す整数,_利子を表す実数,_年数,_受け取れる金額), write_formatted('入力例%tに対する出力 : %t\n',[_受け取れる金額]), N2 is N + 1, '入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。預け入れ後に受け取れる金額を出力せよ。'(N2). '預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(N,_預け入れる金額を表す整数,_利子を表す実数,_年数) :- write_formatted('入力例%t : ',[N]), get_line(Line), 入力診断(Line,_預け入れる金額を表す整数,_利子を表す実数,_年数),!. '預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(_預け入れる金額を表す整数,_利子を表す実数,_年数) :- '預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(_預け入れる金額を表す整数,_利子を表す実数,_年数). 入力診断(Line,_預け入れる金額を表す整数,_利子を表す実数,_年数) :- split(Line,[' '],[_預け入れる金額を表す整数,_利子を表す実数,_年数]), integer(_預け入れる金額を表す整数), float(_利子を表す実数), integer(_年数), _年数 > 0,!. 入力診断(Line,_預け入れる金額を表す整数,_利子を表す実数,_年数) :- write_formmated('入力された %t からは適切な値を3個取り出すことができません。\n再入力をお願いします。\n',[Line]), fail. 預け入れ後に受け取れる金額(_円,_利子,_年,_受け取れる金額) :- length(L,_年), 複利計算(_円,_利子,L,_受け取れる金額). 複利計算(_受け取れる金額,_,[],_受け取れる金額) :- !. 複利計算(_前残,_利子,[_|R],_受け取れる金額). _利息 is truncate(floor(_前残 * _利子)), _繰越 is _前残 + _利息, 複利計算(_繰越,_利子,R,_受け取れる金額). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/7 # # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示するプログラムを作成しなさい。 # ただし、文字を大文字に変換する関数を作成し、それを利用すること。 # 'キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示する' :- write('文字列を入力してください : '), 文字列の入力(Line), atom_code(Line,Codes), 文字コードを大文字に変換する(_文字列,_大文字に変換された文字コードならび), atom_codes(_大文字に変換された文字列,_大文字に変換された文字コードならび). 文字コードならびを大文字に変換する([],[]) :- !. 文字コードならびを大文字に変換する([_文字コード|R1],[_大文字コード|R2]) :- _文字コード >= 97, _文字コード =< 121, _大文字コード is _文字コード - 32, 文字コードならびを大文字に変換する(R1,R2),!. 文字コードならびを大文字に変換する([_文字コード|R1],[_文字コード|R2]) :- 文字コードならびを大文字に変換する(R1,R2). 文字列の入力(Line) :- 文字列の入力診断(Line),!. 文字列の入力(Line) :- 文字列の入力(Line). 文字列の入力診断(Line) :- atom(Line),!. 文字列の入力診断(Line) :- write_formatted('入力された %t は文字列ではありません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/7 # # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した三つの整数値の平均値を求めるプログラムを作成しなさい。 # ただし、平均値を求める関数 float ave(int a,int b) # を利用すること。 % % ave()の代わりに述語 二項平均/3 を使うこととする。 % キーボードから入力した三つの整数値の平均値を求める :- キーボードから入力した整数値(_整数の一), キーボードから入力した整数値(_整数の二), キーボードから入力した整数値(_整数の三), 三項平均を二項平均だけから求める(_整数の一,_整数の二,_整数の三,_平均値), 平均値表示(_平均値). 三項平均を二項平均だけから求める(_平均値,_平均値,_平均値,_平均値) :- !. 三項平均を二項平均だけから求める(_整数の一,_整数の二,_整数の三,_平均値) :- 二項平均(_整数の一,_整数の二,_二項平均の一), 二項平均(_整数の一,_整数の三,_二項平均の二), 二項平均(_整数の二,_整数の三,_二項平均の三), 三項平均を二項平均だけから求める(_二項平均の二,_二項平均の三,_二項平均の一,_平均値). 二項平均(_第一項,_第二項,_二項平均) :- _二項平均 is (_第一項 + _第二項) / 2. 平均値表示(_平均値) :- writef('平均値は %t です。\n',[_平均値]). キーボードから入力した整数値(_整数) :- write('整数を入力してください : '), get_line(Line), キーボードから入力した整数値診断(Line,_整数),!. キーボードから入力した整数値(_整数) :- キーボードから入力した整数値(_整数). キーボードから入力した整数値診断(Line,_整数) :- read_term_from_atom(Line,_整数,[]), integer(_整数),!. キーボードから入力した整数値診断(Line,_整数) :- writef('入力された %t からは整数は得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/7 # # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した整数値が3の倍数かどうかを表示するプログラム キーボードから入力した整数値が3の倍数かどうかを表示する :- キーボードから入力した整数値(_整数), Mod is _整数 mod 3, '3の倍数かどうか'(_整数,Mod). '3の倍数かどうか'(_整数,0) :- write_formatted('入力された %t は3の倍数です\n',[_整数]),!. '3の倍数かどうか'(_整数,_) :- write_formatted('入力された %t は3の倍数ではありません\n',[_整数]),!. キーボードから入力した整数値(_整数) :- write('整数を入力してください : '), get_line(Line), キーボードから入力した整数値診断(Line,_整数),!. キーボードから入力した整数値(_整数) :- キーボードから入力した整数値(_整数). キーボードから入力した整数値診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. キーボードから入力した整数値診断(Line,_整数) :- write_formatted('入力された %t からは整数は得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/4 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。
ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 # 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 # すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。 # 【条件】 
前半の「和を求める」繰返しは while 文、後半の「積を求める」繰返しは do-while 文を使用して作成すること。 # 【実行例】
=加算処理= # 
値:6
 # 値:8 # 
値:12
 # 値:0 # 
合計は26です。 # 
=積算処理= # 
値:2 # 
値:6 # 
値:3 # 
値:3 # 
値:0
 # 積算値は108です。 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示する :- キーボードから入力した複数個の整数の、加算, キーボードから入力した複数個の整数の、積算. キーボードから入力した複数個の整数の、加算 :- write('=加算処理= \n'), キーボードから整数を得る(_整数), 整数の加算(_整数,0,_合計), write('合計は %t です。\n',[_合計]),!. キーボードから入力した複数個の整数の、積算 :- write('=乗算処理= \n'), キーボードから整数を得る(_整数), 整数の積算(_整数,1,_積算値), write_formatted('積算値は %t です。\n',[_積算値]),!. キーボードから整数を得る(_整数) :- write('値 : '), get_line(Line), 整数診断(Line,_整数),!. キーボードから整数を得る(_整数) :- キーボードから整数を得る(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- write_formatted('入力された %t からは整数を得られません。再入力をお願いします。\n',[Line]), fail. 整数の加算(0,_合計,_合計) :- !. 整数の加算(_整数1,_合計1,_合計) :- _合計2 is _整数1 + _合計1, キーボードから整数を得る(_整数2), 整数の加算(_整数2,_合計2,_合計). 整数の積算(0,_積算値,_積算値) :- !. 整数の積算(_整数1,_積算値1,_積算値) :- _積算値2 is _整数1 * _積算値1, キーボードから整数を得る(_整数2), 整数の積算(_整数2,_積算値2,_積算値). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/939 # # [1] 授業単元:組込み工学 # [2] 問題文(含コード&リンク):入力された上位4bitと下位4bitを計算して # その結果を16進数で表すプログラムを作成せよ。 # 例として上位4bitが12、下位4bitが5のときは11と出力。 # 応用として逆転したものも作ること。 # 例として上位4bitが12、下位4bitが5のときはEEと出力。 # 入力された上位4bitと下位4bitを計算してその結果を16進数で表す :- 整数を得る(_整数), 計算時の演算子を入力してください(_演算子), 入力された上位4bitと下位4bitを計算してその結果を16進数で表す(_整数,_演算子,_16進表示), write_formatted('%t\n',[_16進表示]). 整数を得る(_整数) :- get_line(Line), 整数入力診断(Line,_整数),!. 整数を得る(_整数) :- 整数を得る(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- write_formatted('入力された %t からは整数は得られませんでした。再入力をお願いします。\n'), fail. 計算時の演算子を入力してください(_演算子) :- write('計算時の演算子を入力してください (+,-,*,//) : '), get_line(_演算子). 入力された上位4bitと下位4bitを計算してその結果を16進数で表す(_整数,_演算子,_16進表示) :- 上位4binと下位4bit(_整数,_上位ビット数,_下位4ビット数), 計算(_演算子,_上位4ビット数,_下位4ビット数,_計算結果), 計算結果の下位8ビットを16進表示に変換(_計算結果,_16進表示). 上位4binと下位4bit(_整数,_上位ビット数,_下位4ビット数) :- _上位ビット数 is _整数 >> 28, _下位4ビット数 is (_整数 << 28) >> 28,!. 計算(+,N1,N2,N) :- N is N1 + N2,!. 計算(-,N1,N2,N) :- N is N1 - N2,!. 計算(*,N1,N2,N) :- N is N1 * N2,!. 計算(//,N1,N2,N) :- N is N1 // N2,!. 計算(_演算子,_,_,_) :- write_formatted('演算子 %t は未定義です。一旦終了します。\n',[_演算子]),fail. 計算結果の下位8ビットを16進表示に変換(_計算結果,_16進表示) :- 下位8ビット以外を清算(_計算結果,_清算された下位8ビット数), 除数16の商が上位4ビット、剰余が下位4ビットとなる(_清算された下位8ビット数,_上位4ビット数,_下位4ビット数), '16進文字変換'(_下位4ビット数,_16進数下位表示), '16進文字変換'(_上位4ビット数,_16進数上位表示), concat_atom(['0x',_16進数上位表示,_16進数下位表示],_16進表示). 下位8ビット以外を清算(N,_清算された下位8ビット数) :- _清算された下位8ビット数 is (N << 24) >> 24. 除数16の商が上位4ビット、剰余が下位4ビットとなる(_清算された下位8ビット数,_上位4ビット数,_下位4ビット数) :- _上位4ビット数 is _清算された下位8ビット数 // 16, _下位4ビット数 is _清算された下位8ビット数 mod 16. '16進文字変換'(N,A) :- N < 10,Code is N + 48,char_code(A,Code),!. '16進文字変換'(10,'A'). '16進文字変換'(11,'B'). '16進文字変換'(12,'C'). '16進文字変換'(13,'D'). '16進文字変換'(14,'E'). '16進文字変換'(15,'F'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/885 # # ・キーボードから入力された2つの整数a,bに対して,aからbまでの総和を求めるプログラム # # ・二つの入力した整数値x,yのxのy乗を計算するプログラム # # ・画面に(m,n)(n=1....5,m=1....5)とその掛け算の結果を表示するプログラム # # ・画面の一行目には*を1個、二行目には2個、三行目には3個のように表示するプログラム # # 単位かかってるんだ。さっぱりわからんから頼む # # # キーボードから入力された2つの整数a,bに対して,aからbまでの総和を求める(_総和) :- 'キーボードから入力された2つの整数a,b'(_a,_b), findsum(N,( for(_a,N,_b)), _総和). 'キーボードから入力された2つの整数a,b'(_a,_b) :- キーボードから整数を入力(_a), キーボードから整数を入力(_b). キーボードから整数を入力(_整数) :- get_line(Line), キーボードからの整数入力診断(Line,_整数). キーボードから整数を入力(_整数) :- キーボードから整数を入力(_整数). キーボードからの整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. キーボードからの整数入力診断(Line,_整数) :- write_formatted('入力された %t からは整数は得られませんでした。再入力をお願いします。\n',[Line]), fail. '二つの入力した整数値x,yのxのy乗を計算する'(_x,_y,_xのy乗) :- キーボードから整数を入力(_x), キーボードから整数を入力(_y), length(Lx,_x), length(Ly,_y), '二つの入力した整数値x,yのxのy乗をならび計算する'(Lx,Ly,L), length(L,_xのy乗). '二つの入力した整数値x,yのxのy乗をならび計算する'(L1,[],[_]) :- !. '二つの入力した整数値x,yのxのy乗をならび計算する'(L1,[_],L1) :- !. '二つの入力した整数値x,yのxのy乗をならび計算する'(L1,[_|R2],L) :- '二つの入力した整数値x,yのxのy乗をならび計算する'(L1,R2,L3), append(L1,L3,L). '画面に(m,n)(n=1....5,m=1....5)とその掛け算の結果を表示する' :- for(1,_n,5), write_formatted('%t ',[_n]), for(1,_m,5), X is _m * _n, write_formatted('%t ',[X]), _m = 5, write('\n'), _n = 5. '画面の一行目には*を1個、二行目には2個、三行目には3個のように表示する' :- '一行目には*を1個表示する', '二行目には*を2個表示する', '三行目には*を3個表示する'. '一行目には*を1個表示する' :- write('*\n'). '二行目には*を2個表示する' :- write('**\n'), '三行目には*を3個表示する' :- write('***\n'), % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/781 # # こんにちは。基礎クラスで恐縮ですがよろしくお願いします。 # [1] 授業単元: C基礎 # [2] 問題文(含コード&リンク): # 問題3 キーボードから正の整数を1つ入力し、その数を二進数に変換して出力するプログラム。 # forを用いること。表示形式は任意で正しければよい。 # 例えば、2で割ったあまりと商の値によって下の桁のビットから求めるなど。 #  [3.1] Linux #  [3.2] gcc #  [3.3] C言語 # [4] 期限:11月15日 # [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) # 習ったのはfor文までで、配列などはまだ使ってません。 # # 'キーボードから正の整数を1つ入力し、その数を二進数に変換して出力する' :- 正の整数を1つ入力し(_正の整数), その数を二進数に変換して(_正の整数,_二進数ならび), concat_atom(_二進数ならび,_二進数表示), 出力する(_二進数表示). 正の整数を1つ入力し(_正の整数) :- get_line(Line), 正の整数の入力診断(Line,_正の整数),!. 正の整数を1つ入力し(_正の整数) :- 正の整数を1つ入力し(_正の整数). 正の整数の入力診断(Line,_正の整数) :- atom_to_term(Line,_正の整数,_), integer(_正の整数), _正の整数 >= 0,!. 正の整数の入力診断(Line,_正の整数) :- write_formatted('入力された %t から正の整数はえられませんでした。再入力をお願いします。\n',[Line]), fail. その数を二進数に変換して(_正の整数,_二進数ならび) :- その数を二進数に下位ビットから変換して(_正の整数,L), reverse(L,_二進数ならび). その数を二進数に下位ビットから変換して(0,[]) :- !. その数を二進数に下位ビットから変換して(N1,[Mod|R]) :- N2 is N1 // 2, Mod is M mod 2, その数を二進数に変換して(N2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/781 # # こんにちは。基礎クラスで恐縮ですがよろしくお願いします。 # [1] 授業単元: C基礎 # [2] 問題文(含コード&リンク): # 問題2 キーボードから正の整数を1つ入力しその数が素数であるかを判定するプログラムを # for文 break文などを用いて作成せよ # % http://nojiriko.asia/prolog/c140_625.html キーボードから正の整数を1つ入力しその数が素数であるかを判定する :- キーボードから正の整数を1つ入力し(_正の整数), ウィルソンの定理による素数判定(_正の整数,_診断), write_formatted('%t\n',[_診断]). 正の整数を1つ入力し(_正の整数) :- get_line(Line), 正の整数の入力診断(Line,_正の整数),!. 正の整数を1つ入力し(_正の整数) :- 正の整数を1つ入力し(_正の整数). 正の整数の入力診断(Line,_正の整数) :- atom_to_term(Line,_正の整数,_), integer(_正の整数), _正の整数 >= 0,!. 正の整数の入力診断(Line,_正の整数) :- write_formatted('入力された %t から正の整数はえられませんでした。再入力をお願いします。\n',[Line]), fail. ウィルソンの定理による素数判定(X,素数です) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod X,!. ウィルソンの定理による素数判定(X,素数ではありません) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), \+(0 is (Z + 1) mod X),!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/866 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # キーボードからONを入力すると1を、OFFを入力すると0(ゼロ)を、その他の入力ではErrorとそれぞれ表示するプログラムを作れ。 # この場合、ONとOFFは大文字、小文字、それらの混合を問わないものとする。 # # *注 # Cのライブラリ関数の中にtoupper()とtolower()という関数があり、それぞれ文字型データを引数として受け取り小文字は大文字に、大文字はそのまま(tolower()は逆)返す関数がある。 # 使い方を調べて使用せよ。   'キーボードからONを入力すると1を、OFFを入力すると0(ゼロ)を、その他の入力ではErrorとそれぞれ表示する。この場合、ONとOFFは大文字、小文字、それらの混合を問わないものとする。' :- get_line(Line), 'ONを入力すると1を、OFFを入力すると0(ゼロ)を、その他の入力ではErrorとする。この場合、ONとOFFは大文字、小文字、それらの混合を問わないものとする。'(Line,_診断), write_formatted('%t\n',[_診断]). 'ONを入力すると1を、OFFを入力すると0(ゼロ)を、その他の入力ではErrorとする。この場合、ONとOFFは大文字、小文字、それらの混合を問わないものとする。'(Line,_診断) :- この場合、ONとOFFは大文字、小文字、それらの混合を問わないものとする。'(Line,ULine), 'ONを入力すると1を、OFFを入力すると0(ゼロ)を、その他の入力ではErrorとする。'(ULine,_診断). 'ONを入力すると1を、OFFを入力すると0(ゼロ)を、その他の入力ではErrorとする。'('ON',1) :- !. 'ONを入力すると1を、OFFを入力すると0(ゼロ)を、その他の入力ではErrorとする。'('OFF',0) :- !. 'ONを入力すると1を、OFFを入力すると0(ゼロ)を、その他の入力ではErrorとする。'(_,'Error'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/780 # # よろしくお願いいたします。 # [1] 授業単元:C++言語入門 # [2] 問題文(含コード&リンク): # # ネットワークのルートアドレスとネットマスク、そしてチェックしたいIPアドレスを # 渡して、チェックしたいIPアドレスがそのネットワークに含まれているかどうかを # チェックする関数int checkIPAddress(unsigned int root,unsigned int mask,unsigned # int address)を以下のように書いた。空欄をうめよ。 # ただし、あるIPアドレスがネットワークに含まれているかどうかチェックするには、 # ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)の # ネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると # 判定します。IPアドレス中のネットワーク部は、ネットマスクのビットパターンが1である部分と # 考えます。IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクの # ビットごとのANDを取り出します。詳細はインターネットの検索エンジンで「ネットマスク」 # をキーワードに調べてください。 # # int checkIPAddress(unsigned int root,unsigned int mask,unsigned int address) # { # return(root 空欄 ゞ欄)==(root 空欄 空欄) # } # # 'ネットワークのルートアドレスとネットマスク、そしてチェックしたいIPアドレスを渡して、チェックしたいIPアドレスがそのネットワークに含まれているかどうかをチェックする。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークID,_そのネットワークに含まれているか否か) :- 'あるIPアドレスがネットワークに含まれているかどうかチェックするには、ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)のネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると判定します。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークIP,_診断). 'あるIPアドレスがネットワークに含まれているかどうかチェックするには、ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)のネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると判定します。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークIP,そのネットワークに含まれる) :- 'IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレス,_ネットマスク,_ネットワークIP), _ネットワークのルートアドレス = _ネットワークIP,!. 'あるIPアドレスがネットワークに含まれているかどうかチェックするには、ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)のネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると判定します。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークID,そのネットワークに含まれない) :- !. 'IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレス,_ネットマスク,_ネットワークIP) :- 'IPアドレスのビット'(_IPアドレス,_IPアドレスのビットならび), ネットマスクのビット(_ネットマスク,_ネットマスクのビットならび), 'IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレスのビットならび,_ネットのビットならび,_ネットワークIP). 'IPアドレスのビット'(_IPアドレス,_IPアドレスのビットならび) :- split(_IPアドレス,['.'],[N1,N2,N3,N4]), 二進ビットならびに変換(N1,N2,N3,N4,_IPアドレスのビットならび). ネットマスクのビット(_ネットマスク,_ネットマスクのビットならび) :- split(_IPアドレス,['.'],[N1,N2,N3,N4]), 二進ビットならびに変換(N1,N2,N3,N4,_ネットマスクのビットならび). 'IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレスのビットならび,_ネットのビットならび,_ネットワークIP) :- _ネットワークIPのビットならび is _IPアドレスのビットならび /\ _ネットのビットならび, ビットならびからネットワークIPを復元(L,_ネットワークIP_4byte_ならび), concat_atom(_ネットワークIP_4byte_ならび,'.',_ネットワークIP),!. ビットならびからネットワークIPを復元([],[]) :- !. ビットならびからネットワークIPを復元([_b1,_b2,_b3,_b4,_b5,_b6,_b7,_b8|R1],[V|R2]) :- V is _b1 * 128 + _b2 * 64 + _b3 * 32 + _b4 * 16 + _b5 * 8 + _b6 * 4 + _b7 * 2 + _b8, ビットならびからネットワークIPを復元(R1,R2). 二進ビットならびに変換([],[]) :- !. 二進ビットならびに変換([N|R],_二進ビットならび) :- '1byteビットならび'(N,_1byteビットならび), 二進ビットならびに変換(R,_二進ビットならび_1), append(_1bytpeビットならび,_二進ビットならび_1,_二進ビットならび). '1byteビットならび'(N,_1byteビットならび) :- '1byteビットならび_1'(N,L), reverse(L,_1byteビットならび). '1byteビットならびの一'(0,[]) :- !. '1byteビットならびの一'(N,[_b|R]) :- N2 is N // 2, _b is N mod 2, '1byteビットならびの一'(N2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/652 # # [1] プログラミング演習 # [2]非負の整数値をキーボードから入力して、その整数値から8個の数字を取り出す。 #  unsigned int型を使い、4bitごとに区切ることによって8桁分の数字を格納する。とあります。 # '非負の整数値をキーボードから入力して、その整数値から8個の数字を取り出す。 unsigned int型を使い、4bitごとに区切ることによって8桁分の数字を格納する。とあります。' :- '非負の整数値をキーボードから入力して、'(_非負の整数値), 'その整数値から8個の数字を取り出す。'(_非負の整数値,_8個の数字ならび), 'unsigned int型を使い、4bitごとに区切ることによって8桁分の数字を格納する。とあります。'(_8個の数字ならび,[28,24,20,16,12,8,4,0],_8個の数字を格納した整数). '非負の整数値をキーボードから入力して、'(_非負の整数値) :- write('非負の整数値を入力してください : '), get_line(Line), '非負の整数値入力診断'(Line,_非負の整数値),!. '非負の整数値をキーボードから入力して、'(_非負の整数値) :- '非負の整数値をキーボードから入力して、'(_非負の整数値). '非負の整数値入力診断'(Line,_非負の整数値) :- atom_to_term(Line,_非負の整数値,_), integer(_非負の整数値), _非負の整数値 >= 0,!. '非負の整数値入力診断'(Line,_非負の整数値) :- write_formatted('入力された %t からは非負の整数値は得られませんでした。再入力をお願いします。\n',[Line]), fail. 'その整数値から8個の数字を取り出す。'(_非負の整数値,_8個の数字ならび) :- number_chars(_非負の整数値,Chars), setof(A,member(A,Chars),L), length(_8個の数字ならび,8), '8個の数字を生成する'(L,_8個の数字ならび). '8個の数字を生成する'(_,[]) :- !. '8個の数字を生成する'(L,[N|R]) :- member(N,L), '8個の数字を生成する'(L,R). 'unsigned int型を使い、4bitごとに区切ることによって8桁分の数字を格納する。とあります。'([],[],0) :- !. 'unsigned int型を使い、4bitごとに区切ることによって8桁分の数字を格納する。とあります。'([N|R1],[M|R2],X) :- Y is N << M, 'unsigned int型を使い、4bitごとに区切ることによって8桁分の数字を格納する。とあります。'(R1,R2,Z), X is Y + Z. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1272006124/164 # # {if-else文} 身長と体重のデータを読み込み、下の定義から体型を判定するプログラムを作成せよ。 # # 定 義:身長h(cm),体重w(Kg)とすると # # w < (h-95)*0.82 やせすぎ(SLIM) # # w > (h-95)*1.10 ふとりすぎ(FAT) # # その中間 正常(NORMAL) # '定 義:身長h(cm),体重w(Kg)とすると w < (h-95)*0.82 やせすぎ(SLIM) w > (h-95)*1.10 ふとりすぎ(FAT) その中間 正常(NORMAL) '(_体型判定) :- 身長を読み込む(_身長), 体重を読み込む(_体重), '身長、体重から体型を判定する'(_身長,_体重,_体型判定). '身長、体重から体型を判定する'(_身長,_体重,_体型判定) :- '体重が (身長-95) * 0.82 より小さい時は'(_身長,_体重,_体型判定). '身長、体重から体型を判定する'(_身長,_体重,_体型判定) :- '体重が (身長-95) * 0.10 より大きい時は'(_身長,_体重,_体型判定). '身長、体重から体型を判定する'(_身長,_体重,_体型判定) :- 'その中間'(_身長,_体重,_体型判定). '体重が (身長-95) * 0.82 より小さい時は'(_身長,_体重,'やせすぎ(SLIM)') :- _体重 < (_身長-95) * 0.82,!. '体重が (身長-95) * 0.10 より大きい時は'(_身長,_体重,'ふとりすぎ(FAT)') :- _体重 > (_身長-95) * 1.10,!. 'その中間'(_身長,_体重,'正常(NORNAL)') :- _体重 >= (_身長-95) * 0.82, _体重 =< (_身長-95) * 1.10,!. 身長を読み込む(_身長) :- write('身長を入力してください : '), get_line(Line), 身長読み込み診断(Line,_身長),!. 身長を読み込む(_身長) :- 身長を読み込む(_身長). 身長読み込み診断(Line,_身長) :- atom_to_term(Line,_身長,_), integer(_身長), _身長 > 3,!. 身長読み込み診断(Line,_身長) :- write_formatted('入力された %t からは身長らしき値は取り出せませんでした。再入力をお願いします。\n',[Line]), fail. 体重を読み込む(_体重) :- write('体重を入力してください : '), get_line(Line), 体重読み込み診断(Line,_体重),!. 身長を読み込む(_体重) :- 体重を読み込む(_体重). 体重読み込み診断(Line,_体重) :- atom_to_term(Line,_体重,_), integer(_体重),!. 体重読み込み診断(Line,_体重) :- write_formatted('入力された %t からは体重らしき値は取り出せませんでした。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/578 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): #    # 実数を10個キーボードから入力として受け付け, # その後,最初の5個のデータの平均値,及びすべて(10個の) # データの平均値を実数値で出力しなさい。 # (この問題は配列を使用してはいけない) # # 入力例: 0.5 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5 # 入力例に対する出力: 2.500000 5.000000 注) # %fで出力の書式を指定した場合,小数点以下何桁表示されるかは処理系に依存するので気にしなくてよい。 # '実数を10個キーボードから入力として受け付け,その後,最初の5個のデータの平均値,及びすべて(10個の)データの平均値を実数値で出力しなさい。' :- rawmode, '実数を10個キーボードから入力として受け付け積算していく'(1,0.0,0.0,_最初の最初の5個のデータの平均値,_すべてのデータの平均値), write_fomatted('%f %f\n',[_最初の最初の5個のデータの平均値,_すべてのデータの平均値]), norawmode. '実数を10個キーボードから入力として受け付け積算していく'(10,S1,S2,Avg1,Avg2) :- Avg2 is S2 / 10,!. '実数を10個キーボードから入力として受け付け積算していく'(5,S1,S2,Avg1,_Avg2) :- Avg1 is S1 / 5, get_float_rawmode(_実数値), S1_2 is S1 + _実数値, S2_2 is S2 + _実数値, '実数を10個キーボードから入力として受け付け積算していく'(6,S1,S2,Avg1,Avg2). '実数を10個キーボードから入力として受け付け積算していく'(N,S1,S2,Avg1,_Avg2) :- get_float_rawmode(_実数値), S1_2 is S1 + _実数値, S2_2 is S2 + _実数値, N2 is N + 1, '実数を10個キーボードから入力として受け付け積算していく'(N2,S1,S2,Avg1,Avg2). get_float_rawmode(_実数値) :- readw(Word),  get_float診断(Word,_実数値),!. get_float_rawmode(_実数値) :- get_float_rawmode(_実数値). get_float_rawmode診断(Word,_実数値) :- atom_to_term(Word,_実数値,_), float(_実数値),!. get_float_rawmode診断(Word,_実数値) :- write_formatted('入力された%tからは実数値が得られませんでした。再入力をお願いします\n',[Word]), fail. readw(S) :- error_protect(get_code(X),X = -1), readw1(X,L,[]), name(S,L),!. readw1(10,[],[]) :- !. readw1(10,L,L2) :- !,reverse(L2,L). readw1(10,L,[13|L1]) :- !,reverse(L1,L) . readw1(32,L,L1) :- \+(L1=[]),!,reverse(L1,L). readw1(-1,L,[A|L1]) :- reverse([A|L1],L). readw1(-1,[101,110,100,95,111,102,95,102,105,108,101],L2) :- !. readw1(32,L,L1) :- L1=[],!, get_code(Y), put_code(Y), readw1(Y,L,L1). readw1(X,L,L1) :- get_code(Y),!, put_code(Y), readw1(Y,L,[X|L1]) . % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/542 # # [2] 問題文: # (1)10個の最大値を求める # 10人の身長データを順にcmで入力したとき、一番大きな身長は何僂を表示するプログラムを作成しなさい。 #    実行結果は次の形らしいです。 #    1人目の身長を入力してください (単位 : cm) # (入力待ち) # 2人目の身長を入力してください (単位 : cm) # (入力待ち) .....略..... # 10人目の身長を入力してください (単位 : cm) # (入力待ち) #    この中で身長が高い人は、○○cmです。 #  ・指定 #    for文を使い処理を10回繰り返す。 #    最大値を記憶する変数を用意し、0を代入しておく。 # # '10人の身長データを順にcmで入力したとき、一番大きな身長は何僂を表示する' :- 身長を入力する(1,_身長), 最大値を確保しながら身長を入力してもらう(1,_身長,0,_最大値), write_formatted('この中で身長が高い人は、%tcmです。',[_最大値]). 最大値を確保しながら身長を入力してもらう(10,_身長,_これまでの最大値,_身長) :- _身長 > _これまでの最大値,!. 最大値を確保しながら身長を入力してもらう(10,_身長,_これまでの最大値,_最大値) :- _身長 =< _これまでの最大値, _最大値 = _これまでの最大値,!. 最大値を確保しながら身長を入力してもらう(N,_身長1,_これまでの最大値,_最大値) :- _身長1 > _これまでの最大値, 身長を入力する(N,_身長2), N2 is N + 1, 最大値を確保しながら身長を入力してもらう(N2,_身長2,_身長1,_最大値). 最大値を確保しながら身長を入力してもらう(N,_身長1,_これまでの最大値,_最大値) :- _身長1 =< _これまでの最大値, 身長を入力する(N,_身長2), N2 is N + 1, 最大値を確保しながら身長を入力してもらう(N2,_身長2,_これまでの最大値,_最大値). 身長を入力する(N,_身長) :- write_formatted('%t人目の身長を入力してください (単位 : cm) : ',[N]), get_line(Line), 身長を入力診断(Line,_身長),!. 身長を入力する(N,_身長) :- 身長を入力する(N,_身長). 身長を入力診断(Line,_身長) :- atom_to_term(Line,_身長,_), integer(_身長), _身長 > 0,!. 身長を入力診断(Line,_身長) :- write_formatted('入力された %t からは身長らしき整数は得られませんでした。',[Line]), write('再入力をお願いします。\n'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/449 # # [1] 授業単元:cプログラミング # [2] 問題文(含コード&リンク): # キーボードから数字(2〜9)を入力し、入力された数字を辺の長さとする正方形 # を表示する。なお、入力が間違っている場合、再度入力を要求する。 # ↓こんな感じ # 実行結果例 # # 数字(2〜9)を入力してください:0 # 入力エラーです!! # 数字(2〜9)を入力してください:3 #  * * *  #   #  *   * #   #  * * * # # 'キーボードから数字(2〜9)を入力し、入力された数字を辺の長さとする正方形を表示する。なお、入力が間違っている場合、再度入力を要求する。' :- 'キーボードから数字(2〜9)を入力し、'(N), 正方形の格を変数のリストとして生成する(N,LL), 第一行を星で詰める(LL), 置換する(LL), 各行を反転しながら、変数を空白に置換して行を表示する(LL). 正方形の格を変数のリストとして生成する(N,LL) :- 星の間に空白を挿むからその分、格を拡張する(N,LL), findall(L,( append(_,[L|_],LL), length(L,N)), LL). 星の間に空白を挿むからその分、格を拡張する(N,L2) :- length(L,N), append(L,L,L2), append(L,[_],L2). 第一行を星で詰める([*]) :- !. 第一行を星で詰める([*,' '|R]) :- 第一行を星で詰める(R). 置換する(L) :- 置換(L,L). 各行を反転しながら、変数を空白に置換して行を表示する([]) :- !. 各行を反転しながら、変数を空白に置換して行を表示する([L|R]) :- reverse(L,L), 変数を要素を空白に置換する(L), concat_atom(L,A), write_formatted('%t\n',[A]), 各行を反転しながら、変数を空白に置換して行を表示する(R). 変数要素を空白に置換する([]) :- !. 変数要素を空白に置換する([' '|R]) :- 変数要素を空白に置換する(R),!. 変数要素を空白に置換する([_|R]) :- 変数要素を空白に置換する(R),!. 'キーボードから数字(2〜9)を入力し、'(N) :- write('2〜9の整数を入力してください : '), get_line(Line), 'キーボードから数字(2〜9)を入力診断'(Line,N),!. 'キーボードから数字(2〜9)を入力し、'(N) :- 'キーボードから数字(2〜9)を入力し、'(N). 'キーボードから数字(2〜9)を入力診断'(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 2, N =< 9,!. 'キーボードから数字(2〜9)を入力診断'(Line,N) :- write_formatted('入力された %t は2〜9の整数ではありませんでした\n',[Line]), write('再入力をお願いします。\n'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/449 # # [1] 授業単元:cプログラミング # [2] 問題文(含コード&リンク): # キーボードから数字(2〜9)を入力し、入力された数字を辺の長さとする正方形 # を表示する。なお、入力が間違っている場合、再度入力を要求する。 # ↓こんな感じ # 実行結果例 # # 数字(2〜9)を入力してください:0 # 入力エラーです!! # 数字(2〜9)を入力してください:3 #  * * *  #   #  *   * #   #  * * * # # 'キーボードから数字(2〜9)を入力し、入力された数字を辺の長さとする正方形を表示する。なお、入力が間違っている場合、再度入力を要求する。' :- 'キーボードから数字(2〜9)を入力し、'(N), 正方形の格を変数のリストとして生成する(N,LL), 第一行を星で詰める(LL), 置換する(LL), 各行を反転しながら、変数を空白に置換して行を表示する(LL). 正方形の格を変数のリストとして生成する(N,LL) :- 星の間に空白を挿むからその分、格を拡張する(N,N2), findall(L,( for(1,_,N2), length(L,N2)), LL). 星の間に空白を挿むからその分、格を拡張する(N,N2) :- N2 is N * 2 - 1. 第一行を星で詰める([*]) :- !. 第一行を星で詰める([*,' '|R]) :- 第一行を星で詰める(R). 置換する(L) :- 置換(L,L). 各行を反転しながら、変数を空白に置換して行を表示する([]) :- !. 各行を反転しながら、変数を空白に置換して行を表示する([L|R]) :- reverse(L,L), 変数を要素を空白に置換する(L), concat_atom(L,A), write_formatted('%t\n',[A]), 各行を反転しながら、変数を空白に置換して行を表示する(R). 変数要素を空白に置換する([]) :- !. 変数要素を空白に置換する([' '|R]) :- 変数要素を空白に置換する(A,R),!. 変数要素を空白に置換する([_|R]) :- 変数要素を空白に置換する(R),!. 'キーボードから数字(2〜9)を入力し、'(N) :- write('2〜9の整数を入力してください : '), get_line(Line), 'キーボードから数字(2〜9)を入力診断'(Line,N),!. 'キーボードから数字(2〜9)を入力し、'(N) :- 'キーボードから数字(2〜9)を入力し、'(N). 'キーボードから数字(2〜9)を入力診断'(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 2, N =< 9,!. 'キーボードから数字(2〜9)を入力診断'(Line,N) :- write_formatted('入力された %t は2〜9の整数ではありませんでした\n',[Line]), write('再入力をお願いします。\n'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/391 # # 関数A内で変数Bが一定以上の数値であるかどうかを判断(変数にはfor文で次々と値が代入されていく)し、以上なら1、以下なら0が結果として帰ってくるようにした後 # main関数内で何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込むプログラムを組んでもらえませんか? # # 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_csvファイル,_開始点,_終了点,_B,_閾値) :- tell(_csvファイル), 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_開始点,_終了点,_B,_閾値), 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_,_,_,_,_) :- told. 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_開始点,_終了点,_B,_閾値) :- var(_終了点), length(_B,_終了点), forもどきA(_開始点,N,_終了点,_B,_閾値,_A), write_formatted('%t,%t\n',[N,_A]), N = _終了点. 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_開始点,_終了点,_B,_閾値) :- \+(var(_終了点)), forもどきA(_開始点,N,_終了点,_B,_閾値,_A), write_formatted('%t,%t\n',[N,_A]), N = _終了点. forもどきA(Start,N,Max,_B,_閾値,_A) :- for(Start,N,Max), list_nth(N,_B,M), forもどきA診断(M,_閾値,_A). forもどきA診断(M,_閾値,1) :- M >= _閾値. forもどきA診断(M,_閾値,0) :- M < _閾値. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/340 # # [1] 授業単元:C言語 # # [2] 問題文:以下の課題では、main関数を求めるなど、動作が可能なプログラムにして提出すること。 # (1)3つのint型関数の最小値を返す関数を作成しなさい。 # プロトタイプは次のようになる。int min3(int x, int y, int z); # キーボードから値を 3つ入力し、これらの関数に引数で値を渡す。関数で処理した結果を表示すること。 # (2)2つの整数の和を求める関数及び差を求める関数を作成しなさい。 #   プロトタイプは次のようになる。 # int sum(int x, int y); # int diff(int x, int y); # #   キーボードから値を2つ入力し、これらの関数に引数で値を渡す。関数で処理した結果を表すこと。 # # '3つのint型関数の最小値を返す' :- '3つのint型数を得る'(_x,_y,_z), min3(_x,_y,_z,Min3), write_formatted('入力された3つの数 %t %t %t の最小値は %t です。\n',[_x,_y,_z,Min3]). min3(_x,_y,_z,Min3) :- length(Lx,_x), length(Ly,_y), length(Lz,_z), append(Lx,_,Lz), append(Lx,_,Ly), length(Lx,Min3),!. min3(_x,_y,_z,Min3) :- min3(_y,_z,_x,Min3),!. min3(_x,_y,_z,Min3) :- min3(_z,_x,_y,Min3),!. '2つの整数の和を求める' :- '2つの整数を得る'(_x,_y), sum(_x,_y,_z), write_formatted('和は %t\n',[_z]). sum(_x,_y,_z) :- \+(var(_x)), \+(var(_y)), length(Lx,_x), length(Ly,_y), append(Lx,Ly,Lz), length(Lz,_z),!. sum(_x,_y,_z) :- \+(var(_x)), \+(var(_z)), length(Lx,_x), length(Lz,_z), append(Lx,Ly,Lz), length(Ly,_y),!. sum(_x,_y,_z) :- \+(var(_y)), \+(var(_z)), length(Ly,_y), length(Lz,_z), append(Lx,Ly,Lz), length(Lx,_x),!. diff(_x,_y,_z) :- \+(var(_x)), \+(var(_y)), length(Lx,_x), length(Ly,_y), append(Ly,Lz,Lx), length(Lz,_z). '2つの整数を得る'(_x,_y) :- write('2つの整数をカンマ区切りで一行で入力してください : '), get_line(Line), '2つの整数を得るための診断'(Line,_x,_y),!. '2つの整数を得る'(_x,_y) :- '2つの整数を得る'(_x,_y). '2つの整数を得るための診断'(Line,_x,_y) :- split(Line,[','],[_x,_y]), integer(_x), integer(_y),!. '2つの整数を得るための診断'(Line,_x,_y) :- write_formatted('入力された %t からは2つの整数を得られません\n再入力をお願いします\n',[Line]), fail. '3つのint型数を得る'(_x,_y,_z) :- write('3つのint型数をカンマ区切りで一行で入力してください : '), get_line(Line), '3つのint型数を得るための診断'(Line,_x,_y,_z),!. '3つのint型数を得る'(_x,_y,_z) :- '3つのint型数を得る'(_x,_y,_z). '3つのint型数を得るための診断'(Line,_x,_y,_z) :- split(Line,[','],[_x,_y,_z]), integer(_x), integer(_y), integer(_z),!. '3つのint型数を得るための診断'(Line,_x,_y,_z) :- write_formatted('入力された %t からは3つint型数を得られません\n再入力をお願いします\n',[Line]), fail. % 以下のサイトは %%%%%%%%%%%%%%%%%%% 診断(入力検査) 詳説 %%%%%%%%%%%%%%%%%%%%%% データを入力する(_データ,_診断) :- 入力を促す, get_line(Line), 診断(Line,_データ),!. データを入力する(_データ,_診断) :- データを入力する(_データ,_診断). 診断(_文字列,_データ,_診断) :- atom_to_term(_文字列,_データ,_), 検査(_データ,_診断), 検査結果評価(_データ,_診断),!. 診断(_文字列,_データ,_) :- 再入力を求める(_文字列), fail. % 検査結果の表示は再入力を求める前の節内で行ってしまう。場合によっては 再入力を求める/1 は削除。 入力を促す :- write('データを入力してください : '). % 検査/2 の事例 検査(_データ,_診断) :- integer(_データ),_診断=0. 検査(_データ,_診断) :- atom(_データ),_診断=1. % 検査結果評価/1 の事例 検査結果評価(_データ,0) :- !. 検査結果評価(_データ,1) :- write_formatted('%t は整数データではありません',[_データ]), fail. 再入力を求める(_文字列) :- write_formatted('入力された %t は適切な値を得られませんでした。\n再入力をお願いします。\n',[_文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/250 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):正の整数をキーボードから入力し、1からその整数までの和を計算し、出力するプログラムを組みなさい # 正の整数をキーボードから入力し、1からその整数までの和を計算し、出力する :- 正の整数をキーボードから入力し(_正の整数), 1からその整数までの和を計算し(1,_正の整数,0,_和). 正の整数をキーボードから入力し(_正の整数) :- write('正の整数を入力してください : '), get_line(Line), キーボードからの入力診断(Line,_正の整数),!. 正の整数をキーボードから入力し(_正の整数) :- 正の整数をキーボードから入力し(_正の整数). キーボードからの入力診断(Line,_正の整数) :- atom_to_term(Line,_正の整数,_), integer(_正の整数), _正の整数 > 0,!. キーボードからの入力診断(Line,_正の整数) :- write_formatted('入力された %t からは正の整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 1からその整数までの和を計算し(N,_正の整数,_和,_和) :- N > _正の整数,!. 1からその整数までの和を計算し(N,_正の整数,_和_1,_和) :- _和_2 is _和_1 + 1, N_2 is N + 1, 1からその整数までの和を計算し(N_2,_正の整数,_和_2,_和). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/243 # # [1] 授業単元:プログラミング演習(テーマ:関数の使い方とデータの受け渡し方) # [2] 問題文(含コード&リンク):関数の再帰呼び出しを用いて、 # 入力した数値の階乗を求めるプログラムを作成せよ。 # また、再帰呼び出しをしない場合のプログラムも作成せよ。 # 関数の再帰呼び出しを用いて、入力した数値の階乗を求める(_入力した数値,_階乗) :- 関数の再帰呼び出しを用いて、入力した数値の階乗を求める(_入力した数値,_階乗). 関数の再帰呼び出しを用いて、入力した数値の階乗を求める(1,1). 関数の再帰呼び出しを用いて、入力した数値の階乗を求める(N,_階乗) :- N_1 is N - 1, 関数の再帰呼び出しを用いて、入力した数値の階乗を求める(N_1,_階乗_1), _階乗 is N * _階乗_1. /* 入力した数値(_入力した数値) :- write('正の整数を入力してください : '), get_line(Line), キーボードからの入力診断(Line,_入力した数値),!. 入力した数値(_正の整数) :- 入力した数値(_入力した数値). 入力した数値診断(Line,_入力した数値) :- atom_to_term(Line,_入力した数値,_), integer(_入力した数値), _入力した数値 > 0,!. 入力した数値診断(Line,_) :- write_formatted('入力された %t からは正の整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/239 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):文字列の入出力をサブルーチンとして実行する # プログラムを作成せよ。ただし、文字列の入力は複数回行うことができ、 # 1回入力するたびに入力した文字列を標準出力へ出力すること。 # %%%%%%%%%% 決定性 %%%%%%%%%%%%% 文字列の入出力をサブルーチンとして実行する(_文字列) :- get_line(_文字列), write_formatted('%t\n',[_文字列]). %%%%%%%% 繰り返し(非決定性) %%%%%%%%%% 文字列の入出力をサブルーチンとして実行する(_文字列) :- get_line(_文字列), write_formatted('%t\n',[_文字列]). 文字列の入出力をサブルーチンとして実行する(_文字列) :- 文字列の入出力をサブルーチンとして実行する(_文字列). %%%%%%%% 繰り返し(非決定性) %%%%%%%%%% 文字列の入出力をサブルーチンとして実行する(_文字列) :- repeat, get_line(_文字列), write_formatted('%t\n',[_文字列]). %%%%%%%%% 文字列データ収集(決定性) %%%%%%%% 文字列の入出力をサブルーチンとして実行する(_文字列ならび) :- get_line(_文字列), 文字列の入出力をサブルーチンとして実行する(_文字列,_文字列ならび). 文字列の入出力をサブルーチンとして実行する('end_of_file',[]) :- !. 文字列の入出力をサブルーチンとして実行する(_文字列,[_文字列|R]) :- write_formatted('%t\n',[_文字列]), get_line(_文字列2), 文字列の入出力をサブルーチンとして実行する(_文字列2,R). %%%%%%%%% 文字列データ収集(決定性) %%%%%%%% 文字列の入出力をサブルーチンとして実行する(_文字列ならび) :- findall(_文字列,( repeat, get_line(_文字列), ( _文字列=end_of_file,!,fail; write_formatted('%t\n',[_文字列]))), _文字列ならび). %%%%%%%%%% 入力データ検査の定型 %%%%%%%%%%% 文字列の入出力をサブルーチンとして実行する(_文字列,_検査結果) :- get_line(_文字列), ここに検査を入れる(_文字列,_検査結果), write_formatted('%t\n',[_文字列]),!. 文字列の入出力をサブルーチンとして実行する(_文字列,_検査結果) :- 文字列の入出力をサブルーチンとして実行する(_文字列). ここに検査を入れる(_文字列,_検査結果) :- 例えば整数検査ならば, atom_to_term(_文字列,_検査結果,_), 入力検査(_検査結果),!. ここに検査を入れる(_文字列,_検査結果) :- 再入力を求める(_文字列), fail. 再入力を求める(_文字列) :- write_formatted('入力された %t は適切な値を得られませんでした。\n再入力をお願いします。\n',[_文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/238 # # ../test/read.cgi/tech/1288531658/236 # すいません、テンプレでも書いておきます # # [1] 授業単元:情報 # [2] 問題文(含コード&リンク):キーボードから入力された正の整数xに対して、2^n < x を満たす最も大きな整数nを求めるプログラムをwhile分を用いて書きなさい # 'キーボードから入力された正の整数xに対して、2^n < x を満たす最も大きな整数nを求める' :- キーボードから入力された正の整数(_x), '2^n < x を満たす最も大きな整数nを求める'(_x,_n), write_formatted('キーボードから入力された正の整数x=%t に対して、2^n < x を満たす最も大きな整数nは %t\n',[_x,_n]). キーボードから入力された正の整数(_x) :- write('正の整数を入力してください : '), get_line(Line), キーボードから入力された値の診断(Line,_x),!. キーボードから入力された正の整数(_x) :- キーボードから入力された正の整数(_x). キーボードから入力された値の診断(Line,_x) :- atom_to_term(Line,_x,_), integer(_x), _x > 0,!. キーボードから入力された値の診断(Line,_x) :- write('入力された %t は正の整数ではありません。再入力をお願いします。\n',[Line]), fail. '2^n < x を満たす最も大きな整数nを求める'(_x,0) :- _x =< 2,!. '2^n < x を満たす最も大きな整数nを求める'(_x,_n) :- _x_2 is _x // 2, '2^n < x を満たす最も大きな整数nを求める'(_x_2,_n_2), _n is _n_2 + 1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/843 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 問題3 # 整数を1つ読み込んで、その値が、1 の時は 「 Go! 」 、 2または3の時、「 Slow ! 」 、 それ以外の時「 Stop! 」と表示するプログラムを 作成しなさい。 # '整数を1つ読み込んで、その値が、1 の時は 「 Go! 」 、 2または3の時、「 Slow ! 」 、 それ以外の時「 Stop! 」と表示する' :- 整数を1つ読み込んで(_整数), 表示する文字列(_整数,_表示文字列), write(_表示文字列). 整数を1つ読み込んで(_整数) :- write('整数を入力してください : '), get_line(Line), 整数を1つ読み込んでの診断(Line,_整数),!. 整数を1つ読み込んで(_整数) :- 整数を1つ読み込んで(_整数). 整数を1つ読み込んでの診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数を1つ読み込んでの診断(Line,_整数) :- write_formatted('入力された %t からは整数が得られませんでした。再入力をお願いします\n'), fail. 表示する文字列(1,'Go!'). 表示する文字列(2,'Slow!'). 表示する文字列(N,'Stop!') :- \+(N==1), \+(N==2). % 以下のサイトは # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク):0から1024の間の数値を繰り返し入力して # 入力回数、最大値、最小値を求めるプログラムを作成せよ。 # 範囲外の数値が入力されたとき終了する。 # 範囲外の数値は入力回数、最大値、最小値には含めない。 # 最初の入力で範囲外の数が入力された場合は 入力回数0 とのみ表示する '0から1024の間の数値を繰り返し入力して入力回数、最大値、最小値を求める' :- '数値を入力'(_数値), '0から1024の間の数値を繰り返し入力して(範囲外の数値が入力されたとき終了する)'(_数値,0,_繰り返し回数,_数値,_最大値,数値,_最小値). '0から1024の間の数値を繰り返し入力して(範囲外の数値が入力されたとき終了する)'(_数値,_繰り返し回数,_繰り返し回数,_最大値,_最大値,最小値,_最小値) :- 数値が範囲外(_数値),!. '0から1024の間の数値を繰り返し入力して(範囲外の数値が入力されたとき終了する)'(_数値,_繰り返し回数,_繰り返し回数,_最大値,_最大値,最小値,_最小値) :- 数値が範囲外(_数値),!. '0から1024の間の数値を繰り返し入力して(範囲外の数値が入力されたとき終了する)'(_数値,_繰り返し回数1,_繰り返し回数,_最大値1,_最大値,最小値1,_最小値) :- _数値 > _最大値1, _繰り返し回数2 is _繰り返し回数1 + 1, '数値を入力'(_数値2), '0から1024の間の数値を繰り返し入力して(範囲外の数値が入力されたとき終了する)'(_数値2,_繰り返し回数2,_繰り返し回数,_数値,_最大値,_最小値1,_最小値),!. '0から1024の間の数値を繰り返し入力して(範囲外の数値が入力されたとき終了する)'(_数値,_繰り返し回数1,_繰り返し回数,_最大値1,_最大値,最小値1,_最小値) :- _数値 < _最小値1, _繰り返し回数2 is _繰り返し回数1 + 1, '数値を入力'(_数値2), '0から1024の間の数値を繰り返し入力して(範囲外の数値が入力されたとき終了する)'(_数値2,_繰り返し回数2,_繰り返し回数,_最大値1,_最大値,_数値,_最小値),!. '0から1024の間の数値を繰り返し入力して(範囲外の数値が入力されたとき終了する)'(_数値,_繰り返し回数1,_繰り返し回数,_最大値1,_最大値,最小値1,_最小値) :- _繰り返し回数2 is _繰り返し回数1 + 1, '数値を入力'(_数値2), '0から1024の間の数値を繰り返し入力して(範囲外の数値が入力されたとき終了する)'(_数値2,_繰り返し回数2,_繰り返し回数,_最大値1,_最大値,_最小値1,_最小値),!. 数値を入力(_数値) :- write('数値を入力してください : '), get_integer(Line), 数値を入力の診断(Line,_数値),!. 数値を入力(_数値) :- 数値を入力(_数値). 数値を入力の診断(Line,_数値) :- atom_to_term(Line,_数値,_), number(_数値),!. 数値を入力の診断(Line,_数値) :- write_formatted('入力された %t は数値ではありません。\n再入力をお願いします。\n',[Line]), fail. 数値が範囲外(_数値) :- _数値 > 1024. 数値が範囲外(_数値) :- _数値 < 0. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/672 # # [1] 授業単元:コンピュータ工学 # [2] 問題文(含コード&リンク): # 入力した値を一桁ずつ足してその合計を表示させよ。 # サンプル # input please→31415 # 3 + 1 + 4 + 1 + 5 = 14 # ルール: # stdio以外使わないこと。 # 配列、シフト演算子、ポインタは使わないこと。 # 数字の表示はprintfとし、%c %dしか使ってはいけない。 # 負の数が入力されるまで、入力の動作を繰り返すようにすること。 # 入力した値を一桁ずつ足してその合計を表示する :- '入力した値を'(_入力した値), 一桁ずつ足してその合計を表示する(_入力した値). '入力した値を'(_入力した値) :- write('整数を入力してください : '), get_line(Line), 入力した値の診断(Line,_入力した値),!. 入力した値の診断(Line,_入力した値) :- atom_to_term(Line,_入力した値,_), integer(_入力した値),!. 入力した値の診断(Line,_入力した値) :- write_formatted('入力された %t は適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 一桁ずつ足してその合計を表示する(_入力した値) :- _入力した値 < 0,!. 一桁ずつ足してその合計を表示する(_入力した値) :- '10の何乗以上か'(0,_入力した値,_10の何乗以上), 一桁ずつ足してその合計を表示する(_10の何乗以上,_入力した値,0), 入力した値を(_入力した値の二), 一桁ずつ足してその合計を表示する(_入力した値の二). 一桁ずつ足してその合計を表示する(0,N,_合計) :- write_formatted('%d = %d\n',[N,_合計]),!. 一桁ずつ足してその合計を表示する(M,N,_合計の一) :- J is truncate(10 ^ M), N1 is N // J, N2 is N mod J, M1 is M - 1, write_formatted('%d + ',[N1]), _合計の二 is _合計の一 + N1, 一桁ずつ足してその合計を表示する(M1,M2,_合計の二). '10の何乗以上か'(M,N,M) :- M2 is M + 1, N < truncate(10 ^ M2),!. '10の何乗以上か'(M1,N,M) :- M2 is M1 + 1, '10の何乗以上か'(M2,N,M). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/654 # # キーボードにより配列へデータを入力させ, # その配列データの数値の平均を関数 mean() に # より計算させたい. # 以下の条件を満たしたプログラムを作成せよ. # ただし,関数 mean() は,引数なし,戻り値なしとする. # void mean(void) # { # } # 「ヒント」 # 1)本プログラムのどこかに、「double data[100];」を宣言しておく。 # 2)本プログラムのどこかに「double heikin;」と「int kosuu;」を宣言しておく。 # 3)main 関数内で,配列data[] へ入力したいデータの個数 kosuu をキーボード入力させる. # 4)main 関数内で,double型配列 data[]にキーボードで数値を入力させる. # 5)関数 mean() の内部で 配列 data[]の値の平均を計算させる. # 6)main 関数内で,関数 mean()で計算した結果をprintfで表示させる # */ # #include<stdio.h> # int main(void) # { # int i; # printf("データ個数(100個以下):"); # scanf("%d",&kosuu); # printf("平均値=%d\n",heikin); # return (0); # } # /* 平均値を計算する関数 */ # void mean(void) # { # } # これどうやるの? # %  % 先に変数リストの枠(_data)があって、一引数で処理していくことを試みたのだが、 % 後半、変数要素を表示させたくはないため、苦しい展開となった。 % _kosu分入力して、まだ_dataに変数要素の余りがある場合、そこで切り捨てる方がいいのだろう。 % そうすれば、変数が現れたら平均計算を終了するというような、尋常でない条件が必要なくなる。 % ただし、 % length(L0,_kosu),append(L0,_,_data), で表示には _data0 を使う必要がある。 % _kosuが100を越えていることもありうるからその点に注意して定義しなくてはならない。 data([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]). 'キーボードにより配列へデータを入力させ,その配列データの数値の平均を関数mean()により計算させる' :- 個数を入力する(_kosu), data(_data), キーボードにより配列へデータを入力させ'(_kosu,_data), 'その配列データの数値の平均を関数mean()により計算させる'(_kosu,_data,_平均), 入力されたデータならびと平均を表示する(_data,_平均). 個数を入力する(_kosu) :- write('個数を入力してください : '), get_line(Line), 個数入力診断(Line,_kosu),!. 個数を入力する(_kosu) :- 個数を入力する(_kosu). 個数入力診断(Line,_kosu) :- atom_to_term(Line,_kosu,_), integer(_kosu), _kosu > 0, _kosu =< 100,!. 個数入力診断(Line,_kosu) :- write_formatted('入力された %t からは適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. キーボードにより配列へデータを入力させ(0,_) :- !. キーボードにより配列へデータを入力させ(_,[]) :- !. キーボードにより配列へデータを入力させ(_kosu,[_データ要素|R]) :- データを入力する(_データ要素), _kosu1 is _kosu - 1, キーボードにより配列へデータを入力させ(_kosu1,R). mean(_data,_要素数,_平均) :- mean(_data,_要素数,0,_平均). mean([V|_],_要素数,Sum,_平均) :- var(V), _平均 is Sum / _要素数,!. mean([],_要素数,Sum,_平均) :- _平均 is Sum / _要素数,!. mean([V|R],_要素数,Sum1,_平均) :- Sum2 is Sum1 + V, mean(R,_要素数,Sum2,_平均). 入力されたデータならびと平均を表示する(_data,_平均) :- 変数要素が現れたら以下のならびを切り捨てる(_data,_data2), concat_atom(_data2,' ',_入力データ表示), write_formatted('入力された %t の平均は %t です\n',[_入力データ表示,_平均]). 変数要素が現れたら以下のならびを切り捨てる([],[]) :- !. 変数要素が現れたら以下のならびを切り捨てる([V|R1],[]) :- var(V),!. 変数要素が現れたら以下のならびを切り捨てる([A|R1],[A|R2]) :- \+(var(A)), 変数要素が現れたら以下のならびを切り捨てる(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/628 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク) # 問題2 キーボードから整数を1つ入力し、その度にそれまでの合計値を表示するプログラムを作成せよ。 キーボードから整数を1つ入力し、その度にそれまでの合計値を表示する(_合計値) :- キーボードから整数を1つ入力し(_整数), キーボードから整数を1つ入力し、その度にそれまでの合計値を表示する(_整数,_整数,_合計値). キーボードから整数を1つ入力し、その度にそれまでの合計値を表示する(_整数,_合計値,_合計値). キーボードから整数を1つ入力し、その度にそれまでの合計値を表示する(_,_合計値1,_合計値) :- キーボードから整数を1つ入力し(_整数), _合計値2 is _整数 + _合計値1, キーボードから整数を1つ入力し、その度にそれまでの合計値を表示する(_整数2,_合計値2,_合計値). キーボードから整数を1つ入力し(_整数) :- get_line(Line), キーボードから整数入力診断(Line,_整数),!. キーボードから整数を1つ入力し(_整数) :- キーボードから整数を1つ入力し(_整数). キーボードから整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. キーボードから整数入力診断(Line,_整数) :- write_formatted('入力された %t からは整数が得られませんでした\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/593 # # [1] 授業単元:プログラム実習 # [2] 問題文(含コード&リンク):nとrを入力して # 順列 nPr と組み合わせ nCr を表示するものを作成すること。 # 'nとrを入力して 順列 nPr と組み合わせ nCr を表示する' :- nとrを入力して(_n,_r), '順列 nPr と組み合わせ nCr を表示する'(_n,_r). nとrを入力して(_n,_r) :- nの入力(_n), rの入力(_r),!. 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) :- write_formatted('入力された %t からは適切な整数nが得られませんでした\n再入力をお願いします\n',[Line]), fail. rの入力(_r) :- write(r : ), get_lire(Line), rの入力診断(Line,_r),!. rの入力(_r) :- rの入力(_r). rの入力診断(Line,_r) :- atom_to_term(Line,_r,_), irteger(_r), _r > 0,!. rの入力診断(Line,_r) :- write_formatted('入力された %t からは適切な整数rが得られませんでした\r再入力をお願いします\r',[Line]), fail. '順列 nPr と組み合わせ nCr を表示する'(_n,_r) :- nPr(_n,_r,X), nCr(_n,_r,Y), write_formatted('n=%t,r=%tの時の nPr=%t\nn=%t,r=%tの時の nCr=%t\n',[_n,_r,X,_n,_r,Y]). nPr(N,R,X) :- M is N - R + 1, 階乗(M,N,X). nCr(N,R,X) :- U is N - R + 1, 階乗(U,N,K1), 階乗(R,K2), X is K1 // K2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/585 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):入力された"short型"変数を # 2進数で表示するプログラムを作って提出せよ。 # 入力された値までの2進数は全て表示すること # 下にサンプルを記しておく。 # input>5 # 0:0 # 1:1 # 2:10 # 3:11 # 4:100 # 5:101 # # '入力された"short型"変数を2進数で表示するプログラムを作って提出せよ。入力された値までの2進数は全て表示すること' :- 整数の入力(N), for(0,M,N), '2進数として表示'(M,_2進数表示), write_formatted('%t:%t\n',[M,_2進数表示), M = N. 整数の入力(N) :- write('整数を入力してください : '), get_line(Line), 整数入力の診断(Line,N),!. 整数の入力(N) :- 整数の入力(N). 整数入力の診断(Line,N) :- atom_to_term(Line,N,_), integer(N), N > 0,!. 整数入力の診断(Line,N) :- write_formatted('入力された %t から適切な整数を得られませんでした\n再入力をお願いします\n',[Line]), fail. '2進数として表示'(N,_2進数表示) :- '10進数から反転したビットならびを得る'(N,_反転したビットならび), reverse(_反転したビットならび,_ビットならび), concat_atom(_ビットならび,_2進数表示). '10進数から反転したビットならびを得る'(0,[]) :- !. '10進数から反転したビットならびを得る'(N,[M|R]) :- M is N mod 2, N2 is N // 2, '10進数から反転したビットならびを得る'(N2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/455 # # [1]授業単元 情報処理 # [2]問題文 大きさを入力して、半角文字*を使い、Xを描く。大きさは # Xの縦と横の半角文字数である。 # [3]環境 # [3-1]os: windows7 # [3-2]コンパイラ名とバージョン:visualstdio2008 # [3-3]C言語 # [4]期限 2010/10/22 # [5]繰り返し文までしか習っていません。 # if文とfor文で書くこととのことです。おねがいいたします。さっぱりわかりません。 # '大きさを入力して、半角文字*を使い、Xを描く。大きさはXの縦と横の半角文字数である。' :- '3以上の奇数を得る'(_大きさ), for(1,N,_大きさ), 一行描く(N,_大きさ), N = _大きさ. '3以上の奇数を得る'(_大きさ) :- write('大きさを3以上の奇数で入力してください : '), get_line(Line), 診断(Line,_大きさ),!. '3以上の奇数を得る'(_大きさ) :- '3以上の奇数を得る'(_大きさ). 診断(Line,_大きさ) :- atom_to_term(Line,_大きさ,_), integer(_大きさ), 大きさ>=3, 奇数(_大きさ),!. 診断(Line,_大きさ) :- write_formatted('入力された %t からは3以上の奇数は得られませんでした。再入力をお願いします。\n'), fail. 一行描く(N,_大きさ) :- 一行分の枠を作る(_大きさ,L), M is _大きさ - N + 1, list_nth(N,L,'*'), list_nth(M,L,'*'), 変数をスペースで埋める(L), concat_atom(L,S), write_formatted('%t\n',[S]),!. 一行分の枠を作る(_大きさ,L) :- length(L,_大きさ). 変数をスペースで埋める([]) :- !. 変数をスペースで埋める([V|R]) :- var(V), V = ' ', 変数をスペースで埋める(R),!. 変数をスペースで埋める([A|R]) :- \+(var(V)), 変数をスペースで埋める(R),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/290 # # [1] 授業単元:C言語基礎実習 # [2] 問題文(含コード&リンク):三つの数値を入力して昇順に並べ替えるプログラムを作成しなさい。 # ただし、並べ替えの処理は関数「void sort(int *n1,int *n2,int *n3)」 # というものを作って処理すること # # 三つの数値を入力して昇順に並べ替える :- 数値入力(N1), 数値入力(N2), 数値入力(N3), sort(N1,N2,N3,L), write_formatted('%t,%t,%t -> %t,%t,%t\n',[N1,N2,N3|L]). sort(N1,N2,N3,[N1,N2,N3]) :- N1 =< N2, N2 =< N3,!. sort(N1,N2,N3,L) :- N2 < N1, sort(N2,N1,N3,L),!. sort(N1,N2,N3,L) :- N3 < N2, sort(N1,N3,N2,L),!. 数値入力(I) :- write('数を入力してください(終了するには0未満の数を入力) : '), get_line(Line), 数値入力診断(Line,I),!. 数値入力(I) :- 数値入力(I). 数値入力診断(Line,I) :- atom_to_term(Line,I,_),number(I),!. 数値入力診断(Line,I) :- write_formatted('入力された %t から適切な数が得られませんでした\n再入力をお願いします\n',[Line]),fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/228 # # 【質問テンプレ】 # [1] 授業単元: # [2] 問題文(含コード&リンク): # # 角度thetaを媒介変数として,(x,y)を計算してください. # thetaは0度から360度まで変化させた場合の(x,y)を出力せよ。 # # x=acosθ  # y=bsin(θ+α) # # ともうひとつ。 # # 「個体群動態で N(t+dt) - N(t) = (r - hN(t)) N(t) として,rを増 殖率,hをこみあいの効果とする。 # 適当な,N(0) r, h を与えて, N(t) の変化を示しなさい。 # '「個体群動態で N(t+dt) - N(t) = (r - hN(t)) N(t) として,rを増殖率,hをこみあいの効果とする。適当な,N(0) r, h を与えて,N(t) の変化を示しなさい。' :- '適当なN(0),r,h,tmax'(_N_0,_r,_h,_tmax), 'N(t) の変化'(_N,0,_tmax,_r,_h,X), write_formatted('(t:%t) : (N(t):%t)\n',[_N,X]), 'N(t) の変化'(_N,_t1,_tmax,_r,_h,_N) :- _t1 < _tmax. 'N(t) の変化'(_N1,_t1,_tmax,_r,_h,X) :- _t1 < tmax, _N2 is _N1 + ((_r - _h * _N1) * _N1), _t2 is _t1 + 1, 'N(t) の変化'(_N2,_t2,_tmax,_r,_h,X). '適当なN(0),r,h,tmax'(_N_0,_r,_h,_tmax) :- write('N(0)の値を入力してください : '), 数値入力(_N_0), write('増殖率 _r を入力してください : '), 数値入力(_r), write('こみあいの効果 _h を入力してください : '), 数値入力(_h), write('時間 _t の max値 を入力したください : '), 数値入力(_tmax),!. 数値入力(I) :- get_line(Line), 数値入力診断(Line,I),!. 数値入力(I) :- 数値入力(I). 数値入力診断(Line,I) :- atom_to_term(Line,I,_),number(I),!. 数値入力診断(Line,I) :- write_formatted('入力された %t から適切な数が得られませんでした\n再入力をお願いします\n',[Line]),fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/216 # # [1] 授業単元:C言語基礎実習 # [2] 問題文(含コード&リンク):0未満の数が入力されるまで # 入力を求め、その入力した回数と入力した数値の最大値と最小値を表示するプログラムを作成しなさい。 # なお、0未満の数は回数と最大値、最小値に含めないものとする。 # また、0未満の値の入力だけで終わった場合は最大値、最小値は表示しない。 # # [5] その他の制限:最大値、最小値についてはそれぞれ関数を作って作成すること # '0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の最大値と最小値を表示するプログラムを作成しなさい。なお、0未満の数は回数と最大値、最小値に含めないものとする。また、0未満の値の入力だけで終わった場合は最大値、最小値は表示しない。' :- 数の入力(N), N >= 0, '0未満の数が入力されるまで入力を求め、その入力した回数を得る'(N,_回数,_入力された数ならび), _入力された数ならび = [A|R]), 最大値(R,A,_最大値), 最小値(R,A,_最小値), write_formatted('入力された回数は %t,最大値は %t,最小値は %tです\n',[_回数,_最大値,_最小値]),!. '0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の最大値と最小値を表示するプログラムを作成しなさい。なお、0未満の数は回数と最大値、最小値に含めないものとする。また、0未満の値の入力だけで終わった場合は最大値、最小値は表示しない。' . '0未満の数が入力されるまで入力を求め、その入力した回数を得る'(N,_回数,_回数,[]) :- N < 0,!. '0未満の数が入力されるまで入力を求め、その入力した回数を得る'(N,_回数1,_回数,[N|R]) :- N >= 0, _回数2 is _回数1 + 1, 数の入力(N2), '0未満の数が入力されるまで入力を求め、その入力した回数を得る'(N2,_回数2,_回数,R). 最大値([],_最大値,_最大値) :- !. 最大値([N|R],_最大値1,_最大値) :- N > _最大値1, 最大値(R,N,_最大値). 最大値([N|R],_最大値1,_最大値) :- N =< _最大値1, 最大値(R,_最大値1,_最大値). 最小値([],_最小値,_最小値) :- !. 最小値([N|R],_最小値1,_最小値) :- N < _最小値1, 最小値(R,N,_最小値). 最小値([N|R],_最小値1,_最小値) :- N >= _最小値1, 最小値(R,_最小値1,_最小値). 数の入力(N) :- write_formatted('数を入力してください(0未満を入力すると終了となります) : '), get_line(Line), 数入力の診断(Line,N),!. 数の入力(N) :- write_formatted('入力された %t から適切な数を得られませんでした。再入力をお願いします\n',[Line]), fail. 数入力の診断(Line,N) :- atom_to_term(Line,N,_), number(N),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/79 # # [1] 授業単元:C言語基礎実習 # [2] 問題文(含コード&リンク):入力された数値を逆順に表示せよ。 # なお、この動作は0未満の値が入力されるまで 繰り返すものとする。 # # '入力された数値を逆順に表示せよ。なお、この動作は0未満の値が入力されるまで 繰り返すものとする。' :- 数の入力(_数値), number_chars(_数値,_数値文字ならび), reverse(_数値文字ならび,_逆順にされた数値文字ならび), concat_atom(_逆順にされた数値文字ならび,_逆順にした数値表現), write_formatted('%t\n',[_逆順にした数値表現]),!. 数の入力(I) :- write('数を入力してください(終了するには0未満の数を入力) : '), get_line(Line), 数の入力診断(Line,I),!. 数の入力(I) :- 数の入力(I). 数の入力診断(Line,I) :- atom_to_term(Line,I,_),number(I),!. 数の入力診断(Line,I) :- write_formatted('入力された %t から適切な数が得られませんでした\n再入力をお願いします\n',[Line]),fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/73 # # [1] 授業単元:C言語基礎実習 # [2] 問題文(含コード&リンク):0未満の数が入力されるまで # 入力を求め、その入力した回数と入力した数値の合計値を表示するプログラムを作成しなさい。 # なお、0未満の数は回数と合計値に含めないものとする。 # '0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の合計値を表示する' :- '0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の合計値を表示する'(_入力した回数,_合計値), write_formatted('入力した回数 = %t, 合計値 = %t\n',[_入力した回数,_合計値]),!. '0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の合計値を表示する'(_入力した回数,_合計値) :- 数の入力(I), '0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の合計値を表示する'(I,_入力した回数,_合計値). '0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の合計値を表示する'(J,0,0) :- J < 0,!. '0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の合計値を表示する'(J,_回数,_合計値) :- 数の入力(I), '0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の合計値を表示する'(I,_回数_1,_合計値_1), _回数 is _回数_1 + 1, _合計値 is _合計値_1 + J. 数の入力(I) :- write('数を入力してください(終了するには0未満の数を入力) : '), get_line(Line), 数の入力診断(Line,I),!. 数の入力(I) :- 数の入力(I). 数の入力診断(Line,I) :- atom_to_term(Line,I,_),number(I),!. 数の入力診断(Line,I) :- write_formatted('入力された %t から適切な数が得られませんでした\n再入力をお願いします\n',[Line]),fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/921 # # 質問にきましたお邪魔します。 # [1] Cプログラミング # [2] 問題文(含コード&リンク): 数問あるのでリンクからお願いします。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10941.txt # # # 問2.  キーボードから実数を1つ入力。10倍した数の整数部だけをint型の変数に代入して表示するプログラム。 # //int型の変数に〜というのがよくわからなかったです # 'キーボードから実数を1つ入力。10倍した数の整数部だけをint型の変数に代入して表示する' :- 実数を得る(_実数), _10倍した数の整数部 is truncate(_実数 * 10), write_formatted('10倍した数の整数部は %t です\n',[_10倍した数の整数部]). 実数を得る(N) :- write('実数を入力してください : '), get_line(Line), 実数を得るための診断(Line,V),!. 実数を得る(V) :- 実数を得る(V). 実数を得るための診断(Line,V) :- atom_to_term(Line,V,_), float(N),!. 実数を得るための診断(Line,N) :- write_formatted('%t からは実数を得ることができません\n再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/921 # # 質問にきましたお邪魔します。 # [1] Cプログラミング # [2] 問題文(含コード&リンク): 数問あるのでリンクからお願いします。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10941.txt # # # 問1. 3つの整数をキーボードから入力しその最大値を画面に表示するプログラム。 # '3つの整数をキーボードから入力しその最大値を画面に表示する' :- 整数を得る(N1), 整数を得る(N2), 整数を得る(N3), append(L0,[N|R],[N1,N2,N3]), append(L0,R,[M1,M2]), _最大値 >= M1, _最大値 >= M2, write_formatted('最大値は %t です\n',[_最大値]). 整数を得る(N) :- write('整数を入力してください : '), get_line(Line), 整数を得るための診断(Line,N),!. 整数を得る(N) :- 整数を得る(N). 整数を得るための診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数を得るための診断(Line,N) :- write_formatted('%t からは整数を得ることができません\n再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/822 # # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): # 整数値を読み込んで、その絶対値を表示するプログラムを作成せよ。 # 整数値を読み込んで、その絶対値を表示する :- 整数値を読み込んで(_整数値), _絶対値 is abs(_整数値), write_formatted('入力された値 %t の 絶対値は %t です\n',[_整数値,_絶対値]). 整数値を読み込んで(_整数値) :- write('整数を入力してください : '), get_line(Line), 診断(Line,_整数値),!. 整数値を読み込んで(_整数値) :- 整数値を読み込んで(_整数値). 診断(Line,_整数値) :- atom_to_term(Line,_整数値,_), integer(_整数値),!. 診断(Line,_整数値) :- write_formatted('入力された %t からは整数が得られません\n再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/800 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク):入力された1〜2010の範囲において閏年を判断するプログラムを作成せよ。 # 閏年の場合、閏年と表示。 # 閏年でない場合、平年と表示。 # 1〜2010の範囲外であるときは判定不可と表示するようにする。 # ルール: # 入力された値が4の倍数のとき、あるいは400の倍数のときは閏年であり、 # 入力された値が100の倍数のとき(100,200,300,500・・・など)は閏年ではない。 # # '入力された1〜2010の範囲において閏年を判断する' :- '1〜2010の範囲の値を入力する'(_値), '閏年の場合、閏年と表示。閏年でない場合、平年と表示。'(_値). '1〜2010の範囲の値を入力する'(_値) :- get_line(Line), 診断(Line,_値),!. '1〜2010の範囲の値を入力する'(_値) :- '1〜2010の範囲の値を入力する'(_値). 診断(Line,_値) :- atom_to_term(Line,_値,_), integer(_値),!. 診断(Line,_値) :- write_formatted('入力された %t は整数ではありません\n再入力をお願いします\n',[Line]). '閏年の場合、閏年と表示。閏年でない場合、平年と表示。'(_値) :- '閏年の場合、閏年と表示。閏年でない場合、平年と表示。'(_値,_閏年か平年か), write_formatted('%t\n',[_閏年か平年か]), '閏年の場合、閏年と表示。閏年でない場合、平年と表示。'(_値,判定不可) :- \+((_値 >= 0,_値 =< 2010)),!. '閏年の場合、閏年と表示。閏年でない場合、平年と表示。'(_値,閏年) :- 閏年(_値),!. '閏年の場合、閏年と表示。閏年でない場合、平年と表示。'(_値,平年) :- \+(閏年(_値)),!. 閏年(_年) :- 0 is _年 mod 400,!. 閏年(_年) :- 0 is _年 mod 100,!,fail. 閏年(_年) :- 0 is _年 mod 4,!. 閏年(_年) :- \+(0 is _年 mod 4),fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/803 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク):入力された整数を一桁ずつ足してゆき、 # その合計を表示するプログラムを作成せよ。 # 例: # 入力:123 # 表示:1+2+3=6 # 入力:45678 # 表示:4+5+6+7+8=30 # # '入力された整数を一桁ずつ足してゆき、その合計を表示する' :- 整数を入力する(N), 一桁ずつ足してゆき(N,S), 合計を表示する(S). 整数を入力する(N) :- write('整数を入力してください : '), get_line(Line), 診断(Line,N). atom_to_term(Line,N,_), N >= 0,!. 整数を入力する(N) :- 整数を入力する(N). 診断(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 0,!. 診断(Line,N) :- write_formatted('入力された %t から0以上の整数が得られません\n',[Line]), write('再入力をお願いします\n'), fail. 一桁ずつ足してゆき(0,0) :- !. 一桁ずつ足してゆき(N,S) :- Mod is N mod 10, Div is N // 10, 一桁ずつ足してゆき(Div,S1), S is S1 + Mod. 合計を表示する(S) :- write_formatted('合計は %t\n',[S]). % 以下のサイトは # 出典:: 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/1284632294/611 # # 入力した整数を行数と解釈し、その後、その行数分だけキーボードから入力された文字をディスプレ # イに出力する。 # [条件1] 整数(行数)入力にはscanf 関数を使用する。 # (注意!) scanf 関数での入力直後、キーボードバッファに不要な改行コードが1 つ残る。 # これをgetchar を1 回実行することによりクリアしなければならない。 # [条件2] 行数入力後の文字入出力にはgetchar 関数とputchar 関数を使用する。 # <実行例> 注)↲ は、入力時のEnter キーを表す # Input No. of line: 3 # abc↲ # abc # 1234↲ # 1234 # xyz#!"↲ # xyz#!" # <入出力情報> # 入力出力 # キーボードディスプレイ # <エラー仕様> # ・入力された整数(行数)が0 以下だった場合は、その後のキーボード入力は行なわれず終了する # (0 行を指定したと扱う)。 # ・入力された整数(行数)が、不正の(整数でない)場合の動作は、保証されなくてよい。 # # 入力した整数を行数と解釈し、その後、その行数分だけキーボードから入力された文字をディスプレイに出力する :- 行数を得る(_行数), length(L,_行数), append(L0,[_|R],L), get_line(Line), put_line(Line), R = [],!. 入力した整数を行数と解釈し、その後、その行数分だけキーボードから入力された文字をディスプレイに出力する. 行数を得る(_行数) :- write('行数を入力してください : '), get_line(Line), 診断(Line,_行数),!. 行数を得る(_行数) :- 行数を得る(_行数). 診断(Atom,_行数) :- atom_to_term(Atom,_行数_1,_), integer(_行数_1), 診断2(_行数_1,_行数),!. 診断(Atom,_行数) :- write_formatted('入力された %t は整数ではありません。再入力をお願いします。\n',[Atom]), fail. 診断2(_行数_1,0) :- _行数_1 =< 0,!. 診断2(_行数,_行数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/523 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 入力された2つの行列の積算を行い、結果を示せ。 # 1.行列の行、列数の入力を求める # 2.2つの行列の積算 # 3.行列として結果を表示 # '2つの行列の積算'(_行列1,_行列2,_行列の積) :- 行列を入力する(_行列1), write('入力された行列は\n'), 行列の表示(_行列1), 行列を入力する(_行列2), write('入力された行列は\n'), 行列の表示(_行列2), 行列の積(_行列1,_行列2,_行列の積), write('積行列は\n'), 行列の表示(_行列の積). 行列を入力する(_行列) :- 行列の行、列数の入力を求める(_行数,_列数), findall(L1,( for(1,N,_行数), length(L1,_列数), write('1行分入力します\n'), 行の入力(L1)), _行列). 行の入力([]) :- !. 行の入力([_値|R]) :- write('値を入力してください : '), get_line(Line), 行の入力診断(Line,_値), 行の入力(R). 行の入力(L) :- 行の入力(L). 行の入力診断(Line,_値) :- atom_to_term(Line,_値,_), number(_値),!. 行の入力診断(Line,V) :- write_formatted('%tは行列の要素としては適切でありません。再入力が必要です。\n',[Line]), fail. 行列の行、列数の入力を求める(_行数,_列数) :- 行数の入力(_行数), 列数の入力(_列数),!. 行数の入力(_行数) :- write('行数を入力してください : '), get_line(Line), 行数入力の診断(Line,_行数),!. 行数の入力(_行数) :- 行数の入力(_行数). 列数の入力(_列数) :- write('列数を入力してください : '), get_line(Line), 列数入力の診断(Line,_列数),!. 列数の入力(_列数) :- 列数の入力(_列数). 行数入力の診断(Line,_行数) :- atom_to_term(Line,_行数,_), integer(_行数), _