04.四則演算


今回は四則演算に関してのんびーりやっていきます。
出来るだけ今回は丁寧にやっていきたいのです。

あと、これは後日詳しく取り上げますが、
Rubyを習う上で大切なオブジェクト云々に関しては、今はあえて無視してます。

当たり前ですが、Rubyでも四則演算は可能です。
他の言語をされている方であれば、やり方はまったく変わりません。
一応その辺を確かめるため、以下の様なプログラムを組んでみました。

# encoding: utf-8

#変数に値を格納しておきます
a = 10
b = 5

#各計算の結果を変数に格納
addition = a + b       #足し算
subtraction = a - b    #引き算
multiplication= a * b  #掛け算  
division = a / b       #割り算

#出力
print "a = ",a,"\n"
print "b = ",b,"\n"

print "a + b = ",addition,"\n"
print "a - b = ",subtraction,"\n"
print "a * b = ",multiplication,"\n"
print "a / b = ",division,"\n"

そしてこの結果はこちら。
01

まぁあれですわ。初心者の人が気にすべき点は、掛け算と割り算かな。
『✕』ではなく『*』、『÷』ではなく『/』を使います。

そして、これはどちらかというと算数や数学の範疇となりますが、
計算には優先順位というか、計算する順番があります。
①左から右に計算する
②掛け算、割り算を先に計算する
③かっこ”()”がついている計算を最優先で計算する
こんな感じです。

Rubyでもその辺はしっかり踏襲されてまして、
一応それを確認するために、以下の様なプログラムを組んでみました。

# encoding: utf-8

#変数に値を格納しておきます
a = 10
b = 5
c = 2

#基本的に、計算は左から右に行われる
answer_a = a + b + c

#足し算・引き算よりも掛け算、割り算が優先される
answer_b = a + b * c

#かっこ"()"がついた計算が最優先される
answer_c = (a + b) * c

#出力
print "a = ",a,"\n"
print "b = ",b,"\n"
print "c = ",c,"\n\n"

print "a + b + c = ",answer_a,"\n"
print "a + b * c = ",answer_b,"\n"
print "(a + b) * c = ",answer_c,"\n"

そしてその結果がこちら。
02
分かりやすいのはふたつめと3つめの違いですかね。

他にもべき乗や割り算の余りを求める計算なんかも出来ますが、
それはまぁ必要になった時に調べればよいです。

さて、この四則演算なんですが、
これ、文字列でも出来るんですかねぇ……(・∀・)
というわけで、以下のようないじわるプログラムを作ってみました。

# encoding: utf-8

#変数に値を格納しておきます
a = "abc"
b = "def"

#各計算の結果を変数に格納
addition = a + b       #足し算
subtraction = a - b    #引き算
multiplication= a * b  #掛け算  
division = a / b       #割り算


#出力
print "a = ",a,"\n"
print "b = ",b,"\n\n"

print "a + b = ",addition,"\n"
print "a - b = ",subtraction,"\n"
print "a * b = ",multiplication,"\n"
print "a / b = ",division,"\n"

要は
『数じゃなくて文字同士で足したり引いたり掛け算したり割り算したりしてみろや』
という内容のプログラムですが……

結果はこちら。
03
怒られてしまいました(;・∀・)
しかしながら、このエラー文を読むと、
『文字で引き算なんか出来るかボケェエ!!!』とお怒りのご様子。
引き算の段階でキレたようです。
もう少し気長でもいいじゃないか……(;・∀・)

しかし逆にいえば、足し算ならやってくれそうな雰囲気です。
というわけで、以下のようなプログラムを組んでみました。

# encoding: utf-8

#変数に値を格納しておきます
a = "abc"
b = "def"

#各計算の結果を変数に格納
addition = a + b       #足し算

#出力
print "a = ",a,"\n"
print "b = ",b,"\n\n"

print "a + b = ",addition,"\n"

要は足し算だけやってみるプログラムですね。
結果はこちら~。
04
なるほど。連結という形で足し算をやってくれましたね。

では、足し算が数と文字、混在していたらどうなんでしょ?
こんなプログラム書いてみました。

# encoding: utf-8

