(3) 5/1の授業内容:演算子

前回のプログラム

次のような問題を想定する。

△△銀行に普通預金で10万円預けました。利率は0.1%です。お金の出し入れをしない場合、残高が11万円になるのは何年後でしょうか。

#!/usr/koeki/bin/ruby

deposit = 100000
goal = 110000
rate = 1.001
y=0
while deposit <= goal
    deposit *= rate
    y += 1
    printf ("%3d年後\t%d円\n", y, deposit)
end

このプログラム(deposit.rb)を実行すると、以下のような結果が表示される。

irsv{naoya}% ruby deposit.rb[Return]
  1年後 100099円
  2年後 100200円
  3年後 100300円
  4年後 100400円
  5年後 100501円
  6年後 100601円
  7年後 100702円
  8年後 100802円
  9年後 100903円
 10年後 101004円
 11年後 101105円
 12年後 101206円
 (中略)
 95年後 109960円
 96年後 110070円

プログラムを日本語に置き換えて説明したものを前回の授業で提示した。これはプログラムの概要を把握する上では役に立つ情報であるが、これだけでは自分でプログラムを作成することは難しい。例えばプログラム中の=は右辺を左辺に代入するという意味を持つ。右辺と左辺は等しいという意味ではない。また、<=は「〜以下」をあらわす。一般的には不等号の下に等号を記載するが、キーボードから入力する場合にはそのような記号はない。このため<=で代用しているのである。=や-、+、>などを総称して演算子と呼ぶ。今回は演算子の働きと、Rubyにおける記法についてみていこう。

Rubyプログラミングにおける記法

プログラミングを行う場合、日常的に使用する演算子とは異なる演算子を使用する場合がある。例を挙げて説明しよう。

  • 乗算(掛け算)は×ではなく*を使用する(例:2×5→2*5)。
  • 除算(割り算)は÷ではなく/を使用する(例:20÷4→20/4)。
  • べき乗はabではなく**を使用する(例:25→2**5)。
  • {中括弧}や[大括弧]は使用せず全て(小括弧)で記述する(例:{4*(8+1)}→(4*(8+1)))。
  • 分数では分母と分子を上下に記述するのではなく1行で記述する。

これらを組み合わせた例を見てみよう。

分数を1行で書き表す

出席課題

以下の式をRubyの記法にしたがって記述しよう。

  • a × b + c ÷ d
  • (x - y)2
  • [1-{(a - 6)×(a - 4)}2]÷ 2

制限時間は10分。できる範囲で実施し、制限時間内にメールで解答を送信すること。出席点は2点。提出要領は下記の通り。

  • 提出先:naoya@e.koeki-u.ac.jp
  • メールのSubject:学籍番号-ruby03
  • 本文の構成:1行目で学籍番号、氏名を記載する。2行目以降に解答を書く。

Tips:emacsでの日本語入力のオンオフはCtrl-oです

Tips:Mewによるメールの送り方はMewコマンドを参照

Rubyで利用できる演算(1):算術演算子

加算 (+)・減算 (−)・乗算 (×)・除算 (÷) 等を指す。前述の通り、数学で用いる記号とは異なる場合があるので注意が必要である。

算術演算子 意味
+ 加算2+5(2に5を加える)
- 減算6-3(6から3を減じる)
* 乗算9*2(9に2をかける)
/ 除算12/4(12を4で割る)
% 剰余9%2(9を2で割った余り)
** べき乗2**8(2を8乗する)

Rubyで利用できる演算(2):代入演算

Rubyでは=は右辺と左辺が等しいという意味ではなく、左辺に右辺を代入するという意味になる。算術演算子と=を組み合わせることで様々な働きを持たせることができる。

代入演算子 意味
= 通常代入z=10(zに10を代入する)
+= 加算代入z+=10(zの現在の値に10を加算した値を新しいzとする)
-= 減算代入z-=10(zの現在の値から10を引いた値を新しいzとする)
*= 乗算代入z*=5(zの現在の値を5倍した値を新しいzとする)
/= 除算代入z/=10(zの現在の値を1/10にした値を新しいzとする)
%= 剰余代入z%=5(zの現在の値を5で割った余りを新しいzとする)
**= べき乗代入z**=5(zの現在の値を5乗した値を新しいzとする)
x = 0
printf ("xの値は%dです\n",x)  #=> xの値は0です
x = 10
printf ("xの値は%dです\n",x)  #=> xの値は10です
x += 5
printf ("xの値は%dです\n",x)  #=> xの値は15です
x *= 2
printf ("xの値は%dです\n",x)  #=> xの値は30です
x %= 4
printf ("xの値は%dです\n",x)  #=> xの値は2です

