第1回 基礎プログラミングII レポート課題 氏名:xxxxxxxx 学籍番号:c109xxx 語学クラス:英語1 コース:社会福祉 1筆記問題 A 繰り返しはwhileを用いる。永遠と繰り返す場合にはwhile tureを用いる 例 while kazu > 3 print("hoge") kazu +==1 end 例2 while ture print ("hoge") if nyuuryoku=="q" break end ちなみに、while ture を用いる場合そこから抜けるようにするにはbreak を用 いる 「もしある変数(はこの中)がこの数値だったら」というように条件を付けてプロ グラムを先に進めたりする場合(制御する)は、if(もしーーだったらの意味)を用 いる。 例3 STDERR.print("はじめる場合にはaを入力、終わる場合qと入力") in =gets.chomp if in=="a" print("スタートするよ!!") else print("やめるよ!!") end ちなみにAだったらという場合 if hoge=="A"と表記するが、それ以外の場合には とする場合には、elseを用いる ここに出てくる他の技術についてまとめる gets→文字を取り込む chomp →改行文字を取り除く STDERR→質問文または「これを入力してください」というような指示を表示する == →これと一緒だったらを表す "文字"→上のようなこれと一緒だったらとくらべる際に、数字だったら""は必要 ないが、文字だったら必須である 例4 if hoge=="q" if hoge==1 \n →改行文字、改行したい場合に用いる 配列とはパズルのピースを当てはめて行くように文章を作ったりする場合に用 いる。 dat(データの内容) りんご 100 ばなな 400 ほうれんそう 600 ↓ ↓これを… ↓ りんごは単価が100円です ばななは単価が400円です ほうれんそうは単価が600円です 3つの商品の平均単価は○○円です たとえばこういうものが出来る。 Array.new→ 外部のデータが配列であることを宣言する(プログラムの最初で必 ず宣言する) 例5 hoge =Array.new→ hogeは配列である if /(\S+)………→もし外部のデータがこの順番で並んでいたらというのを表す たとえば外部データが りんご 100 とすると この順番は文字→空白→文字となるので if /(\S+)\S+(\d+)/ =~hoge とする このやり方で用いるもの (\S+)→文字列を示す \s+→空白を示す (\d+)→数字(100など)を示す ちなみに配列というのは見た目では1番目から読み取っているようにも思えるが、 コンピュータ上では「0番目(0列目)から始まっているので」 s=0とする ここで外部のデータのかたちがどうなっているのかを教えてあげた上で、「配列 の1番目はこういう名前にするよー」と教えてあげなければならない 例えば先頭(1番目)が商品だったら syouhin[s]=$1 次の配列が(2番目)、値段だったら nedan[s]= $2 とする →$のとなりの数字で何番目なのかを教える(定義する) ここで注意したいのが、[s]という表記が何を示すのか??ということである これは、配列番号といって、何列目なのかというのを示すものである 図にした方が解りやすい。よって図をしめす syouhin nedan りんご 100 → 0行目 s=0 みかん 500 → 1行目 s=1 この図からも解ることかも知れないが、sに1つずつ足して行かなければ下の列の データを読めないので、s+=1として、次に進める必要がある ファイルオープン ファイルオープンとは先にのべたように、外部のデータを読み出して文章を作成 したり、スコア表のように自分のスコアを記録(主にhtml)したりする 書込み方法 open("test.dat","w") do |score| #書込みをするが、書きこみ先はtest.datに書きこみ、そのデータを集める場所 はscoreとする score.print("Aさんの点数100点") #定義したscoreにデータを集め、書きこむ score.printf("Aさんの点数%d点",bsan) #上と同じ end #openの終わり w→書きこみモード(上書き) r→読みこみモード a →書きこみモード(追加) printとprintfの違い printは変数を使わないで「そのまま」ひょうじさせるものであり、printfとは 変数の内容を表示させながら実行するものである。 例A STDER.print("1人目のテストの点数を入力してください:") score =gets.chomp 例B ninzuu =1 while i> 3 STDER.print("%d人目のテストの点数を入力してください:",ninzuu) score =gets.chomp 例Aでは一人分の点数しか入力できない(質問されない)。それは、簡単にいえば whileを用いていないからである。しかし、例Bでは繰り返しをきちんと用いて、 なおかつ、「%d人目」というように「%d」と仮に置き換え、それがどの名前の変 数を使うかときちんと指定することが出来るので、ここが「1人目」「2人目」と 変動する ここで%dのように「置き換えて」使うものをまとめる %d→整数を表示する %s→文字を表示する %f→小数を表示する またgets(手動で数字を入力した場合)その数字が10進数なのか、2進数なのか わからないためそれを教えてあげないとその数字を使って足したり引いたりといっ た計算が出来ない。それを教える方法をまとめる。 to_i→10進数と見なし、それを整数に変換 to_f→10進数と見なし、それを小数に変換 したがって、変動させたい数値を用いる場合には、printfを、そのまま表示させ たい場合にはprintを用いて、printfを用いた場合コンマ以降で、「どの変数を 表示させるのかをきちんと教えてあげる(指定する)」必要がある。 そのほか使える技をまとめる time.now→現在時刻を表示する sleep→ktermの動きをとめる sleep(2)→2秒間とめる exit(0)→プログラムを終了する 通常終了 exit(1)→プログラムを終了する 異常終了 これはAというエラーだったら1番という終了、Bというエラーだったらexit(2)= つまり2番という終了 というように終了(エラー)に番号を付けることが出 来る。 ARGV→(アーギブ) ktermに入力した内容をそのまま表示する。例えるなら切符 発行 ここから先はpenの操作方法などプログラム以外のことをまとめる 企業や学校など一台のコンピュータに皆でアクセスすることをワークステーショ ンという。 そこにアクセスすることをログインといい、出ることをログアウトという ctrl+1でEmacs 2でkterm 3でconsoleに切り替える emacsのウィンドウをもう1枚出すにはctrlを押しながら 5 2を押す。 消すにははctrl を押しながら 5 0を押す。 rubyは1行ずつ読みこんでいく、インタプリタ型言語であり、あまり細かい技術 を知らなくてもプログラムを作ることの出来るオブジェクト指向である。 rubyプログラムを実行するには./ファイル名であるが、実行する前に、chmod +x ファイル名とする必要がある エラーの場合は そこに書かれている数字を読む。5とかかれていたら5行目より 前を読む。 firefoxなどのソフトを実行する際にはソフト名 &の様に、&を忘れない firefox → firefox& emacs →emacs& openoffice ooo3& mewのそうさ方法 受信→shift+i 添付→ctrl +c ctrl+a もう一回cだけ押してファイル名を指定する 書きかけのメール呼び出し→shift+e 新規メール作成→ w プログラムはりつけ→ctrl+x i ファイル名 ktermで cd →ホームに移る cd ディレクトリ名 →ディレクトリに移る mkdir ディレクトリ名→ディレクトリ名というディレクトリをつくる rm ファイル名→ファイル名というファイルを消去する rmdir ディレクトリ名→ディレクトリ名というディレクトリを消す mv a bfolder→ aというファイルをbforderというディレクトリに移動させる 製品を売り出すには、企画書、取扱説明書、製品本体があることが重要である。 ここまでの参考文献 西村まどか 2010講義ノート 基礎プログラミングI 第6回操作間違いが起こった ので強制終了させたい http://roy.e.koeki-u.ac.jp/~madoka/2010/r1/06/06_18_appendix_05_exit.html 西村まどか 2010講義ノート 基礎プログラミングI 第7回 自動印刷を行なうには http://roy.e.koeki-u.ac.jp/~madoka/2010/r1/07/07_15_theme_13_filewrite.html 2プログラム問題 A問題 a考えた設定 今年の夏は去年よりは充実していた。それを伝えるプログラムsummer_a.rbを作 成した。 b作成したプログラム #!/usr/koeki/bin/ruby #インタプリタであることを宣言する(1行ずつ読む) print("今年の夏は去年よりは充実していた。(様な気がする)\n何故かといえば、今年の夏に新しく飼った犬を運動させるために、わざわざ公園に連れていくという予定が出来て来たためである。\n\n") #内容表示 sleep(6) #6秒止める(ktermの動きを止める) print("まあ、その公園は羽田空港も近いので、飛行機の離着陸も見れてなかなか面白いのだが…\n\n") #内容表示 sleep(3) #3秒止める(ktermの動きを止める) print("その中で飛行機の写真も色々と取ってみたのだが、逆光や夜になると綺麗に撮れないということも発生するので、今後は撮影技術の向上もしたいなあーーなんて\n\n") #内容表示 sleep(4) #4秒止める(ktermの動きを止める) print("ああ、そういえば、大田区が唯一誇れるであろう(と思っている)羽田空港国際化ももうすぐである\n\n") #内容表示 sleep(5) #5秒止める(ktermの動きを止める) print("LCCやら立ち乗りシートやら、オープンスカイやらたくさんの言葉が飛び交っているが、「成田」を越せるよう頑張って欲しい\n") #内容表示 cもとにしたプログラムからの変更点 最初のプログラムであること、私自身何かのプログラムを改良するよりも1から つくってしまった方が良いので、(混乱しないので)このプログラムには存在しな い。 d実行結果 pan{c109058}% ./summer_a.rb [~/Ruby] 今年の夏は去年よりは充実していた。(様な気がする) 何故かといえば、今年の夏に新しく飼った犬を運動させるために、わざわざ公園に連れていくという予定が出来て来たためである。 まあ、その公園は羽田空港も近いので、飛行機の離着陸も見れてなかなか面白いのだが… その中で飛行機の写真も色々と取ってみたのだが、逆光や夜になると綺麗に撮れないということも発生するので、今後は撮影技術の向上もしたいなあーーなんて ああ、そういえば、大田区が唯一誇れるであろう(と思っている)羽田空港国際化ももうすぐである LCCやら立ち乗りシートやら、オープンスカイやらたくさんの言葉が飛び交っているが、「成田」を越せるよう頑張って欲しい e考察 プログラムの中味(意図したこと)と結果が正しいのでこのプログラムは正確に作 成できている。 B問題 a考えた設定 私自身も過去のことは良く覚えていなかったりするので、「あまり多くを語らな いけどしゃべりつかれるのは異様に早い人」プログラムを作成した b作成したプログラム summer_b.rb #!/usr/koeki/bin/ruby #インタプリタであることを宣言する print("あまり過去のことはおぼえていないからねえーーシンプルだけどどれをききたいかな??\n") #主旨説明 print("1:小学校6年生くらいの頃\n\n""2:高校1年のころ\n\n""3:今年\n\n") #選択肢の内容を表示 STDERR.print("どれにする??番号を入力:") #実際にどれにするか質問する nyuryoku=gets.chomp.to_i #そこで入力(nyuryoku)されたものは10進数と見なし、改行文字を撮り、取り込む if nyuryoku==1 #もしnyuryokuに1と入力されたら print("小学校の頃は、頭が悪くて補習していたような気がするなーー同じようなレベルの人が学校に集まって 笑\n\n") #内容表示 sleep(3) #ktermの動きを止める(3秒間) print("あと学校のプールにもいったかなあーー\n\n") #内容表示 elsif nyuryoku==2 #もしnyuryokuに2と入力されたら print("高校1年の夏は、菅総理じゃないけど「1に簿記」「2に簿記」「3に簿記」だったなーー\n\n") #内容表示 sleep(3) #ktermの動きを止める(3秒間) print("お盆以外は毎日学校だったような気がする。パーフェクトプリントというすごーーーーく分厚いプリントもやらされたし\n\n") #内容表示 sleep(3) #ktermの動きを止める(3秒間) print("まあ、あれはあれで楽しかったよ\n\n") #内容表示 elsif nyuryoku ==3 #もしnyuryokuに3と入力されたら print("今年は飼っている犬のために毎週公園にいっているような日々だった\n\n") #内容表示 else #それ以外は print("間違っていますぞ!!選択肢をよく見なされ!!\n\n") #無効だと表示 end #ifの終わり time=Time.now #顕在の日にちと時刻を表示 printf("おお!もう%sになってしまったか!しゃべりつかれたぞ。また今度!\n",time) #内容表示 c もとにしたプログラムからの変更点 特にないが、何故前期のプログラムを参考にしなかったのかは感想で述べる d 実行結果 パターン1 pan{c109058}% ./summer_b.rb [~/Ruby] あまり過去のことはおぼえていないからねえーーシンプルだけどどれをききたいかな?? 1:小学校6年生くらいの頃 2:高校1年のころ 3:今年 どれにする??番号を入力:1 小学校の頃は、頭が悪くて補習していたような気がするなーー同じようなレベルの人が学校に集まって 笑 あと学校のプールにもいったかなあーー おお!もうWed Sep 29 01:18:56 +0900 2010になってしまったか!しゃべりつかれたぞ。また今度! パターン2 pan{c109058}% ./summer_b.rb [~/Ruby] あまり過去のことはおぼえていないからねえーーシンプルだけどどれをききたいかな?? 1:小学校6年生くらいの頃 2:高校1年のころ 3:今年 どれにする??番号を入力:2 高校1年の夏は、菅総理じゃないけど「1に簿記」「2に簿記」「3に簿記」だったなーー お盆以外は毎日学校だったような気がする。パーフェクトプリントというすごーーーーく分厚いプリントもやらされたし まあ、あれはあれで楽しかったよ おお!もうWed Sep 29 01:19:42 +0900 2010になってしまったか!しゃべりつかれたぞ。また今度! パターン3 あまり過去のことはおぼえていないからねえーーシンプルだけどどれをききたいかな?? 1:小学校6年生くらいの頃 2:高校1年のころ 3:今年 どれにする??番号を入力:3 今年は飼っている犬のために毎週公園にいっているような日々だった おお!もうWed Sep 29 01:20:29 +0900 2010になってしまったか!しゃべりつかれたぞ。また今度! パターン4 pan{c109058}% ./summer_b.rb [~/Ruby] あまり過去のことはおぼえていないからねえーーシンプルだけどどれをききたいかな?? 1:小学校6年生くらいの頃 2:高校1年のころ 3:今年 どれにする??番号を入力:6 間違っていますぞ!!選択肢をよく見なされ!! おお!もうWed Sep 29 01:21:07 +0900 2010になってしまったか!しゃべりつかれたぞ。また今度! パターン5 pan{c109058}% ./summer_b.rb [~/Ruby] あまり過去のことはおぼえていないからねえーーシンプルだけどどれをききたいかな?? 1:小学校6年生くらいの頃 2:高校1年のころ 3:今年 どれにする??番号を入力:iii 間違っていますぞ!!選択肢をよく見なされ!! おお!もうWed Sep 29 01:21:51 +0900 2010になってしまったか!しゃべりつかれたぞ。また今度! e考察 パターン1から3のように各々の選択肢をいれてもきちんと表示される。また4、5 の様に選択肢似ない文字をいれたら間違っていることが表示されるのでこのプロ グラムは正しい。 C 問題 a考えた設定 A問題の内容が仮にテストに出題されるとしたら重要単語はどれか??というよう になってしまったが、要するに重要単語帳をdatでつくり、それを文章に当ては めるプログラムを作った bもとにしたプログラムからの変更点 基本的に配列のぶぶんは新規に作ったが、表示される文章はsummer_a.rbと一緒 である。 そこから重要単語をdatとした。 c作成したプログラム summer_c.rb #!/usr/koeki/bin/ruby #インタプリタであることを宣言する s =0 #s(配列番号)は0からはじめる oneward=Array.new #onewardは配列である(後から単語を外部のデータから読みこむ) twoward=Array.new #twowardは配列である(後から単語を外部のデータから読みこむ) threeward=Array.new #threewardは配列である(後から単語を外部のデータから読みこむ) open("summer_c.dat","r") do |kotoba| #読みこみ先のファイルはsummer_c.rbと定義し最終的にはkotobaというところに集める while a= kotoba.gets #これから出てくるaという構造もkotobaに集める if /(\S+)\s+(\S+)\s+(\S+)/ =~a #もし外部のデータが文字→空白→文字→空白→文字だったら oneward[s]=$1 #最初の配列はonewardとする(最初の単語という意味) twoward[s]=$2 #2番目の配列はonewardとする(2番目の単語という意味) threeward[s]=$3 #3番目の配列はonewardとする(3番目の単語という意味) if s ==0 #もしsが0番目(最初の段落だったら) printf("今年の夏は%sよりは充実していた。(様な気がする)\n何故かといえば、今年の夏に新しく飼った%sを運動させるために、わざわざ%sに連れていくという予定が出来て来たためである。\n\n",oneward[s],twoward[s],threeward[s]) #内容表示 sleep(6) #6秒止める(ktermの動きを止める) elsif s==1 #もしsが2番目(2番目の段落だったら) printf("まあ、その公園は%sも近いので、%sの%sも見れてなかなか面白いのだが…\n\n",oneward[s],twoward[s],threeward[s]) #内容表示 sleep(3) #3秒止める(ktermの動きを止める) elsif s==2 #もしsが3番目(3番目の段落だったら) printf("その中で飛行機の%sも色々と取ってみたのだが、%sや%sになると綺麗に撮れないということも発生するので、今後は撮影技術の向上もしたいなあーーなんて\n\n",oneward[s],twoward[s],threeward[s]) #内容表示 sleep(4) #4秒止める(ktermの動きを止める elsif s==3 #もしsが4番目(4番目の段落だったら) printf("ああ、そういえば、%sが唯一誇れるであろう(と思っている)%s%sももうすぐである\n\n",oneward[s],twoward[s],threeward[s]) #内容表示 sleep(5) #5秒止める(ktermの動きを止める) else #もしsがその他の数字(=5番目の段落だったら) printf("%sやら%sシートやら、%sやらたくさんの言葉が飛び交っているが、「成田」を越せるよう頑張って欲しい\n",oneward[s],twoward[s],threeward[s]) #内容表示 end #ifのおわり s+=1 #s(配列番号)をふやすことにより次の行へと移る(読みこむ) end #if(こういう構造だったらーーー)のおわり end #whileの終わり end #openの終わり summer_c.dat 去年 犬 公園 羽田空港 飛行機 離着陸 写真 逆光 夜 大田区 羽田空港 国際化 LCC 立ち乗り オープンスカイ d実行結果 pan{c109058}% ./summer_c.rb [~/Ruby] 今年の夏は去年よりは充実していた。(様な気がする) 何故かといえば、今年の夏に新しく飼った犬を運動させるために、わざわざ公園に連れていくという予定が出来て来たためである。 まあ、その公園は羽田空港も近いので、飛行機の離着陸も見れてなかなか面白いのだが… その中で飛行機の写真も色々と取ってみたのだが、逆光や夜になると綺麗に撮れないということも発生するので、今後は撮影技術の向上もしたいなあーーなんて ああ、そういえば、大田区が唯一誇れるであろう(と思っている)羽田空港国際化ももうすぐである LCCやら立ち乗りシートやら、オープンスカイやらたくさんの言葉が飛び交っているが、「成田」を越せるよう頑張って欲しい e考察 一問目と内容は一緒である。1問目と同じ内容が表示されているので正しい。 最初にも述べたがこのプログラムを応用すれば予め問題を用意し、自分の答えを datに書き、答えあわせをするというテストが出来上がるのではないかと考える。 3感想 夏休み中後期が心配ですごく復習したのもあり、参考文献が少なく終わった。きっ とこうだろうなという頭の中に描いていたものが、上手く当てはめることが出来 たのがその理由である。 しかし、今ここまで出来るのも前期の努力があったからであるので、後期は正直 にいうと履修単位数も多いし、レポートも多くなりそうだが、前期とまでは行か なくても出来るだけ、時間の許す限り、演習問題をやりながら、プログラミング を「楽しみたい」 久し振りだったが周りの人とは世間話程度に終わってしまった すこし読みこみの所のifとwhileの部分がむずかしかったが何とかあっていた。 良く復習したのはwhileとifである。 共同学習者:宮川史礼 先輩 参考文献 西村まどか プログラミングのレポートに必要な項目