05 月 13 日のレポート 系:経営系 語学:英語 学籍番号:C107XXXX 氏名:XXXXXXXX 1.筆記問題 A. ・10進数の場合----------------------------------------------------------------- 0b11101 = 1 * 2の4乗 + 1 * 2の3乗 + 1 * 2の2乗 + 1 * 2の1乗 + 1 * 2の0乗 = 16 + 8 + 4 + 0 + 1 = 29 よって 2進数 0b11101 は 10進数の場合 0d29 となる。 ------------------------------------------------------------------------------- ・16進数の場合----------------------------------------------------------------- 16進数の場合四桁ごとに区切って考えるので、まず0b11101 を 0001 と1101 の二つに分ける。 0001 は 0 * 2の3乗 + 0 * 2の2乗 + 0 * 2の1乗 + 1 * 2の0乗 = 1、 1101 は 1 * 2の3乗 + 1 * 2の2乗 + 0 * 2の1乗 + 1 * 2の0乗 = 13 になるが、 16進数は1〜9までを通常の整数、10〜15までをA〜Fのアルファベットで表すため、 13に対応したアルファベットは D 。よって13 = Dとなる。 これらのことから、 2進数 0b11101 は16進数の場合 0x1D となる。 ------------------------------------------------------------------------------- B. 去年の夏休み、友人のアルバイトの日程を聞いたみたところ、土曜日が休みで、 それ以外は連続で仕事が続くと言っていた。これをプログラム風に書き直すと、 A = 曜日 B = アルバイト C = 休み if A =="Saturday" Cをせよ else Bをせよ end となる。 2.プログラム問題 A. a.考えた設定----------------------------------------------------------------- 向こう岸までの距離をrange、キーボードから入力される石の重さをstoneとして、 rangeからstoneと同じ数の距離を引いていき、rangeが0を下回った時に 「到着おめでとう」のメッセージが出力されるプログラムを考えた。 rangeは最初に30と設定、stoneにはSTDERR.printとgets.chompを用いてキーボー ドから入力された数字が入るようにした。 ------------------------------------------------------------------------------ b.作成したプログラムとその解説------------------------------------------------ #!/usr/koeki/bin/ruby range = 30 print("このボートには現在30[kg]の石が積んであります。\n") print("1[kg]の石を投げると1[m]進み、2[kg]なら2[m]、3[kg]なら3[m]進みます。\n") print("向こう岸までの距離は30mです。\n") while range > 3 STDERR.print("\n何kgの石をなげますか?1〜3でどうぞ。\n") stone = gets.chomp stone = stone.to_i #もし石が1kgなら距離から-1して表示せよ if stone == 1 range = range-1 printf("\n1[kg]の石を投げました。\n") printf("残りの距離 = %d [m]\n",range) printf("石の残量 = %d [Kg]\n",range) #そうでなく、もし石が2kgならば距離から-2して表示せよ elsif stone == 2 range = range-2 printf("\n2[kg]の石を投げました。\n") printf("残りの距離 = %d [m]\n",range) printf("石の残量 = %d [Kg]\n",range) #そうでなく、もし石が3kgならば距離から-3して表示せよ elsif stone == 3 range = range-3 printf("\n3[kg]の石を投げました。\n") printf("残りの距離 = %d [m]\n",range) printf("石の残量 = %d [Kg]\n",range) end end printf("\n残りの距離は%d[m]ですので%d[kg]の石を投げます。\n",range,range) print("\n到着おめでとう。向こう岸に着きました。\n") ------------------------------------------------------------------------------- whileを使って、rangeが3より大きいうちは動作を繰り返すようにした。 距離が3m以下になった場合、残りの距離と同じ数値分の重さの石を投げたかのご とく出力されるようにした。 STDERR.printfによって投げた石の報告、残りの距離、石の残量を表示するよう にした。\nを使って、実行した際に見やすいようにした。少々やりすぎの感がな いでもない。 ------------------------------------------------------------------------------- c.もとにしたプログラムからの変更点--------------------------------------------- 自分で1から考えたので無し。 ------------------------------------------------------------------------------- d.プログラムを実行した結果画面------------------------------------------------- pan{c107072}% ./while_boat.rb [~/Ruby] このボートには現在30[kg]の石が積んであります。 1[kg]の石を投げると1[m]進み、2[kg]なら2[m]、3[kg]なら3[m]進みます。 向こう岸までの距離は30mです。 何kgの石をなげますか?1〜3でどうぞ。 3 3[kg]の石を投げました。 残りの距離 = 27 [m] 石の残量 = 27 [Kg] 何kgの石をなげますか?1〜3でどうぞ。 3 3[kg]の石を投げました。 残りの距離 = 24 [m] 石の残量 = 24 [Kg] 何kgの石をなげますか?1〜3でどうぞ。 3 3[kg]の石を投げました。 残りの距離 = 21 [m] 石の残量 = 21 [Kg] 何kgの石をなげますか?1〜3でどうぞ。 3 3[kg]の石を投げました。 残りの距離 = 18 [m] 石の残量 = 18 [Kg] 何kgの石をなげますか?1〜3でどうぞ。 3 3[kg]の石を投げました。 残りの距離 = 15 [m] 石の残量 = 15 [Kg] 何kgの石をなげますか?1〜3でどうぞ。 3 3[kg]の石を投げました。 残りの距離 = 12 [m] 石の残量 = 12 [Kg] 何kgの石をなげますか?1〜3でどうぞ。 3 3[kg]の石を投げました。 残りの距離 = 9 [m] 石の残量 = 9 [Kg] 何kgの石をなげますか?1〜3でどうぞ。 3 3[kg]の石を投げました。 残りの距離 = 6 [m] 石の残量 = 6 [Kg] 何kgの石をなげますか?1〜3でどうぞ。 3 3[kg]の石を投げました。 残りの距離 = 3 [m] 石の残量 = 3 [Kg] 残りの距離は3[m]ですので3[kg]の石を投げます。 到着おめでとう。向こう岸に着きました。 ------------------------------------------------------------------------------- e. 導き出された結果の考察------------------------------------------------------ pan{c107072}% bc -l [~/Ruby] 30-1 29 29-2 27 27-3 24 24-3 21 21-3 18 18-3 15 15-3 12 12-3 9 9-3 6 6-3 3 よって計算結果は正しい。 ------------------------------------------------------------------------------- f.参考文献 ページタイトル: より複雑な条件文 URL: http://roy/~madoka/2008/r1/03/03-11-ifelse.html 筆者: 西村まどか先生 ------------------------------------------------------------------------------- B. a.考えた設定------------------------------------------------------------------- 筆記問題Bを元にして、一週間の予定を三回だけ問うことができるプログラムを 作成した。「自己代入演算子を用いた」という記述があったがわからなかったの で調べてみたところ、 変数の値を増やすために x = x + 3 といったことをよく行います。これを省略 して、 x += 3 と書くことができます。同様に、 -=, *=, /=, %=, **= も使え ます。こういった、変数自身との演算結果をその変数に代入するような演算子を、 自己代入演算子といいます。 (https://chick.g.hatena.ne.jp/allegro/?word=*%5BRuby%5Dより引用) という記述があったので、+= を使用したプログラムにした。 回数制限をもうけたのはそのためで、もとは制限無しだった。 ------------------------------------------------------------------------------- b.作成したプログラムとその解説------------------------------------------------- #!/usr/koeki/bin/ruby count=0 print("何曜日の予定が知りたいですか?時間が無いので三日分だけお教えします。\n") while count < 3 STDERR.print("\nmon(月),tue(火),wed(水),thu(木),fri(金),sat(土).sun(日)から選んで下さい。\n") day = gets.chomp #月曜日 if day=="mon" count += 1 STDERR.printf("\n月曜日は朝8時から午後3時までアルバイトです。\n") #火曜日 elsif day=="tue" count += 1 STDERR.printf("\n火曜日は夕方5時から夜10時までアルバイトです。\n") #水曜日 elsif day=="wed" count += 1 STDERR.printf("\n水曜日は夜10時から朝8時までアルバイトです。\n") #木曜日 elsif day=="thu" count += 1 STDERR.printf("\n木曜日は夜10時から朝8時までアルバイトです。\n") #金曜日 elsif day=="fri" count += 1 STDERR.printf("\n金曜日は朝8時から夜10時までアルバイトです。\n") #土曜日 elsif day=="sat" count += 1 STDERR.printf("\n土曜日は休みです。一日のんびりしてる予定です。\n") #日曜日 elsif day=="sun" count += 1 STDERR.printf("\n日曜日は夕方5時から夜10時までアルバイトです。\n") end end printf("\nごめんなさい、もう行かないと…ではまた。\n") ------------------------------------------------------------------------------- dayを曜日、聞いた回数をcountと設定。dayにはSTDERR.printとgets.chompを用 いてキーボードから入力された文字が入るようにした。countは自己代入演算子 を用いて1ずつ増やすようにし、3に達したらプログラムが停止するようにwhile を使った。 ------------------------------------------------------------------------------- c.もとにしたプログラムからの変更点--------------------------------------------- 自分で1から考えたので無し。 ------------------------------------------------------------------------------- d.プログラムを実行した結果画面------------------------------------------------- pan{c107072}% ./c107072_04.rb [~/Ruby] 何曜日の予定が知りたいですか?時間が無いので三日分だけお教えします。 mon(月),tue(火),wed(水),thu(木),fri(金),sat(土).sun(日)から選んで下さい。 fri 金曜日は朝8時から夜10時までアルバイトです。 mon(月),tue(火),wed(水),thu(木),fri(金),sat(土).sun(日)から選んで下さい。 sat 土曜日は休みです。一日のんびりしてる予定です。 mon(月),tue(火),wed(水),thu(木),fri(金),sat(土).sun(日)から選んで下さい。 sun 日曜日は夕方5時から夜10時までアルバイトです。 ごめんなさい、もう行かないと…ではまた。 ------------------------------------------------------------------------------- e.導き出された結果の考察------------------------------------------------------- 計算するプログラムではないので確かめ算は無し。 ------------------------------------------------------------------------------- f.参考文献--------------------------------------------------------------------- ページタイトル: 雲雀は高く空を舞い URL: https://chick.g.hatena.ne.jp/allegro/?word=*%5BRuby%5D 筆者:allegro 氏 ------------------------------------------------------------------------------- C. a.考えた設定------------------------------------------------------------------- 月、火、水、木、金なら「本日振り込みできます」 土、日なら「月曜日に振り込まれます」 と出力されるプログラム。 5月の設定なので、 3、4日なら「月曜日が祝日ですので水曜に振り込まれます」 5、6日なら「祝日ですので水曜に振り込まれます」 と出力されるようにした。 ------------------------------------------------------------------------------- b.作成したプログラムとその解説------------------------------------------------- #!/usr/koeki/bin/ruby printf("今日は5月1日(木)です。\n") STDERR.printf("お振り込みになる今月の日付を入力して下さい\n") acday = gets.chomp.to_i d = (3 + acday) % 7 #月、火、水、木、金なら「本日振り込みできます」 #土、日なら「月曜日に振り込まれます」 #3、4日なら「月曜日が祝日ですので水曜に振り込まれます」 #5、6日なら「祝日ですので水曜に振り込まれます」 if d == 0 wday = "日" printf("5月%d日は%s曜日です。\n", acday, wday) printf("月曜に振り込まれます。\n") elsif acday == 3 wday = "土" printf("5月%d日は%s曜日です。\n", acday, wday) printf("月曜日が祝日ですので水曜に振り込まれます。\n") elsif acday == 4 wday = "日" printf("5月%d日は%s曜日です。\n", acday, wday) printf("月曜日が祝日ですので水曜に振り込まれます。\n") elsif acday == 5 wday = "月" printf("5月%d日は%s曜日です。\n", acday, wday) printf("祝日ですので水曜に振り込まれます。\n") elsif acday == 6 wday = "火" printf("5月%d日は%s曜日です。\n", acday, wday) printf("祝日ですので水曜に振り込まれます。\n") elsif d == 1 wday = "月" printf("5月%d日は%s曜日です。\n", acday, wday) printf("本日振込できます。\n") elsif d == 2 wday = "火" printf("5月%d日は%s曜日です。\n", acday, wday) printf("本日振込できます。\n") elsif d == 3 wday = "水" printf("5月%d日は%s曜日です。\n", acday, wday) printf("本日振込できます。\n") elsif d == 4 wday = "木" printf("5月%d日は%s曜日です。\n", acday, wday) printf("本日振込できます。\n") elsif d == 5 wday = "金" printf("5月%d日は%s曜日です。\n", acday, wday) printf("本日振込できます。\n") else wday = "土" printf("5月%d日は%s曜日です。\n", acday, wday) printf("月曜に振り込まれます。\n") end ------------------------------------------------------------------------------- c.もとにしたプログラムからの変更点--------------------------------------------- ・printfの場所を変更 ・振り込まれる日がいつなのか出力する文章を新たに追加 ・dayをacdayに変更。accountdayの略。自分にとってわかりやすいようにしただ けなので特に意味は無し。 ------------------------------------------------------------------------------- d.プログラムを実行した画面----------------------------------------------------- (平日の場合) pan{c107072}% ./c107072_banking.rb [~/Ruby] 今日は5月1日(木)です。 お振り込みになる今月の日付を入力して下さい 8 5月8日は木曜日です。 本日振込できます。 (休日の場合) pan{c107072}% ./c107072_banking.rb [~/Ruby] 今日は5月1日(木)です。 お振り込みになる今月の日付を入力して下さい 10 5月10日は土曜日です。 月曜に振り込まれます。 (3日、4日の場合) pan{c107072}% ./c107072_banking.rb [~/Ruby] 今日は5月1日(木)です。 お振り込みになる今月の日付を入力して下さい 3 5月3日は土曜日です。 月曜日が祝日ですので水曜に振り込まれます。 (5日、6日の場合) pan{c107072}% ./c107072_banking.rb [~/Ruby] 今日は5月1日(木)です。 お振り込みになる今月の日付を入力して下さい 5 5月5日は月曜日です。 祝日ですので水曜に振り込まれます。 ------------------------------------------------------------------------------- e.導き出された結果の考察 (ここで計算結果が合っているか調べる)------------------ 計算結果を出力するプログラムではないので確かめ算は無し。 ------------------------------------------------------------------------------- f.参考文献 (参照した本、ホームページなど)-------------------------------------- ページタイトル : 曜日を調べるプログラム URL : http://roy/~madoka/2008/r1/04/04-18-cal.html 筆者 : 西村まどか先生 ------------------------------------------------------------------------------- 3.感想 プログラム問題Cを完成させてから他の人が作成した同じ問題を見せてもらった が、自分のものよりとてもすっきりしていてきれいだった。 自分の作るプログラムは全体的にくどいので、今後改善していきたいと思う。 次回も期日まで完成させ、提出するようにしたい。