第13回:構造体(2)

 今週は,もう一度構造体について練習しましょう.

 先週演習用に用意したファイルだと,うまく読み込めません.修正したので,新しいデータファイルに直してください.


演習(先週の続き,先週のレポート提出欄に提出)

 下記の成績データをファイルから読み込んで,各学生の2回のテストの平均点を計算し,成績を判定するプログラムを,構造体を用いて作成せよ.

2 1 1 アベ 50 60
2 1 2 イトウ 70 45
2 1 3 ウエダ 90 53
2 1 4 エンドウ 75 65
2 1 5 オカダ 30 15
2 1 6 カトウ 90 76
2 1 7 キダ 80 56
2 1 8 クリタ 86 95

成績対応表
A
80点以上
B
60点以上
C
50点以上
F
50点未満

ステップ1
まずは,構造体を使わずに,データを読み込んで画面に表示するだけのプログラムを作ってみる.
ステップ2
変数を構造体を用いるように変更する.
ステップ3
構造体の配列を用いる

構造体とポインタ

 変数のポインタと同じように,構造体のポインタというのもあります.頭が混乱しそうですが,よく整理して理解しましょう.

 前回定義した構造体を用いて,ポインタ変数を定義してみると,

struct seiseki{
    int gakunen;
    int kumi;
    int bangou;
    char simei[25];
    int ten_1;
    int ten_2;
    float heikin;
    char seiseki;
};
struct seiseki list1;
struct seiseki *kp;

kp = &list1;

となります.ポインタを用いるとき,構造体の各要素はどのように表されるのでしょうか?ポインタの中身を参照するには,

int *p;

だったら,

*p

でしたね.では,構造体だと,

struct seiseki *kp;

と定義すると要素は,

*kp.gakunen

で良いでしょうか?これでは,コンパイラのエラーになってしまいます.正確には,

(*kp).gakunen

と書きます.ちょっと面倒なので,C言語ではこれを

kp->gakunen

と書きます.

#include <stdio.h>

struct seiseki{
    int gakunen;
    int kumi;
    int bangou;
    char simei[25];
    int ten_1;
    int ten_2;
    float heikin;
    char seiseki;
};

void main()
{
    struct seiseki list2;
    struct seiseki *kp;

    kp = &list2;

    kp->gakunen = 2;
    kp->kumi = 1;

    printf("%d年%d組\n", kp->gakunen, kp->kumi);
}
もう,何がなんだかわからない!!と怒らないで,自分で整理して,いろいろ試してみてください.

演習

上記の成績の平均点を求めるプログラムにおいて,平均点を求める部分を関数にし,メイン関数から,引数として構造体を渡し,平均点を計算して構造体の平均に代入するようにする.


参考:文字列の代入

 文字列は,変数に直接代入することができません.

char name[20];

name = "kobayashi";

これは,エラーになります.では,どうやって文字列に代入するかというと,

char name[20];

name[0] = 'k';
name[1] = 'o';
....

と,とても大変です.そこで,文字列の代入をする関数が用意されています.

#include <string.h>

char name[20];

strcpy(name, "kobayashi");


 今回で,今年度の情報処理・演習で学ぶべき内容は全てカバーしました.

 ちょっと,盛りだくさんで理解が追いついていないようですが,いろいろなプログラムを自分で組んでみてください.

 来年は2回ある予定ですが,前期・後期を通しての総復習と,総合的なプログラムの作成を行います.