第26講 クラスの学習その1☆☆
第6話 メソッド解説その1
    ・
    ・
struct K{
  //フィールド
  char a[3][40];
  char as[3][40];

  char kok[40],sya[40],suu[40],rik[40],eig[40];
  int d[3][5];

  //メソッド
  void f1(char* na,char* nb,char* nc); //名前の取得
  void f2(char* sa,char* sb,char* sc); //性別の取得
  void f3(int nm,int d1,int d2,int d3,int d4,int d5); //得点の取得

};

void K::f1(char* na,char* nb,char* nc ){
  strcpy(a[0],na); //出席番号0の名前取得
  strcpy(a[1],nb); //出席番号1の名前取得
  strcpy(a[2],nc); //出席番号2の名前取得
}

void K::f2(char* sa,char* sb,char* sc ){
  strcpy(as[0],sa); //出席番号0の性別取得
  strcpy(as[1],sb); //出席番号1の性別取得
  strcpy(as[2],sc); //出席番号2の性別取得
}

void K::f3(int nm,int d1,int d2,int d3,int d4,int d5){
  d[nm][0]=d1; //出席番号nmの国語点数取得
  d[nm][1]=d2; //出席番号nmの社会点数取得
  d[nm][2]=d3; //出席番号nmの数学点数取得
  d[nm][3]=d4; //出席番号nmの理科点数取得
  d[nm][4]=d5; //出席番号nmの英語点数取得
}

void main(){
  int i,j;
  K A;
  A.f1("太郎","次郎","花子");
  A.f2("男","男","女");
    ・
    ・
  A.f3(0,85,65,78,59,82);
  A.f3(1,27,52,28,45,60);
  A.f3(2,95,97,88,99,93);

  cout<<"クラスA:" <<endl;
  cout<<"名前"<<" "<<"性"<<" "<<A.kok<<" "<<A.sya<<" "<<A.suu<<" "<<A.rik<<" "<<A.eig<<" "<<endl;
  for(i=0;i<3;i++){
    cout<<A.a[i]<<" "<<A.as[i];
    for(j=0;j<5;j++)if(A.d[i][j]<10)cout<<" "<<A.d[i][j]<<" ";else cout<<" "<<A.d[i][j]<<" ";
    cout<<endl;
  }
    ・
    ・
    ・
}

では、1行1行解説していきましょう。
まず、
  char a[3][40];
  char as[3][40];

  char kok[40],sya[40],suu[40],rik[40],eig[40];
  int d[3][5];
薄紺色の部分を配列に変えた理由から説明しましょう。
前2つ
  char a[3][40];
  char as[3][40];
につきましては、
  for(i=0;i<3;i++){
    cout<<A.a[i]<<" "<<A.as[i];
    for(j=0;j<5;j++)if(A.d[i][j]<10)cout<<" "<<A.d[i][j]<<" ";else cout<<" "<<A.d[i][j]<<" ";
    cout<<endl;
  }
にようにfor文で扱えるようにするためです。
  int d[3][5];
は、
  A.f3(0,85,65,78,59,82);
  A.f3(1,27,52,28,45,60);
  A.f3(2,95,97,88,99,93);

の3文に理由があります。
f3については後ほど説明しますが、
f3(int nm,int d1,int d2,int d3,int d4,int d5)
の各数字は、順に出席番号(ただし、0から始まる)、国語・社会・数学・理科・英語の各点数です。
  int d[3][5];
を配列にしないと、得点を入力するための関数を生徒ごとに用意しなければならなくなるのに対して、
配列にしたために得点入力関数は1つで済んでいます。
この例では、3人のクラスですが、配列にしておけば、40人のクラスであろうが、100名のクラスであろうが、
1つの得点入力関数で対応できるというわけです。

次に、メンバー関数=メソッド=操作について説明しましょう。
メンバー関数という言葉を聞いて、?が浮かぶ方がいらっしゃると思います。
社会科学、哲学あるいは数学などにおいて難しい文に遭遇したら、
最初にやるべき事は、修飾語をすべて取り除くことです。
例えば、
「『pならばqである』が真であるとき、
pをqであるための十分条件、
qをpであるための必要条件
という」
の説明に遭遇したとき、初心者にはなかなか意味がとりにくいものです。
そこで、単純に
「pをqの十分条件」「qをpの必要条件」と言い換えてしまえば、
比較的簡単に意味をとることができます。

メンバー関数で、意味がわからないと思う方は、メンバーを取り除いてください。
そうすると、VC++でいうメソッドは、関数ということになります。
メソッドや操作などといわれると確かにわかりにくいわけですが、
ここまで学習されてきた皆さんは、関数はよくお分かりのはずです。
関数については、繰り返して説明してきたとおり、プログラムの独立部品です。
関数と説明すれば、すっきりするのに何故わざわざメンバー関数というのでしょうか。
理由は簡単です。
クラスを構成するメンバーだからです。
クラスを構成するメンバーは、2種類あって、1つは変数、もう1つは関数というわけです。
普通の学校のクラス=組でいえば、変数はクラスを構成する生徒、
関数は、球技大会などのためにクラス内で作ったサッカーチームやバスケットボールチームなどの競技力であるなどとイメージすればよいでしょうか。
チーム自体は、クラス内に作った小クラスですから、操作には該当しません。
メンバー変数とメンバー関数は、クラスを構成する生徒とクラスの役割や働きであると、理解して下さい。

メンバー関数の定義は、普通はクラスの外で行います。
今回は、
struct K{
  //フィールド
  char a[3][40];
  char as[3][40];

  char kok[40],sya[40],suu[40],rik[40],eig[40];
  int d[3][5];

  //メソッド
  void f1(char* na,char* nb,char* nc); //名前の取得
  void f2(char* sa,char* sb,char* sc); //性別の取得
  void f3(int nm,int d1,int d2,int d3,int d4,int d5); //得点の取得

};

void K::f1(char* na,char* nb,char* nc ){
  strcpy(a[0],na);
  strcpy(a[1],nb);
  strcpy(a[2],nc);
}

void K::f2(char* sa,char* sb,char* sc ){
  strcpy(as[0],sa);
  strcpy(as[1],sb);
  strcpy(as[2],sc);
}

void K::f3(int nm,int d1,int d2,int d3,int d4,int d5){
  d[nm][0]=d1;
  d[nm][1]=d2;
  d[nm][2]=d3;
  d[nm][3]=d4;
  d[nm][4]=d5;
}

をご覧になればお分かりのように、クラスの外で行っています。
クラスの外という意味は、
struct K{
    ・
    ・
};
の外側ということです。
逆に、
struct K{
    ・
    ・
};
の内部で定義する場合もあります。
その事例は、第27講クラスの学習その2で扱います。

解説の続きは次話で。




第5話へ 第7話へ

戻る

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