Login
Immutable PageDiscussionInfoAttachments
benevolent0505/ProgrammingSeminar2016/basic-grammar-summary

MMA

プログラミング講習基本的な文法の簡易版

この文章はこれまでのプログラミング講習の基本的な文法の内容を縮小してまとめたものです。

はじめに

  1. プログラムの書き方
  2. irbについて

この文書を読み始める前に、必ず自分のPCにRubyとお好きなテキストエディタ(ここではAtomを使って説明しています)をインストールしてください。

インストールの仕方は https://wiki.mma.club.uec.ac.jp/benevolent0505/2016ProgrammingSeminar1環境構築の項を見てください。

また、この文章で作成する作業用のフォルダ(ディレクトリ)も作成してください。ここではWindowsの場合はC:\developを,MacやUnix系OSでは~/developを作業用のフォルダにすることを推奨しています。

この文章でのコマンドやプログラムの表記を説明しておきます。
まず、コマンドを表記するときは次のように書きます。

ターミナル

$ ruby hello.rb
Hello, world!

ここで言っているターミナルとはMac での「ターミナル」だったり、 Windows での「コマンドプロンプト」や「PowerShell」のようなコマンドを入力する画面のことを 指します。このあたりの説明は別の資料に譲るとして、ここではコマンドを入力できるものと思ってください。

先頭に$の記号が書かれている場合はターミナル上で実行するコマンドです。$の記号はコマンドを入力する時には関係がありません。間違えて入力しないようにしましょう。$の記号がない部分は、そのプログラムやコマンドの出力の部分であることを意味します。この部分も、間違えて入力しないようにしましょう。

次にプログラムについて以下のように表記します。

hello.rb

puts 'Hello, world!'

プログラムの前にファイル名を書いて、その下の背景が違う色になっているものがプログラム部分になります。

プログラムの書き方

この節ではどういうことを行っていって、プログラムを書いて動かすのかを説明します。

始めにプログラムの書き方について説明をします。Rubyにおけるプログラムはただのテキストファイルです。コンピュータにおいてのファイルについて詳しく知りたい人はここを読んでみるとよいですが、今は詳しく知る必要はありません。イメージが出来ていない人は、テキストエディタで何かを書いて保存したものと思ってください。

ではファイルの作り方を説明します。ターミナルを開いて、自分が作った作業用ディレクトリに移動しましょう。
移動したらatom hello.rbと打ち込みます。

ターミナル

$ atom hello.rb

少し時間がかかるかもしれませんがAtomが起動します。この状態で既にhello.rbというファイルを編集している状態です。ではここに次のプログラムを書いて、ファイルを保存しましょう。

hello.rb

puts "Hello, world!"

保存の仕方は、Atomのウィンドウの上部にあるメニューバーから、File->Saveとすると編集した内容が保存されます。これでRubyのプログラムのファイルが完成しました。ちなみにこのプログラムは、'Hello, world!'という文字を表示するプログラムです。

次にこのプログラムのファイルの、動かし方について説明をします。ターミナルに戻って次のコマンドを打ち込んでみましょう。

ターミナル

$ ruby hello.rb
Hello, world!

Hello, world!という文字が表示されたと思います。ここではrubyというコマンドにhello.rbというファイルを渡しています。「コマンドに何かを渡す」という言い回しは「何かがコマンドの引数である」という意味ですが、コマンド操作やプログラミングの時にはよく出てくる表現ですので慣れてください。

さて、rubyコマンドについて説明します。rubyコマンドは渡されたRubyのプログラムファイルを読み込んで、そのプログラムの処理を実行するコマンドです。今hello.rbにはHello, world!という文字を表示する処理が書かれているので、この処理が実行されてHello, world!が表示されています。

ちなみにhello.rbのファイルの.rbとはRubyのプログラムであることを表わす拡張子です。

これまでの流れが、プログラムを書いて動かすまでの流れになります。一般的にプログラミングをすると言うときはこの流れのことを指すことが多いと思います。

irbについて

前のプログラムの書き方で手一杯だという人はこの節は読み飛ばしてかまいません。次の章に書いてある内容はこの節を読まなくても取り組める内容になっています。

ここではirbというコマンドについて説明をします。まずは自分のターミナル上でirbと打ってみましょう。

