第三回 情報の構造を分析しよう レポート課題 氏名 : 余語結佳 学籍番号 : c1101974 語学クラス : 英語2 コース : 地域共創コース ---------------------------------------------------------------------- 1. 筆記問題 ---------------------------------------------------------------------- 1.A 名前 ASCIIコード 変換 (16進数) (10進数) ---------------------------- Y 0x 59 89 O 0x 4f 79 G 0x 47 71 O 0x 4f 79 Y 0x 59 89 U 0x 55 85 K 0x 4b 75 A 0x 41 65 ●考え方 ◯ASCIIコード Yは 10の位(行) 5 1の位(列) 9 ASCIIコードは16進数なので接頭語は0xになるので 答えは 0x59。 他の文字も同じように見ていく。 ◯16進数から10進数への変換 ここでもまたYを例にとって説明する。 接頭語はのぞくとYのASCIIコード(16進数)は59である。 計算過程は以下の通り。 ------------------ 1 16**1 16**0 ------------------ 2 16 1 ------------------ 3 5 9 ------------------ 4 80 9 ------------------ 80 + 9 = 89 よって10進数は89だと言える。 また、16進数の変換でローマ字がでた O(0x4f) と、K(0x4b)に関しては、対応表を見ると 16進数 10進数 f 15 b 11 となっているので、計算のときにアルファベットではなくそれぞれの数字をいれ て計算すると良い。 ●考察 最初に16進数を2進数に間違って変換してしまった。 だが16進数から2進数に変換する方法を復習することができたのでよかったと思 う。 ●参考文献 基礎プログラミングI第9回、神田直弥 http://roy/~naoya/ruby/9.html 1.B "たいしょうのざをゆずりうけた" たいしょう の ざ を ゆずりうけた(大将の座をゆずり受けた) たいしょう の ざ を ゆずりうけた(大賞の座をゆずり受けた) たいしょう の ざ を ゆずり うけた(大賞の座をゆずり、ウケた) (=お笑い大賞の座をちがう人にゆずったら、お客さんにウケた、という意味) "やっとかいしゃくしてもらえた" やっと かいしゃく してもらえた(やっと解釈してもらえた) やっと かいしゃく してもらえた(やっと介錯してもらえた) "もりたがあれる" もり た が あれる(森・田が荒れる) もりた があれる(森田が荒れる)※森田=人名 "こうさつした" こうさつ した(考察した) こうさつ した(絞殺した) 1.C 架空の会社のアルバイト募集要件を hash 配列 work にしました。 key 会社名 value 時給、時間帯、担当者 にしました。 1 : key 「公益魚屋」 に対して value は 「850円、10時から15時、公益 太朗」 2 : key 「西村宝石店」 に対して value は 「900円、14時から18時、西 村子」 3 : key 「神田サイクル」 に対して value は 「800円、10時から15時、佐藤 勘太郎」 4 : key 「広瀬菓子店」 に対して value は 「700円、12時から18時、鈴木 ひろこ」 5 : key 「黒田文具」 に対して value は 「650円、18時から20時、黒井 太朗」 これらを hash 配列で表記すると work["公益魚屋"] = ["850円","10時から15時","公益 太朗"] work["西村宝石店"] = ["900円","14時から18時","西 村子"] work["神田サイクル"] = ["800円","10時から15時","佐藤 勘太郎"] work["広瀬菓子店"] = ["700円","12時から18時","鈴木 ひろこ"] work["黒田文具"] = ["650円","18時から20時","黒井 太朗"] もうひとつの表し方は work = { "公益魚屋" => ["850円","10時から15時","公益 太朗"], "西村宝石店" => ["900円","14時から18時","西 村子"], "神田サイクル" => ["800円","10時から15時","佐藤 勘太郎"], "広瀬菓子店" => ["700円","12時から18時","鈴木 ひろこ"], "黒田文具" => ["650円","18時から20時","黒井 太朗"], } 以上のようにできる。 ---------------------------------------------------------------------- 2.プログラム問題 ---------------------------------------------------------------------- i. 考えた設定 Aのhash_any_print.rbを作成しました。 プログラムを実行するとworkハッシュに登録されているkeyとvalueが一覧で出力 されます。 ii. 作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' #文字化けしないように必須 print"酒田求人情報\n\n" #\nは改行文字なので,2つ入力すると2行改行=視覚的には行間が一行空く。 #以下の\nに関する説明は省略する。 work = Hash.new #workをハッシュにしますよ、という宣言 work["公益魚屋"] = ["850円","10時から15時","公益 太朗"] work["西村宝石店"] = ["900円","14時から18時","西 村子"] work["神田サイクル"] = ["800円","10時から15時","佐藤 勘太郎"] work["広瀬菓子店"] = ["700円","12時から18時","鈴木 ひろこ"] work["黒田文具"] = ["650円","18時から20時","黒井 太朗"] #keyは会社名、valueは時給、時間帯、担当者。 #valueは複数あるのでコンマでくぎって[]でひとつにくくる。 #p work #workにはいっているものすべてを出力。 #確認で使うため実際は省略 for mise,zyouken in work #繰り返しのfor文。 #以下の操作(workハッシュにはいっているkey(mise),value(zyouken)を全て表示する)を終えるまで繰り返す。 printf("%s の時給は %s 、募集している時間は %s です。\n",mise,zyouken[0],zyouken[1]) printf("働きたいと思ったら 担当の %s まで御一報を!\n\n",zyouken[2]) #valueの内容はzyokenの中に配列で、順に0、1、2にはいっているので、それぞれに当てはめて指定している。 end iii.元にしたプログラムからの変更箇所 元にしたのは hash_for.rbです。 〔変更点〕 * 内容・変数を今回の内容に沿ったものに変更 iv. 実行結果 pan{c110197}% ./hash_any_print.rb [~/Ruby] 酒田求人情報 神田サイクル の時給は 800円 、募集している時間は 10時から15時 です。 働きたいと思ったら 担当の 佐藤 勘太郎 まで御一報を! 広瀬菓子店 の時給は 700円 、募集している時間は 12時から18時 です。 働きたいと思ったら 担当の 鈴木 ひろこ まで御一報を! 黒田文具 の時給は 650円 、募集している時間は 18時から20時 です。 働きたいと思ったら 担当の 黒井 太朗 まで御一報を! 西村宝石店 の時給は 900円 、募集している時間は 14時から18時 です。 働きたいと思ったら 担当の 西 村子 まで御一報を! 公益魚屋 の時給は 850円 、募集している時間は 10時から15時 です。 働きたいと思ったら 担当の 公益 太朗 まで御一報を! v. 考察 公益魚屋の時給は850円で時間は10時から15時、担当は公益 太朗さん 西村宝石店の時給は900円で時間は14時から18時、担当は西 村子さん ・ ・ ・ と、確認するとすべてkeyとvalueの対どうりなっているのでこのプログラムは精 成功していると言えます。 また、自給の高さ順にならべようと思いましたがそれは課題内容的にBの内容で したのでそれは以下で実行しています。 **************************************** i. 考えた設定 Bの hash_any_sort.rb を作成しました。 プログラムを実行するとAの内容を自給の高さ順に並びかえたものが出力されま す。 ii. 作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' #文字化けしないように必須 print"酒田求人情報\n" #\nは改行文字なので,2つ入力すると2行改行=視覚的には行間が一行空く。 #以下の\nに関する説明は省略する。 work = Hash.new #workをハッシュにしますよ、という宣言 work["公益魚屋"] = [850,"10時から15時","公益 太朗"] work["西村宝石店"] = [900,"14時から18時","西 村子"] work["神田サイクル"] = [800,"10時から15時","佐藤 勘太郎"] work["広瀬菓子店"] = [700,"12時から18時","鈴木 ひろこ"] work["黒田文具"] = [650,"18時から20時","黒井 太朗"] #keyは会社名、valueは時給、時間帯、担当者。 #valueは複数あるのでコンマでくぎって[]でひとつにくくる。 #p work #workにはいっているものすべてを出力。 #確認で使うため実際は省略 #↓この構文はちゃんとした並べ替えにならないので不要 #work.keys.each{|kyuzin| # printf("%s\t%d円\n",kyuzin, work[kyuzin][0]) #} #each→each以前のものを1つずつ取り出しなさい #eachは繰り返しでもあるので、1繰り返しに1要素と考えればOK #work.keys→each以前のもの。 #この場合はworkハッシュにはいっているkeyをさしている #{|kyuzin|→取り出したものを仮にいれておくための変数 #そのためkyuzinにはとりだしたkey #work[kyuzin]にはそのkeyに対応するvalueが入る print("時給順一覧\n\n") work.keys.sort{ |hikaku1,hikaku2| work[hikaku1] <=> work[hikaku2] }.reverse.each{ |kyuzin| printf("%s \t %d 円 \n",kyuzin,work[kyuzin][0]) printf("※研修期間は多少変わりますので、詳細は%sまでご連絡をいただければお話し致します。\n\n",work[kyuzin][2]) } #|hikaku1,hikaku2| #はeachで取り出した要素をいれたkyuzinにはいっている数字を調べるためにまず仮にいれている変数です。 #work[hikaku1] <=> work[hikaku2]は、 #hikaku1にはいっているkeyに対応するvalueと #hikaku2にはいっているkeyに対応するvalueを2つずつ比較して、(<=>のこと) #大きい方は先、小さい方は後…(reverse.eachのこと) #と、ひとつひとつ調べているため、大きいもの順に出力することが可能になっています。 #keyに数値がはいっていてそのkeyを基準に並べ替えを行いたい場合は # hikaku1 <=> hikaku2 のようにすれば良い。 iii.元からの変更点 元にしたプログラムは Aのhash_any_print.rb と、参考にしたプログラムはhash_pair.rb です。 Aの段階では時給は「900円」のように、円もついたままで文字列としてあつかっ ていましたが、Bでは「円」を取り10進整数としてあつかいます。 なのでprintf中で表記するときも%sから%dにしています。 また、hash配列のvalueにいれる段階で、時給は文字列ではないので""をとって います。 並び替えの構文も追加されています。(くわしくは以下参照) iv. 結果画面 pan{c110197}% ./hash_any_sort.rb [~/Ruby] 酒田求人情報 時給順一覧 西村宝石店 900 円 ※研修期間は多少変わりますので、詳細は西 村子までご連絡をいただければお話し致します。 公益魚屋 850 円 ※研修期間は多少変わりますので、詳細は公益 太朗までご連絡をいただければお話し致します。 神田サイクル 800 円 ※研修期間は多少変わりますので、詳細は佐藤 勘太郎までご連絡をいただければお話し致します。 広瀬菓子店 700 円 ※研修期間は多少変わりますので、詳細は鈴木 ひろこまでご連絡をいただければお話し致します。 黒田文具 650 円 ※研修期間は多少変わりますので、詳細は黒井 太朗までご連絡をいただければお話し致します。 v. 考察 while true if /\S+(\d+)\S+/ =~ work zikyu = $1 p zikyu end end と文を作り(\d+)で時給の整数のみを抜き出せないかと思いましたが ./hash_any_sort.rb:25: can't convert Hash into String (TypeError) とエラーメッセージが出たので 「Hashは正規表現の文では使えないよ」という意味だと解釈しました。 なのでこのwhile-endで数値を抜き出すという方法はちがうのだと思いました。 ここまで考えて、このプログラムは並べ替えをしなければならないので、今まで 苦手ゆえに避けていたことについて学習し直しました。 学習に使ったプログラムは先週の授業で使った hash_pair.rb です。 これで、for文と、each文、each文を使用した並べ替えについてじっくりと復習 しました。 その中でハッシュについても更に理解することができたので以下にまとめます。 (for文については課題Cの考察になるので、課題Cの考察参照) ◯ハッシュについて このプログラムのハッシュのkeyとvalueはwhileの中で取得されています。 keyの商品は item value の価格は shop[item] にはいっている。 そしてこれらをp文で確認すると"みかん\n"のように記憶していきます。これは whileで繰り返されているので繰り返しでひとつずつ入力、記憶をしているので す。 しかし、2回目の入力の繰り返しでは "みかん\n","もも\n" のようになることが期待されましたが実際は "みかん\n" "もも\n" と出力されました。 これはkeyの商品だけでなくvalueも同じ記憶のされ方をしているということから、 ハッシュにおいてkeyとvalueに入力されたものは、ハッシュに"代入"するのでは なく入力されるごとに"移動"させているということがわかりました。 whileを抜けたあとの2つの変数にはnillがはいっていたことからも、そのことが 裏づけられます。(最終的にはctrl-d=nillのため) なので、私が一番最初にしようとした正規表現のやり方は検討違いですし、でき ないことがわかります。 ◯eachとsortについて 題名 基礎プログラミング II 第 2 回 (なになにといえばこれこれ) 「key を使って 並び換え」 作者 西村まどか http://roy/~madoka/2011/r2/02/r2_02_11_theme_10_sortinkey.html にもあるように、 #work.keys.each{|kyuzin| # printf("%s\t%d\n",kyuzin, work[kyuzin][0]) #} ではちゃんとした結果を得られません。 実行結果は 神田サイクル 800円 広瀬菓子店 700円 黒田文具 650円 西村宝石店 900円 公益魚屋 850円 このようになってしまいました。 そのため、並べ替えの役割を持つsortに具体的な指示をあたえてあげる必要性が あるということがよく理解できました。 具体的な指示をあたえるためにはsortのあとの{}で指定し、並び替えをうまく実 行することができました。 また、出力指示の中で3つあるvalueの0番目を指示する必要がありました。です がwork[kyuzin]と既に[]を使っているため[0]はつけてだめなのかと思いました が、実際につけて実行してみるとちゃんと値を出力してくれていたのでこのプロ グラムは成功したといえます。 **************************************** i. 考えた設定 Cのhash_any_calc.rbを作成しました。 働きたいバイト先の日給を計算してくれるプログラムです。 プログラムを実行するとバイトの求人情報の一覧が表示されたあと、日給を知り たい店名の入力をしてもらい、計算した後出力します。 ii. 作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' #文字化けしないように必須 print"酒田求人情報\n\n" #\nは改行文字なので,2つ入力すると2行改行=視覚的には行間が一行空く。 #以下の\nに関する説明は省略する。 work = Hash.new #workをハッシュにしますよ、という宣言 work["公益魚屋"] = [850,"10時から15時",5,"公益 太朗"] work["西村宝石店"] = [900,"14時から18時",4,"西 村子"] work["神田サイクル"] = [800,"10時から15時",5,"佐藤 勘太郎"] work["広瀬菓子店"] = [700,"12時から18時",6,"鈴木 ひろこ"] work["黒田文具"] = [650,"18時から20時",2,"黒井 太朗"] #keyは会社名、valueは時給、時間帯、労働時間、担当者。 #valueは複数あるのでコンマでくぎって[]でひとつにくくる。 #p work #workにはいっているものすべてを出力。 #確認で使うため実際は省略 print"店名\t\t\t時間\t\t 時給 \t 担当者\n" for mise,zyouken in work #workハッシュのkeyはmiseに仮に代入して #valueはをzyoken仮に代入したとして繰り返しをしろという指示文 printf("%s \t %sの%d時間 \t %d円 \t %s \n",mise,zyouken[1],zyouken[2],zyouken[0],zyouken[3]) end print"働きたいお店はありましたか?\n" print"店名を入力していただくと上記の労働条件での日給を計算します。\n" #登録されたもの以外の文字が入力された時に必要なwhile #「働きたいお店〜」の文と、入力された文字をいれる変数も間違うごとに繰り返す必要があるのでwhile中にいれている while true print"働きたいお店の名前を入力してください。\n" tenmei = gets.chomp! #正規表現で、戦闘に^をつけると「◯◯以外」という意味になるのでひとつずつつけている #登録以外の店名が入力された場合は(このifに該当する場合)redoして再入力してもらいます。 if /[^公益魚屋][^西村宝石店][^神田サイクル][^広瀬菓子店][^黒田文具店]/ =~ tenmei print"一覧の文字を入力してください。\n" redo else if tenmei == "公益魚屋" nikkyu = work[tenmei][0] * work[tenmei][2] printf("公益魚屋の日給は%d円です。\n",nikkyu) break elsif tenmei == "西村宝石店" nikkyu = work[tenmei][0] * work[tenmei][2] printf("西村宝石店の日給は%d円です。\n",nikkyu) break elsif tenmei == "神田サイクル" nikkyu = work[tenmei][0] * work[tenmei][2] printf("神田サイクルの日給は%d円です。\n",nikkyu) break elsif tenmei == "広瀬菓子店" nikkyu = work[tenmei][0] * work[tenmei][2] printf("広瀬菓子店の日給は%d円です。\n",nikkyu) break elsif tenmei == "黒田文具" nikkyu = work[tenmei][0] * work[tenmei][2] printf("黒田文具の日給は%d円です。\n",nikkyu) break end #if-end end #if-end end #while-end #計算結果はnikkyuに代入して出力の時に使っています。 #valueの1番目の時給×労働時間をして出力しています。 iii.元からの変更点 元にしたのはBのhash_any_sort.rbと、参考にしたのはhash_pair.rbです。 Bの段階でvalueの内容は3つだけでしたが、このプログラムでは 時給×労働時間をする必要があったので労働時間も値もvalueの要素につけくわ えました。 一覧表示をするためにfor文をつけくわえました。 iv. 結果画面 pan{YOGO Yuka}% ./hash_any_calc.rb [~/Ruby] 酒田求人情報 店名 時間 時給 担当者 神田サイクル 10時から15時の5時間 800円 佐藤 勘太郎 広瀬菓子店 12時から18時の6時間 700円 鈴木 ひろこ 黒田文具 18時から20時の2時間 650円 黒井 太朗 西村宝石店 14時から18時の4時間 900円 西 村子 公益魚屋 10時から15時の5時間 850円 公益 太朗 働きたいお店はありましたか? 店名を入力していただくと上記の労働条件での日給を計算します。 働きたいお店の名前を入力してください。 西村ほうせきてん 一覧の文字を入力してください。 働きたいお店の名前を入力してください。 西村宝石店 西村宝石店の日給は3600円です。 pan{c110197}% ./hash_any_calc.rb [~/Ruby] 酒田求人情報 店名 時間 時給 担当者 神田サイクル 10時から15時の5時間 800円 佐藤 勘太郎 広瀬菓子店 12時から18時の6時間 700円 鈴木 ひろこ 黒田文具 18時から20時の2時間 650円 黒井 太朗 西村宝石店 14時から18時の4時間 900円 西 村子 公益魚屋 10時から15時の5時間 850円 公益 太朗 働きたいお店はありましたか? 店名を入力していただくと上記の労働条件での日給を計算します。 働きたいお店の名前を入力してください。 かんださいくる 一覧の文字を入力してください。 働きたいお店の名前を入力してください。 神田サイクル 神田サイクルの日給は4000円です。 v. 考察 最初はただ入力をしてもらって終わりというプログラムだったのですが、入力を してもらう単語がひらがなと漢字がまざっていたりしてうちま違えの可能性もあ ると考えました。 そこでwhileの文を追加して、うち間違えがあってももう一度入力を促してくれ るようなプログラムをつけくわえました。 redoを忘れたり、breakを忘れたりすると永遠に繰り返しが行われたり、何も表 示されないのに繰り返しが終わらなかったり ということがありましたがこれは前期にやった内容だったので復習しつつ簡単に プログラムに組むことができました。 ◯for文について 結論からいうと、for文とは繰り返すだけの働きがあるものです。 そして、ハッシュにおいてのforは「ハッシュで対になっているものを分割して 表示する」という役割をもっています。 説明はプログラムの中に書いてあるので割愛しますが、見て分かるように、ハッ シュの対をひとつひとつ取り出すことが出来ています。 3.感想 今回は今までしっかりと理解していなかったeachとsortについてよく理解する ことができたのでよかったです。また、その二つだけでなく、先週の授業でやっ たプログラムを1からじっくりと再度考えなおしたことでハッシュについても更 に理解が深まりました。 ハッシュは入力してもらったものをkeyとvalueにする場合、「代入する」という 表現よりも「移動する」という表現のほうが適切だなと思いました。 今回の課題は、本当に先週よりも深く理解することできたので手ごたえを感じて います。 来週からの課題もこのようにひとつひとつ手ごたえを感じられるようにしていき たいと思います。 何度も繰り返す文章で繰り返す、というものですが お話しではないですが曲の歌詞などがあると思います。 最近のJポップでは、1番のサビと2番移行のサビは同じことがよくありますし、 童謡などでは 「ぞうさん」「さっちゃん」などがあると思います。 4.参考文献 ※ 今回のプログラムで出てきている会社は全て架空のものです。 実際の人物,団体には全く何も関係ありません。 基礎プログラミングI 第9回 神田直弥 http://roy/~naoya/ruby/9.html 第2回 基礎プログラミングII (なになにといえばこれこれ)講義ノート 西村まどか http://roy/~madoka/2011/r2/02/ 第3回 基礎プログラミングII (情報の構造を分析しよう)講義ノート 西村まどか http://roy/~madoka/2011/r2/03/ 基礎プログラミングI 第7回 神田直弥 http://roy/~naoya/ruby/7.html 協力してくれた先輩 小林勝範