第12回:構造体 演習解答


構造体の定義において,最後のセミコロン;を忘れて,エラーだらけになっている人を多く見ました。

#include <stdio.h>
struct seiseki {
    char simei[25];
    int ten_1;
    int ten_2;
};

void main()
{
    ....
}

 


演習課題

課題1 次に示す生徒の情報を構造体として定義・作成し,各内容を画面に表示するプログラムを作成しなさい。

番号 氏名 点数 成績
1 小林 82 A

 

/* 課題1 */
#include <stdio.h>
#include <string.h>

struct seiseki{
   int num;
   char name[10];
   int score;
   char grade;
};

void main()
{
   struct seiseki a;
   
   a.num = 1;
   a.score = 82;
   a.grade = 'A';
   
   strcpy(a.name, "小林");
   
   printf("番号:%d,名前:%s,点数:%d,成績:%c¥n", a.num, a.name, a.score, a.grade);
}

課題2 次に示す複数の生徒の情報を構造体の配列として作成し,順番に画面に表示するプログラムを作成しなさい。

番号 氏名 点数 成績
1 石山 82 A
2 松村 48 F
3 中島 98 S

 

/* 課題2 */
#include <stdio.h>

struct seiseki{
   int num;
   char name[10];
   int score;
   char grade;
};

void main()
{
   int i;
   struct seiseki a[] = {
   {1,"石山",82,'A'},
   {2,"松村",48,'F'},
   {3,"中島",98,'S'}};
   
   for(i=0; i<3; i++){
      printf("番号:%d,名前:%s,点数:%d,成績:%c\n", 
      a[i].num,
      a[i].name,
      a[i].score,
      a[i].grade);
   }
}

課題3 前回の課題3を構造体を用いて書き直しなさい。

/* 課題3 */
#include <stdio.h>

struct seiseki{
   char name[10];
   int lang;
   int phy;
};

void main()
{
   int i;
   struct seiseki a[] ={
      {"佐藤", 65, 71},
      {"鈴木", 84, 83},
      {"高橋", 74, 74},
      {"田中", 90, 90},
      {"渡辺", 87, 78},
      {"伊藤", 93, 95}
   };

   /* 各人の名前と平均点 */
   for(i=0; i<6; i++){
      printf("%d番目 名前:%s,平均点:%.1f\n", i+1, a[i].name, (float)(a[i].lang+a[i].phy)/2);
   }
}

 

課題4 前回の課題4を構造体を用いて書き直しなさい。

 

/* 課題4 */
#include <stdio.h>
#include <math.h>

struct test{
   char name[10];
   int score;
};

void main()
{
   FILE *fp;
   int i, sum=0;
   float ave, bun, dev;
   struct test seiseki[50];

/* (1)ファイルから読み込む */
   fp = fopen("50data.txt","r");

   for(i=0; i<50; i++){
      fscanf(fp, "%s %d", &(seiseki[i].name), &(seiseki[i].score));
      printf("%s %d\n", seiseki[i].name, seiseki[i].score);
   }

   fclose(fp);

/* (2)平均点標準偏差の算出 */
   for(i=0; i<50; i++){
      sum+=seiseki[i].score;
   }
   ave = (float)sum/50;

   for(i=0; i<50; i++){
      bun+=(seiseki[i].score-ave)*(seiseki[i].score-ave);
   }
   bun /= 50;

   dev = sqrt(bun);

   printf("平均点:%.1f,標準偏差:%.1f\n", ave, dev);

/* (3)偏差値の算出 */
   for(i=0; i<50; i++){
      printf("%s %.1f\n", seiseki[i].name, 10*(seiseki[i].score-ave)/dev+50);
   }
}