ターミナル

$ irb
irb(main):001:0>

REPL(Read Eval Print Loop)

プログラムを書こう

この章では様々なプログラムを書きながら、Rubyの基本的な文法を知ることが目標です。

この章のプログラムを写したり自分で書いたプログラムを書いて実行をすると、書き間違いなどによるプログラムのミスのために、エラーの表示が出ることがあります。そのときはエラーの原因はしっかりとエラー文に書かれているので、エラー文を読むようにしましょう。詳しくはRubyの基本的な文法エラーについての項を見てください。

文字を表示する (hello.rb)

まずは文字を表示するプログラムから始めていきましょう。プログラムの書き方でも例にした、hello.rbのプログラムを見てください。

hello.rb

puts "Hello, world!"

これはHello, world!という文字を表示するプログラムです。Rubyで文字を表示するにはputsというメソッドを使います。Rubyではプログラムに対する命令をメソッドと言います。

putsの使い方はメソッドの後にスペースをはさんで、表示したい文字列をダブルクウォーテーションマーク""で囲みます。hello.rbで表示する文字はHello, world!なので、"Hello, world!"と囲んであります。

ではputsを使う練習をしてみましょう。プログラムの書き方でやったように、Atomを開いてuse_puts.rbを作ってみましょう。

ターミナル

$ atom use_puts.rb

use_puts.rb

puts "Hello, world!"
puts "Hello, Ruby"
puts "What's your name?"

プログラムが作成できたら実行してみてください。

ターミナル

$ ruby use_puts.rb
Hello, world!
Hello, Ruby
What's your name?

このようにputsは文字を表示することができます。putsはよく使うメソッドなので使い慣れておきましょう。

プログラムに計算をさせてみる (calc.rb)

さて、文字を表示させるプログラムを作ることを覚えましたが、これだけではあまり面白くありません。コンピュータは計算機とも呼ぶので、四則演算をするプログラム、calc.rbを作ってみましょう。

まずはRubyで四則演算をする方法を説明します。ひとまず次のプログラムを書いて動かしてみましょう。

calc.rb

1 + 1
puts 5 + 3
puts 5 - 3
puts 5 * 3
puts 5 / 3

上から足し算引き算かけ算割り算の順です。大体のプログラミング言語ではかけ算や割り算は×÷の記号の代わりに*/を使います。

ターミナル

$ ruby calc.rb
8
2
15
1

まずputsは文字だけでなく数値も表示します。一番最初に書いてある1 + 1が表示されていないのは、計算自体はされていますが、計算した結果を表示するように書いていないからです。このようにputsは何か計算した結果を表示するのにも使います。

さて、大体の計算結果は思った通りの結果だっと思いますが、一つだけ違うものがあります。最後の余りの計算を見てみましょう。覚えのある計算結果は5 / 3 = 1 ・・・ 2だと思います。Rubyだけではなく、一般的なプログラミング言語では割り算の結果は商だけを求めて余りは求めません。

余りを求めるには記号を使う必要があります。余りを求めるには%の記号を使います。%を使った計算をcalc.rbに追記して、実行してみましょう。

calc.rb

puts 5 + 3
puts 5 - 3
puts 5 * 3
puts 5 / 3
puts 5 % 3

ターミナル

$ ruby calc.rb
8
2
15
1
2

追記したputs 5 % 3の分、2の表示が増えていますね。

Rubyではこのようにして数値の計算をします。この+-の記号のことを演算子(式)と呼びます。

今回のcalc.rbは四則演算をするだけですが、この先の節でもっと色々なことができるようにプログラムを改良します。その際もここでやって計算のことは出てくるので覚えておくようにしましょう。

変数を使ってhello.rbcalc.rbを良くする

さて、変数というものを使ってこれまで書いてきたhello.rbcalc.rbを改善していきましょう。

まずこれまでのプログラムでは何を改善する必要があるのかを説明します。次のプログラムを見てみましょう。このプログラムは名前を表示して、2つの挨拶を表示するプログラムです。

greeting.rb

puts "benevolent0505"
puts "Hello, " + "benevolent0505"
puts "Goodbye, " +  "benevolent0505"

ターミナル

