ホーム » スタッフ » 斉藤徹 » 構造体と関数とアロー演算子

2013年10月
« 9月   11月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

構造体と関数とアロー演算子

前回の授業で、構造体の入れ子などの話をしたので、 構造体のポインタ渡しと、オブジェクト指向について話を行う。 オブジェクト指向については、プログラム記述はテスト範囲とはしないことを伝えておく。

ポインタ渡しによる関数化

構造体の配列に対する処理の例として、入力処理と出力処理を関数化する例を示す。

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() ;
}
}