while文 解答ページ | Programming Place Plus C言語編 第16章

トップページC言語編第16章

問題①

問題① 標準入力から入力された整数分だけ、‘*’ を出力するプログラムを while文を使って作成してください。


たとえば次のように書けます。

#include <stdio.h>

// 整数の入力を受け取る
// 戻り値: 標準入力から整数の入力を受け取り、その値を返す。
int get_input_integer(void)
{
    char s[40];
    fgets(s, sizeof(s), stdin);
    int value;
    sscanf(s, "%d", &value);
    return value;
}

int main(void)
{
    puts("Please enter the your integer.");
    int value = get_input_integer();

    int count = 0;
    while (count < value) {
        printf("*");
        count++;
    }
    printf("\n");
}

実行結果:

Please enter the your integer.
4  <-- 入力された内容
****

あまり大きな値を入力すると大変なので気を付けてください。プログラム自体は比較的シンプルなもので、while文の使い方も本編での解説とほぼ同じです。

ところで、入力された値が負数であっても正しく動作するかどうかという点にも注意してください。都合の悪い値を受け取ったからといって、プログラムが異常な動作をするのは好ましくありません。今回のプログラムの場合、0以下の値が入力された場合は、‘*’ を出力することなく終了します。

問題②

問題② 標準入力から5の倍数の整数を入力させるプログラムを、while文を使って作成してください。5の倍数でない値が入力された場合、何度でも再入力を促すようにしてください。


#include <stdio.h>

// 整数の入力を受け取る
// 戻り値: 標準入力から整数の入力を受け取り、その値を返す。
int get_input_integer(void)
{
    char s[40];
    fgets(s, sizeof(s), stdin);
    int value;
    sscanf(s, "%d", &value);
    return value;
}

int main(void)
{
    int value = 1;    // 5の倍数でない値で初期化

    while (value % 5 != 0) {
        puts("Please enter the your integer.");
        value = get_input_integer();
    }
}

実行結果:

Please enter the your integer.
3  <-- 入力された内容
Please enter the your integer.
7  <-- 入力された内容
Please enter the your integer.
10  <-- 入力された内容

何度も繰り返させるためには、一連の処理をまとめて while文のブロックの中に入れてしまう必要があります。

おそらく悩みどころは、最初の1回をどうするかでしょう。この解答例では、標準入力から受け取った値を格納する変数value にあらかじめ、5 の倍数でない値を代入しておくことによって、最初の while文の条件式が真になるように仕組んでいます。

次のように書いた人も多いかと思います。

#include <stdio.h>

// 整数の入力を受け取る
// 戻り値: 標準入力から整数の入力を受け取り、その値を返す。
int get_input_integer(void)
{
    char s[40];
    fgets(s, sizeof(s), stdin);
    int value;
    sscanf(s, "%d", &value);
    return value;
}

int main(void)
{
    puts("Please enter the your integer.");
    int value = get_input_integer();

    while (value % 5 != 0) {
        puts("Please enter the your integer.");
        value = get_input_integer();
    }
}

実行結果:

Please enter the your integer.
3  <-- 入力された内容
Please enter the your integer.
7  <-- 入力された内容
Please enter the your integer.
10  <-- 入力された内容

これでも動きますが、同じ処理を繰り返し記述することはできるだけ避けるべきです。

問題③

問題③ 問題②のプログラムを do文を使って書き換えてください。


次のようになります。

#include <stdio.h>

// 整数の入力を受け取る
// 戻り値: 標準入力から整数の入力を受け取り、その値を返す。
int get_input_integer(void)
{
    char s[40];
    fgets(s, sizeof(s), stdin);
    int value;
    sscanf(s, "%d", &value);
    return value;
}

int main(void)
{
    int value;
    do {
        puts("Please enter the your integer.");
        value = get_input_integer();
    } while (value % 5 != 0);
}

実行結果:

Please enter the your integer.
3  <-- 入力された内容
Please enter the your integer.
7  <-- 入力された内容
Please enter the your integer.
10  <-- 入力された内容

do文にすると、判定が後ろで行われるようになるため、変数value にあらかじめダミーの値を入れておく必要がなくなります(それでも、未初期化のままにしておくより、‘0’ を入れておくのは悪くないです)。

問題④

問題④ 次の while文はどういう意味ですか?

while (0) {
    // なんらかの処理
}


while文の条件式が 0 という整数定数なので、この while文はループする条件を満たすことがありません。

この while文の内側に入ることはなく、「なんらかの処理」が実行されることもありません。


参考リンク


更新履歴



第16章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る