第十一回課題
前回の課題で目標とした beki 関数の回答は以下のようである
(なお、今回の内容は前回の課題の締め切りが過ぎてから公開している)。
double beki(double x, int n)
{
double val;
val = 1;
for(int i=0 ; i<n ; i++)
{
val = val * x;
}
return val;
}
これにより可能になるのは、beki(x, n) という記述で、0 以上の整数 n に対して xn を計算することである。すなわち、
- beki(2, 0) : 20 = 1
- beki(2, 1) : 21 = 2
- beki(2, 2) : 22 = 4
- beki(2, 10) : 210 = 1024
上記のような計算ができるということである。
この beki 関数を拡張し、n が負の整数の場合にも正しく計算が行われるようにせよ。
すなわち、
- beki(2, -1) : 2-1 = 1/2 = 0.5
- beki(2, -2) : 2-2 = 1/4 = 0.25
- beki(2, -3) : 2-3 = 1/8 = 0.125
などである。
ちなみに、先週の状態でなぜ n が負の整数の場合に beki(x, n) が正しく計算されないかというと、以下の for 文の計算が一度も行われないからである
(i が n より小さいときのみ計算が行われるのだった)。
for(int i=0 ; i<n ; i++)
{
val = val * x;
}
さて、今回の課題を解くためのプログラムの枠組みは以下である。
#include <iostream>
using namespace std;
double beki(double x, int n);
int main(void)
{
double y;
y = beki(2, -1);
cout << "yの値は" << y << "\n";
y = beki(2, -2);
cout << "yの値は" << y << "\n";
y = beki(2, -3);
cout << "yの値は" << y << "\n";
}
double beki(double x, int n)
{
double val;
val = 1;
if(n >= 0)
{
// n が 0 以上の整数の場合 (前回の条件)
for(int i=0 ; i<n ; i++)
{
val = val * x;
}
}
else
{
// n が 負の整数の場合 (今回の条件)
n = - n; // n を正の整数に変換。-1を1に、-2を2に…など
// ここにプログラムを書くこと
}
return val;
}
今回も、paiza.IO のプログラムを全て差し替える形となっている。
すなわち、まず paiza.IO のデフォルト状態のプログラム記述欄でキーボードで「Ctrl-a」を実行し、プログラム全体を選択する。
そして、キーボードのDeleteキーを押して、プログラム全体を削除する。
その結果、もちろん以下のようにプログラムが全く書かれていない状態になる。
その状態で、提示したプログラムをマウスで選択し、キーボードの Ctrl-c によりコピーする。
その後、何も書かれていない paiza.IO にてキーボードで Ctrl-v を実行してプログラム全体を貼り付けるのである。
さて、提示したプログラムの構造の中で下記の if~else 文がある。
if(n >= 0)
{
// n が 0 以上の整数の場合 (前回の条件)
(略)
}
else
{
// n が 負の整数の場合 (今回の条件)
n = - n; // n を正の整数に変換。-1を1に、-2を2に…など
// ここにプログラムを書くこと
}
if 文は本講義中で何度も取り扱っているので慣れて来ただろうか。
以下の2つに処理を分岐させているのである。
- n が0以上の正の整数の場合
- n が負の整数の場合
もちろん、皆さんが今回書くのは「n が負の整数の場合」の方のプログラムである。
「// ここにプログラムを書くこと」の部分に皆さんのプログラムを書くのである。
ただし、「なるべく皆似たプログラムなるように」、「問題を解く際、前回の内容をなるべく流用できるように」という二つの目的で
「n が負の整数の場合」の方のプログラムにあらかじめ以下の命令を加えてある。
n = - n; // n を正の整数に変換。-1を1に、-2を2に…など
n が負の整数の場合、例えば n が -1 や -2 の場合を考えているのだが、
上記の命令により、 n は正の整数に変換される。言い方を変えれば、n の絶対値を取り、それを n に格納し直している。
「なぜ?」と思うかも知れないが、これをすることで前回の課題の答えを流用しやすくなるのである。
以上、十分すぎるヒントを与えたので課題を解いて欲しい。
なお、main 関数で beki(2, -1)、beki(2, -2)、beki(2, -3) を計算し画面表示させているので、
正しいプログラムを書ければ以下の出力が現れる。
オンラインコンパイラで C/C++ を自習しように戻る