C言語入門(ループ処理その2:while文)

C言語

どうもサンチョです!

前回はループ処理のfor文について学びました。
今回はもう一つのループ処理であるwhile文について触れていきましょう!

前回の練習問題の解答例

まずは前回の練習問題の解答例から説明していきます。
※前回の記事はこちら ⇒C言語入門(ループ処理その1:for文)の練習問題

問題の内容は「テストの点数を配列に登録して、全体の平均点を計算するプログラム」でしたね。

#include<stdio.h>
int main() {
    int array[5] = {92, 83, 71, 40, 57};
    int i, sum;

    sum = 0;
    for (i = 0; i < 5; i++) {
        sum = sum + array[i]; // 点数の合計値を計算
    }

    printf("平均点は%0.2f\n", sum / 5.0);
}

この問題のポイントは、for文のカウント変数を用いて配列の要素を取り出す点です。
ちなみに修正前のプログラムはこちら↓

double average = (array[0] + array[1] + array[2] + array[3] + array[4])/5.0;

これだと生徒数(配列の要素数)が増えたら修正が大変ですよね?
for文のカウント変数を用いれば、要素番号を変更しながら処理できるので
生徒数が増えても、修正箇所が少なくて済みます。
ループ処理にはこういった利点があるんですね。

while文

さて、ここからようやく本題に入っていきます。

while文とは

C言語におけるもうひとつのループ処理です。
前回のfor文が繰り返す回数が決まっている場合に使用するループ処理だったのに対し、
繰り返す回数が決まっていないor不明なときに使用するループ処理です。

まずは以下のプログラムをコピペ&実行してイメージをつかんでください。

#include<stdio.h>
int main() {
    int i = 0;
    while(i < 5) {
        printf("iの値は %d です。\n", i);
        i++;
    }
}

なんとなくfor文と似た点がありますね。
では、もう少し詳しく説明していきます。

whileの構成要素

while文は次の要素で構成されています。

カウント変数
while( 条件式 ){
    処理内容
    カウント変数の更新
}

あれ?for文と同じじゃね?
そう感じたアナタ…ほぼ正解です!
実はwhile文を構成する要素はfor文とほぼ同じで
for文でできることはwhile文でもできます。
ただし、用途に少し違いがあります。

forとwhileの用途の違い

先ほど挙げた例を見て、forとwhileの違いが分からないと感じたのは、
繰り返す回数が決まっている処理」を例として挙げたためです。

繰り返す回数が不明な処理」の例をみると、用途の違いを認識できると思います。

以下のプログラムは、1から順に数値を2倍する処理を繰り返したときに
何回目で「128」に到達するかを調べるプログラムです。

#include<stdio.h>
int main() {
    int count = 0;
    int binary = 1;
    while ( binary <= 128 ) {
        binary = binary * 2;
        count++;
    }
    printf("128まで%d回", count);
}

一応、for文でもできないワケではないですが難しいです。
このようなプログラムをつくる場合はwhile文を使いましょう。

練習問題

【問1】前回の練習問題で作成したfor文のプログラムをwhile文に修正してください。
※前回の練習問題はこちら⇒C言語入門(ループ処理その1:for文)の練習問題

【問2】任意の自然数を2つ用意して、その最大公約数を求めるプログラムを作成してください。
考え方のヒント:最大公約数はユークリッド互除法で計算できます。

【ユークリッド互除法で計算した場合】
仮に2つの自然数を「81」と「12」と定義した場合
・81 / 12 あまり 9
・12 / 9 あまり 3
・9 / 3 あまり 0
最大公約数は 3 という結果が求められる。

まとめ

今回はwhile文について学びました。
while文は
①繰り返す回数が決まっていないときに使用するループ処理。
②構成要素はforとほぼ同じ。
③forでできることはwhileでもできる。

練習問題は少し歯ごたえのあるものを用意したので
じっくり考えてみてください!

次回も、もう少しだけループ処理に触れていこうと思います。
では、お疲れ様でした!

 

コメント

タイトルとURLをコピーしました