roy > naoya > 基礎プログラミングI·情報検索 > (2)プログラミングの基礎
パスワードに関する注意をよく読んだ上で、推測されにくいパスワードに変更する。5文字や6文字では現在のコンピュータ能力をもってすれば短時間で破られてしまうため、8文字以上にすること。
変更後、一旦exitしてから新しいパスワードで再度ログインしてみよう。
人間は「事務局行ってきて。あ、その前にメディアセンターにも」などと言われても理解することができるが、コンピュータは全ての手順を最初から順番かつ正確に伝えなえれば理解できず、正しく実行することもできない。これから学ぶプログラミング言語は、人間がコンピュータに正確に指示を伝えるために作られたものである。
コンピュータは一見するとアルファベットや漢字を理解できているように感じるが、実際には1と0しか取り扱うことができない。アルファベットも漢字も記号も全て1と0の組み合わせに置き換えられている。これを機械語という。このため、コンピュータに命令を行う場合は、機械語を用いなければならない。しかし、人間が機械語を用いるのは労力が大きく、間違いが生じやすい。プログラミング言語は人間が直接扱うことが難しい機械語のかわりにわかりやすい言葉で書いたもので、その後で機械語に翻訳してコンピュータに実行させている。機械語への翻訳方法によりプログラミング言語は以下の2種類に分類できる。
このため、コンパイル型言語ではソースコードに誤りがあると、機械語への変換中(コンパイル中)にエラーとなり、実行することができない。これに対して、スクリプト型言語では1行ずつの変換であるため、エラーが出現する手前までは実行が可能である。この授業で扱うRubyはスクリプト型言語に分類される。
Rubyプログラムの作成はemacsで行い、実行はktermで行う。まずはemacsの使い方を思い出そう(1年生のときと同じ)。主なコマンドを以下に示す。その他のコマンドはemacs操作方法のページを参照すること。
emacs操作方法
まず簡単なプログラムを作成してみよう。emacsでファイルの新規作成を行うコマンドはCtrl-x Ctrl-fなので、これを入力しよう。するとemacs下部のミニバッファに以下のように表示される。
Find file: ~/
この後に続けて以下のように入力しよう(入力した部分を黄色で示す)。
Find file: ~/ruby/keisan.rb[Return]
Rubyプログラムはファイル名に必ず.rbの拡張子をつける。ruby/keisan.rbとなっているが、これはrubyディレクトリの中にkeisan.rbというファイルを新規作成せよという意味である。正しく入力すると、emacsの上部に(keisan.rb)と表示される。
では、プログラムを書いてみよう。まずは余り考えずに以下の通り入力してみよう。
#!/usr/koeki/bin/ruby print"計算をします。\n" x = 10 y = 20 z = x + y p z printf("%d足す%dは%dです。\n", x, y, z)
日本語の入力を行う場合はCtrl-oを押す。Ctrl-oを押すごとに日本語入力と英語入力が切り替わる。
入力したら保存をする。保存はCtrl-x Ctrl-sである。保存をしていない場合は-E:の横に**と表示されている。保存をすると**が消えることを確認しよう。
プログラムを作成したら、今度は実行してみよう。実行するのはktermなので、ktermでrubyディレクトリに移動し、以下のように入力する。
irsv{c10xxxx}% cd ruby[Return] #=>ruby/に移動 irsv{c10xxxx}% ruby keisan.rb[Return] #=>keisan.rbの実行
すると次のように表示される(はずである)。
irsv{c10xxxx}% ruby keisan.rb[Return] 計算をします。 30 10足す20は30です。
keisan.rbは短いが立派なプログラムである。各行についてそれぞれ解説する。
プログラム作成に関わるルール
今実行したkeisan.rbをktermで実行すると、結果が3行表示された。これらはそれぞれ2行目、6行目、7行目が対応していた。2行目のprint、6行目のp、7行目のprintfはいずれも「表示せよ」という命令であった(若干働きは違うが)。このように、何らかの働きを持つあらかじめ登録された文字列のことをRubyではメソッドと呼ぶ。
では、printメソッド、pメソッド、printfメソッドの働きについて、それぞれの違いを意識しながら確認してみよう。
printfについてはもう少し複雑な働きをするが、当面は上述の通り理解しておいて問題ない。
keisan.rbで用いられたx、y、zのように何らかの値を代入して保管しておく役割を果たすものを変数とよぶ。中学や高校の数学でも登場しているので、それなりに馴染み深い(はずである)。
中学や高校ではx、y、zが主に用いられてきたが、プログラム中に登場する変数名は1文字である必要はない。例えば、keisan.rbで使用したxはappleとしてもよいし、hogehogehogeでも構わない。変数名を決める上での注意点を示す。
ところで、keisan.rbではx = 10などと書かれていた。この意味は以下のとおりである。
=は右辺を左辺に代入するという意味を持つ。したがって、z = x + yはx+yの結果をzに代入するということになる。ここでは、=や+の前後に半角のスペースをとっているが、スペースはあってもなくてもよい。
変数には数字だけでなく文字を代入することもできる。文字を代入する場合には値に""をつける。
変数名は、代入されている値が想像できるような名称にする。
同一名称の変数に繰り返し代入すると上書きされる。
xに代入されているのは200となる。最初に入力した100は保持されない。
メソッドと変数のまとめ
\nは「バックスラッシュエヌ」と呼び改行をあらわす。バックスラッシュは環境により円マークとして表示される場合がある。バックスラッシュのないキーボードを使用している場合は円マークで代用する。
\nの有無により、出力結果が変化することを確認しよう。以下の2つのプログラムは\nの有無のみが異なっている(違いがわかりやすくなるよう\nを黄色で表示している)。それぞれのプログラムを、指定した名前をつけて保存し、結果がどうなるか確認してみよう。
今回はいちいち入力するのは面倒なので、コピー&ペーストを使ってみよう。emacsでファイルを新規作成した後で、コピーしたいところをマウスで反転させて選択し、emacs上でマウスの真ん中クリックで貼り付けよう。
greeting1.rb
#!/usr/koeki/bin/ruby print"はじめまして。\n" print"私の名前は\n" print"○○(自分の名前)です。\n"
greeting2.rb
#!/usr/koeki/bin/ruby
print"はじめまして。"
print"私の名前は"
print"○○(自分の名前)です。\n"
早くできた人はgreeting2.rbの\nを削除して実行してみよう(greeting3.rb)。何が起こるだろうか?
irsv{c10xxxx}% ruby greeting1.rb[Return] はじめまして。 私の名前は 公益太郎です。 irsv{c10xxxx}% ruby greeting2.rb[Return] はじめまして。私の名前は公益太郎です。 irsv{c10xxxx}% ruby greeting3.rb[Return] irsv{c10xxxx}%
実行結果を見ると、greeting1.rbでは途中で改行され3行に分かれて表示される。改行が行われているのは\nの位置である。greeting2.rbではプログラムでは3行に分割して記述した内容が1行で表示されている。greeting3.rbは実行しても何も表示されない。
printメソッドやprintfメソッドを使ってメッセージを表示させる場合、\nをつけることで改行させることができる。なお、表示する一連のメッセージの一番最後には必ず\nが必要である。最後の\nがないと何も表示されない。
ただし表示をさせるメソッドのうち、pメソッドについては\nは不要である。pメソッドは変数内の値を表示して自動的に改行する。""内のメッセージを表示する働きを持つprintメソッド、printfメソッドのみ""の末尾に必ず\nが必要となる。
\nの働きと用法についてのまとめ
Rubyはスクリプト型の言語であり、実行時にインタプリタという翻訳プログラムが1行ずつ機械語に翻訳する。Rubyインタプリタの起動方法により、2種類の実行方法を選択することができる。どちらを使用してもよい。
irsv{c10xxxx}% ruby greeting.rb[Return]
irsv{c10xxxx}% chmod +x greeting.rb[Return] irsv{c10xxxx}% .greeting.rb[Return]
1行目のchmod +x greeting.rbはファイルに実行属性を与えるというもので、最初に1回だけ実施すればよい。その後は2行目の./greeting.rbを入力するだけで実行できる。新しいプログラムファイルをを作成した場合のみ、最初に実行する際に1行目を実施する。
2つの方法の違いについて例をあげながら説明しよう。以下はWindowsのWordで作成したファイルである。左側はgreeting.docという名称で、.docという拡張子がついている。拡張子はどのプログラムで作成されたかを示すもので、.docはWordで作られたファイルであることをあらわしている。左側はダブルクリックするとWordが起動し、ファイルを開くことができる。右側は左側のファイルから拡張子を取り除いたものである。拡張子を取り除くとどのプログラムで作成されたのかがわからなくなるため、アイコンの絵柄も変わる。右側はダブルクリックしてもWordは起動せず、ファイルを開くことはできない。右側のファイルを開く場合には、まずWordを起動し、メニューの「開く」からファイルを指定する必要がある。
ruby ファイル名[Return]という実行方法は、上記の例で言えば右側のファイルを開くことに相当する。ruby ファイル名[Return]のrubyの部分でRubyインタプリタというプログラムを起動し、その後に対象ファイルを開いて実行している。./ファイル名[Return]による実行は左側のファイルを開くことに相当する。ファイル名のみの入力による実行は、アイコンのダブルクリックと同一のイメージである。では、./ファイル名[Return]の場合、プログラムとファイルの関連付けはどのように行われているのであろうか。Windowsの場合、そのファイルがどのプログラムで作成されたのかは拡張子で判断される。Rubyプログラムの場合、関連付けはプログラム内の1行目に記載した#!/usr/koeki/bin/rubyで行われている。これは、このファイルを実行する際には、usrというディレクトリの中のkoekiというディレクトリの中のbinというディレクトリの中にあるrubyインタプリタを利用せよという指示である。
したがって、ruby ファイル名[Return]の形式で実行する場合には#!/usr/koeki/bin/rubyを1行目に記述する必要はない(記述しても良い)。ただしこの授業の中では、どちらの実行方法にも対応できるように、原則として1行目には#!/usr/koeki/bin/rubyを記述するものとする。
Rubyプログラムの実行方法(2種類ある)
2の方法で実行する場合、1回目のみ事前にchmod +x プログラム名[Return]が必要。
もういちど最初の方で取り上げたkeisan.rbを見てみよう。
#!/usr/koeki/bin/ruby print"計算をします。\n" x = 10 y = 20 z = x + y p z printf("%d足す%dは%dです。\n", x, y, z)
このプログラムでは3行目と4行目でxとyにそれぞれ10と20を代入しており、5行目でzを計算している。3行目と4行目を書き換え、例えばx = 40などとすれば、あらゆる足し算を行うことができる。
ただし、いちいちプログラムを書きなおして保存しなおしてから実行するのは非常に面倒くさい。最初からプログラムの中に数字を書いておくかわりに、プログラムを実行したときに好きな数字を入力し、その値に基づいて計算を行ってくれたほうが便利である。
キーボードからの入力を読み込むメソッドとしてgetsメソッドがある。getsメソッドを使ったプログラムの例を見てみよう。
money.rb
#!/usr/koeki/bin/ruby print"商品の金額を入力してください\n" item = gets.chomp!.to_i printf("お会計%d円です。いくら支払いますか?\n",item) money = gets.chomp!.to_i change = money - item printf("%d円のお返しになります。ありがとうございました。\n", change)
irsv{c10xxxx}% ruby money.rb[Return] 商品の金額を入力してください 198[Return] #=>入力待ちになる お会計198円です。いくら支払いますか? 200[Return] #=>入力待ちになる 2円のお返しになります。ありがとうございました。
実行すると、「商品の金額を入力してください」が表示された後でユーザからの入力待ちになる。ここでは198を入力している。すると「お会計198円です。いくら支払いますか?」が表示される。このメッセージはprintfで表示されているが、%dの位置に入力した198が入れ込まれている。メッセージ表示後、再度ユーザからの入力待ちになる。ここでは200を入力している。すると入力した値に基づいて計算が行われ、その後のメッセージが表示される。
money.rbの1行目と2行目には特に新しいものはない。3行目では
item = gets.chomp!.to_i
が登場している。getsはキーボードからの入力を読み込むメソッドであるが、キーボードから入力した値が数字の場合はchomp!.to_iを後ろにつけて、gets.chomp!.to_iとする必要がある。したがって、この行はキーボードから入力された数字を読み込んでitemに代入している。chomp!やto_iもメソッドであるが、ここでは説明しない(第5回で詳しく取り上げる)。
4行目ではprintfを用いて、たった今入力した数字を表示し、支払い金額の入力を促している。5行目では3行目と同様にgets.chomp!.to_iを用い、入力した数字をmoneyに代入している。6行目ではmoneyに代入された値からitemに代入された値を引き、結果をchangeに代入している。7行目はkeisan.rbと同じで、""内の%dの位置に""の後ろで指定したchangeに代入された値を入れ込んで表示している。
getメソッドについてのまとめ
表示する役割を持つprintやprintfメソッドに加え、キーボードからの入力を受け取るgetsメソッドを学んだことで、かなりプログラムらしいものが作れるようになってきた。今日のまとめとして、これらのメソッドを駆使したプログラムを何か1つ作ってみよう。プログラムを作成するための要件は以下のとおりである。
キーボードから数字を入力してもらい、その数字を使って何か計算をして結果を出力するプログラム
money.rbのように支払額を入力してお釣を計算するプログラム以外にも例えば以下のようなものが該当する。以下を参考にしても良いし自分で考えても良い。
メール本文の構成は以下のとおり。
採点:本日は出席点のみです
Tips:emacsでの日本語入力のオンオフはCtrl-oです
Tips:Mewによるメールの送り方はMewコマンドを参照