お二人ともRubyの学習は順調ですか?
毎日、頑張ってます!
がんばってまーす
今日はRubyの演算子と数値演算を学んでいきますよ
Ruby:数値の学習
正式な用語では数値リテラルといいます。
Rubyではいろいろな種類の数が使えますが、今回の講義では整数と浮動小数点数を学んでいきましょう
Rubyでは、整数(integer)と浮動小数点数(小数:float)の他にも16進数、2進数、8進数、有理数、複素数が使えると、簡単に覚えておいてください。
整数(integer)
まずは整数からです。過去に数学の授業で学んだと思いますが……整数とは、少数点を書かない数字ですね。123、0、-999……これらを整数と言います
そして、以下のものは整数ではありません。
puts 1.2
puts 1.0
puts 1.00
puts ‘123’
puts “123”
プログラムとしては動きますが、1.2、1.0、1.00は小数点以下があるので浮動小数点小数になります。
123は整数ではないんですか?
「123」自体は、もちろん整数です。でも……「puts ‘123’」や「puts “123”」と書いた場合、それらは文字列として扱われるんですよ。ちょっとややこしいのですが、Rubyを学ぶ上では避けて通れない考え方の1つです
整数の便利な書き方
Rubyには、整数の便利な書き方として、
puts 1_000_000
があります。このように書くのは、私たちが見慣れている1,00,000の表記が使えないからです。
アンダースコアは、人の目で何桁かわかりやすくするために使う
アンダースコアは、人間のための位取りとして使います。「1_000_000」だと、百万だとすぐにわかります。
もっと私たちが見慣れている百万の書き方の1つは「1,000,000」でしょう。でも、
puts 1,000,000
と書くと、整数の中にカンマが入っているので、エラーになってしまいます。
カンマを使いたいんだけれど使えないからアンダースコアを使う。そう、覚えておいてください。
慣れるまで、大変そうですねぇ
小数(float)
浮動小数点数には、123.45、1.2e-3などがあります。
1.2e-3なんて見てことない
猫田さんが言うように日常では、ほとんど見ない表記の仕方です。1.2e-3とは、以下のような意味だと知っておいてください。
1.2*10^(-3) = 1.2/(10*10*10) = 0.0012
すごく数学っぽいですねぇ。なんでわざわざ、こんな複雑な書き方をするんだろ?
桁が大きくなると一目では何桁か分からなくなるから、この記法が使われているんですよ。数字によっては、むしろわかりやすくなるんです
たとえば……
0.00000000000000123 だったら、1.23*10^(-15) と書きます。
たしかに、この表記のほうがわかりやすいケースも多そうですね
Rubyにおける浮動小数点数のルール
puts .1
は動きません。
puts 0.1
のように書かないといけません。整数部分は省略できないからです。
他のプログラミング言語だと、整数の大きさや小ささに限界があるのですが、Rubyに限界はありません。浮動小数点数に一応の上限値はありますが、プログラム内で変更できるようになっています。
Ruby:演算子の学習
続いては、演算子について学んでいきましょう
プログラミング言語には 演算子 というコンピュータに対して演算を行わせる記号が用意されています。
Rubyにもいろいろな演算子が用意されていますよ。
四則演算
数値に対しては演算ができます。まずは整数同士の演算です。加減乗除(足す、引く、掛ける、割る)ができます。
足し算・引き算・掛け算・割り算……それぞれは以下のように書きます
puts 8 + 2
puts 8 – 2
puts 8 * 2
puts 8 / 2
もちろん、それらの計算式の答えもでます
10
6
16
4
このように出力されます。×と÷は使えません。
×の代わりに「*」、÷の代わりに「/」 をそれぞれ使うんですね
他にもいろいろな計算ができる
他には、剰余(余り)の計算や、べき乗の計算もできます。剰余(余り)の計算は「%」、べき乗の計算は「**」で行います。プログラミング上では、以下のような表記です。
puts 22 % 7
puts 3 ** 4
は、
1
81
と表示されます。
余りの計算
余りの計算ってなんですか?
先ほどの「22%7」を例にすると、「22を7で割ったときの余り」を教えてくれます。22を7で割ると答えは、『3余り1』ですよね。その余りの1が表記されるんです
使い道、なさそうだなぁ
それが意外とあるんですよ
たとえば、ダース(ひとまとまりが12)での注文を処理するときです。商品が100個注文されたら、以下のような計算が役立ちます。
puts 100 / 12
puts 100 % 12
8
4
こう表示されるので、8パックとバラ4個であるのが分かりますね。
この他にも、薬のシートは10が単位になっていないものがあるので、商と剰余の計算が必要になることは少なくありません。
べき乗の計算
もうひとつの「べき乗」は、どういう計算ですか?
これは、何の何乗ってやつです。2の3乗とか、聞いたことあるでしょう。「2かける2かける2」のことですね
先ほど例に出した「3 ** 4」は3の4乗。つまり、「3かける3かける3かける3」なので81という答えになります。
演算子の優先順位
普通の算数、数学と同じく乗除(掛け算、割り算)は加減(足し算、引き算)に優先されます。優先順位を変えるにはカッコを使います。
puts 2 + 3 * 4
puts (2 + 3) * 4
の結果は、
14
20
となります。
整数と浮動小数点数との演算の結果
整数と浮動小数点数の結果は、整数同士の場合だけ整数になります。
他にもこんなルールがあります
- 整数同士以外の演算の結果は浮動小数点数
- 三つ以上の数値の演算の結果は、一つでも浮動小数点数があると浮動小数点数
すべて整数の場合だけ結果が整数になる、と覚えておけば応用が効きますよ。
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の平方根が表示されます。
いろいろなエラー
では、今回学んだ内容に関する起こりやすいエラーを紹介しますね
もうすぐ我々が目にする画面かぁ……
そうですね(笑) 最初のうちはどうしてもエラーが起きてしまいますからね。大事なのは、何が問題でエラーになってしまったのかを知ることですよ。問題点がわかれば、解決方法もわかります
具体的なエラー例①
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
と書きましょう。
今回は演算子と数値演算を学びました
はい。というわけで、今回の授業はここまでにします。二人とも、どうでしたか?
今回は、そう難しくなかったです。実は、数学は少し得意なんですよ
こういう内容を見ちゃうと、やっぱりプログラミングは理系のほうが有利な気がしちゃいますねぇ
そう思われがちですが、要点を1つずつ抑えていけば、理系でも文系でも大丈夫ですよ。ちなみに猫田さんは、学生の頃の得意科目はなんだったんですか?
んんー 給食ですかねぇ