構造体の配列


構造体変数の配列を作ることもできます。

struct Man student;

というように構造体変数を宣言していたところを

struct Man student[5];

などとすればよいですね。student[2]の name メンバにアクセスするには

student[2].name

とすればいわけです。[ ]と . は同じ優先順位の演算子です。こういう場合は結合規則が働きますね。[ ] や . の結合規則は →ですから、「student[2].name」は「(student[2].name)」の意味になります。

ソースコード

源文件
  1|/* structarray.c */
  2|
  3|#include <stdio.h>
  4|
  5|#define STUDENTNO 5
  6|#define SUBJECTNO 3
  7|
  8|int drawline(void);
  9|
 10|struct SEISEKI {
 11|  char name[32];
 12|  int japanese;
 13|  int math;
 14|  int english;
 15|};
 16|
 17|int main(void)
 18|{                                                                                     
 19|  struct Seiseki Myclass[STUDENTNO] = {
 20|    {"Polo", 80, 80, 55},
 21|    {"Rose", 100, 50, 60},
 22|    {"Marry", 90, 70, 80},
 23|    {"Java", 90, 90, 90},
 24|    {"Unix", 100, 100, 100},
 25|  };
 26|  int i, sum0 = 0, sum1[SUBJECTNO], sum2[STUDENTNO];
 27|
 28|  for(i = 0; i < SUBJECTNO; i++){
 29|    sum1[i] = 0;
 30|  }
 31|  for(i = 0; i < STUDENTNO; i++){
 32|    sum2[i] = 0;
 33|  }
 34|
 35|  for(i = 0; i < STUDENTNO; i++){
 36|    sum1[0] += myclass[i].japanese;
 37|    sum1[1] += myclass[i].math;
 38|    sum1[2] += myclass[i].english;                                                    
 39|  }
 40|
 41|  for(i = 0; i < STUDENTNO; i++){
 42|    sum2[i] = myclass[i].japanese + myclass[i].math + myclass[i].english;
 43|  }
 44|
 45|  for(i = 0; i < STUDENTNO; i++){
 46|    sum0 += sum2[i];                                                                  
 47|  }
 48|  printf("*******成績*******\n\n");
 49|
 50|  printf("%6s %6s %6s %6s %6s\n", "Name", "JAP", "Math", "English", "Sum");
 51|  drawline();
 52|
 53|  for(i = 0; i < STUDENTNO; i++){
 54|    printf("%6s %6d %6d %6d %6d\n",
 55|           myclass[i].name, myclass[i].japanese,
 56|           myclass[i].math, myclass[i].english, sum2[i]);
 57|  }
 58|
 59|  drawline();
 60|  printf("%6s %6.1f %6.1f %6.1f %6.1f\n",
 61|         "Ave",
 62|         (double)sum1[0] / STUDENTNO,
 63|         (double)sum1[1] / STUDENTNO,
 64|         (double)sum1[2] / STUDENTNO,
 65|         (double)sum0 / STUDENTNO );
 66|
 67|  return 0;
 68|}
 69|
 70|int drawline(void)
 71|{
 72|  int i;
 73|  for(i = 0; i< 35; i++){                                                             
 74|    printf("-");
 75|  }
 76|  printf("\n");
 77|  return 0;
 78|}

実行結果

*******成績*******

  Name    JAP   Math English    Sum
-----------------------------------
  Polo     80     80     55    215
  Rose    100     50     60    210
 Marry     90     70     80    240
  Java     90     90     90    270
  Unix    100    100    100    300
-----------------------------------
   Ave   92.0   78.0   77.0  247.0



Chapte8 @ C言語目録 @ HomeWork List @ 昭亮's Homepage