第2回 基礎プログラミングII レポート課題 氏名:久保田 瑛一郎 学籍番号:c109058 語学クラス:英語1 コース:社会福祉 航空会社の2レターコード(略称)をkey、正式航空会社名をvalueとした。 1、key「BC」に対してvalueは「スカイマーク」 2、key「FL」に対してvalueは「エア−ニッポン」 3、key「FW」に対してvalueは「IBEXエアラインズ」 4、key「HD」に対してvalueは「北海道国際航空」 5、key「JC」に対してvalueは「JALウェイズ」 これらに対応するhashの表し方は 1、airline["BC"]="スカイマーク" airline["FL"]="エア−ニッポン" airline["FW"]="IBEXエアラインズ" airline["HD"]="北海道国際航空" airline["JC"]="JALウェイズ またもう一つの表し方は {"BC" => "スカイマーク","FL" => "エア−ニッポン","FW" => "IBEXエアライン ズ","HD" => "北海道国際航空","JC" => "JALウェイズ}" 筆記問題 a 以下の変換表を同時に用いる 10進数 16進数対応表 10進 16進 2進 0 0 0 1 1 1 2 2 10 3 3 11 4 4 100 5 5 101 6 6 110 7 7 111 8 8 1000 9 9 1001 10 a 1010 11 b 1011 12 c 1100 13 d 1101 14 e 1110 15 f 1111 計算方法説明 16進数に変換するため、常に「16」で割る 2010を16で割ると、125あまり10。このあまりである「10」を16進数に変換する とAである。このAをこたえの一番最後におく。 つぎに先程割り切れた分である「125」を16で割る。すると7余り13なので、先程 のように余りである13を16進数に変換するとdである。 この答えを 先程のaの前において「da」とする 次は、さきに割り切れた分である7を16で変換するが7は16では割り切れないので、 7は余りとして考える。よって余りの7は16進数に変換しても7なので「da」の前 に7をおき「7da」とする この状態で「割り切れない」状態になった。よって答えは「7da」で終了である。 分かりにくいかもしれないが図解する A B 2010 / 16 125ーーーー10 125 / 16 7ーーーー13 7 / 16 0ーーーー7 A→わりきれたかずは、次で16でわる B→あまった数は16進数に変換する b 2 / 2010 2 / 1005ーーー0 ↑ 2 / 502ーーー1 ↑ 2 / 251ーーー0 ↑ 2 / 125ーーー1 ↑ 2 / 62ーーー1 ↑ 2 / 31ーーー0 ↑ 2 / 15ーーー1 ↑ 2 / 7ーーー1 ↑ 2 / 3ーーー1 ↑ 1ーーー1 ↑ →→→→→ 11111011010 となる これを16進数に変換する 11111011010 111 / 1011 / 1010→後から4つずつに区切る 7 / d / a→ 4つずつに区切った数字を16進数に変換 よって7daとなる よってaとbの解は一致した ここまでの参考文献 wikipadia 航空会社コード http://ja.wikipedia.org/wiki/%E8%88%AA%E7%A9%BA%E4%BC%9A%E7%A4%BE%E3%82%B3%E3%83%BC%E3%83%89 プログラム問題 A問題 A考えた設定 羽田空港出発便を一覧表示するプログラムを作成した Bもとにしたプログラムからの変更点 hash_date.rbやhash_pair.rbを参考にした。ハッシュのデータの作り方やfor文 の作り方を確認した程度である。 C 作成したプログラム #!/usr/koeki/bin/ruby #インタプリタであることを宣言する $KCODE="e" #文字コードをEUCに指定する 文字化け防止 airplane =Hash.new #airplaneというのはハッシュ(ーーといえばーー)である airplane["JTA71"]=1 #ハッシュのデータ[----といえば]=--- airplane["JAL101"]=16 #ハッシュのデータ[----といえば]=--- airplane["JAL173"]=14 #ハッシュのデータ[----といえば]=--- airplane["ANA991"]=58 #ハッシュのデータ[----といえば]=--- airplane["JAL901"]=9 #ハッシュのデータ[----といえば]=--- airplane["ANA981"]=62 #ハッシュのデータ[----といえば]=--- airplane["ADO81"]=107 #ハッシュのデータ[----といえば]=--- airplane["SHJ51"]=51 #ハッシュのデータ[----といえば]=--- airplane["SKY601"]=24 #ハッシュのデータ[----といえば]=--- airplane["ANA574"]=104 #ハッシュのデータ[----といえば]=--- print("便名\t 搭乗口No\n") #項目表示 for list in airplane.keys #listという変数に一つずつ入れ、forでその内容をすべて表示する printf("%s\t %d\n",list,airplane[list]) #内容表示 end #forの終わり D実行結果 pan{c109058}% ./hash_for.rb [~/Ruby] 便名 搭乗口No SKY601 24 JAL173 14 JTA71 1 JAL901 9 ANA574 104 SHJ51 51 ADO81 107 ANA991 58 JAL101 16 ANA981 62 E考察 ABCD順にすべきか迷ったのでそのままにしておいたが、きちんと表示できている ので、このプログラムは正しい。 B問題 A考えた設定 A問題の検索できるシステムを開発した Bもとにしたプログラム hash_for.rbをもととし、for文を消し、質問する部分であるSTDERRやそれを取り 込むgets.chompを追加した。 C作成したプログラム #!/usr/koeki/bin/ruby #インタプリタであることを宣言する $KCODE="e" #文字コードをEUCに指定する 文字化け防止 airplane =Hash.new #airplaneというのはハッシュ(ーーといえばーー)である airplane["JTA71"]=1 #ハッシュのデータ[----といえば]=--- airplane["JAL101"]=16 #ハッシュのデータ[----といえば]=--- airplane["JAL173"]=14 #ハッシュのデータ[----といえば]=--- airplane["ANA991"]=58 #ハッシュのデータ[----といえば]=--- airplane["JAL901"]=9 #ハッシュのデータ[----といえば]=--- airplane["ANA981"]=62 #ハッシュのデータ[----といえば]=--- airplane["ADO81"]=107 #ハッシュのデータ[----といえば]=--- airplane["SHJ51"]=51 #ハッシュのデータ[----といえば]=--- airplane["SKY601"]=24 #ハッシュのデータ[----といえば]=--- airplane["ANA574"]=104 #ハッシュのデータ[----といえば]=--- D STDERR.print("飛行機の便名を入力してください:") #質問表示 number=gets.chomp #それを取り込む if airplane.key?(number)==true #もしairplaneのキーとnumberに入力されたものが一緒だったら print("便名\t 搭乗口No\n") #項目表示 printf("%s\t%d\n",number,airplane[number]) #結果表示 else #それ以外は print("表にありません\n") #結果表示 end #ifのおわり D実行結果 pan{c109058}% [~/Ruby] pan{c109058}% ./hash_choice.rb [~/Ruby] 飛行機の便名を入力してください:SKY601 便名 搭乗口No SKY601 24 pan{c109058}% ./hash_choice.rb [~/Ruby] 飛行機の便名を入力してください:ANA574 便名 搭乗口No ANA574 104 pan{c109058}% ./hash_choice.rb [~/Ruby] 飛行機の便名を入力してください:PP900 表にありません E考察 きちんと番号と便名が一致する。さらに存在しない便名を入れたらエラーとの表 示も出るので、このプログラムは正しい。 C問題 A考えた設定 B問題をもとに新しく便名などの情報も追加できるプログラムを作成した。 Bもとにしたプログラム hash_pair.rbの内容も見ながらこうではないかと仮設をたてながら作成した C作成したプログラム #!/usr/koeki/bin/ruby #インタプリタであることを宣言する $KCODE="e" #文字コードをEUCに指定する 文字化け防止 airplane =Hash.new #airplaneというのはハッシュ(ーーといえばーー)である airplane["JTA71"]=1 #ハッシュのデータ[----といえば]=--- airplane["JAL101"]=16 #ハッシュのデータ[----といえば]=--- airplane["JAL173"]=14 #ハッシュのデータ[----といえば]=--- airplane["ANA991"]=58 #ハッシュのデータ[----といえば]=--- airplane["JAL901"]=9 #ハッシュのデータ[----といえば]=--- airplane["ANA981"]=62 #ハッシュのデータ[----といえば]=--- airplane["ADO81"]=107 #ハッシュのデータ[----といえば]=--- airplane["SHJ51"]=51 #ハッシュのデータ[----といえば]=--- airplane["SKY601"]=24 #ハッシュのデータ[----といえば]=--- airplane["ANA574"]=104 #ハッシュのデータ[----といえば]=--- STDERR.print("飛行機の便名を入力してください:") #質問表示 number=gets.chomp #それを取り込む if airplane.key?(number)==true #もしairplaneのキーとnumberに入力されたものが一緒だったら print("便名\t 搭乗口No\n") #項目表示 printf("%s\t%d\n",number,airplane[number]) #結果表示 else #それ以外は print("表にありません\n") #結果表示 end #ifのおわり D pan{c109058}% ./hash_register.rb [~/Ruby] 飛行機の便名を入力してください:JAL901 便名 搭乗口No JAL901 9 pan{c109058}% ./hash_register.rb [~/Ruby] 飛行機の便名を入力してください:ANA981 便名 搭乗口No ANA981 62 pan{c109058}% ./hash_register.rb [~/Ruby] 飛行機の便名を入力してください:PCL100 入力された便名が存在しません。新規にデータを作成します ゲート番号を入力してください:103 以下の内容を登録しました PCL100 103 E考察 実行結果にもあるように存在する便名の場合には、今までどうり表示される。な おかつ存在しないものには新しく作成することを求めることが出来ているので、 プログラムは正しい D問題 A 考えた設定 少しでも外部データから読みこめるようにすることを心掛けた(問題も難しいの で) Bもとにしたプログラム とくにないが、配列関係のプログラムは参照した C作成したデータ JTA71 1 JAL101 16 ADO81 107 ANA981 67 プログラム #!/usr/koeki/bin/ruby #インタプリタであることを宣言する airplane=Array.new #airplaneは配列である gate=Array.new #gateは配列である airplane_hash=Hash.new #irplane_hashはハッシュである gate_hash=Hash.new #gate_hashはハッシュである n = 0 #n(配列番号)は0からはじめる open("hash_date.dat","r") do |air| #外部データとはhash_date.datと定義しairに集める while a =air.gets #配列を取って来ることを繰り返す if /(\S+)\s+(\S+)/=~a #もし文字→空白→文字だったら airplane[n]=$1 #配列の一個目はairplaneとする gate[n]=$2 #配列の二個目はairplaneとする n+=1 #nを一つ足すことによって次に進む airplane=airplane_hash #airplaneのデータをairplane_hashにコピーする end #ifのおわり end #whileのおわり end #openのおわり for list in airplane_hash.keys #airplane_hashというキーを一つずつlistの中に入れて全部見せる printf("%s\n",airplane[list]) #結果表示 end #forの終わり D実行結果 pan{c109058}% ./hash_read.rb [~/Ruby] JAL101 ADO81 ANA981 E考察 外部からの読みこみといえば配列ということで、配列からハッシュに上手く切り 替えることが出来ると思い作成したが、いまいち上手く行かなかった。なぜ出来 ないのかも良く分からなかったため、大変だった E問題 A考えた設定 空港での管制塔職員にかかせない情報といえば、滑走路は何処か?ゲートはどこ を使うのかということである。しかしこれらはそのときの、上京に依里変更にな る場合も多い。そこで今回はハッシュを用いて変更にも耐えられる運行管理シス テムを作った。 Bもとにしたプログラム hash_registar.rbを参考に滑走路の情報を入れることが出来るようにしたりした、 ほかにwhile trueを用いるようにした C作成したプログラム#!/usr/koeki/bin/ruby #インタプリタであることを宣言する $KCODE="e" #文字コードをEUCに指定する 文字化け防止 airplane =Hash.new #airplaneというのはハッシュ(ーーといえばーー)である airplane["JTA71"]=1 #ハッシュのデータ[----といえば]=--- airplane["JAL101"]=16 #ハッシュのデータ[----といえば]=--- airplane["JAL173"]=14 #ハッシュのデータ[----といえば]=--- airplane["ANA991"]=58 #ハッシュのデータ[----といえば]=--- airplane["JAL901"]=9 #ハッシュのデータ[----といえば]=--- airplane["ANA981"]=62 #ハッシュのデータ[----といえば]=--- airplane["ADO81"]=107 #ハッシュのデータ[----といえば]=--- airplane["SHJ51"]=51 #ハッシュのデータ[----といえば]=--- airplane["SKY601"]=24 #ハッシュのデータ[----といえば]=--- airplane["ANA574"]=104 #ハッシュのデータ[----といえば]=--- open("hash_date_2.dat","w") do |ske| #書込みモードとし、書込み先はhash_date_2.datと定義し、skeに集める while true #条件無しに繰り返す STDERR.print("飛行機の便名を入力してください終了はq:") #質問表示 number=gets.chomp #それを取り込む if number =="q" #もしqと入力されたら exit #プログラムの終了 else STDERR.print("滑走路番号をいれてください:") ranwey=gets.chomp end if airplane.key?(number)==true #もしairplaneのキーとnumberに入力されたものが一緒だったら ske.printf("%s\t%d\t%s\n",number,airplane[number],ranwey) #結果表示 else #それ以外は print("入力された便名が存在しません。新規にデータを作成します\n\n\n") #これからやることの説明 STDERR.print("ゲート番号を入力してください:") #ゲート番号を入力させる airplane[number]=gets.chomp.to_i #その数字を取り込み、改行文字を取り、10進数と見なす ske.printf("%s\t%d\t%s\n",number,airplane[number],ranwey) #内容表示 end #ifのおわり end end D実行結果 pan{c109058}% ./hash_write.rb [~/Ruby] 飛行機の便名を入力してください終了はq:ANA991 滑走路番号をいれてください:L16 飛行機の便名を入力してください終了はq:JAL901 滑走路番号をいれてください:L32 飛行機の便名を入力してください終了はq:LPO400 滑走路番号をいれてください:L24 入力された便名が存在しません。新規にデータを作成します ゲート番号を入力してください:2 飛行機の便名を入力してください終了はq:q pan{c109058}% cat hash_date_2.dat [~/Ruby] ANA991 58 L16 JAL901 9 L32 LPO400 2 L24 dat ANA991 58 L16 JAL901 9 L32 LPO400 2 L24 E考察 もともと存在するデータはそのまま滑走路番号を入力できた。新規データに関し てはゲートを入力してから予定どうり滑走路も入力できた よってこのプログラムの正確性が示される 感想 久々に新しいところをやってかなり頭の中は混乱したが無事におえることが出 来た。後期は授業も多く大変だが、出来るだけ自分のペースで「楽しく」頑張っ て行きたい 実際にハッシュがということではないかも知れないが、たとえば医療の現場で、 123456(カルテの番号=なになにといえば)を入力すれば、Aさん(患者名=これこれ)と いうシステムがある。 共同学習者:宮川史礼 先輩 参考文献 羽田空港 本日のフライト 出発全便 http://jatns.tokyo-airport-bldg.co.jp/flight/domestic/todays_flight/all_flights_list/departure.html 10進数 16進数 変換 http://7ujm.net/play/DECtoHEX/TOH.html