第5回 基礎プログラミングII レポート課題 筆記問題 A まず自分の名前の16進数を、すでに提出したレポートより示す ASCIIコード表を用いる(基礎プログラミング I 第5回レポートより抜粋) ASCIIコード表を用いる(前回レポートより再掲) 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 nul soh stx eox eot enq ack bel bs ht lf vt ff cr so s 1 dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us 2 ! " # $ % & ' ( ) * + , - . / 3 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 4 @ A B C D E F G H I J K L M N O 5 P Q R S T U V W X Y Z [ 円 ] ^ _ 6 ` a b c d e f g h i j k l m n o 7 p q r s t u v w x y z { | } ~ del 使い方(前回レポートより、16進数から文字を探す手順から、文字から16進数の 数字を求める手順に変更した。) 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 nul soh stx eox eot enq ack bel bs ht lf vt ff cr so si 1 dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us イ ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← ↑ ↑ ↑ ↑ ↑ ↑ ↑ ロ 例 ASCIIコード表でemを調べる。 イ 「em」が存在する場所から横軸に見てそこにある数字を調べる。(←で表記) ロ「em」が存在する場所から縦軸に見てそこにある数字を調べる。 (↑で表記) ハ 手順イとロでさがした数字をイ、ロの順番で並べる。 よって0x19となる。 以下、自分の名前を16進数に変換した結果をこの要領で求め、まとめたものを表とする。 文字 16進数 E 0x45 i 0x69 i 0x69 c 0x63 h 0x68 i 0x69 r 0x72 o 0x6f K 0x4b u 0x75 b 0x62 o 0x6f t 0x74 a 0x61 16進数に変換するが16進数同士の足し算方法(ひっさん方法)の例を示す 例1 45 69---------(a) | | (b) -- =AE 解説 (a)→5に9を足すが10進数の計算ではなく、16進数であるので「5、6、7、8。9、 a、b、c、d、e」となる (b)→(a)と同じ 例2 AE 69------(a) | | | (b) --- 117 解説 (a)→後に示す変換表より、「17」 (b)→aの答えの17の「1」が繰り上がっている、よって1をさらに足し計算する。 この答えも「1」が繰り上がるので、隣に1を書く この要領で計算した過程をしめす 45 69 -- AE 69 --- 117 63 --- 17A 68 --- 1E2 69 --- 24B 72 --- 2BD 6f --- 32C 4B --- 377 75 --- 3EC 62 --- 44E 6F --- 4BD 74 --- 531 61 --- 592 10進数 16進数対応表 基礎プログラミング I 第1回レポートより再掲 10進 16進 2進 0 0 0 1 1 1 2 2 10 3 3 11 4 4 100 5 5 101 6 6 110 7 7 111 8 8 1000 9 9 1001 10 a 1010 11 b 1011 12 c 1100 13 d 1101 14 e 1110 15 f 1111 16 10 10000 17 11 10001 18 12 10010 19 13 10011 20 14 10100 21 15 10101 22 16 10110 23 17 10111 24 18 11000 25 19 11001 26 1a 11010 16進数を10進数に変換する 45 4 / 5-----a 4*16**1+ / 5*16**0-----b 64 + 5------c =69 解説 a 2つにわけて考える b 2つに分けた数字を、16で掛けるがそのとき巾乗のの指数を0からはじめ、後か ら1ずつふやして書く c bの巾乗を解き、その答えを足し合わせる この要領でASCIIコードの10進数を16進数に変換したものを表にまとめる E 0d69 i 0d105 i 0d105 c 0d99 h 0d104 i 0d105 r 0d114 o 0d111 K 0d75 u 0d117 b 0d98 o 0d111 t 0d116 a 0d97 10進数をすべて足し合わせる pan{c109058}% bc -l [~] 69+105+105+99+104+105+114+111+75+117+98+111+116+97 1426 quit 先ほど求めた16進数の答えを10進数に変換するーーー変換方法は先ほど提示 592 5 9 2 5*16**2 + 9*16**1 + 2*16**0 5*256 + 9*16 + 2 1426 したがって16進数と10進数の答えは一致した 1426を16で割る ◯その1 bc ーl pan{c109058}% bc -l [~] 1426/16 89.12500000000000000000 quit ◯その2 手計算 89 16/~~~~~~~ 1426 128 ---------- 146 144 --------- 2 ここまでの参考文献 10進数、16進数変換 http://7ujm.net/play/DECtoHEX/TOH.html 2進数と16進数の計算 http://www.geocities.co.jp/SiliconValley-SanJose/7769/hard/keisan.html 16進数対応簡易電卓 http://www21.big.or.jp/~dram/calc.html 上記電卓は、最後の最後に10進数と16進数の答えが一致しなかったらショックな ので、途中、確認の意味で、自分で求めたものと照らし合わせるようなかたちで、使用した B コンビニにいき夕食を買う過程をプログラム風に示す def dinner(bentou,tea,salada) salad(サラダ)を手に取る bentouを手に取る teaを手に取る def dinner(bentou,tea,salada)をレジに持って行き、買う end bentou(1個,890カロリー) tea(1本,500ミリリットル) salad(1個,300カロリー) #袋から出す print("いただきまーーす") プログラム問題 A問題 a考えた設定 ある寮で、くじ引きで寮長と副寮長をえらぶことが行なわれた。 そのときの寮長/副寮長になる組み合わせを考えた def_combination.rbを作成した b元にしたプログラム def_fanctinal.rbを参考とした。組み合わせという言葉も知らなかったので、後 に示す参考文献で学習し、2変数にする必要があったため。書き変えた c作成したプログラム #!/usr/koeki/bin/ruby #インタプリタであることを宣言する def bunsi(people) #def(プロセスを教える)だが、今回は繰り返しをする if people==1 #もし後に入力される人数に1と入力されたら 1 #1を出す else #それ以外は people *bunsi(people-1) #例 5*4*3*2*1=再帰 end #ifのおわり end #defのおわり def bunbo(erabu) #def(プロセスを教える)だが、今回は繰り返しをす if erabu==1 #もし後に入力される人数に1と入力されたら 1 #1を出す else #それ以外は erabu*bunbo(erabu-1) #例 5*4*3*2*1=再帰 end #ifのおわり end #defのおわり STDERR.print("役職候補は何人いますか?:") #質問表示 people=gets.chomp.to_i #それを取り込み、改行文字をとり、10進数と見なす STDERR.print("役職は何人選出しますか?:") #質問表示 erabu=gets.chomp.to_i #それを取り込み、改行文字をとり、10進数と見なす paturn=bunsi(people)/bunbo(erabu) #全てのパターン数を求める printf("候補者%d名の中から寮長/副寮長等の役職を%d人選ぶ組み合わせは、全部で「%d」通りあります\n",people,erabu,paturn) #結果表示 d実行結果 pan{c109058}% ./def_combination.rb [~/Ruby] 役職候補は何人いますか?:5 役職は何人選出しますか?:2 候補者5名の中から寮長/副寮長等の役職を2人選ぶ組み合わせは、全部で「60」通りあります e考察 bc -lで試算する pan{c109058}% bc -l [~/Ruby] 5*4*3*2*1 120 2*1 2 160/2 80.00000000000000000000 2/160 .01250000000000000000 120/2 60.00000000000000000000 quit よってこのプログラムの正確性が示される また、順列は順番を気にする→ラーメン、うどん/うどん、ラーメン 一方組み合わせは順番を気にしない→ラーメン、うどん==うどん、ラーメン また組み合わせを考える祭には樹型図が使える A b c d b a c d ここまでの参考文献 西村まどか 2009講義ノート 基礎プログラミングII 何度も呼び出そう 最後まで といた学生のレポート その1 http://roy.e.koeki-u.ac.jp/~madoka/2009/r2/05/rpt/c108174.txt 西村まどか 2009講義ノート 基礎プログラミングII 何度も呼び出そう 最後まで といた学生のレポート その2 http://roy.e.koeki-u.ac.jp/~madoka/2009/r2/05/rpt/c108172.txt 受検数学かずスクール 順列と組み合わせの違い、rCkの計算方法 http://kazuschool.blog94.fc2.com/blog-entry-198.html B問題 a考えた設定 前回のレポートのルビ緒の八百屋シリーズの続きである。八百屋の主人が何と値 引をしてくれた。/two_methods.rb b 元にしたプログラム とくにないが、前回のレポート課題と内容は、ほぼ同じになってしまった。 値引の部分について、defの中にifをいれ◯本以上買ってくれたら◯円割り引き というようにした。 c 作成したプログラム #!/usr/koeki/bin/ruby #インタプリタ宣言文 total=0 #合計を求めるときに使用 def kyuuri(kosuu_kyuuri) #計算方法を教える(定義する)が、その計算で用いるkosuu_kyuuriという変数も定義する if kosuu_kyuuri<5 #もし後に入力するきゅうりの個数が5個よりも少なかったら kosuu_kyuuri* 180 #計算方法 else #それ以外のときは kosuu_kyuuri* 180-50 #計算方法 end #ifのおわり end #defのおわり def daikon(daikon_kosuu) #計算方法を教える(定義する)が、その計算で用いるdaikon_kosuuという変数も定義する daikon_kosuu * 180 #計算方法 end #defのおわり STDERR.print("いらっしゃい!きゅうりはいくつ買う?:") #質問表示 kosuu_kyuuri=gets.chomp.to_i #そこで入力されたものを取り込み、改行文字を取り、10進数と見なす STDERR.print("大根はいくつ買う?:") #質問表示 daikon_kosuu=gets.chomp.to_i #そこで入力されたものを取り込み、改行文字を取り、10進数と見なす total=kyuuri(kosuu_kyuuri) + daikon(daikon_kosuu) #合計計算 printf("合計は%d円です\n",total) #結果表示 d実行結果 パターン1 値引あり pan{c109058}% ./two_methods.rb [~/Ruby] いらっしゃい!きゅうりはいくつ買う?:20 大根はいくつ買う?:5 合計は4450円です パターン2 値引無し pan{c109058}% ./two_methods.rb [~/Ruby] いらっしゃい!きゅうりはいくつ買う?:3 大根はいくつ買う?:2 合計は900円です e考察 bc -lにより試算する パターン1pan{c109058}% bc -l [~/Ruby] 20*180-50 3550 3350+180*5 4250 3550-3350 200 4250+200 4450 quit パターン2 pan{c109058}% bc -l [~/Ruby] 3*180+2*180 900 quit よって試算により、このプログラムの正確性が示された。 C問題 a考えた設定 小学校のときにやった距離の計算を再現したプログラムdef_sim.rbを作成した b もとにしたプログラム 特にない c作成したプログラム #!/usr/koeki/bin/ruby #インタプリタ宣言文 def haziki(hayasa,zikan) #hazikiのメソットを定義 hayasa*zikan #速さ*時間 end STDERR.print("速さを教えてください:") #質問表示 hayasa =gets.chomp.to_f #入力されたものを取り込み、改行文字を取り、小数に変換 STDERR.print("走行時間を教えてください:") #質問表示 zikan=gets.chomp.to_f #入力されたものを取り込み、改行文字を取り、小数に変換 printf("計算結果 あなたは%3.2fキロ進みました\n",haziki(hayasa,zikan)) #結果表示 d実行結果 速さを教えてください:10 走行時間を教えてください:10 計算結果 あなたは100.00キロ進みました e考察 bc -lで試算する an{c109058}% bc -l [~/Ruby] 10*10 100 quit[ よってこのプログラムは正しい 感想 同じ物事を繰り返すこととして銀行のATMがあるだろう いらっしゃいませから実 際に操作完了まで一定の案内で進んでいる。 今回はとてもむずかしかった、特に前回までdefの解釈を「計算のプロセスを覚 える」ものだと理解していたので、階乗の計算でどういうしくみで繰り返されて いるのかが分からなかった。解釈できた人も居たので参考までに聞いたが、とて も「日常的な自分の言葉で」説明は出来なかった とはいえ毎回調子が良いとも限らないので、次回に期待したい。 共同学習者:横山 広樹、青木 千紗、小松 由里 協力してくれた先輩:工藤 智也先輩