講評: 確認しました。来週もこの調子で頑張って下さい。 ---- 10 月 10 日 第 2 回レポート 「Hash 配列」 学籍番号:c106XXXX 氏名: XXXXXXXX 語学クラス:XXXX語 XX 系:XXXX系 1. 5 つの対を考えよ。その対について、適切な hash 配列名を与え、本日学んだ記法を使用して書き下せ おにぎりの種類を hash 配列 onigiri としました。 onigiri の key と value はおのぎりの種類とその値段にとりました。 その 1: key 「タラコ」に対して value は「120」 その 2: key 「昆布」に対して value は「115」 その 3: key 「シーチキン」に対して value は「105」 その 4: key 「紅鮭」に対して value は「135」 その 5: key 「筋子」に対して value は「140」 onigiri["タラコ"] = 120 onigiri["昆布"] = 115 onigiri["シーチキン"] = 105 onigiri["紅鮭"] = 135 onigiri["筋子"] = 140 2. (1) 0d 1022 = 0x ?? 10進数から16進数に変換させるために、たしかめも兼ねて、初めに10進数表示を2進数表示にかえ て計算を実行させる。 1022を2で割り、出てきた答え0がでるまで2で割り続ける。 1022 / 2 = 511 … 0 511 / 2 = 255 … 1 255 / 2 = 127 … 1 127 / 2 = 63 … 1 63 / 2 = 31 … 1 31 / 2 = 15 … 1 15 / 2 = 7 … 1 7 / 2 = 3 … 1 3 / 2 = 1 … 1 1 / 2 = 0 … 1 最後の余りを先頭に並べる。 0b1111111110(2進数表示) "0b111111110" 2進数から16進数を求める。 右から4桁ずつ区切っていくと… 11、1111、1110 となる。 これらを西村まどか先生のHPに照らし合わせてみると 11 → 3 1111 → f 1110 → e と、わかる。よって、0d3fe(16進数)である。 (2) 0d 1022 = 0b ?? 10進数から2進数に変換させるために、2で割り続ける。 1022 / 2 = 511 … 0 511 / 2 = 255 … 1 255 / 2 = 127 … 1 127 / 2 = 63 … 1 63 / 2 = 31 … 1 31 / 2 = 15 … 1 15 / 2 = 7 … 1 7 / 2 = 3 … 1 3 / 2 = 1 … 1 1 / 2 = 0 … 1 最後の余りを先頭に並べて答えを導きだす。 よって、0b1111111110(2進数) ●確かめ● 2進数を10進数に変換してみる。 1×2**9 = 512 1×2**8 = 256 1×2**7 = 128 1×2**6 = 64 1×2**5 = 32 1×2**4 = 16 1×2**3 = 8 1×2**2 = 4 1×2**1 = 2 0×2**0 = 0 512+256+128+64+32+16+8+4+2+0 = 1022 よって、0b1111111110は正しい。 3.◎hash-for.rbのプログラム◎ a. 考えた設定 私はコンビニでバイトをしているので、おにぎりの商品を使ったプログラムを作 成したいと思い、おにぎりの種類と値段を使用したものを設定してみました。 b. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby $KCODE = 'e' #数字表記させるため "e" を指定する onigiri = Hash.new # Hash 配列を onigiri onigiri["筋子"] = 140 #p onigiri for item, price in onigiri #for文で繰り返し printf("%s\t%d\n", item,price) end c. もとにしたプログラムからの変更点 今日授業で学んだ、shop.rb をもとにプログラムを作成しました。 変更した点……Hash配列をshopからonigiriに変更。 d. プログラムを実行した結果画面 irsv{c106048}% ./hash-for.rb [~/Ruby] タラコ 120 昆布 115 筋子 140 紅鮭 135 シーチキン 105 e. 導き出された結果の考察 プログラム通りに起動し、ちゃんと入力された通りにでてきた。 f. 参考文献 後期 基礎プログラミングII 西村まどか先生の講義HP "http://roy/~madoka/2007/r2/02/02-02-hash.html"よ り ◎hash-register.rbのプログラム◎ a. 考えた設定 おにぎりとその値段を書き込めるデータプログラムを設定しました。 b. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby onigiri = Hash.new print("本日の価格を入力して下さい \v 終了 Ctrl D\n") #Ctrl-D を押したら終了になるを示す while true STDERR.print("取扱い商品名:\n") item = gets if item == nil #Ctrl-D を押したら終了 break else #Ctrl-D以外の文字列はここに進む item = item.chomp #改行文字を取る end STDERR.print("値段:") price = gets.chomp.to_i onigiri[item] = price end $KCODE = 'e' #漢字コード"e" #p shop for item, price in onigiri printf("%s\t%d\n", item, price) end open("gohann.txt","w") do |rice| #open-do で "gohann"テキストに書きこみ for name, price in onigiri do #Hashの中身を全部書く rice.printf("%-10s \t %s\n",name, price) end end c. もとにしたプログラムからの変更点 今日の授業で学んだ "pair.rb" を参考にプログラムを作成しました。 変更点……shopからonigiriに変更。 100グラムあたりの価格→値段に変更 登録した情報をファイルデータとして出力するプログラムに変更させ るように作成した。 d. プログラムを実行した結果画面 irsv{c106048}% ./hash-register.rb [~/Ruby] 本日の価格を入力して下さい 終了 Ctrl D 取扱い商品名: たらこ 値段:120 取扱い商品名: 昆布 値段:115 取扱い商品名: シーチキン 値段:105 取扱い商品名: 紅鮭 値段:135 取扱い商品名: 昆布 115 たらこ 120 紅鮭 135 シーチキン 105 irsv{c106048}% cat gohann.txt [~/Ruby] 昆布 115 たらこ 120 紅鮭 135 シーチキン 105 e. 導き出された結果の考察 cat gohann.txtとKtermに入力したところ、しっかりと結果が表示された。よっ て、登録した情報をファイルデータとして出力するプログラムにちゃんと変更で きていることがわっかた。 f. 参考文献 後期 基礎プログラミングII 西村まどか先生の講義HP "http://roy/~madoka/2007/r2/02/02-06-input-hash.html"より 4.単語帳 wordbook.rb を作成せよ。これは覚えた単語をデータファイル words.dat に書き込むプログラムである。 a. 考えた設定 登録したい名詞の日本語を入力して、英語で登録させるように設定しました。和 英辞書風に考えました。 b. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby tanngo = Hash.new print(" 登録したい名詞を入力して下さい \v 終了 Ctrl D\n") #Ctrl-D を押したら終了になるを示す while true STDERR.print("名詞:\n") item = gets if item == nil #Ctrl-D を押したら終了 break else #Ctrl-D以外の文字列はここに進む item = item.chomp #改行文字を取る end STDERR.print("単語:") price = gets.chomp tanngo[item] = price end $KCODE = 'e' #漢字コード"e" for item, price in tanngo printf("%s\t%s\n", item, price) end open("words.dat","a") do |eigo| #open-do で "words"のデー タ に書きこみ #"a"を入力し単語をデータの続きから書き始められる。"w"だとデータが毎回新規になってしまい書き足しされない。 for meisi, imi in tanngo do #Hashの中身を全部書く eigo.printf("%-10s \t %s\n",meisi, imi) end end c. もとにしたプログラムからの変更点 3番で作成したプログラム "hash-register.rb" をもとにし、単語帳wordbook.rb を作成しました。"words.dat" に書き込むプログラムにするために open("words.dat","a") do |eigo|の所を "a"にしどんどん単語が足されていく ように変更しました。 d. プログラムを実行した結果画面 irsv{c106048}% ./wordbook.rb [~/Ruby] 登録したい名詞を入力して下さい 終了 Ctrl D 名詞: 花 単語:A flower 名詞: 木 単語:A tree 名詞: お金 単語:Money 名詞: 動物 単語:An animal 名詞: お金 Money 木 A tree 花 A flower 動物 An animal ○words.datの結果画面○ irsv{c106048}% cat words.dat [~/Ruby] 飛行機 An airplane 町 A town 電車 A trin 国 A country 自転車 A bicycle 市 A city 村 A village 車 A car 県庁 The prefectual office 日 A day 時間 Time 分 A share お金 Money 木 A tree 花 A flower 動物 An animal 前に登録した単語のあとにしっかりと追加された。 e. 導き出された結果の考察 書き込みデータにするために、"a"と入力したことによって、単語がどんどん積 み重なって登録された。cat words.dat に登録された単語が表示された。プログ ラム通り起動しました。 f.このような仕組みは、パソコンや携帯と同じように、前に使った文字が自動的 に登録されていき、次に使用した時もちゃんと文字がでてくるといった仕組みと 似ていると感じました。 g. 参考文献 後期基礎プログラミングII 西村まどか先生HP "http://roy/~madoka/2007/r2/02/index.html"より 5. 感想 今回 "hash" を学び、日常の生活の中でもプログラムが使用されていることを実 感しました。open - do を忘れていたので、今回のプログラムを作成しきながら 復習し取り入れながら作成しました。前期の基礎プログラミングのHPを参考にし ながらhash-register.rb の 登録した情報をファイルデータとして出力するプロ グラムを解決しました。