第 4 回 繰り返しは引っ張りだそう レポート課題 氏名: 池田 紘平 学籍番号: c1110097 語学クラス: 英語 3 コース: 社会福祉コース 1.A < その1 > 「新幹線とかけて、ゴルフと解く。」 「その心は?」 「私はすぐグリーンに乗ります。」 < その2 > 「レストランとかけて、政治と解く。」 「その心は?」 「どちらもお食事券(汚職事件)があります。」 1.B < その1 > 40人クラスでお祭りに行き、お菓子を購入することした。わたあめは1つ200円、 りんごあめは1つ400円である。10人がりんごあめを選び、残りの30人がわたあめ を買った場合金額はいくらか。 わたあめ1つ = 200円 購入個数 = 30人 なので 200 * 30 = 6000 よって 6000円となる。 りんごあめ1つ = 400円 購入人数 = 10人 なので 400 * 10 = 4000 よって 4000円となる。 クラスの金額の合計は 6000 + 4000 で 10000円となる。 下記に bc -l での確かめ算を記す。 pan{c111009}% bc -l [~/Ruby2] 200*30 6000 400*10 4000 6000+4000 10000 よってこの計算は正しい。 < その2 > 田舎の学校で(2クラスしかない学校と仮定する)、机と椅子を新しくすることに なった。机と椅子のセットで金額は15000円である。A組の人数が30人、B組の人 数が29人であるとき、各クラスでかかった金額はいくらか。 机と椅子のセット1つ = 15000円 A組の人数 = 30人 なので 15000 * 30 = 450000 よって 450000円となる。 また、B組の人数 = 29人なので 15000 * 29 = 435000 よって 435000円となる。 下記に bc -l での確かめ算を記す。 pan{c111009}% bc -l [~] 15000*30 450000 15000*29 435000 よってこの計算は正しい。 2.A < 設定 > 1.B で考えた< その1 >の文章を使って、2つの合計を求める。(下記に問題文) 40人クラスでお祭りに行き、お菓子を購入することした。わたあめは1つ200円、 りんごあめは1つ400円である。10人がりんごあめを選び、残りの30人がわたあめ を買った場合金額はいくらか。 < プログラム def_twoparam.rb > #!/usr/koeki/bin/ruby # coding: euc-jp def func(a) # a は引数で、 method を作るときに使う変数 200 * a # 計算式を書く。ここではわたあめ1つ200円をいくつ 買うかという式 end # def の end def func2(a) # a は引数で、 method を作るときに使う変数 400 * a # 計算式を書く。ここではりんごあめ1つ400円をいく つ買うかという式 end # def の end print("それぞれの購入個数を入力してください\n") # 購入個数を入力することを表示 STDERR.print("わたあめ個数 : ") # わたあめの個数を入力 w = gets.to_i # 変数 w に入力されたものを整数で代入 g1 = func(w) # 変数 g1 に func で計算したもの(200*w)を代入 STDERR.print("りんごあめ個数 : ") # りんごあめの個数を入力 r = gets.to_i # 変数 r に入力されたものを整数で代入 g2 = func2(r) # 変数 g2 に func2 で計算したもの(400*r)を代入 printf("わたあめ %d 人、りんごあめ %d 人で合計は %d 円です。 \n",w,r,g1+g2) # わたあめの購入人数、りんごあめの購入人数を表示し、g1 と g2 を 合計した値を表示する < 実行結果 > その1: わたあめ 30 人、りんごあめ 10 人の場合 pan{c111009}% ./def_twoparam.rb [~/Ruby2] それぞれの購入個数を入力してください わたあめ個数 : 30 りんごあめ個数 : 10 わたあめ 30 人、りんごあめ 10 人で合計は 10000 円です。 bc -l で確かめてみる。 pan{c111009}% bc -l [~/Ruby2] (200*30)+(400*10) 10000 < 考察 > 他の数値で確かめてみる その2: わたあめ 20 人、りんごあめ 20 人の場合 pan{c111009}% ./def_twoparam.rb [~/Ruby2] それぞれの購入個数を入力してください わたあめ個数 : 20 りんごあめ個数 : 20 わたあめ 20 人、りんごあめ 20 人で合計は 12000 円です。 bc -l で確かめてみる。 pan{c111009}% bc -l [~/Ruby2] (200*20)+(400*20) 12000 その3: わたあめ 10 人、りんごあめ 30 人の場合 pan{c111009}% ./def_twoparam.rb [~/Ruby2] それぞれの購入個数を入力してください わたあめ個数 : 10 りんごあめ個数 : 30 わたあめ 10 人、りんごあめ 30 人で合計は 14000 円です。 bc -l で確かめてみる。 pan{c111009}% bc -l [~/Ruby2] (200*10)+(400*30) 14000 プログラムの実行結果と bc -l による計算結果が一致したのでこのプログラム は正しいといえる。 < 説明 > 最初に def -- end を使って計算式をいれておくことで、のちに計算する手間が 省ける。g1 = func(w) は、func(a) の中にある計算式で w 個購入したらいくら になるかという意味なので、 g1 = func(a) ではなく g1 = func(w) という表記 になる。次の g2 = func2(r) も同様である。 2.B < 設定 > 1.Bで考えた < その1 > の文章を少し変えて使う。問題文は下記に表示 40人クラスでお祭りに行き、お菓子を購入することした。わたあめは1つ200円、 りんごあめは1つ400円であり、予算は10000円である。わたあめを任意の数だけ 購入した場合、残りの予算と、買えるりんごあめの個数を表示せよ。 < プログラ厶 def_budget.rb > #!/usr/koeki/bin/ruby # coding: euc-jp def f(a) # a は引数で、method を作るときに使う変数 200 * a # わたあめの値段に、購入する個数をかける end # def の end def f2(a) # 上と同様 10000 - 200 * a # 予算の 10000 円から わたあめを購入する際にかか る値段を引く end # def の end print("\n予算は 10000 円です\n\n") # 予算が10000円であることを表示 STDERR.print("わたあめをいくつ購入しますか\n") # わたあめの購入個数を入力することを表示 STDERR.print("個数 : ") # 購入する個数を入力 w = gets.to_i # 変数 w に入力されたものを整数で代入 g1 = f(w) # 変数 g1 に f で計算したもの(200*w)を代入 g2 = f2(w) # 変数 g2 に f2 で計算したもの(10000-200*w)を代入 printf("\nわたあめを %d 個購入すると %d 円です\n残りの予算は %d 円なので、りんごあめは %d 個購入できます\n",w,g1,g2,g2/400) # わたあめを w 個購入した場合の値段と、残りの予算、その予算で買 えるりんごあめの個数を表示する < 前のプログラムからの変更点 > 今回は予算を前もって10000円と設定することで、2つめの def -- end も中が予 算からわたあめの購入金額を引いたものになっている。表示にあたっては、普段 の printf 文と同じである。 < 実行結果 > その1: 購入個数が 10個の場合 pan{c111009}% ./def_budget.rb [~/Ruby2] 予算は 10000 円です わたあめをいくつ購入しますか 個数 : 10 わたあめを 10 個購入すると 2000 円です 残りの予算は 8000 円なので、りんごあめは 20 個購入できます bc -l で確かめてみる pan{c111009}% bc -l [~/Ruby2] 10000-(200*10) 8000 8000/400 20 < 考察 > 購入個数を変えて確かめてみる。 その2: 購入個数が 20 個の場合 pan{c111009}% ./def_budget.rb [~/Ruby2] 予算は 10000 円です わたあめをいくつ購入しますか 個数 : 20 わたあめを 20 個購入すると 4000 円です bc -l で確かめてみる pan{c111009}% bc -l [~/Ruby2] 10000-(200*20) 6000 6000/400 15 その3: 購入個数が 30 個の場合 残りの予算は 6000 円なので、りんごあめは 15 個購入できます pan{c111009}% ./def_budget.rb [~/Ruby2] 予算は 10000 円です わたあめをいくつ購入しますか 個数 : 30 わたあめを 30 個購入すると 6000 円です 残りの予算は 4000 円なので、りんごあめは 10 個購入できます bc -l で確かめてみる pan{c111009}% bc -l [~/Ruby2] 10000-(200*30) 4000 4000/400 10 プログラムの実行結果と bc -l による計算結果が一致したのでこのプログラム は正しいといえる。 < 説明 > 今回も g1 は f(w) の値を返す仕組みになっている。2.A とは異なる点としては、 g2 に入る値が f2(w) の値を返したものとなっていることだ。これはりんごあめ の個数を指定する必要がないため、 def -- end の中にで w をかけるだけでい いので、2.A のように r という変数を使う必要がない。 < 考察 > 個数が多すぎて金額がマイナスになる場合があるので、if 文を使って解消する ことにした。また、def -- end を1つ増やし、計算式をいれることでのちに計算 する手間を省いた。プログラムは、同じ(def_budget.rb)を使い、改良すること にした。 < 改良プログラム def_budget.rb > #!/usr/koeki/bin/ruby # coding: euc-jp def f(a) 200 * a end def f2(a) 10000 - 200 * a end def f3(a) # 新しく f3を定義 (10000 - 200 * a) / 400 # 残りの予算で買える個数を計算する end # if の end print("\n予算は 10000 円です\n\n") STDERR.print("わたあめ(1つ200円)をいくつ購入しますか\n") \ # わたあめの金額も表示した STDERR.print("個数 : ") w = gets.to_i g1 = f(w) g2 = f2(w) g3 = f3(w) # 残り予算で買える個数を代入 if g1 > 10000 # もしわたあめの購入金額が10000以上だっ たら print"個数が多すぎます!!\nお金がなくて恥ずかしい思いをしますよ・・・ \n" # 購入個数が多いことを表示 end # if の end if g1 < 10000 # もしわたあめの購入金額が10000以下で if w == 49 # なおかつ個数が49個だったら printf("\nわたあめを %d 個購入すると %d 円です\n残りの予算は %d 円な のでりんごあめは買えません…\n",w,g1,g2) # 残り予算でりんごあめを買えないことを表 示 end # if の end if w < 49 # (購入金額が10000以下で)なおかつ個数が 49個いかだったら printf("\nわたあめを %d 個購入すると %d 円です\n残りの予算は %d 円なの で、りんごあめは %d 個購入できます\n",w,g1,g2,g3) # 購入個数、購入金額、残り予算、買える個 数を表示 end # if の end end # if の end if g1 == 10000 # もし購入金額が10000円ジャストだったら printf("\nわたあめを %d 個購入すると %d 円です\n残りの予算は %d 円なの でりんごあめは買えません…\n",w,g1,g2) # 予算が0円になり、りんごあめが買えない ことを表示 end # if の end < 前のプログラムからの変更点 > 改良前はマイナスにならないことを前提にプログラムを作ったが、手違いで個数 を多く入力してしまう可能性があるので、if 文を使って表示方法を切り替える ようにした。また、金額的に49個のときに「買える個数は0個です」となるので 表示しないようにした。 < 実行結果 > pan{IKEDA Kohei}% ./def_budget.rb [~/Ruby2] 予算は 10000 円です わたあめ(1つ200円)をいくつ購入しますか 個数 : 10 わたあめを 10 個購入すると 2000 円です 残りの予算は 8000 円なので、りんごあめは 20 個購入できます pan{c111009}% ./def_budget.rb [~/Ruby2] 予算は 10000 円です わたあめ(1つ200円)をいくつ購入しますか 個数 : 48 わたあめを 48 個購入すると 9600 円です 残りの予算は 400 円なので、りんごあめは 1 個購入できます pan{c111009}% ./def_budget.rb [~/Ruby2] 予算は 10000 円です わたあめ(1つ200円)をいくつ購入しますか 個数 : 49 わたあめを 49 個購入すると 9800 円です 残りの予算は 200 円なのでりんごあめは買えません… pan{c111009}% ./def_budget.rb [~/Ruby2] 予算は 10000 円です わたあめ(1つ200円)をいくつ購入しますか 個数 : 50 わたあめを 50 個購入すると 10000 円です 残りの予算は 0 円なのでりんごあめは買えません… pan{c111009}% ./def_budget.rb [~/Ruby2] 予算は 10000 円です わたあめ(1つ200円)をいくつ購入しますか 個数 : 100 個数が多すぎます!! お金がなくて恥ずかしい思いをしますよ・・・ それぞれ bc -l で計算してみる 購入個数が10個のとき pan{c111009}% bc -l [~/Ruby2] 10000-200*10 8000 8000/400 20 購入個数が48個のとき pan{c111009}% bc -l [~/Ruby2] 10000-200*48 400 400/400 1 購入個数が49個のとき pan{c111009}% bc -l [~/Ruby2] 10000-200*49 200 200/400 .5 購入個数が50個のとき pan{c111009}% bc -l [~/Ruby2] 10000-200*50 0 0/400 0 購入個数が100個のとき pan{c111009}% bc -l [~/Ruby2] 10000-200*100 -10000 プログラムと bc -l での結果が一致したのでこのプログラムは正しいといえる < 説明 > if 文を使うことで、いざというときのために対応できるようにした。たとえば、 わたあめ48個までだったらりんごあめを購入できる。しかし、49個では残金が 200円となりりんごあめが買えなくなる。50個以上からは残金が0円(マイナスに なる)ので、そこを改良した。 < 感想 > 学校の勉強では、先に公式を頭にいれてから問題に入る。つまり、今回学んだこ とのように先に定義する(頭に公式をいれる)ことであとの問題に答えられるので はないかと考えた。 今回学んだものは、計算式を先に定義しておくことでのちに計算する必要がなく なるとても便利なものだった。自分の中では、Hash よりも分かりやすかったよ うな気がした。 < 共同学習者 > 佐藤 航輝 稲村 洋樹 < 参考文献 > ・基礎プログラミング II 第 4 回 (繰り返しは引っ張りだそう) 「どんな関数がきてもだいじょうぶ」 西村まどか http://roy/~madoka/2012/r2/04/r2_04_03_theme_03_method.html ・基礎プログラミング II 第 4 回 (繰り返しは引っ張りだそう) 「これを代入した答はなあに」 西村まどか http://roy/~madoka/2012/r2/04/r2_04_04_theme_04_stderr.html ・基礎プログラミング II 第 4 回 (繰り返しは引っ張りだそう) 「分かりやすいプログラムへ」 西村まどか http://roy/~madoka/2012/r2/04/r2_04_05_theme_05_print.html 追伸: プログラム(def_twoparam.rb def_budget.rb)を添付します