第 6 回 目的に応じて使ってみよう レポート課題 氏名:加藤恭平 学籍番号:c110054 語学クラス:英語2 コース(系):政策マネジメント 1.筆記問題 A.まず、配列alphabetを全て書き出す。 alphabet = ["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"] まずalphabet[18]の場合、配列は0から始まるので a = 0 から順番に数えて行く と、s = 18 となる。よってalphabet[18]=sとなる。 alphabet[40]の場合、同じように数えてもアルファベットは26までしか存在せず、 配列も z = 25 までとなっているので、alphabet[40]は「存在しない」つまり nilという結果が帰ってくる。 2.プログラム問題 選択した問題 A.B A-a)考えた設定 とあるMS小隊の隊員一人当りの平均撃墜数を求める。 そして撃墜数に応じた評価コメントを表示させるプログラム(def_statistic.rb) A-b)作成したプログラム #!/usr/koeki/bin/ruby def average(total) # 関数averageを作成する sum = 0.0 # 割り算を行うため、小数点数にする for score in total # totalの中身をscoreに sum += score # sumは上の文で設定した変数scoreを足して行った 数値とする。 end # forに対するend sum / total.length # totalの数でsumを割り、平均を求める。 end # defに対するend shootdown = Array.new # 配列shootdownを作成する print("あるMS小隊の一人当りの平均撃墜数を計算します。\n") print("\n") while true # Ctrl-dが入力されるまで以下を繰り返す STDERR.print("撃墜数は何機ですか?(Ctrl- dで終了します):") line = gets # 変数lineに取りこむ。 if line == nil # Ctrl-dが入力された場合 break # 終了して結果表示へ end # ifに対するend shootdown << line.to_i # 配列shootdownに入力された値を取りこむ。 end # while trueに対するend print("\n") printf("小隊員一人当りの平均撃墜数は %3.1f 機です。\n",average(shootdown)) print("\n") print("貴方の小隊の評価は…\n") sleep 1.3 if average(shootdown) >= 30 # shootdowの数値が30以上の時 print("すごい!!全員エースレベルですねっ\n") # 表示する文 elsif average(shootdown) >= 20 # 20以上の時 print("非常に優秀な小隊だと思いますよ!\n") # 表示する文 elsif average(shootdown) >= 10 # 10以上の時 print("ここから少しずつ前進です!\n") # 表示する文 else # それ以下の時 print("い、生きて還るのが何よりも大事ですから\n") #表示する文 end # defに対するend A-c)元にしたプログラム 授業用ページのdef_ary_movie.rbを元に作成した。 変数を設定に応じて変更し、if文を用いて数値に応じたコメントを表示できるよ うにした。 A-d)実行結果 pan{c110054}% ./def_statistic.rb\ [~/Ruby] あるMS小隊の一人当りの平均撃墜数を計算します。 撃墜数は何機ですか?(Ctrl- dで終了します):12 撃墜数は何機ですか?(Ctrl- dで終了します):20 撃墜数は何機ですか?(Ctrl- dで終了します):11 撃墜数は何機ですか?(Ctrl- dで終了します):8 撃墜数は何機ですか?(Ctrl- dで終了します):18 撃墜数は何機ですか?(Ctrl- dで終了します):^D 小隊員一人当りの平均撃墜数は 13.8 機です。 貴方の小隊の評価… ここから少しずつ前進です! pan{c110054}% ./def_statistic.rb\ [~/Ruby] あるMS小隊の一人当りの平均撃墜数を計算します。 撃墜数は何機ですか?(Ctrl- dで終了します):2 撃墜数は何機ですか?(Ctrl- dで終了します):3 撃墜数は何機ですか?(Ctrl- dで終了します):2 撃墜数は何機ですか?(Ctrl- dで終了します):6 撃墜数は何機ですか?(Ctrl- dで終了します):4 撃墜数は何機ですか?(Ctrl- dで終了します):7 撃墜数は何機ですか?(Ctrl- dで終了します):^D 小隊員一人当りの平均撃墜数は 4.0 機です。 貴方の小隊の評価… い、生きて還るのが何よりも大事ですから A-e)考察 bc-lで確かめ算をする pan{c110054}% bc -l [~/Ruby] 12+20+11+8+18 69 69/5 13.80000000000000000000 2+3+2+6+4+7 24 24/6 4.00000000000000000000 となり、プログラムの実行結果と計算結果が一致する。また評価コメントもプロ グラムで設定した通りに表示できているのでこのプログラムは正しいと言える。 B-a)考えた設定 メソッドを3つ以上使用した、名刀を打ち上げるゲーム(def_rollplaying_a.rb ) B-b)作成したプログラム #!/usr/koeki/bin/ruby def strike(utu) # 音を表示させる関数。仮引数はutu utu.times do # 変数 .times do で繰り返し print("ガキン!\t") end # times doに対するend print("\n") # 改行 sleep(0.5) # 0.5秒待つ end # defに対するend def message(name) # 選択肢を出す関数。仮引数name STDERR.printf("%sさん、次の行動は: \n", name) STDERR.print("[1]\t全身全霊を込めて打つ\n") STDERR.print("[2]\t普通に打つ\n") STDERR.print("[3]\t手を抜く\n") end # defに対するend def brade(times,answer) # 魂の値算出する関数。仮引数times,answer x = 4 * times - answer # 魂の値は4 * 回数 - 選択した数 printf("%d回目\n",times) # 回数を表示 x end # defに対するend printf("名刀を打ち上げろ!!\n") STDERR.printf("あなたのお名前は?") name = gets.chomp # 入力された名前をnameに if name == "" # 入力が無かった場合、 name = "名も無き刀鍛治" # 名前は「名も無き刀鍛治」 end # ifに対するend printf("%sさん、頑張って下さい。\n",name) soul = 1 # 魂 strength = 1 # 強靭さ hour = 0 # 選択の回数 printf("魂を込めるほど良い刀になるよ\n") while true # 条件を満たすまで繰り返し strike(soul) # 音を魂の値の数だけ表示 message(name) # 選択肢を表示させる ans = gets.to_i # 入力された番号をansにしまう print"-" * 80 # 端から端まで---で区切る soul += hour * ans # 魂の値は選択した回数と番号をかける strength += brade(hour,ans) # 強靭さの値はbrade関数に入力値を代入して計算 if soul > 4 # 魂の値が4以上の場合 break # 終了 end # ifに対するend if strength > 4 # 強靭さの値が4以上の場合 break # 終了 end # ifに対するend strike(ans) # 音の関数に入力値を代入 hour += 1 # 回数を進める end # while trueに対するend strike(strength) # 最終段階の強靭さが音になる printf("%sさんが打った刀は…", name) if strength > 8 # 強靭さが8以上の場合成功 print("天下に名を轟かす名刀になりました。\n") elsif strength <= 5 # 強靭さが5以下の場合失敗 print("粗雑な数打ちになってしまいました。\n") else # それ以外(5以上8以下)は普通 print("可もなく不可もなく、普通の刀です。\n") end # ifに対するend B-c)元にしたプログラム 授業用ページのdef_rubiocci.rbを元に、生き物を育てるという形式ではなく、 物を作るという形式に変更してみた。 B-d)実行結果 [1]全て1を選択 pan{c110054}% ./def_rollplaying_a.rb\ [~/Ruby] 名刀を打ち上げろ!! あなたのお名前は? 名も無き刀鍛治さん、頑張って下さい。 魂を込めるほど良い刀になるよ ガキン! 名も無き刀鍛治さん、次の行動は: [1] 全身全霊を込めて打つ [2] 普通に打つ [3] 手を抜く 1 --------------------------------------------------------------------------------0回目 ガキン! ガキン! 名も無き刀鍛治さん、次の行動は: [1] 全身全霊を込めて打つ [2] 普通に打つ [3] 手を抜く 1 --------------------------------------------------------------------------------1回目 ガキン! ガキン! ガキン! 名も無き刀鍛治さん、次の行動は: [1] 全身全霊を込めて打つ [2] 普通に打つ [3] 手を抜く 1 --------------------------------------------------------------------------------2回目 ガキン! ガキン! ガキン! ガキン! ガキン! ガキン! ガキン! ガキン! ガキン! ガキン! 名も無き刀鍛治さんが打った刀は…天下に名を轟かす名刀になりました。 [2]全て2を選択 pan{c110054}% ./def_rollplaying_a.rb\ [~/Ruby] 名刀を打ち上げろ!! あなたのお名前は? 名も無き刀鍛治さん、頑張って下さい。 魂を込めるほど良い刀になるよ ガキン! 名も無き刀鍛治さん、次の行動は: [1] 全身全霊を込めて打つ [2] 普通に打つ [3] 手を抜く 2 --------------------------------------------------------------------------------0回目 ガキン! ガキン! ガキン! 名も無き刀鍛治さん、次の行動は: [1] 全身全霊を込めて打つ [2] 普通に打つ [3] 手を抜く 2 --------------------------------------------------------------------------------1回目 ガキン! ガキン! ガキン! ガキン! ガキン! 名も無き刀鍛治さん、次の行動は: [1] 全身全霊を込めて打つ [2] 普通に打つ [3] 手を抜く 2 --------------------------------------------------------------------------------2回目 ガキン! ガキン! ガキン! ガキン! ガキン! ガキン! ガキン! 名も無き刀鍛治さんが打った刀は…可もなく不可もなく、普通の刀です。 [3]全て3を選択 pan{c110054}% ./def_rollplaying_a.rb\ [~/Ruby] 名刀を打ち上げろ!! あなたのお名前は? 名も無き刀鍛治さん、頑張って下さい。 魂を込めるほど良い刀になるよ ガキン! 名も無き刀鍛治さん、次の行動は: [1] 全身全霊を込めて打つ [2] 普通に打つ [3] 手を抜く 3 --------------------------------------------------------------------------------0回目 ガキン! ガキン! ガキン! ガキン! 名も無き刀鍛治さん、次の行動は: [1] 全身全霊を込めて打つ [2] 普通に打つ [3] 手を抜く 3 --------------------------------------------------------------------------------1回目 ガキン! ガキン! ガキン! ガキン! ガキン! ガキン! ガキン! 名も無き刀鍛治さん、次の行動は: [1] 全身全霊を込めて打つ [2] 普通に打つ [3] 手を抜く 3 --------------------------------------------------------------------------------2回目 ガキン! ガキン! ガキン! ガキン! 名も無き刀鍛治さんが打った刀は…粗雑な数打ちになってしまいました。 [4]1,1,3の順番で選択 pan{c110054}% ./def_rollplaying_a.rb\ [~/Ruby] 名刀を打ち上げろ!! あなたのお名前は? 名も無き刀鍛治さん、頑張って下さい。 魂を込めるほど良い刀になるよ ガキン! 名も無き刀鍛治さん、次の行動は: [1] 全身全霊を込めて打つ [2] 普通に打つ [3] 手を抜く 1 --------------------------------------------------------------------------------0回目 ガキン! ガキン! 名も無き刀鍛治さん、次の行動は: [1] 全身全霊を込めて打つ [2] 普通に打つ [3] 手を抜く 3 --------------------------------------------------------------------------------1回目 ガキン! ガキン! ガキン! ガキン! ガキン! ガキン! ガキン! 名も無き刀鍛治さん、次の行動は: [1] 全身全霊を込めて打つ [2] 普通に打つ [3] 手を抜く 3 --------------------------------------------------------------------------------2回目 ガキン! ガキン! ガキン! ガキン! ガキン! ガキン! 名も無き刀鍛治さんが打った刀は…可もなく不可もなく、普通の刀です。 B-d)考察 soulの公式(4 * times - answer)を用い、bc -lで確かめ算をする [1] pan{c110054}% bc -l [~/Ruby] 4 * 0 - 1 -1 4 * 1 - 1 3 4 * 2 - 1 7 -1 + 3 + 7 9 結果が8より大きければ成功する設定通りの結果となっている。 [2] pan{c110054}% bc -l [~/Ruby] 4 * 0 -2 -2 4 * 1 - 2 2 4 * 2 - 2 6 -2 + 2 + 6 6 結果が5より大きく8以下であれば普通である設定通りの結果となっている。 [3] 4 * 0 -3 -3 4 * 1 -3 1 4 * 2 - 3 5 -3 + 1 + 5 3 結果が5以下であれば失敗する設定通りの結果となっている。 [4] 4 * 0 - 1 -1 4 * 1 - 3 1 4 * 2 - 3 5 -1 + 1 + 5 5 結果が5より大きく8以下であれば普通である設定通りの結果となっている。 以上の計算結果から、このプログラムは正しいといえる。 3. ある選択肢を選択したら対応したある変数を+、 別の選択肢を選んだら別の対応す る変数を+していき、ルート分岐に達したらif文を用い、変数に代入されている数値で 進むルートが決定させる… のように、選択肢や行動によってルート分岐があるゲームにはメソッドの考え方 が使われているのではないかと考えた。 どちらの課題も授業用ページに乗っているプログラムを雛型にして完成させるこ とができた。解説文を書く段階で一行一行に書いてある文を自分が理解している か、しっかりと確かめ算を行いプログラムの正しさを証明することを意識しなが ら課題に取り組むことができた。 参考文献 基礎プログラミング II 第 6 回 (目的に応じて使ってみよう) 「るびおっち」 http://roy/~madoka/2011/r2/06/r2_06_11_theme_09_rubiocci.html 著者:西村まどか 基礎プログラミング II 第 6 回 (目的に応じて使ってみよう) 「映画の星づけ ランキング」 http://roy/~madoka/2011/r2/06/r2_06_08_theme_07_aryavg.html 著者:西村まどか 基礎プログラミング II 第 6 回 (目的に応じて使ってみよう) 「method の中に method」 http://roy/~madoka/2011/r2/06/r2_06_09_appendix_01_methodinmethod.html 著者:西村まどか