わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

2重ループで変数の値は何回変わる?

いきなりですが問題です.

#include <stdio.h>

int main(void)
{
  int i = 0, j = 0;

  for (i = 1; i <= 9; i++) {
    for (j = 1; j <= 9; j++) {
      printf("%2d ", i * j);
    }
    printf("\n");
  }

  return 0;
}

上のプログラムを実行すると,2重ループの中で変数jの値は何回,変わるでしょうか.
次の4つの中から選んでください.
① 1回
② 9回
③ 81回
④ 90回
「int i = 0, j = 0;」のところ,すなわち初期化は,数に入れないでください.


それでは解答です.理詰めでいくと,答えは④ 90回になります.
理由は次のとおりです.まずiの値が1のとき,for (j = 1; j <= 9; j++)のループで,jの値はまず,0から1になり,あとはj++の増分処理で,2, 3, 4, 5, 6, 7, 8, 9, 10と変わります.jの値が10になったところで,j <= 9は偽となりこのループを抜けます.
ここまでを整理すると,iが1のとき,jの値は10回変わります.
iが2のとき,3のとき,…,9のときまで,みな同じです.*1
さて,i++によって,iの値が9から10に変わったら,どうなるでしょうか.このとき,i <= 9は偽なので,iのループ,そして2重ループを抜けます.
どういうことかというと,iの値が10になって以降は,jの値は変わらないのです.
それでは,jの値が変わる,トータルの回数を計算します.jのforループだけを見ると,10回で,これはiの値に依存しません.そして,jのforループを実行する回数は,iが1から9までの9回となります.これらを掛けて,10×9=90.答えは90回となります.
この問題は,ある日の授業の最初に,小テストとして受講生に解いてもらいました.forループの振る舞い(「for (j = 1; j <= 9; j++)」だと,jの値は10になってからループを抜けることも)と,九九の表出力のプログラムは,その一つ前の授業で解説しました.
これらを組み合わせて問うたところ,正解率は30%ほどでした.

*1:細かいことですが,iの値が2以降のとき,jの値は最初に,10から1に変わります.