🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

671閲覧

while文の条件式の判定について

okure_man

総合スコア7

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/12/09 02:15

編集2019/12/09 02:39

C++にてwhile文を書いたのだが、思ったようにうごかない為、どこに間違いがあるのか教えてほしい。

AtCoderのこの問題を解こうとしています。

https://atcoder.jp/contests/abc065/tasks/abc065_b

while 文の条件式の判定にvec.at(i) != 2 を使っています。vec.at(i)を同while文の最後にcout にて出力して、2以外の整数が入っていてもループしない。条件式が真でループしてくれると思ったのだが、ループしてくれなかった。

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

エラーは出ないが、while文がループしてくれない。

該当のソースコード

#include <bits/stdc++.h> using namespace std; int main() { int N; cin >>N; vector<int> vec(N); for(int i=0;i<N;i++){ cin >> vec.at(i); } int i =0; int count = 0; while(vec.at(i) != 2){ i = vec.at(i)-1;//3 count++; cout<<vec.at(i)<<endl; if(count==N-1) cout<<-1<<endl; break; } if(count<N) cout<<count<<endl; }

試したこと

入力をいろいろな値にいじってみた。
while文ではなくfor文で書き換えてみた。

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

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

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

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

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

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

Zuishin

2019/12/09 02:20

while 文が無いし、それ以前にコンパイルできないんじゃないでしょうか。
okure_man

2019/12/09 02:23

不慣れですいません、書き直せているでしょうか
Zuishin

2019/12/09 02:35

できていますが、teratail はプレインテキストではなくマークダウンを使って質問します。マークダウンでは行頭の # が章題を表すため、#include が章題と解釈されていておかしくなっています。 また、本文は行頭の空白が削除されます。ソースコードは本文ではなくコードブロックに入れてください。コード全体を選択して <code> ボタンを押してみてください。
guest

回答1

0

ベストアンサー

C++

int i;
...
while(vec.at(i) != 2){

iの値が不定です。


**追記: **

int i=0; に書き換えてみても結果は同じでした。

コンパイラが警告を吐いていませんか?

C++

if(count==N-1)
cout<<-1<<endl;
break;

これは次のように書いているのと同じです。

C++

1if(count==N-1) { 2 cout<<-1<<endl; 3} 4break;

コードの貼り方について

teratailには、コードを見易く表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押して下さい。
C++

投稿2019/12/09 02:26

編集2019/12/09 02:34
LouiS0616

総合スコア35668

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

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

okure_man

2019/12/09 02:29

ありがとうございます。しかし その行を int i=0; に書き換えてみても結果は同じでした。
LouiS0616

2019/12/09 02:36

見るからにおかしい箇所があったので、追記しました。 > 結果は同じでした。 未定義動作を踏んだ結果、『たまたま』同じ結果になっていたということです。
okure_man

2019/12/09 02:38

そういうことなのですね。ありがとうございます。
Zuishin

2019/12/09 02:43 編集

解決済みになっていますが、意味がわかったんでしょうか? vec.at(i) には i 番目(最初は 0 番目と数える)に入力した値が入っています。 i が初期化されていない場合、何番目なのかも不定で、範囲を超えることもあります。 0 に初期化した場合 0 番目に固定されます。 最初のデータが 2 でなければ while の中身を実行せず停止しますが、2 の場合、停止しません。 データを順に走査したい場合は、while の中で i をインクリメントしてください。
LouiS0616

2019/12/09 02:43 編集

@okure_man さん コンパイラの警告オプションを立てているでしょうか。 私が指摘した二点 (iの値が不定・括弧の欠落) はどちらもコンパイラが警告し得るものです。
LouiS0616

2019/12/09 02:43

@Zuishin さん 補足ありがとうございます。 > データを順に走査したい場合は... 今回の場合、i = vec.at(i) - 1 で充分題意に沿っているように思います。
Zuishin

2019/12/09 02:44

そこにあったんですね。見落としていました。撤回します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問