Rubyの初心者向け問題1-7:範囲(Range)プログラムを作ろう
この問題を解くために必要な知識:
【レベル1の知識】
コメントの書き方、変数と定数、基本データ型、四則演算と演算子、入力と出力、文字列操作、分岐処理(if、if~else、elsif、case)、繰り返し処理(for、while、until、each)、範囲(Range)、例外処理(begin-rescue-end)、
<<前の問題 | 問題集Top |
次の問題>> |
Rubyの文法「範囲(Range)」とは
ここでは範囲(Range)の意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。
Rubyには「範囲オブジェクト」と呼ばれる強力な機能があり、連続する値を簡単に表現できます。
範囲は、特定の数値や文字列の開始点と終了点を指定して、その範囲内の値を扱います。
例えば、1から5
までの数値や、aからz
までの文字を簡単に扱うことができます。
範囲オブジェクトの基本的な使い方は、以下の2種類の記述があります。
..
(ドット2つ): 終了値を含む範囲...
(ドット3つ): 終了値を含まない範囲
範囲オブジェクトの例
数値の範囲を使った繰り返し処理
Rubyでは範囲オブジェクトを使って、繰り返し処理を簡単に行うことができます。
# 1から5までの数値を順に表示 (1..5).each do |i| puts i end
このコードでは、1..5
という範囲オブジェクトを使って、1
から5
までの数値を順に表示しています。..
は5
も含む範囲であるため、5
も表示されます。
終了値を含まない範囲
...
を使うことで、終了値を含まない範囲を作成できます。
# 1から4までの数値を順に表示 (1...5).each do |i| puts i end
このコードでは、1...5
という範囲を使って1
から4
までの数値を表示しています。終了値である5
は含まれません。
範囲内に値が含まれているか確認する
範囲オブジェクトには、指定された値が範囲内に含まれているかを確認するメソッドinclude?
があります。
range = (1..5) puts range.include?(3) # true puts range.include?(6) # false
この例では、範囲1..5
に3
が含まれているためtrue
、6
は含まれていないためfalse
が表示されます。
まとめ
範囲オブジェクトは、Rubyで効率よく連続する値を扱うための非常に便利なツールです。
繰り返し処理や範囲内の値のチェックなど、さまざまな場面で活用できるので、是非この機能を覚えておきましょう!
Ruby練習問題1-7:範囲(Range)プログラムを作ろう
FizzBuzzは、数字を順に表示しながら特定の条件に従って出力内容を変えるプログラムです。
今回はユーザーから範囲の開始値と終了値を入力してもらい、その範囲内の数値をFizzBuzzのルールに従って出力するプログラムを作成してください。
この問題の要件
以下の要件に従ってコードを完成させてください。
- 3の倍数の場合、「Fizz」と表示する。
- 5の倍数の場合、「Buzz」と表示する。
- 3の倍数かつ5の倍数の場合、「FizzBuzz」と表示する。
- それ以外の数値はそのまま表示する。
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
範囲の開始値を入力してください: 1 範囲の終了値を入力してください: 15 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz
----- ↑出力される結果の例↑ -----
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
1.範囲の開始値と終了値をユーザーに入力させる部分
1-1. start_value
という変数に範囲の開始値を格納
1-2. end_value
という変数に範囲の終了値を格納
2.範囲オブジェクトを使用した繰り返し処理
2-1. 範囲 (start_value..end_value)
に基づく each
メソッドで繰り返し処理を実行
2-2. num
を範囲内の各数値に設定
3.FizzBuzz の条件分岐処理
3-1. num
が 3 の倍数かつ 5 の倍数の場合、「FizzBuzz」と表示
3-2. num
が 3 の倍数の場合、「Fizz」と表示
3-3. num
が 5 の倍数の場合、「Buzz」と表示
3-4. その他の場合、num
の値をそのまま表示
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# FizzBuzzプログラム # ユーザーに範囲の開始値を入力させる puts "範囲の開始値を入力してください:" start_value = gets.chomp.to_i # ユーザーに範囲の終了値を入力させる puts "範囲の終了値を入力してください:" end_value = gets.chomp.to_i # 指定された範囲の数値を繰り返し処理する (start_value..end_value).each do |num| # 数値を分類する =begin 【穴埋め問題1】 ここに条件分岐処理を記述してください。 numが3と5の倍数の場合は「FizzBuzz」を表示し、 3の倍数の場合は「Fizz」、5の倍数の場合は「Buzz」を表示する。 それ以外の場合はその数値をそのまま表示するコードを書いてください。 =end end
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例と解説
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
********************
# FizzBuzzプログラム # ユーザーに範囲の開始値を入力させる puts "範囲の開始値を入力してください:" start_value = gets.chomp.to_i # ユーザーに範囲の終了値を入力させる puts "範囲の終了値を入力してください:" end_value = gets.chomp.to_i # 指定された範囲の数値を繰り返し処理する (start_value..end_value).each do |num| # 数値を分類する if num % 3 == 0 && num % 5 == 0 puts "FizzBuzz" elsif num % 3 == 0 puts "Fizz" elsif num % 5 == 0 puts "Buzz" else puts num end end
********************
コードの解説
このFizzBuzzプログラムでは、範囲(Range)オブジェクトを使って、ユーザーが指定した範囲内の数値に対して繰り返し処理を行います。
繰り返しの過程で、特定の条件(3の倍数や5の倍数など)に基づいて異なる出力を行います。
ユーザーからの入力部分
puts "範囲の開始値を入力してください:" start_value = gets.chomp.to_i puts "範囲の終了値を入力してください:" end_value = gets.chomp.to_i
ここでは、gets
を使ってユーザーに範囲の開始値と終了値を入力させます。
chomp
で改行を取り除き、to_i
で文字列を整数に変換しています。
これにより、ユーザーが指定した範囲を数値として処理できるようになります。
範囲オブジェクト(Range)の使用
(start_value..end_value).each do |num|
この部分で範囲オブジェクトが登場します。(start_value..end_value)
は、ユーザーが指定した開始値から終了値までの連続した数値の範囲を表します。
each
メソッドを使って、この範囲内の数値を順番に取り出し、num
に代入します。
FizzBuzzの条件分岐処理
if num % 3 == 0 && num % 5 == 0 puts "FizzBuzz" elsif num % 3 == 0 puts "Fizz" elsif num % 5 == 0 puts "Buzz" else puts num end
ここでは、取り出した数値が3の倍数か、5の倍数か、またはその両方かをチェックし、それに応じた文字列を出力します。
num % 3 == 0 && num % 5 == 0
: 数値が3の倍数かつ5の倍数である場合、”FizzBuzz”を表示します。num % 3 == 0
: 3の倍数である場合、”Fizz”を表示します。num % 5 == 0
: 5の倍数である場合、”Buzz”を表示します。- それ以外の場合は、その数値自体を出力します。
繰り返し処理の実行
(start_value..end_value).each do |num|
範囲オブジェクトとeach
メソッドを使うことで、指定された範囲内のすべての数値に対して繰り返し処理を行うことができます。
範囲オブジェクトはRubyで連続する値を扱うのに非常に便利な機能です。
範囲オブジェクトの使い方を理解することで、数値や文字列の範囲を簡単に操作できるようになります。
<<前の問題 |
問題集Top |
次の問題>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。