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

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

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

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

Q&A

解決済

2回答

679閲覧

Rubyで全体のある条件のとき全体の処理は止めず現在の作業のみ止めまたループしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

2グッド

1クリップ

投稿2020/03/13 01:25

編集2020/03/13 03:26

下コードは5個の整数から構成されるグループの合計を求めるプログラムです
グループは全部で10個で各整数値はキーボードから読み込みます
ただし99999を入力すると全体の入力を終了し、88888を入力すると現在読み込み中のグループの入力を終了するプログラムを作りたくて書いたコードです
ただ、このコードだと88888を入力した際にも全体の入力が終了します
どうすればいいでしょうか?

Ruby

1puts "整数を加算します" 2total = 0 3i = 1 4while i <= 10 5 puts "■第#{i}グループ" 6 j = 0 7 while j < 5 8 print "整数:" 9 t = gets.to_i 10 if t == 99999 11 break 12 elsif t == 88888 13 next 14 end 15 j += 1 16 total += t 17 end 18 i += 1 19end 20puts "\n合計は#{total}です"

理想の出力結果をサンプルで追記いたします

整数を加算します
■第1グループ
整数:175
整数:634
整数:394
整数:88888 ここで第1グループから抜け入力を第1グループの入力を終了し第2グループへ
■第2グループ
整数:555
整数:777
整数:88888 ここで第2グループから抜け入力を第1グループの入力を終了し第3グループへ
■第3グループ
整数:99999 ここで全体の入力を終了する

合計は2535です ここで全グループの合計を出力

88888で現在のグループの入力を終了
99999ですべての入力を終了し合計を出力

DrqYuto, s.k👍を押しています

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

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

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

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

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

Mugheart

2020/03/13 01:48

どういった動きを期待しているのかいまいちわかりません。 サンプルでいいので入力値と出力値を示していただけますか? パッと見た感じ常に "■第1グループ" を出力し、 `while i <= 10` のループを抜けることがないようなコードに見えます。 「88888を入力した際にも全体の入力が終了します」の終了とは `puts "\n合計は#{sum}です"` の出力がされて 文字通り処理が完了するという意味でしょうか? 上記の通りループを抜ける手段がないように見えますし、 加えてsum変数が用意されてないためエラーが起きるはずなので、 それはありえない気がしますが...。
退会済みユーザー

退会済みユーザー

2020/03/13 02:02

sumではなくtotalでした! 皆さんのコメント解決方法を見ながらコードを書いています!!!????
退会済みユーザー

退会済みユーザー

2020/03/13 02:05

今の動き的には99999を入力したときにグループを抜けれる状態です! そこをどうにかしたいですね
退会済みユーザー

退会済みユーザー

2020/03/13 02:09

おそらくあれなんですよね抜けたい部分で抜けれてないので 抜ける入れ子の部分を変えれば行けるのかなと思いif分の位置をずらしてみたりしてます
退会済みユーザー

退会済みユーザー

2020/03/13 02:11

nextで戻りたい箇所breakで終了させたい部分を指定できればいいんですけど、、、
Mugheart

2020/03/13 02:27 編集

> 今の動き的には99999を入力したときにグループを抜けれる状態です! すみません、解釈違いでした。 次のグループに移行するってことですかね。 質問を質問で返すようで申し訳ないのですが、 break と next の仕様は理解していますか?
退会済みユーザー

退会済みユーザー

2020/03/13 02:30

breakは最も内側のループを抜ける つまりこのコードだとwhile j<5のループを抜ける(グループ) nextは最も内側の次にループに行くのでグループを抜けられない?。。。
退会済みユーザー

退会済みユーザー

2020/03/13 02:32

やっぱり99999を打つとグループからは抜けれて次のグループに行けます ■第1グループ 整数:99999 ■第2グループ 整数:999999 整数:2 整数:99999 ■第3グループ コンソールはこんな感じです あとjもちゃんと動いていて5つの整数を入力すると次のグループに行けますΣ(・ω・ノ)ノ!
退会済みユーザー

退会済みユーザー

2020/03/13 02:37

説明が稚拙で申し訳ないっす はい!次のグループに移行できるという意味です breakとnextの仕様はわかってないんだと思います、、、
otn

2020/03/13 02:54

書かれているプログラムと実行結果が合いません。 ちゃんと書きましょう。
guest

回答2

0

99999を入力すると全体の入力を終了し

しません。外側(while i <= 10)のループは、iの値が変化しないので、永久に終わりません

投稿2020/03/13 01:43

maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2020/03/13 01:54

ありがとうございます???? i += 1を入れてみて実験します!
maisumakun

2020/03/13 01:56

それ以外にも、jのほうのループも強制脱出するまで終わらないなど、質問以外の箇所でも文章とコードの動作が一致しません。
退会済みユーザー

退会済みユーザー

2020/03/13 02:03

ありがとうございます???? j += 1も追記しました!
guest

0

ベストアンサー

ループがネストした事によりbreak/nextが直近のループへの制御文と認識されます。

おそらく、解法としては3種類あります。
breakとreturnを使い分ける方法

ruby

1def get_groups 2 total = 0 3 1.upto(10) do |i| 4 puts "#{i}グループ" 5 1.upto(5) do |j| 6 case num = gets.to_i 7 when 88888 then break 8 when 99999 then return total 9 else total += num 10 end 11 end 12 end 13 total 14end 15 16puts "合計は#{get_groups}"

whileで頑張る方法

ruby

1i=0 2total=0 3while (i+=1) <= 10 4 puts "#{i}グループ" 5 1.upto(5) do |j| 6 case num = gets.to_i 7 when 88888 then break 8 when 99999 9 i = 10 10 break 11 else 12 total += num 13 end 14 end 15end

catch-throwを用いて大域脱出する方法

ruby

1total = 0 2catch(:break_group) do 3 1.upto(10) do |i| 4 1.upto(5) do |j| 5 case num = gets.to_i 6 when 88888 then break 7 when 99999 then throw :break_group 8 else 9 total += num 10 end 11 end 12 end 13end

投稿2020/03/14 09:12

asm

総合スコア15147

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問