Chapter 05. フィボナッチ数列

このチュートリアルは、フィボナッチ数列をプログラムで書き、数列をグラフ化するところまで解説します。 グラフ化は、Excel の機能を使います。

1. 準備

サンプルファイル

Chapter 05 で使用するサンプルファイルをご用意致しましたので、ダウンロードして下さい。 Excel ファイルを開きます。開く際に警告が表示された場合は、マクロを有効にする、を選択して下さい。もし、マクロを無効に してしまった場合は、Excel ファイルを一旦閉じ、もう一度開いて今度はマクロを有効にする、を選択して下さい。


2. For 文で回す

フィボナッチ数列を 15 個(0 項から 14 項まで)作りましょう。フィボナッチ数列は、n 番目のフィボナッチ数列を Fn で表すと、

フィボナッチ数列

URL : http://ja.wikipedia.org/wiki/フィボナッチ数列

と表現されます。F3 = F1 + F2 です。F4 = F2 + F3 です。F15 = F13 + F14。求めたい項の値は、その2つ前の項の値と 1つ前の項の値とを足し合わせた値になります。では、早速プログラムでフィボナッチ数列を書きましょう。今回は、 15 個作りますので、15 個の要素を持つ配列を宣言します。配列の要素の数は #define しておきます。

#define num_fib 15
int fib[num_fib];

フィボナッチ数列の、F0 と F1 の値を代入しましょう。

fib[0] = 0;
fib[1] = 1;

次に、F2 から F15 までを For 文で求めます。求めたい項を i 項とすると、その2つ前の項は i - 2 、1つ前の項は i - 1 と なります。For 文の初期条件は i = 2 からであることに注意して下さい。

for (int i = 2; i < num_fib; i++) {
    fib[i] = fib[i - 2] + fib[i - 1];
}

Chapter 01に、フィボナッチ数列の関数を加えます。関数名は、fib とします。

#include "sfcglx.h"

// 15 項まで
#define num_fib 15

// フィボナッチ数列を表示する関数
void fib() {
    // num_fib 個だけ配列の要素を用意します。
    // 今回は、num_fib = 15 なので、15 個です。
    int fib[num_fib];
    
    // 0 項 と 1 項を代入します。
    fib[0] = 0;
    fib[1] = 1;
    
    // 2 項から 14 項までを計算します。
    for (int i = 2; i < num_fib; i++) {
        fib[i] = fib[i - 2] + fib[i - 1];
        // 試しに出力します。
        printf("%2d %3d\n", i, fib[i]);
    } 
}

void display() {
    BGColor(200, 200, 200);
    SGBeginEdit();       // 形状の描画の開始.   
    SGEndEdit();         // 形状の描画の終了.   
    SGSwapFrames();      // フレームを入れ替える. 
}

int main(int argc, char** argv) {
    SGInit(argc, argv); // SGL の初期化

    // SGLX の初期化
    SGLXInit("C:\\Users\\Akito\\Documents\\MediaDesign3D\\5");

    fib();

    SGOpenWindow(0,0,500,500); // 500x500のウィンドウ
    SGSetDisplay(display); // 描画
    SGCallBack(); // コールバック関数を登録
    return 0; 
}

3. Excel でグラフを作ろう

さて、一旦C/C++プログラムを終了して下さい。次は、 Excel を使って、セルに入力された値を参照したグラフを作りましょう。今回は、15 個の要素を持つ配列をグラフにします。 AC1 から AC15 までをマウスでドラッグして下さい。

マウスでドラッグします

セルの色が変わっている状態で、Excel 上部のメニューから、挿入 -> グラフ をクリックします。

挿入 -> グラフをクリック

左側のメニューから折れ線グラフを選択し、右側のメニューからデータにマーカーがつけられた折れ線グラフを選択します。

折れ線グラフを選択します

完了を押します。以下のようなグラフが、Excel に貼り付けられるはずです。

Excel にグラフが貼り付けられました

4. 入力しよう

SGLX を使って、Excel の AC1 から AC15 まで、フィボナッチ数列の値を入力します。値の入力は、 SGLXInput() 関数を使います。SGLXInput() 関数 を用いたチュートリアルは、こちらにありますので、SGLXInput() 関数 をまだ使ったことが無い方は、先にそちらをご覧頂くことをお勧め致します。

Cell()関数を使用すると、すっきりしたコードが書けます。

// 入力されるターゲットのセル
std::string target("");
// AC列のアルファベット
std::string AC("AC");
// フィボナッチ数列は、インデックスが 0 から 14
// セルの行は、1 から 15 なので注意して下さい。
for (int i = 0; i < num_fib; i++) {
    target = Cell(AC, i+1);
    SGLXInput(fib[i], target);
}

以下に、全部のソースコードを載せます。ご参照下さい。

#include "sfcglx.h"

// フィボナッチ数列を表示したかどうか
// false 表示していない
// true 既に表示した
bool flag_fib = false;

// 15 項まで
#define num_fib 15

// フィボナッチ数列を表示する関数
void func_fib() {
    // num_fib 個だけ配列の要素を用意します。
    // 今回は、num_fib = 15 なので、15 個です。
    int fib[num_fib];
    
    // 0 項 と 1 項を代入します。
    fib[0] = 0;
    fib[1] = 1;
    
    // 2 項から 14 項までを計算します。
    for (int i = 2; i < num_fib; i++) {
        fib[i] = fib[i - 2] + fib[i - 1];
        // 試しに出力します。
        std::cout << fib[i] << std::endl;
    }

    // 入力されるターゲットのセル
    std::string target("");
    // AC列のアルファベット
    std::string AC("AC");
    // フィボナッチ数列は、インデックスが 0 から 14
    // セルの行は、1 から 15 なので注意して下さい。
    for (int i = 0; i < num_fib; i++) {
        target = Cell(AC, i+1);
        SGLXInput(fib[i], target);
    }
 
}

void display() {
    // フィボナッチ数列を表示していない場合
    if (flag_fib == false) {
        func_fib();
        flag_fib = true;
    }
    BGColor(200, 200, 200);
    SGBeginEdit();       // 形状の描画の開始.   
    SGEndEdit();         // 形状の描画の終了.   
    SGSwapFrames();      // フレームを入れ替える. 
}

int main(int argc, char** argv) {
    SGInit(argc, argv); // SGL の初期化

    // SGLX の初期化
    SGLXInit("C:\\Users\\Akito\\Documents\\MediaDesign3D\\5");

    SGOpenWindow(0,0,500,500); // 500x500のウィンドウ
    SGSetDisplay(display); // 描画
    SGCallBack(); // コールバック関数を登録
    return 0; 
}

では、プログラムを保存、コンパイル、実行してみましょう。フィボナッチ数列がグラフ化されます。

フィボナッチ数列がグラフ化されました

グラフのスタイルを変更すると、以下のようなグラフも作れます。近似曲線も加えることができます。

グラフのスタイルを変更しました

sin 関数や cos 関数を使ったグラフを書いてみても面白いと思います。 Chapter 05 は以上です。お疲れ様でした。