天国にいけるC言語入門 ヘキサ構造体 ver2.2126
格納した数値データを効率よくprintf表示する 構造体型の配列宣言を行い構造体型の配列を作製して複数の構造体変数のメンバ変数に格納された数値データを構造体型の配列に格納してみよう その2
格納した数値データを効率よく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
が
メモリに格納されていきます
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます