第6回 目的に応じて使ってみよう レポート課題 氏名:伊藤桜子 学籍番号:c1100265 語学クラス:英語6 コース:政策マネジメント 1、筆記問題 A 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] alphabet[18]は[]内の18番目の文字ということである。 0番目から始まっているので18番目の文字は「s」である。 ◯alphabet[40] alphabet[40]は[]内の40番目の文字を示しているが、アルファベット に40番目の文字はないのでどうなるのかわからなかった。 そこで実際にプログラムを作って確かめてみた。 ●プログラム #!/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"] print("18番目は\n") printf("%s\n", alphabet[18]) print("40番目は\n") printf("%s\n", alphabet[40]) ●実行結果 pan{c110026}% ./alphabet.rb [~/Ruby] 18番目は s 40番目は pan{c110026}% [~/Ruby] となった。よってalphabet[40]はnilということだとわかった。 2、プログラム問題 A ◯考えた設定 気温を入力してもらい、平均気温が求められるプログラム ◯プログラム #!/usr/koeki/bin/ruby def average(kion) sum = 0.0 # 割り算をするので浮動小数点数にしておく for ondo in kion # for A in B で B の中の A について sum += ondo #sum(合計)にondo(温度)を足していく end sum / kion.length #合計を割り、平均を求める end temp = Array.new # 配列 temp を作る print("平均気温を求めます。(終了はCtrl-D)\n") while true #繰り返しのメソッド print("\n") STDERR.print "気温を入力して下さい: " nyuuryoku = gets if nyuuryoku == nil break #もしnyuuryokuがnil(空の情報)だったらwhile trueから #抜ける end temp << nyuuryoku.to_f #nyuuryokuを小数にしてtempに追加する # p temp end print("\n") printf("\n 平均気温は %3.1f℃ です\n", average(temp)) ◯もとにしたプログラムからの変更点 授業で使ったdef_ary_movie.rbをもとにした。 変数名を変え、自分で見て理解しやすいようにした。 ◯実行結果 ●整数のみを入力した場合 pan{c110026}% ./def_statistic.rb [~/Ruby] 平均気温を求めます。(終了はCtrl-D) 気温を入力して下さい: 12 気温を入力して下さい: 10 気温を入力して下さい: 16 気温を入力して下さい: 18 気温を入力して下さい: 13 気温を入力して下さい: ^D 平均気温は 13.8℃ です ●整数と小数を入力した場合 pan{ITO Sakurako}% ./def_statistic.rb [~/Ruby] 平均気温を求めます。(終了はCtrl-D) 気温を入力して下さい: 13 気温を入力して下さい: 14.5 気温を入力して下さい: 18 気温を入力して下さい: 9.6 気温を入力して下さい: 13 気温を入力して下さい: ^D 平均気温は 13.6℃ です ●小数のみを入力した場合 pan{ITO Sakurako}% ./def_statistic.rb [~/Ruby] 平均気温を求めます。(終了はCtrl-D) 気温を入力して下さい: 13.5 気温を入力して下さい: 15.7 気温を入力して下さい: 11.1 気温を入力して下さい: 14.6 気温を入力して下さい: ^D 平均気温は 13.7℃ です ◯考察 ●整数のみの場合 計算が合っているかbc -lで確かめてみると pan{c110026}% bc -l [~/Ruby] (12+10+16+18+13)/5 13.80000000000000000000 quit となり、実行結果と一致していることがわかった。 ●整数と小数の場合 計算が合っているかbc -lで確かめてみると pan{c110026}% bc -l [~/Ruby] (13+14.5+18+9.6+13)/5 13.62000000000000000000 quit となり、実行結果と一致していることがわかった。 また、小数点第2位以下が切り捨てになっているので正しく表示できている ことがわかる。 ●小数のみの場合 計算が合っているかbc -lで確かめてみると pan{c110026}% bc -l [~/Ruby] (13.5+15.7+11.1+14.6)/4 13.72500000000000000000 quit となり、実行結果と一致していることがわかる。 また、小数点2位以下が切り捨てになっているので正しく表示できている ことがわかる。 以上のことから、このプログラムは正しいといえる。 B ◯考えた設定 お金の使い方について選択肢を出して聞きだし、そのデータに応じて 結果が変わるプログラム ◯プログラム #!/usr/koeki/bin/ruby def okane(charin) # 「ちゃりーん♪」を表示させる関数 # 変数名 = okane 仮引数 = charin charin.times do # 繰り返しを表す print("ちゃりーん♪\t") end print("\n") end def message(name) # 選択肢を表示させる関数 変数名=massage 仮引数=name STDERR.printf("%s!!今日は何をする?番号で選んで!!: \n", name) STDERR.print("[1]\tバイトをする\n") STDERR.print("[2]\t寝る\n") STDERR.print("[3]\t遊ぶ\n") end def keka(hi,kane) #お金持ち度を出す x = 4 * (hi - 1) - kane #お金持ち度 x = 4 * 日にち - 選択した番号 printf("%d日目\n",hi) #何日目かを表示させる printf("お金持ち度 %d\n", x) # お金持ち度の表示 x end STDERR.printf("あなたの名前を教えて下さい。\n") name = gets.chomp # 名前を入力してもらう if name == "" #もし名前の入力が無かったら name = "ちゃり子" #名前を「ちゃり子」とする end printf("あなたは%sです!!\n",name) # 名前の表示 ch = 0 # ちゃりーん♪の数 point = 0 # お金ポイント hiniti = 0 # 何日目か print("\n") while true okane(point) # ちゃりーん♪の表示 message(name) # 質問文の表示 kotae = gets.to_i # 入力してもらった番号 hiniti += 1 point += keka(hiniti,kotae) # pointにkeka(hiniti,kotae)を足していく printf("お金ポイント=%d\n", point) # お金ポイントを表示させる if kotae > 3 # もし入力してもらった番号が3より大きかったら sleep(1) print("1〜3の番号を選んで下さい!!\n") break # 終了させる end if point > 10 #もしお金ポイントが10より大きかったら break #終了させる end end okane(point) # 最終段階のポイントの数がちゃりーん♪となって表示される sleep(0.5) print("\n") printf("%sは", name) if point >= 20 print("今のところ充分お金があるみたいね!!この調子よ!!\n") elsif point <= 15 print("遊びすぎよ!!\n") else print("まあまあみたいね。\n") end ◯もとにしたプログラムからの変更点 授業で使った「るびおっちゲーム」def_rubiocci.rbをもとにした。 関数の変数名と仮引数を変えた。また、お金持ち度を表す計算式も変えた。 選択肢より大きい番号が入力された場合は終了するように設定した。 ◯実行結果 ●名前を「sakurako」として全て1番を選択した場合 pan{c110026}% ./def_rollplaying_a.rb [~/Ruby] あなたの名前を教えて下さい。 sakurako あなたはsakurakoです!! sakurako!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 1 1日目 お金持ち度 -1 お金ポイント=-1 sakurako!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 1 2日目 お金持ち度 3 お金ポイント=2 ちゃりーん♪ ちゃりーん♪ sakurako!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 1 3日目 お金持ち度 7 お金ポイント=9 ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ sakurako!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 1 4日目 お金持ち度 11 お金ポイント=20 ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ sakurakoは今のところ充分お金があるみたいね!!この調子よ!! ●名前を入力せず、全て2番を選択した場合 pan{ITO Sakurako}% ./def_rollplaying_a.rb [~/Ruby] あなたの名前を教えて下さい。 あなたはちゃり子です!! ちゃり子!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 2 1日目 お金持ち度 -2 お金ポイント=-2 ちゃり子!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 2 2日目 お金持ち度 2 お金ポイント=0 ちゃり子!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 2 3日目 お金持ち度 6 お金ポイント=6 ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ちゃりーん♪ ちゃり子!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 2 4日目 お金持ち度 10 お金ポイント=16 ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ちゃりーん♪ ちゃり子はまあまあみたいね。 ●名前を「sakurako」として全て3番を選択した場合 pan{ITO Sakurako}% ./def_rollplaying_a.rb [~/Ruby] あなたの名前を教えて下さい。 sakurako あなたはsakurakoです!! sakurako!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 3 1日目 お金持ち度 -3 お金ポイント=-3 sakurako!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 3 2日目 お金持ち度 1 お金ポイント=-2 sakurako!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 3 3日目 お金持ち度 5 お金ポイント=3 ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ sakurako!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 3 4日目 お金持ち度 9 お金ポイント=12 ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ちゃりーん♪ ちゃりーん♪ sakurakoは遊びすぎよ!! ●名前を入力せず、1〜3番までを入力した場合 pan{ITO Sakurako}% ./def_rollplaying_a.rb [~/Ruby] あなたの名前を教えて下さい。 あなたはちゃり子です!! ちゃり子!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 1 1日目 お金持ち度 -1 お金ポイント=-1 ちゃり子!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 2 2日目 お金持ち度 2 お金ポイント=1 ちゃりーん♪ ちゃり子!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 3 3日目 お金持ち度 5 お金ポイント=6 ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ちゃりーん♪ ちゃり子!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 1 4日目 お金持ち度 11 お金ポイント=17 ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ ちゃりーん♪ちゃりーん♪ ちゃりーん♪ ちゃり子はまあまあみたいね。 ●名前を入力せず、3番より大きい数を入力した場合 pan{ITO Sakurako}% ./def_rollplaying_a.rb [~/Ruby] あなたの名前を教えて下さい。 あなたはちゃり子です!! ちゃり子!!今日は何をする?番号で選んで!!: [1] バイトをする [2] 寝る [3] 遊ぶ 7 1日目 お金持ち度 -7 お金ポイント=-7 1〜3の番号を選んで下さい!! ちゃり子は遊びすぎよ!! ◯考察 ●名前を「sakurako」として全て1番を選択した場合 名前は正しく表示されていることが分かる。 お金持ち度が正しく表示されているかを調べるためにbc -lで 確かめると pan{ITO Sakurako}% bc -l [~/Ruby] 4*(1-1)-1 -1 4*(2-1)-1 3 4*(3-1)-1 7 4*(4-1)-1 11 となり、実行結果と一致していることがわかる。 また、最終的なお金ポイントはお金持ち度を足していった結果なので -1+3+7+11 20 となり、お金ポイントも実行結果と一致していることがわかる。 お金ポイントは20で、ポイントが20以上のときに表示させるprint文が 表示できていることも実行結果から確認できた。 ●名前を入力せず、全て2番を選択した場合 名前を入力しない場合、名前が「ちゃり子」と設定されていることが確認できる。 また、お金持ち度の計算結果を確かめてみると pan{ITO Sakurako}% bc -l [~/Ruby] 4*(1-1)-2 -2 4*(2-1)-2 2 4*(3-1)-2 6 4*(4-1)-2 10 となり、実行結果と一致していることがわかった。 またお金ポイントは -2+2+6+10 16 となり、これも実行結果と一致していることがわかる。 お金ポイントが16のときに表示させるようにしたprint文も正確に表示できてい ることがわかる。 ●名前を「sakurako」として全て3番を選択した場合 名前が「sakurako」として表示されていることがわかる。 お金持ち度の計算は pan{c110026}% bc -l [~/Ruby] 4*(1-1)-3 -3 4*(2-1)-3 1 4*(3-1)-3 5 4*(4-1)-3 9 となり、実行結果と一致していることがわかる。 また、お金ポイントはお金持ち度を足した数なので -3+1+5+9 12 となり、実行結果と一致していることが分かる。 最後の文もif文で設定したとおりに表示されていることがわかる。 ●名前を入力せず、1〜3番までを入力した場合 名前は入力しなかった場合、「ちゃり子」として表示できることが確認できた。 お金持ち度の計算を確かめてみると pan{c110026}% bc -l [~/Ruby] 4*(1-1)-1 -1 4*(2-1)-2 2 4*(3-1)-3 5 4*(4-1)-1 11 となり、実行結果と一致していることがわかる。 また、お金ポイントはお金持ち度の合計なので -1+2+5+11 17 となり、これも実行結果と一致していることがわかる。 結果文もif文で設定したとおりに表示できていることが確認できる。 ●名前を入力せず、3番より大きい数を選択した場合 名前を入力しなかった場合、「ちゃり子」として表示できていることが 実行結果から確認できた。 3より大きい数を入力するとwhile trueから抜け出せるように設定 したが、入力した数のまま計算されてしまった。計算された結果から 最後の結果文も表示されてしまったが、最終的にwhile trueから 抜け出せていることがわかった。 ---------------------------------------------------------------------------- 結果文はお金ポイントが20以上の場合、15以下の場合、それ以外の場合の 3つに場合分けしてそれぞれの文を表示できるようにした。 実行結果から、それぞれの場合で正しく表示できていることがわかった。 以上から、名前の表示、計算、最後の結果文は全て正しく表示されていることが わかったのでこのプログラムは正しいといえる。 3、感想 人生ゲームや心理テストが考えられる。 人生ゲームはルーレットを回して出た数だけ進み、着いたマスで課せられた 条件を果たす。そしてまたルーレットを回す動作を繰り返す。ifメソッド やwhileメソッドが使えると思うので人生ゲームがあてはまると考えた。 心理テストは質問に答えていき、入力されたデータによって結果が変わる ので今回のようにdefメソッド、ifメソッド、whileメソッドが使えると考える。 今回の課題は授業の復習から始まり、どのメソッドが何の役割を果たしているの かを理解することに時間をかけた。筆記問題もプログラム問題も自分なりに理解 できたと思うので今後も学んだことを活かしていきたい。 4、参考文献 ◯西村先生の後期第6回授業ページ「映画の星づけランキング」 http://roy/~madoka/2011/r2/06/r2_06_08_theme_07_aryavg.html ◯西村先生の後期第6回授業ページ「るびおっち」 http://roy/~madoka/2011/r2/06/r2_06_11_theme_09_rubiocci.html ◯西村先生の後期第5回授業ページ「自作のメソッド」 http://roy/~madoka/2011/r2/05/r2_05_03_review_01_selfmademethod.html ◯協同学習者 畠山貴衣さんと齋藤陽香さんとメソッドの働きの確認を行った 東北公益文科大学 公益学部 公益学科 2年 伊藤桜子 c110026@f.koeki-u.ac.jp