第 6 回 目的に応じて使ってみよう レポート課題 氏名: 松田 大輝 学籍番号: c1101804 語学クラス: 中国語 コース(系): 地域共創コース 1、筆記問題 A、 alphabet[18] および alphabet[40] は何か、調べるためにも 実際に小文字が入っている配列 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"] この場合、a = 0, b = 1 のように先頭が 0 から順に数えていく。 すると alphabet[18] = s となった。 alphabet[40] は、アルファベットが全部で26文字のため、 40文字目など存在しない。 そのため、配列 a lphabet[40] は 「なにもない」を意味する nil を使用し alphabet[40] = nil となった。 alphabet[18] = "s" alphabet[40] = nil 上のような答えになったが、これが 正しいかプログラムを作成して確認してみる プログラム Ruby/a.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"] # アルファベットの小文字をすべて配列 alphabet の中にれた p alphabet[18] # p を用いて alphabet の 18文字目を表示させた p alphabet[40] # p を用いて alphabet の 40文字目を表示させた 実行結果 pan{c110180}% ./a.rb [~/Ruby] "s" nil 実行結果を見ても同様の結果が見られたため 答えが正しいことが証明された。 2、プログラム問題 A 1、考えた設定 様々な家庭の家賃と光熱費の各料金を 配列に取りこんで、平均値を計算するプログラムを作成した。 家賃の平均と光熱費の平均を求め、それらを加算し 毎月、支払っている料金の平均まで求めた。 2、作成したプログラム(説明) #!/usr/koeki/bin/ruby # 最初に書かなければいけないもの # ここからは家賃の平均を求めるプログラム def kane(water) # 関数 kane として water を引数とした goukei = 0 # 変数 goukei を 0 と定義した for average in water # for-endで 変数 average として 配列 water とした。 # 配列内の要素から順番に変数に代入しながら # for−end間の処理を繰り返し行う。 goukei += average # 変数 goukei に 変数 average を順に足していくよう "+=" を使用 end # for の end goukei / water.length # 変数 goukei を 変数 water の数で割って平均を求めた。 # そのため、配列の中に代入されている値の数を返してくれる # length メソッドを使用した。 end # def の end house = Array.new # 新しい配列 house を作成した。 STDERR.print("家賃と光熱費の平均の合計を求め、月に支払う料金を求める \n") # 対話的な表示をするのためにSTDERR を使用。 STDERR.print("最初に家賃を調べる\n") # 上と同じプログラム while true # while true を使用することによって # 永久に繰り返しが継続し、終了しないようにした # そのため、繰り返しが終了するため、後に break を使用 STDERR.print("\n様々な家庭の家賃を入力せよ。(終了はCrtl+D)\n") # 対話的な表示をするのためにSTDERR を使用。 nedan = gets.to_i #キーボードからの入力を読み込むメソッドとしてgetsメソッドを使用 if nedan == nil # もし、入力したものが何もないならば # 下の breakで繰り返しから終了させる。 # ここでの nil は Crtl+D を入力した場合である。 break # 繰り返しから抜けるために break を使用 end # if の end house << nedan.to_i # 変数 nedan 入力された値を 先程作成した配列 house に入れた end # while の end printf("\n家賃の平均は %d 円です。\n", kane(house)) # printf を用いて計算結果 (家賃の平均)をここで表示させた。 # ここからは光熱費の平均を求めるプログラム # 先程、作成した家賃の平均を求めるプログラムとプログラムは同じ。 # 変数だけ変えていったため説明は省略する def kane2(hikari) # 変数 kane を kane2 に 変数 water を hikari に変更 total = 0 # 変数 goukei を total に変更 for heikin in hikari # 変数 average を heikin に変更 total += heikin end total / hikari.length end netu = Array.new # 配列 house を netu に変更 STDERR.print("\n\n次に光熱費を調べる\n") while true STDERR.print("\n様々な家庭の光熱費を入力せよ。(終了はCrtl+D)\n") nedan2 = gets # 配列 nedan を nedan2 に変更 if nedan2 == nil break end netu << nedan2.to_f end printf("\光熱費の平均は %d 円です。\n\n", kane2(netu)) printf("家賃と光熱費の平均を足すと%d 円となり, 毎月支払っている\n",kane(house)+ kane2(netu)) # ここで、家賃と光熱費の平均の合計を求めた。 3、もとにしたプログラムからの変更点 講義中に作成したプログラム (def_ary_movie.rb) を基にしてプログラムを作成。 変更点は、平均を1つだけでなく2つの平均を求め、更に それら2つを加算させてみた。 4、実行結果 1) pan{MATSUTA Taiki}% ./def_statistic.rb [~/Ruby] 家賃と光熱費の平均の合計を求め、月に支払う料金を求める 最初に家賃を調べる 様々な家庭の家賃を入力せよ。(終了はCrtl+D) 30000 様々な家庭の家賃を入力せよ。(終了はCrtl+D) 40000 様々な家庭の家賃を入力せよ。(終了はCrtl+D) 28000 様々な家庭の家賃を入力せよ。(終了はCrtl+D) 63000 様々な家庭の家賃を入力せよ。(終了はCrtl+D) ^D 家賃の平均は 40250 円です。 次に光熱費を調べる 様々な家庭の光熱費を入力せよ。(終了はCrtl+D) 5200 様々な家庭の光熱費を入力せよ。(終了はCrtl+D) 2015 様々な家庭の光熱費を入力せよ。(終了はCrtl+D) 3900 様々な家庭の光熱費を入力せよ。(終了はCrtl+D) 900 様々な家庭の光熱費を入力せよ。(終了はCrtl+D) 光熱費の平均は 3003 円です。 家賃と光熱費の平均を足すと43253 円となり, 毎月支払っている 2) pan{c110180}% ./def_statistic.rb [~/Ruby] 家賃と光熱費の平均の合計を求め、月に支払う料金を求める 最初に家賃を調べる 様々な家庭の家賃を入力せよ。(終了はCrtl+D) 56000 様々な家庭の家賃を入力せよ。(終了はCrtl+D) 0 様々な家庭の家賃を入力せよ。(終了はCrtl+D) 0 様々な家庭の家賃を入力せよ。(終了はCrtl+D) ^D 家賃の平均は 18666 円です。 次に光熱費を調べる 様々な家庭の光熱費を入力せよ。(終了はCrtl+D) 3400 様々な家庭の光熱費を入力せよ。(終了はCrtl+D) 0 様々な家庭の光熱費を入力せよ。(終了はCrtl+D) 100 様々な家庭の光熱費を入力せよ。(終了はCrtl+D) 光熱費の平均は 1166 円です。 家賃と光熱費の平均を足すと19833 円となり, 毎月支払っている 5、結果の考察 計算が正しいか調べる。(2パターン) 1) bc -l [~/Ruby] 30000+40000+28000+63000 161000 161000/4 40250.00000000000000000000 家賃の平均 5200+2015+3900+900 12015 12015/4 3003.75000000000000000000 光熱費の平均 40250+3003 43253 家賃の平均と光熱費の平均との合計 すべての計算が正しいことを確認できた。 2) bc -l [~/Ruby] 56000+0+0 56000 56000/3 18666.66666666666666666666 家賃の平均 3400+0+100 3500 3500/3 1166.66666666666666666666 光熱費の平均 18666.6+1166.6 19833.2 家賃の平均と光熱費の平均との合計 すべての計算が正しいことを確認できた。 どちらのパターンでも計算が正しいことが確認できた。 B 1、考えた設定 method を 3 つ以上使用して、 イヌを育成するプログラムを作成した。 選択肢の選び方によって、イヌの成長結果が変化するようにした。 2、作成したプログラム(説明) #!/usr/koeki/bin/ruby # 最初に書かなければいけないもの def nakigoe(wan) # 関数を nakigoe と定義して、仮引数は wan とする。 wan.times do # 変数 .times do で下の print を 繰り返させる。 print("ワン\t") # print を用いて この文を表示 end # times の end print("\n") # 改行するためにこの文を使用 end # def の end def mondai(namae) # 関数を mondai と定義して、仮引数は namaeとする printf("\n%sを育てます: \n", namae) # printf を用いて入力した名前を表示 # ここで選択肢である 3つの文を 表示させる。 # 対話的な表示をするのためSTDERR.print を使用した。 STDERR.print("[1]\tおいしいご飯をあげる\n") STDERR.print("[2]\t公園で遊びに行く\n") STDERR.print("[3]\t一緒にエクササイズをする\n") end # def の end def niku(hizuke,undo) # 関数を niku と定義して、仮引数は hizuke と undo にした。 x = 4 * hizuke - undo # ここで体重増加分の計算をした。 printf("\n%d日目終了\n",hizuke+1) # 0日目ではなく 1日目と表示させたかったため hizuke+1 とした。 # printf("体重増加分 %d\n", x) # この文は確認用であるため " #" で省略。 x # ここでの x は 体重増加分の値である。 end # def の end STDERR.print("野良イヌがいました\n") # 対話的な表示をするのためSTDERR.print を使用した。 STDERR.print("かわいそうなので飼うことにしました。\n") # 上と同じプログラムである。 STDERR.print("どんな名前にしますか?\n") # 上と同じプログラムである。 namae = gets.chomp.to_i #キーボードからの入力を読み込むメソッドとしてgetsメソッドを使用 if namae == "" # もし入力する際、何も入力しなかった場合、 # 下の print の文を 表示する。 print("名前をつけないのはかわいそうなので「ぽち」と名付けます。\n") namae = "ぽち" # 入力しなかった場合、 変数 namae を 「ぽち」と定義した。 end # if の end printf("%sという名前にしました\n\n",namae) # printf を用いて入力した名前(または、「ぽち」)を表示 siawase = 1 # イヌのしあわせ度 taizyu = 1 # イヌの体重 day = 0 # 育ている日付 STDERR.print("鳴いてる分だけ大きくなるよ\n") STDERR.print("元気で活発な良いイヌに育てていきましょう!\n") while true # while true を使用することによって # 永久に繰り返しが継続し、終了しないようにした # そのため、繰り返しが終了するため、後に break を使用 nakigoe(siawase) # times メソッドで繰り返させている「ワン」を表示。 mondai(namae) # 選択肢を表示させるために、この文を使用。 kotae = gets.chomp.to_i # 先程あった 3つの選択肢をここで選ばせ入力させた siawase += day * kotae # ここで、しあわせ度の計算をした。 # printf("しあわせ度 happy=%d\n", siawase) # この文は確認用であるため " #" で省略。 taizyu += niku(day,kotae) # ここで、イヌの体重の計算をした。 # printf("体重 weight=%d\n", taizyu) # この文は確認用であるため " #" で省略。 if siawase > 4 # siawase の 値 が 4 より大きくなったとき繰り返しから抜ける。 break # 繰り返しから抜けるために break を使用。 end # 2 行前の if の end if taizyu > 4 # siawase の 値 が 4 より大きくなったとき繰り返しから抜ける。 break # 繰り返しから抜けるために break を使用 end # 2 行前の if の end nakigoe(kotae) # 選択した数字を 鳴き声の数としている。 day += 1 # 日にちが1ずつ増えていくように += 1 とする。 end # while の end nakigoe(taizyu) # 最終段階の体重が 鳴き声の数としている。 printf("\n%s は", namae) # printf を用いて名前を表示させた。 if taizyu > 9 # if 文を用いて、これから条件判断させている。 # taizyu の値 が 9 より大きいならば下の print の文を表示。 print("まるまる太ったかわいいイヌになりました。\n") print("もう少し運動させた方がよかったですね。\n") elsif taizyu <= 5 # 条件が 3つ以上のため elsif を使用。 # taizyu の値が 5以下ならば下の print の文を表示。 print("スタイルのよいきれいなイヌになりました。\n") print("このままのスタイルを維持してあげて下さい。\n") else # if と elsif の 条件以外の場合、下の print の文を表示。 # ここでは 5 以上 、9 未満 を表す。 print("よくなついたイヌになりました。\n") print("これからも仲良く暮らして下さい。\n") end # if の end 3、もとにしたプログラムからの変更点 講義中に作成したプログラム (def_rubiocci.rb) を基にした。 変更点として、プログラム自体はあまり変更していないが 表示する内容を大きく変化させていった。 4、実行結果 (3パターン) 1) pan{MATSUTA Taiki}% ./def_rollplaying_a.rb [~/Ruby] 野良イヌがいました かわいそうなので飼うことにしました。 どんな名前にしますか? hachi hachiという名前にしました 鳴いてる分だけ大きくなるよ 元気で活発な良いイヌに育てていきましょう! ワン hachiを育てます: [1] おいしいご飯をあげる [2] 公園で遊びに行く [3] 一緒にエクササイズをする 1 1日目終了 ワン ワン hachiを育てます: [1] おいしいご飯をあげる [2] 公園で遊びに行く [3] 一緒にエクササイズをする 1 2日目終了 ワン ワン ワン hachiを育てます: [1] おいしいご飯をあげる [2] 公園で遊びに行く [3] 一緒にエクササイズをする 1 3日目終了 ワン ワン ワン ワン ワン ワン ワン ワン ワン ワン hachi はまるまる太ったかわいいイヌになりました。 もう少し運動させた方がよかったですね。 2) pan{c110180}% ./def_rollplaying_a.rb [~/Ruby] 野良イヌがいました かわいそうなので飼うことにしました。 どんな名前にしますか? 名前をつけないのはかわいそうなので「ぽち」と名付けます。 ぽちという名前にしました 鳴いてる分だけ大きくなるよ 元気で活発な良いイヌに育てていきましょう! ワン ぽちを育てます: [1] おいしいご飯をあげる [2] 公園で遊びに行く [3] 一緒にエクササイズをする 3 1日目終了 ワン ワン ワン ワン ぽちを育てます: [1] おいしいご飯をあげる [2] 公園で遊びに行く [3] 一緒にエクササイズをする 3 2日目終了 ワン ワン ワン ワン ワン ワン ワン ぽちを育てます: [1] おいしいご飯をあげる [2] 公園で遊びに行く [3] 一緒にエクササイズをする 3 3日目終了 ワン ワン ワン ワン ぽち はスタイルのよいきれいなイヌになりました。 このままのスタイルを維持してあげて下さい。 3) pan{c110180}% ./def_rollplaying_a.rb [~/Ruby] 野良イヌがいました かわいそうなので飼うことにしました。 どんな名前にしますか? 名前をつけないのはかわいそうなので「ぽち」と名付けます。 ぽちという名前にしました 鳴いてる分だけ大きくなるよ 元気で活発な良いイヌに育てていきましょう! ワン ぽちを育てます: [1] おいしいご飯をあげる [2] 公園で遊びに行く [3] 一緒にエクササイズをする 1 1日目終了 ワン ワン ぽちを育てます: [1] おいしいご飯をあげる [2] 公園で遊びに行く [3] 一緒にエクササイズをする 2 2日目終了 ワン ワン ワン ワン ワン ぽちを育てます: [1] おいしいご飯をあげる [2] 公園で遊びに行く [3] 一緒にエクササイズをする 3 3日目終了 ワン ワン ワン ワン ワン ワン ワン ぽち はよくなついたイヌになりました。 これからも仲良く暮らして下さい。 5、結果の考察 計算が正しいか調べる。 1)の確かめ bc -l [~/Ruby] 1-1 0 1日目終了時の 体重 4*1-1 3 2日目での体重の増加分 4*2-1 7 3日目での体重の増加分 0+3+7 1日目終了時の体重へ2日目、 3日目の体重増加分を足していった 10 数値が 10 となったため、下の条件と一致したため この print の文を表示した。 if taizyu > 9 print("まるまる太ったかわいいイヌになりました。\n") print("もう少し運動させた方がよかったですね。\n") 結果と同様の結果が見られたため正しい。 2)の確かめ bc -l [~/Ruby] 1-3 -2 1日目終了時の 体重 4*1-3 1 2日目での体重の増加分 4*2-3 5 3日目での体重の増加分 -2+1+5 1日目終了時の体重へ2日目、 3日目の体重増加分を足していった 4 数値が 4 となったため、下の条件と一致したため この print の文を表示した。 elsif taizyu <= 5 print("スタイルのよいきれいなイヌになりました。\n") print("このままのスタイルを維持してあげて下さい。\n") 結果と同様の結果が見られたため正しい。 3)の確かめ bc -l [~/Ruby] 1-1 0 1日目終了時の 体重 4*1-2 2 2日目での体重の増加分 4*2-3 5 3日目での体重の増加分 0+2+5 1日目終了時の体重へ2日目、 3日目の体重増加分を足していった 7 数値が 7 となったため、下の条件と一致したため この print の文を表示した else print("よくなついたイヌになりました。\n") print("これからも仲良く暮らして下さい。\n") 結果と同様の結果が見られたため正しい。 すべての計算が結果と共に正しいことを確認できた。 3、感想 買い物時のレジは method の考え方を使って計算できると思った。 また、初期に販売した 「たまごっち」は、 今回 プログラム問題 B で作成した形と等しいと考えられる。 そのため、「たまごっち」もmethod の考え方を使ってできると思う。 4、参考文献 西村先生の2011 年度 基礎プログラミング II 講義ノート http://roy/~madoka/2011/r2/ 6、目的に応じて使ってみよう http://roy/~madoka/2011/r2/06/ 1. 電話番号サービス http://roy/~madoka/2011/r2/06/r2_06_02_theme_01_telephone.html 2. カウントダウン http://roy/~madoka/2011/r2/06/r2_06_03_theme_02_countdown.html 3. ガウスくんとルビ緒 http://roy/~madoka/2011/r2/06/r2_06_04_theme_03_gauss.html 4. 数値を指定して何度も計算させるには http://roy/~madoka/2011/r2/06/r2_06_05_theme_04_for.html 5. 続・ガウスくんとルビ緒 http://roy/~madoka/2011/r2/06/r2_06_06_theme_05_odd.html 6. なわとびの数 http://roy/~madoka/2011/r2/06/r2_06_07_theme_06_ary.html 7. 映画の星づけランキング http://roy/~madoka/2011/r2/06/r2_06_08_theme_07_aryavg.html 8. while 文で入力するとき http://roy/~madoka/2011/r2/06/r2_06_10_theme_08_while.html 9. るびおっち http://roy/~madoka/2011/r2/06/r2_06_11_theme_09_rubiocci.html 10. コマンドライン入力と method をあわせてみよう http://roy/~madoka/2011/r2/06/r2_06_14_theme_11_commandline.html 共同学習者 樋口 貴士 渡辺 龍