構造体と関数呼び出し

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

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

 

2015年12月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

アーカイブ

Google

このブログ記事について

このページは、T-Saitohが2012年10月 3日 15:15に書いたブログ記事です。

ひとつ前のブログ記事は「ビニールハウス太陽光追尾制御」です。

次のブログ記事は「防災訓練」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。