この章ではNumericクラスについて説明します。
今まではクラスの作り方を説明してきましたが、Rubyにはあらかじめ定義されたクラスが存在します。
例えばNumericクラス、Stringクラス、Arrayクラス、Hashクラス、Timeクラス、Dateクラスなどがありますが、これらを一つずつ説明していきます。
初めにNumericクラスから説明します。
Numericクラスは以下のクラスに分類できます。 NumericクラスはIntegerクラス、Floatクラス, Complexクラス, Rationalクラスに分かれ、IntegerクラスはさらにFixnumクラス、Bignumクラスに分かれます。
Numericクラスは今までたくさん使ってきました。
例えば「123」はFixnumクラスのオブジェクトで、「3.4」はFloatクラスのオブジェクトになります。
BignumクラスはFixnumクラスでは収まりきらないほど大きい数の時には自動的にBignumクラスに変換されます。
Rationalは分数の計算などに使われます。
使い方はと言う形式で書きます。
下の例では分数同士の計算を行っています。
Ruby1.8(バージョン)を使っている場合はという記述が必要になります(この本ではこの記述は必要ありません)。
では例をみてみましょう。 この例はの計算なので、結果はです。
では次のcomplexクラスの例をみてみましょう。 複素数の説明はここではしませんが、引数には実数と虚数を指定します。
結果は「2+4i」です。
次はdivmodメソッドについて説明します。これはNumericクラスのメソッドです。
例をみてみましょう。 意味は「a/b」で計算した答えと余りを配列にしてくれます。
配列の0番目に答えが入り、1番目に余りが入ります。
余りはbの符号と同じ形式で表示されますので、bがマイナス表示ならばマイナスで表示されます。
結果はです。
次はmoduloメソッドについて説明します。
これはNumericクラスのメソッドです。 結果は「3」です。
次はremainderメソッドについて説明します。
これはNumericクラスのメソッドです。 意味は「a%b」で計算した結果と同じです。
答えはaの符号と同じ形式で出力されます。
結果は上が「3」で下が「-3」になります。
次は四捨五入する方法や整数を浮動小数点数に変換する方法について説明します。
初めに整数値から浮動小数点数に変換する「to_fメソッド」について説明します。
このメソッドはIntegerクラスのメソッドです。 答えは小数点形式の「31.0」になります。
次は四捨五入するroundメソッドについて説明します。
このメソッドは小数点以下を四捨五入します。 答えは上が「12」で下が「13」です。
次は元の数値を大きい方、小さい方に揃えるメソッドについて説明します。 ceilは数値を元の数値より大きい整数に揃えます。 floorは数値を元の数値より小さい整数に揃えます。 例の結果は上が「2」で下が「1」です
次は乱数を発生させるrandメソッドについて説明します。 引数を入れなくても大丈夫ですが、その場合は1未満のランダムな浮動小数点数を返します。
引数を与えた場合は0からその数値以内の乱数を返します。
答えはその時々で違う数値が出力されますが、例えば以下のように出力されます。 では他の例を紹介します。
rand(7)であれば0から6までの乱数値を生成します。
rand(6)+1であれば1から6までの乱数値を生成します。
乱数を発生させるRandomモジュールのrandを使うことでも乱数を発生させることが出来ます。
モジュールの作成方法については説明しましたが、RandomモジュールはRubyで機能が定義されているモジュールです。 引数を付けない時は0から1未満の数値が得られます。
引数を与えた場合は0から指定数値以内の乱数を得られます。
例えば引数が12であれば0から11までです。
次はMathモジュールについて説明します。
Mathモジュールは三角関数などの数学関係の演算が簡単に出来るメソッドを提供しています。 では例をみてみましょう。 メソッドを実行するにはと書きます
定数を実行するにはという形式で書きます。
結果は以下の通りです。
タグ: rand
if文で占いを作ろう
この章では今まで説明してきたif文と配列を使って、占いプログラムを作ります。
では例をみてみましょう。 resultは大吉から大凶までの要素を持つ配列になっています。
answerには0から6までのランダムな数が入ります。
ランダムな数を得るにはrandメソッドを使います(メソッドの意味については「メソッドについて知ろう」の章で説明します)。 整数値を入力した場合には0からまでの乱数値を生成します。
0もしくは何も入力しない場合は0以上 1未満の乱数値を生成します。
この例のrand(7)であれば0から6までの乱数値を生成します(7までではありません)。
rand(6)+1であれば1から6までの乱数値を生成します。
乱数を得た後はif文で判定を行います。
例えば乱数が0であればという条件式になるので、「大吉です」が出力されます。
結果は以下の通り、毎回違う値が出力されます。 これをcase..when文で書き換えると以下のようになります(先頭の2行は省略)。
switch文で占いを判定しよう
この章ではswitch文で占いを作成します。
占いは毎回同じ判定では変なので、結果はランダムになるようにします。 初めにランダムな数をransuuに入れるのですが、このランダムな数を生成するにはrand関数を使用します。
rand関数は0か32767までの数字の中でランダムな数を返しますが、範囲を限定したい場合には例えばと書きますと1から6までのランダムな数を返すようになります。
0から6までの数値をランダムに返したいのならばと書きます。
しかし、このrand関数だけではプログラムを何回実行しても同じ結果にしかなりません。
これは乱数を初期化していないからです。
この乱数を初期化するにはsrand関数を使います。 srand関数は乱数の初期値を設定する関数です。
つまり、乱数に使う初期値を変える関数です。
例えばsrand(1)と書くと初期値が1、srand(2)と書くと初期値が2の乱数を導き出すことが出来ます。
では試しにを入れないで、rand関数を実行してみましょう。 この例の実行結果は以下の通りです。 ではもう一度実行してみましょう。
結果は以下の通りですが、1回目の結果と同じです。
rand関数はランダムに数値を導き出してくれますが、乱数になるのは1回だけです。 そこで違う乱数を導き出すためにsrand関数を使います。
次の例は先ほどの例にsrand(6)を追加しただけです。 結果は何度実行しても以下の通りです。 初期値を変えたので乱数の値は変わりましたが、この例のようにsrand関数の中の引数を固定した場合はいつまで経っても同じ値になります。
そこでsrandの引数にを使用します。
この中のtimeはtime関数で、1970年1月1日0時0分0秒からの経過時間を返します。
ですのでtime関数をsrandの引数に使うことで、その瞬間の時刻が引数に入りますので、その都度違う数値を引数に与えることができます。
time関数の引数はNULLにします。
time関数を使う時にはを記述する必要があります。 では占いの例に戻ります。
ransuuには0から6までの数値がランダムに入るので、それをswitch文で判断して、unsei変数に代入しています。
それを最後に出力します。
計算プログラムを作ろう
この章では足し算の練習プログラムを作成します。
問題を5問解いて、正解数をカウントします。
例えば以下のプログラムを実行すると「14958」などの乱数を出力します。 範囲を限定したい場合には例えばと書きますと1から6までのなかでランダムな数を返すようになります。
この例であれば1から50までのランダムな数を返します。 つまり、以下の順番で配列に入ります。 つまり、以下の順番で配列に入ります。 次は以下の箇所の説明をします。 結果は以下の通りです。 実はこの計算プログラムは何回実行しても同じ計算式しか表示されません。
毎回違う計算式を表示させたいのならばとを以下の箇所に付け加えます。 詳しくは「switch文で占いを判定しよう」で説明します。
switch文で占いを判定しよう
この章ではswitch文で占いを作成します。占いは毎回同じ判定ではなく、結果はランダムになるようにします。 初めにランダムな数をransuuに入れるのですが、このランダムな数を生成するにはrand関数を使用します。
rand関数を使うためには文頭でと書かなくてはいけませんので注意してください。
rand関数は0か32767までの数字の中でランダムな数を返しますが、範囲を限定したい場合には例えばと書きますと1から6までのランダムな数を返すようになります。
0から6までの数値をランダムに返したいのならばと書きます。
しかし、このrand関数だけではプログラムを何回実行しても同じ結果にしかなりません。理由は乱数を初期化していないからです。
この乱数を初期化するにはsrand関数を使います。 ではsrand関数の説明をしていきます。
〇「unsigned」は「符号無し整数」で「0を含むプラスの値」が使用できる型です。
〇この関数を使う時にはを記述する必要があります。
〇srand関数はrand関数を使用する時に一緒に使用します。
〇srand関数は乱数の初期値を設定する関数です。
つまり、乱数に使う初期値を変える関数です。
例えばと書くと初期値が1、とすると初期値が2の乱数を導き出すことが出来ます。 初めにを入れないで、rand関数を実行してみましょう。 この例の実行結果は以下の通りです。 ではもう一度実行してみましょう。
結果は以下の通りですが、1回目の結果と同じです。
rand関数はランダムに数値を導き出してくれますが、乱数になるのは初めの1回だけです。 そこで乱数の初期値を設定する関数であるsrand関数で実行結果を変えることが出来ます。
次の例は先ほどの例にを追加しただけです。 結果は何度実行しても以下の通りです。 初期値を変えたので乱数の値は変わりましたが、この例のようにsrandの中の引数を固定した場合はいつまで経っても同じ値になります。
そこでsrand関数の引数にを使用します。
この中のtimeはtime関数で、1970年1月1日0時0分0秒からの経過時間を返します。
ですのでtime関数をsrandの引数に使うことで、その瞬間の時刻が引数に入りますので実行の都度違う数値を与えることができます。
time関数を使う時にはを記述する必要があります。 これで毎回違う結果を出力することが出来ます。 では占いの例に戻ります。 ransuuに入った数字で大吉から大凶までをランダムに占い、その結果をポインタのunseiに入れて出力しています。
計算プログラムを作ろう
この章では足し算の練習プログラムを作成します。
問題を5問解いて、正解数をカウントします。
次は初めのfor文の中を説明します。 =>rand関数は乱数を返します(関数については「関数について知ろう」でします。)。
計算をするのに毎回違う数を使いたいのでrand関数を使います。
具体的には0から32767までの数字の中でランダムな数を返します(詳しくは「switch文で占いを判定しよう」で説明します)。
範囲を限定したい場合には例えばと書きますと1から6までの中でランダムな数を返すようになります。
この例であれば1から50までのランダムな数を返します(詳しくは「switch文で占いを判定しよう」で説明します)。
rand関数を使うためには文頭でと書かなくてはいけませんので注意してください。
では次の箇所の説明をします。 => number1とnumber2の足し算の文を表示します。
つまり、以下の赤枠の箇所です。 =>答えをinput変数に代入します。
answer[i]=input;
=> scanfで入力した値が入っているinputを配列であるanswerに入れます。
for文で5回繰り返しているので、その都度入力した値が配列に入ります。 result[i]=number1+number2;
=> number1とnumber2の結果(つまり正解値)をresult配列に代入します。
for文で5回繰り返しているので、その都度正解値が配列に入ります。
次の箇所の説明をします。 =>ここでは配列answerに入っている答えと配列resultに入っている答えを比べて、正解ならば変数rightanwerに1を足します。
for文で5回繰り返しているので、その都度答え合わせをして、正解ならば変数rightanwerに1を足します。
結果は以下の通りです。
実はこの計算プログラムは何回実行しても同じ計算式しか表示されません。
毎回違う計算式を表示させたいのならば、以下の赤枠の記述を付け加えます。
詳しくは「switch文で占いを判定しよう」で説明します。
文字列に関する関数を知ろう
この章では文字列に関する関数について説明します。
先ほど配列に関する関数を説明しましたが、今度は文字列を操作する関数について説明します。 substr関数は指定した文字列の中の一部分を取得したり、文字列の一部を他の文字列に置換します。
第1引数は対象となる文字列を指定し、第2引数は文字列の中の開始位置を指定し、第3引数は切り出す文字の長さです。
第3引数を省略した場合は文字列の末尾までを取り出します。
第4引数を指定すると1番目から3番目の引数によって指定した文字列を第4引数の文字列で置き換えます。
では例をみてみましょう。 この例では第3,第 4引数を省略しているので、第2引数で指定した位置から、最後までを取得して$n1に代入しています。
位置の指定方法で気を付けることは先頭の文字の位置は0であり、1から数えるのではないので、注意してください。
$moji1の文字列は一部をsubstrで取り出されても、$moji1自体は変化しません。
つまり、最後にで出力してもが出力されます。
次の例をみてみましょう。
第 2引数にマイナスの値を入れた場合には以下の図のように末尾から数えます。
マイナスの値を入れた位置から末尾までを取得して$n2に代入しています。
次の例をみてみましょう。
Americaの先頭から2番目の文字から2つを取得します。
第2引数が2なので2個切り出しています。
結果は「me」です。
次の例をみてみましょう。
franceの先頭から2番目の文字から、末尾から2番目の文字までの間の文字列を取得します。
このように第3引数にマイナスを指定すると第2引数で指定した位置から第3引数で指定した位置までの間の文字列を取り出すことが出来ます。
結果は「ran」です。
次の例をみてみましょう。 4番目の引数には置き換える文字列を指定します。
置き換えの文字列は2番目と3番目の引数によって指定した文字列です。
1番目の引数は文字列が代入されている変数でなければいけません。
それは置きかえられた新しい文字列が入れられるようにするためです。
これは元の文字列の内容が書き替わるので注意してください。
結果は以下の通りです。
「hawai is fun」
次はrand関数について説明します。 「返される乱数の最大値」を入力すると0から指定した数値未満までの乱数を返します。
引数を省略すると、0から1までの値を返します。
また、返される数値には小数点が含まれます。
では例をみてみましょう。 乱数なのでどの数値が出力されるのかはそのたびに変わります。
この例の場合には引数に4を指定したので、4までの数値が更新するごとに変わります。
例えば小数点を含む値なのでなどと出力されます。
この例は
「print rand(4);」と書いても同じ意味になります。
次の例をみてみましょう。 引数を省略した場合には0から1までの値を返しますので、例えばなどと出力されます。
次の例をみてみましょう。 小数点を含む数値の整数の部分だけを取り出すにはrand関数の前にintを付けます。
例えばという小数点ではなく2と整数が出力されます。
rand関数の前あるintは int関数と言いまして小数点以下を無視して、整数部分だけを返します。
では以下のint関数についての例を見てみましょう。
以下の例は変数に入っている小数点以下を切り捨てるので、結果は0です。 ではrand関数を使っておみくじを作ってみましょう。 rand関数を使うと更新ボタンを押すごとに乱数値が変わるので、占いを作ることが出来ます。
この例ではrand関数の戻り値を配列の添え字にしています。
この例の場合にはint関数は付けても付けなくてもどちらでも結構です。
なぜなら、配列の添え字は整数部分しか入れられないので、自動で小数点以下を切り捨ててくれるからです。
次にucfirst関数について説明します。 ucfirst関数は対象の文字列の先頭の文字を大文字に変換した文字列を返します。 結果は「America」になります。
以下のように書いても同じ意味になります。 すべての文字を大文字に変換したい場合はuc関数を使います。
結果は「AMERICA」になります。
対象の文字列の先頭を小文字に変換したい場合はlcfirst関数を使います。
結果は「book」になります。
対象となる文字列を全て小文字に変換するにはlc関数を使います。
結果は「world」になります。
次はindex関数について説明します。
index関数は対象となる文字列の中に第2引数で指定した文字列が含まれているかどうかを検索し、含まれている場合は最初に見つかった位置を数値で返します。
見つからなかった場合は「-1」を返します。
第 3引数のを省略すると0を指定したとみなされます。 第 3引数を省略しているので検索開始位置は0になります。
この例ではtoは前から3つ目の所にあるので3が返されます。
toが2つありますが、最初に見つかった位置を返します。
以下の例のように第3引数に例えば5を入れるとkyotokyotoのなかの5番目の位置から右に検索されるので結果は8になります。
rindex関数は対象となる文字列の中に第2引数で指定した文字列が含まれているかどうかを検索し、含まれている場合は最後に見つかった位置を数値で返します。
第3引数を省略した場合は最後の文字を指定したとみなされます。検索する文字が見つからない場合は「-1」を返します。
では例をみてみましょう。
toが2つありますが、rindex関数は検索の結果、最後に見つかった位置を数値で返しますので結果は8になります。
次の例をみてみましょう。
この例の場合は第3引数に3を指定しているので、対象となる文字列であるkyotokyotoの中の前から3番目の文字以内でtoを検索します。
結果は「3」になります。
次は文字列の長さを測る関数lengthについて説明します。
では例をみてみましょう。
結果は以下の通りです。
長さは5
長さは9
UTF-8は英数字は1バイトで数えて、日本語は3バイトで数えるようになっています。
英数字の場合はバイト数と文字数は同じになります。
文字コードによりバイト数は違うので注意してください。