構造体の配列



学習課題

構造体の配列を利用したデータ保存

C言語では構造体の配列を利用してデータベースを作ることができる.
たとえば,次のような世界の人口に関するデータが与えられているとする.

地域名
人口 [百万人]
asia
3769
north_america
498
south_america
357
europe
725
africa
832
oceania
31
nowhere
0

なお,最後の行に"nowhere"という地域名を与えているが,これは,データの終わりを認識させるための便宜的な地域名である.したがって, "nowhere"の人口としては0を与えている.

各行を見ると,地域名+人口というデータの組み合わせになっているので,この組み合わせをそのまま構造体として定義しておくと便利である.
そこで,

人口情報 = {地域名,人口}

という構造体を定義することにする.
地域名を保存するためには20文字を保存する程度の文字型変数の配列があれば十分であり,人口を保存するためにはやや大きめの整数型変数(long)があ ればよい. そこで,地域名を保存する文字型変数配列region[ ],人口を保存する整数型変数popを準備し,人口情報にpop_dtという構造体名をつけると,

struct pop_dt {         /* 人口情報構造体 */
    char region[20];    /* 地域名 */
    long pop;           /* 人口 */
};

というように構造体が定義できる.

構造体の配列の準備

上に示した世界人口のデータは全部で7行ある.つまり,7個のpop_dt構造体があ れば,これらのデータを保存できる.そこで,pop_dt構造体の配列を次のように準備する.

struct pop_dt world[7];

つまりworldという配列名で7個のpop_dt構造体が保存されることになる.

構造体の配列への代入
上に示した世界人口のデータを一度に構造体の配列worldに保存するためには,次のように書けばよい.

struct pop_dt world[7]= {
        {"asia", 3769},
        {"north_america", 498},
        {"south_america", 357},
        {"europe", 725},
        {"africa", 832},
        {"oceania", 31},
        {"nowhere", 0}
    };

あるいは,データの数で配列の大きさを自動的に決定できるので,

struct pop_dt world[]= {
        {"asia", 3769},
        {"north_america", 498},
        {"south_america", 357},
        {"europe", 725},
        {"africa", 832},
        {"oceania", 31},
        {"nowhere", 0}
    };

というように配列の大きさを省いてもよい.

演習1

世界人口データを一覧表として印刷するための次のプログラムを完成させよ.

#include <stdio.h>

struct pop_dt {
    <空欄>
};

int main( void )
{
    struct pop_dt world[]= {
        {"asia", 3769},
        {"north_america", 498},
        {"south_america", 357},
        {"europe", 725},
        {"africa", 832},
        {"oceania", 31},
        {"nowhere", 0}
    };
    int i;

    printf( "region              population\n" );
    printf( "------------------------------\n" );

    for ( i=0; world[i].pop != 0; i++ ) {
        printf( "%-15s     %6d\n", <空欄>);
    }
}

演習2

上のプログラムでは"nowhere"とその人口は画面上に出力されない.もし, "nowhere"とその人口も出力させるのならば,どのようにプログラムを書き換えたらよいか.

演習3

演習1のプログラムを元に,世界人口の合計を計算し,下のように表示するプログラムを 作れ.
※世界人口の合計は手で計算せず,プログラム内で計算するようにせよ.

region              population
------------------------------
asia                  3769
north_america          498
south_america          357
europe                 725
africa                 832
oceania                 31
------------------------------
world                 6212

演習4

演習3をさらに改良し,各地域の人口が世界人口に占める割合を下のように表示できるよ うにせよ.
※世界人口の合計をまず計算し,そのあとに画面に表を出力するようにプログラムを書くこと.

region                population
------------------------------------
asia                  3769 ( 60.7%)
north_america          498 ( ??.?%)
south_america          357 ( ??.?%)
europe                 725 ( ??.?%)
africa                 832 ( ??.?%)
oceania                 31 ( ??.?%)
------------------------------------
world                 6212 (100.0%)

演習5

人口が最大および最小の地域のみを出力するように改良せよ.

演習6

次の表は山口県内の10万人を越える都市の一覧 表である.構造体にこのデータを保存し,さらに,このデータを一覧表として出力するプログラムを作れ.

都市名
人口 [人]
面積 [ha]
Shimonoseki
246,924
22,405
Ube
171,395
21,038
Yamaguchi
137,045
35,690
Tokuyama
157,383 65,600
Hofu
119,133
18,859
Iwakuni
106,451
22,115


以上



出典:B. W. カーニハン,D. M. リッチー著 石田晴久訳 『プログラミング言語C第2版』(共立出版株式会社),1989年