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};


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;

}

コンパイル結果

20

24

40

30

20

24

40

30


ソーラー「&str[0]で


str[0].HP

str[0].MP

str[0].AP

str[0].TP


のアドレスを自作関数のポインタ変数に渡すことができたんだね。」


アレサ

「では


あるキャラクター

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].HP

str[0].MP

str[0].AP

str[0].TP

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


と配列変数に格納していきます


さあ、いよいよ

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

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}};


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;

}


コンパイル結果


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


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


🌞  🌞  🌞


あたりには


青空が広がっています



ソーラー「順調だね


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


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);


の部分を


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}};


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;

}


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


構造体の配列でなく


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


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};


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;

}


コンパイル結果

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で共有
  • はてなブックマークでブックマーク

作者を応援しよう!

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

応援したユーザー

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