C入門5 課題解答

1. ユーザに入力してもらった数だけ、あなたが好きな言葉を繰り返すプログラムを書いてください。

/* kadai5_1.c */
#include <stdio.h>

int main(void)
{
    int i, n;
    printf("好きな整数を入力してください。\n");
    printf("その数だけ、私の今の気持ちを繰り返します。\n");
    scanf("%d", &n);
    for(i = 0; i < n; i++){
        printf("眠いよ ");
    }
    return 0;
}

2. 下のプログラムはコンパイル・実行できるでしょうか。できたとすると結果はどうなるでしょう。
  (実験してみてください。)

#include <stdio.h>

int main(void)
{
    int i;
    for(i = 0; i < 0; i++){
        printf("まあ好きかな\n");
    }
    return 0;
}

  コンパイルでき、実行もできる
  しかし、for文では、最初にiを0にするが、その段階で「i < 0」が成り立たなくなる。
  そのため、for文内の処理は一度も実行されない。
  したがって、実行しても、何も表示されない。

  何も表示されないので、「実行できなかった」と考えた人もいたようです。
  しかし、「何も表示しないプログラム」が実行できたのです。

3. 下のプログラムはコンパイル・実行できるでしょうか。できたとすると結果はどうなるでしょう。
  (ちょっと危険なプログラムです。実行はちょっと待ちましょう。)

#include <stdio.h>

int main(void)
{
    int i;
    for(i = 0; i >= 0; i++){
        printf("まあ好きかな\n");
    }
    return 0;
}

  前問と同様に、コンパイルでき、実行もできる。
  しかし、for文では、最初にiを0にし、条件を「i >= 0」としている。
  「変数の更新」ではiを増やすだけなので、(論理的には)無限ループになってしまう。

  ただし、実際には、iに格納できる整数の大きさに限界があるため、限界を超えると
  (不思議かもしれませんが)マイナスの数になってループが終了するかもしれません。
  しかし、そういうプログラムは邪悪です。

4. 問題3のプログラムは、(論理的には)無限ループになります。
  プログラムが実行時に無限ループになった場合、強制終了で止めるしかありません。
  どのような方法があるか、調べてください。
  そして、「大丈夫だ」と思った場合のみ、自己責任で、実験してみてください。
  (書きかけのレポートなどは保存・終了してからにしましょうね。)

  Windows XPの場合、「Ctrl + C」、「コマンドプロンプトの窓を閉じる」、「Ctrl + Alt + Del」などがある。

5. ユーザに好きな整数を10個入力させ、その最小値と最大値を出力するプログラムを書いてください。
  (if文を使いましょう。これは頭の体操です。)

/* kadai5_5.c */
#include <stdio.h>

int main(void)
{
    int min, max, i, x;
    printf("好きな整数を10個入力してください。\n");
    printf("整数を入力 : ");
    scanf("%d", &x);
    min = x;
    max = x;
    for(i = 0; i < 9; i++){
        printf("整数を入力 : ");
        scanf("%d", &x);
        if(x > max){
            max = x;
        }
        else if(x < min){
            min = x;
        }
    }
    printf("あなたが入力した値の最小値は%dです。\n", min);
    printf("あなたが入力した値の最大値は%dです。\n", max);
    return 0;
}

はじめに入力した値をmin、maxとし、入力される値と比較していきます。
そして、現在のminより小さい値が入力されればそれを新しいminにし、
現在のmaxより大きい値が入力されればそれを新しいmaxにします。

6. クイズを出し、ユーザが正解を入力するまで、そのクイズを繰り返すプログラムを書いてください。
  (whileかdo-whileが使いやすいと思います。これは発想の問題です。)

/* kadai5_6.c */
#include <stdio.h>

int main(void)
{
    int ans = 0;
    printf("クイズです。答を半角整数を入力してください。\n");
    while(ans != 3){
        printf("問題 世界一長い川は? \n");
        printf("1 信濃川 2 アマゾン川 3 ナイル川\n");
        scanf("%d", &ans);
        switch(ans){
            case 1:
                printf("日本一ですが、違います。\n");
                break;
            case 2:
                printf("そんな気もしますが、違います。\n");
                break;
            case 3:
                printf("おめでとう。正解です!\n");
                break;
            default:
                printf("誤入力。入力は1か2か3です。\n");
        }
    }
    printf("ご苦労さん。\n");
    return 0;
}

  最初にansを0(正解の3以外ならなんでもよい)に設定したので、while内の処理が実行されます。
  そして、それ以後は、ansに3が格納されるまで処理が続けられるのです。これでもよいでしょう。
  ほぼ上のように書いて、ansの初期化(はじめに値を入れること)を忘れている人がかなりいました。
  変数は、初期化しないと、どんな値を持つかわからないことになっています。
  たまたま3になっていることもあるでしょう。
  初期化を忘れないでください。

  ただし、「クイズ」は必ず1度実行する必要があるので、whileより、do-whileの方がよさそうです。

/* kadai5_6.c */
#include <stdio.h>

int main(void)
{
    int ans;
    printf("クイズです。答を半角整数を入力してください。\n");
    do{
        printf("問題 世界一長い川は? \n");
        printf("1 信濃川 2 アマゾン川 3 ナイル川\n");
        scanf("%d", &ans);
        switch(ans){
            case 1:
                printf("日本一ですが、違います。\n");
                break;
            case 2:
                printf("そんな気もしますが、違います。\n");
                break;
            case 3:
                printf("おめでとう。正解です!\n");
                break;
            default:
                printf("誤入力。入力は1か2か3です。\n");
        }
    }while(ans != 3);
    printf("ご苦労さん。\n");
    return 0;
}

  この場合、ユーザが入力したあとで、ansの中身をチェックすることになるので、
  特にansを初期化する必要はありません。

  なお、私が好きなのは、ユーザが間違いとわかっていながら同じ答えを入力し続けた場合、
  「いいかげんにしろよ。コンピュータだってひまじゃねえんだ」みたいな表示をするやつです。
  元気の残っている人はそのように改良してください。できるはずです。

7. ユーザに好きな整数を10個入力させ、その合計を出力するプログラムを書いてください。
  「変数xの値に変数aの値を足す」は「x += a;」でできます。
  「x += a;」を実行すると、xの値が「もとのxの値 + aの値」になるのです。
  ちなみに、「変数xの値から変数aの値を引く」は「x -= a;」です。
  (これは、文章読解の練習です。)

/* kadai5_7.c */
#include <stdio.h>

int main(void)
{
    int sum, i, x;
    sum = 0;
    printf("好きな整数を10個入力してください。\n");
    for(i = 0; i < 10; i++){
        printf("整数を入力 : ");
        scanf("%d", &x);
        sum += x;
    }
    printf("あなたが入力した値の合計は%dです。\n", sum);
    return 0;
}

  とてもよくあるパターンです。
  変数を10個用意した人もいるようです。現段階では、むしろ、その根性をほめたいところです。
  しかし、100個だと困りますよね。上のような方法を理解してください。


課題5

C入門5
C入門目次
ホーム