以前、国語や数学、社会の得点合計を求めるプログラムを作りました。
その時は、二次元配列を使って作りましたが、構造体を使うとどう変わるのか見てみましょう。
状況は同じで、クラスに3人の学生がおり、国語、数学、社会のテストを行いました。
国語、数学、社会それぞれの合計とA君、B君、C君それぞれの合計得点を計算するというものです。
段階を追って説明しますので、少しずつ理解しながら実行してください。
まず、一人分のデータを考えます。
学生が受けたテストは3科目ありますので、これを構造体にしましょう。
構造体のタグ名はTokutenとし、メンバ変数にkokugo、suugaku、syakaiをint型で追加します。
実体gakuseiを作成し、初期値をそれぞれ58、36、72とします。
解答例です。
<sample program 102-01>
#include <stdio.h> struct Tokuten { int kokugo; int suugaku; int syakai; }; int main(void) { struct Tokuten gakusei = { 58, 36, 72 }; return 0; } |
これで一人分の得点が設定出来ました。
次に人数を3に増やしてみます。
#defineでCLASSを3に設定し、実体であるgakuseiを配列にします。
A君の得点は設定済みですので、
B君の得点 73、82、56
C君の得点 62、53、70
を初期値として設定します。
解答例です。
<sample program 102-02>
#include <stdio.h> #define CLASS 3 struct Tokuten { int kokugo; int suugaku; int syakai; }; int main(void) { struct Tokuten gakusei[CLASS] = { { 58, 36, 72 }, { 73, 82, 56 }, { 62, 53, 70 }, }; return 0; } |
これで最初の状態が作れました。
まず、個人ごとの合計を計算します。
個人の得点合計は個人ごとの情報ですから、構造体に追加しましょう。
構造体Tokutenにメンバ変数goukeiを追加し、初期値を0で設定してください。
解答例です。
<sample program 102-03>
#include <stdio.h> #define CLASS 3 struct Tokuten { int kokugo; int suugaku; int syakai; int goukei; }; int main(void) { struct Tokuten gakusei[CLASS] = { { 58, 36, 72, 0 }, { 73, 82, 56, 0 }, { 62, 53, 70, 0 }, }; return 0; } |
合計を求める変数を0でクリアするのは基本ですね。
このプログラムにループを加えて個人ごとの合計を求めます。
配列gakuseiをループ内で順番に指定すると、A君、B君、C君の順番にアクセスすることになります。
それぞれのgoukeiにkokugoとsuugakuとsyakaiを足した数を代入すれば良いだけです。
作ってみましょう。
解答例です。
<sample program 102-04>
#include <stdio.h> #define CLASS 3 struct Tokuten { int kokugo; int suugaku; int syakai; int goukei; }; int main(void) { struct Tokuten gakusei[CLASS] = { { 58, 36, 72, 0 }, { 73, 82, 56, 0 }, { 62, 53, 70, 0 }, }; int i; for (i = 0; i < CLASS; i++) { gakusei[i].goukei = gakusei[i].kokugo + gakusei[i].suugaku + gakusei[i].syakai; } printf("得点一覧表\n"); printf("番号 国語 数学 社会 合計\n"); for (i = 0; i < CLASS; i++) { printf("%4d %4d %4d %4d %4d\n", i + 1, gakusei[i].kokugo, gakusei[i].suugaku, gakusei[i].syakai, gakusei[i].goukei); } return 0; } |
<実行結果>
得点一覧表 番号 国語 数学 社会 合計 1 58 36 72 166 2 73 82 56 211 3 62 53 70 185 続行するには何かキーを押してください・・・
表示部分も加えてみました。
次に科目ごとの合計も求めてみましょう。
今回は合計を求めるために、同じ構造体で合計用の実体を作成します。
繰り返しの中で、それぞれの科目を合計していくため、構造体をゼロクリアして使います。
それでは作ります。
<sample program 102-05>
#include <stdio.h> #define CLASS 3 struct Tokuten { int kokugo; int suugaku; int syakai; int goukei; }; int main(void) { struct Tokuten gakusei[CLASS] = { { 58, 36, 72, 0 }, { 73, 82, 56, 0 }, { 62, 53, 70, 0 }, }; struct Tokuten goukei = { 0 }; int i; for (i = 0; i < CLASS; i++) { gakusei[i].goukei = gakusei[i].kokugo + gakusei[i].suugaku + gakusei[i].syakai; goukei.kokugo += gakusei[i].kokugo; goukei.suugaku += gakusei[i].suugaku; goukei.syakai += gakusei[i].syakai; goukei.goukei += gakusei[i].goukei; } printf("得点一覧表\n"); printf("番号 国語 数学 社会 合計\n"); for (i = 0; i < CLASS; i++) { printf("%4d %4d %4d %4d %4d\n", i + 1, gakusei[i].kokugo, gakusei[i].suugaku, gakusei[i].syakai, gakusei[i].goukei); } printf("合計 %4d %4d %4d %4d\n", goukei.kokugo, goukei.suugaku, goukei.syakai, goukei.goukei); return 0; } |
<実行結果>
得点一覧表 番号 国語 数学 社会 合計 1 58 36 72 166 2 73 82 56 211 3 62 53 70 185 合計 193 171 198 562 続行するには何かキーを押してください・・・
合計を求めるための実体goukeiを作り、初期値に0を入れました。
配列と同じように、初期化の際に指定しなかった箇所については、0が埋め込まれますので、国語以外の初期値も0になっています。
繰り返しの中でそれぞれの科目の合計を計算し、表示するように作りました。
以前、二次元配列を使って作ったプログラムと比較すると当然異なったプログラムになっています。
このようにデータをどのように扱うかによって、プログラムは変化していきます。
プログラムを考える前に、まずデータをどのように扱うか決めなければプログラムが決まりません。
適当にプログラムから作り始め、データは後から考えれば良いか!という考えではなく、
必要なデータを洗い出し、どのような扱いをするのか決めてからプログラムを考えれば良いです。
色々と経験を積み、様々なバリエーションを知ることでプログラムの幅は広がっていきます。