第 6 回 目的に応じて使ってみよう レポート課題 氏名: 鈴木椎菜 学籍番号: C1101276 語学クラス: 英語6 コース(系): 社会福祉コース 1.筆記問題 A. alphabet[18] = "s" alphabet[40] = "O" <理由> 配列は0から始まる。 それをふまえた表をつくり、[18]と[40]に当てはまる部分をさがした。 1 2 3 4 5 …10の位 0 a k u E O Y 1 b l v F P Z 2 c m w G Q 3 d n x H R 4 e o y I S 5 f p z J T 6 g q A K U 7 h r B L V 8 i s C M W 9 j t D N X 1 の 位 2.プログラム問題 <選択した問題: A> <設定> 期末試験の合計得点と平均点を求める。 <プログラム本体> #!/usr/koeki/bin/ruby total = Array.new # total を配列と設定 sum = 0 # sum を 0 と設定 print("期末試験 5教科の合計得点と平均点を計算します。\n") print("テストの得点をひとつずつ入力して下さい。\n") i = 0 # i を 0 と設定 o = 0 # o を 0 と設定 kamoku = ["国語","数学","英語","理科","社会"] # kamoku に配列の要素を代入していく while i <= 4 # i が 4 以下の時繰り返し printf(" %s の得点:",kamoku[i]) total[o] = gets.to_f # 入力した値を total配列に代入 i += 1 # i に 1 を加算代入 o += 1 # o に 1 を加算代入 end for score in total # total の要素を score にいれていく sum += score # score を sum に加算代入 end printf("ごうけいは%d点です\n", sum) ave = sum / total.length # sum を total配列に入っている要素の個数で割って ave に代入 printf("平均点は %4.1f点 です。\n", ave) <実行結果> 1回目 ------------------ pan{SUZUKI Shiina}% ./def_statistic.rb [~/Ruby] 期末試験 5教科の合計得点と平均点を計算します。 テストの得点をひとつずつ入力して下さい。 国語 の得点:80 数学 の得点:79 英語 の得点:99 理科 の得点:90 社会 の得点:83 ごうけいは431点です 平均点は 86.2点 です。 ------------------ 2回目 ------------------ pan{c110127}% ./def_statistic.rb [~/Ruby] 期末試験 5教科の合計得点と平均点を計算します。 テストの得点をひとつずつ入力して下さい。 国語 の得点:88 数学 の得点:80 英語 の得点:75 理科 の得点:84 社会 の得点:90 ごうけいは417点です 平均点は 83.4点 です。 ------------------ <考察> 実行結果1回目の計算結果の確認 ------------------------ pan{c110127}% bc -l [~/Ruby] (80 + 79 + 99 + 90 + 83) 431 431 / 5 86.20000000000000000000 ------------------------ 合っている。 実行結果2回目の計算結果の確認 ------------------------ pan{c110127}% bc -l [~/Ruby] (88 + 80 + 75 + 84 + 90) 417 417 / 5 83.40000000000000000000 ------------------------ 合っている。 また、入力したものを実数に変換(.to_f)しないと、 平均点の表示を実数に設定(%f)しても、整数として表示されてしまう。 <参考文献など> 基礎プログラミングII 第6回 講義中に作成した ary_jump.rb を改良しました。 -------------------------- -------------------------- <選択した問題: B> <設定> 突然現れたパンダを強くするために修業させる。 <プログラム本体> #!/usr/koeki/bin/ruby # chooseメソッド def choose(name) STDERR.printf("パンダ「%s師匠、今日はなんの修業ですか??」\n", name) STDERR.print("[0]\t笹をあげる\n") STDERR.print("[1]\t木登り\n") STDERR.print("[2]\tボクシング\n") STDERR.print("[3]\tダイビング\n") end # strengthメソッド 強さレベル def strength(date,action) # date = 日数 # action = 活動 if action == 1 || action == 2 || action == 3 # action が 1 か 2 か 3 の時 x = action * 2 + date # action を 3 倍して date を足した数を x に代入 else x = 0 # x に 0 を代入 end # printf("%d日目\n",date) # printf("強さ %d\n", x) return x # x を返す end # tsutareメソッド 疲れレベル def tsukare(date,action) # date = 日数 # action = 活動 if action == 1 || action == 2 || action == 3 # action が 1 か 2 か 3 の時 y = action * 2 # action を 2 倍した数 y に代入 else y = 0 # y に 0 を代入 end # printf("%d日目\n", date) # printf("疲れ %d\n", y) return y # y を返す end # powerメソッド 疲れレベルを減らす def power(action) # action = 活動 if action == 0 # もし action が 0 だったら down = - 2 # down に 2 を減算代入 end return down # down を返す end def kekka(tsuyo,tsuka,name) # kekka = 結果 # tsuyo = 強さ # tsuka = 疲れ if tsuka > 20 # tsuka が 20 より大きい場合 STDERR.print("パンダ「スパルタっすね…」\n") elsif tsuyo > 30 # tsuyo が 30 より大きい場合 STDERR.print("パンダ「力がみなぎってきたあ!!!」\n") elsif tsuyo > 20 # それ以外の場合 STDERR.printf("パンダ「%s師匠、こんなもんか」\n", name) else STDERR.print("パンダ「がっかりですよ…」\n") end end printf("弱そうなパンダが現れた!!\n") STDERR.print("パンダ「僕、強くなりたい!!") STDERR.print("あなたは師匠ですね!!お名前を教えて下さい!!」\n") name = gets.chomp! # 入力された値を文字列として name 代入 if name == "" # もしなんも入力されなかったら name = "先生" # name に "先生" を代入する end printf("%sという名前になった。\n",name) tired = 0 # 疲れレベル strong = 0 # 強さレベル day = 1 # 日付 printf("たまに食料を与えるといいよ!!\n") while true printf("%d日目\n", day) choose(name) # chooseメソッドを呼び出す answer = gets.to_i # answer に入力された値を数字として代入 strong += strength(day,answer) # strong に strengthメソッドを加算代入 printf("強さレベル %d\n", strong) tired += tsukare(day,answer) # tired に tsutareメソッドを加算代入 if answer == 0 # answer が 0 の時 tired += power(answer) # tried に powerメソッドを加算代入 end printf("疲れレベル %d\n", tired) if day >= 5 # day が 5 より大きい break # 繰り返しから抜ける end day += 1 # day に 1 を加算代入 end kekka(strong,tired,name) # kekkaメソッドを呼び出す print("パンダは、") if tired > 20 # tired が 20 より大きい場合 print("栄養が足りずに疲れ切って起き上がれないパンダ") elsif strong > 30 # strong が 30 より大きい場合 print("ムキムキマッチョ") elsif strong <= 30 && strong > 20 # strong が 30 以下かつ 20 より大きい場合 print("細マッチョ") else # それ以外の場合 print("修業前と同じ姿のまま") end print("になりました\n") <実行結果> 1回目 ------------------ pan{SUZUKI Shiina}% ./def_rollplaying_a.rb [~/Ruby] 弱そうなパンダが現れた!! パンダ「僕、強くなりたい!!あなたは師匠ですね!!お名前を教えて下さい!!」 しいな しいなという名前になった。 たまに食料を与えるといいよ!! 1日目 パンダ「しいな師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 3 強さレベル 7 疲れレベル 6 2日目 パンダ「しいな師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 1 強さレベル 11 疲れレベル 8 3日目 パンダ「しいな師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 0 強さレベル 11 疲れレベル 6 4日目 パンダ「しいな師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 2 強さレベル 19 疲れレベル 10 5日目 パンダ「しいな師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 1 強さレベル 26 疲れレベル 12 パンダ「しいな師匠、こんなもんか」 パンダは、細マッチョになりました -------------------- 2回目 -------------------- pan{SUZUKI Shiina}% ./def_rollplaying_a.rb [~/Ruby] 弱そうなパンダが現れた!! パンダ「僕、強くなりたい!!あなたは師匠ですね!!お名前を教えて下さい!!」 先生という名前になった。 たまに食料を与えるといいよ!! 1日目 パンダ「先生師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 2 強さレベル 5 疲れレベル 4 2日目 パンダ「先生師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 3 強さレベル 13 疲れレベル 10 3日目 パンダ「先生師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 2 強さレベル 20 疲れレベル 14 4日目 パンダ「先生師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 0 強さレベル 20 疲れレベル 12 5日目 パンダ「先生師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 3 強さレベル 31 疲れレベル 18 パンダ「力がみなぎってきたあ!!!」 パンダは、ムキムキマッチョになりました ------------------ 3回目 ------------------ pan{c110127}% ./def_rollplaying_a.rb [~/Ruby] 弱そうなパンダが現れた!! パンダ「僕、強くなりたい!!あなたは師匠ですね!!お名前を教えて下さい!!」 先生という名前になった。 たまに食料を与えるといいよ!! 1日目 パンダ「先生師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 3 強さレベル 7 疲れレベル 6 2日目 パンダ「先生師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 3 強さレベル 15 疲れレベル 12 3日目 パンダ「先生師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 3 強さレベル 24 疲れレベル 18 4日目 パンダ「先生師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 3 強さレベル 34 疲れレベル 24 5日目 パンダ「先生師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 0 強さレベル 34 疲れレベル 22 パンダ「スパルタっすね…」 パンダは、栄養が足りずに疲れ切って起き上がれないパンダになりました ---------------------- 4回目 ---------------------- pan{SUZUKI Shiina}% ./def_rollplaying_a.rb [~/Ruby] 弱そうなパンダが現れた!! パンダ「僕、強くなりたい!!あなたは師匠ですね!!お名前を教えて下さい!!」 しいな しいなという名前になった。 たまに食料を与えるといいよ!! 1日目 パンダ「しいな師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 3 強さレベル 7 疲れレベル 6 2日目 パンダ「しいな師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 0 強さレベル 7 疲れレベル 4 3日目 パンダ「しいな師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 0 強さレベル 7 疲れレベル 2 4日目 パンダ「しいな師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 1 強さレベル 13 疲れレベル 4 5日目 パンダ「しいな師匠、今日はなんの修業ですか??」 [0] 笹をあげる [1] 木登り [2] ボクシング [3] ダイビング 1 強さレベル 20 疲れレベル 6 パンダ「がっかりですよ…」 パンダは、修業前と同じ姿のままになりました --------------------- <考察> 強さレベルの計算 strengthメソッド x = action * 2 + date 疲れレベルの計算 tsukareメソッド y = action * 2 ------------------------- pan{c110127}% bc -l [~/Ruby] 3 * 2 + 1 # 3 を選んだ場合の強さレベルの計算 7 3 * 2 # 3 を選んだ場合の疲れレベルの計算 6 2 * 2 + 1 # 2 を選んだ場合の強さレベルの計算 5 2 * 2 # 2 を選んだ場合の疲れレベルの計算 4 1 * 2 + 1 # 1 を選んだ場合の強さレベルの計算 3 1 * 2 # 1 を選んだ場合の疲れレベルの計算 2 ------------------------- 選択肢の選び方 疲れレベルが 20 より大きくなると 「栄養が足りずに疲れ切って起き上がれないパンダ」 になってしまう。 (1) 3 を 4回 以上選ぶ。 (2) 3 を 3回 と 2 を 2回 を選ぶ。 (3) 3 を 3回 と 1 を 2回 を選ぶ。 この 3通りだけが この結果になる。 強さレベルが 20 以下だと 「修業前と同じ姿のまま」になる。 (1) 0 を 3回 以上選ぶ。 (2) 1 を 4回 以上選ぶ。 (3) 1 を 3回 と (2 を 2回) または (2 と 0) (4) 1 と 0 しか選ばない (5) 全部を 1回ずつ と 0 または 1 または 2 この 5つが確実にこの結果になるものである。 強さレベルが 20 より大きく、30 以下だと 「細マッチョ」になる。 (1) 2 を 4回以上選ぶ (2) 3 を 3回と 0 か (1 を 2回) または (2 と 1 か 0) (3) 3 を 2回と (2 と 1 の組み合わせ) または (2 か 1 を 3回) (4) 全部を 1回ずつ と 3 この 4つが確実にこの結果になるものである。 強さレベルが 30 より大きくなると 「ムキムキマッチョ」になる。 (1) 3 を 4回以上選ぶ (2) 3 を 3回と 2 を 2回 この 2通りだけが この結果になる。 <参考文献など> 基礎プログラミングII 第6回 講義中に作成した def_rubiocci.rb を改良しました。 3.感想 着せ替えのようなゲームは、メソッドに帽子、トップス、ボトムス、靴などの 要素を含ませて何度も繰り返して遊ぶことができるのではないかと思った。 たとえば、 def kisekae(hat, tops, bottoms, shoose) のようなものだ。 4.参考文献など 書く項目に記しています。 --------------------------- 東北公益文科大学 公益学部 公益学科 2年 鈴木椎菜 c110127@f.koeki-u.ac.jp