第6回 基礎プログラミングII レポート課題 氏名:久保田 瑛一郎 学籍番号:c109058 語学クラス:英語1 コース:社会福祉 筆記問題 この問題は2つのとらえ方が出来る。 1つは小文字の、アルファベットを「1つずつ」配列に入れた場合という考え方で あるが、後に提示する考え方に沿って考えると、alphabet[40](アルファベット の40番目)はそもそもアルファベットは41個存在しないため何も無いこととなる。 もう1つは、問題文上に「1つずつ」という指定が無いため、同じ文字を何回も使っ てもよいという考え方である。そうするとalphabet[40]の内容を作成することが 出来る。後にこれを照明するプログラムr2_06_rpt.rbを提示するが、このプログ ラムは両者の考えをふまえたものとなっている。 考え方 アルファベットを配列に順番に1個ずつならべたとすると たとえばalphabet[3] というのは、 alphabet[0](アルファベットの0番目)=a alphabet[1](アルファベットの1番目) =b alphabet[2](アルファベットの2番目) =c alphabet[3](アルファベットの3番目) =d という考え方で、この問題を解くプログラムr2_06_rpt.rb を作成した 作成したプログラム #!/usr/koeki/bin/ruby #インタプリタ宣言文 alphabet= Array.new #alphabetは、配列(パズルのようなもの)である alphabet= ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","k","o","e","k","i","r","u","b","i","o","l","o","v","e","v","e","r","y"] #アルファベットの配列内容 printf("alphabet[18](配列の18番目)のアルファベットとは%sです。\n",alphabet[18]) #結果表示 printf("もし同じ文字を入れても良いとすれば、alphabet[40](配列の40番目)のアルファベットは%sです。\n",alphabet[40]) #結果表示 実行結果(導き出された解答) alphabet[18](配列の18番目)のアルファベットとはsです。 もし同じ文字を入れても良いとすれば、alphabet[40](配列の40番目)のアルファベットはvです。 プログラム問題 A問題 a考えた設定 テストの点数を手動で入れ、それを配列にし、合計と平均を求めるプログラム def_statistic.rb を作成した。 b元にしたプログラム ary_movie.rbを参考とした。具体的には手動で数字を入れ、それを配列とする 配列名 << 入力した変数名 を参考とした c作成したプログラム #!/usr/koeki/bin/ruby #インタプリタであることを宣言する point=Array.new #point(あとで手動で点数を入れるところ)は配列である。 i =0 #i(配列番号)は0から始める total = 0 #合計を求めるときに使用 while true #条件無しに(永遠に)繰り返す STDERR.print("テストの点数を入力して下さい。:") #質問表示 nyuuryoku=gets #それをnyuuryokuに取り込む if nyuuryoku==nil #もしnyuuryokuにctrlを押しながらdを押されたら break #whileを抜ける else #それ以外は point<< nyuuryoku.to_f # さきにnyuuryokuに入力されたものを total += point[i] #pointのi番目(今入力されたもの)をtotalに入れる i += 1 #iを一つ足すことによって次の配列に入れる end #ifのおわり end #whileのおわり printf("合計は%d点です。\n",total) #結果表示 avg= total /point.length #totalといままで入力した(配列に入れた数)数を割り平均を求める printf("平均は%3.2f点です。\n",avg) #結果表示 d実行結果 pan{c109058}% ./def_statistic.rb [~/Ruby] テストの点数を入力して下さい。:3 テストの点数を入力して下さい。:4 テストの点数を入力して下さい。:5 テストの点数を入力して下さい。:1 テストの点数を入力して下さい。:合計は13点です。 平均は3.25点です。 e考察 bc -lにて試算する 3+4+5+1 13 13/4 3.25000000000000000000 quit よってこのプログラムの正確性が示される またメソッドを用いて作成もしようとしたが、配列を手動で入れ、なおかつ合計 と平均をメソッドの中だけで完結することも難しかったため、自分に分かりやす いようにメソッドは用いらなかった。 B問題 a考えた設定 副操縦士が、機長になるまでのシュミレーションdef_rollplaying.rbを作成し た。 b元にしたプログラム def_rubiocchi.rbである。正直このプログラムも意味が完ぺきに分かるというわ けではないので、手探りで作成した。 c 作成したプログラム #!/usr/koeki/bin/ruby #インタプリタであることを宣言する def hinichi(name) #メソッド(計算過程)を登録する printf("%s副操縦士!!!何をする??\n\n\n",name) #何をするか訪ねる end #defのおわり def messe(name) #毎回出す選択肢を覚えておくメソッド STDERR.print("[1]\t実務訓練(操縦)\n") STDERR.print("[2]\t筋トレ\n") STDERR.print("[3]\t寝る\n") #選択肢 end #defのおわり def info(parday,waza) y = 2* parday - waza printf("%d日目\n",parday) printf("能力増加分 %d\n",y) y end STDERR.print("なまえを教えてね:") #名前の入力をうながす name =gets.chomp #その入力されたものを取り込み改行文字を取り除く if name =="" #もし先ほどのnameになにも入っていなかったら name="a" #aという名前にする end #ifのおわり printf("%sという名前になった\n",name) #結果表示 nouryoku= 2 #初期値のnouryokuは2である stress =1 #初期値のstressは1である day = 1 #日にちは1日目から始める while stress < 1000 #stressが1000になるまで繰り返す hinichi(name) #何をするかの表示 messe(name) #具体的な内容の表示 situmon = gets.chomp.to_i # situmonに対する選択肢を読み込み、改行文字を取り除き、10進数に変換 srand #乱数(ランダムな数)の表示 omake= rand(1000) #omakeというstressを少なくする乱数を0〜1000までで用意する nouryoku += info(day,situmon) #計算方法 printf("能力:%d\n",nouryoku) #結果表示 stress = day*nouryoku-omake #計算過程 printf("ストレス:%d\n",stress) #結果表示 day +=1 #dayに1足すことにより日にちを進める end #whileのおわり if nouryoku >140 #もしnouryokuが160以上だったら printf("機長に昇格しました!!!\n") #結果表示 else #それ以外は printf("機長に昇格する道のりは遠い\n") #結果表示 end #whileのおわり d実行結果 pan{c109058}% ./def_rollplaying.rb [~/Ruby] なまえを教えてね: aという名前になった a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 1日目 能力増加分 1 能力:3 ストレス:-490 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 2日目 能力増加分 3 能力:6 ストレス:-458 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 3日目 能力増加分 5 能力:11 ストレス:27 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 4日目 能力増加分 7 能力:18 ストレス:56 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 5日目 能力増加分 9 能力:27 ストレス:70 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 6日目 能力増加分 11 能力:38 ストレス:-628 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 7日目 能力増加分 13 能力:51 ストレス:-192 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 8日目 能力増加分 15 能力:66 ストレス:168 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 9日目 能力増加分 17 能力:83 ストレス:611 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 10日目 能力増加分 19 能力:102 ストレス:486 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 11日目 能力増加分 22 能力:124 ストレス:823 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 12日目 能力増加分 23 能力:147 ストレス:1080 機長に昇格しました!!! e考察 bc ーlで試算する 3+3+5+7+9+11+13+15+17+19+23 125 125+22 147 quit よってこのプログラムは正しい なおこのプログラムはストレスが1000にたまると終了する仕組みとなっているが、 若干srandでランダム性を高めた。 なお、選択肢に1を選ぶと機長になりやすい(乱数もあるので確実ではない) C問題 a考えた設定 b問題に結果を外部データに読み込めるようにしたものである。 b元にしたプログラム 前問に読み込ませたり、書きこませたりして、それと比べて新記録かどうかとい う表示をした。 c作成したプログラム #!/usr/koeki/bin/ruby #インタプリタであることを宣言する def hinichi(name) #メソッド(計算過程)を登録する printf("%s副操縦士!!!何をする??\n\n\n",name) #何をするか訪ねる end #defのおわり def messe(name) #毎回出す選択肢を覚えておくメソッド STDERR.print("[1]\t実務訓練(操縦)\n") STDERR.print("[2]\t筋トレ\n") STDERR.print("[3]\t寝る\n") #選択肢 end #defのおわり def info(parday,waza) y = 2* parday - waza printf("%d日目\n",parday) printf("能力増加分 %d\n",y) y end maescore = Array.new STDERR.print("なまえを教えてね:") #名前の入力をうながす name =gets.chomp #その入力されたものを取り込み改行文字を取り除く if name =="" #もし先ほどのnameになにも入っていなかったら name="a" #aという名前にする end #ifのおわり printf("%sという名前になった\n",name) #結果表示 nouryoku= 2 #初期値のnouryokuは2である stress =1 #初期値のstressは1である day = 1 #日にちは1日目から始める while stress < 1000 #stressが1000になるまで繰り返す hinichi(name) #何をするかの表示 messe(name) #具体的な内容の表示 situmon = gets.chomp.to_i # situmonに対する選択肢を読み込み、改行文字を取り除き、10進数に変換 srand #乱数(ランダムな数)の表示 omake= rand(1000) #omakeというstressを少なくする乱数を0〜1000までで用意する nouryoku += info(day,situmon) #計算方法 printf("能力:%d\n",nouryoku) #結果表示 stress = day*nouryoku-omake #計算過程 printf("ストレス:%d\n",stress) #結果表示 day +=1 #dayに1足すことにより日にちを進める end #whileのおわり if nouryoku >140 #もしnouryokuが160以上だったら printf("機長に昇格しました!!!\n") #結果表示 else #qそれ以外は printf("機長に昇格する道のりは遠い\n") #結果表示 end #whileのおわり open("def_roll.dat","r") do |score| #外部データに読み込む while a =score.gets #配列が終わるまで読み込みつづける if /(\d+)/ =~a #もしそのデータが数字だったら maescore[n]=$1.to_i #配列の1つめはmaescoreとする end #ifのおわり end #whileのおわり end #openのおわり open("def_roll.dat","w") do |score| #外部データに書き込む if maescore==nil #もしmaescoreになにもなかったら(新規状態) score.print("%d",nouryoku) #書きこむ elsif maescore[0] < nouryoku #そうでもなく nouryokuの方が大きかったら score.print("%d",nouryoku) #書きこみ print("新記録更新!\n") #結果表示 else #それいがいは exit(0) #通常終了 end #ifのおわり end #whileのおわり d実行結果 pan{c109058}% ./def_rollplaying_b.rb [~/Ruby] なまえを教えてね: aという名前になった a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 1日目 能力増加分 1 能力:3 ストレス:-772 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 2日目 能力増加分 3 能力:6 ストレス:-218 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 3日目 能力増加分 5 能力:11 ストレス:-314 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 4日目 能力増加分 7 能力:18 ストレス:-326 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 5日目 能力増加分 9 能力:27 ストレス:-806 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 6日目 能力増加分 11 能力:38 ストレス:-735 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 7日目 能力増加分 13 能力:51 ストレス:54 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 8日目 能力増加分 15 能力:66 ストレス:441 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 9日目 能力増加分 17 能力:83 ストレス:209 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 10日目 能力増加分 19 能力:102 ストレス:675 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 11日目 能力増加分 21 能力:123 ストレス:862 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 12日目 能力増加分 23 能力:146 ストレス:937 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 13日目 能力増加分 25 能力:171 ストレス:1275 機長に昇格しました!!! ./def_rollplaying_b.rb:127: undefined local variable or method `n' for main:Object (NameError) from ./def_rollplaying_b.rb:119:in `open' from ./def_rollplaying_b.rb:119 e考察 本来は書きこみも出来て、読み込みも同時に出来ると仮定していた。しかしW+や r+を用いても上手く行かなかった。 D問題 a考えた設定 先ほどまで開発を続けていたdef_rollplaying.rbについて、画像を作成し視覚的 変化をもたらすようにした b元にしたプログラム def_rollplaying.rbを希本にして、system displayを用いて画像を出すように変 更した。 c作成したプログラム #!/usr/koeki/bin/ruby #インタプリタであることを宣言する def hinichi(name) #メソッド(計算過程)を登録する printf("%s副操縦士!!!何をする??\n\n\n",name) #何をするか訪ねる end #defのおわり def messe(name) #毎回出す選択肢を覚えておくメソッド STDERR.print("[1]\t実務訓練(操縦)\n") STDERR.print("[2]\t筋トレ\n") STDERR.print("[3]\t寝る\n") #選択肢 end #defのおわり def info(parday,waza) y = 2* parday - waza printf("%d日目\n",parday) printf("能力増加分 %d\n",y) y end STDERR.print("なまえを教えてね:") #名前の入力をうながす name =gets.chomp #その入力されたものを取り込み改行文字を取り除く if name =="" #もし先ほどのnameになにも入っていなかったら name="a" #aという名前にする end #ifのおわり printf("%sという名前になった\n",name) #結果表示 nouryoku= 2 #初期値のnouryokuは2である stress =1 #初期値のstressは1である day = 1 #日にちは1日目から始める while stress < 1000 #stressが1000になるまで繰り返す hinichi(name) #何をするかの表示 messe(name) #具体的な内容の表示 situmon = gets.chomp.to_i # situmonに対する選択肢を読み込み、改行文字を取り除き、10進数に変換 srand #乱数(ランダムな数)の表示 omake= rand(1000) #omakeというstressを少なくする乱数を0〜1000までで用意する nouryoku += info(day,situmon) #計算方法 printf("能力:%d\n",nouryoku) #結果表示 stress = day*nouryoku-omake #計算過程 printf("ストレス:%d\n",stress) #結果表示 day +=1 #dayに1足すことにより日にちを進める end #whileのおわり if nouryoku >140 #もしnouryokuが140以上だったら printf("機長に昇格しました!!!\n") #結果表示 system(`display r2_o6_rpt_cap.rb.png`) #画像表示 else #それ以外は printf("機長に昇格する道のりは遠い\n") #結果表示 system(`display r2_06_rpt_copai.rb.png`) #画像表示 end #whileのおわり d実行結果 画像はメールでは表せないが文字のみ示す pan{c109058}% ./def_rollplaying_c.rb [~/Ruby] なまえを教えてね: aという名前になった a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 1日目 能力増加分 1 能力:3 ストレス:-336 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 2日目 能力増加分 3 能力:6 ストレス:-42 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 3日目 能力増加分 5 能力:11 ストレス:-89 a副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 4日目 能力増加分 7 能力:18 ストレス:-630 1副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 5日目 能力増加分 9 能力:27 ストレス:-782 1副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 6日目 能力増加分 11 能力:38 ストレス:77 1副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 7日目 能力増加分 13 能力:51 ストレス:217 1副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 8日目 能力増加分 15 能力:66 ストレス:315 1副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 9日目 能力増加分 17 能力:83 ストレス:671 1副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 10日目 能力増加分 19 能力:102 ストレス:619 1副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 11日目 能力増加分 21 能力:123 ストレス:549 1副操縦士!!!何をする?? [1] 実務訓練(操縦) [2] 筋トレ [3] 寝る 1 12日目 能力増加分 23 能力:146 ストレス:1736 機長に昇格しました!!! ^C./def_rollplaying_c.rb:105:in ``': Interrupt from ./def_rollplaying_c.rb:105 e考察 画像はメールでは表せないがきちんと作動していた。よってこのプログラムは正 しい。 感想 今回はるびおっちの仕組みを理解することが大変だった。最後まで完ぺきには理 解できないが、ほんのわずかこういう仕組みなのかもしれないと思い、そこにオ リジナルとしての乱数を足したりした。そういった意味では少し自分の進歩を感 じた。 また配列の中の数字を手動で入れる<<についても理解することが出来たのでよかっ たと思う。 たとえばファイナルファンタジーというゲームソフトがあるるびおっちの考え方 に沿って見てみると。効果音のメソッドとたたかうかアイテム使うかなどのコマ ンドのメソッド、実際に敵へのダメージを計算するメソッドが考えられる。 参考文献 西村まどか 2010講義ノート 基礎プログラミングI 第12回 画像変換ソフトとシス テム http://roy.e.koeki-u.ac.jp/~madoka/2010/r1/12/12_07_theme_05_display.html 西村まどか 2010講義ノート 基礎プログラミングI 第9回 ファイル入出力に関し て http://roy.e.koeki-u.ac.jp/~madoka/2010/r1/09/09_01_review_01_fileopen.html diff.rb で warning: don't put space before argument parenthesesと言われ る http://qwik.jp/takotlog/8.html 共同学習者:宮川史礼 先輩、横山 広樹、小松 由里