$ ruby greeting.rb
benevolent0505
Hello, benevolent0505
Goodbye, benevolent0505

Rubyでは+の演算子は足し算の計算以外にも文字をつなぐためにも使えます。この+の使い方もRubyではよく使うので慣れておきましょう。

さて、このプログラムの名前の部分を変更したくなったとしましょう。そうなると名前の部分を全て変更するのは少し面倒です。このプログラムだけだと3箇所の変更だけですが、もっと多くの箇所を変更しないといけないときはやる気が起きなくなります。

変数を使うとこの面倒を解消できます。変数とはbenevolent05051などの値に名前を付けたものです。変数の作り方は下の様に変数名 = 値というように書きます。これを「変数名に値を代入する」と言います。例えばname = "benevolent0505"とするとname"benevolent0505"の代わりになります。

では変数を使ってgreeting.rbを改良してみましょう。

greeting.rb

name = "benevolent0505"
puts name
puts "Hello, " + name
puts "Goodbye, " + name

ターミナル

$ ruby greeting.rb
benevolent0505
Hello, benevolent0505
Goodbye, benevolent0505

このように、変数に値を入れることができます。

さて、変数を使う練習をしてみましょう。まずはhello.rbを変数を使って改良してみましょう。今までputsで直接表示していた文字を変数に代入して、それを表示させてみましょう。

hello.rb

message = "Hello, world!"
puts message

次にcalc.rbを変数を使って改良をしてみましょう。今までは数値を直接計算させていましたが、その数値を変数に代入して計算をさせてみましょう。

calc.rb

x = 5
y = 3

puts x + y
puts x - y
puts x * y
puts x / y
puts x % y

このように変数を使うことでプログラムを変更に強くできます。変数はプログラミングでは必ず必要になることなので、覚えるようにしましょう。

getsメソッドを使って入力を受け取る

今まではputsで表示したり+演算子で計算をさせる値はプログラムに既に記述されたものだけでした。実際のプログラムではユーザからの入力を受け取って表示をさせたり、計算をしたりします。ここではユーザからの入力を受け取る方法の一つのgetsというメソッドを使った方法を説明します。

getsメソッドはプログラム外からの入力を一行受け取るメソッドです。早速getsを使ったプログラムを書いてみましょう。

use_gets.rb

name = gets
puts "Your name is " + name

ターミナル

$ ruby use_gets.rb
benevolent0505
Your name is benevolent0505

これは入力された文字をYour name isという文字とともに表示するプログラムです。getsで受け取った文字を変数nameに代入しています。

実行例にあるbenevolent0505の文字がユーザ(ここでは僕が)入力した文字です。getsは一行を読み込んで受け取るメソッドなので、入力の終わりを示すためにReturn(Enter)キーを押して改行をする必要があります。また、ここで打ち込む文字をMMAにすると、次の行にはYour name is MMAと表示されます。他にも色々な文字を打ち込んで試してみましょう。

ちなみにこのプログラムだと、実行した直後にいきなり文字を入力しなくてはいけないので少し不便です。文字を入力させる前には、Please input your name.など、何か表示をして、名前を入力をしてほしいことを明示しておくと親切です。

use_gets.rb

puts "Please input your name."
name = gets
puts "Your name is " + name

ではgetsを使ってhello.rbを改良してみましょう。ここでは改良の例を一つ提示しておきます。getsを使うことで表示できるメッセージを自由に入力できるようにしました。(オウム返ししてるだけとも言う)

hello.rb

puts "Please input hello message."
message = gets
puts message

次にcalc.rbgetsを使って改良してみましょう。けれどいきなりcalc.rbに手を加える前に、次のプログラムを見てください。

add.rb

puts "Please input x value."
x = gets
puts "Please input y value."
y = gets

answer = x + y

puts "x + y = " + answer

ターミナル

Please input x value.
9
Please input y value.
1
x + y = 9
1

91はユーザが入力した値です。さて、思ったような結果と違っていたと思います。この結果になる理由を説明するのに、まずgetsが入力に対してどんな値を受け取るのかを知る必要があります。

getsは一行読み込んで、読み込んだ文字を文字列にして受け取ります。今まで文字列という言葉を使ってきませんでしたが、言葉通り「""の記号で囲まれた文字の列」のことです。ただ、"a""1"などの一文字のものも文字列と呼ぶので注意しましょう。

