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

ソーラー「


🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣

構造体型の配列宣言を行い構造体型の配列を作製して複数の構造体変数のメンバ変数に格納された数値を構造体型の配列に格納する

🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣


この方法が数値データを


     🌼コマンドプロンプト画面にprintf出力表示するのに🌻


極めて有効な数値データの格納方法だということは


わかりました。


あっ だからエピソードタイトルになっているのか・・


な~るほど・・


今 気付いたよ


先程は


立方体cube1

no=1;

tate=2.0;

yoko=3.0;

takasa=4.0;


立方体cube2

no=2;

tate=4.0;

yoko=5.0;

takasa=6.0;


この8つの数値データを格納するのに


構造体型の配列宣言、初期化

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

を行いました。


勉強熱心な方は もっと簡単で有効な数値データの格納方法ってあるのかなあ?


とおもわれるかもしれません。



と いう読者の方のために


私 ソーラーが体当たりで


他のもっと簡単な方法を模索してみま~す。😊」


アレサ「ソーラーさん、 お手伝いいたします。」


ソーラー「ははっどうしよっかなあ


腕が鳴るね


先程は

立方体cube1の数値データ

1

2.0

3.0

4.0

立方体cube2の数値データ

2

4.0

5.0

6.0

を格納するのに


構造体型の配列宣言、初期化


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


をおこなってきたよね


とても・・これ以上簡略化ってできそうもない



う~ん、なら 僕は最初から


構造体型の配列宣言なしで


つまり

今のように

Cubeの構造体宣言

を行った後

構造体型の配列宣言

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


立方体cube1の数値データ

1

2.0

3.0

4.0

立方体cube2の数値データ

2

4.0

5.0

6.0

格納するという方法をつかわないで


立方体cube1の数値データ

1

2.0

3.0

4.0

立方体cube2の数値データ

2

4.0

5.0

6.0


コンピュータのメモリに格納してみるか😝


そのようにして


立方体cube1と立方体cube2の数値データをメモリに格納後


全ての数値データを


構造体型の配列を使った場合より  



   ’簡単にコマンドプロンプト画面にprintf出力表示’    



できれば


いいってわけだね😝」


アレサ「さあ、みなさん


ソーラーさんは、どのような方法で


立方体cube1の数値データ

1

2.0

3.0

4.0

立方体cube2の数値データ

2

4.0

5.0

6.0


コンピュータのメモリに


格納してくるのでしょうか?」


ソーラー「注目されてる?されてる?


そおだねぇ


今までのプログラムの流れは


構造体型の配列strをつくる

cube1,cube2のメンバ変数に格納されている数値データを配列strに格納

for文をもちいて格納された数値データを簡単一括printf出力表示


だったね。


そういえば構造体型の配列をつくらなくても


ふつう~に


Cubeの構造体宣言を行った後

cube1

cube2

の構造体変数宣言を行い


生成されたメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa


cube2.no

cube2.tate

cube2.yoko

cube2.takasa

立方体cube1

no=1;

tate=2.0;

yoko=3.0;

takasa=4.0;


立方体cube2

no=2;

tate=4.0;

yoko=5.0;

takasa=6.0;

の数値データを格納


コマンドプロンプト画面にprintf出力表示できるんだったよね。


これが~😊


そうだった

そうだった


忘れていたよ


#include <stdio.h>


typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;


int main(void)

{


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

Cube cube2={2,4.0,5.0,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


無事に数値表示完了😊。



ね、どうだいアレサ。


ま、まあまあ短い、よね?よね?


う~ん

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

Cube cube2={2,4.0,5.0,6.0};

と簡単に立方体cube1と立方体cube2のデータ数値を


格納できてるところは


構造体の配列を使った場合と同じくらいの簡単さかな?


構造体の配列を使った場合は



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


⇧  ⇧  ⇧

さすがに、短い・・・」


アレサ「ふふ、ソーラーさん・・・また・・・」


ソーラー「ただし数値データのprint出力表示に関しては


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

のように

ひとつずつ

構造体変数cube1,cube2のメンバ変数に格納されている数値を


printf出力表示していくので


手間がかかりすぎてるね。


構造体型の配列を使った場合は


int i;

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

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

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

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

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

}

と簡潔なのに対し


構造体だけを使った場合は


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

1つずつprintf文を記述し


8行もつかってるのが


あちゃあ~だね。


このままだと

立方体データが1000000個あったら

数値データをすべて呼び出すのに

printf文を4000000個もかかないといけないものね。



構造体型の配列を使えば立方体データが1000000個

あっても

数値データをすべて呼び出すのに

以下のように


int i;

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

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

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

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

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

}

7行だけで済んでしまうものね。」


アレサ「構造体型の配列を使った場合は この点が


構造体を使った数値格納方法よりすぐれていますね。」


ソーラー「そうか・・・


となると


今 私のつくったプログラムで


後やればいいことは


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



この8つのprintf文をfor文をつかって短くまとめるだけだね


これが成功すれば


構造体型の配列をつかわなくても


構造体変数

cube1

cube2

だけをもちいて


構造体型の配列をつかったときと同じくらい簡単に


立方体cube1

立方体cube2


の数値データをメモリにとりこみ


簡単にprintf表示できることになるというわけさ。」


アレサ「さあ、😊どうなるでしょうか、


ソーラーさん、おねがいしま~す。」



