ログイン
kid's world

決まった回数繰り返す

while文より少し賢いfor文

while文を使うと,いろいろな処理を繰り返して行うことができるようになる。たとえば「10回同じ処理を行う」ということもできるだろう。List 9に「こんにちは。」を10回たて続けに表示するプログラムを示す。このプログラムの構造を考えてみると,Fig. 5のようになっていることがわかる。

List 9: こんにちはを10回言うプログラム

#include <stdio.h>

main()
{
  int i;
  
  i=0;
  while(i<10) {
    printf("こんにちは。\n");
    i++;
  }
}

Fig. 5:

 初期化式;
 while(条件式) {
   文
   反復式;
 }

実はこのような「ある回数だけ繰り返す」ということを得意とする制御文がwhile文とは別に存在する。それがfor文である。Fig. 6にその構文を示す。本質的には,while文の機能を少し拡張した制御文である。したがって,while文だけを使っても同じことができるが,for文を使えばプログラムを見やすくすることができる。Fig. 6をwhileで書き直したのが,まさにFig. 5なのである。

Fig. 6: for文の構文

for(初期化式; 条件式; 反復式)
  文

羊の例ばかりで申しわけないが,ここで,List 4をfor文を使って書いてみよう(List 10)。以前のプログラムよりいくらかすっきりしたと思う。

List 10: for文で羊が100匹

#include <stdio.h>

main()
{
  int i;
  
  for(i=1; i<=100; i++)
    printf("羊が%d匹、",i);

  printf("…ぐーぐー。\n");
}

List 10では,

初期化式:「i=1」
条件式:「i<=100」
反復式:「i++」

が1行に収まっているため,非常に見やすい。for文を使って書けば,iは1から100まで1つ刻みで増えながら,文が繰り返し実行されているということがすぐに見てわかるようになっている。このように,変数をカウンタのように扱って何回か文を繰り返し実行するときは,while文ではなくfor文を使うとよい。

コンマ演算子

次に,for文で変数を複数使う場合について考えよう。これには,コンマ演算子という演算子が使える。その名のとおり,記号はコンマ「,」である。この演算子は「何も演算しない」演算子であり,式が1つしか書けないところで,複数の式を書くために使えるのだ。この演算子の優先順位はいちばん低いため,

i++, j+=20, k=100;

などと書くことができる。つまり,この演算子を使えば,for文の式を書くところに「事実上複数の式」を書くことができるようになるわけだ。たとえば,

for(i=0, j=0; j<100; i++, j+=i){
  printf("%d\n", j);
}

という表現が可能である。この例では,まず変数iとjが0に初期化され,iは1ずつ増え,jはiのぶんだけ増える。そのためjの値は加速度的に増え,jの値が100以上になったところでfor文のお役御免となる。

あまり利用例はないが,コンマ演算子の演算結果についてもついでに触れておこう。「式1,式2」の結果は「式2」の値となる。たとえば「i=10,j=20」という式は「20」という値となるわけだ。また,普通はこんなことはしないが,この演算子は左結合的なので,

i =(10,20,30,40);

とすると,iには40が代入されることになる。

制御文を抜け出すbreak文

前回はswitch文でその制御文から直ちに抜け出すbreak文を紹介したが,while文やfor文でもこのbreak文を使うことができる。

たとえば,つぎつぎに入力される数値を足して表示し,「0」を入力したときに最終的な結果を表示して終了するプログラムを作るにはどうしたらいいだろうか。実はdo while文を使うのがいちばんいい方法なのだが,ここではわざとwhile文とbreak文を使って書いてみよう(List 11)。

List 11: break文の例

#include <stdio.h>

main()
{
  int i=0, j;
  
  while(1) {
    printf("合計:%d 数値入力(0で終了):", i);
    scanf("%d", &j);
    if (j==0) {
      printf("終了します。\n");
      break;
    }
    printf("%dを足します。\n", j);
    i+=j;
  }
  
  printf("総計は%dです。\n", i);
}

whileの式には1が指定してあるので,本来ならば無限ループになってしまうのだが,入力された数値(jの値)を見て,それが0だった場合は「終了します。」と表示して,break文を呼び出している。break文を呼び出すとwhile文から抜け出すことができ,最後に「総計は〜」と表示されてプログラムは終了するようになるわけだ。各自でいろいろと実験していただきたい。また,文字が入力されても大丈夫なように改良してみてもいいだろう。

次のターンへ進むcontinue文

continue文は,break文と逆の働きをする文だ。break文は呼び出されると直ちにwhile文やfor文から抜け出すのに対し,continue文は,for文やwhile文のループの終端までのすべての文がスキップされる。つまり,その回の処理を終了し,次の回の実行へ進むと考えてよいだろう。List 12は,iの値が5のときだけcontinue文を実行し,その回の実行をスキップする例である。実行結果はFig. 7のようになる。

List 12: continue文の例

#include <stdio.h>

main()
{
  int i;
  
  for (i=0; i<10; i++) {

    if (i==5)
      continue;

    printf("i = %d\n", i);
  }
}

Fig.7: List 12の実行結果

i = 0
i = 1
i = 2
i = 3
i = 4
i = 6
i = 7
i = 8
i = 9

基本的には,「i =1」などと現在の変数iの内容を表示しているのだが,iが5のときに限り,それが表示されていない。これは,if文でiが5のときのみ,continue文を実行しているからだ。

continue文は,基本的にはwhile文の中で,何らかのエラーが起こったときに,その処理を行ったあとで,もう一度実行するときに使う,ということが多い。それを考えれば,なぜnextではなくcontinueという名前がついているのかがわかるだろう。

おわりに

今回は,繰り返し処理を行う制御文について解説した。スペースの関係上,あまり詳しく書くことはできなかったが,これらの制御文と配列を組み合わせると,さらに多くの有用なプログラムを作ることができるようになる。ぜひともこれまでに学んできた技術を組み合わせてフル活用して,役に立つプログラムを作っていただきたい。

次回は,いよいよファイルの入出力について解説する。ファイルの入出力ができるようになれば,さらに本格的なプログラムが作れるようになる。ぜひともマスターしていただきたい。


ファイルとは何か」へ進む

広告


©Toshio Koide 1996-2007.

目次

リンクについて

リンクは御自由にどうぞ。

メール

mail.gif

広告