getsの入力にHello, world!と打ち込んであげると、gets"Hello, world!\n"という文字列を受け取ります。最後にある\n改行文字といい、文字列中の改行を表す特殊な文字です。改行文字の動作を確認するために、次のプログラムを見てみましょう。このように改行文字のところで文字列が改行されて表示されていることがわかります。

newline.rb

puts "Hello\nworld!"

ターミナル

$ ruby newline.rb
Hello
world

getsで読み込んだ文字列の最後に改行文字が入る理由は、一行の終わりを示すためにEnter(Return)キーを入力しました。このEnter(Return)キーによって改行文字が入力されたのです。

今度はgetsの入力に数字を与えてみましょう。9を打ち込んだときはgets"9\n"という文字列を、1を打ち込んだときは"1\n"を受け取ります。この改行文字を取り除くのに、chompというメソッドが使えます。chompは文字列の最後の改行文字を取り除いたものを返してくれるメソッドです。chompは次のプログラムのようにして使います。

use_chomp.rb

message = "Hello\n".chomp
puts message

ターミナル

$ ruby use_chomp.rb
Hello

"Hello\n".chompという書き方は初めて出てきましたが、chompは文字列に対して動作をするメソッドなのでこのように書きます。また、getsと一緒に使う時はgets.chompという形で使うと、文字列を受け取ってすぐに改行文字を削除できるので便利です。

さて、getsを使ってadd.rbを正しく動作するようにしてみましょう。

add.rb

puts "Please input x value."
x = gets.chomp
puts "Please input y value."
y = gets.chomp

answer = x + y

puts "x + y = " + answer

ターミナル

$ ruby add.rb
Please input x value.
9
Please input y value.
1
x + y = 91

改行はなくなりましたが、また思っていた結果とは違ったと思います。前の節で、+の演算子を文字列で使うと文字列をつなげることが出来ると説明しました。getsが受け取るものは全て文字列なので、91は文字列です。なので"9" + "1"は文字列同士をつなげることになるので"91"という結果になります。

getsで受け取った数字(文字列)を使って計算をするには、受け取った数字を数値に変換する必要があります。数字を数値に変換するためには、to_iというメソッドを使います。次のプログラムを見てみましょう。to_iも文字列に対して動作するメソッドなので、x.to_iのように書きます。

convert_to_number_value.rb

x = "10"
puts x
puts x.to_i

ターミナル

$ ruby convert_to_number_value.rb
10
10

表示の上では違いがわかりませんが、上の10は数字(文字列)の10を表示していて、下の10は数値を表示しています。

これでadd.rbを正しく動作させることができます。

add.rb

puts "Please input x value."
x = gets.chomp.to_i
puts "Please input y value."
y = gets.chomp.to_i

answer = x + y

puts "x + y = " + answer

ターミナル

$ ruby add.rb
Please input x value.
9
Please input y value.
1
x + y = 10

x = gets.chomp.to_iの部分で混乱するかもしれませんが、意味としてはgetsで入力9を受け取って得た"9\n"を、chompで一番後ろの文字を取り除いて"9"にしたものを、to_iを使って9にして、それを変数xに代入しているといった感じです。一つづつ考えていけば、今まで見てきたものの組み合わせなので理解できると思います。

さて、本来の目的であるcalc.rbを改良しましょう。

calc.rb

puts "Please input x value."
x = gets.chomp.to_i
puts "Please input y value."
y = gets.chomp.to_i

puts x + y
puts x - y
puts x * y
puts x / y
puts x % y

ターミナル

$ ruby calc.rb
Please input x value.
9
Please input y value.
1
10
8
9
9
0

このようにしてgetsを使ってユーザからの入力を受け取ることができます。その受け取った値を扱う際には、改行文字や値は文字列であることなどの注意をするべき点があるので、気を付けるようにしましょう。

ifを使って成績表示プログラムを作る (grade.rb)

この節では条件に応じて行う処理を変える方法を学び、簡単な成績表示プログラムを作ります。

