格納した数値データを効率よくprintf表示する 構造体型の配列宣言を行い構造体型の配列を作製して複数の構造体変数のメンバ変数に格納された数値を構造体型の配列に格納してみよう その2 

ソーラー 「話を元に戻してっと


立方体cube1の数値データ


no=1

tate=2.0

yoko=3.0

takasa=4.0


立方体cube2の数値データ

no=2

tate=4.0

yoko=5.0

takasa=6.0


これらの数値データを


コンピュータのメモリに格納させたのち


🍎いかに簡単にコマンドプロンプト画面にprinf出力表示させるか🍅


というお話だったね。


これは前のエピソードでもやってきたね。


いままでは 立方体cube1の数値データ


no=1

tate=2.0

yoko=3.0

takasa=4.0


Cubeの構造体宣言

typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;

を行った後


cube1のCube型の構造体変数宣言、初期化


Cube cube1={1,2.0,3.0,4.0};

をおこない 

構造体変数cube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa



cube1.no=1

cube1. tate=2.0

cube1. yoko=3.0

cube1. takasa=4.0


と数値データ

1

2.0

3.0

4.0

を格納してから


コマンドプロンプト画面にprintf出力表示してきました。



そのプログラムは次のようになります。」


#include <stdio.h>


typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;


int main(void)

{


Cube cube1;

cube1.no=1;

cube1.tate=2.0;

cube1.yoko=3.0;

cube1.takasa=4.0;


printf("%d\n" ,cube1.no);

printf("%f\n" ,cube1.tate);

printf("%f\n" ,cube1.yoko);

printf("%f\n" ,cube1.takasa);


return 0;

}


コンパイル結果

1

2.000000

3.000000

4.000000


ソーラー「


同じく


立方体cube2の数値データ

no=2

tate=4.0

yoko=5.0

takasa=6.0



Cubeの構造体宣言

typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;

を行った後

cube2の構造体変数宣言


Cube cube2={2,4.0,5.0,6.0};をおこない 

(ここでCubeは構造体 cube2は構造体変数)


構造体変数cube2のメンバ変数

cube2.no

cube2.tate

cube2.yoko

cube2.takasa


cube2.no=2;

cube2.tate=4.0

cube2.yoko=5.0

cube2.takasa=6.0


と数値データ

2

4.0

5.0

6.0

を格納したのちコマンドプロンプト画面に


printf出力表示してきました。


その

プログラムも先程と同じく次のようになります。」


#include <stdio.h>


typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;


int main(void)

{


Cube cube2;

cube2.no=2;

cube2.tate=4.0;

cube2.yoko=5.0;

cube2.takasa=6.0;


printf("%d\n" ,cube2.no);

printf("%f\n" ,cube2.tate);

printf("%f\n" ,cube2.yoko);

printf("%f\n" ,cube2.takasa);


return 0;

}


コンパイル結果

2

4.000000

5.000000

6.000000



ソーラー「

いまのままでは同時に


一回のコンパイルで


立方体cube1の数値データ

立方体cube2の数値データ


両方の数値データをprintf出力表示できないので


これら2つのプログラムをまとめて


プログラムを再構成すると


#include <stdio.h>


typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;


int main(void)

{


Cube cube1;

cube1.no=1;

cube1.tate=2.0;

cube1.yoko=3.0;

cube1.takasa=4.0;


Cube cube2;

cube2.no=2;

cube2.tate=4.0;

cube2.yoko=5.0;

cube2.takasa=6.0;


printf("%d\n" ,cube1.no);

printf("%f\n" ,cube1.tate);

printf("%f\n" ,cube1.yoko);

printf("%f\n" ,cube1.takasa);


printf("%d\n" ,cube2.no);

printf("%f\n" ,cube2.tate);

printf("%f\n" ,cube2.yoko);

printf("%f\n" ,cube2.takasa);


return 0;

}


コンパイル結果

1

2.000000

3.000000

4.000000

2

4.000000

5.000000

6.000000


となります。」


ソーラー「このプログラムはちょっと長いね~

そこで

構造体変数cube1

構造体変数cube2

のメンバ変数に格納されている数値


1

2.0

3.0

4.0

2

4.0

5.0

6.0


をもっと簡単に


メモリに格納する方法が


このエピソードのタイトルでもある


構造体型の配列宣言を行い


構造体型の配列を作製して


複数の構造体変数のメンバ変数に格納された数値を


構造体型の配列に格納する方法 


なんだね。」


アレサ「そうなのです。


int型の変数a,bがあり

a=1;

b=2;

数値1

数値2

がメモリに格納されているとします


ここで


変数a,bの代わりに


配列を使って


int str[2];

str[0]=1;

str[1]=2;

数値1

数値2

