筆記問題の参考文献を載せ忘れてしまいました。 こちらが修正したレポートです。 第9回 基礎プログラミング I レポート課題 氏名: xxxxxxxx 学籍番号: C109xxx 語学クラス: 英語3 コース(系): 政策マネジメント 1 いずれも16進数のままでは通常の加算、減算はできないので10進数に変換して 加算、減算をしてから、その答えをまた16進数に変換する方法をとる。 また、16進数から10進数への変換には2進数への変換を間に入れる。 A まず16進数を2進数へ変換する。参考文献の進数変換表によれば 0x13 = 10011 , 0x24 = 100100 である。これを10進数へ変換する。 16 8 4 2 1 * * * * * 1 0 0 1 1 16 0 0 2 1 全て足すと 19 32 16 8 4 2 1 * * * * * * 1 0 0 1 0 0 32 0 0 1 0 0 全て足すと33 2つを足すと52 つぎにこれを16進数へ直す。まず2進数へ変換する。 52 / 2 = 26 余り 0 26 / 2 = 13 0 13 / 2 = 6 1 6 / 2 = 3 0 3 / 2 = 1 1 1 / 2 = 0 1 この 0b110100 を 16進数へ変換する。 0011 0100 = 3 4 よって 0x13 + 0x24 = 0x34 B 前問と同じく変換する。 2進数へ変換 0x23 = 100011 , 0x1e = 11110 ----------------------------- 10進数へ変換 32 16 8 4 2 1 * * * * * * 1 0 0 0 1 1 32 0 0 0 2 1 すべて足すと35 16 8 4 2 1 * * * * * 1 1 1 1 0 16 8 4 2 0 すべて足すと30 2つを足すと65 つぎにこれを2進数へ変換する 65 / 2 = 32 余り 1 32 / 2 = 16 0 16 / 2 = 8 0 8 / 2 = 4 0 4 / 2 = 2 0 2 / 2 = 1 0 1 / 2 = 0 1 この 0b1000001 を16進数へ変換する。 0100 0001 = 4 1 よって 0x23 + 0x1e = 0x41 C 同じ方法で減算する。 2進数へ変換 0xaa =10101010 0x33 = 110011 ------------------------------- 10進数へ変換 128 64 32 16 8 4 2 1 * * * * * * * * 1 0 1 0 1 0 1 0 128 0 32 0 8 0 2 0 全て足すと170 32 16 8 4 2 1 * * * * * * 1 1 0 0 1 1 32 16 0 0 2 1 全て足すと51 この2つで減算をする。170-51=119 -------------------------------- 2進数へ変換 119 / 2 = 59 余り 1 59 / 2 = 29 1 29 / 2 = 14 1 14 / 2 = 7 0 7 / 2 = 3 1 3 / 2 = 1 1 1 / 2 = 0 1 この 0b1110111 を16進数へ変換する。 0111 0111 = 7 7 よって 0xaa - 0x33 = 0x77 参考文献 「生活と情報(2009)」講義レジュメ 「第2回 情報のデジタル化[1] 2進数」 神田直弥 p4 「2進数によるデータ表現」、「10進数から2進数へ」、 「2進数←→16進数の相互変換」 2-A プログラムの公開先URL http://roy/~c109046/advertise/ 世界145ヶ国の消費税率を検索できるプログラムを作成しました。 しかし小数点以下が正しく表示されずに切り捨てになる不備があります。 実用部門にエントリーします。 2-B. a) 世界の消費税率を検索できるプログラムを作成したいと思った。 その検索方法については、出来る限りユーザーが快適に調べられるものに したいと思った。 それで、国を世界の地域ごとに分類し、ユーザーが日本を調べたかったのなら 「a.アジア b.ヨーロッパ ...」で「a」を入力し、 表示されたアジアの国々の一覧、たとえば「1.中国 2.日本 ...」から 2 と入力するようなプログラムの形を考えた。 また、一国だけ見るよりも、多国間で比較することが多いという点もあるので、 国を選ぶところまで行かずに、地域を選んだら国々の消費税率を 一斉に表示させる方法も考えた。 しかし、データに地域の分類を加える前に、土台としてデータ全体から ユーザーの入力によって検索を実行する骨組のプログラム、vat.rbを作成した。 元にしたのは データ読み込みの部分は7回目の授業で作成した write_ticket.rb 検索部分は同じく授業で作成した std_regexp.rb の2つのプログラムである。 なお時間配分の失敗で、目標としていたプログラムの形まで行かず、 土台のプログラムが完成したところで時間切れとなった。 b) *データ* #国 #税率 トルコ 18 中国 17 イスラエル 15.5 スリランカ 15 パキスタン 15 バングラデシュ 15 ネパール 13 フィリピン 12 インドネシア 10 韓国 10 カンボジア 10 ベトナム 10 モンゴル 10 レバノン 10 シンガポール 7 タイ 7 台湾 5 日本 5 スウェーデン 25 デンマーク 25 ノルウェー 25 アイスランド 24.5 フィンランド 22 クロアチア 22 ポーランド 22 アイルランド 21.5 ベルギー 21 ラトビア 21 アルバニア 20 アルメニア 20 イタリア 20 ウクライナ 20 ウズベキスタン 20 オーストリア 20 キルギス 20 サンマリノ 20 スロベニア 20 タジキスタン 20 ハンガリー 20 ブルガリア 20 ポルトガル 20 モルドバ 20 フランス 19.6 モナコ 19.6 オランダ 19 ギリシャ 19 スロバキア 19 チェコ 19 ドイツ 19 リトアニア 19 ルーマニア 19 アゼルバイジャン 18 エストニア 18 グルジア 18 セルビア 18 ベラルーシ 18 マケドニア 18 マルタ 18 ロシア 18 ボスニア・ヘルツェゴビナ 18 モンテネグロ 17 スペイン 16 イギリス 15 キプロス 15 トルクメニスタン 15 ルクセンブルク 15 カザフスタン 13 スイス 7.6 リヒテンシュタイン 7.6 ジャマイカ 16.5 ドミニカ共和国 16 アンティグア・バーブーダ 15 ドミニカ 15 トリニダード・トバゴ 15 ニカラグア 15 バルバドス 15 メキシコ 15 エルサルバドル 13 コスタリカ 13 グアテマラ 12 ホンジュラス 12 グレナダ 10 ハイチ 10 ベリーズ 10 カナダ 5 パナマ 5 ウルグアイ 22 アルゼンチン 21 チリ 19 ペルー 19 ブラジル 17 ガイアナ 16 コロンビア 16 ボリビア 13 エクアドル 12 ベネズエラ 12 スリナム 10 パラグアイ 10 タンザニア 20 モロッコ 20 カメルーン 19.25 ウガンダ 18 ガボン 18 ギニア 18 コートジボワール 18 コンゴ共和国 18 セネガル 18 チャド 18 中央アフリカ 18 チュニジア 18 トーゴ 18 ニジェール 18 ブルキナファソ 18 ベナン 18 マダガスカル 18 マリ 18 ルワンダ 18 ザンビア 17.5 マラウイ 17.5 アルジェリア 17 モザンビーク 17 ケニア 16 エチオピア 15 カーボヴェルデ 15 ギニアビサウ 15 ジンバブエ 15 赤道ギニア 15 ナミビア 15 モーリシャス 15 南アフリカ 14 モーリタニア 14 レソト 14 ガーナ 12.5 セーシェル 12 エジプト 10 コモロ 10 スーダン 10 ボツワナ 10 ナイジェリア 5 サモア 15 ニュージーランド 12.5 バヌアツ 12.5 フィジー 12.5 オーストラリア 10 パプアニューギニア 10 # http://www.kanzeikai.jp/index.asp?patten_cd=12&page_no=162 *プログラム* #!/usr/koeki/bin/ruby $KCODE = 'e' # コンピュータへ漢字コードを使用するという宣言 country = Array.new # 変数にはこれから拾ってくる配列が代入される rate = Array.new # 同上 print("消費税を実施している世界145ヶ国の消費税率が調べられます。\n") # 実行して最初に表示される文なので、念を押してプログラムの説明をする STDERR.print"調べたい国の名前を入力してください:" # 入力を促すprint文には STDERR をつける。 pattern = STDIN.gets.chomp # 変数 pattern に、上の STDERR によって入力された文字をしまう request = Regexp.new(pattern,true,"e") # 変数 request に pattern を正規表現にして代入する。これで検索ができる。 true は大文字小文字を区別せず、e は漢字コードを使用することを指定。 open("vat.dat", "r") do |rank| # open-endでカッコ内のファイルを開き、"r"でファイルを読み込む。 rank は読み込んだデータを一時的に代入しておく変数。 while vat = rank.gets # 変数 vat に gets でデータを代入。vat に vat.dat が入った。 if request =~vat # もし vat(データ) の中に request(検索文字) と全く同じものがあって、 if /(\S+)\s+(\d+)/ =~vat # vat(データ)が 文字/空白/数字 というつくりだったら #print vat #失敗対策 country = $1 #country には1列目を代入 rate = $2.to_f #rate には2列目を代入(小数点以下も扱う) #p country,rate #失敗対策 printf("\n%s の消費税率は\t%5.2fパーセントです。\n",country,rate) # 一行空けて、国名と税率を代入した文を表示。 税率は小数点を含めて5ケタまで表示。小数点以下は2ケタを表示 end #openのend end #whileのend end #一つ目のifのend end #二つ目のifのend c) std_regexp.rb を元にした pattern = STDIN.gets.chomp request = Regexp.new(pattern, true, "e") の2行については変数名も変更せずにそのまま使用した。 open 以下で参考にした write_ticket.rb では変数名の変更と if /(\S+)\s+(\d+)/ =~vat の前に、 if request =~vat を挿入した。 検索プログラムなので、データを開いたら、検索文字を参照する必要が あるので挿入した。 また、癖で i = 0 と i += 1 を入れてしまったが誤作動した。 結果で、一行のデータしか使用しないのだから、 回数にあたる変数を設ける必要がないことに気がついた。 d) % ./vat.rb [~/public_html/advertise] 消費税を実施している世界145ヶ国の消費税率が調べられます。 調べたい国の名前を入力してください:スウェーデン スウェーデン の消費税率は 25.00パーセントです。 % ./vat.rb [~/public_html/advertise] 消費税を実施している世界145ヶ国の消費税率が調べられます。 調べたい国の名前を入力してください:カメルーン カメルーン の消費税率は 19.00パーセントです。 % 破綻なく実行結果がでた。 e) 実は、スウェーデンの 25% は合っているが、カメルーンの 19% は誤りで、 本当は 19.25% である。データファイルでは 19.25% となっているのに、 実行結果では 19.00% となってしまうので、このプログラムには欠陥があり、 誤りを見つけ次第、修正しなければならない。 f) データの参考文献 世界の消費税(付加価値税)の税率……平成21年度版 http://www.kanzeikai.jp/index.asp?patten_cd=12&page_no=162 全国間税会総連合会 3 今回は心から納得出来る作品が作れなかったが、そのかわりペース配分の 大切さと、締切に応じたある程度のメドの付け方がわかった。 しかしプログラムに欠陥があること、CSSを作れなかったことなどは 問題なので、反省して次へ取り組みたい。 自分の実力がどの程度ついているのかもよく実感できたので、 復習や、平日のレポート作成にもっと力をいれたい。 参考文献 正規表現の特殊文字 http://roy/~yuuji/2010/pf1/05/regex2.html 広瀬雄二 基礎プログラミング I 第7回 正規表現と Ruby 言語でのプログラミング 「キーボードから検索文字を入力したい」 http://roy/~madoka/2010/r1/07/07_04_theme_03_stdin.html 西村まどか 基礎プログラミング I 第7回 正規表現と Ruby 言語でのプログラミング 「データを読み込むようにするには」 http://roy/~madoka/2010/r1/07/07_09_theme_08_fileread.html 西村まどか 共同学習者: 笹原千珠子