今までのレポートを全て再送信します。 プログラムのファイル名と def_budget.rb のファイルの内容を変更しました。 第4回 繰り返しは引っ張りだそう レポート課題 氏名:佐藤 咲 学籍番号:c1110772 語学クラス:英語 コース:政策 1、筆記問題 A. 「ポテトチップスとかけて、殺人の共犯者と解く。」 「その心は?」 「どちらも手を汚します。」 「糖尿病とかけて、熟年夫婦と解く。」 「その心は?」 「死ぬまでつき合っていきます。」 「レモンティーとかけて、うちの孫と解く。」 「その心は?」 「どちらも甘さは控えめに。」 「夢とかけて、使い古しの靴と解く。」 「その心は?」 「どちらも はかないでしょう。」 「Yシャツとかけて、電話と解く。」 「その心は?」 「ボタンのかけ間違いにはご注意下さい。」 「テストとかけて、怨恨と解く。」 「その心は?」 「ふくしゅうすると良いでしょう。」 「就職活動とかけて、動物園と解く。」 「その心は?」 「ヒョウが気になります(氷河期になります)。」 「剣道とかけて、マスカットと解く。」 「その心は?」 「どちらもブドウ(武道)の一種でしょう。」 「小学校高学年の男子とかけて、電話に出たうちの母と解く。」 「その心は?」 「どちらも声が変わります。」 「ウサギのミッフィーとかけて、東京の巣鴨と解く。」 「その心は?」 「どちらも鼻(華)がありません。」 B. (1) ペットショップを訪れたサキは、赤い金魚と黒い金魚を買って代金がいくらになるか調べた。赤い金魚の値段は1匹150円、黒い金魚の値段は1匹350円である。 f(x*y)=x,y 式:(150 * x) + (350 * y) 例: 赤い金魚を10匹、黒い金魚を3匹買った場合 (150 *10) + (350 * 3) =2550 [円] 確かめ算(bc -l)を行った結果 pan{c111077}% bc -l [~] (150*10)+(350*3) 2550 (2) 週末2日間暇なサキはそれぞれ1日ずつ違う短期アルバイトをしようと考えた。2 日間の合計でいくら稼ぐことができるか。 1日目のアルバイトAは時給950円、2日目のアルバイトBは時給1200円である。 勤務時間は自分で決めることができる。 f(x*y)=x,y 式: (950 * x) + (1200 * y) 例:アルバイトAは 時給950円、1日10時間 アルバイトB 時給1200円、1日7時間の場合。 (950 * 10) + (1200 * 7) =17900 [円] 確かめ算(bc -l)を行った結果 pan{c111077}% bc -l [~] (950*10)+(1200*7) 17900 2、プログラム問題 A. i.考えた設定 筆記問題B(2)の問題を使い、2つの変数(x,y)を持つ合計を求めるプログラムを作成した。 ii.作成したプログラム(def_twoparam.rb) #!/usr/koeki/bin/ruby # coding: euc-jp def baito(x,y) #メソットの定義 950 * x + 1200 * y end #def のend STDERR.print("アルバイトAでは何時間働きますか? :\n") #標準出力 a =gets.to_i # aの中に入力された文字列を整数に直し代入する STDERR.print("アルバイトBでは何時間働きますか? :\n")#標準出力 b =gets.to_i # bの中に入力された文字列を整数に直し代入する printf("2日間で %d [円]稼ぐことができます。\n", baito(a,b)) # %dの中にはメソットで定義した 950 * x + 1200 * y が入る。 iii.もとにしたプログラムからの変更点 授業で作成したプログラム def_func.rb をもとにした。 def_func.rb のプログラムでは仮引数が (a)だけだったが、今回作成した def_twoparam.rb では (x,y)とした。 また、def--end のmethod で囲まれた関数の定義は 950 * x + 1200 * y (時給950円 * 勤務時間 + 時給1200円 * 勤務時間)として、2日間の給料の合計を求めるプロ グラムを作成した。 iv.実行結果 pan{c111077}% ./def_twoparam.rb [~/Ruby] アルバイトAでは何時間働きますか? : 1 アルバイトBでは何時間働きますか? : 1 2日間で 2150 [円]稼ぐことができます。 pan{c111077}% ./def_twoparam.rb [~/Ruby] アルバイトAでは何時間働きますか? : 10 アルバイトBでは何時間働きますか? : 7 2日間で 17900 [円]稼ぐことができます。 v.考察 *その1 (x=1,y=1の場合) アルバイトA: 時給950円 * x(勤務時間) なので、x に1[時間]と入力し、 アルバイトB: 時給1200円 * y(勤務時間)なので、yにも1[時間]と入力してみる。 求めたいのは2日間分の給料の合計なので、出た答えを足す。 pan{c111077}% bc -l [~/Ruby] 950*1+1200*1 2150 プログラムの実行結果と確かめ算の結果が一致するので、プログラムは正しい。 *その2 (x=10,y=7の場合) アルバイトA: 時給950円 * x(勤務時間) なので、x に10[時間]と入力し、 アルバイトB: 時給1200円 * y(勤務時間)なので、yにも7[時間]と入力してみる。 求めたいのは2日間分の給料の合計なので、出た答えを足す。 pan{c111077}% bc -l [~/Ruby] 950*10+1200*7 17900 プログラムの実行結果と確かめ算の結果が一致するので、プログラムは正しい。 B. i.考えた設定 購入したい商品が2つあり、予算が決まっている状況で、購入したい商品の個数 を入力すると、もう1つの商品を何個購入できるか表示できるプログラム。 ii.作成したプログラム(def_budget.rb) #!/usr/koeki/bin/ruby # coding: euc-jp def item(x) #def--end 関数(仮引数) 900 * x #購入するマスカラの金額 #関数の定義 end def item2(x) #def--end 関数(仮引数) 10000 - 900 * x #予算 - 購入するマスカラの金額 #関数の定義 end def item3(x) #def--end 関数(仮引数) (10000 - 900 * x) / 3000 #(予算 - 購入するマスカラの金額) /香水の価格 #関数の定義 end print(" --状況--\n\n") print(" 週末のアルバイトが終わり、給料で10000円分のnAmazonギフト券を購入した。 \n このギフト券の金額以内でマスカラ(900円)と香水(3000円)を購入したい。\n\n") print("-----------------------nAmazon.co.jp----------------------------\n") print(" nAmazon カートに入っている商品\n") while true STDERR.print("購入するマスカラの数量 : ") a = gets.to_i if 900 * a >= 10000 print("残高を超えているため、購入できません。\n もう一度ご確認の上、数量を入力してください。\n") elsif 900 * a <= 10000 print("購入可能です。") printf("マスカラを%d個購入すると、金額は%d円です。\n 残高は%d円になるので、香水は%d個購入できます。\n",a,item(a),item2(a),item3(a)) break elsif 900 * a == 10000 end end print("-----------------------nAmazon.co.jp----------------------------\n") iii.もとにしたプログラムからの変更点 授業で作成したプログラム def_func.rb と 今回のレポートで作成したプログラ ム def_twoparam.rb の2つを参考にして作成した。 def_twoparam.rb のプログラムは、def--end のmethod で囲まれた関数の定義は 950 * x + 1200 * y (時給950円 * 勤務時間 + 時給1200円 * 勤務時間)とし て、2日間の給料の合計を求めるものだったが、今回のプログラム(def_budget.rb)は 予算10000円の中で商品の数量を入力すると、もう一方の商品の買える個数を求めるという内容にした。また、残高も表示できるように、def--end を複数使用して作成し た。 iv.実行結果 <購入するマスカラ1個の場合> pan{c111077}% ./def_budget.rb [~/Ruby] --状況-- 週末のアルバイトが終わり、給料で10000円分のnAmazonギフト券を購入した。 このギフト券の金額以内でマスカラ(900円)と香水(3000円)を購入したい。 -----------------------nAmazon.co.jp---------------------------- nAmazon カートに入っている商品 購入するマスカラの数量 : 1 購入可能です。マスカラを1個購入すると、金額は900円です。 残高は9100円になるので、香水は3個購入できます。 -----------------------nAmazon.co.jp---------------------------- <購入するマスカラ10個の場合> pan{SATO Saki}% ./def_budget.rb [~/Ruby] --状況-- 週末のアルバイトが終わり、給料で10000円分のnAmazonギフト券を購入した。 このギフト券の金額以内でマスカラ(900円)と香水(3000円)を購入したい。 -----------------------nAmazon.co.jp---------------------------- nAmazon カートに入っている商品 購入するマスカラの数量 : 10 購入可能です。マスカラを10個購入すると、金額は9000円です。 残高は1000円になるので、香水は0個購入できます。 -----------------------nAmazon.co.jp---------------------------- <購入するマスカラ11個の場合> pan{c111077}% ./def_budget.rb [~/Ruby] --状況-- 週末のアルバイトが終わり、給料で10000円分のnAmazonギフト券を購入した。 このギフト券の金額以内でマスカラ(900円)と香水(3000円)を購入したい。 -----------------------nAmazon.co.jp---------------------------- nAmazon カートに入っている商品 購入するマスカラの数量 : 11 購入可能です。マスカラを11個購入すると、金額は9900円です。 残高は100円になるので、香水は0個購入できます。 -----------------------nAmazon.co.jp---------------------------- <購入するマスカラ12個の場合> pan{c111077}% ./def_budget.rb [~/Ruby] --状況-- 週末のアルバイトが終わり、給料で10000円分のnAmazonギフト券を購入した。 このギフト券の金額以内でマスカラ(900円)と香水(3000円)を購入したい。 -----------------------nAmazon.co.jp---------------------------- nAmazon カートに入っている商品 購入するマスカラの数量 : 12 残高を超えているため、購入できません。 もう一度ご確認の上、数量を入力してください。 購入するマスカラの数量 : 11 購入可能です。マスカラを11個購入すると、金額は9900円です。 残高は100円になるので、香水は0個購入できます。 -----------------------nAmazon.co.jp---------------------------- v.考察 購入するマスカラの数量を入力すると、予算の10000円以内なら購入可能、10000 円を超えると購入不可能と判断し、不可能だったら、数量を再入力させるような プログラムにした。while--end を入れる位置によって、実行できたり、出来な かったりしたので、そこに少し時間がかかってしまった。前期で学んだ while--end、if,elsif,break が肝になるプログラムにしたので、大変前期の復習に なった。 また、def--end で定義したところの呼出し部分は正確に記述する必要があると 改めて分かった。 修正を加えることにより、def--end の method を複数使用しても、printf文もエラー が表示されることなく、また、残高の数値や香水の個数が正確に求めることができたので、プログラムは正常だといえる。 <購入するマスカラ1個の場合> pan{c111077}% bc -l [~/Ruby] 900*1 900 10000-900 9100 (10000-900*1)/3000 3.03333333333333333333 quit <購入するマスカラ10個の場合> pan{c111077}% bc -l [~/Ruby] 900*10 9000 10000-9000 1000 (10000-900*10)/3000 .33333333333333333333 quit <購入するマスカラ11個の場合> pan{SATO Saki}% bc -l [~/Ruby] 900*11 9900 10000-9900 100 (10000-900*11)/3000 .03333333333333333333 quit <購入するマスカラ12個の場合> pan{c111077}% bc -l [~/Ruby] 900*12 10800 10000-10800 -800 (10000-900*12)/3000 -.26666666666666666666 quit 以上のように、プログラムの実行結果と bc -l と計算結果が一致したので、プ ログラムは正しいと言える。 3、感想 今回学んだ関数やbarplot(x)、lineplot(x)義務教育で学んできた算数や数学と 同じ仕組みだと思う。def--end の中に関数の定義を入力すると、f(x,y)と同じ 計算をすることが出来た。 中学校の時に方程式を解いて、求めた答えからx軸の点とy軸の点をグラフに書き 出し、直線や曲線を求めたことがある。 また、2年の前期に履修した数値情報処理ではExcelを使用して数値だけが入力さ れた表をグラフにして視覚的に分かりやすく、一目で比較しやすいように様々な 種類のグラフに変換する作業を行った。 ExcelやOpenOfficeなどのソフトに出てくるグラフは、関数を視覚的に分かりや すくした非常に便利な機能だと思った。 今回学んだ内容は算数や数学の内容と似ており、プログラミングは数学が得 意な方が向いているのかもしれないと感じた。 そして、レベルの高いプログラムを作成する人たちは、数学を得意とする人が多 いのかもしれないと思った。 4、参考文献 西村まどか 第4回 基礎プログラミングll (繰り返しは引っ張りだそう) 「これを代入した答はなあに」 http://roy/~madoka/2012/r2/04/r2_04_05_theme_05_print.html (閲覧日:2012.10.17) 西村まどか 第4回 基礎プログラミングll (繰り返しは引っ張りだそう) 「操作をまとめる」 http://roy/~madoka/2012/r2/04/r2_04_07_theme_07_allinone.html (閲覧日:2012.10.17)