第10講 関数の学習
第12話 トレースの続きその2

j 0 1 2 3
i
0  1  6 11 16
1 15 12  5  2
2  8  3 14  9
3 10 13  4  7
l 0 1 2 3
k
0  1  6 11 16
1 15 12  5  2
2  8  3 14  9
3 10 13  4  7


00000007
はif文によって対象外にされるセル


i j セル内の数字
0 0 1
k l セル内の数字
0 0 1
0 1 6
0 2 11
0 3 16
1 0 15
1 1 12
1 2 5
1 3 2
2 0 8
2 1 3
2 2 14
2 3 9
3 0 10
3 1 13
3 2 4
3 3 7
0 1 6
k l セル内の数字
0 1 6
0 2 11
0 3 16
1 0 15
1 1 12
1 2 5
1 3 2
2 0 8
2 1 3
2 2 14
2 3 9
3 0 10
3 1 13
3 2 4
3 3 7
0 2 11
k l セル内の数字
0 2 11
0 3 16
1 0 15
1 1 12
1 2 5
1 3 2
2 0 8
2 1 3
2 2 14
2 3 9
3 0 10
3 1 13
3 2 4
3 3 7
0 3 16
k l セル内の数字
0 3 16
1 0 15
1 1 12
1 2 5
1 3 2
2 0 8
2 1 3
2 2 14
2 3 9
3 0 10
3 1 13
3 2 4
3 3 7
1 0 15
k l セル内の数字
1 0 15
1 1 12
1 2 5
1 3 2
2 0 8
2 1 3
2 2 14
2 3 9
3 0 10
3 1 13
3 2 4
3 3 7
1 1 12
k l セル内の数字
1 1 12
1 2 5
1 3 2
2 0 8
2 1 3
2 2 14
2 3 9
3 0 10
3 1 13
3 2 4
3 3 7
1 2 5
k l セル内の数字
1 2 5
1 3 2
2 0 8
2 1 3
2 2 14
2 3 9
3 0 10
3 1 13
3 2 4
3 3 7
1 3 2
k l セル内の数字
1 3 2
2 0 8
2 1 3
2 2 14
2 3 9
3 0 10
3 1 13
3 2 4
3 3 7
2 0 8
k l セル内の数字
2 0 8
2 1 3
2 2 14
2 3 9
3 0 10
3 1 13
3 2 4
3 3 7
2 1 3
k l セル内の数字
2 1 3
2 2 14
2 3 9
3 0 10
3 1 13
3 2 4
3 3 7
2 2 14
k l セル内の数字
2 2 14
2 3 9
3 0 10
3 1 13
3 2 4
3 3 7
2 3 9
k l セル内の数字
2 3 9
3 0 10
3 1 13
3 2 4
3 3 7
3 0 10
k l セル内の数字
3 0 10
3 1 13
3 2 4
3 3 7
3 1 13
k l セル内の数字
3 1 13
3 2 4
3 3 7
3 2 4
k l セル内の数字
3 2 4
3 3 7
3 3 7
k l セル内の数字
3 3 7

void f2(void){
  char i;
  char j;
  char k;
  char l;
  String^ w=L"";
  char h=0;

  for(i=0;i<4;i++){
    for(j=0;j<4;j++){
      for(k=i;k<4;k++){
        for(l=j;l<4;l++){
          if((k!=i) | (l!=j)){
            if(a[i][j]==a[k][l]){
              h=1;
              break;
            }
          }
        }
        if(h==1)break;
      }
      if(h==1)break;
    }
    if(h==1)break;
  }
  if(h==0)label2->Text=L"数字の重複はありませんでした。";
  if(h==1)label2->Text=L"数字の重複がありました。";
}

4次元のfor文全体にわたって、if文の条件の条件a[i][j]==a[k][l]を満たさず、
if(a[i][j]==a[k][l]){
  h=1;
  break;
}
は1度も実行されません。したがって、char h=0で初期化されていたhは変更されずh=0のままです。
よって、if(h==0)label2->Text=L"数字の重複はありませんでした。";より『数字の重複はありませんでした。』と表示されます。

j 0 1 2 3
i
0  1  6 11 16
1 15 12  5  2
2  8  3 14  9
3 10 13  4  7
l 0 1 2 3
k
0  1  6 11 16
1 15 12  5  2
2  8  3 14  9
3 10 13  4  7

そして、すべての組み合わせ(1,6)、(1,11)、・・・、(4,7)の120通りすべてあることをご確認ください。
120通りは16C2=(16×15)/(2×1)=120通りの計算からも確認できます。また、下の表からも確認できます。

01 06 11 16 15 12 05 02 08 03 14 09 10 13 04 07
01 ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○
06 ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○
11 ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○
16 ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○
15 ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○
12 ○ ○ ○ ○ ○ ○ ○ ○ ○ ○
05 ○ ○ ○ ○ ○ ○ ○ ○ ○
02 ○ ○ ○ ○ ○ ○ ○ ○
08 ○ ○ ○ ○ ○ ○ ○
03 ○ ○ ○ ○ ○ ○
14 ○ ○ ○ ○ ○
09 ○ ○ ○ ○
10 ○ ○ ○
13 ○ ○
04 ○
07


したがって、
void f2(void){
  char i;
  char j;
  char k;
  char l;
  String^ w=L"";
  char h=0;

  for(i=0;i<4;i++){
    for(j=0;j<4;j++){
      for(k=i;k<4;k++){
        for(l=j;l<4;l++){
          if((k!=i) | (l!=j)){
            if(a[i][j]==a[k][l]){
              h=1;
              break;
            }
          }
        }
        if(h==1)break;
      }
      if(h==1)break;
    }
    if(h==1)break;
  }
  if(h==0)label2->Text=L"数字の重複はありませんでした。";
  if(h==1)label2->Text=L"数字の重複がありました。";
}
のプログラムで過不足がないことがわかります。


第11話へ 第13話へ



初心者のためのJava 入門 基礎から応用まで
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすい vb 入門 vba 入門 基礎から応用まで 第1部
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