プログラミング 07 - Soft Forum P.C. Club

for

繰り返し処理を行うには少しwhileは使いにくくないでしょうか?

whileは一般に決まった数の繰り返しを行うというより, 条件が一致するまで実行し続けるといった無限ループ前提のような面があります.

決まった数字の繰り返しには, forを使うことでより簡潔に記述することができます.

example

まず1から10までの積の合計, つまり10!の計算をしてみます.

#include <stdio.h>

int main(int argc, const char *argv[]) {
  int i, n = 10, res = 1;
  for (i = 1; i <= n; i++) {
    res *= i;
  }
  printf("%d\n", res);
  return 0;
}

forは次のようなsyntaxを持っています.

for(初期化; 条件; インクリメント) 文;

exampleの場合, i = 1にして初期化, i <= nの間forの文が実行され, 最後にi++されてまた条件を調べます. 実はこれはwhileでそのまま書くことができます.

forの

int i, n = 10, res = 1;
for (i = 1; i <= n; i++) {
  res *= i;
}

はwhileでかくと,

int i, n = 10, res = 1;
i = 1;
while (i <= n) {
  res *= i;
  i++;
}

とまったく同じ挙動をします. じゃあ何でforがあるんやって話ですが, for文ではi=1がカウンターの初期化, i <= nが条件, i++が条件を変化させる部分というのがすっぱり分かれてわかりやすく書かれています.

また, forではn回実行というのが非常に直感的に書くことができます. 10回printfをしてcountを出してみましょう.

#include <stdio.h>

int main(int argc, const char *argv[]) {
  int i, n = 10;
  for (i = 0; i < n; ++i) {
    printf("%d\n", i);
  }
  return 0;
}

0から9まで, 10回printfが実行され数値が表示されました. while (n--)と比べてわかりやすく, かつiの数字を使って今何回目かを0から始める形でcountできます.

例題

ちょこちょこいろいろできるよ感を持ってもらおうと, FizzBuzzというものをやってみます.

FizzBuzzとは?

なものです. 具体的には,

1から100までカウントしていくときに,

というものです. 出力例としては,

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
.
.
.

となります.

解答

do-while

whileの変形として, do whileというものがあります.

#include <stdio.h>

int main(int argc, const char *argv[]) {
  int i;
  do {
    printf("input integer (more than 0): ");
    scanf("%d", &i);
  } while (i < 0);
  printf("received value is %d\n", i);
  return 0;
}

正の数が入力されるまで入力を繰り返すという場合のprogramです.

dowhile(条件式);

となっており, まず文を実行, その後条件式を調べ, trueならまた文を実行するという風にloopします.

使用例としては上のように, 一度値を受け取ってそれが条件にあっていなければ繰り返すといったような何かしら一度実行してみてからじゃないとloopするかどうかわからないものに関して使います.

Soft Forum P.C. Club