2009年10月8日木曜日

第15回 配列① FizzBuzz

お題:
FizzBuzzプログラムを作る。
①数を1からカウントしていく
②カウントする上限を尋ねる
③3の倍数の時、「Fizz」と表示
④5の倍数の時、「Buzz」と表示
⑤3と5の倍数の時、「FizzBuzz」と表示

プログラム実行例:

image

必須事項:
・配列を利用する事

ヒント:
・まず、配列をたくさん用意して、3の倍数、5の倍数、3と5の倍数、それ以外に分類します
・実行例は改行しましたが、あってもなくてもいいです
・配列に関しては第11回の予備知識を参考にしてください

解答は10月10日に掲載します。それまでにプログラムを作成し、
・プログラム文
・その実行ファイル
をメールに添付して以下のアドレスに送ってください。

解答、質問はこちらまで
cosmo-cleaner@za.pial.jp

---------------------------------------------------------------

解答例

1

2
3

4
5

6
7
8
9
10
11
12
13
14
15
16
17

18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

#include <stdio.h>

int main () {
    int a[1000],i,n,k;

    puts("いくつまでfizzbuzzを行いますか?");
    printf("n=");    scanf("%d",&n);

    for(i=0;i<=n;i++){
        a[i]=0;
    }
    for(i=1;3*i<=n;i++){
        a[3*i]=1;
    }
    for(i=1;5*i<=n;i++){
        a[5*i]=2;
    }
    for(i=1;3*5*i<=n;i++){
        a[3*5*i]=3;
    }

    k=1;
    for(i=1;i<=n;i++){
        if(a[i] == 0 )
            printf("%d ",i);
        else if (a[i] == 1)
            printf("fizz ");
        else if (a[i] == 2)
            printf("buzz ");
        else if (a[i] == 3)
            printf("fizzbuzz ");

       if (i == 10*k) {
            printf("\n");
            k++;
        }
    }
}

実行例は上と同じです。

解説

今回使った変数とその役割

a[1000]
i
n
k
数字の属性を記憶する変数
カウントアップする数字そのもの、または倍数処理に利用
カウントアップする数字の上限
数字が10個並んだら改行するための変数

このプログラムは、数字と配列を対応させて、配列に数字の属性を印していきます。
例えば、数字の7なら配列a[7]に7の属性を印します。

この印付けを行っているのが6から17行目の命令です。
まず、a[0]からa[n]までの配列に0をとりあえず入れていきます
次に、3の倍数の配列に1を入れていきます。
次に、5の倍数の配列に2を入れていきます。
最後に、3と5の倍数の配列に3を入れていきます。
つまり、
0の印が付いた数字はただの数、
1の印が付いた数字は3の倍数、
2の印が付いた数字は5の倍数、
3の印が付いた数字は3と5の倍数、
という事になります。
印をどんどん上書きしていきます。

赤いif文で数字ごとの印を判別してfizz,buzz,fizzbuzzを表示させています。
青いif文は改行用です。iをカウントアップして10の倍数に至った時に、改行を入れます。見やすくするために入れました。

答えられる範囲で質問いつでも受け付けます。
cosmo-cleaner@za.pial.jp

0 件のコメント:

コメントを投稿