Ruby入門5:Rubyの演算子と数値演算

Ruby入門
CANIT先生
CANIT先生

お二人ともRubyの学習は順調ですか?

牛山くん
牛山くん

毎日、頑張ってます!

猫田さん
猫田さん

がんばってまーす

CANIT先生
CANIT先生

今日はRubyの演算子と数値演算を学んでいきますよ

Ruby:数値の学習

パソコン

正式な用語では数値リテラルといいます。

CANIT先生
CANIT先生

Rubyではいろいろな種類の数が使えますが、今回の講義では整数と浮動小数点数を学んでいきましょう

Rubyでは、整数(integer)と浮動小数点数(小数:float)の他にも16進数2進数8進数有理数複素数が使えると、簡単に覚えておいてください。

整数(integer)

数字
CANIT先生
CANIT先生

まずは整数からです。過去に数学の授業で学んだと思いますが……整数とは、少数点を書かない数字ですね。123、0、-999……これらを整数と言います

そして、以下のものは整数ではありません。

puts 1.2
puts 1.0
puts 1.00
puts ‘123’
puts “123”

プログラムとしては動きますが、1.2、1.0、1.00は小数点以下があるので浮動小数点小数になります。

牛山くん
牛山くん

123は整数ではないんですか?

CANIT先生
CANIT先生

「123」自体は、もちろん整数です。でも……「puts ‘123’」や「puts “123”」と書いた場合、それらは文字列として扱われるんですよ。ちょっとややこしいのですが、Rubyを学ぶ上では避けて通れない考え方の1つです

整数の便利な書き方

Rubyには、整数の便利な書き方として、

puts 1_000_000

があります。このように書くのは、私たちが見慣れている1,00,000の表記が使えないからです。

,(カンマ)を整数の中に入れるとエラーになってしまいます。だから、カンマの代わりに、_(アンダースコア)を使用します。アンダースコアは、どこに入れてもエラーにはなりません。Rubyは何もないように解釈します。

アンダースコアは、人の目で何桁かわかりやすくするために使う

アンダースコアは、人間のための位取りとして使います。「1_000_000」だと、百万だとすぐにわかります。

もっと私たちが見慣れている百万の書き方の1つは「1,000,000」でしょう。でも、

puts 1,000,000

と書くと、整数の中にカンマが入っているので、エラーになってしまいます。

カンマを使いたいんだけれど使えないからアンダースコアを使う。そう、覚えておいてください。

猫田さん
猫田さん

慣れるまで、大変そうですねぇ

小数(float)

MacBook

浮動小数点数には、123.45、1.2e-3などがあります。

猫田さん
猫田さん

1.2e-3なんて見てことない

猫田さんが言うように日常では、ほとんど見ない表記の仕方です。1.2e-3とは、以下のような意味だと知っておいてください。

1.2*10^(-3) = 1.2/(10*10*10) = 0.0012

猫田さん
猫田さん

すごく数学っぽいですねぇ。なんでわざわざ、こんな複雑な書き方をするんだろ?

CANIT先生
CANIT先生

桁が大きくなると一目では何桁か分からなくなるから、この記法が使われているんですよ。数字によっては、むしろわかりやすくなるんです

たとえば……

0.00000000000000123 だったら、1.23*10^(-15) と書きます。

牛山くん
牛山くん

たしかに、この表記のほうがわかりやすいケースも多そうですね

Rubyにおける浮動小数点数のルール

puts .1

は動きません。

puts 0.1

のように書かないといけません。整数部分は省略できないからです。

他のプログラミング言語だと、整数の大きさや小ささに限界があるのですが、Rubyに限界はありません。浮動小数点数に一応の上限値はありますが、プログラム内で変更できるようになっています。

Ruby:演算子の学習

パソコン 犬
CANIT先生
CANIT先生

続いては、演算子について学んでいきましょう

プログラミング言語には 演算子 というコンピュータに対して演算を行わせる記号が用意されています。

Rubyにもいろいろな演算子が用意されていますよ。

四則演算

電卓

数値に対しては演算ができます。まずは整数同士の演算です。加減乗除(足す、引く、掛ける、割る)ができます。

CANIT先生
CANIT先生

足し算・引き算・掛け算・割り算……それぞれは以下のように書きます

puts 8 + 2
puts 8 – 2
puts 8 * 2
puts 8 / 2

CANIT先生
CANIT先生

もちろん、それらの計算式の答えもでます

10
6
16
4

このように出力されます。×と÷は使えません。

牛山くん
牛山くん

×の代わりに「*」、÷の代わりに「/」 をそれぞれ使うんですね

他にもいろいろな計算ができる

他には、剰余(余り)の計算や、べき乗の計算もできます。剰余(余り)の計算は「%」、べき乗の計算は「**」で行います。プログラミング上では、以下のような表記です。

puts 22 % 7
puts 3 ** 4

は、

1
81

と表示されます。

余りの計算

牛山くん
牛山くん

余りの計算ってなんですか?

CANIT先生
CANIT先生

先ほどの「22%7」を例にすると、「22を7で割ったときの余り」を教えてくれます。22を7で割ると答えは、『3余り1』ですよね。その余りの1が表記されるんです

猫田さん
猫田さん

使い道、なさそうだなぁ

CANIT先生
CANIT先生

それが意外とあるんですよ

たとえば、ダース(ひとまとまりが12)での注文を処理するときです。商品が100個注文されたら、以下のような計算が役立ちます。

puts 100 / 12
puts 100 % 12

8
4

こう表示されるので、8パックとバラ4個であるのが分かりますね。

