main関数内で定義された構造体の配列に格納された2人のキャラクターのステータスデータを構造体の配列のアドレスを自作関数の引数であるポインタ変数に参照渡しして同時に2倍にしてみます。

アレサ

「あるキャラクター

character1のステータスデータ


HP=10

MP=12

AP=20

DP=15


次のプログラムのように🌷構造体型の配列🌷を使い


2倍にすることができました



#include <stdio.h>


typedef struct CharacterStatusData

{

int HP;

int MP;

int AP;

int TP;

}CharacterStatusData;


void CharacterStatusData2bai(CharacterStatusData* pta){


pta->HP=2*pta->HP;

pta->MP=2*pta->MP;

pta->AP=2*pta->AP;

pta->TP=2*pta->TP;


printf("%d\n" ,pta->HP);

printf("%d\n" ,pta->MP);

printf("%d\n" ,pta->AP);

printf("%d\n" ,pta->TP);

}


int main(void)

{


CharacterStatusData str[1]={10,12,20,15};


printf("%d\n" ,str[0].HP);

printf("%d\n" ,str[0].MP);

printf("%d\n" ,str[0].AP);

printf("%d\n" ,str[0].TP);


CharacterStatusData2bai(&str[0]);


printf("%d\n" ,str[0].HP);

printf("%d\n" ,str[0].MP);

printf("%d\n" ,str[0].AP);

printf("%d\n" ,str[0].TP);


return 0;

}

コンパイル結果

10

12

20

15

20

24

40

30

20

24

40

30


ソーラー「

配列変数str[0]のメンバ変数

str[0].HP

str[0].MP

str[0].AP

str[0].TP


のアドレスを代表する


&str[0]を


自作関数の引数となっているCharacterStatusData*型のポインタ変数ptaに渡したんだね。」


アレサ

「では


あるキャラクター

character1のステータスデータ


HP=10

MP=12

AP=20

DP=15


もう1つ 別のキャラクターである


character2のステータスデータ


HP=100

MP=120

AP=38

DP=25


main関数内で定義された🌷構造体型の配列🌷に格納し


自作関数をつかって


2倍にしてみます。


その場合は


構造体型の配列宣言


CharacterStatusData str[2];



を行うことにより

配列変数str[0]のメンバ変数

str[0].HP

str[0].MP

str[0].AP

str[0].TP

配列変数str[1]のメンバ変数

str[1].HP

str[1].MP

str[1].AP

str[1].TP


を作製し

character1

character2のステータスデータ


10

12

20

15

100

120

38

25

str[0].HP=10

str[0].MP=12

str[0].AP=20

str[0].TP=15

str[1].HP=100

str[1].MP=120

str[1].AP=38

str[1].TP=25


配列変数str[0]

配列変数str[1]

のメンバ変数に格納していきます



さあ、いよいよ

この構造体型の配列に格納された

character1

character2

のステータスデータ


10

12

20

15

100

120

38

25

を2倍にしてみましょう(^_^)/💖


プログラムを以下のように構成します


#include <stdio.h>


typedef struct CharacterStatusData

{

int HP;

int MP;

int AP;

int TP;

}CharacterStatusData;


void CharacterStatusData2bai(CharacterStatusData*pta){


pta->HP=2*pta->HP;

pta->MP=2*pta->MP;

pta->AP=2*pta->AP;

pta->TP=2*pta->TP;


}


int main(void)

{


CharacterStatusData str[2]={{10,12,20,15},{100,120,38,25}};


printf("%d\n" ,str[0].HP);

printf("%d\n" ,str[0].MP);

printf("%d\n" ,str[0].AP);

printf("%d\n" ,str[0].TP);


printf("%d\n" ,str[1].HP);

printf("%d\n" ,str[1].MP);

printf("%d\n" ,str[1].AP);

printf("%d\n" ,str[1].TP);


CharacterStatusData2bai(&str[0]);


printf("%d\n" ,str[0].HP);

printf("%d\n" ,str[0].MP);

printf("%d\n" ,str[0].AP);

printf("%d\n" ,str[0].TP);


CharacterStatusData2bai(&str[1]);


printf("%d\n" ,str[1].HP);

printf("%d\n" ,str[1].MP);

printf("%d\n" ,str[1].AP);

printf("%d\n" ,str[1].TP);



return 0;

}


コンパイル結果


10

12

20

15

100

120

38

25

20

24

40

30

200

240

76

50



アレサ「

構造体型の配列に格納されている


character1のステータスデータ


HP=10

MP=12

AP=20

DP=15


character2のステータスデータ


HP=100

MP=120

AP=38

DP=25


を自作関数CharacterStatusData2baiをつかい2倍にすることができました」


🌞  🌞  🌞


あたりには


青空が広がっています



ソーラー「順調だね


main関数内で生成された構造体型の配列に格納された


character1

character2

のステータスデータ


2つのキャラクターのステータスデータも


