プログラムの基本(Fizz Buzz)

5番の部屋プログラム

プログラミングの基礎力を試すものとしてFizz Buzz問題というものがあります。今回はこのFizz Buzzについて書いてみたいと思います。

Fizz Buzzとは

 Fizzu Buzz問題とは任意の数までの数字を表示するが、3の倍数なら「Fizz」、5の倍数なら「Buzz」、3と5の公倍数なら「FizzBuzz」というルールのプログラムを書くというものです。

かつて世界のナベアツという芸人さんが3と3の倍数のときアホになるという芸をやっていましたが(最近は落語家に転身したとか)これこそがFizz Buzzというものです。わからない人はYoutubeなどで見てね!

FizzBuzzをする人

フローチャートを書いてみる

さてプログラムは、すでに処理(順次・分岐・反復)および演算子・変数について勉強したはずですから、素地はできているはずですよね。これをプログラムする前に、まずフローチャートで書いてみましょう。

今回は1から21までの数で試してみましょう。指定した数が21になり。1つずつ出力するためのカウンタとして変数「 i 」を指定します。その結果としてできるのがこちら(画像クリックで拡大してね)

 

FizzBuzzフローチャート

 

さて解説します。スタートボタンが押されたら処理がスタートします。

変数としてカウントをかぞえる変数「カウンタ」として i を準備していますので、ここでカウントを開始する最初の数値「1」を代入します。その後は反復と条件分岐処理です。反復条件として、カウンタ「 i 」が指定した数値(今回は「21」ですね)以下の場合、反復処理の条件に当てはまるので、ループに入ります。

ループの中でFizzBuzzに該当する処理で条件分岐にあたる処理です。3と5の公倍数なら「Fizzbuzz」と出力し、3の倍数なら「Fizz」5の倍数なら「Buzz」と出力するものです。さて、この順番は3と5の公倍数ならという条件が先にくる必要があります。

なぜなら、3の倍数が先にきた場合「i=15」であった場合、3の倍数の条件で先に条件を拾ってしまい「Fizz」と言ってしまい、その周回ループが1回まわってしまいます。これだとやりたいことが実現できないですよね。なので先に3と5の倍数という処理が行われるように条件処理の順番をまもる必要があります。

いずれにも該当しない場合は普通に数値「i」の値を出力することになります。そして次のループに入る前にカウンタをプラス1します。

ここで認識したいのは、変数「 i 」は出力する数値でもありカウンタでもあるという2つの役割を持ってい使っているんですね。

 

プログラミング言語で表現

さて、では次にフローチャートをもとにプログラミング言語で表現してみます。

Scratchで作る

FizzBuzzをScratchで作ったのがこちらになります。(画像クリックで拡大してね)

Scratchのサイトでの共有はこちらです。

https://scratch.mit.edu/projects/335824890/

解説しますね。基本的な部分は先ほどフローチャートで説明した内容と一緒ですが、Scratchならではの特徴を説明します。

Scratchでは最初にいくつまでの数を数えると質問して、その数を標準で用意されている結果変数に格納します。同時にカウンタという名前で新たに変数を作り、このカウンタに1を代入します。

あとは、カウンタ>結果(=入力した数)になるまでずっと繰り返すといて反復処理を開始させ、その中で条件分岐を行っていきます。Scratchではもし~ならば、でなければのelse ifを平行してかけないので、この図のようにちょっと入れ子のような形で表現する形になるんですかね。(もっといいやり方が見つかったらアップデートします)

そして、3と5の公倍数、や3や5の倍数のときにという条件ですが、これは3と5の公倍数の条件に一致するということは、カウンタにいま当てはまっている数を最小公倍数である15で数字を割ったときの余りが0になるかそうでないかで判断します。3の倍数や5の倍数も同じように余りが0かそうでないかで判断しますね。

最後にカウンタを+1して反復の最初にもどるというプログラムの書き方になります。

Pythonで作る

さて、同じものをPythonでつくるとこうなります。

for i in range(1, 22):
    if i % 3 == 0 and i % 5 == 0:
       print("FizzBuzz")
    elif i % 3 == 0:
       print("Fizz")
    elif i % 5 == 0:
       print("Buzz")
    else:
       print(i)

ちなみにPythonの場合は、いくつまで数えますかというのをプログラムするのが面倒だったので、最初から21までの数値で固定してプログラムしました。解説については基本的に前述のとおりです。ちょっと違う点としては、カウンタが何々より小さいまでというのは” for i in range(1, 22) “で表現していて1から21の数字の中でという意味で使われているところですかね。

 

まとめ

今回はFizzBuzzについてかいてみました。プログラミングできる?って聞かれて何も見ないでサクっとこれがかけるようになったら、プログラミングの基礎や論理的な考え方は最低限身についていると判断できるでしょう。ぜひ、このFizzBuzzにトライしてみてください。

コメント

タイトルとURLをコピーしました