複雑な繰り返し文


前回の講義で導入した繰り返し文の複雑な使い方を説明する.

二重の繰り返し文

銀行に年利 5% で10000円預けた預金が 100 年でいくらになるのかを計算す るプログラムは以下のように書ける(実際の金利計算では1円以下は丸めるが, ここでは丸めずに計算することにする.).
class Bank{
  public static void main(String[] args){
    int year;
    double rate=1.05;
    double money=10000.0;
    for(year=0;year<100;year++){
      money*=rate;
    }
    System.out.println(year+"年後の預金は"+money+"円です");
  }
}
実行結果は以下のようになる
ktanaka@ux019> java Bank
100年後の預金は1315012.5784630391円です

なお,この中で出てくる.money*=rate という式は,money=money*rate と同 じ意味である.この手の略記法はC言語にならっている.多くの2項演算子は,

  x = x + y   -> x += y
  x = x - y   -> x -= y
  x = x * y   -> x *= y
  x = x / y   -> x /= y
  x = x % y   -> x %= y
のような略記法がある. 年利を1%から10%まで変化させた時はどうなるか.
    double rate=1.05;
の式を変更してコンパイルし直せばいいが,それは面倒くさい.このような場 合は,for文の中にfor文を入れるという二重のfor文で書くことができる.
class Bank{
  public static void main(String[] args){
    int year;
    int i;
    double rate;
    double money;
    for(i=1;i<=10;i++){
      // 1.00+i/100.0でも良いが, 一般に除算よりも乗算の方が速度の面で望ましい.
      rate=1.00+i*0.01;
      money=10000.0;
      for(year=0;year<100;year++){
	money=money*rate;
      }
      System.out.println(i+"%の利子で"+year+"年後の預金は"+money+"円です");
    }
  }
}
実行結果は以下のようになる.
1%の利子で100年後の預金は27048.13829421526円です
2%の利子で100年後の預金は72446.46118252345円です
3%の利子で100年後の預金は192186.319808563円です
4%の利子で100年後の預金は505049.4818426959円です
5%の利子で100年後の預金は1315012.5784630391円です
6%の利子で100年後の預金は3393020.835144873円です
7%の利子で100年後の預金は8677163.255664174円です
8%の利子で100年後の預金は2.199761256341301E7円です
9%の利子で100年後の預金は5.5290407918259196E7円です
10%の利子で100年後の預金は1.3780612339822382E8円です
表示結果の
8%の利子で100年後の預金は2.199761256341301E7円です
という部分が見苦しく見えるかもしれない.この表記は,
2.199761256341301E7 = 2.199761256341301 * 107
という意味で,広い範囲の値を取りうる実数を表示する際の表記法である.

繰り返し回数の分からない繰り返し文

預金が元の10倍の10万円を超えるのは,いつだろうか? 以下のように,1年ごとに 預金額を表示させてみよう.
class Bank{
  public static void main(String[] args){
    int year;
    double rate=1.05;
    double money=10000.0;
    for(year=0;year<100;year++){
      System.out.println(year+"年後の預金は"+money+"円です");
      money=money*rate;
    }
  }
}
実行結果,
0年後の預金は10000.0円です
...
47年後の預金は99059.71092325839円です
48年後の預金は104012.69646942131円です
..
を見ると,48年後だとわかる.しかし,せっかくコンピュータを使っているの に目で見て確かめるのは情けない.そこで,以下のようにプログラムを変更し てみる.
class Bank{
  public static void main(String[] args){
    int year;
    double rate=1.05;
    double money=10000.0;
    // 繰り返しのための条件を money<100000.0 に変更
    for(year=0;money<100000.0;year++){
      money=money*rate;
    }
    System.out.println(year+"年後の預金は"+money+"円です");
  }
}
これを実行してみると,
ktanaka@ux019> java Bank
48年後の預金は104012.69646942131円です
となる. このような繰り返し回数の確定しない繰り返し文を書く時に注意するのは,繰 り返しがいつかは終了するものにすることである.たとえば,利率が 0%とす ると,
class Bank{
  public static void main(String[] args){
    int year;
    double rate=1.00;
    double money=10000.0;
    for(year=0;money<100000.0;year++){
      money=money*rate;
    }
    System.out.println(year+"年後の預金は"+money+"円です");
  }
}
を実行すると,
ktanaka@ux019> java Bank
といつまでたっても終了しない.このような時は,C-c(コントロールキーを押 しながらCを押す)で強制的に終了させることができる.

その他の繰り返し文

for文以外の繰り返し文として,while文,do文というものがある.

まず while文は

 while (条件式)
   文
のように記述して,条件式が満たされる間,文を実行するというもので,
for(式1;式2;式3)
  文
の式1と式3がないのと同じ形である.慣習としては,繰り返し回数の決まっていない 繰り返しには,for文よりも,while文を使うことが多い.

他に,do文というものがある,

 do
  文
  while (条件式);
のような構造を持つ. while文と違い, 最低1回は文を実行する点が 異なっている.
 文;
 while (条件式)
  文;
と同じ意味になる.


課題1 以下のプログラムは, 借金を年割で返済するのにかかる年数を求めるプログ ラムである.
class Test{
  public static void main(String[] argv){
    int n;
    double rate=1.01; /* 利率 */
    double a=10000.0; /* 借金の額 */
    double y=200.0; /* 1年の返済額 */
    n=0;
    while (a>0.0) {
      a = a*rate- y;
      n = n+1;
      System.out.println(n+"年後の借金の残りは"+a+"です");
    }
    System.out.println(n+"年で返済できます");
  }     
}
  1. 利率,借金の額,1年の返済額をキーボードから入力できるようにプログラムを変更しなさい
  2. 以下のうちで一番返済に時間のかかる組合せを求めなさい
    利率 1% 借金 10000 返済 200
    利率 5% 借金 10000 返済 800
    利率 10% 借金 10000 返済 1100
    利率 20% 借金 10000 返済 2100
課題をこなしたら, lectures.g99.cp1-ktanaka-W-Wed-5 のニュースグループに投稿すること.
次に進む