3 ユーザー定義関数との構造体の受け渡し

普通の変数同様に,構造体型もユーザー定義関数との受け渡しができる.

3.1 構造体を渡す

引数に構造体を使うときは,普通の変数と同じである.リスト2の場合, student型の変数shimadaの値は,関数cal_av()を呼び出したときに,ロー カル変数gakuseiにコピーされる.そして,平均値を計算する関数での処理に使われ る.通常の変数と全く同じ.ただし,構造体の定義の位置は重要である.構造体を使う前 に定義しなくてはならない.
   1 #include <stdio.h>
   2 #include <string.h>             // strcpy を使うため
   3 
   4 typedef struct{                 // 構造体型 student の定義
   5   char name[80];
   6   int mathematics;
   7   int english;
   8   int info_eng;
   9 } student;
  10 
  11 int cal_av(student gakusei);    //プロトタイプ宣言
  12 
  13 //=========================================================
  14 // メイン関数
  15 //=========================================================
  16 int main(void)
  17 {
  18   student shimada;
  19   int hei;
  20 
  21   strcpy(shimada.name,"shimada masaharu");
  22   shimada.mathematics = 92;
  23   shimada.english = 88;
  24   shimada.info_eng = 45;
  25 
  26   hei=cal_av(shimada);
  27 
  28   printf("%s no heikin = %d\n", shimada.name, hei);
  29   
  30   return 0;
  31 }
  32 
  33 //=========================================================
  34 // 平均点を計算するユーザー定義関数
  35 //=========================================================
  36 int cal_av(student gakusei)
  37 {
  38   int av;
  39 
  40   av=(gakusei.mathematics + gakusei.english + gakusei.info_eng)/3;
  41 
  42   return av;
  43 }


\fbox{実行結果}
shimada masaharu no heikin = 75

3.2 構造体データを受け取る

戻り値の型を構造体型とすると,構造体を返すユーザー定義関数を作ることができる.こ れも通常の変数と同じ.その例をリスト3に示す.
   1 #include <stdio.h>
   2 #include <string.h>             // strcpy を使うため
   3 
   4 typedef struct{                 // 構造体型 student の定義
   5   int math;
   6   int eng;
   7 } student;
   8 
   9 student cal_av(student a[]);      //プロトタイプ宣言
  10 
  11 //=========================================================
  12 // メイン関数
  13 //=========================================================
  14 int main(void)
  15 {
  16   student E2[3], heikin;
  17 
  18   E2[0].math = 92;
  19   E2[0].eng = 88;
  20   E2[1].math = 42;
  21   E2[1].eng = 38;
  22   E2[2].math = 82;
  23   E2[2].eng = 23;
  24 
  25 
  26   heikin=cal_av(E2);
  27 
  28   printf("mathematics no heikin = %d\n",heikin.math);
  29   printf("English     no heikin = %d\n",heikin.eng);
  30   
  31   return 0;
  32 }
  33 
  34 //=========================================================
  35 // 平均点を計算するユーザー定義関数
  36 //=========================================================
  37 student cal_av(student a[])
  38 {
  39   student hei;
  40 
  41   hei.math = (a[0].math+a[1].math+a[2].math)/3;
  42   hei.eng = (a[0].eng+a[1].eng+a[2].eng)/3;
  43 
  44   return hei;
  45 }


\fbox{実行結果}
mathematics no heikin = 72
English     no heikin = 49




ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年4月17日


no counter