をメモリに格納することができます。


同様に


構造体Cube型の構造体変数cube1,cube2があり


cube1.no=1;

cube1.tate=2.0;

cube1.yoko=3.0;

cube1.takasa=4.0;


cube2.no=2;

cube2.tate=4.0;

cube2.yoko=5.0;

cube2.takasa=6.0;

のように


数値

1

2.0

3.0

4.0

2

4.0

5.0

6.0


がメモリに格納されているとします


ここで


構造体変数cube1,cube2の代わりに


Cubeの構造体宣言

typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;

を行ったあと


構造体の配列宣言

Cube str[2];

を行い

作製された

Cube型の構造体の配列strを使って


Cube str[2];

str[0].no=1

str[0].tate=2.0

str[0].yoko=3.0

str[0].takasa=4.0

str[1].no=2

str[1].tate=4.0

str[1].yoko=5.0

str[1].takasa=6.0

のように

数値

1

2.0

3.0

4.0

2

4.0

5.0

6.0

メモリに格納することができます。



まず     構造体型の配列宣言   とは何なのか



をみていきましょう。」


ソーラー 「アレサ、いい感じ」


アレサ「はいっ😊


配列のエピソードでも見てきたように


2つの整数値データを格納するために


int型の配列宣言


int str[2];

を行うと

(ここでは2つの整数値1,2を配列に格納するとしましょう。)

str[2]と要素数が2になっているので

str[0]

str[1]

の2つの整数値を格納する配列変数が生成されます。


プログラムを構成して数値1,2が


int型の配列に格納される様子をみていきましょう。


#include <stdio.h>


int main(void)

{

int str[2];

str[0]=1;

str[1]=2;

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

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

return 0;

}


コンパイル結果

1

2


アレサ「プログラムの流れは このようになります。


float型の配列宣言


float str[2];

を行うと

(ここでは2つの実数値1.0,2.0を格納するとしましょう。)

str[2]と要素数が2になっていることにより

str[0]

str[1]

の2つの実数値を格納する配列変数が生成されます。


プログラムを組んで数値1.0,2.0が格納される様子をみていくと→」


#include <stdio.h>


int main(void)

{

float str[2];

str[0]=1.0;

str[1]=2.0;

printf("%f\n",str[0]);

printf("%f\n",str[1]);

return 0;

}


コンパイル結果

1.000000

2.000000


アレサ「→

上記のようになります。



そして いよいよですが


構造体型の配列宣言をおこないます。


ソーラー「どうなる、どうなる(^_-)-☆」


アレサ「今まで見てきたように


配列宣言をおこなうということは


数値データを格納する配列が作製されるということなのですの。


その配列が

整数値を収めるint型ならば

int str[2];

その配列が

実数値を収めるfloat型ならば

float str[2];

その配列が

同時に複数の整数、実数を収めることのできる構造体cube型

ならば

Cube str[2];

がおこなわれるわけですの。



それでは


構造体Cube型の配列宣言


Cube str[2];


を行ってみましょう。


どのようなことがおこるのでしょうか?


忘れられがちですが


構造体型の配列宣言が行われる前に


Cubeの構造体宣言


typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;


がさきに行われている必要があります


Cubeの構造体宣言

が行われていなければ

構造体Cube型の配列宣言を行うことはできません。


Cubeの構造体宣言


🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤


typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;


🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤


が行われた後


構造体型の配列宣言


Cube str[2];

が行われると


int型やfloat型の場合の時と同様に


(おおきくわけると)

str[0]

str[1]


の2つの(Cube型の構造体変数のメンバ変数に格納されている数値を


格納することができる)配列変数が生成されますの。


正確には


str[0]

str[1]でなく


str[0].no

str[0].tate

str[0].yoko

str[0].takasa


str[1].no

str[1].tate

str[1].yoko

str[1].takasa


の8つの


配列変数が生成されますの。


str[0]

str[1]

構造体変数

cube1

cube2

のような働きをしています


str[0]

str[1]

のあとにドット.演算子を用いて

数値を格納するためのメンバ変数


str[0].no

str[0].tate

str[0].yoko

str[0].takasa


str[1].no

str[1].tate

str[1].yoko

str[1].takasa

を生成することができます。



構造体宣言⇩で構造体に格納したメンバ変数

typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;

no

tate

yoko

takasa

str[0]

str[1]

のあとにつづくというわけですの。


cube1

cube2

Cube型の構造体変数宣言

Cube cube1;

Cube cube2;

を行って

cube1.no=1;

cube1.tate=2.0;

cube1.yoko=3.0;

cube1.takasa=4.0;

cube2.no=2;

cube2.tate=4.0;

cube2.yoko=5.0;

cube2.takasa=6.0;

