第10講 関数の学習
第9話 関数f2と関数f3の役割の違い

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

  for(i=0;i<4;i++){
    for(j=0;j<4;j++){

      h=f3(i,j);
      if(h==1)break;
    }
    if(h==1)break;
  }

  if(h==0)label2->Text=L"数字の重複はありませんでした。";
  if(h==1)label2->Text=L"数字の重複がありました。";
}

char f3(char s,char t){
  char i;
  char j;
  char h=0;
  for(i=0;i<4;i++){
    for(j=0;j<4;j++){

      if((i!=s) | (j!=t)){
        if(a[i][j]==a[s][t]){
          h=1;
          break;
        }
      
 }
    }
    if(h==1)break;
  }

  return(h);
}

for(i=0;i<4;i++){
  for(j=0;j<4;j++){

      ・
  }
  f(h==1)break;
}


for(i=0;i<4;i++){
  for(j=0;j<4;j++){

      ・
  }

  if(h==1)break;
}

はまったく同じ形をしているにもかかわらず、役割が違うのです。
ピンクの方は、比べられるセルを動き、
紺色の方は、比べるセルを動きます。
比べられるセルと比べるセルとはどういうことでしょうか。

9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15

の数字に重複がないかを調べるには、すべてのセルの数字が自分以外のセルの数字と重なっていないかを調べなければなりません。
例えば、

9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15

06

のセル内の数字6が他のセル

9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15

の中の数字と一致していないか調べなければなりません。

06

が比べられるセル、

9 15 4
12 8 13 1
7 11 2 14
6 9 4 15

の一つ一つのセルが比べるセルです。
比べられるセル

00

9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15

のすべてを動いていきます。

9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15

この動きを実現するのが、f2の
for(i=0;i<4;i++){
  for(j=0;j<4;j++){

      ・
  }
  f(h==1)break;
}

です。
比べるセルは、例えば比べられるセルが

9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15

06

である場合、

9 15 4
12 8 13 1
7 11 2 14
6 9 4 15

ピンクの部分すべて動いていきます。

9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15

この動きを実現するのが、f3の
for(i=0;i<4;i++){
  for(j=0;j<4;j++){

      ・
  }

  if(h==1)break;
}

だったわけです。

関数にすることによって、対象の違いと動きの構造の同一性が明らかになりました。
ただし、構造の同一性といっても1点だけ違いがあります。

9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
9 15 4
12 8 13 1
7 11 2 14
6 9 4 15
このような対応表が16個ある。
比べられるセルが
9 6 15 4
12 8 13 1
7 11 2 14
6 9 4 15
06
の場合

それは、比べるセルの空白の存在です。セルは自分自身とは、比較してはいけないからです。自分自身と比べたら、セル内の数字は当然同一になってしまいます。
空白部分を実現するのが、if文if((i!=s) | (j!=t))だったわけです。

皆さん、実は
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=0;k<4;k++){
        for(l=0;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"数字の重複がありました。";
}
にしても、それの改良版
void f2(void){
  char i;
  char j;
  String^ w=L"";
  char h;

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

char f3(char s,char t){
  char i;
  char j;
  char h=0;
  for(i=0;i<4;i++){
    for(j=0;j<4;j++){
      if((i!=s) | (j!=t)){
        if(a[i][j]==a[s][t]){
          h=1;
          break;
        }
      }
    }
    if(h==1)break;
  }
  return(h);
}

にしても無駄があります。無駄は何でしょうか。

無駄を明らかにして、それぞれのプログラムを改良してください。

第8話へ 第10話へ



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