これまでの学んだことでも、割と色々なプログラムが書けますが、プログラムを一番始めから最後の行までの全てを実行することしか出来ません。実際のプログラムでは例えば数値を比較した結果や、入力された文字によって処理を変えたりといったことをします。

この条件に応じて処理を変えるにはifというものを使います。次のプログラムを見てみましょう。これはa, b2つの変数に格納された数値を比較して、a < bだったらメッセージを表示するプログラムです。

comp_two_number.rb

a = 3
b = 5

puts "a = " + a.to_s + ", b = " + b.to_s
if a < b
  puts "b is bigger than a."
end

ターミナル

$ ruby comp_two_number.rb
b is bigger than a.

abの後にto_sというメソッドがありますが、これは数値を文字列に変換するメソッドです。+演算子は文字列と数値をつなげることが出来ないので、数値を文字列に変換してから結合しています。

ifの書き方はifの後にスペースを一つ空けて条件となる処理を書き、その条件が成り立っている時に実行してほしい処理をifの下に書いていき、処理の終わりになったらendを書きます。このプログラムでは条件がa < bで、これが成り立っているときに実行してほしい処理がputs "b is bigger than a."なので、これを書いて終わりにendを書きます。今a = 3, b = 5で、3 < 5なのでメッセージが表示されています。では、変数の中身を変更してa = 5, b = 3にしてみたら、どうなるでしょうか。

comp_two_number.rb

a = 5
b = 3

puts "a = " + a.to_s + ", b = " + b.to_s
if a < b
  puts "b is bigger than a."
end

ターミナル

$ ruby comp_two_number.rb

今度は何も表示されませんでした。ifは後に続く条件が成り立っているときにendまでの処理を実行します。今はa < b5 < 3なので成り立っていません。そのためメッセージは表示されなかったということになります。

このプログラムでは条件が成り立っているときにしか実行されませんが、「条件が成り立っているときはAの処理を、成り立っていないときにはBの処理を実行したい」ときがあります。このような場合はelseというキーワードを使って書くことができます。次のプログラムを見てみましょう。

comp_two_number.rb

a = 5
b = 3

puts "a = " + a.to_s + ", b = " + b.to_s
if a < b
  puts "b is bigger than a."
else
  puts "a is bigger than b."
end

ターミナル

$ ruby comp_two_number.rb
a = 5, b = 3
a is bigger than b.

ifの条件が成り立っているときの処理のあとにelseというキーワードを書いて、条件が成り立っていないときの処理を記述します。今はa < b5 < 3で条件が成り立っていないのでelseの下に書いた処理が実行されます。

ifの条件が成り立っていないときに、「条件1が成り立っているときはAの処理を、条件2が成り立っているときはBの処理を、それ以外の場合(条件1も2も成り立っていないとき)はCの処理を実行したい」ときもあります。このような場合はelsifというキーワードを使って書くことができます。これを使って、comp_two_number.rbifの処理をもっと細かくしてみましょう。

comp_two_number.rb

a = 5
b = 5

puts "a = " + a.to_s + ", b = " + b.to_s
if a < b
  puts "b is bigger than a."
elsif a == b
  puts "a equals b."
else
  puts "a is bigger than b."
end

ターミナル

$ ruby comp_two_number.rb
a = 5, b = 5
a equals b.

書き方はifの条件が成り立っているときの処理のあとに、elsifと書いて新たに条件を書きます。その下に条件が成り立っているときの処理を書いていきます。ここではelsifの条件がa == bで、これが成り立っているときの処理がputs a equals b.となります。今はa = 5, b = 5なので、a < bは成り立たずa == bの条件をみます。a == bは成り立っているので、その処理が実行された形になります。abの値を変えてみて、このプログラムの処理がどのように変化するかを試してみましょう。

<==の記号を比較演算子といいます。比較演算子には様々な種類があるので覚えるようにしましょう。

演算子記号 意味 使い方
== 等しい a == b
!= 等しくない a != b
> 大なり a > b
>= 大なりイコール a >= b
< 小なり a < b
<= 小なりイコール a <= b

また比較演算子を用いた条件を組み合わせた処理を作ることもできます。これらの記号は論理演算子といいます。これらも使えるようにしましょう。

演算子記号 意味 使い方
&& かつ(∩) a < b && x < y
|| または(∪) a < b || x < y
! 否定(¬) !(a < b)

