格納した数値データを効率よく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("%d\n" ,cube1.no);

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

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

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

を実行し


コマンドプロンプト画面に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("%d\n" ,cube2.no);

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

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

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


を実行して

コマンドプロンプト画面に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;

を行ったあと


strの構造体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つの整数値データを格納するint型の配列変数が生成されます。


プログラムを構成して整数値データ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つの実数値データを格納するfloat型の配列変数が生成されます。


プログラムを組んで実数値データ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型の構造体変数cube1,cube2のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


cube2.no

cube2.tate

cube2.yoko

cube2.takasa



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


格納することができる)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型の配列宣言

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型の配列宣言Cube str[2];


によって作成された


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



実際に

Cubeの構造体宣言


typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;

を行ったあと


構造体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];


/*構造体Cube型の配列宣言

を行うことにより


この場合

配列 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のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa

cube2.no

cube2.tate

cube2.yoko

cube2.takasa


格納されている数値データを

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



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


アレサ「

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


2つの構造体変数cube1,cube2のメンバ変数に格納された数値データを


代わりに


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


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


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


☆ ☆ ☆ ☆ ☆ ☆ ☆


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


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

が生成され


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


メモリに格納されていきます

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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