講評: 確認しました。open が開かなかったのではなく、 ファイルを読みこめなかったためにエラーメッセージが出力されたのでは ないでしょうか。 筆記問題では p 文的な表示に関する記載がありませんでした。 ファイルへの書き出しはこれで正解です。 ---- 10 月 10 日 第 2 回レポート 「Hash 配列」 学籍番号 :c106XXXX 氏名 :XXXXXXXX 語学クラス:XXXX語 XX 系 :XXXX系 1 本日のランチを hash 配列 lunch としました。 lunch の key と value はそれぞれ動物名とその特徴にとりました。 その 1: key 「カレー」に対して value は「300円」 その 2: key 「肉うどん」に対して「400円」 その 3: key 「味噌ラーメン」に対して value は「350円」 その 4: key 「ナポリタン」に対して「250円」 その 5: key 「日替りランチ」に対して「450円」 lunch["カレー"] = "300" lunch["肉うどん"] = "350" lunch["味噌ラーメン"] = "350" lunch["ナポリタン"] = "250" lunch["日替り定食"] = "400" 2 A 0d1022=0x 10進数を16で割って、その商をさらに16で割る。 余りを出しながら、商が0になるまで繰り返す。 1022÷16=63余り14 63 ÷16=3 余り15 3 ÷16=0 余り3 最後の余りを先頭に、下から順に並べる。 3 15 14 それぞれの数を表を見ながら、16進数に当てはめる。 3 → 3 15→ F 14→ E すなわち 0d1022 = 0x3FE ●確かめ 16進数を10進数に変換する。 3 × 16の2乗 = 768 (F)15× 16の1乗 = 240 (E)14× 16の0乗 = 14 それぞれで求めた値を足す。 768 + 240 + 14 = 1022 0x3FE = 0d1022 になるので、計算は正しい。 irsv{c106145}% bc -l [~] 768+240+14 1022 B 0d1022 = 0b 10進数を2で割って、その商をさらに2で割る。 余りを出しながら、商が0になるまで繰り返す。 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 最後の余りを先頭に下から順に並べる。 すなわち 0d1022 = 0b1111111110 さらに、16進数で求める。 上記で求めた2進数を右から順に4つに区切る。 4つに区切ったそれぞれの値を、表を参考に16進数に当てはめる。 11 →3 1111 →F 1110 →E すなわち 0b1111111110 = 0x3FE ●確かめ 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 = 0x1022になるので、計算は正しい。 irsv{c106145}% bc -l [~] 512+256+128+64+32+16+8+4+2+0 1022 3 1. 考えた設定 作成したプログラムを具体的に説明する。 本日のランチとその値段を表示させるプログラム。 2. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby $KCODE = 'e' lunch = Hash.new lunch["カレー"] = "300" lunch["肉うどん"] = "350" lunch["味噌ラーメン"] = "350" lunch["ナポリタン"] = "250" lunch["日替り定食"] = "400" #p lunch for item, price in lunch printf("%s は %d 円です。\n", item, price) end 3. もとにしたプログラムからの変更点 これはいくらを参考に、[ ]の中をプログラムにあうように変更した。 4. プログラムを実行した結果画面 irsv{c106145}% chmod +x hash-for.rb [~/Ruby] irsv{c106145}% ./hash-for.rb [~/Ruby] カレー は 300 円です。 肉うどん は 350 円です。 ナポリタン は 250 円です。 日替り定食 は 400 円です。 味噌ラーメン は 350 円です。 5. 導き出された結果の考察 (ここで計算結果が合っているか調べる) ktermで実行したら、emacsでプログラムを作った通りに動きました。 6. 参考文献 (参照した本、ホームページなど) 西村先生のHP これはいくら http://roy/~madoka/2007/r2/02/02-02-hash.html ●データから読み込むプログラムに変更する 1. 考えた設定 作成したプログラムを具体的に説明する。 本日のランチとその値段をopenを使って表示させる。 2. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby $KCODE = 'e ' lunch = Hash.new open("lunch.txt","r")do |gohan| p lunch for item, price in lunch printf("%s は %d 円です。\n", lunch, price) end end 3. もとにしたプログラムからの変更点 Hashの対を表示するにはを参考に、openをいれた。 4. プログラムを実行した結果画面 irsv{c106145}% ./hash-for2.rb [~/Ruby] {} 5. 導き出された結果の考察 (ここで計算結果が合っているか調べる) openが開かなかった。 6. 参考文献 (参照した本、ホームページなど) 前回自分で作成したプログラム apprication.rb Hashの対を入力するには http://roy/~madoka/2007/r2/02/02-06-input-hash.html ●プログラムを登録し、表示させるプログラム 1. 考えた設定 作成したプログラムを具体的に説明する。 本日のランチとその値段を入力すると、データが表示されるプログラムを作る。 2. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby lunch = Hash.new("売り切れ") printf("本日の価格を入力してください \v 終了は Cntrl D\n") while true STDERR.print("本日の昼食:\n") item = gets if item == nil break else item = item.chomp end STDERR.print("価格:") price = gets.chomp.to_i lunch[item] = price end $KCODE = 'e' #p lunch for item,price in lunch printf("%s\t%s\n" , item, price) end open ("lunch.txt","w") do |gohann| for item, price in lunch do gohann.printf("%s\t%d\n", item, price) end end 3. もとにしたプログラムからの変更点 Hash対を登録するには を参考に、openを使った。 open を使うさいに、 r ではなくデータを書き込ませるので w を使った。 4. プログラムを実行した結果画面 irsv{c106145}% ./hash-register.rb [~/Ruby] 本日の価格を入力してください 終了は Cntrl D 本日の昼食: カレー 価格:300 本日の昼食: 肉うどん 価格:400 本日の昼食: 味噌ラーメン 価格:350 本日の昼食: ナポリタン 価格:250 本日の昼食: 日替わりランチ 価格:450 本日の昼食: 日替わりランチ 450 カレー 300 肉うどん 400 ナポリタン 250 味噌ラーメン 350 irsv{c106145}% cat lunch.txt [~/Ruby] 日替わりランチ 450 カレー 300 肉うどん 400 ナポリタン 250 味噌ラーメン 350 ●lunch.txtの結果画面 日替わりランチ 450 カレー 300 肉うどん 400 ナポリタン 250 味噌ラーメン 350 5. 導き出された結果の考察 (ここで計算結果が合っているか調べる) ktermで実行したら、emacsでプログラムを作った通りに動きました。 6. 参考文献 (参照した本、ホームページなど) 西村先生のHP Hashの対を入力するには http://roy/~madoka/2007/r2/02/02-06-input-hash.html 4 1. 考えた設定 作成したプログラムを具体的に説明する。 英単語とその意味を表示させ、次々と英単語とその意味が表示されるプログラム を作る。 2. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby word = Hash.new printf("単語を入力してください \v 終了は Ctrl D\n") while true STDERR.print("単語:\n") item = gets if item == nil break else item = item.chomp end STDERR.print("english:") english = gets.chomp word[item] = english end $KCODE = 'e' for item,english in word printf("%s\t%s\n" , item, english) end open ("word.dat","a") do |eigo| #a 単語が追加される for item, english in word do eigo.printf("%s\t%s\n", item, english) end end 3. もとにしたプログラムからの変更点 Hash対を登録するには を参考に、openを使った。 open を使うさいに、 w ではなくデータを追加させていくので a を使った。 4. プログラムを実行した結果画面 irsv{c106145}% ./wordbook.rb [~/Ruby] 単語を入力してください 終了は Ctrl D 単語: 日本 english:japan 単語: アメリカ english:america 単語: ケーキ english:cake 単語: 豚 english:pig 単語: 豚 pig 日本 japan ケーキ cake アメリカ america irsv{c106145}% cat word.dat [~/Ruby] 豚 pig 日本 japan ケーキ cake アメリカ america ●本当に次々に英単語が追加されていくのか、英単語と意味を追加させ実行した。 irsv{c106145}% ./wordbook.rb [~/Ruby] 単語を入力してください 終了は Ctrl D 単語: 遅れる english:delay 単語: 故障 english:failure 単語: 修理する english:repairs 単語: 払い戻し english:refunded 単語: 払い戻し refunded 修理する repairs 故障 failure 遅れる delay irsv{c106145}% cat word.dat [~/Ruby] 豚 pig 日本 japan ケーキ cake アメリカ america 払い戻し refunded 修理する repairs 故障 failure 遅れる delay 先ほど書いた英単語と意味と一緒に、書き足した英単語と意味も追加された。 ●word.datの結果画面 豚 pig 日本 japan ケーキ cake アメリカ america 払い戻し refunded 修理する repairs 故障 failure 遅れる delay 5. 導き出された結果の考察 (ここで計算結果が合っているか調べる) ktermで実行したら、emacsでプログラムを作った通りに動きました。 次々と単語と意味が追加されたのでよかったです。 6. 参考文献 (参照した本、ホームページなど) 西村先生のHP Hashの対を入力するには http://roy/~madoka/2007/r2/02/02-06-input-hash.html ● このようなプログラムは 携帯電話でメールを作成するときに使われる。 メールを作成するときに入力した単語を携帯電話が覚えていて、次回その単語を 入力するときには、スムーズにその単語を表示させることが出来る。 また、パソコンで漢字変換をするときにも、携帯電話と同じようなシステムでス ムーズに変換することが出来る。 5 私は今回のレポートで西村先生HP Hashの対を入力するにはを参考にプログラム を作成しました。 また、#!/usr/koeki/bin/rubyを忘れて起動出来なかったりときがありました。 前期で学んだ内容を忘れている箇所があったので、しっかり復習して 後期では、前期よりも良いプログラムが作成できるように頑張りたいです。