構造体と関数とアロー演算子
前回の授業で、構造体の入れ子などの話をしたので、 構造体のポインタ渡しと、オブジェクト指向について話を行う。 オブジェクト指向については、プログラム記述はテスト範囲とはしないことを伝えておく。
ポインタ渡しによる関数化
構造体の配列に対する処理の例として、入力処理と出力処理を関数化する例を示す。
struct Person { char name[ 10 ] ; int age ; } ; void input( struct Person* p ) { scanf( "%s%d" , (*p).name , &( (*p).age ) ) ; } void output( struct Person* p ) { scanf( "%sさんの年齢は%d歳です\n" , (*p).name , (*p).age ) ; } void main() { struct Person data[ 10 ] ; for( int i = 0 ; i < 10 ; i++ ) { input( &(data[i]) ) ; output( &(data[i]) ) ; } }
ただし、(*p).name といった記載は、面倒なので、 p->nameといった記載が可能。
このプログラムでは、main内部には、Person内部のデータについての 記載がない。このため、Personというデータの内部を知らなくても、 10件分のデータの入力出力が記述できる。 こういった、データ構造や関数内の処理を知らなくても、プログラム記述が できることを隠蔽化と呼ぶ。 特に、関数を用いることで、関数内部の処理手順を知らなくてもよくなり、 これは「手続きの隠蔽化」と呼ばれる。 また、構造体を用いることで、データ構造の内部を知らなくてもよいことは、 「データの隠蔽化」と呼ばれ、この2つの隠蔽化をうまく使えば、 プログラム作成の分業化ができるようになる。
オブジェクト指向
前述の構造体を用いたプログラムは、オブジェクト指向の考え方の 入口となる。このプログラムは、C++であれば。
class Person { private: char name[ 10 ] ; int age ; public: void input() { scanf( "%s%d" , name , &age ) ; } void output() { printf( "%sさんは%d歳です。\n" , name , age ) ; } } ; void main() { Person data[ 10 ] ; for( int i = 0 ; i < 10 ; i++ ) { data[ i ].input() ; data[ i ].output() ; } }