この他にも、薬のシートは10が単位になっていないものがあるので、商と剰余の計算が必要になることは少なくありません。

べき乗の計算

牛山くん
牛山くん

もうひとつの「べき乗」は、どういう計算ですか?

CANIT先生
CANIT先生

これは、何の何乗ってやつです。2の3乗とか、聞いたことあるでしょう。「2かける2かける2」のことですね

先ほど例に出した「3 ** 4」は3の4乗。つまり、「3かける3かける3かける3」なので81という答えになります。

演算子の優先順位

パソコン

普通の算数、数学と同じく乗除(掛け算、割り算)は加減(足し算、引き算)に優先されます。優先順位を変えるにはカッコを使います。

puts 2 + 3 * 4
puts (2 + 3) * 4

の結果は、

14
20

となります。

整数と浮動小数点数との演算の結果

勉強

整数と浮動小数点数の結果は、整数同士の場合だけ整数になります。

CANIT先生
CANIT先生

他にもこんなルールがあります

  • 整数同士以外の演算の結果は浮動小数点数
  • 三つ以上の数値の演算の結果は、一つでも浮動小数点数があると浮動小数点数

すべて整数の場合だけ結果が整数になる、と覚えておけば応用が効きますよ。

puts 2 + 3
puts 2 + 3.1
puts 2.1 + 3
puts 2.1 + 3.1
puts 2 /5 + 3

の計算結果は、

5
5.1
5.1
5.2
3.4

となります。

puts 2 ** (1/ 2.0)

と書くと、

1.4142135623730951

と2の平方根が表示されます。

いろいろなエラー

CANIT先生
CANIT先生

では、今回学んだ内容に関する起こりやすいエラーを紹介しますね

猫田さん
猫田さん

もうすぐ我々が目にする画面かぁ……

CANIT先生
CANIT先生

そうですね(笑) 最初のうちはどうしてもエラーが起きてしまいますからね。大事なのは、何が問題でエラーになってしまったのかを知ることですよ。問題点がわかれば、解決方法もわかります

具体的なエラー例①

zero.rb:1:in /': divided by 0 (ZeroDivisionError) from zero.rb:1:in‘<main>’

和訳してみます。

zero.rb:1:’/’の中:ゼロで割られました(ゼロで割ったエラー)
zero.rb から:1:'<main>’の中で

0(ゼロ)で割ると答えが無限大になります。大半のプログラミング言語では禁止されています。Rubyでもエラーになります。

具体的なエラー例②

unscore1.rb:1:in <main>': undefined local variable or method ‘_111_000’ for main:Object (NameError)

和訳してみます。

unscore1.rb:1:”の中:mainに対して’_111_000’という定義されていないローカル変数かメソッドが現れました:オブジェクト (名前のエラー)

数字の先頭に’_'(アンダースコア)を書いてはいけません。逆に、こんなパターンもあります。

unscore2.rb:1: trailing '_‘in number puts 111_000_

和訳してみます。

unscore2.rb:1: 数字の次に’_’が続いています。

数字の最後が’_'(アンダースコア)で終わってはいけません。

具体的なエラー例③

unscore3.rb:1: trailing `_’ in number
puts 111__222

unscore3.rb:1: syntax error, unexpected local variable or method, expecting end-of-input
puts 111__222

和訳してみます。

unscor3.rb:1:数値の次に’_’が続いています
puts 111__222

unscor3.rb:1:文法エラー、期待されていないローカル変数かメソッドが現れています、入力の終了が期待されています

‘_'(アンダースコア)を二つつなげてはいけません。

具体的なエラー例④

strnum.rb:1:in +': no implicit conversion of Integer into String (TypeError) from strnum.rb:1:in‘<main>’

訳してみます。

strnum.rb:1:’+’の中:strnum.rbから、文字列の中に明示的な数値の変換が行われました:'<main>’の中で

文字列と数値の足し算はできません。ただ文字列同士の足し算はできます。文字列の連結になります。

具体的なエラー例⑤

period.rb:1: no .<digit> floating literal anymore; put 0 before dot
puts .1

和訳してみます。

period.rb:1:.<数字>という書き方はもはや浮動小数点数リテラルではありません;ドットの前に0を書いてください

.1

という書き方はダメです。

0.1

と書きましょう。

今回は演算子と数値演算を学びました

女性
CANIT先生
CANIT先生

はい。というわけで、今回の授業はここまでにします。二人とも、どうでしたか?

牛山くん
牛山くん

今回は、そう難しくなかったです。実は、数学は少し得意なんですよ

猫田さん
猫田さん

こういう内容を見ちゃうと、やっぱりプログラミングは理系のほうが有利な気がしちゃいますねぇ

CANIT先生
CANIT先生

そう思われがちですが、要点を1つずつ抑えていけば、理系でも文系でも大丈夫ですよ。ちなみに猫田さんは、学生の頃の得意科目はなんだったんですか?

猫田さん
猫田さん

んんー 給食ですかねぇ

挫折率が高い??プログラミング学習のポイント
駆け出しエンジニアが一緒に学ぶ
CANITは、Progateやドットインストールで独学している人達同士をつなげます。駆け出しエンジニアのあなたのためのSNSです。
Ruby入門
【この記事を書いた人】
CANIT 先生

あらゆるプログラミング言語をあやつるフリーの凄腕講師。温和な性格で「わかるまで教えます」がモットー。たまに時間ができると動物の仲間達に、プログラミングを教えることもある。現在の生徒は牛山くんと猫田さん。

CANIT
タイトルとURLをコピーしました