第 6 回 目的に応じて使ってみよう レポート課題 氏名: 加藤岳大 学籍番号: c1110447 語学クラス: 英語 5 コース: 地域共創 1. A. alphabet = ["a","b","c","b","e","f","g","h","i","j","k","l","m" "n","o","p","q","r","s","t","u","v","w","x","y","z"] 筆記問題であるが、プログラムを作成し確かめる。 ●プログラム● alphabet.rb #!/usr/koeki/bin/ruby #coding: euc-jp alphabet = ["a","b","c","b","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] print("22番目のアルファベット\n") printf("%s\n",alphabet[22]) print("-1番目のアルファベット\n") printf("%s\n",alphabet[-1]) ●実行結果● pan{c111044}% ./alphabet.rb [~/Ruby] 22番目のアルファベット w -1番目のアルファベット z ・alphabet[22] プログラムで確認したようにalphabet[22]は alphabet["a","b","c"..."z"] の22番の文字を示している。 0 から順番に始まっているので、22番の文字は「w」である。 alphabet[22] = w ・alphabet[-1] [-1] は alphabet["a","b","c"..."z"] を逆から数えていると考えた。 そのため [-2] [-3] の場合も確かめようと思う。 ●実行結果● pan{c111044}% ./alphabet.rb [~/Ruby] -2番目のアルファベット y -3番目のアルファベット x 実行結果より、[-1] = z ,[-2] = y , [-3] = x と逆から数えていることが、 確認できた。以上のことから、-1番目の数は「z」である。 alphabet[-1] = z B. ・平均 ●方法 求めるデータのの合計 / データの個数 ●式 ( X1 + X2 + ... Xn ) / n # X1,X2 ... Xn は各データ # n はデータの個数 ●具体例 みかん1袋の値段が A店 300円 B店 320円 C店 280円 となっている。 平均の値段を求めたい。 ( 300 + 320 + 280 ) / 3 = 300 3店のみかん1袋の値段の平均は、300円 となった。 bc -l で確認も行なった。 pan{c111044}% bc -l [~/Ruby] ( 300 + 320 + 280 ) / 3 300.00000000000000000000 quit ・標準偏差 ●方法 ( 各数 - 平均 ) の 2乗 .... を計算していき、合計を出す。 (各数- 平均) の合計 / 各数の個数 を計算し、 平方根(√)でくくる。 ____________________________________________ ●式 √(X1 - m)**2 + (X2 - m)**2 + ... (Xn - m)**2 # X は各数 ------------------------------------------- # n は各数の個数 n # m は平均 2. A. ● 設定 買い物してきた品物の値段を入力することで、その値段の平均を求められる プログラムを作成した。さらに分散は選択し、求めるか求めないか決めることが できるようした。 ● プログラム def_statistic.rb #!/usr/koeki/bin/ruby #coding: euc-jp def average(kazu) # kazu = total sum = 0 for nedan in kazu # for A in B で B の中の A について sum += nedan # sum(合計) に nedan(値段)を足していく end sum / kazu.length #合計を値段の個数で割り、平均を求める end def bunsan(kazu) # kazu = total money = 0 for kaz in kazu sum = 0 sum += kazu sum -= average(kazu) sum **= 2 money += sum end money / kazu.length end total = Array.new # 配列 total を作る print("\n") print("今日買い物してきた、品物の値段を入力することで、\n") print("値段の平均を求めます。(終了は Ctrl - d)\n") print("\n") while true # 繰り返しのメソッド STDERR.print "値段を入力して下さい: " number = gets if number == nil # nil ctrl - d break # break whileを抜ける end # if --- end total << number.to_f end # while ---end printf("平均値段は %d 円 です。\n", average(total)) print("\n") while true # 繰り返しのメソッド print"分散も求めますか?\n" print"1 はい\n" print"2 いいえ\n" print"1、2 かどちらか選んでください。\n" print("\n") choice = gets.to_i # 入力した数を choice に代入 if choice == 1 # 1 を選択した場合(分散) printf("分散は %d になります。\n",bunsan(total)) exit # exit 強制終了 end if choice == 2 # 2 を選択した場合(終了) print("終了します。\n") exit end # if --- end end # while --- end ● 変更点 もとにしたプログラムは、def_ary_movie.rbである。 def - end を 2通り用いることで平均、分散を求めるようにした。 while true # 繰り返しのメソッド print"分散も求めますか?\n" print"1 はい\n" print"2 いいえ\n" print"1、2 かどちらか選んでください。\n" print("\n") choice = gets.to_i # 入力した数を choice に代入 if choice == 1 # 1 を選択した場合(分散) printf("分散は %d になります。\n",bunsan(total)) exit # exit 強制終了 end if choice == 2 # 2 を選択した場合(終了) print("終了します。\n") exit end # if --- end end # while --- end 上記のようなプログラムを付け加え、ただ実行結果を見るだけに ならないようにした。 ●実行結果 ・ 1 を選択した場合 pan{c111044}% ./def_statistic.rb [~/Ruby] 今日買い物してきた、品物の値段を入力することで、 値段の平均を求めます。(終了は Ctrl - d) 値段を入力して下さい: 100 値段を入力して下さい: 200 値段を入力して下さい: 300 値段を入力して下さい: 平均値段は 200 円 です。 分散も求めますか? 1 はい 2 いいえ 1、2 かどちらか選んでください。 1 分散は 6666 になります。 ・ 2 を選択した場合 pan{c111044}% ./def_statistic.rb [~/Ruby] 今日買い物してきた、品物の値段を入力することで、 値段の平均を求めます。(終了は Ctrl - d) 値段を入力して下さい: 100 値段を入力して下さい: 200 値段を入力して下さい: 300 値段を入力して下さい: 平均値段は 200 円 です。 分散も求めますか? 1 はい 2 いいえ 1、2 かどちらか選んでください。 2 終了します。 ● 考察 実行結果で求められた、平均と分散は正確であるか確かめる。 ・平均 pan{c111044}% bc -l [~/Ruby] (100 + 200 + 300) / 3 200.00000000000000000000 ・分散 pan{c111044}% bc -l [~/Ruby] 100 - 200 -100 -100^2 10000 200 - 200 0 0^2 0 300 -200 100 100^2 10000 10000 + 10000 20000 20000 / 3 6666.66666666666666666666 quit 平均が200 、分散が6666と実行結果と計算結果が一致しているので、 プログラムが正常に作動しているといえる。 講義で行なったようなに、 def_statistic.rb 3 3 4 5 6 2 1 と プログラム名の横に数字を入力し、結果を求めることができなかった。 もう一度復習し、実行できるようにしたい。 B. ● 設定 method を 3つ以上使用し、選択肢を選び方を変えるとエンディングが 異なるような木の育成ゲームを作成した。 ● プログラム def_rollplaying.rb #!/usr/koeki/bin/ruby #coding: euc-jp def care(name) # 育て方を選択させるメソッド print("\n") STDERR.printf("%sを世話しよう: \n", name) STDERR.print("1. 水をあげる\n") STDERR.print("2. 肥料を与える\n") STDERR.print("3. 話かける\n") end def great(days,choice) # 日数と成長量計算させるメソッド z = 3 * choice - days printf("%d日目\n",days) printf("成長量 %d\n", z) # 成長量表示 z end def plant(tree) # 成長量を表示するメソッド tree.times do print("\t+") end end print("\n") print("一本の木を貰いました。\n") print("\n") print("木でも話しかけて育てると、大きくに育つと聞いたあなたは\n") print("木に名前を付けることにしました。\n") print("\n") STDERR.printf("どんな名前にしますか? : ") name = gets.chomp if name == "" # 名前が入力されなかった場合、 name = "木" # 自動的に名前が「木」となる。 end printf(" %s という名前になりました。\n",name) love = 0 # 愛情 big = 0 # 成長量 day = 1 # 日数 print("\n") print("どんな木になるしょうか。\n") print("\n") while true care(name) # 育てるメソッド内容を表示 grow = gets.chomp.to_i # 番号選択 big += great(day,grow) # 成長量計算メソッで day と grow を使って計算 printf("成長量 %d\n", big) love += day * grow + 1 # 日数と番号をかけて、合計を愛情に代入 printf(" 愛情 %d\n", love) if love > 6 # 愛情が 6 より大きい場合、 break end plant(grow) day += 1 # 1日ずつ増える。 end plant(big) # 繰り返しが終わったあとの成長量の数だけ + が表示される。 printf("%sは", name) if big > 12 # big が 12 以上だった場合表示 print("綺麗で立派な巨木となった。\n") elsif big >7 # bigが 12 以下 7 以上だった場合表示 print("桜の木へと育った。\n") else # big が 7 以下だった場合表示 print("木は枯れてしまった...") end print("\n") ● 変更点 もとにしたプログラムは def_rubiocci.rb である。 mehtod の内容、計算式、if の範囲の変更を行なった。 あまり大きな変更点はないと考える。 ● 実行結果 ・枯れた場合 pan{KATO Takehiro}% ./def_rollplaying.rb [~/Ruby] 一本の木を貰いました。 木でも話しかけて育てると、大きくに育つと聞いたあなたは 木に名前を付けることにしました。 どんな名前にしますか? : こうえき こうえき という名前になりました。 どんな木になるしょうか。 こうえきを世話しよう: 1. 水をあげる 2. 肥料を与える 3. 話かける 1 1日目 成長量 2 成長量 3 愛情 3 + こうえきを世話しよう: 1. 水をあげる 2. 肥料を与える 3. 話かける 1 2日目 成長量 1 成長量 4 愛情 6 + こうえきを世話しよう: 1. 水をあげる 2. 肥料を与える 3. 話かける 1 3日目 成長量 0 成長量 4 愛情 10 + + + + こうえきは木は枯れてしまった... ・桜の木へと育った場合 pan{c111044}% ./def_rollplaying.rb [~/Ruby] 一本の木を貰いました。 木でも話しかけて育てると、大きくに育つと聞いたあなたは 木に名前を付けることにしました。 どんな名前にしますか? : こうえき こうえき という名前になりました。 どんな木になるしょうか。 こうえきを世話しよう: 1. 水をあげる 2. 肥料を与える 3. 話かける 3 1日目 成長量 8 成長量 9 愛情 5 + + + こうえきを世話しよう: 1. 水をあげる 2. 肥料を与える 3. 話かける 1 2日目 成長量 1 成長量 10 愛情 8 + + + + + + + + + + こうえきは桜の木へと育った。 ・綺麗で立派な巨木になった場合 pan{KATO Takehiro}% ./def_rollplaying.rb [~/Ruby] 一本の木を貰いました。 木でも話しかけて育てると、大きくに育つと聞いたあなたは 木に名前を付けることにしました。 どんな名前にしますか? : こうえき こうえき という名前になりました。 どんな木になるしょうか。 こうえきを世話しよう: 1. 水をあげる 2. 肥料を与える 3. 話かける 2 1日目 成長量 5 成長量 6 愛情 4 + + こうえきを世話しよう: 1. 水をあげる 2. 肥料を与える 3. 話かける 3 2日目 成長量 7 成長量 13 愛情 11 + + + + + + + + + ++ + + こうえきは綺麗で立派な巨木となった。 成長量 6 愛情 4 + + こうえきを世話しよう: 1. 水をあげる 2. 肥料を与える 3. 話かける 3 2日目 成長量 7 成長量 13 愛情 11 + + + + + + + + + ++ + + こうえきは綺麗で立派な巨木となった。 ● 考察 ・枯れてしまった場合 成長量の計算 pan{c111044}% bc -l [~/Ruby] 3 * 1 - 1 + 1 3 3 * 1 - 2 + 3 4 3 * 1 - 3 + 4 4 愛情の計算 pan{c111044}% bc -l [~/Ruby] 1 * 1 + 1 + 1 3 2 * 1 + 1 + 3 6 3 * 1 + 1 + 6 10 愛情が 6 以上になった場合抜けているので、3日目に愛情が 10 になったため 抜けている。成長量が 4 で枯れてしまったので正確である。 ・桜の木になった場合 成長量の計算 pan{c111044}% bc -l [~/Ruby] 3 * 3 - 1 + 1 9 3 * 1 - 2 + 9 10 愛情の計算 pan{c111044}% bc -l [~/Ruby] 1 * 3 + 1 + 1 5 2 * 1 + 1 + 5 8 愛情が 6 以上になった場合抜けているので、2日目に愛情が 8 になったため 抜けている。成長量が 10 で桜の木なので正確である。 ・綺麗で立派な巨木になった場合 成長量の計算 pan{c111044}% bc -l [~/Ruby] 3 * 2 - 1 + 1 6 3 * 3 - 2 + 6 13 愛情の計算 pan{c111044}% bc -l [~/Ruby] 1 * 2 + 1 + 1 4 2 * 3 + 1 + 4 11 愛情が 6 以上になった場合抜けているので、2日目に愛情が 11 になったため 抜けている。成長量が 13 で綺麗で立派な巨木なので正確である。 以上のことから、実行結果の成長量と愛情の計算が正しいと確認でき、 プログラムが正常であると言える。もっと技術の高い作品を作成できたら、 おもしろくなると思った。例えば、結果と同時に絵が表示されるなど、 今まで学んだ技術でもっと良い作品ができると思うので、見直して もっと良い作品を作成したい。 3. ・感想 プログラミングの講義を始める前に、液晶をつける、ユーザーIDを入れる、 パスワードを入れる、起動し firefox を開くという一連の動作をメソッドに できると考えた。その他にも、食事、お風呂など日常生活から様々なものを 考えることができると思う。 今回は、プログラムに計算させる問題が多く、小さなミスが多く、 どこを間違ているか考える時間が多かった。時間がかかってしまうが、 その分だけ再確認し、理解を深めることができた。共同研究者と 今回も協力仕合ながら作業でき、レポートが完成できた。 ・参考文献 基礎プログラミング II 第 6 回 (目的に応じて使ってみよう) 「映画の星づけランキング」 http://roy/~madoka/2012/r2/06/r2_06_08_theme_07_aryavg.html http://roy/~madoka/2012/prog/def_ary_movie.rb 基礎プログラミング II 第 6 回 (目的に応じて使ってみよう) 「るびおっち」 http://roy/~madoka/2012/r2/06/r2_06_11_theme_09_rubiocci.html http://roy/~madoka/2012/prog/def_rubiocci.rb 基礎プログラミング II 第 6 回 (目的に応じて使ってみよう) 「コマンドライ ン入力と method をあわせてみよう」 http://roy/~madoka/2012/r2/06/r2_06_14_theme_11_commandline.html http://roy/~madoka/2012/prog/def_sumup.rb 標準偏差 ー 計算 http://www.bekkoame.ne.jp/~mathebit/0f22i76/s_deviation3.html 共同研究者 堀 拓朗