演習
次のようなプログラムを作成せよ。なお、プログラムの作成においては、入力された に対 して、 人分の構造体と各々の名前を格納する記憶領域を動的に割り当てること。
入力: 整数、 人分の名前文字列と点数整数
出力: 入力された名前と点数の一覧表、平均点、最高点とその点を取った人の名前、最低点 とその点を取った人の名前。
【ヒント
コメント】
¯ プログラム例は、人分のデータを格納する領域を確保してから、名前と点数を入力し、
それらを出力するプログラムになっている。これを 人分のデータを格納する領域要素数 が の構造体 の配列を動的に確保し、 文などで 人分の名前と点数を入力して から、平均点を求めるなどの処理をすればよい。すなわち、
‥‥‥
人数
構造体 へのポインタ
‥‥‥
人数を入力
構造体 を個格納できる領域を動的に確保
は構造体 の配列名として使用できる
! や ! 等を用いて、名前と点数を入力
名前の入力方法はプログラム例"#参照
$
文等を用いて平均点、最高点、最低点を求め、
名前と点数の一覧や平均点、最高点とその点を取った人の名前、
最低点とその点を取った人の名前を出力すれば良い。
最高点や最低点の取り扱いについては演習"%参照。
‥‥
となる。
½ここであげるプログラム例では、の結果が でないことのチェックは省略している。
¯ 構造体 の配列ではなく、構造体 へのポインタの配列を用いているプログラム があった。例えば、 関数の中などで、
人数を入力
構造体 へのポインタの配列要素数
‥‥‥
構造体 "個分の領域を確保し、その領域へのポインタを にセット
は、 番目の構造体 へのポインタなので、
そのメンバーへのアクセスは、 &' &' となる
‥‥‥
のようなことを行っているプログラムがあったが、このようなプログラムは が小さい間は 正常に動作するものの、 が大きくなると、 や 等のエラーを発 生する¾。したがって、構造体 へのポインタの配列を用いる場合は、
構造体 へのポインタのポインタ
即ち、構造体 へのポインタの配列として使用
‥‥‥
人数を入力
構造体 へのポインタを個格納する領域配列を確保してにセット
構造体 "個分の領域を確保し、その領域へのポインタを にセット
は、 番目の構造体 へのポインタなので、
そのメンバーへのアクセスは、 &' &' となる
‥‥‥
のように、構造体 へのポインタの配列も動的に確保すべきである。このようなコード と、最初に示したコードを比べると、最初のコードの方が簡単であり、ポインタの配列が不 要な分だけ使用するメモリも少なくてすむ。
¾関数内で宣言するローカルな変数や配列は、「スタック領域」のメモリが使用される。通常「スタック領域」の大きさ
「 」コマンドで確認できる。このコマンドが出力する値の単位は。)は程度しかないため、大きな配 列は確保できない。これに対し、で確保する領域は「ヒープ領域」が使われる。このヒープ領域は、コンピュータに 実装している実メモリを含む仮想記憶空間が使用されるので、実メモリに近い大きさの領域を使うことが出来る。( では、「アップルメニュー」→「このについて」で実装されているメモリ容量を知ることができる。)