<問題 >1桁の正の整数 (1〜9) の乱数を10個、配列に格納し、表示せよ。
7 が1つもなかったときは「7 がなかったよ」と出力し、あったときはその回数を出力する。たとえば「7 が3 回あったよ」と出力する。
<実行結果>
(たとえば)
s[0] = 6
s[1] = 7
s[2] = 4
s[3] = 3
s[4] = 4
s[5] = 1
s[6] = 4
s[7] = 7
s[8] = 4
s[9] = 7
s[1]に7があったよ
s[7]に7があったよ
s[9]に7があったよ
7が3回あったよ
(こちらも)
a[0] = 9
s[1] = 8
s[2] = 8
s[3] = 1
s[4] = 9
s[5] = 3
s[6] = 1
s[7] = 8
s[8] = 4
s[9] = 3
7がなかったよ
<ヒント> カウントする変数を、フラグにも使用することを考えてみよう。2つのプログラムを示します。
解答例 #include <stdio.h> #include <stdlib.h> #include <time.h> / * Nを10 */ #define N 10 int main (void) { int s[N]; int i; int flag = 0; /* 旗 7があったら1にする。0 false, 1 True */ /* C3 変数が、プログラムが表現している手続きの中で、どのような役割をしているか */ /* よくわかるC p38は、立てたflag (=1)を下げる (flag = 0) */ int n; /* n は個数 C1 変数やデータ構造が、どんな情報を表現しているか */ srand(time(NULL)); /* N個の乱数 */ for (i = 0; i < N; i++) s[i]= rand()%9 + 1; /* 表示 */ for (i = 0; i < N; i++) printf("s[%d] = %d \n", i, s[i]); /* STEP1.1 7があるかどうかをチェック。flag変数に注意 */ /* C4 ひと固まりのプログラム(ブロック)や関数が表現している手続きの概要 */ n = 0; /* nの初期化 C2, C5 定数が、どんな情報を表現しているか */ for (i = 0 ; i < N ; i++) if (s[i] == 7) { /* STEP 1.2 7がなかったか。 あったなら、回数 */ printf("a[%d]に7があったよ\n",i); n++; flag = 1; /* 旗を立てよう */ /* C2 定数が、どんな情報を表現しているか */ } if (flag == 0) printf ("7がなかったよ\n"); else printf ("7が%d回あったよ\n", n); return 0; } /* 別解 flagの情報は、個数で代用 */ int main (void) { int s[N]; int i; int n; srand(time(NULL)); /* N個の乱数 */ for (i = 0; i < N; i++) s[i]= rand()%9 + 1; /* 表示 */ for (i = 0; i < N; i++) printf("s[%d] = %d \n", i, s[i]); /* 数える。nが0のままなら、ない */ n = 0; for (i = 0 ; i < N ; i++) if (s[i] == 7) { printf("a[%d]に7があったよ\n",i); n++; } /* ループを終えて、確認 */ if (n == 0) printf ("7がなかったよ\n"); else printf ("7が%d回あったよ\n", n); return 0; }