#変数に値を格納しておきます
a = 10
b = 5
c = "ossan"

#各計算の結果を変数に格納
result_a = a + b + c
result_b = a + (b + c)
result_c = a * (b + c)

#出力
print "a = ",a,"\n"
print "b = ",b,"\n"
print "c = ",c,"\n\n"

print "a + b + c = ",result_a,"\n"
print "a + (b + c) = ",result_b,"\n"
print "a * (b + c) = ",result_c,"\n"

要は『数と文字で足し算掛け算してみろや』というプログラムですが……
結果はこちら。
05
怒られてしまいました(´・ω・`) ごめんなさい……(´・ω・`)
『数と文字で足し算なんか出来るかボケェ!!ヽ(`Д´#)ノ』という意味のエラーのようです。
どうやら数は数同士、文字は文字同士でないと計算してくれないようですね。
PHPなんかはむりくり計算してくれるんですが……まぁそんな機会って中々ないですし。

では、四則演算の決まり事って文字の場合でも守るんですかね?
引き算、掛け算、割り算は出来ないので、
①左から右に計算する③かっこ”()”がついている計算を最優先で計算する
この辺の規則が文字の足し算の時でも適応されるのか、
こんなプログラムを組んでみました。

# encoding: utf-8

#変数に値を格納しておきます
a = "私は_"
b = "おっぱい星人_"
c = "です_"

#各計算の結果を変数に格納
result_a = a + b + c
result_b = a + (b + c)
result_c = b + c + a 

#出力
print "a = ",a,"\n"
print "b = ",b,"\n"
print "c = ",c,"\n\n"

print "a + b + c  = ",result_a,"\n\n"
print "a + (b + c)  = ",result_b,"\n\n"
print "b + c + a  = ",result_c,"\n\n"

演算規則が適応されるのであれば、
『a+(b+c)』と『b+c+a』は同じ結果になるはずですよね。

で、実際に走らせてみたところ……
08
これは意外。『a+b+c』と『a+(b+c)』の結果が同じで、
『b+c+a』の結果だけが違いますね。

これはひょっとすると、文字の加算の場合は、
純粋に並んでる順番に連結されるのかもしれませんねぇ。

というわけで、もう一回、今度は文字列を一個増やして、
もう一度様子を見てみます。

# encoding: utf-8

#変数に値を格納しておきます
a = "私は_"
b = "愚かな_"
c = "おっぱい星人_"
d = "です。"

#各計算の結果を変数に格納
result_a = a + b + c + d
result_b = a + (b + c) + d
result_c = b + c + a + d
result_d = d + c + b + a

#出力
print "a = ",a,"\n"
print "b = ",b,"\n"
print "c = ",c,"\n"
print "d = ",d,"\n\n"

print "a + b + c + d = ",result_a,"\n\n"
print "a + (b + c) + d = ",result_b,"\n\n"
print "b + c + a + d = ",result_c,"\n\n"
print "d + c + b + a = ",result_d,"\n\n"

さて、この結果はこうなりました。
07
なるほど(`・ω・´) 概ね予想通りです(`・ω・´)

単純に考えると、文字列同士の足し算の場合は、
『文字列の右側にどんどん連結していく』という約束みたいですね。
そう考えると、『a+b+c+d』と『a+(b+c)+d』の値が同じなのも納得です。
演算規則通りに『a+(b+c)+d』の計算順序を考えた場合、
まず『b+c(仮にbc)』、次に『a+bc(仮にabc)』次に『abc+d』という感じになりまして、
『a+b+c+d』を順番通りに右にくっつけていくと、
まず『a+b(仮にab)』、次に『ab+c(仮にabc)』、最後に『abc+d』てなりまして、
どちらも連結された結果を見ると『abcd』となりますので。

まぁ記述した順番通りになる程度の軽い気持ちでいいんじゃないでしょうかwww
小難しく考えるよりはその程度の解釈でいいんじゃないですかねぇwww

今回の検証も後半は完全にネタづくりのためでして、
本来ならあまりここまで込み入ったことはやりません(;・∀・)

そんなわけで、次回は論理演算と条件分岐でもやろうかな?