第6回 目的に応じて使ってみよう レポート課題 氏名 : 畠山 貴衣 学籍番号 : C1101709 語学クラス : 英語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] = "r" ・alphabet[18] は、配列の18番目の文字を指しているので、alphabet配列の18 番目に位置している "r"になる。 alphabet[40] = nil ・alphabet[40] は、配列の40番目の文字を指しているが、この配列には26文字 しか無いため、存在しないという意味を持つ nil となる。 [2]プログラム問題 ------------------------------------------------------ A (設定) GPAの平均を求めるプログラムを作成した。 入力された数値を配列に取りこんで平均を出す。 (プログラム) #!/usr/koeki/bin/ruby kyouka = 1 def gpa(seiseki,kaisuu) #seisekiは様々な数値が入る配列 all = 0.0 #GPAの平均を求めたいので小数にしておく。 for average in seiseki all += average #入力された数字を足す end all / kaisuu #平均を求める計算 end grade = Array.new #新しい配列(GPAを聞く) print"これからあなたの成績をお聞きします。\n" print"GPAは1〜4の数字で入力して下さい。\n" print"終了する場合は'99'と入力して下さい。\n\n" while true printf("%dつ目の教科のGPAを入力して下さい:",kyouka) #値を聞く kazu = gets.to_f #GPAをkazuとして入力してもらう if kazu == 99 #kazuが入力されなかったらwhileを出る break elsif kazu > 4 #kazuが4より大きいときの処理 print"1〜4で入力して下さい。\n" kazu = nil #入力の数字を無かったことに kyouka -= 1 #kyoukaを1減らす end kyouka += 1 #kyoukaを1足す grade << kazu.to_f #配列に数を追加 end kyouka -= 1 #99(break)分を減らす printf("\nあなたの今期のGPAは %2.1f です\n", gpa(grade,kyouka)) (変更点) もとにしたのは def_ary_movie.rb で、大きく変更した点は、21行目の繰り返し 表示される文を print ではなく printf を使用し、何個目の入力か一目で分か るようにしたところである。 また、今回はGPAの平均を求めたいので、1〜4以外の数字を入力された際の対処 をつけくわえた。 (実行結果) ----------問題ない場合--------------- pan{c110170}% ./def_statistic.rb [~/Ruby] これからあなたの成績をお聞きします。 GPAは1〜4の数字で入力して下さい。 終了する場合は'99'と入力して下さい。 1つ目の教科のGPAを入力して下さい:3 2つ目の教科のGPAを入力して下さい:4 3つ目の教科のGPAを入力して下さい:2 4つ目の教科のGPAを入力して下さい:3 5つ目の教科のGPAを入力して下さい:4 6つ目の教科のGPAを入力して下さい:3 7つ目の教科のGPAを入力して下さい:99 あなたの今期のGPAは 3.2 です ------確かめ------- pan{c110170}% bc -l [~/Ruby] 3+4+2+3+4+3 19 19/6 3.16666666666666666666 quit ------------間違いがある場合--------------- pan{HATAKEYAMA Kie}% ./def_statistic.rb [~/Ruby] これからあなたの成績をお聞きします。 GPAは1〜4の数字で入力して下さい。 終了する場合は'99'と入力して下さい。 1つ目の教科のGPAを入力して下さい:3 2つ目の教科のGPAを入力して下さい:2 3つ目の教科のGPAを入力して下さい:3 4つ目の教科のGPAを入力して下さい:4 5つ目の教科のGPAを入力して下さい:55 1〜4で入力して下さい。 5つ目の教科のGPAを入力して下さい:4 6つ目の教科のGPAを入力して下さい:5 1〜4で入力して下さい。 6つ目の教科のGPAを入力して下さい:4 7つ目の教科のGPAを入力して下さい:99 あなたの今期のGPAは 3.3 です ------確かめ-------- pan{c110170}% bc -l [~/Ruby] 3+2+3+4+4+4 20 20/6 3.33333333333333333333 quuit (考察) 実行結果で示した通り、 bc -l で確かめを行ったところ、結果がおなじになる。 計算では小数第2位で繰り上げを行っている。これも bc -l で確かめた際に表示 されるものと比較してもきちんと繰り上げられていることが分かる。 上記より、計算は正しいといえる。 今回は redo を使わないように正しくない入力がされた場合、kazu と kyoukaを 無かったことにする作業を書き加えてみた。 その結果、計算が合ったので redo したときとおなじ結果が獲られると言うこと が分かった。 B (設定) ダイエットをするプログラムで、選択してもらって結果が異るように設定した。 (プログラム) #!/usr/koeki/bin/ruby def revel(count) #メソッドの設定 count.times do print("Fightっ☆\t") #繰り返し表示する文 end print("\n") sleep(0.5) end def koudou(name) #繰り返しの質問文 STDERR.print("\n") STDERR.printf("%sさん、何をしますか??\n",name) STDERR.print("1.食事をヘルシーにする\n") STDERR.print("2.軽い運動をする\n") STDERR.print("3.ジムに行く\n") end print("ダイエット始めますよ〜!\n") #始めに表示する文 STDERR.printf("あなたの名前は??\n") #名前を入力してもらう name = gets.chomp #入力を読みこむ if name == "" #空欄だった場合 name = "ジョン" #名前をジョンと設定 end printf("%sさん、頑張りましょうね!\n",name) print("無理に運動するとストレスでリバウンドしてしまうので注意してね\n") stress = 0 #溜ったストレス weight = 0 #落ちた体重 day = 0 #ダイエット開始からの日付 while true #繰り返しのメソッド koudou(name) #メソッドの読みこみ ans = gets.chomp.to_i #答えの入力を求める stress += 1 * ans #ストレスの増やし方 weight += 0.3 * ans #体重の減らし方 printf("落ちた体重 %2.1f kg\n",weight) #落とした体重の合計の表示 revel(day) #メソッドの表示 if stress > 15 #ストレスが10を超えたら繰り返しを抜ける break elsif weight > 4 #体重が4kg以上になったら繰り返しを抜ける break elsif day == 7 #7日たったら繰り返しを抜ける break end day += 1 #日を足す # p stress 確かめるためにストレスを表示させた end print("\n") #以下、結果の表示 print("----------------------------------------\n") printf("%sさんお疲れ様でした。\n",name) printf("%sさんは",name) if stress > 14 #ストレスが10より大きい場合 print"過度の運動でストレスがたまってリバウンドしちゃいました。\n" print"もう一回挑戦してね\n" elsif weight > 3.5 #体重が3.5kg以上減った場合 printf("%2.1fkg減量成功!\n",weight) print("これからもキープしてね。\n") else printf("%2.1fkg 減量成功\n",weight) print("もうちょっと頑張ろう\n") end print("----------------------------------------\n") (実行結果) 設定したエンディングが3つなので、3つの実行結果を載せる。 -----------結果1--------------- pan{HATAKEYAMA Kie}% ./def_rollplaying_a.rb [~/Ruby] ダイエット始めますよ〜! あなたの名前は?? you youさん、頑張りましょうね! 無理に運動するとストレスでリバウンドしてしまうので注意してね youさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 3 落ちた体重 0.9 kg youさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 3 落ちた体重 1.8 kg Fightっ☆ youさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 3 落ちた体重 2.7 kg Fightっ☆ Fightっ☆ youさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 3 落ちた体重 3.6 kg Fightっ☆ Fightっ☆ Fightっ☆ youさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 3 落ちた体重 4.5 kg Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ ---------------------------------------- youさんお疲れ様でした。 youさんは過度の運動でストレスがたまってリバウンドしちゃいました。 もう一回挑戦してね ---------------------------------------- -----------結果2--------------- pan{c110170}% ./def_rollplaying_a.rb [~/Ruby] ダイエット始めますよ〜! あなたの名前は?? ジョンさん、頑張りましょうね! 無理に運動するとストレスでリバウンドしてしまうので注意してね ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 2 落ちた体重 0.6 kg ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 2 落ちた体重 1.2 kg Fightっ☆ ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 2 落ちた体重 1.8 kg Fightっ☆ Fightっ☆ ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 2 落ちた体重 2.4 kg Fightっ☆ Fightっ☆ Fightっ☆ ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 2 落ちた体重 3.0 kg Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 2 落ちた体重 3.6 kg Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 2 落ちた体重 4.2 kg Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ ---------------------------------------- ジョンさんお疲れ様でした。 ジョンさんは4.2kg減量成功! これからもキープしてね。 ---------------------------------------- -----------結果3--------------- pan{c110170}% ./def_rollplaying_a.rb [~/Ruby] ダイエット始めますよ〜! あなたの名前は?? ジョンさん、頑張りましょうね! 無理に運動するとストレスでリバウンドしてしまうので注意してね ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 1 落ちた体重 0.3 kg ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 1 落ちた体重 0.6 kg Fightっ☆ ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 1 落ちた体重 0.9 kg Fightっ☆ Fightっ☆ ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 1 落ちた体重 1.2 kg Fightっ☆ Fightっ☆ Fightっ☆ ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 1 落ちた体重 1.5 kg Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 1 落ちた体重 1.8 kg Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 1 落ちた体重 2.1 kg Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 1 落ちた体重 2.4 kg Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ Fightっ☆ ---------------------------------------- ジョンさんお疲れ様でした。 ジョンさんは2.4kg 減量成功 もうちょっと頑張ろう ---------------------------------------- (考察) 今回は計算がなかなか合わなかったので、pメソッドを使用して表示して確認し ながら作った。その結果が合ったので、pメソッドを#でコメント扱いにした。 (消してしまったのもある。) 体重の減り方を weight += 0.3 * ans としたので、 これが合っているか確かめてみる。 -------------------------------------- ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 2 落ちた体重 0.6 kg ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 3 落ちた体重 1.5 kg Fightっ☆ ジョンさん、何をしますか?? 1.食事をヘルシーにする 2.軽い運動をする 3.ジムに行く 1 落ちた体重 1.8 kg Fightっ☆ Fightっ☆ ----------------------------------------- これを bc -l で確かめ算してみると、 ----------------------------- pan{HATAKEYAMA Kie}% bc -l [~/Ruby] 0.3*2 #最初の選択の計算 0.6 0.3*3 #2番目の選択の計算 0.9 0.6+0.9 #1番目と2番目の計算結果の合計 1.5 0.3*1 #3番目の選択の計算 0.3 1.5+0.3 #1番目から3番目の計算結果の合計 1.8 #最終計算結果 quit ----------------------------- 上記から分かる通り、計算結果が等しくなるのでプログラムが正しく動いている ことが分かる。 よって、プログラムは正常に動いていると言える。 [3]感想 ・モバイル番の診断ゲームは今回のるびおっちゲームのように選択して結果を出 したり、ランダムに結果を表示するメソッドを使用して作れると思った。 ・今回の def_statistic.rb で、回数を表示させると nil で終われなかったり、 gets.to_f として貰って来る値を小数で受け取らなければ出来なかったりと、 様々な問題点が出てきてしまって思ったよりもかなり時間がかかった。 ・るびおっち的ゲームは、もとのプログラムを参考に1から作って行ったが、作っ ている最中に働きが分からないメソッドが多く存在していたので、コメント扱 いにして実行してみたり、共同製作者の桜子さんと働きについて話し合ったり していたため、とても時間がかかった。 [4]参考文献 西村まどか先生 第6回 目的に応じて使ってみよう http://roy/~madoka/2011/r2/06/ 協同製作者 : 伊藤桜子 ----------------------------------- 東北公益文科大学  公益学部 公益学科 2年 畠山貴衣  c110170@f.koeki-u.ac.jp