さて、これらのことを使って、簡単な成績表示プログラムを作りましょう。このプログラムは名前とテストの点数を入力してもらって、その点数から成績を判定するプログラムになります。

grade.rb

puts "Please input your name."
name = gets.chomp
puts "Please input your test score."
score = gets.chomp.to_i

puts name + "'s Grade is ..."
if score >= 90
  puts "秀"
elsif score >= 80
  puts "優"
elsif score >= 70
  puts "良"
elsif score >= 60
  puts "可"
else
  puts "不可"
end

ターミナル

$ ruby grade.rb
Please input your name.
benevolent0505
Please input your test score.
70
benevolent0505's Grade is ...
良

ifを使って条件に応じて処理を分けることを条件分岐または条件判断といいます。条件分岐もプログラムを組む上では必ず必要になってくることなので出来るようにしましょう。

配列を使ってデータをまとめる (grade.rb)

今までは文字列や数値の値(データ)を単体で扱ってきましたが、これらを一つにまとめる配列というものについて説明します。

配列とはいくつかのデータを順に並べたものです。配列の中のデータのことを普通は(配列の)要素と呼んだりします。次のプログラムを見てみましょう。

use_array.rb

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
colors = ["red", "blue", "green", "orange", "pink", "light blue", "purple"]

puts numbers[0]
puts numbers[4]

puts colors[1]
puts colors[5]

ターミナル

$ ruby use_array.rb
1
5
blue
light blue

配列の作り方は[]で囲んだものの中に要素をカンマ,区切りで書いていきます。配列の要素を取りだすときは配列名[取り出す要素の位置の数値]で取り出します。このとき注意しなくてはいけないのは、配列の順番1からではなく0から数えていきます。なので配列の一番始めの要素を取り出したいときは配列名[0]で取り出します。

あとから配列の要素を追加することもできます。配列[要素を追加したい位置] = 追加したい値で配列に値を追加することができます。

add_array_element.rb

arr = []

puts arr
arr[0] = "M"
arr[1] = "M"
arr[2] = "A"

puts arr

ターミナル

$ ruby add_array_element.rb
M
M
A

また、配列の要素の数(大きさ)を知りたいときはsizeというメソッドを使います。sizeは配列についてのメソッドなので配列.sizeというように使います。

array_size.rb

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
colors = ["red", "blue", "green", "orange", "pink", "light blue", "purple"]

puts "numbers size is"
puts numbers.size

puts "colors size is"
puts colors.size

ターミナル

$ ruby array_size.rb
numbers size is
10
colors size is
7

さて、この配列をgrade.rbを改良してみましょう。今までは1人分の名前と成績しか判定していませんでしたが、 3人の名前と成績を管理するようにしてみましょう。

grade.rb

names = []
scores = []

puts "Please input 1st person name."
names[0] = gets.chomp
puts "Please input 1st person test score."
scores[0] = gets.chomp.to_i

puts "Please input 2nd person name."
names[1] = gets.chomp
puts "Please input 2nd person test score."
scores[1] = gets.chomp.to_i

puts "Please input 3rd person name."
names[2] = gets.chomp
puts "Please input 3rd person test score."
scores[2] = gets.chomp.to_i

puts names[0] + "'s Grade is ..."
if scores[0] >= 90
  puts "秀"
elsif scores[0] >= 80
  puts "優"
elsif scores[0] >= 70
  puts "良"
elsif scores[0] >= 60
  puts "可"
else
  puts "不可"
end

puts names[1] + "'s Grade is ..."
if scores[1] >= 90
  puts "秀"
elsif scores[1] >= 80
  puts "優"
elsif scores[1] >= 70
  puts "良"
elsif scores[1] >= 60
  puts "可"
else
  puts "不可"
end

puts names[2] + "'s Grade is ..."
if scores[2] >= 90
  puts "秀"
elsif scores[2] >= 80
  puts "優"
elsif scores[2] >= 70
  puts "良"
elsif scores[2] >= 60
  puts "可"
else
  puts "不可"
end

ターミナル

