第十回-02 関数~課題を解くための準備
さて、本日の課題に接続するため、前ページの続きとなる演習を続けていこう。
2 乗ができたら 3 乗もできるはず、というわけで 3 乗の計算を行う関数 cubic を作ってみよう。
先程のプログラムの続きとして記述していこう。
3 乗の関数自体は 2 乗を真似すればすぐにできるはずだが、
一つのプログラムに複数の関数を作ることが先程の例に比べると新しい。
前ページのプログラムに追加が必要な部分を記していこう。
まず、関数のプロトタイプが以下である。
double cubic(double x);
また、main 関数内で cubic 関数を利用する部分が以下である。2 の 3 乗が計算されるので、8 が y に格納されるはずである。
y = cubic(2);
cout << "yの値は" << y << "\n";
そして、cubic 関数の実装が以下である。2 乗 (x*x) の部分が 3 乗 (x*x*x) となっただけである。
double cubic(double x)
{
double val;
val = x*x*x;
return val;
}
以上、追加すべき内容が3つあった。これを前ページのプログラムの適切な場所に貼り付けると以下のようになる。
貼り付ける場所に注意すること。また、いつも通りインデントにも注意すること。
インデントについては第二回課題で解説したのだった。
実行すると出力タブに以下のように表示される。y = square(2) と y = cubic(2) により、2 の 2 乗 の 4 と 2 の 3 乗 の 8 が計算されていることがわかる。
このように、「2乗を計算する部分」、「3乗を計算する部分」のようにプログラムを部分に分け、
分業体制で一つの大きな仕事を成し遂げるようなプログラムを作る、というのが関数を用いたプログラムの特徴である。
このようなプログラミングの手法を手続き型プログラミングという。
手続き型プログラミングを行えるプログラミング言語の代表例が C 言語というわけである。
なお、C++ は手続き型プログラミングとオブジェクト指向プログラミングの両方を行えるが、
ここまでは C++ を手続き型プログラミングのためにのみ用いてきたということになる。
機械系エンジニアであってもここまでは常識的な知識として押えておくべきである。
例えば、モータの制御に Basic や C 言語を用いたプログラミングが必要な場合があるが、
その場合も関数を用いたプログラミングの知識が必要である。
さて、2 乗、3乗を求める関数はできたが、実際に用いるには 2 乗、3乗のように冪 (べき) の数字を決め打ちするのではなく、
一般に n 乗の計算を行える関数を作った方が便利であろう。例えば、そのような関数の名前を beki とし、
- 2 の 3 乗を計算する際には beki(2,3)
- 2 の 5 乗を計算する際には beki(2,5)
と記述できるとよい。
この場合、引数が2 つになっているのが square や cubic の場合と異なるが、
これは、下記のように、複数の引数をコンマ「, 」でつないで記述することで実現できる。
double beki(double x, int n);
さて、この beki 関数を完成させることが本日の課題である。
cubic 関数のときと同様に、追加すべき部分をまず記そう。
まず、関数のプロトタイプが以下である。
double beki(double x, int n);
次に、main 関数内で beki 関数を利用する部分が以下である。2 の 10 乗が計算されるので、1024 が y に格納されるはずである。
y = beki(2, 10);
cout << "yの値は" << y << "\n";
最後に、beki 関数の実装が以下である。ただし、ここを完成させるのが課題であるので、
このままでは正しい計算が行われない。
よく見ると、1 が格納された変数 val をそのまま戻り値としているだけである。
double beki(double x, int n)
{
double val;
val = 1;
// ここにプログラムを書くこと
return val;
}
以上の3箇所を下図のように追加しよう。貼り付ける場所に注意すること。
いつも通りインデントにも注意すること。
下図の状態が今回の課題の出発点となる。
既に述べたように、このプログラムは完成していない。
そのため、2 の 10 乗を計算して「yの値は1024」と表示されて欲しいところが「yの値は1」と表示されている。
もちろん、課題のプログラムが完成すれば下記のように「yの値は1024」と表示されるだろう。
さて、皆さんが目指すべきなのは「// ここにプログラムを書くこと」という箇所で
val に格納された値が x の n 乗となるようなプログラムを書くことである。
「n 乗」の n が 2 や 3 のようにあらかじめ決まっていたら「val = x*x」や「val = x*x*x」と計算できたのだった。
しかし、今回は n を n のまま計算を行わねばならない。
言い替えれば「x を n 回かけた数」を計算するということである。
「x を n 回」という言葉から、「同じことを n 回繰り返す for 文」を使うことを思いつく。
これは以下の形式であった。
for(int i=0 ; i<n ; i++)
{
命令
}
では、どんな命令を n 回繰り返せば良いだろうか?
これまで学んだ中では第五回の「for 文を用いて整数の和を求めよう」が最も近いだろうか。
第五回では for 文内で「s = s + i」を繰り返し、「i を 1 から 10 まで変化させたときの和」を計算していた。
それを真似して、val に x を足して行くのはどうだろうか?
for(int i=0 ; i<n ; i++)
{
val = val + x;
}
実行してみるとわかるが、これは正解ではない。xn ではなく nx、すなわち x の n 倍 (x を n 回足したもの) が計算される。
さて、十分ヒントを与えた (与えすぎた) のであとは課題を解いて欲しい。
←関数の基礎/
課題→
オンラインコンパイラで C/C++ を自習しように戻る