ホーム » スタッフ » 斉藤徹 » 構造体と関数呼び出し

2012年10月
« 9月   11月 »
 123456
78910111213
14151617181920
21222324252627
28293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

構造体と関数呼び出し

構造体の説明の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"というのは、面倒でありアロー演算子が使えることを説明する。

この後は、授業の範囲外ということで、同じプログラムをオブジェクト指向で 書いてみた例を示し、データ隠蔽・手続き隠蔽といった用語を説明する。