STEP 1.3

<問題 >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; 
}