Rubyで利用できる演算(3):論理演算

前回のサンプルプログラムでは、「while deposit <= goal」の行で使用していた(変数goalに代入されている値が変数depositに代入されている値以下の場合は以下の処理を繰り返し実施せよ)が、このように繰り返しを行わせる場合や、場合わけを行う上で条件を指定する際に利用するのが論理演算子である。「以上」「以下」といった表現に加え、複数の条件を指定する際の「かつ」(論理積)や「または」(論理和)などもこの演算子に含まれる。

論理演算子 意味
== 左辺と右辺が等しいか
< 左辺が右辺よりも小さいか
<= 左辺が右辺以下か
> 左辺が右辺よりも大きいか
>= 左辺が右辺以上か
&& かつ(論理積)
|| または(論理和)
! 否定
not 否定
while x >= 1  #xが1以上の間はxに1を減算代入する
  x -= 1
end
while x >= 1 && x <= 10  #xが1から10の間にある場合はxに1を加算代入する
  x += 1
end
while x > 1 || x < 10  #xが1未満か10以上の場合はxに2を乗算代入する
  x *= 2
end
while !(x <= 1 && x >= 10)  #xが1以上10以下でない場合はxに4を減算代入する
  x -= 4
end

コメントをつけるとプログラムがわかりやすくなる

コメントとは、プログラム中に記述する注釈であり、作者名を残したり、説明を行うために使用する。プログラム中に書かれていても、プログラムとして認識されることはないので、実行する上では特に問題は無い。他人の書いたプログラムはわかりづらいと言われることが多いが、わかりやすさの向上を目指すためにコメントを利用することが望ましい。

コメントをあらわす記号は「#」である。プログラム中に「#」があると、その行の「#」以降の記述はコメントとして扱われる(代入演算や論理演算の項で示したサンプルのプログラムを参照のこと)。行の先頭に「#」があれば、1行全てがコメントになる。

レポート課題

deposit.rbのように、初期値と終了値、変化の割合が設定されているプログラム(kadai1.rb)を作成する。作成したプログラムや実行結果、プログラムの説明をメールで送信する。

例:人口8000人の村がある。1年に2%ずつ減少するとした場合、 誰もいなくなってしまうのは何年後か

  • 提出先:naoya@e.koeki-u.ac.jp
  • 提出期限:5/14(日)23:59
  • メールのSubject:学籍番号-kadai01
  • 本文の構成:1行目で学籍番号、氏名を記載する。2行目以降は下記の構成とする
  1. 考えた問題文
  2. 作成したプログラム
  3. プログラムの実行結果
  4. プログラムの説明
  5. 感想

  • 採点基準:期限内提出点(2点)、メールの体裁(1点)、プログラムの間違い(2点)、プログラムの説明(3点)
  • 今回は初めての課題提出である。プログラムの説明については、(1)変数名に関して、なぜそのような名称にしたのか、(2)使用した演算子、(3)whileの働き、(4)printfの働きについて詳しく述べること。
  • 説明に関して、文章の意味がわかりづらい場合や、Webページを単にコピー&ペーストしたものは減点することがある。一度読み直してから提出すること。
  • 驚異的に良くできているレポートについては満点の8点を超える得点をつけることがある。
  • よくできていたレポートは、他の人の参考になるよう、本人が特定できないような形で掲載する。掲載してほしくない場合はメールでの課題提出時にその旨記載すること。

Tips:emacsでの日本語入力のオンオフはCtrl-oです

Tips:ktermでのプログラムの実行結果をメールに貼り付けるには、コピーしたい箇所をマウスで選択し、emacs(Mew)上でマウスの真ん中ボタンをクリックする

Tips:Mewによるメールの送り方はMewコマンドを参照