2倍にすることができたんだね。」


アレサ「さらに今のプログラムは


for文を用いて


CharacterStatusData2bai(&str[0]);


printf("%d\n" ,str[0].HP);

printf("%d\n" ,str[0].MP);

printf("%d\n" ,str[0].AP);

printf("%d\n" ,str[0].TP);


CharacterStatusData2bai(&str[1]);


printf("%d\n" ,str[1].HP);

printf("%d\n" ,str[1].MP);

printf("%d\n" ,str[1].AP);

printf("%d\n" ,str[1].TP);


の部分を

int i;


for(i=0;i<2;i++){


CharacterStatusData2bai(&str[i]);


printf("%d\n" ,str[i].HP);

printf("%d\n" ,str[i].MP);

printf("%d\n" ,str[i].AP);

printf("%d\n" ,str[i].TP);

}

のようにまとめて


次のプログラムのように書き換えることができます



#include <stdio.h>


typedef struct CharacterStatusData

{

int HP;

int MP;

int AP;

int TP;

}CharacterStatusData;


void CharacterStatusData2bai(CharacterStatusData* pta){


pta->HP=2*pta->HP;

pta->MP=2*pta->MP;

pta->AP=2*pta->AP;

pta->TP=2*pta->TP;


}


int main(void)

{


CharacterStatusData str[2]={{10,12,20,15},{100,120,38,25}};


printf("%d\n" ,str[0].HP);

printf("%d\n" ,str[0].MP);

printf("%d\n" ,str[0].AP);

printf("%d\n" ,str[0].TP);


printf("%d\n" ,str[1].HP);

printf("%d\n" ,str[1].MP);

printf("%d\n" ,str[1].AP);

printf("%d\n" ,str[1].TP);



int i;


for(i=0;i<2;i++){


CharacterStatusData2bai(&str[i]);


printf("%d\n" ,str[i].HP);

printf("%d\n" ,str[i].MP);

printf("%d\n" ,str[i].AP);

printf("%d\n" ,str[i].TP);

}

return 0;

}



ビルド実行結果


10

12

20

15

100

120

38

25

20

24

40

30

200

240

76

50


ソーラー「構造体型の配列の本領を発揮してきたね」


アレサ「良い結果が出てきましたですの(*´▽`*)」


ソーラー「構造体型の配列でなく


構造体の構造体変数を使った場合では


for文を使ってまとめることはできないね


main関数内で定義された構造体の構造体変数に格納された

character1

10

8

22

18

character2

7

28

12

30


のステータスデータを2倍にするプログラムは


次のようだったね。


#include <stdio.h>

typedef struct CharacterStatusData

{

int HP;

int MP;

int AP;

int TP;

}CharacterStatusData;


void CharacterStatusData2bai(CharacterStatusData*pta){


pta->HP=2*pta->HP;

pta->MP=2*pta->MP;

pta->AP=2*pta->AP;

pta->TP=2*pta->TP;


}


int main(void)

{


CharacterStatusData charcter1StatusData={10,8,22,18};

CharacterStatusData charcter2StatusData={7,28,12,30};


printf("%d\n" ,charcter1StatusData.HP);

printf("%d\n" ,charcter1StatusData.MP);

printf("%d\n" ,charcter1StatusData.AP);

printf("%d\n" ,charcter1StatusData.TP);

printf("%d\n" ,charcter2StatusData.HP);

printf("%d\n" ,charcter2StatusData.MP);

printf("%d\n" ,charcter2StatusData.AP);

printf("%d\n" ,charcter2StatusData.TP);


CharacterStatusData2bai(&charcter1StatusData);

CharacterStatusData2bai(&charcter2StatusData);


printf("%d\n" ,charcter1StatusData.HP);

printf("%d\n" ,charcter1StatusData.MP);

printf("%d\n" ,charcter1StatusData.AP);

printf("%d\n" ,charcter1StatusData.TP);

printf("%d\n" ,charcter2StatusData.HP);

printf("%d\n" ,charcter2StatusData.MP);

printf("%d\n" ,charcter2StatusData.AP);

printf("%d\n" ,charcter2StatusData.TP);


return 0;

}


コンパイル結果


10

8

22

18

7

28

12

30

20

16

44

36

14

56

24

60


ソーラー「ここで


printf("%d\n" ,charcter1StatusData.HP);

printf("%d\n" ,charcter1StatusData.MP);

printf("%d\n" ,charcter1StatusData.AP);

printf("%d\n" ,charcter1StatusData.TP);

printf("%d\n" ,charcter2StatusData.HP);

printf("%d\n" ,charcter2StatusData.MP);

printf("%d\n" ,charcter2StatusData.AP);

printf("%d\n" ,charcter2StatusData.TP);


for文を使ってまとめることはできないね。


構造体型の配列に複数のキャラクターのステータスデータを格納するのは


このような利点があるんだね😊」


  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る