質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

765閲覧

Ruby FizzBuzz 条件が揃ったらプログラムを終了させたい

nanakusa5

総合スコア1

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2021/05/11 08:40

編集2021/05/11 08:52

前提・実現したいこと

FizzBuzz問題において、以下のことをおこないたいです。

3と5の倍数→FizzBuzz
3の倍数→Fizz
5の倍数→Buzz
その他の数字→入力した数字
数字以外→エラー

<条件>
・外部入力で任意の数字を入力する
・FizzBuzzがでるか、数字以外のエラーが出たらプログラムを終了する

発生している問題・エラーメッセージ

1.最初に数字以外の文字列を入力するとシステムエラー(?)になる
(意図したエラー表示(putsで入力したエラー表示)にならない)
2.エラーを出力したときのプログラムの終わらせ方がわからない

def number?(str) str =~ /\A\s*[+\-]?[0-9]+\s*\z/ end begin puts "数字を入力してね!" str = gets if number?(str) number = str.to_i if number % 3 == 0 && number % 5 == 0 puts "FizzBuzz" elsif number % 5 == 0 puts "Buzz" elsif number % 3 == 0 puts "Fizz" elsif number puts number end else puts "エラーです!もう一度数字を入力してね!" end end until number % 3 == 0 && number % 5 == 0 || false

試したこと

・最後の行でfalseをつけた理由→特定の数字(7や14)を入れるとなぜか入力した数字が戻ってこなくなったため
・ ||の大元の意味は「or」であると習いました。しかし、下のように、untilの代わりにwhile文と||を使って同じように入力するとエラーになります。これの理由も同時に教えていただきたいです。

end while number % 5 == 0 || number % 3 == 0 || number

rubyを初めてまだ1週間少しの初心者ですがご回答お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K_3578

2021/05/11 08:45

タグはRubyだけで良いかと。 後、初心者なのであれば質問編集画面の左上に非活性になってる初心者マークを押しておけば良いです。 質問本文に要件と関係ないことを書かれるのを嫌う方も多いので、初心者の証明はマークのみに 留めてください。
maisumakun

2021/05/11 08:57

> 最初に数字以外の文字列を入力するとシステムエラー(?)になる エラーメッセージをコピペしていただけますか?
nanakusa5

2021/05/11 09:03

(入力)asdfg "エラーです!もう一度数字を入力してね!" Fizz_Buzz.sourcecode.rb:34:in `<main>': undefined method `%' for nil:NilClass (NoMethodError)
guest

回答1

0

ベストアンサー

「ループから抜け出したら後は終了しかしない」という場合、ループはloop無限ループにしておいて、脱出したいところでexitを使って終了、という方がわかりやすいです。

投稿2021/05/11 08:58

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/05/11 09:06

> 意図したエラー表示(putsで入力したエラー表示)にならない 意図したエラーメッセージが出た「後」での話ですね。一度もループに入らない場合、numberに値が入らないnilになっているので、割り算も出来ません(loopでかいて判定条件ごと消してしまえば問題は解決します)。
nanakusa5

2021/05/11 09:29

ご回答ありがとうございます。 以前loopでも試したのですが、使い勝手がよくわからずうまくいきませんでした。 loopとbreakでループさせたいものを挟み込む、と習ったのですが(わかりにくくてすいません)、この場合 elsif number % 5 == 0 puts "Buzz" elsif number % 3 == 0 puts "Fizz" elsif number puts number この部分をloopとbreakで挟み込むということでしょうか? loopさせたくないエラー表記とFizzBuzzの外側にloopさせたいもの(str = gets)があるので、混乱しています...
maisumakun

2021/05/11 09:46 編集

> loopとbreakでループさせたいものを挟み込む、と習ったのですが その考え方自体がおかしいです。loop { 中身 } あるいはloop do ... endの形です。
maisumakun

2021/05/11 09:45

> loopさせたくないエラー表記とFizzBuzz これらを表示した直後でexitしてプログラムごと終了してしまいましょう。
nanakusa5

2021/05/12 00:51

そうだったのですね! 質問しなければずっとわからないままでした...ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問