- 定数
プログラムによって数値や文字を扱う際に,変数と言う概念を避けて通ることは
出来ません.簡単な四則演算を行なう例を次に示してみます.これは,1,2,
3...
と連続する整数の和を求める公式を用いて計算したものです.ここでは,100まで
の整数の和を求めるものとしてみましょう.
用いている公式は良く知っている Σnk=1k = n (n
+ 1) / 2 です.四則演算は,* がかけ算,/ は割算で,
和と差は通常の + , - を使用します.また,先週学習した
出力命令の puts はその引数に上のような「式」を用いることが可能
です.
スクリプトの実行は,ターミナルで行ないます.先週の内容を参考にしてくださ
い.
このとき,求める和を1から1000までに変更するとします.スクリプトは次のよ
うに修正されなければなりません.
合計2箇所の修正でした.2箇所くらいならばそんなに大きな問題ではないですね.
でも,注意して修正しないと,もし,どちらか一方の修正を忘れてしまうと正し
い結果が得られません.
今度は,1から100までの連続する整数の和,連続する奇数の和,連続する偶数の
和の3つを一度に求めてみましょう.すなわち,1+2+3+ ... +100, 1+3+5+
... +99, 2+4+6+ ... +100 ですね.
puts 100 * 101 / 2
puts 100 * 100 / 4
puts 100 / 2 * ( 100 / 2 + 1)
|
公式をそれぞれ参考にしていますが,注意することは四則演算と同様に,計算の
優先順位が( )により指定できることです.通常の数式と同じような扱いが出来
るようになっています.
さて,このような場合にやはり求める上限の数を1000に変更すると,今度は6箇
所の修正が必要になります.これよりも長いスクリプトになるとさらに大変なこ
とになるのは予想できるでしょう.そうなると,手作業で1つひとつ修正を加え
て行くことはミスを生じる原因になってしまいます.そのため,このように頻繁
に扱う数に名前を付けておくと楽になります.数に名前を付けておくことは,そ
の数を名前を持った「定数」として扱うことになります.
Rubyでは定数は大文字で名前を始める約束があります.上のスクリプトを定数を
使用して修正してみましょう.
N = 100
puts N * (N + 1) / 2
puts N * N / 4
puts N / 2 * ( N / 2 + 1)
|
こうしておくと,求める数の範囲を変更するときには,Nの値を決めている1行目
を修正するだけです.
ここでは,Nとして偶数を使用することが前提ですので,注意して下さい.Nが奇
数になると,表現を変える必要があります.
上のスクリプトで,注意することは1行目に出て来た = の記号です.
これは,数学では「等号」を意味しますが,一般的に計算機言語では「代入」と
して扱われます.代入は等号とは機能が違います.
- 代入
代入は,右辺にあるものの「値」を左辺にある「入れ物」に代入する,と言うこと
です.値とは数値である必要もありません.
STR = "Hello, world!"
puts STR
|
としてみると分かるように,先週行なった文字列も定数の「値」として代入でき
ます.さらに言うと,文字列には和の操作を行なうことも出来ます.次の例を試
して下さい.
STR = "ABCDEFG"
puts STR + "HIJKLMN"
|
定数の「数」というのは別に数値を示すものではなく,値を持つものであれば何
でも良いことになっています.数や文字列だけでありません.
- 変数
定数とは値の定まった数ですので,変更を加えることは出来ません.次のような
スクリプトではエラーが出て来ます.
#constant.rb
A = 1
A = 2
puts A
|
結果は以下のように表示されることでしょう.
constant.rb:2: warning: already initialized constant A
2
|
結果としてちゃんと2は表示されていますが,その前にエラーメッセージがあり
ます.「既に初期化されている定数A」と表示されています.ですので,定数と
して利用するのなら,上のように途中で値が変わるような操作は行なってはいけ
ません.また,最初に値を代入することを「初期化」と呼びます.
実際の処理では定数よりも「変数」の方を良く使用することになります.考え方
としては上述のような数学の定数的なものですが,値を途中で変更することが可
能なので「変数」となります.名前は英文字の小文字で始めるよう決められてい
ます.名前の途中で数字が出て来ても構いませんが,四則演算などの処理と区別するた
めに記号は使えないものがあります.変な名前は付けないようにしましょう.上
の定数の例を変数を用いて書き直してみます.
a には最初1が代入されますが,その後ですぐに2が代入されます.そ
こで,結果は2が表示されることになります.スクリプトで最後に代入
された値が保持される仕組になっています.
- 代入と等号の違い
代入操作は等号と違い,右辺の値を左辺に代入する決まりです.その結果は次の
ようなスクリプトで確認できるでしょう.
a = 1
b = 2
a = b
puts a, b
|
このスクリプトの3行目は数学的には成り立ちません.しかし,プログラム言語
ではただの代入操作なのでエラーではありません.また,3行目の右辺と左辺を
入れ換えたものも見て下さい.
a = 1
b = 2
b = a
puts a, b
|
どちらの値を代入するのかで結果は異なります.操作にはその点に注意が必要で
す.
もう一つ代入操作特有のスクリプトを見てみましょう.行なうのは,変数の値の
入れ換えです.次のスクリプトを見て下さい.
a = 1
b = 2
c = a
a = b
b = c
puts a, b
|
3番目から5番目の式は,数学では3つの変数がすべて等しいという意味ですが,代入操
作なので順に値を移しています.最初に,a の値を c とい
う変数にいったん格納し,b の値を a に移したら,もとも
との a の値が入っている c を b に移して,結局
値の入れ換えが行なわれています.
- 出力形式
ここまで,結果を puts で表示する例を試して来ました.結果は数値
か文字列になっていましたが,何の値を表示しているのか,もっと分かりやすく
表示することが出来ると助かります.そこで,上のスクリプトを次のように改良
してみましょう.
a = 1
b = 2
b = a
puts "a = ", a, "b = ", b
|
結果は自分で試してみて下さい.少しは分かりやすくなるかも知れませんが,
puts を使うと,勝手に改行が入ってしまうので,必要な情報
を1行にまとめることが出来ません.そこで,print に変更し
てみましょう.
a = 1
b = 2
b = a
print "a = ", a, "\n", "b = ", b, "\n"
|
ずいぶんとすっきり表示されたことでしょう.このように結果を成形して表示す
るには puts は適していません.なるべく早く print にな
れる必要があります.また,上記の引数はカンマで区切られていること,二重引
用符で囲まれた文字列はそのまま表示されていること,変数に関しては値が表示
されていること,に注意して下さい.この決まりを守って行けば自由な形式で結
果の表示が可能になります.
- べき乗を含む四則演算
基本的な計算方法は理解できていると思いますので,べき乗を含む場合について
どの
ようになるのか見てみましょう.次の例は,関数 f(x) =
2 x2 + 3 x + 1 のx = 5
のときの値を計算するものです.
x = 5
a = 2 * x * x
b = 3 * x
f = a + b + 1
print "f(", x, ") = ", f, "\n"
|
1行目のxの値を変えれば他の場合についての計算も容易に出来ることは
分かるでしょう.また,各次数の項を一度変数として計算した後にあらかじめ和
を求め,出力行が簡単にな
るように変更しています.
上の例ではxの2乗の項は2回かけることにより実現していますが,通常
計算機のプログラムではべき乗よりも単純に掛け合わせる方が速度が早いことが
多いのでこのようにしています.4乗以上では記述が面倒なので専用の記号を使
うことになるでしょう.例えば,先ほどの関数の第1項の次数を4に上げると次の
ように修正を加えることになります.
x = 5
a = 2 * x ** 4
b = 3 * x
f = a + b + 1
print "f(", x, ") = ", f, "\n"
|
べき乗の記号は言語に依存することが良くありますので,他の言語を利用する場
合には注意して下さい.これは,あくまで,Rubyでの記述法です.
- 剰余
四則演算に加えてプログラミングで重要な概念に剰余があります.すなわち,割
算の余りです.これは,演算記号 % で使用します.次の例は31を7で
割った余りを求めています.
剰余の利用法は循環的に繰り返される作業において行なわれますが,詳細は後日
行なうことにします.
- 数値の型
ここまで,数値に関しては整数のみを扱って来ました.計算機では数値は一般に
整数型と実数型に分類されます.これは,小数点を含む計算の実行には基本的に
時間がかかるので,小数部分が不要な計算では数値を整数として取り扱う方が楽
になるからです.そのため,割算を行なった場合には注意が必要です.
計算結果を確認してみましょう.
C言語のように変数を定義するときに型も併せて定義するタイプの言語もありま
すが,Rubyでは型は自動的に決まります.すなわち,整数で表記すれば整数にな
りますし,小数点以下の表示をつければ実数になります.四則演算では,実数を
含む演算はすべて実数になります.以下のような例で試してみて下さい.
puts 1.0 / 3
puts 1 / 3.0
puts 1.0 / 3.0
puts 1 + 2.0
puts 2 * 2.0
|
計算を行なうときに,うっかり整数型の演算を実行してしまうと答えが変わって
来ることがありますので,注意しましょう.
- printf
最後の方のスクリプトで f(5) = というのを表示させるために結構面
倒な引数の並びを作りました.これはこれでまた不便です.そのような処理のた
めにフォーマット付き出力命令の printf があります.これは指定さ
れた仮変数部分に後置された変数の値を入れて表示するものです.仮変数は表1
のような形式のものが使われます.
表1 printf で使用する仮変数 (仮引数)
%s | 文字列 |
%d | 整数型の数値 |
%f | 実数型の数値 |
%e | 指数表現の数値 |
この printf を使って書き直してみます.
x = 5
a = 2 * x ** 4
b = 3 * x
f = a + b + 1
printf "f(%d) = %d\n", x, f
|
printf を使うと,二重引用符の対が一つですんでいます.すなわち,
表示したい文字列を一通り記述して,仮引数で置いている部分に後に書いて
ある変数の値が入れられているのです.仮引数の順番と変数の順番が対応して
いないとエラーになってしまいますので,注意して下さい.図1に対応関係を示
しておきます.
図1 printf 文の構文
最後により複雑な例を示しておきます.
str = "r"
r = 5
pi = 3.14159
s = pi * r * r
printf "The area of the circle with radius"
printf " %s=%d becomes %f.\n", str, r, s
|
対応関係について良く見ておいて下さい.また,%f の部分を
%1.2f のように変更すると,小数点以下の表示を2桁に指定することが出来ます.
小数点以下を3桁に変えるには %1.3f になります.