$ ruby grade.rb
Please input 1st person name.
benevolent0505
Please input 1st person test score.
50
Please input 2nd person name.
MMA
Please input 2nd person test score.
100
Please input 3rd person name.
UEC
Please input 3rd person test score.
60
benevolent0505's Grade is ...
不可
MMA's Grade is ...
秀
UEC's Grade is ...
可

これで3人分の名前と成績を表示するプログラムができました。このように配列は複数の値を一つにまとめて扱うことができます。配列も実際のプログラムでは当たり前のように使われるものなので、覚えておくようにしましょう。

whileを使ってgrade.rbを良くする

前の節で、配列を使うことで複数の値をまとめて扱うことができるようになりました。しかし、同じような処理を何度も書いていて読むのも書くのも少し面倒です。同じような処理が何度も続くときに有効な手段の一つとしてwhileなどを使った繰り返し処理があります。

次のプログラムを見てください。このプログラムは、Helloという文字を5回表示するプログラムです。何回目の表示かわかりやすいように、Helloの後ろに回数も表示するようにしています。

use_while.rb

i = 0

while i < 5
  puts "Hello, " + i.to_s
  i = i + 1
end

ターミナル

$ ruby use_while.rb
Hello, 0
Hello, 1
Hello, 2
Hello, 3
Hello, 4

whileは「条件を指定し、その条件が成り立っている間は処理を繰り返す」といったことをします。whileの使い方はスペースを空けてその後に繰り返しの条件を書き、その条件が成り立っている間繰り返してほしい処理をその下に書いていき、処理の終わりになったらendを書きます。ここでは、繰り返しの条件がi < 5、この条件が成り立っている間に繰り返してほしい処理がputs "Hello, " + i.to_si = i + 1になります。

use_while.rbのプログラムの実行される流れを追っていきましょう。まず一行目で変数i0を代入しています。そして3行目のwhileから繰り返しの記述が始まります。繰り返しの条件であるi < 5iの値が0なので、0 < 5という意味になります。この条件は成り立っているため、繰り返しの処理に入ります。

繰り返し処理の中身である4行目で"Hello, " + i.to_sと表示し、5行目で変数ii1を足した値を代入します。今i0なので0 + 1iに代入することになり、iの値は1になります。i = i + 1という書き方は今まで見たことがない書き方だと思いますし、もしかしたら数学のイメージが強くて、違和感を感じるかもしれません。馴染みにくい書き方ですが、変数は値に名前を付けただけのものなので、右辺のi0を指しているもの、左辺のiは新しい値が代入されるiと考えるといいと思います。

繰り返し処理の中身が終わりendのところまで来るとwhileはまた繰り返しの条件をみます。今i1なので条件は1 < 5という意味になります。この条件は成り立っているので、また繰り返しの処理に入ります。

あとは言葉通り繰り返し処理の中身が繰り返されます。さっきの流れと違う点はiの値が次は2になることです。

繰り返し処理がどんどん実行されて、iの値が5になると条件は5 < 5となり、条件が成り立たなくなります。そうするとwhileは繰り返し処理の中身を実行せず、プログラムはwhileの後の記述を実行していきます(このプログラムではwhileの後には何も記述されていないので、このプログラムはここで終わります)。

このようにwhileは繰り返しの条件を変数で指定し、その変数の値を繰り返される処理の中身で更新していき、一定の条件になると繰り返し処理が終わるという書き方をします。繰り返し処理は、始めは処理の流れがよくわからず混乱しますが、一行一行処理を追っていき、整理をしていくと分かるようになります。また紙に処理を書き出してみて理解することもいいかもしれません。

さて、whileを使うことでgrade.rbのプログラムの見通しがかなりよくなります。whileを使って書き直したプログラムを見てみましょう。

grade.rb

names = []
scores = []
i = 0
j = 0

while i < 3
  puts "Please input person " + (i + 1).to_s + " name."
  names[i] = gets.chomp
  puts "Please input person " + (i + 1).to_s + " test score."
  scores[i] = gets.chomp.to_i

  i = i + 1
end

while j < 3
  puts names[j] + "'s Grade is ..."
  if scores[j] >= 90
    puts "秀"
  elsif scores[j] >= 80
    puts "優"
  elsif scores[j] >= 70
    puts "良"
  elsif scores[j] >= 60
    puts "可"
  else
    puts "不可"
  end

  j = j + 1
