3.6 for 文による繰り返し

ある条件が満たされている間の繰り返しには for() が便利である。
  for (最初にすること; 継続の条件; 各繰り返しの最後にすること)
    文;

括弧 { } でくくることにより、複数の文をまとめた複文が使える。
  for (最初にすること; 継続の条件; 各繰り返しの最後にすること) {
    文1;
    文2;
    ...
    文n;
  }

よくあるパターンとして、 「n 回の繰り返し」をするために次のように書くことがある。
n回の繰り返し
   for (i = 0; i < n; i++) {
      文;
      文;
   }


応用として、 「 $ n=1,2,\dots$ に対して $ 2^n$, $ 2^{-n}$ を計算して表示せよ」 という問題を解いてみよう。 $ x_n:=2^n$, $ y_n:=2^{-n}$ とおくと、 数列 $ \{x_n\}$, $ \{y_n\}$

  $\displaystyle x_0=1,\quad x_{n}=2x_{n-1}$   $\displaystyle \mbox{($n=1,2,\dots$)}$$\displaystyle ,$    
  $\displaystyle y_0=1,\quad y_{n}=y_{n-1}/2$   $\displaystyle \mbox{($n=1,2,\dots$)}$    

という漸化式で定義できることに注目し、それを用いて計算してみよう。

prog06.c

/* prog06.c --- for 文による繰り返し (1) */

#include <stdio.h>

int main(void)
{
  int i, n;
  double x, y;

  printf("自然数を一つ入力してください: ");
  scanf("%d", &n);

  x = 1.0; y = 1.0;
  for (i = 1; i <= n; i++) {
    /* x をその 2 倍で、y をその 1/2 倍で置き換える */
    x = 2 * x; y = y / 2;
    /* 次の %g を %f や %e に変えて試してみよう */
    printf("2の%d乗=%g, 1/2の%d乗=%g\n", i, x, i, y);
  }
  return 0;
}

prog06 の実行結果
% ./prog06 
自然数を一つ入力してください: 20
2の1乗=2, 1/2の1乗=0.5
2の2乗=4, 1/2の2乗=0.25
2の3乗=8, 1/2の3乗=0.125
2の4乗=16, 1/2の4乗=0.0625
2の5乗=32, 1/2の5乗=0.03125
2の6乗=64, 1/2の6乗=0.015625
2の7乗=128, 1/2の7乗=0.0078125
2の8乗=256, 1/2の8乗=0.00390625
2の9乗=512, 1/2の9乗=0.00195312
2の10乗=1024, 1/2の10乗=0.000976562
2の11乗=2048, 1/2の11乗=0.000488281
2の12乗=4096, 1/2の12乗=0.000244141
2の13乗=8192, 1/2の13乗=0.00012207
2の14乗=16384, 1/2の14乗=6.10352e-05
2の15乗=32768, 1/2の15乗=3.05176e-05
2の16乗=65536, 1/2の16乗=1.52588e-05
2の17乗=131072, 1/2の17乗=7.62939e-06
2の18乗=262144, 1/2の18乗=3.8147e-06
2の19乗=524288, 1/2の19乗=1.90735e-06
2の20乗=1.04858e+06, 1/2の20乗=9.53674e-07
% 

繰り返しの命令には、 他に while () ...do ... while () などがある。



桂田 祐史