【例題】iからnまでの自然数の総和を求めよう

例題として、iからnまでの自然数の総和を求めるプログラムについて考えてみましょう。
【例題】1からnまでの自然数の総和を求めよう のアレンジver.です。

動かしてみよう

サンプルコードを動かしてみましょう。
【例題】1からnまでの自然数の総和を求めよう では最終的に for文を使わないソースコードに仕立てましたが、最初はfor文でやってみましょう。
入力欄からの値を受け付けるサンプルコードにはなっていませんので、変数start, end の値をソースコード上で変えて実行してみてください。

では、解説に進みましょう。

解説

サンプルコードの要点をみてみましょう。

/* プロトタイプ宣言 */
int sum(int i, int n);

これは関数のプロトタイプ宣言です。
【例題】1からnまでの自然数の総和を求めよう では、計算の開始位置が 1 固定でしたが、今回は任意の箇所 i から計算を開始させるため、引数に int i を追加してあります。

続いてmain関数内です。

result = sum(start, end);

sum関数の引数が int i, int n の2つになったことに伴い、start, end をsum関数に入力させています。

sum関数の中身ですが、前回と異なりfor文の使い方が少し特徴的になりました。

for( ; i <= n; i++ )
{
    result += i;
}

for文の()内の最初の式が空欄になっています。
for文のページで解説してあるとおり、for文は

for(初期化; 継続条件; カウンタ更新 ){ 処理 }

という構文で構成されており、()内の初期化、継続条件、カウンタ更新のいずれもが省略することが可能でした。

今回のコードでは、初期化を省略することで、sum関数の引数i で受け取った位置からfor文を開始させています。
それにより、i〜nまでの総和の計算を実現させています。

処理速度を向上させよう

【例題】1からnまでの自然数の総和を求めようと同様、こちらの例題でも処理速度を向上させてみましょう。

せっかくなので、以前に作成した1〜nまでの総和を求める関数をsumBase関数に名称変更し、流用することにしました。
今回のsum関数内でsumBase関数を2回コールし、その差分をとることでi〜nまでの総和演算をさせています。

前回同様、nの値が大きくなった時でもfor文を何回も実行する必要がないので、処理速度の向上が望めますね。(関数コールによって遅くなる面もあるのですが、その点についてはここでは気にしていません。)

以前作成した関数が新機能を作成する時に流用できるのが、プログラミングの面白いところですね。

以上です。
ではまた。

タイトルとURLをコピーしました