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

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

ただいまの
回答率

89.08%

C言語のcontinueとwhileがうまくいかない

受付中

回答 6

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,794

hoge_hoge

score 8

カウントを表示するプログラムを作成しています。

お世話になります。
カウント結果を表示するプログラムで、
0~9までカウントアップして表示するプログラムを作成しています。
continueを使って、カウントが5のときだけ表示しないようにしたいのですが、うまくいきません。
#08 for文でループ処理をしてみようを参考にしました。動画のようにfor文ではうまくいったのですが、while文だとうまくいきません。
m < 10としているのに10が表示されたり、
処理が終わらなかったりします。

n++やprintfの場所の位置によるものだと思うのですが、なぜこのようになるのでしょうか?
頭がこんがらがっています。
初歩的な質問で申し訳ありませんが、どなたか解説いただけましたら幸いです。
よろしくお願いいたします。

表示させたいこと

m:0
m:1
m:2
m:3
m:4
m:6
m:7
m:8
m:9

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

エラーメッセージはありませんが、実行結果が異なり、困っています。

該当のソースコード1

1 #include <stdio.h>
  23 int main(void) {↲
  4     int m = 0;↲
  5     while (m < 10) {↲
  6         m++;↲
  7         if(m == 5) {↲
  8             continue;↲
  9         }↲
 10         printf("m:%d\n",m);↲
 11     }↲
 12 }
/*実行結果
m:1
m:2
m:3
m:4
m:6
m:7
m:8
m:9
m:10
*/

該当のソースコード2

1 #include <stdio.h>
  23 int main(void) {↲
  4     int m = 0;↲
  5     while (m < 10) {↲
  6         if(m == 5) {↲
  7             continue;↲
  8         }↲
  9         printf("m:%d\n",m);↲
 10         m++;↲
 11     }↲
 12 }
/*実行結果
m:0
m:1
m:2
m:3
m:4
何も表示されないが、処理が終わらない
*/

該当のソースコード3

1 #include <stdio.h>
  23 int main(void) {↲
  4     int m = 0;↲
  5     while (m < 10) {↲
  6         printf("m:%d\n",m);↲
  7         if(m == 5) {↲
  8             continue;↲
  9         }↲
 10         m++;↲
 11     }↲
 12 }
/*実行結果
m:5
m:5
m:5
m:5
m:5
m:5
m:5
m:5
m:5
m:5
m:5
m:5
とずっと表示されて終わらない
/*

追記

for分のcontinueが効きません........を参考にしました。
continueの次の行がスキップされることがわかりました。
continueのあとの行にm++があったから処理が終わらなかったということでしょうか?
修正したのですが、
それでもうまくいきません........どうなるのでしょうか

該当のソースコード4

/*コード4*/
  1 #include <stdio.h>
  2  int main(void) {
  3     int m = 0;
  4     while (m < 10) {
  5         printf("m:%d\n",m);
  6         m++;
  7         if(m == 5) {
  8             continue;
  9         }
 10    // この部分にあるコードがスキップされる
 11     }
 12  }
/*実行結果
m:0
m:1
m:2
m:3
m:4
m:5
m:6
m:7
m:8
m:9
0~9までは表示される
*/

該当のソースコード5

/*コード5*/
  1 #include <stdio.h>
  2  int main(void) {
  3     int m = 0;
  4     while (m < 10) {
  5        m++;         
  6         if(m == 5) {
  7             continue; 
  8         }
  9    // この部分にあるコードがスキップされる
 10        printf("m:%d\n",m);
 11     }
 12  }
/*実行結果
m:1
m:2
m:3
m:4
m:6
m:7
m:8
m:9
m:10
5はスキップできているが、0から開始せず、9で終了している
*/

追記

力技になってしまいましたが、
m=-1にしたらうまくいきました。
m=0のままで可能でしょうか?

お力をお貸しください。
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

+2

Q.
m < 10としているのに10が表示されたり、
処理が終わらなかったりします。 

A.
ループを抜ける位置とカウントアップされる位置を
もう一度、冷静に確認すればわかると思いますよ

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

このレベルのプログラムなら、流れ図(フローチャート)を書いてみることをお勧めします

処理の流れをコードで追いかけるのではなく、流れ図によって処理の手順を整理すれば、何が問題でどこを修正すればよいか自ずとわかってきます

"プログラムの処理の流れ"のフローチャートの書き方

形式にとらわれる必要はないと思いますのでとにかく書いてみましょう
これからの学習にも役立つと思いますよ


・・・一応ヒントを

・カウントアップする位置
・出力する位置
・m==5でcontinueするときのカウントアップ
をよく考えてみましょう


追記を読みました

得たい結果(要件)を整理しましょう

・最初は0を出力したい
・5は出力したくない
・9まで出力したら終わりにしたい

ということで、以下の手順の処理を考えたと思います

1)変数mに0を代入
2)mが10に達したら終了
3)mを出力する、ただし、mが5になっていたら出力しない
4)mを+1する

また 3)で continue を使うことにしたので

1)変数mに0を代入
2)mが10に達したら終了
3)mを出力する、ただし、mが5になっていたら出力しないで2)へ戻る
4)mを+1する

となりました
そうすると4)を通らないのでm+1ができません
それなら、その処理を追加してあげましょう
こうなります

1)変数mに0を代入
2)mが10に達したら終了
3)mを出力する、ただし、mが5になっていたら出力しないでmを+1して2)へ戻る
4)mを+1する

いかがでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

C言語はステップ手順の言語なのでcontinue;やbreak;のステップ後に制御がどこのステップに移るかを考えると分かるかと思います。 

ソースコード2、3の場合、breakに変えると処理は終了します。

こんな感じです。
continue -> while 先頭(戻る、繰り返す)
break -> while{} 最後(抜ける、出る)

これらは一階層を対象としていますので、多重階層ループを一気に抜けるには一般にgoto文を使います。(推奨されないけど)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

1行1行頭の中でシミュレートしてみましょう。

例えば、ソースコード1の場合は、
・mが9の時、while (m < 10)はどう動くのでしょう?
m++;では、mはいくつになりますか?
if(m == 5)は、どういう判断になるのでしょうか?
printf("m:%d\n",m);は、どのような出力になりますか?

10程度であれば、0~10までmに数値を当てはめてロジックを頭の中で追ってみましょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

continueした時のmの値を見ればわかります。前回値と同じ値でcontinueしてしまうとそれ以降mはカウントアップしなくなります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

追記する前に人の回答を読みましょう。
ひとまず、各コードで意図した動作をしない理由は…

  • ソースコード1
    whileに入った直後にmをインクリメントしているため、whileの時にmが0でも出力までに1加算で1になるため0が出力されず、9の時(whileの条件は満たされる)も出力前に1加算され10になる
  • ソースコード2
    mが5のとき、if文に入る→continueによりwhileの最初に戻る を永遠に繰り返し、インクリメントするタイミングがないため、永遠にmが5のままループし続ける
  • ソースコード3
    2と同じ。ただしcontinueの前に出力しているため、延々と5を出力し続ける
  • ソースコード4
    mが5でも出力の行を通過するため
  • ソースコード5
    1と全く同じコードですよね?

結局、1はインクリメントのタイミングがおかしく、2および3はmが5の時にインクリメントしないために無限ループになっているのです。ここまで言えば、解決法は簡単ですよね?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.08%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る