第11講 関数と配列
第5話 関数の再利用

前話解答例
(コピーペースト用
using namespace System;
void ds(int* t,int m,int n);
void tn(int* t,int m,int n);
void yh(int* t,int m,int n);
void xh(int* t,int m,int n);
void oh(int* t,int m,int n);
void hj(int* t,int m,int n);
int main(){
Console::WriteLine("Visual C++コンソールアプリケーションの世界にようこそ!");

int a,b;
a=10;
b=20;
Console::WriteLine("{0} {1}",a,b);

int x[10][10];

ds(&x[0][0],10,10);

Console::WriteLine("自然配列の表示");
hj(&x[0][0],10,10);

tn(&x[0][0],10,10);

Console::WriteLine("自然配列置換の表示");
hj(&x[0][0],10,10);

yh(&x[0][0],10,10);

Console::WriteLine("置換+左右対称移動の表示");
hj(&x[0][0],10,10);

xh(&x[0][0],10,10);

Console::WriteLine("置換+左右対称移動+上下対称移動の表示");
hj(&x[0][0],10,10);

oh(&x[0][0],10,10);

Console::WriteLine("置換+左右対称移動+上下対称移動+中心点対称移動の表示");
hj(&x[0][0],10,10);

}

void ds(int* t,int m,int n){
char i,j;
Console::WriteLine("自然配列を作成");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
*(t+10*i+j)=10*i+j+1;
}
}
}

void hj(int* t,int m,int n){
char i,j;


for(i=0;i<m;i++){
for(j=0;j<n;j++){
Console::Write("{0,4:D}",*(t+10*i+j));
}
Console::WriteLine();
}
}

void tn(int* t,int m,int n){
char i,j;
int y[10][10];
for(i=0;i<m;i++){
for(j=0;j<n;j++){
y[i][j]=*(t+10*i+j);
}
}
Console::WriteLine("自然配列を置換");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
*(t+10*i+j)=y[j][i];
}
}
}


void yh(int* t,int m,int n){
char i,j;
int y[10][10];
for(i=0;i<m;i++){
for(j=0;j<n;j++){
y[i][j]=*(t+10*i+j);
}
}
Console::WriteLine("置換+左右対称移動");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
*(t+10*i+j)=y[i][9-j];
}
}
}

void xh(int* t,int m,int n){
char i,j;
int y[10][10];
for(i=0;i<m;i++){
for(j=0;j<n;j++){
y[i][j]=*(t+10*i+j);
}
}
Console::WriteLine("置換+左右対称移動+上下対称移動");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
*(t+10*i+j)=y[9-i][j];
}
}
}

void oh(int* t,int m,int n){
char i,j;
int y[10][10];
for(i=0;i<m;i++){
for(j=0;j<n;j++){
y[i][j]=*(t+10*i+j);
}
}
Console::WriteLine("置換+左右対称移動+上下対称移動+中心点対称移動");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
*(t+10*i+j)=y[9-i][9-j];
}
}
}





using namespace System;
void ds(int* t,int m,int n);
void tn(int* t,int m,int n);
void yh(int* t,int m,int n);
void xh(int* t,int m,int n);
void oh(int* t,int m,int n);
void hj(int* t,int m,int n);
int main(){
Console::WriteLine("Visual C++コンソールアプリケーションの世界にようこそ!");

int a,b;
a=10;
b=20;
Console::WriteLine("{0} {1}",a,b);

  int x[10][10];

  ds(&x[0][0],10,10);

  Console::WriteLine("自然配列の表示");
  hj(&x[0][0],10,10);

  tn(&x[0][0],10,10);

  Console::WriteLine("自然配列置換の表示");
  hj(&x[0][0],10,10);

  yh(&x[0][0],10,10);

  Console::WriteLine("置換+左右対称移動の表示");
  hj(&x[0][0],10,10);

  xh(&x[0][0],10,10);

  Console::WriteLine("置換+左右対称移動+上下対称移動の表示");
  hj(&x[0][0],10,10);

  oh(&x[0][0],10,10);

  Console::WriteLine("置換+左右対称移動+上下対称移動+中心点対称移動の表示");
  hj(&x[0][0],10,10);

}

void ds(int* t,int m,int n){
  char i,j;
  Console::WriteLine("自然配列を作成");
  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      *(t+10*i+j)=10*i+j+1;
    }
  }
}

void hj(int* t,int m,int n){
  char i,j;

  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      Console::Write("{0,4:D}",*(t+10*i+j));
    }
    Console::WriteLine();
  }
}

void tn(int* t,int m,int n){
  char i,j;
  int y[10][10];
  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      y[i][j]=*(t+10*i+j);
    }
  }
  Console::WriteLine("自然配列を置換");
  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      *(t+10*i+j)=y[j][i];
    }
  }
}


void yh(int* t,int m,int n){
  char i,j;
  int y[10][10];
  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      y[i][j]=*(t+10*i+j);
    }
  }
  Console::WriteLine("置換+左右対称移動");
  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      *(t+10*i+j)=y[i][9-j];
    }
  }
}

void xh(int* t,int m,int n){
  char i,j;
  int y[10][10];
  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      y[i][j]=*(t+10*i+j);
    }
  }
  Console::WriteLine("置換+左右対称移動+上下対称移動");
  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      *(t+10*i+j)=y[9-i][j];
    }
  }
}

void oh(int* t,int m,int n){
  char i,j;
  int y[10][10];
  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      y[i][j]=*(t+10*i+j);
    }
  }
  Console::WriteLine("置換+左右対称移動+上下対称移動+中心点対称移動");
  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      *(t+10*i+j)=y[9-i][9-j];
    }
  }
}
関数の意義のときに1つ語り落とした点があります。
意義の1つは、部品の再利用が何度でも可能な点にあります。
関数hj(&x[0][0],10,10)を何度も再利用しています。
もし関数を作っていなければ、
  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      Console::Write("{0,4:D}",*(t+10*i+j));
    }
    Console::WriteLine();
  }
を何度も記述しなければならないのです。
数学において、複雑な計算をする場合できるだけ大きな共通部分を1つの文字の置き換えると計算がシンプルになるとの同じです。
void hj(int* t,int m,int n){
  char i,j;

  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      Console::Write("{0,4:D}",*(t+10*i+j));
    }
    Console::WriteLine();
  }
}
hj(&x[0][0],10,10);に置き換えたのと同じ働きになっています。

さて、皆さんこの関数の再利用をつかって、次の課題を実現してください。
課題は、
自然配列作成→自然配列の表示→自然配列の置換→自然配列置換の表示→
自然配列の左右対称変換(移動)
→自然配列左右対称変換の表示→自然配列の上下対称変換→自然配列上下対称変換の表示→自然配列の中心点対称変換
→自然配列中心点対称変換の表示

を実現することです。
前課題との違いは、
ピンクの部分です。例えば、自然配列の左右対称変換(移動)
と前課題の違いは、前課題では置換変換をしてさらに左右対称変換をしていたのに対して、自然配列を左右対称変換しなさいとしている点です。
前課題では、変換を重ねていったのに対して、変換の種類は様々であるにしろ常に自然配列を1回変換するだけです。



しかし、関数置換変換void tn(int* t,int m,int n);によって最初の自然配列は置換され、自然配列は残っていません。
どうしたらよいでしょうか。
ヒントは、
赤い枠の記述が消えているとです。
関数を再利用するとき、これが邪魔をするので削ったのです。
このヒントでもわからない場合は、ヒント2をクリック



第10講第13話へ  第11講第4話へ
 第11講第6話へ 第12講第1話へ



vc++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