roy > naoya > 基礎プログラミングI·情報検索 > (3)演算子・制御構造[1]
前回getsメソッドやprintメソッド、printfメソッドを組み合わせたプログラムを作成した。これらを組み合わせるだけでも、ユーザからの入力に応じて計算を行い結果を表示するプログラムを作成することができたが、これだけではまだ物足りない。また、これまでに学んだことだけでは表現しきれないことがいくつかあった。今回は、以下の2つの問題に焦点を絞って話を進める。
+や−、×、÷などの記号を演算子とよぶ。いくつかの演算子はキーボードに存在しないため、日常的に使用する演算子とは異なる演算子を使用する場合がある。
これらを組み合わせた例を見てみよう。
演算子の記法のまとめ
以下の式をRubyの記法にしたがって記述しよう。
制限時間は10分。できる範囲で実施し、制限時間内にメールで解答を送信すること。出席点は2点。提出要領は下記の通り。
Tips:emacsでの日本語入力のオンオフはCtrl-oです
Tips:Mewによるメールの送り方はMewコマンドを参照
プログラムは上から順番に実行される。通常はこれで問題ないが、場合によっては困ることもある。いくつか例をあげてみよう。
これらの例を図式的に(フローチャート)で表現すると以下のようになる。◇の箇所で条件を満たしているかどうか判定が行われ、満たしている場合と満たしていない場合では異なる動作を行っている。
プログラムでこれを表現する場合、プログラムでは左右に分けて書くことができないので、上下に分割して書く。
正解している場合 正解です!と表示 そうでない場合 不正解です!と表示
プログラムは上から進んでくるが、この部分では条件に応じて「正解です!」が表示されたり「不正解です!」が表示されたりする。順番に1行ずつ実行されて両方のメッセージが表示されることはない。
通常は上から順に実行するプログラムの流れを変更する構造を制御構造という。制御構造には条件判断と繰り返しがある。今回は条件判断を取り上げ、次回繰り返しを行う。
制御構造のまとめ
条件判断の代表格となるのがif-then-elsif-else-endである。if-endとかif文と呼ぶこともあるが全て同じものである。
if文の基本構造を先ほどの日本語で書いた条件分岐の例と対比させながら確認してみよう
正解している場合 正解です!と表示 そうでない場合 不正解です!と表示
if 条件A then #=>条件Aを満たせば(thenは省略可) 処理A #=>処理Aを実施する else #=>条件Aを満たさない場合は 処理B #=>処理Bを実施する end
「正解している場合」に対応するのが「if 条件A then」となる。ifの横に具体的に条件を書く。「そうでない場合」は「else」と表現する。最後にはendがついている。endをつけ忘れるとプログラムが動かない。この構造を把握するために、以下のプログラムをif.rbという名称で保存し、実行してみよう。
#!/usr/koeki/bin/ruby print"問題です。\n" print"28の約数の和は28になる。\n" print"Yesの場合は1を、Noの場合は2を入力\n" answer = gets.chomp!.to_i if answer == 1 print"正解です!\n" else print"不正解です!\n" end
ifの横には「answer == 1」という条件が書かれている。==は右辺と左辺が等しいという意味である。つまり条件は「answer(に代入されている値)が1である」ということになる。このプログラムの実行結果を以下に示す。正解した場合と不正解の場合いずれも示すので、各自で実行した際に同じ結果となるか確認してみよう。
irsv{c10xxxx}% ruby if.rb[Return] 問題です。 28の約数の和は28になる。 Yesの場合は1を、Noの場合は2を入力 1[Return] 正解です!
irsv{c10xxxx}% ruby if.rb[Return] 問題です。 28の約数の和は28になる。 Yesの場合は1を、Noの場合は2を入力 2[Return] 不正解です!
次はもう少し複雑なケースを考えてみよう。以下は80点以上ならA、60点以上ならB、60点未満ならCと表示するという状況をフローチャートで表現したものである。1つ目の◇で80点以上という条件を満たしているか判定が行われ、満たさない場合は2回目の◇で60点以上という条件を満たしているかどうか調べている。
このように2つの条件がある場合、if文ではどのように書くのだろうか。このフローチャートをプログラムで表現したものが以下(hantei.rb)である。
#!/usr/koeki/bin/ruby print"得点を入力してください\n" score = gets.chomp!.to_i if score >= 80 #=>1つ目の条件を記載 print"A評価です\n" #=>1つ目の条件を満たす場合に実施 elsif score >= 60 #=>1つ目の条件を満たさない場合2つ目の条件を満たすか判定 print"B評価です\n" #=>2つ目の条件を満たす場合に実施 else #=>いずれも満たさない場合は print"C評価です\n" #=>これを実施する end
2つ目の条件を記載するためにelsifが登場している。ifの横に記載された1つ目の条件を満たすか否かがまず判定され、満たした場合にはその下に書かれた処理が実行される。満たさない場合にはelsifの行で2つ目の条件を満たすかどうか判定が行われ、満たす場合はその下の処理、満たさない場合はelse以下の処理が行われる。最後には必ずendがつく。
なお、ifの行やelsifの行で登場している「>=」は≧と同じ意味である。キーボードには≧のキーはないので、≧のかわりに「>=」としている。
条件が3つ以上になった場合はelsifを何度も使用して記述する。これについて詳細はif文の補足ページを参照のこと。
if文のまとめ
if 条件A then 処理A elsif 条件B 処理B else 処理C end
if文以外の条件判断の表現方法として、unless文やcase文がある。授業では詳しく取り上げないが知っていると便利なこともある。詳細は条件判断の補足ページを参照のこと。
+や×などの計算に用いる記号を演算子と呼ぶことは説明したが、演算子は用途に応じて3つの区分がある。すなわち算術演算子、代入演算子、論理演算子である。
加算 (+)・減算 (−)・乗算 (×)・除算 (÷) 等を指す。前述の通り、数学で用いる記号とは異なる場合がある。
算術演算子 | 意味 | 例 |
---|---|---|
+ | 加算 | 2+5(2に5を加える) |
- | 減算 | 6-3(6から3を減じる) |
* | 乗算 | 9*2(9に2をかける) |
/ | 除算 | 12/4(12を4で割る) |
% | 剰余 | 9%2(9を2で割った余り) |
** | べき乗 | 2**8(2を8乗する) |
算数・数学と同様、演算子には優先順位がある。
したがって、1+2*3は2*3が先に行われ7に、3*2**3は2**3が先に行われ24になる。ただし(括弧)があれば、先に括弧内が計算される。(1+2)*3は9に(3*2)**3は216となる。
算術演算子のまとめ
Rubyでは=は右辺と左辺が等しいという意味ではなく、左辺に右辺を代入するという意味になる。変数に値を代入する際に利用するのが代入演算子である。算術演算子と=を組み合わせることで様々な働きを持たせることができる。例えば+=は左辺に右辺を加算するという意味になる。
data = 10 というように初期値10が与えられていた場合、data += 5とすると、10に5が加算され15となる。
代入演算子 | 意味 | 例 |
---|---|---|
= | 通常代入 | z=10(zに10を代入する) |
+= | 加算代入 | z+=10(zの現在の値に10を加算する) |
-= | 減算代入 | z-=10(zの現在の値から10を引く) |
*= | 乗算代入 | z*=5(zの現在の値を5倍する) |
/= | 除算代入 | z/=10(zの現在の値を1/10にする) |
%= | 剰余代入 | z%=5(zの現在の値を5で割った余りを新しいzとする) |
**= | べき乗代入 | z**=5(zの現在の値を5乗した値を新しいzとする) |
以下のプログラムは変数xに初期値として0を与え、その後代入演算子を用いて様々な値を代入していきながらprintfでx内の値がどのように変化していくかを確認するものである(assign.rb)。
#!/usr/koeki/bin/ruby x = 0 printf("xの値は%dです\n",x) x = 10 printf("xの値は%dです\n",x) x += 5 printf("xの値は%dです\n",x) x *= 2 printf("xの値は%dです\n",x) x %= 4 printf("xの値は%dです\n",x)
このプログラムを実行すると以下の結果が得られる。
irsv{c10xxxx}% ruby assign.rb[Return] xの値は0です xの値は10です xの値は15です xの値は30です xの値は2です
代入演算子のまとめ
if文において条件を記述する際に==や>=が登場したが、これらは右辺と左辺を比較するために利用していた。このように条件を記載するときに用いるのが論理演算子である。「以上」「以下」といった表現に加え、複数の条件を指定する際の「かつ」(論理積)や「または」(論理和)などもある。
論理演算子 | 意味 |
---|---|
== | 左辺と右辺が等しい |
< | 左辺が右辺よりも小さい |
<= | 左辺が右辺以下 |
> | 左辺が右辺よりも大きい |
>= | 左辺が右辺以上 |
&& | かつ(論理積) |
|| | または(論理和) |
! | 否定 |
not | 否定 |
if x >= 1 #->xが1以上であれば x -= 1 #->xから1を引く end
if x >= 1 && x <= 10 #->xが1以上かつ10以下であれば x += 1 #->xに1を加える end
if x > 1 || x < 10 #->xが1より大きい、またはxが10未満であれば x *= 2 #->xを2倍する end
if !(x <= 1 && x >= 10) #->1以下または10以上でなければ x -= 4 #->xから4を引く end
論理演算子のまとめ
コメントとは、プログラム中に記述する注釈であり、作者名を残したり、説明を行うために使用する。プログラム中に書かれていても、プログラムとして認識されることはないので、実行する上では特に問題は無い。他人の書いたプログラムはわかりづらいと言われることが多いが、わかりやすさの向上を目指すためにコメントを利用することが望ましい。
コメントをあらわす記号は「#」である。プログラム中に「#」があると、その行の「#」以降の記述はコメントとして扱われる(代入演算や論理演算の項で示したサンプルのプログラムを参照のこと)。行の先頭に「#」があれば、1行全てがコメントになる。
前回の授業で自分で作成したプログラムは、キーボードからの入力を受け取り、何らかの計算をした結果を出力するものであったが、今度はさらに条件判断を追加してみよう(kadai1.rb)(8点満点)。
つまり、キーボードからの入力を受け取り、(何らかの計算を行い、)その結果の値に応じて異なるメッセージを表示できるようにする。
例えば、
などが考えられる。他の人とテーマが重複しないように面白いテーマを考えてプログラムを作成してみよう。キーボードから2つ以上の数字を入力させる、数多くの演算子を使用する、条件判断における条件数を複数にするなどの工夫が行われいるプログラムは得点が高くなる。作成したプログラム、実行結果、プログラムの説明をメールに記載して送信する。
Tips:emacsでの日本語入力のオンオフはCtrl-oです
Tips:ktermでのプログラムの実行結果をメールに貼り付けるには、コピーしたい箇所をマウスで選択し、emacs(Mew)上でマウスの真ん中ボタンをクリックする
Tips:Mewによるメールの送り方はMewコマンドを参照