突然ですが、2桁くらいの好きな数 (自然数) を考えてください。そして、次の規則に従って、あなたが考えた数をどんどん計算してください。
試しに、20から始めてみましょう。20→10→5→16→8→4→2→1となりますね。最初にどんな自然数を選んでもこのように計算していくと必ず1にたどり着く、と言われています。これは角谷の予想と呼ばれ、今までに「この予想は正しい」と証明できた人は1人もいません。
さて、あなたが選んだ数は1になりましたか? 最初に選んだ数によっては、計算が大変になることもあります。こういう単純な計算はコンピュータにやらせるのが利口です。角谷の予想を実行するプログラムを作ってみましょう。
まずは次のようにフォームを作ってください。

入力欄は空欄に、ボタンの表示は「計算」にしてください。
次に、ボタンを押したら1回分の計算をしてくれるようにプログラムを書きます。ButtonCalc の OnClick に次のように書いてください。
void __fastcall TForm1::ButtonCalcClick(TObject *Sender)
{
if (EditA->Text.ToInt() % 2 == 0) { // 偶数なら
EditA->Text = EditA->Text.ToInt() / 2;
} else { // 奇数なら
EditA->Text = EditA->Text.ToInt() * 3 + 1;
}
}
プログラムの解説は必要ないですね。試しに動かしてみましょう。入力欄には電話番号下4桁などのでたらめな数を入れ、1になるまで計算ボタンを何度も押してください。どうですか? どんな数から始めても1になりそうですか?
せっかくですから、これを対戦ゲームにしてみましょう。ルールは簡単、2つの入力欄を作り、2人のプレイヤーがそれぞれ4桁のでたらめな数字を入力し、計算ボタンをどんどん押してみて先に1になった方を勝ちとします。
まずはフォームを次のように変更してください。

入力欄は空欄にしておきましょう。
次に、プログラムを変更します。ボタンを押したときに上の欄だけではなく下の欄も同様に処理するので、次のようになります。
void __fastcall TForm1::ButtonCalcClick(TObject *Sender)
{
if (EditA->Text.ToInt() % 2 == 0) { // 偶数なら
EditA->Text = EditA->Text.ToInt() / 2;
} else { // 奇数なら
EditA->Text = EditA->Text.ToInt() * 3 + 1;
}
if (EditB->Text.ToInt() % 2 == 0) { // 偶数なら
EditB->Text = EditB->Text.ToInt() / 2;
} else { // 奇数なら
EditB->Text = EditB->Text.ToInt() * 3 + 1;
}
}
さあ、これで完成しました。誰か友達と対戦してみましょう。あなたの電話番号と友達の電話番号はどちらが強いですか?
課題:3人対戦用のゲームにするためにはどうしたらいいか、考えなさい。なお、後でプログラムを3人対戦用に改造するため、ここでは実際に3人対戦用にしなくともよい。
さて、このプログラムには似たような部分の繰り返しがありますね。2人対戦用だから似たような部分を2回繰り返してプログラムを書くのもそれほど大変ではないですが、もし100人対戦用のプログラムを書くとしたら大変ですね。このような部分は関数にすることができます。
絶対値関数 abs を覚えていますか。これは、「何か数値を与えると正の値にして返してくれる」という下請け会社でした。これから作る関数は、「何か数値を与えると、偶数なら2で割って、奇数なら3をかけて1を足して返してくれる」という下請け会社にします。意味があまりよく分からなくても、取り敢えず次のように書いてみましょう。(必ず「void __fastcall TForm1::ButtonCalcClick(TObject *Sender)」よりも前に書いてください。)
int kaku(int uketori)
{
int kotae;
if (uketori % 2 == 0) { // 偶数なら
kotae = uketori / 2;
} else { // 奇数なら
kotae = uketori * 3 + 1;
}
return kotae; // 計算結果を返す
}
また、ButtonCalc の OnClick を次のように書き換えます。
void __fastcall TForm1::ButtonCalcClick(TObject *Sender)
{
EditA->Text = kaku(EditA->Text.ToInt());
EditB->Text = kaku(EditB->Text.ToInt());
}
では、プログラムを順に見ていきましょう。
先に ButtonCalc の OnClick を見ます。入力欄の処理が1欄につき1行にまとめられていますね。この行は kaku という関数を呼び出しています。以前見た abs 関数の呼び出しの例と比べてみましょう。
a = abs(-5);
-5という値を abs という下請会社に渡し、その結果をaという変数が受け取っていますね。
EditA->Text = kaku(EditA->Text.ToInt());
もこれと同様です。kaku という下請会社に EditA->Text.ToInt() という値を渡し、その結果を EditA->Text が受け取っています。
次に、関数 kaku の中身を見てみましょう。1行目の
int kaku(int uketori)
は、この関数の窓口です。最初の「int」は、この関数が最後に返す値が int 型 (整数型)であることを示しています。「kaku」は関数の名前です。「(int uketori)」はこの関数が受け取る値に関する記述です。そのうち「int」は、受け取る値が int 型であることを示しています。受け取った値は uketori という変数に入れられます。
2行目の「{」は、関数の本体の始まりを表しています。もちろん関数の本体の終わりには「}」が必要です。
3行目の「int kotae;」は、関数の中で使うために用意された変数です。
4行目から8行目までは関数の本体です。
9行目の「return kotae;」は、関数が最後に返す値が何であるかを表しています。
具体的な例で考えてみましょう。仮に、プログラムの中に
x = kaku(17);
という行があるとすると、次のように図で描くことができます。

このように関数を用いると、次のような利点が得られます。