end

ターミナル

$ ruby grade.rb
Please input person 1 name.
benevolent0505
Please input person 1 test score.
100
Please input person 2 name.
MMA
Please input person 2 test score.
90
Please input person 3 name.
UEC
Please input person 3 test score.
50
benevolent0505's Grade is ...
秀
MMA's Grade is ...
秀
UEC's Grade is ...
不可

whileを使うことでgrade.rbの見通しがかなり良くなりました。grade.rbでも使われているように、繰り返し処理は配列と一緒に用いるととても相性がいいです。実際のプログラムでも繰り返し処理と配列は同時に使われることが多いです。この2つが組み合わさると慣れていない人にとってはプログラムが複雑に見えてしまうかもしれませんが、一つづつ処理を追っていけば理解できるので慣れていくようにしましょう。

これまで覚えたことで練習問題を幾つか解いてみる

ではここに書いてある内容で練習問題のプログラムを作成していきましょう。

3つの数を入力させて、それを足し算した結果を表示するプログラム

まずはどのような動作をするのかを見ていきましょう。

ターミナル

$ ruby input_three_num.rb
1
2
3
a = 1, b = 2, c = 3
a + b + c = 6

このプログラムでは3つの数を受け取って、その数を足し合せた数を表示します。

まずは3つの数の入力を受け取り、それを表示する部分までを作ってみましょう。ユーザからの入力を受け取るのgetsメソッドを使いました。そして、そこで受け取った値は変数というものに代入しました。文字や数値を表示するのにputsメソッドを使いました。これらを組み合せて作ってみましょう。

input_three_num.rb

a = gets.chomp.to_i
b = gets.chomp.to_i
c = gets.chomp.to_i

puts "a = " + a.to_s + ", b = " + b.to_s + ", c = " + c.to_s

ターミナル

$ ruby input_three_num.rb
1
2
3
a = 1, b = 2, c = 3

getsで取得した文字列の最後には改行文字が含まれているため、それを取り除くためにchompメソッドを使いました。またgetsは文字列を取得するので入力された数字(文字列)を数値に変換する必要があります。それをしてくれるメソッドがto_iでした。

では次に取得した値の足し算をしてみましょう。足し算をするには+演算子を使いました。
input_three_num.rb

a = gets.chomp.to_i
b = gets.chomp.to_i
c = gets.chomp.to_i

puts "a = " + a.to_s + ", b = " + b.to_s + ", c = " + c.to_s

ans = a + b + c
puts "a + b + c = " + ans.to_s

ターミナル

$ ruby input_three_num.rb
1
2
3
a = 1, b = 2, c = 3
a + b + c = 6

各変数に代入した値を+演算子を使って足し合せています。またプログラムの見通しを良くするために、計算した結果を変数に代入しています。最後にputsを使って計算結果を表示しています。

文字列と整数を入力させて、文字列を指定された整数回繰りかえして表示するプログラム

  • 文字列と数値の入力を受け取ろう
  • whileの繰り返しを書いてみよう
  • 繰り返しの条件を考えてみよう
  • whileの中の処理を考えてみよう

西暦の値が与えられた時、閏年かどうかを判定するプログラム。閏年の条件は次の3つになります。

  • 西暦の入力を受け取ろう
  • 条件について考えてみよう
  • 条件分岐を書いてみよう

最後に

これまでのことでプログラムを書く流れをなんとなく理解できたかと思います。もしこれまでの内容でわからないところがあれば質問をしてください。

一通り理解することができたら、Rubyの基本的な文法の方を読むようにしてください。ここに書いてある内容よりも複雑なことが書いてありますが、ここまで理解できたならわかるはずです。それに基本的な文法以降の内容はRubyの基本的な文法の内容を理解できていることを前提の内容を書くつもりです。先に進む前にこの内容をおさえておくようにしてください。

また練習問題についてですが、ここに書いてある内容だけで全てを解けるようにはしてありますが、Rubyの基本的な文法の内容を使うと、もっと見通しがよくかけると思います。

benevolent0505/ProgrammingSeminar2016/basic-grammar-summary (last edited 2016-06-21 07:06:14 by benevolent0505)