第4講 for文を理解しよう
第7話 前話解答と新しい課題
1+(1+2)+(1+2+3)+(1+2+3+4)のコード
void f1(){
   int a,b,i,j;
   b=0;
   for(i=1;i<5;i++){
     a=0;
     for(j=1;j<i+1;j++){
       a=a+j;
     }
     b=b+a;
   }
   cout<<"等差数列の和の和:"<<b<<endl;
}
トレース
ループが入れ子式に2回入っているループを2次元ループといいます。
1次元に比べ、2次元は格段に難しくなります。
1+(1+2)+(1+2+3)の場合すなわち
void f1(){
   int a,b,i,j;
   b=0;
   for(i=1;i<4;i++){
     a=0;
     for(j=1;j<i+1;j++){
       a=a+j;
     }
     b=b+a;
   }
   cout<<"等差数列の和の和:"<<b<<endl;
}
の場合でトレースしてみましょう。
   b←0
Ⅰ i=1のとき
   for(i=1;i<4;i++){
     a=0;
     for(j=1;j<i+1;j++){
       a=a+j;
     }
     b=b+a;
   }
  は1回のみ処理されます。
  ですから
  a←0
  a←a+1=0+1
  そして、 
  b←b+a=0+1
  で現時点でbは1です。
Ⅱ i=2のとき
   a←0
   この後、i+1=3なので
     for(j=1;j<i+1;j++){
       a=a+j;
     }
  は2回処理されます。
  ⅰ j=1の場合
    a←a+j=0+1
  ⅱ j=2の場合
    a←a+j=1+2
  2回のループ処理により、aは3となっています。
  すると、
  b←b+a=1+3により、bはこの時点で4となっています。
Ⅲ i=3のとき
   a←0
   この後、i+1=4なので
     for(j=1;j<i+1;j++){
       a=a+j;
     }
  は3回処理されます。
  ⅰ j=1の場合
    a←a+j=0+1
  ⅱ j=2の場合
    a←a+j=1+2
  ⅲ j=3の場合
    a←a+j=3+3
  3回のループ処理により、aは6となっています。
  すると、
  b←b+a=4+6により、bは10となります。
Ⅳ i=4のとき
   a←0
   この後、i+1=5なので
     for(j=1;j<i+1;j++){
       a=a+j;
     }
  は4回処理されます。
  ⅰ j=1の場合
    a←a+j=0+1
  ⅱ j=2の場合
    a←a+j=1+2
  ⅲ j=3の場合
    a←a+j=3+3
  ⅳ j=4の場合
    a←a+j=6+4
  3回のループ処理により、aは10となっています。
  すると、
  b←b+a=10+10により、bは20となります。
これで2次元ループは終了となり
   cout<<"等差数列の和の和:"<<b<<endl;
によって、コンソール画面に20が出力されます。


では、新しい課題です。
2次元ループを利用して
入門
と出力するようにしてください。
答えが1桁(10は例外)と2桁の場合に分けないと、
C
とうまくそろいません。2次元ループを答えが10以下と11以上の場合に分けて2回実行するとうまくいきます。

尚、改行はcout<<endl;ですし、スペースを入れる場合はcout<<5*i+j<<" ";などです。
5*i+jは今回の大きなヒントです。

この課題に成功した人は、次に
言語を実現しましょう。
かなり難しい課題ですよ。

第6話へ 第8話へ


戻る


VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)