Thinkers'Studio
JavaとC言語の自習ツール
構造体配列を関数で操作する

 今回は、構造体配列関数に渡して操作する例です。
 下記プログラムでは、初期化によって値を与えていますが、前回のTips でファイルから構造体配列に読み込む例を紹介しています。併せて見て下さい。

構造体配列を関数に渡すプログラム例 】
 関数 whoIsTallest は、shape_t 構造体配列を引数で受け取ります。
 最後の要素の heightメンバ を max として比較を始めます。後ろから順に調べ、heightが一番大きかった要素番号を返します。
#include <stdio.h>
#define NSTARS ((sizeof stars)/(sizeof(shape_t)))  //stars配列の要素数を求める

typedef struct {        // 構造体の宣言
    char name[16];
    float height;
    float weight;
} shape_t;

// 一番身長の高い人の要素番号を返す
int whoIsTallest( shape_t s[], int num )
{
    float max;
    int  n;

    if( num < 1 ) return -1;
    n = --num;
    max = s[num].height;
    while( --num >= 0 ) {
        if( max < s[num].height ) {
            n = num;
            max = s[num].height;
        }
    }
    return n;
}

main()
{
    int mt;
    // 構造体配列の初期化 
    shape_t stars[] = { { "Brad_Pitt", 183.2, 73.4 }
                      , { "Tom_Cruise", 170.1, 67.2 }
                      , { "Johnny_Depp", 178.2, 70.5 }
                      , { "Will_Smith", 188.0, 78.3 }
                      , { "Bruce_Willis", 184.0, 78.3 }
                      };

    // 構造体配列を関数に渡す
    mt = whoIsTallest( stars, NSTARS );
    if( mt != -1 )
        printf( "The tallest is %s(%.1fcm)\n", stars[mt].name, stars[mt].height);
}
<呼び出される関数の形式>
   int whoIsTallest( shape_t s[], int num )   一番身長の高い人の要素番号を返す
<呼び出し方>
   whoIsTallest( stars, NSTARS );  渡されるのは構造体配列の先頭アドレス

(今回のクイズです)
 もし、関数の引数宣言が下記のような構造体へのポインタだとすると、呼び出し方はどうなるでしょうか?
 関数の処理内容は、ポインタで書くとどうなるかも考えてみましょう。
   int whoIsTallest2( shape_t *p, int num )
   (答えは、次回のC言語の Tips で ・・・)

[ 関連記事 ] 宣言:構造体宣言, 構造体タグ名  構造体配列:読み込み, ソート, ポインタソート
        構造体へのポインタ, リスト構造, 構造体を関数の戻り値に
[ ご案内 ] 構造体の要点を学習できるコース:要点講座 [ 構造体編 ]

前回のクイズの答え: (前回の問題を見る
 答えは、上のプログラムの main に書かれています。
 多次元配列の初期化と似ていますね。