質問するログイン新規登録
Ruby

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

Q&A

解決済

2回答

767閲覧

ループ(while)を使ったプログラムが暴走してしまった

aaaaaaaaaaa1

総合スコア6

Ruby

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

0グッド

0クリップ

投稿2023/07/13 02:43

編集2023/07/13 04:19

0

0

※これは広告ではありません。

実現したいこと

  • whileを使ったループの暴走を止めて、ちゃんとしたプログラムに直したい。

前提

rubyでwhileのループを作っています。
whileのループな機能を実装中に以下のエラーメッセージが発生しました。

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

プログラムが次のループに進まず暴走している? 非常に高速でメッセージが流れるため正しく読めているか自信はないのですが、 0番目の要素は20です。 0番目の要素は20です。 0番目の要素は20です。 0番目の要素は20です。 0番目の要素は20です。 0番目の要素は20です。 0番目の要素は20です。 0番目の要素は20です。 0番目の要素は20です。 (これが無限に続く) と、番号が0番目から進んでいないように見えます。 本当にずっと終わらないので、パソコンが壊れないか心配です……

該当のソースコード

ruby

1puts "ここから始まる" 2i = 0; 3list = [20, 40, 30, 10, 50]; 4puts "ループの前" 5while i < 5 6 puts (i.to_s) + "番目の要素は" + (list[i].to_s) + "です。" 7 ++i; 8end 9puts "ループ終わり"

調査したこと・試したこと


まず、プログラムの目視確認をしました。
whileは、その後の条件が正しい限り続く。
最初は i=0 → 0 < 5 が正しいので「0番目の要素は20です」と出るはず
次は i=1 → 1 < 5 が正しいので「1番目の要素は40です」と出るはず
次は i=2 → 2 < 5 が正しいので「2番目の要素は30です」と出るはず
次は i=3 → 3 < 5 が正しいので「3番目の要素は10です」と出るはず
次は i=4 → 4 < 5 が正しいので「4番目の要素は50です」と出るはず
次は i=5 → 5 < 5 が違うので「ループ終わり」と出るはず

なので、良さそうに見えました。
もちろん、どこかが間違ってるので暴走しているとは思うのですが、私の知識では間違いが見つけられませんでした。


次に、ループの終了条件が間違っていないか確認しました。
教科書を読み返しましたが、「while は条件が正しい限り繰り返す」と書いてあるので、「変数iが5より小さい間繰り返す」というプログラムになっていて、ここも良さそうに見えました。


次に、変数iのインクリメント(変数を1増やすこと)の書き忘れを確認しました。
もう一度プログラムを確認しましたが、やはりちゃんとインクリメントの処理は書いてありました。


次に、変数iのインクリメント(変数を1増やすこと)の書く場所の間違いを確認しました。
もう一度プログラムを確認しましたが、メッセージの後(ループの内側)に書いてあるので、場所も良さそうに見えました。
メッセージが出たあと変数iが1増えて次のループに進むようになっているように見えます。

僕の頭ではこれ以上はもう原因が思いつかず限界です。
初歩的な問題かもしれませんが、どなたか力を貸してください。

補足情報(FW/ツールのバージョンなど)

いまのところ、パソコンから変な音がしたり、熱くなったりはしてないですが、朝からずっと処理が止まらないので、心配です。

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

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

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

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

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

pig_vba

2023/07/13 02:58

とりあえず、現状正常に動作してないということが確定しているのですから、一旦強制終了してはどうでしょうか?
aaaaaaaaaaa1

2023/07/13 03:01

pig_vbaさん、コメントありがとうございます。 強制終了というのは、実行画面を右上の×ボタンで閉じるという意味でしょうか?
aaaaaaaaaaa1

2023/07/13 03:04

「調査したこと・試したことが記載されていない質問」とのご指摘ありがとうございます。 未熟な質問ですみません。 自分なりに調べたこと、試したことは4つほど書いたつもりだったのですが、どのように改善すればよいでしょうか?
pig_vba

2023/07/13 03:05

実行環境がわからないので何とも言えませんが、コマンドプロンプトのような環境ならctrl+C等強制停止コマンドがあるはずです。 環境自体がフリーズしているならタスクマネジャーからタスクキルするしかないですがそうではなさそうですし
melian

2023/07/13 03:56 編集

この場合、while loop よりは each_with_index を使うとよいかと。 list = [20, 40, 30, 10, 50]; list.each_with_index {|v, i| puts "#{i}番目の要素は#{v}です。"}
aaaaaaaaaaa1

2023/07/13 04:05

pig_vbaさん、ありがとうございます。 プログラムが止まらないときは強制終了して問題ないとの情報、とても助かりました。 プログラムの実行画面でCtrlキーとCキーを同時に押したら、無事にプログラムが止まりました。
aaaaaaaaaaa1

2023/07/13 04:12

melianさん、コメントありがとうございます。 each_with_index について教えていただきありがとうございます。 こんな書き方があるとは驚きです。 とても勉強になりました。 まだ理解が追い付いていない部分もありますが、なんとか解読してマスターしたいと思います!!
guest

回答2

0

ベストアンサー

Rubyに++演算子は存在しません。

++iは、+(+i)と解釈することが可能なので文法的にはエラーとなりませんが、なんの動作も起こしません。

投稿2023/07/13 03:00

maisumakun

総合スコア146768

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

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

maisumakun

2023/07/13 03:02

そして、Rubyで「配列の要素をたどるために自前でループ変数を管理する」なんて書き方は、通常行いません。eachメソッドを使ってください。
aaaaaaaaaaa1

2023/07/13 04:11

ありがとうございます! rubyでは ++i が使えないんですね。 確かに、動作を見ると変数iが増えていないのが原因かなと疑っていたので、すごく納得できました。 プログラムを i = i + 1 に変えたら思った通りに動きました。 補足情報もありがとうございます。 each_with_index を試してみます。
guest

0

whileの行末にdoが抜けています

++i;のほうの問題でした。失礼しました。

投稿2023/07/13 02:57

編集2023/07/13 03:03
ozwk

総合スコア13553

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

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

aaaaaaaaaaa1

2023/07/13 03:02

ありがとうございます!試してみます!
ozwk

2023/07/13 03:03

すみません間違えました。
aaaaaaaaaaa1

2023/07/13 04:13

maisumakunさん、情報ありがとうございます。 勉強になりました。
aaaaaaaaaaa1

2023/07/13 04:15

ozwkさん、一人で悩んでいたので、すぐにご回答いただいて勇気が出ました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問