と数値を格納する代わりに


構造体の配列宣言

Cube str[2];

を行い

作製された

Cube型の構造体の配列strを使って


Cube str[2];

str[0].no=1

str[0].tate=2.0

str[0].yoko=3.0

str[0].takasa=4.0

str[1].no=2

str[1].tate=4.0

str[1].yoko=5.0

str[1].takasa=6.0


数値

1

2.0

3.0

4.0

2

4.0

5.0

6.0

メモリに格納することができます。

もし

Cubeの構造体宣言⇩で格納したメンバ変数が

typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

float omosa;

int nedan;

int kannseibi;

}Cube;


このように

no

tate

yoko

takasa

omosa

nedan

kannseibi


なら

構造体型の配列宣言

Cube str[2];

が行われると

配列変数

str[0].no

str[0].tate

str[0].yoko

str[0].takasa

str[0].omosa

str[0].nedan

str[0].kannseibi

str[1].no

str[1].tate

str[1].yoko

str[1].takasa

str[1].omosa

str[1].nedan

str[1].kannseibi



構造体型の配列宣言Cube str[2];


によって作成された


構造体Cube型の配列strの配列変数として生成されるわけです。



実際に

Cubeの構造体宣言


typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;

を行ったあと

構造体の配列宣言

Cube str[2];

を行い

生成された

配列変数

str[0].no

str[0].tate

str[0].yoko

str[0].takasa

str[1].no

str[1].tate

str[1].yoko

str[1].takasa



構造体変数

cube1

cube2

のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

cube2.no

cube2.tate

cube2.yoko

cube2.takasa


に格納されている数値

1

2.0

3.0

4.0

2

4.0

5.0

6.0


を格納していきましょう。


そのプログラムは以下のようになります



#include <stdio.h>


typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;


int main(void)

{


Cube str[2];


/*構造体型の配列宣言

を行うことにより


この場合

配列 strの

配列変数として

str[0].no

str[0].tate

str[0].yoko

str[0].takasa

str[1].no

str[1].tate

str[1].yoko

str[1].takasa

が生成され

構造体Cubeの構造体変数cube1,cube2のメンバ変数に

格納されている数値を

格納することができます*/



str[0].no=1;

str[0].tate=2.0;

str[0].yoko=3.0;

str[0].takasa=4.0;

str[1].no=2;

str[1].tate=4.0;

str[1].yoko=5.0;

str[1].takasa=6.0;

/*配列str内に生成された配列変数に

構造体変数

cube1

cube2

のメンバ変数に

格納されている数値を代入していきました*/


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

printf("%f\n" ,str[0].tate);

printf("%f\n" ,str[0].yoko);

printf("%f\n" ,str[0].takasa);

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

printf("%f\n" ,str[1].tate);

printf("%f\n" ,str[1].yoko);

printf("%f\n" ,str[1].takasa);


return 0;

}

コンパイル結果

1

2.000000

3.000000

4.000000

2

4.000000

5.000000

6.000000


アレサ「

構造体型の配列宣言を行い


2つの構造体変数のメンバ変数に格納された数値を


代わりに


構造体型の配列に格納する ことができました。」


ソーラー「やったね、アレサ


やっと エピソードタイトルの意味がわかったあ」


☆ ☆ ☆ ☆ ☆ ☆ ☆


構造体の配列に数値を格納して初期化する方法は


Cube str[2];


str[0].no=1;

str[0].tate=2.0;

str[0].yoko=3.0;

str[0].takasa=4.0;

str[1].no=2;

str[1].tate=4.0;

str[1].yoko=5.0;

str[1].takasa=6.0;


で表現されていましたが


Cube str[]={{1,2.0,3.0,4.0},{2,4.0,5.0,6.0}};


と簡略化して表記することができます。


Cube str[]と[]のなかの要素数を記述しなくても


{{1,2.0,3.0,4.0},{2,4.0,5.0,6.0}}のなかの

{1,2.0,3.0,4.0}

{2,4.0,5.0,6.0}

にあわせて

str[0]

str[1]

が生成されます。


そして

str[0]

str[1]

のメンバ変数は

Cubeの構造体宣言

typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;

no

tate

yoko

takasa

にあわせて

str[0].no

str[0].tate

str[0].yoko

str[0].takasa

str[1].no

str[1].tate

str[1].yoko

str[1].takasa

が生成され

数値

1

2.0

3.0

4.0

2

4.0

5.0

6.0

str[0].no=1

str[0].tate=2.0

str[0].yoko=3.0

str[0].takasa=4.0

str[1].no=2

str[1].tate=4.0

str[1].yoko=5.0

str[1].takasa=6.0

と格納されていきます

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

作者を応援しよう!

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

応援したユーザー

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