ソーラー「


では  みなさ~ん\(^o^)/


for文をつかって華麗にprintf文をまとめ


さきほどのプログラムを改良した


次のプログラムをご覧くださ~い。


#include <stdio.h>


typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;


int main(void)

{


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

Cube cube2={2,4.0,5.0,6.0};

int i=1;

for(i=1;i<3;i++){

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

printf("%d\n" ,cubei.tate);

printf("%d\n" ,cubei.yoko);

printf("%d\n" ,cubei.takasa);

}

/*⇧の表記はまちがえています。

どこが まちがえているか おわかりになりますか?*/


return 0;

}




ソーラー「さあ、あとはこのプログラムをコンパイルします。


そうして


構造体の配列を使わず


構造体だけを用いて


構造体の配列を使った場合と同じくらい


数値データの格納、printf出力表示


ともに簡単な


効率のよい方法が完成するので~す。


はははっ」


ソーラー「それでは/(^_^)/


コンパイルっ」



コンパイル結果(EAZY IDECの場合)

ファイル「C:/Users/solarplexuss/AppData/Local/EasyIDEC/project/hhhhhhhh/main.c」の

「17行目」で記述エラーを発見しました。

「cubei」が定義されていません。

名前が間違っていないかどうか確認してください。



ビルド実行結果(Visual Studioの場合)


エラー (アクティブ) E0020 識別子 "cubei" が定義されていません

警告 C4473 'printf': 書式文字列として渡された引数が不足しています

警告 C4473 'printf': 書式文字列として渡された引数が不足しています

警告 C4473 'printf': 書式文字列として渡された引数が不足しています

警告 C4473 'printf': 書式文字列として渡された引数が不足しています

エラー C2065 'cubei': 定義されていない識別子です。

エラー C2065 'cubei': 定義されていない識別子です。

エラー C2065 'cubei': 定義されていない識別子です。

エラー C2065 'cubei': 定義されていない識別子です。 0

エラー C2228 '.yoko' の左側はクラス、構造体、共用体でなければなりません

エラー C2228 '.tate' の左側はクラス、構造体、共用体でなければなりません

エラー C2228 '.takasa' の左側はクラス、構造体、共用体でなければなりません

エラー C2228 '.no' の左側はクラス、構造体、共用体でなければなりません




ソーラー「おげぇぇぇぇぇぇぇぇぇぇ


 コン、コンパイルエラー??


な、なぜ?」


アレサ


「for文の中の


int i=1;

for(i=1;i<3;i++){

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

printf("%d\n" ,cubei.tate);

printf("%d\n" ,cubei.yoko);

printf("%d\n" ,cubei.takasa);

}

のcubeiの部分です。


この

for(i=1;i<3;i++){

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

printf("%d\n" ,cubei.tate);

printf("%d\n" ,cubei.yoko);

printf("%d\n" ,cubei.takasa);

}

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

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

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

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

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

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

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

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

を表していません。


for文をつかってcubeiのiに


数値1,2を代入するよう設定しているのですが


cubeiは一つの単語としてコンパイラに認識されており


iだけに数値1,2を代入することはできないのです。


そして


cubeiは何の定義もされていないため


コンパイルエラーとなります。」


ソーラー「え~~


となると




             「構造体の配列をもちいず」


           

              「構造体だけを用いて」


格納した

立方体cube1

立方体cube2の


8個の数値データをprintf表示するには


normalに1個ずつ8つのprintf文


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

をかかなくちゃいけないってこと・・かな・・?」


アレサ「はいっ 


そして、やはり


1000000 数値データを格納したのなら


数値データをprintf表示するのに


1000000のprintf文が必要となります。」


ソーラー「狐 こ~んんんんん」


アレサの🌞きらきら🌞と輝く笑顔が眩しい。


ソーラー 「おおおっ き、きみのつっこみはは、はげしすぎる・・」


アレサ「そうですの。😊


         🍎数値データを格納する方法が🍎


ソーラーさんの


プログラムの中に記述されたこの命令文


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

Cube cube2={2,4.0,5.0,6.0};



のように


          🍎簡単だったとしても🍎


     🍋数値データをprintf出力表示するには🍋



        🍋非常に労力がかかる🍋


という


効率の悪い方法が示されたのが今のプログラムとなっています。



つまり 数値データを格納する方法が簡単でも


数値データをprintf出力表示するのに手間がかかる場合があり


数値データをprintf出力表示するのにあわせて


数値データを格納する方法を決める必要があるというわけなのですの


(#^.^#)」


ソーラー「はうぅぅん」



アレサ「以上 今日も元気で朗らかなソーラーさんでした~~~


みなさ~ん、いかがでしたでしょうか?


このように



         🌞大量の数値データを🌞


   

      🌞構造体型の配列を使って扱う方法は🌞

 


      😊最も効率よく数値データを格納でき😊


              かつ


😊最も効率よく数値データを😊



😊printf出力表示させることができるのです😊




シューティングの弾幕も 

大量の弾の集まりであり


縦、横、の位置情報をもった

大量の数値データの集まりですね。


その大量の数値データを使って画面に弾を表示するので


シューティングの弾幕に構造体型の配列がつかわれるのは


必然となってくるでしょう。


すこしだけ


弾幕シューティングの片鱗がみえてきましたね。」


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

作者を応援しよう!

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

応援したユーザー

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