第4回 基礎プログラミング II 出席課題 氏名: xxxxxxxx 学籍番号: C109xxx 語学クラス: 英語3 コース(系): 政策マネジメント 1-A. 「残暑の厳しい夏とかけて、定番商品と解きます。」 「その心は?」 「なかなか 秋(飽き) が来ません。」 「大晦日の夜とかけて、絶体絶命の場面と解きます。」 「その心は?」 「ゆく年くる年 (行くと死、来ると死)。」 1-B. その1 レンタルDVDを借りに行っていくらかかるか調べた。 レンタルDVDの値段はそれぞれ1週間レンタルで、新作350円、旧作80円だった。 (例:1)新作を2本、旧作を4本借りることにする。 (400 * x) + (80 * z) これに代入すると (400 * 2) + (80 * 4) = 800 + 320 = 1120 答えは 1120円と出た。確かめてみる。 pan{c109046}% bc -l [~] 400 * 2 800 80 * 4 320 800 + 320 1120 答えは 1120円で正しい。 (例:2)新作を5本、旧作を2本借りるとき。 (400 * 5) + (80 * 2) = 2000 + 160 = 3160 答えは 3160円と出た。確かめてみる。 pan{c109046}% bc -l [~] 400 * 5 2000 80 * 2 160 2000 + 160 2160 答えは 2160円で正しい。 その2 近所のゲームショップでは、金曜日にソフトを2本セットで買うと 20%値引がされる。組み合わせるソフトの値段は自由である。 (例:1)980円のソフトと3980円のソフトを買う場合。 980 + 3980 = 4960 4960 * 0.2 = 992 4960 - 992 = 3968 答えは 3968円と出た。確かめてみる。 pan{c109046}% bc -l [~] 980 + 3980 4960 4960 * 0.2 992.0 4960 - 992 3968 答えは 3968円で正しい。 (例:2)1980円のソフトと7000円のソフトを買う場合。 1980 + 7000 = 8980 8980 * 0.2 = 1796 8980 - 1786 = 7184 答えは 7184円と出た。確かめてみる。 pan{c109046}% bc -l [~] 1980 + 7000 8980 8980 * 0.2 1796.0 8980 - 1796 7184 答えは 7184円で正しい。 --------------------------------------- B. 問題はAとBを選択した。 B-A a 授業で作成した def_function.rb を基に、def-end文を用いて、 値段の決まっている商品に対して数量を変数としてユーザーに入力させることで 合計金額を計算できるプログラム、def_twoparam.rb を作成した。 設定は筆記問題のその1を基に、新に準新作を加えた。 B-A b #!/usr/koeki/bin/ruby def video(x,y,z) # videoという関数を定義する。仮引数は xyz 350 * x + 250 * y + 80 * z # 新作 * 本数+ 準新作 * 本数 + 旧作 * 本数 end # def のend STDERR.print("ビデオショップへようこそ。\n新作(350円) を何本借りますか?: ") # 入力を促す print文 a = gets.to_i # 入力された値を変数にしまう。ビデオの本数は整数なので.to_i STDERR.print("準新作(250円) は何本借りますか?: ") # 入力を促す print文 b = gets.to_i # 入力された値を変数にしまう。ビデオの本数は整数なので.to_i STDERR.print("旧作(80円) は何本借りますか?: ") # 入力を促す print文 c = gets.to_i # 入力された値を変数にしまう。ビデオの本数は整数なので.to_i total = video(a, b, c) # 合計を計算。仮引数にabcの値が入るので出る。 printf("\n新作 %d 本、準新作 %d 本、旧作 %d 本 で %d 円になります。\n返却は1週間以内にお願いします。\n", a, b , c, total) # 入力された値と合計を代入 B-A c def_function.rb はグラフを出力するプログラムだったが、 その部分は削除して合計を演算する部分 total = video(a, b, c) を設けた。 B-A d pan{c109046}% ./def_twoparam.rb [~/Ruby] ビデオショップへようこそ。 新作(350円) を何本借りますか?: 2 準新作(250円) は何本借りますか?: 1 旧作(80円) は何本借りますか?: 5 新作 2 本、準新作 1 本、旧作 5 本 で 1350 円になります。 返却は1週間以内にお願いします。 pan{c109046}% ./def_twoparam.rb [~/Ruby] ビデオショップへようこそ。 新作(350円) を何本借りますか?: 10 準新作(250円) は何本借りますか?: 19 旧作(80円) は何本借りますか?: 6 新作 10 本、準新作 19 本、旧作 6 本 で 8730 円になります。 返却は1週間以内にお願いします。 エラーも発生せず、プログラム通り出力された。 B-A e pan{c109046}% bc -l [~/Ruby] 350 * 2 + 250 * 1 + 80 *5 1350 350 * 10 + 250 * 19 + 80 * 6 8730 答えは合っているので、このプログラムは正しいといえる。 上のプログラムでは def video(x,y,z)-end と新作、準新作、旧作を ひとまとまりにしたが、def sin, def jun, def kyu のように 別々に関数を設けても同じように問題なく動作した。 total = video(a, b, c) の部分も、別々に関数を設けて、 total = sin(a) + jun(b)+ kyu(c) としても正しく合計が出た。 ------------------------------- B-B a A問題で作成した def_twoparam.rb を基に、関数内の仮引数のひとつをなくして 固定することによって、2つの商品のうち、1つの数量を入力することで 合計金額を求められるプログラム def_oneparam_a.rb を作成した。 B-B b #!/usr/koeki/bin/ruby def video(x,y) # videoという関数を定義する。仮引数は xy 350 + 250 * x + 80 * y # 新作 + 準新作 * 本数 + 旧作 * 本数 end # def のend print("ある新作映画(350円)を借りに、レンタルビデオショップへ来ました。\n") print("来たついでに、準新作と旧作の中からも何本か借りようと思います。\n") STDERR.print("\n準新作(250円) を何本借りますか?: ") # 入力を促す print文 a = gets.to_i # 入力された値を変数にしまう。ビデオの本数は整数なので.to_i STDERR.print("旧作(80円) は何本借りますか?: ") # 入力を促す print文 b = gets.to_i # 入力された値を変数にしまう。ビデオの本数は整数なので.to_i total = video(a, b) # 合計を計算。仮引数にabの値が入るので出る。 printf("\n新作 1 本、準新作 %d 本、旧作 %d 本 で %d 円になります。\n返却は1週間以内にお願いします。\n", a, b , total) # 入力された値と合計を代入 B-B c A問題の def_twoparam.rb からの変更点は、1つの仮引数を削除して 値を固定したことと、print文の変更である。 B-B d pan{c109046}% ./def_oneparam_a.rb [~/Ruby] ある新作映画(350円)を借りに、レンタルビデオショップへ来ました。 来たついでに、準新作と旧作の中からも何本か借りようと思います。 準新作(250円) を何本借りますか?: 10 旧作(80円) は何本借りますか?: 4 新作 1 本、準新作 10 本、旧作 4 本 で 3170 円になります。 返却は1週間以内にお願いします。 pan{c109046}% ./def_oneparam_a.rb [~/Ruby] ある新作映画(350円)を借りに、レンタルビデオショップへ来ました。 来たついでに、準新作と旧作の中からも何本か借りようと思います。 準新作(250円) を何本借りますか?: 1 旧作(80円) は何本借りますか?: 21 新作 1 本、準新作 1 本、旧作 21 本 で 2280 円になります。 返却は1週間以内にお願いします。 プログラム通り出力された。 B-B e pan{c109046}% bc -l [~/Ruby] 350 + 250 * 10 + 80 * 4 3170 350 + 250 * 1 + 80 * 21 2280 答えはあっているので、このプログラムは正しいといえる。 3 今回使った問題や考え方は義務教育で習ったものと同じだと思う。 ただし方向性か全く違って、紙の上の問題を自分で解いて答えを出すのではなく、 プログラムが演算できるように問題の方が正しく成り立っているかを 考えて書くので、より高度だと思う。 グラフは情報リテラシーでもエクセルを使って作成したが、 最も実用的に作成したのは基礎の自然科学(生物)のレポートで、 実験で出たデータを棒グラフにまとめたときである。 ただ数値を入力するだけではわかりにくいので、設定を調整して 比較しやすいようにしたが、思いのほか大変だった。 エクセルと今回作ったプログラムは数値を入力することでグラフが 出来上がるという根本的なしくみは同じだと思った。 しかしエクセルはグラフが出来たあとも視覚的にわかりやすいよう、 比較が一目でできるように調節できる機能があるので、 そこが大きな違いだと思う。 今回の defで関数演算ができるところまではついていけたのだが、 グラフを作成するところの理解が全然出来ていないので、 ついていけるようにがんばります。 参考文献 基礎プログラミング II 第4回 繰り返しは引っ張りだそう 「関数だってくりかえし」 http://roy/~madoka/2010/r2/04/04_02_theme_02_function.html 基礎プログラミング II 第4回 繰り返しは引っ張りだそう 「どんな関数がきてもだいじょうぶ」 http://roy/~madoka/2010/r2/04/04_03_theme_03_method.html 全て著者は西村まどか 共同学習者: 笹原千珠子