こんにちは、ナナです。
C言語にはfor文以外にも繰り返すための方法が用意されています。それがwhile文です。while文もよく利用される反復処理なので特徴を押さえて使いこなしましょう。
for文や反復処理の基礎に付いて学びたい方は次の記事を参照してください。
本記事では次の疑問点を解消する内容となっています。
では、while文を使った反復処理を学んでいきましょう。
while文を使った反復処理の書き方
for文を使った繰り返しは、回数が決まっていてモチベーションがあがりません。わたしは可能な限り繰り返すことで、より筋肉を発達させたいんです。どうしたらできますか?
そんなときは反復処理のwhile文があるね。while文は事前に回数を決めずに繰り返したい時に使うといいよ。目的にばっちりあってるでしょ。
while文の特徴は「ある条件を満たす間は繰り返す」という反復処理です。
次に示すのがwhile文の書き方です。
書き方
while (反復条件式)
{
繰り返したい処理;
}
for文と比べると非常にシンプルな作りになっています。反復するための条件式のみを記述することになっています。
この条件式を満たしている間は反復を繰り返します。
「条件を満たす間は反復」するんですよ。満たさない間は反復する、と勘違いしがちなので注意してください。
while文を使ったプログラム
while文を実際に使用したプログラムを示しましょう。
for文と異なり反復条件を満たさなくするための更新処理をwhile文の中に記述する必要があります。よって、繰り返し処理を適切に終了するように注意する必要があります。
#include <stdio.h>
int main(void)
{
int i = 10;
while (i < 100)
{
if (i % 2 == 0)
{
// カウンタ更新
i++;
// 次の反復処理へ
continue;
}
if (i > 50)
{
// 反復処理終了
break;
}
printf("%d\n", i);
// ループカウンタを更新
i++;
}
return 0;
}
while文においてもfor文と同様にbreakやcontinueを実行することができます。
while文の派生系:do-while文の繰り返し方法
さきほど限界までwhile文を使って腕立てしてたので、上腕二頭筋が喜んでます。反復の方法はfor文とwhile文の2つで以上ですか?
じゃあ、せっかくだからもう一つの反復処理を教えるよ。do-while文だね。
この反復処理はあまり見かけないんだけど、たまーに使われるね。
while文の派生系の反復処理としてdo-while文があります。
使用頻度は低いですが、このような繰り返し処理が存在することは知っておきましょう。
書き方
do {
繰り返したい処理;
} while (反復条件式);
特徴としてはwhile文と異なり、繰り返し処理が最低1度は実行されることです。
反復条件式の括弧の後にはセミコロンが必要なことも注意しましょう。
Q&A:while文に関するよくある質問
while文の繰り返しで気になることありますかー?
Q:for文とwhile文はどっちを使うのが良いのか?
for文とwhile文による反復処理、どっちがより筋肉を鍛えられるんですか?
反復運動は効果的に筋肉が鍛えられるんです。
筋肉を鍛えるなら数を決めて反復するよりも筋肉が悲鳴をあげるまで続けた方が効果的なのかな?だったらwhile文の方が向いてるね。
でも、僕はなぜ筋肉について語っているのかな?
for文とwhile文をどのように使い分けたらよいか悩む人もいるでしょう。基本的な考え方は次のものを基準するとよいです。
あらかじめ反復回数が明確になっており、ループカウンタを使って反復したいとき
反復回数が明確ではなく、条件が満たさなくなるまで反復したいとき
例えば、ベンチプレスを筋肉の限界まで上げ下げしたい時は、事前に反復回数を決めませんね。このような場合はwhile文の方が相性がよいです。
while (筋肉はまだ元気か?)
{
ベンチプレスを上げる;
ベンチプレスを下げる;
筋肉が疲労する;
}
筋肉を使ったプログラム例を書いたのは僕の人生で初めてです。
この子が記事に出てくると筋肉の話題ばっかりになります。
Q:無限ループという言葉があると聞いたが、反復処理との関係性は?
無限ループ。素敵な響きです。永遠に鍛え続けることができる、そんな反復があるのですか?
無限ループは実在するよ。無限ループとは反復条件を満たし続けてしまうことでループ処理が終わらないことをいうね。
通常、反復処理とはなんらかの反復条件を満たさなくなることでループ処理を終了させます。
しかし、無限ループとはいつまでも反復処理が続いていることを示す言葉です。
勘違いしないでほしいのですが、無限ループが即不具合というわけではありません。組み込み開発のシステムでは意図的に無限ループを行うことがあります。
ただし、意図せず無限ループになってしまった場合は大きな問題になります。そのため反復条件が意図したとおりになっているかは、慎重に吟味してプログラムを心掛けるとよいでしょう。
for文とwhile文で無限ループは次のように実現します。
for (;;) // for文の無限ループ
{
繰り返したい処理;
}
while (1) // while文の無限ループ
{
繰り返したい処理;
}
C言語の次に用意してあるマイコン入門編では、まさしく無限ループを使ったプログラムが登場します。よければそこまでお付き合いください!
課題:while文による反復の使い方が学べたかを確認しよう
もしも、プログラムが上手く動かなくて困ったときは、答えを見るのではなく「デバッガ」の使い方を学びましょう。
この記事を見ると問題の解決技術が身に付きます。困ったときのオススメ記事です!
課題1
課題内容
次の変数を定義せよ。
number1とnumber2の値に対する最小公倍数を表示せよ。while文を使用して算出するものとし、出力期待結果に従い結果を表示せよ。
最小公倍数
共通する倍数のうち一番小さな数
出力期待結果
12 , 15 ==> 60
16 , 30 ==> 240
24 , 35 ==> 840
main.c
#include <stdio.h>
int main(void)
{
unsigned long number1 = 12;
unsigned long number2 = 15;
unsigned long count = 1;
while (1)
{
if (count % number1 != 0)
{
count++;
continue;
}
if (count % number2 != 0)
{
count++;
continue;
}
printf("%d , %d ==> %d\n", number1, number2, count);
break;
}
return 0;
}
1から順に数字を増やしながら、余りがあるかどうかで最小公倍数を見つけ出しています。余りが出たら違うのでcontinueで次の数字にしていますね。
反復処理は如何にうまくcontineやbreakを使いこなすかがポイントです。