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 に貼り付けられるはずです。

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 は以上です。お疲れ様でした。