構造体の説明の2週目ということで、実際のプログラム作成に近いものを 説明するために、構造体の関数呼び出しについて説明する。
基本となるプログラムは、今まで文字配列と整数配列2つで書いていたものを、 構造体を使って書き換えたもの。
struct Student { char name[ 20 ] ; int kokugo ; int sansu ; } ; void main() { struct Student ei[ 50 ] ; int size ; for( size = 0 ; scanf( "%s%d%d" , ei[ size ].name , &( ei[ size ].kokugo ) , &( ei[ size ].sansu ) ) == 3 ; size++ ) { printf( "%s %d %d¥n" , ei[ size ].name , ei[ size ].kokugo , ei[ size ].sansu ) ; } }
このプログラムで、ei[] 以外の配列にも入出力が必要であれば、 入力専用関数や出力専用関数があったほうが便利。
int inputStudent( struct Student* p ) { return scanf( "%s%d%d" , (*p).name , &( (*p).kokugo ) , &( (*p).sansu ) ) == 3 ; } void printStudent( struct Student* p ) { printf( "%s %d %d¥n" , (*p).name , (*p).kokugo , (*p).sansu ) ; // 同じ処理をアロー演算子だと以下のように書ける。 // printf( "%s%d%d¥n" , p->name , p->kokugo , p->sansu ) ; } void main() { struct Student ei[ 50 ] ; for( size = 0 ; inputStudent( &( ei[ size ] ) ) ; size++ ) { printStudent( &( ei[ size ] ) ) ; } }
この様な構造体のデータを取り扱う関数を準備し、 メイン処理では、その関数を呼び出すようにすれば、 メイン処理では、データ構造の中身や、その関数の中身を知らなくても、 入力・出力処理が行われることが予想しやすい。 このため、メイン処理を記述する人と、データ構造の処理を記述する人で、 作業の分担がしやすく、かつ、データ構造の変更があった時に、 メイン処理の変更を殆ど無い状態にできる。
また、最初の説明では、既存のポインタ渡しの延長で説明を行ったが、 "(*p).member"というのは、面倒でありアロー演算子が使えることを説明する。
この後は、授業の範囲外ということで、同じプログラムをオブジェクト指向で 書いてみた例を示し、データ隠蔽・手続き隠蔽といった用語を説明する。