第 4 回 繰り返しは引っ張りだそう レポート課題 氏名:齋藤允貴 学籍番号:C111069A 語学クラス:英語 2 コース:地域共創コース 1、筆記問題 A、「ライオンとかけて、警察と解く。」 「その心は?」 「どちらもひゃくじゅうがつきものです。」 (百獣・110) 「入学とかけて、永久歯と解く。」 「その心は?」 「どちらもその前にニュウシがあります。」 (入試・乳歯) B、 その 1、尾野流星君はお母さんにおつかいを頼まれました。 お母さんから、「「にんじん」と「レンコン」を買ってきて欲しい」と いわれ、近くの八百屋さんに行きました。 そこでは、にんじんが 80 円、レンコンが 90 円で売られていました。 そのさいの合計金額を求める問題。 問 1、にんじんを 3 本 レンコンを 5 本買いたいときの合計金額 80 * 3 + 90 * 5 = 240 + 450 = 690 確認のため「bc -l」で計算してみると、 pan{c111069}% bc -l [~/Ruby] 80 * 3 240 90 * 5 450 80 * 3 + 90 * 5 690 quit 計算は合っている。 答、690 円 問 2、にんじんを 8 本 レンコンを 10 本買いたいときの合計金額 80 * 8 + 90 * 10 = 640 + 900 = 1540 確認のため「bc -l」で計算してみると、 pan{c111069}% bc -l [~/Ruby] 80 * 8 640 90 * 10 900 80 * 8 + 90 * 10 1540 quit 計算は合っている。 答、1540 円 その 2、森川玲子さんはこのたび 20 歳になりました。 20 歳になると楽しみなことの一つとして、お酒を飲みたいといいます。 そこで、酒売場に行きお酒を買う事にしました。 この売場の値段は、「ビール」が 150 円、「ワイン」が 300 円で売 られていました。 そのさいの合計金額を求める問題。 問 1、ビールを 2 本 ワインを 3 本買いたいときの合計金額 150 * 2 + 300 * 3 = 300 + 900 = 1200 確認のため「bc -l」で計算してみると、 pan{c111069}% bc -l [~/Ruby] 150 * 2 300 300 * 3 900 150 * 2 + 300 * 3 1200 quit 計算は合っている。 答、1200 円 問 2、ビールを 5 本 ワインを 10 本買いたいときの合計金額 150 * 5 + 300 * 10 = 750 + 3000 = 3750 確認のため「bc -l」で計算してみると、 pan{c111069}% bc -l [~/Ruby] 150 * 5 750 300 * 10 3000 150 * 5 + 300 * 10 3750 quit 2、プログラム問題 今回僕が挑戦したプログラムは、A と B である。 A、A の問題は、2 つの変数を使って、合計を求める「method」を含んだプログラ ム。問題は、先生が例として挙げていた問題を参考にし、りんごとみかんの 値段をあらかじめ用意しておいて、りんごとみかんそれぞれの項目を入力す る欄を作成し、プログラムの中で「method」を付けて合計を求めるプログラム を作成した。 method という部分は、「def---end」の部分のことをいう。 ここに関数を入力する。 def 関数(仮引数) 関数の定義 end このプログラムでは、りんごを「x」 みかんを「y」と入力し、関数の計算 式に、kterm で入力した数字を代入して計算する方法を作成した。 なお、りんごを 20 円、みかんを 30 円とする。 このプログラムの「method」の部分は以下の通りである。 def price(x, y) 20 * x + 30 * y end 次に、りんごとみかんそれぞれの個数を書きこむ項目を作成した。その際に 使ったのが、「gets.chomp.to_i」というものである。これを使って、りん ごの数と、みかんの数が入力できるようになる。 STDERR.print("りんごの個数は?: ") apple = gets.chomp.to_i STDERR.print("みかんの個数は?: ") orange = gets.chomp.to_i そして、入力した数字を「method」の部分に代入して、合計金額を表示する 項目を作成した。 printf("りんごは %d 個、みかんは %d 個買いました。\n", apple, orange) printf("合計: %d 円!\n", price(apple, orange)) # 「price(apple, orange)」という部分は 「method」で作成した「price(x, y)」と いう部分と一緒である。x を apple、y を orange とした。 こうして作成したプログラムが以下の通りである。 #!/usr/koeki/bin/ruby #coding: euc-jp def price(x, y) 20 * x + 30 * y end STDERR.print("りんごとみかんの個数を入力してください。\n") STDERR.print("りんごの個数は?: ") apple = gets.chomp.to_i STDERR.print("みかんの個数は?: ") orange = gets.chomp.to_i print("\n") printf("りんごは %d 個、みかんは %d 個買いました。\n", apple, orange) printf("合計: %d 円!\n", price(apple, orange)) 実行結果 pan{c111069}% ./def_twoparam.rb [~/Ruby] りんごとみかんの個数を入力してください。 りんごの個数は?: 4 みかんの個数は?: 7 りんごは 4 個、みかんは 7 個買いました。 合計: 290 円! pan{c111069}% ./def_twoparam.rb [~/Ruby] りんごとみかんの個数を入力してください。 りんごの個数は?: 5 みかんの個数は?: 8 りんごは 5 個、みかんは 8 個買いました。 合計: 340 円! pan{c111069}% ./def_twoparam.rb [~/Ruby] りんごとみかんの個数を入力してください。 りんごの個数は?: 8 みかんの個数は?: 16 りんごは 8 個、みかんは 16 個買いました。 合計: 640 円! 考察 pan{c111069}% bc -l [~/Ruby] 20 * 4 80 30 * 7 210 80 + 210 290 quit pan{c111069}% bc -l [~/Ruby] 20 * 5 100 30 * 8 240 100 + 240 340 quit pan{c111069}% bc -l [~/Ruby] 20 * 8 160 30 * 16 480 160 + 480 640 quit 3 パターンやってみたが度のパターンもしっかりと表示されていて、計算も 合っていたので、このプログラムは成立する。 B、B の問題は、1つのものを購入して、自分の予算内であればもう 1 つのもの はいくつ買えるのかが分かるプログラムである。 この問題も先生が用意してくれた問題を参考にし、先程の問題と同様、りん ごを 20 円、みかんを 30 円とし、あらかじめ予算を 200 円と設定した。 みかんをいくつ買ったかを入力し、りんごは予算内でいくつ買えるのかを計 算するプログラムを作成した。 このプログラムにも「method」を含ませて計算をしなければならない。 「method」の部分は以下のように作成した。 def buy(y) (200 - (30 * y)) / 20 end 次に、kterm のところからみかんを購入した個数を入力する項目を、 「gets.chomp.to_i」を使って以下のように作成することにした。 STDERR.print("みかんの個数は?: ") orange = gets.chomp.to_i そして、みかんを買った個数を代入して、method の計算をして、答えを表 示しなければならない。その項目を以下のように作成した。 printf("みかんを %d 個買ったとき、りんごは…\n", orange) printf("%d 個買えます。\n",buy(orange)) # 「buy(orange)」という部分は、method で 作った「buy(y)」という部分と一緒である。 ただ、本来であれば、りんごの個数を求め たくて、apple を使いたかったが、実行す ることはできず、orange を使うと実行す ることができた。 作成したプログラムは以下の通りである。 #!/usr/koeki/bin/ruby #coding: euc-jp def buy(y) (200 - (30 * y)) / 20 end STDERR.print("みかんの個数を入力してください。\n") STDERR.print("みかんの個数は?: ") orange = gets.chomp.to_i print("\n") print("あなたがもし 200 円しか持っていなかった場合\n") printf("みかんを %d 個買ったとき、りんごは…\n", orange) printf("%d 個買えます。\n",buy(orange)) 実行結果 pan{c111069}% ./def_budget.rb [~/Ruby] みかんの個数を入力してください。 みかんの個数は?: 5 あなたがもし 200 円しか持っていなかった場合 みかんを 5 個買ったとき、りんごは… 2 個買えます。 pan{c111069}% ./def_budget.rb [~/Ruby] みかんの個数を入力してください。 みかんの個数は?: 6 あなたがもし 200 円しか持っていなかった場合 みかんを 6 個買ったとき、りんごは… 1 個買えます。 pan{c111069}% ./def_budget.rb [~/Ruby] みかんの個数を入力してください。 みかんの個数は?: 2 あなたがもし 200 円しか持っていなかった場合 みかんを 2 個買ったとき、りんごは… 7 個買えます。 考察 pan{c111069}% bc -l [~/Ruby] 30 * 5 150 200 - 150 50 50 / 20 2.50000000000000000000 quit pan{c111069}% bc -l [~/Ruby] 30 * 6 180 200 - 180 20 20 / 20 1.00000000000000000000 quit pan{c111069}% bc -l [~/Ruby] 30 * 2 60 200 - 60 140 140 / 20 7.00000000000000000000 quit みかんの個数をしっかりと入力することができた。計算方法は考察すると割 り切れなくて、小数点以下も表示されるが、プログラムの中では、切り捨て にしておいて、整数を表示する「%d」を使っていたので、このプログラムは 成立する。 3、感想 今回学んだプログラムは義務教育で習った算数や数学と同じ仕組みなのでは ないかと思います。 今回のプログラム問題は計算式を「method」の部分で計算式を入力するとこ ろは、なぜか懐かしく感じた。また、プログラムでグラフを作成することが できるとは思わなかった。今日新たに習ったプログラムをしっかりと復習し て、これからプログラムを作るときにしっかりと作成するようにしたいと思っ た。 4、参考文献 http://roy/~madoka/2012/r2/04/r2_04_04_theme_04_stderr.html 西村まどか 第 4 回 基礎プログラミングII 繰り返しは引っ張りだそう 「これを代入した答はなあに」 http://roy/~madoka/2012/r2/04/r2_04_05_theme_05_print.html 西村まどか 第 4 回 基礎プログラミングII 繰り返しは引っ張りだそう 「分かりやすいプログラムへ」 http://roy/~madoka/2012/r2/04/r2_04_07_theme_07_allinone.html 西村まどか 第 4 回 基礎プログラミングII 繰り返しは引っ張りだそう 「操作をまとめる」 共同学習者 梅津 光