第6回 基礎プログラミング II レポート課題 氏名: 金田麻美 学籍番号: C1090466 語学クラス: 英語3 コース(系): 政策マネジメント 1. alphabet[18] 通常であれば18番目のアルファベットは r であるが、 ここで扱うのは配列 alphabet である。 配列は、配列名 = [データ0, データ1, データ2, ...] というように、 中身が0から始まる。 であるから、配列 alphabet の18番目は、r の1つ後ろの s だと考えられる。 alphabet[40] 上記の考え方をとると、全26個のアルファベットの小文字が入った 配列 alphabet は、0番目の a から始まって、25番目の z で終わるはずである。 40番目のデータはないので、alphabet[40]は、 空(ブランク)を表す nil になると考えられる。 証明するために、実際に配列を書いたプログラムを作り、実行してみた。 〜 プログラム alphabet.rb #!/usr/koeki/bin/ruby 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"] p alphabet[18] p alphabet[40] 〜 実行結果 pan{c109046}% ./alphabet.rb [~/Ruby] "s" nil pan{c109046}% [~/Ruby] 予想通り、alphabet[18] = s , alphabet[40] = nil であることが証明された。 参考文献 基礎プログラミング I 第5回 配列の構造 「配列 Array」 http://roy/~madoka/2010/r1/05/05_03_theme_02_array.html 作者: 西村まどか アルファベット表:ABC表:お勉強:知る:学ぶ:キッズ@nifty http://kids.nifty.com/study/abc/index.htm 作者: NIFTY ------------------------------------------------------------------ 2. AとBを選択した。 A-a. 授業で作成した def_ary_movie.rb を基に、平均を算出する関数を使い、 入力された降水確率の平均を演算するプログラム def_statistic.rb を作成した。 A-b. #!/usr/koeki/bin/ruby def average(total) # totalは入力した数値が入る配列 sum = 0.0 # 小数を扱う予定なので初期値も浮動小数点数に for rain in total # for 中のデータの変数 in 配列名 で、行う操作を指示できる sum += rain # 中のデータの数値を sum に合算していく end # for の end sum / total.length # total に入っているデータの数で sum の数値を割る end # def の end odds = Array.new # 仮に数値を入れる配列 odds を設定 while true # 実行して行われた操作の処理 STDERR.print "降水確率を入力して下さい(終了は ctrl+d): " entry = gets # 入力された数値を変数 entry に入れる if entry == nil # ctrl+d(空の情報) が入力されたら break # 終了 end # if の end odds << entry.to_i # 変数に入っている数値(入力されたもの)を配列にしまう end # while の end printf("\n\n降水確率の平均は %3.1f です\n", average(odds)) # total を oddsに入っている数値にして、関数 average を演算する A-c. 基にしたプログラムからの変更点は変数や print文を設定に合ったものに 変えたのみである。 A-d. その1 pan{c109046}% ./def_statistic.rb [~/Ruby] 降水確率を入力して下さい(終了は ctrl+d): 20 降水確率を入力して下さい(終了は ctrl+d): 10 降水確率を入力して下さい(終了は ctrl+d): 50 降水確率を入力して下さい(終了は ctrl+d): 80 降水確率を入力して下さい(終了は ctrl+d): 90 降水確率を入力して下さい(終了は ctrl+d): 30 降水確率を入力して下さい(終了は ctrl+d): ^D 降水確率の平均は 46.7 です その2 pan{c109046}% ./def_statistic.rb [~/Ruby] 降水確率を入力して下さい(終了は ctrl+d): 50 降水確率を入力して下さい(終了は ctrl+d): 30 降水確率を入力して下さい(終了は ctrl+d): 10 降水確率を入力して下さい(終了は ctrl+d): 20 降水確率を入力して下さい(終了は ctrl+d): 80 降水確率を入力して下さい(終了は ctrl+d): ^D 降水確率の平均は 38.0 です 表示は問題ない。 A-e. 結果の数字が合っているか bc-l で調べてみた。 pan{c109046}% bc -l [~/Ruby] 20 + 10 + 50 + 80 + 90 + 30 / 6 255.00000000000000000000 20 + 10 + 50 + 80 + 90 + 30 280 280 / 6 46.66666666666666666666 50 + 30 + 10 + 20 + 80 190 190 / 5 38.00000000000000000000 どちらも小数点第2位の数字が四捨五入されており、答えが合っているので、 このプログラムは正しいといえる。 ただ降水確率の有効数字を考えると、通常は整数の1の位を四捨五入して 10ごとの単位が適切かと思われるので、数字の表し方は改善すべきである。 --------------------------------------------------------------------- B-a. 授業で作成した def_rubiocci.rb を基に、踏む加減を選択して うどんをつくるプログラム def_rollplaying.rb を作成した。 B-b. #!/usr/koeki/bin/ruby def step(fumi) # 効果音を表示させる関数。仮引数fumi fumi.times do # 変数 .times do で繰り返し print("ふみ\t") end # times do の end print("\n") # 改行 sleep 1 # 1秒待つ end # def の end def choose(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 udon(times,answer) # がんばり度を算出する関数。仮引数times,answer x = 4 * times - answer # がんばり度は 4 * 回数 - 選択した数 printf("%d回目\n",times) # 回数を表示 x end # def の end print("うどんをつくるよ!\n") STDERR.printf("あなたのお名前は?") name = gets.chomp # ユーザーの名前をとってくる if name == "" # 入力がなかったら名前はうどん name = "うどん" end # if の end printf("%sさんですね。\n",name) ganbari = 1 # がんばり度 koshi = 1 # コシの強さ hour = 0 # 選択の回数 printf("よく踏むと美味しくなるよ\n") while true # 条件を満たすまで繰り返し step(ganbari) # 効果音をがんばり度の数だけ表示 choose(name) # 選択肢を表示させる ans = gets.chomp.to_i # 入力された番号をしまう print "-" * 80 # 端から端まで---で区切る ganbari += hour * ans # がんばり度は選んだ回数と番号をかけ算 koshi += udon(hour,ans) # コシの強さはudon関数に入力値を代入して計算 if ganbari > 4 # もしがんばり度が4より大きかったら break # 終了 end # if の end if koshi > 4 # もしコシの強さが4より大きかったら break # 終了 end # if の end step(ans) # 効果音の関数に入力値を代入 hour += 1 # 回数を進める end # while true の end step(koshi) # 最終的なコシの強さが効果音に printf("%sさんのうどんの味は…", name) if koshi > 8 # コシの強さが8より大きかったら成功 print("「おいしいよ!」\n") elsif koshi <= 5 # コシの強さが5以下だったら失敗 print("「うどんっていうか、すいとんだね。」\n") else # それ以外(5より大きく8以下)は普通 print("「普通だね。」\n") end # if の end B-c. 基にしたプログラムからの変更は、変数とprint文に関してのみである。 B-d. 〜1、全部がんばる pan{c109046}% ./def_rollplaying_a.rb [~/Ruby] うどんをつくるよ! あなたのお名前は?るびお るびおさんですね。 よく踏むと美味しくなるよ ふみ るびおさん、どうする?: [1] 全身全霊で踏む [2] 普通に踏む [3] テキトー 1 --------------------------------------------------------------------------------0回目 ふみ ふみ るびおさん、どうする?: [1] 全身全霊で踏む [2] 普通に踏む [3] テキトー 1 --------------------------------------------------------------------------------1回目 ふみ ふみ ふみ るびおさん、どうする?: [1] 全身全霊で踏む [2] 普通に踏む [3] テキトー 1 --------------------------------------------------------------------------------2回目 ふみ ふみ ふみ ふみ ふみ ふみ ふみ ふみ ふみ ふみ るびおさんのうどんの味は…「おいしいよ!」 〜2、全部テキトー pan{c109046}% ./def_rollplaying_a.rb [~/Ruby] うどんをつくるよ! あなたのお名前は? うどんさんですね。 よく踏むと美味しくなるよ ふみ うどんさん、どうする?: [1] 全身全霊で踏む [2] 普通に踏む [3] テキトー 3 --------------------------------------------------------------------------------0回目 ふみ ふみ ふみ ふみ うどんさん、どうする?: [1] 全身全霊で踏む [2] 普通に踏む [3] テキトー 3 --------------------------------------------------------------------------------1回目 ふみ ふみ ふみ ふみ ふみ ふみ ふみ うどんさん、どうする?: [1] 全身全霊で踏む [2] 普通に踏む [3] テキトー 3 --------------------------------------------------------------------------------2回目 ふみ ふみ ふみ ふみ うどんさんのうどんの味は…「うどんっていうか、すいとんだね。」 〜3、全部ふつう pan{c109046}% ./def_rollplaying_a.rb [~/Ruby] うどんをつくるよ! あなたのお名前は? うどんさんですね。 よく踏むと美味しくなるよ ふみ うどんさん、どうする?: [1] 全身全霊で踏む [2] 普通に踏む [3] テキトー 2 --------------------------------------------------------------------------------0回目 ふみ ふみ ふみ うどんさん、どうする?: [1] 全身全霊で踏む [2] 普通に踏む [3] テキトー 2 --------------------------------------------------------------------------------1回目 ふみ ふみ ふみ ふみ ふみ うどんさん、どうする?: [1] 全身全霊で踏む [2] 普通に踏む [3] テキトー 2 --------------------------------------------------------------------------------2回目 ふみ ふみ ふみ ふみ ふみ ふみ ふみ うどんさんのうどんの味は…「普通だね。」 〜4、がんばる、テキトー、テキトー pan{c109046}% ./def_rollplaying_a.rb [~/Ruby] うどんをつくるよ! あなたのお名前は? うどんさんですね。 よく踏むと美味しくなるよ ふみ うどんさん、どうする?: [1] 全身全霊で踏む [2] 普通に踏む [3] テキトー 1 --------------------------------------------------------------------------------0回目 ふみ ふみ うどんさん、どうする?: [1] 全身全霊で踏む [2] 普通に踏む [3] テキトー 3 --------------------------------------------------------------------------------1回目 ふみ ふみ ふみ ふみ ふみ ふみ ふみ うどんさん、どうする?: [1] 全身全霊で踏む [2] 普通に踏む [3] テキトー 3 --------------------------------------------------------------------------------2回目 ふみ ふみ ふみ ふみ ふみ ふみ うどんさんのうどんの味は…「普通だね。」 B-e. がんばり度の公式(4 * times - answer)から答えを検証してみる。 1) 4 * 2 - 1 + 1 + 1 = 9 pan{c109046}% bc -l [~/Ruby] 4 * 0 - 1 -1 4 * 1 - 1 3 4 * 2 - 1 7 -1 + 3 + 7 9 結果が8より大きければ成功する設定と合致している。 2) 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. ゲームでは選んだ選択肢で好感度が変化する恋愛シュミレーションは 関数で設定付けしていそうだし、RPGでもレベルやステータスによって 与えるダメージ、被ダメージなどが変化するのは、 関数とifの組み合わせで設定されていそうだと思う。 日常生活ではキッチンタイマーの、設定した時間から0秒までを計るという 仕組みが、downto do -- end の考え方だと思う。 今回のB問題では設定を考えるのと仕組みを理解するのにやっとで、 計算をよく考えられずに、授業のプログラムのままにしてしまった。 来週は method が終わってたぶん落ち着けると思うので、 ゆっくり復習をしたい。 参考文献 基礎プログラミング II 第6回 目的に応じて使ってみよう 「るびおっち」 http://roy/~madoka/2010/r2/06/06_11_theme_09_rubiocci.html 基礎プログラミング II 第6回 目的に応じて使ってみよう 「method の中にmethod」 http://roy/~madoka/2010/r2/06/06_09_appendix_01_methodinmethod.html どちらとも作者は西村まどか 共同学習者: 笹原千珠子