第6回 基礎プログラミング II レポート課題 氏名: 池田博哉 学籍番号: c1090147 語学クラス: 英語3 コース(系): 地域共創 1.筆記問題 A.まずはプログラム「alphabet.rb」を作成し、実行してみた。 ------------------------------------------------------------------------------- #!/usr/koeki/bin/ruby alpha = ["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("アルファベットで何に当たるか、番号で検索します。\n") print("(配列では 0 から始まります)\n") sleep 1 STDERR.print("何番目ですか? :") number = gets.chomp.to_i #入力したものを数値にする #p number #p alpha[number] sleep 1 if number > 25 print("存在しません!\n") else printf("%d 番目は 「%s」です。\n", number, alpha[number]) end ------------------------------------------------------------------------------- ↓ ------------------------------------------------------------------------------- pan{c109014}% ./alphabet.rb [~/Ruby] アルファベットで何に当たるか、番号で検索します。 (配列では 0 から始まります) 何番目ですか? :0 0 番目は 「a」です。 pan{c109014}% ./alphabet.rb [~/Ruby] アルファベットで何に当たるか、番号で検索します。 (配列では 0 から始まります) 何番目ですか? :18 18 番目は 「s」です。 pan{c109014}% ./alphabet.rb [~/Ruby] アルファベットで何に当たるか、番号で検索します。 (配列では 0 から始まります) 何番目ですか? :25 25 番目は 「z」です。 an{c109014}% ./alphabet.rb [~/Ruby] アルファベットで何に当たるか、番号で検索します。 (配列では 0 から始まります) 何番目ですか? :40 存在しません! ------------------------------------------------------------------------------- 配列で番号を数える場合は[0]から始まるので、0番目は a となり、その順番で 行くと18番目は「s」となる。 「z」は25番目で、26番目以降はないので、40番目は存在しない。 2.プログラム問題 A.◯考えた設定 テストの点数を入力し、その平均点を求めるプログラム。平均点に応じて、 表示されるコメントが変わるようにした。 ◯元にしたプログラムからの変更点 講義で作成した「def_ary_movie.rb」 ・配列の名前を変更 ・if文を追加 ◯プログラム本体「def_statistic.rb」 ------------------------------------------------------------------------------- #!/usr/koeki/bin/ruby def ave(sukoa) # scoreは数値がたくさんしまわれる配列 total = 0.0 # 割り算する予定なので浮動小数点数にしておく for exam in sukoa # for A in B で B の中の A について total += exam # total に足す end total / sukoa.length # total を sukoa 数 で割る end tensu = Array.new # 配列 tensu を作る print("テストの点数を1科目ずつ教えて下さい。\n") print("(Ctrl-d で終了)\n\n") while true STDERR.print "点数: " line = gets if line == nil # Ctrl-d で終了させる break end tensu << line.to_i end sleep 1 printf("\nあなたの平均点は %3.1f 点です。\n", ave(tensu)) if ave(tensu) == 100 print("素晴らしい!!\n") elsif ave(tensu) >= 90 print("さすが!\n") elsif ave(tensu) >= 71 && ave(tensu) <= 89 print("なかなか頑張ってるねー!\n") elsif ave(tensu) >= 46 && ave(tensu) <= 70 print("ガンバー!\n") elsif ave(tensu) == 0 print("明日から補習です。\n") else print("やるね〜!\n") end ------------------------------------------------------------------------------- ◯実行結果 最初の実行結果では、 ------------------------------------------------------------------------------- pan{c109014}% ./def_statistic.rb [~/Ruby] テストの点数を1科目ずつ教えて下さい。 (Ctrl-d で終了) 点数(Ctrl-dで終了): 100 点数(Ctrl-dで終了): 10 点数(Ctrl-dで終了): 35 点数(Ctrl-dで終了): 64 点数(Ctrl-dで終了): 7 点数(Ctrl-dで終了): ^D あなたの平均点は NaN 点です。 やるね〜! ------------------------------------------------------------------------------- となり、点数の部分が「NaN」になってしまった。 そのあとに、「tensu << line.to_i」をwhile文の下に入れて実行してみた。 ------------------------------------------------------------------------------- pan{c109014}% ./def_statistic.rb [~/Ruby] テストの点数を1科目ずつ教えて下さい。 (Ctrl-d で終了) 点数: 54 点数: 78 点数: 34 点数: 45 点数: 61 点数: ^D あなたの平均点は 54.4 点です。 ガンバー! ------------------------------------------------------------------------------- ◯考察 ・Ktermで確認計算 pan{c109014}% bc -l [~/Ruby] (54 + 78 + 34 + 45 + 61) / 5 54.40000000000000000000 よって、プログラムの計算は合っている。 最初上手く実行出来なかったのは、入力した文字を整数に変換していなかっ たので、計算が出来なかったのだと思う。2回目の実行結果のように、line として取り込んだ文字列を to_i で整数に変換する文を入れると、計算が 行われた。 それなら line = gets の時点で to_i を入れておけば、下で入力しておく 必要はないと思い、試しに実行してみた。 ------------------------------------------------------------------------------- pan{c109014}% ./def_statistic.rb [~/Ruby] テストの点数を1科目ずつ教えて下さい。 (Ctrl-d で終了) 点数: 54 点数: 78 点数: 34 点数: 45 点数: 61 点数: 点数: 点数: ^C./def_statistic.rb:17:in `gets': Interrupt from ./def_statistic.rb:17 ------------------------------------------------------------------------------- と、Ctrl-d を押すと何回も 点数: が出てきて終了出来なくなった。if文 の前に整数に変換してしまうと、Ctrl-d を押しても認識しなくなるのだと 思う。 B.◯考えた設定 猫の育て方によって成長の仕方が変わるプログラム。体重に応じて、最後 に表示されるコメントが変わる。 ◯元にしたプログラムからの変更点 講義で作成した「def_rubiocci.rb」 ・if文の数値を変更 ・配列を設定に合ったものに変更 ・鳴き声を目盛りに変更 ◯プログラム本体「def_rollplaying_a.rb」 ------------------------------------------------------------------------------- #!/usr/koeki/bin/ruby def okisa(maru) maru.times do print("●") end print("\n") sleep 0.5 end def situke(name) STDERR.print("[1]\t餌をやる\n") STDERR.print("[2]\t自由気ままにさせる\n") STDERR.print("[3]\t遊ばせる\n") end def grow(perweek,sewa) x = 4 * perweek - sewa printf("\n「%d週間目」\n", perweek) # printf("成長率:%d\n", x) print("[体重]\n") print("01------05--------10--------15--------20--\n") x end print("子猫を親戚から貰った!\n") sleep 1 STDERR.print("名前は何にする? :") name = gets.chomp if name == "" name = "ジャッキー" end printf("「%s」に決めた!\n", name) sleep 1 print("●が多いほど、成長している証拠です。\n\n") size = 1 # 大きさ seityo = 1 # 成長値 week = 1 # 育てた週数 while true okisa(size) situke(name) number = gets.chomp.to_i size += week * number # ●の数を表示するための計算 seityo += grow(week, number) # 成長率を計算する if size > 10 break end if seityo > 10 break end week += 1 end sleep 1.5 okisa(size) if size >= 15 print("\n立派なたくましい") elsif size >=5 && size <= 14 print("\nたくましい") elsif size >= 4 print("\nヘンテコな") end print("猫へと成長した!\n") ------------------------------------------------------------------------------- ◯実行結果 ・全て選択肢 1 にする ------------------------------------------------------------------------------- pan{c109014}% ./def_rollplaying_a.rb [~/Ruby] 子猫を親戚から貰った! 名前は何にする? : 「ジャッキー」に決めた! ●が多いほど、成長している証拠です。 ● [1] 餌をやる [2] 自由気ままにさせる [3] 遊ばせる 1 「1週間目」 [体重] 01------05--------10--------15--------20-- ●● [1] 餌をやる [2] 自由気ままにさせる [3] 遊ばせる 1 「2週間目」 [体重] 01------05--------10--------15--------20-- ●●●● ヘンテコな猫へと成長した! ------------------------------------------------------------------------------- ・全て選択肢 2 にする ------------------------------------------------------------------------------- pan{c109014}% ./def_rollplaying_a.rb [~/Ruby] 子猫を親戚から貰った! 名前は何にする? :2 「2」に決めた! ●が多いほど、成長している証拠です。 ● [1] 餌をやる [2] 自由気ままにさせる [3] 遊ばせる 2 「1週間目」 [体重] 01------05--------10--------15--------20-- ●●● [1] 餌をやる [2] 自由気ままにさせる [3] 遊ばせる 2 「2週間目」 [体重] 01------05--------10--------15--------20-- ●●●●●●● [1] 餌をやる [2] 自由気ままにさせる [3] 遊ばせる 2 「3週間目」 [体重] 01------05--------10--------15--------20-- ●●●●●●●●●●●●● たくましい猫へと成長した! ------------------------------------------------------------------------------- ・全て選択肢 1 にする ------------------------------------------------------------------------------- pan{c109014}% ./def_rollplaying_a.rb [~/Ruby] 子猫を親戚から貰った! 名前は何にする? : 「ジャッキー」に決めた! ●が多いほど、成長している証拠です。 ● [1] 餌をやる [2] 自由気ままにさせる [3] 遊ばせる 3 「1週間目」 [体重] 01------05--------10--------15--------20-- ●●●● [1] 餌をやる [2] 自由気ままにさせる [3] 遊ばせる 3 「2週間目」 [体重] 01------05--------10--------15--------20-- ●●●●●●●●●● [1] 餌をやる [2] 自由気ままにさせる [3] 遊ばせる 3 「3週間目」 [体重] 01------05--------10--------15--------20-- ●●●●●●●●●●●●●●●●●●● 立派なたくましい猫へと成長した! ------------------------------------------------------------------------------- ◯考察 ●の数がKtermで計算したも結果と合うか、確認した。 pan{c109014}% bc -l [~/Ruby] 1 * 1 + 1 2 2 * 1 + 2 ← 選択肢 1 の場合 4 1 * 2 + 1 3 2 * 2 + 3 ← 選択肢 2 の場合 7 3 * 2 + 7 13 1 * 3 + 1 4 2 * 3 + 4 ← 選択肢 3 の場合 10 3 * 3 + 10 19 となり、●の個数と一致した。 念のために、選択する数字をランダムにして確認してみる。 ------------------------------------------------------------------------------- pan{c109014}% ./def_rollplaying_a.rb [~/Ruby] 子猫を親戚から貰った! 名前は何にする? :ジョーンズ 「ジョーンズ」に決めた! ●が多いほど、成長している証拠です。 ● [1] 餌をやる [2] 自由気ままにさせる [3] 遊ばせる 2 「1週間目」 [体重] 01------05--------10--------15--------20-- ●●● [1] 餌をやる [2] 自由気ままにさせる [3] 遊ばせる 3 「2週間目」 [体重] 01------05--------10--------15--------20-- ●●●●●●●●● [1] 餌をやる [2] 自由気ままにさせる [3] 遊ばせる 1 「3週間目」 [体重] 01------05--------10--------15--------20-- ●●●●●●●●●●●● たくましい猫へと成長した! ------------------------------------------------------------------------------- pan{c109014}% bc -l [~/Ruby] 1 * 2 + 1 3 2 * 3 + 3 9 3 * 1 + 9 12 上の実行結果の●の数を数えると12個あるので、プログラムは正常に機能し ている。 グラフでも表示すると個数を数えるのが大変になるので、目盛りを入れるだ けでも見た目の印象が変わった。 ただ、目の前に表示されている●の数がそのまま結果にされているだけなの で、目に見えない要素でも結果が変わってくるようなプログラムにすれば、 もっと内容の濃いものに出来たと思う。 3.感想 どんな職業に向いているか、という適正検査のようなものを中学や高校の進路 学習の時に行ったことがあります。それにも * 印でグラフなどが載っていた ので、methodの考え方が使われていると思いました。 設定を考える作業で時間を掛けてしまったので、プログラム問題が B で終わっ てしまったのが悔しいです。でも、自分なりに考えながらレポート課題に取り 組んでみました。 methodの考え方は成績を表示するようなことだけでなく、応用しだいでかなり 充実したプログラムを作成できると分かりました。大変だったけれど、楽しみ ながら作業ができました。 4.共同学習者 ◯藤井駿 ◯佐藤裕康 ◯遠藤孝之 ◯布川大地