天国にいけるC言語入門 ヘキサ構造体 ver2.2126
格納した数値データを効率よくprintf表示する 構造体型の配列宣言を行い構造体型の配列を作製して複数の構造体変数のメンバ変数に格納された数値データを構造体型の配列に格納する方法 その3
格納した数値データを効率よく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型の配列宣言、初期化
Cube str[]={{1,2.0,3.0,4.0},{2,4.0,5.0,6.0}};
をおこなってきたよね
とても・・これ以上簡略化ってできそうもない
う~ん、なら 僕は最初から
構造体Cube型の配列宣言なしで
つまり
先のエピソードのように
Cubeの構造体宣言
typedef struct Cube{
int no;
float tate;
float yoko;
float takasa;
}Cube;
を行った後
構造体Cube型の配列宣言
Cube str[2];
を行って
構造体Cube型の配列strをつくり
配列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の数値データをメモリに格納後
全ての数値データを
構造体Cube型の配列を使った場合より
’簡単にコマンドプロンプト画面にprintf出力表示’
できれば
いいってわけだね😝」
アレサ「さあ、みなさん
ソーラーさんは、どのような方法で
立方体cube1の数値データ
1
2.0
3.0
4.0
と
立方体cube2の数値データ
2
4.0
5.0
6.0
を
コンピュータのメモリに
格納してくるのでしょうか?」
ソーラー「注目されてる?されてる?
そおだねぇ
今までのプログラムの流れは
構造体Cube型の配列strをつくる
→
cube1,cube2のメンバ変数に格納されている数値データを配列strに格納
→
for文をもちいて格納された数値データを簡単一括printf出力表示
だったね。
そういえば構造体Cube型の配列をつくらなくても
ふつう~に
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型の配列を使った場合と同じくらいの簡単さかな?
構造体Cube型の配列を使った場合は
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出力表示していくので
手間がかかりすぎてるね。
構造体Cube型の配列を使った場合は
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);
}
と簡潔なのに対し
構造体Cubeだけを使った場合は
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個もかかないといけないものね。
構造体Cube型の配列を使えば立方体データが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文をつかって短くまとめるだけだね
これが成功すれば
構造体Cube型の配列をつかわなくても
構造体変数
cube1
cube2
だけをもちいて
構造体Cube型の配列をつかったときと同じくらい簡単に
立方体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
ソーラー「狐 こ~んんんんん」
アレサの🌞きらきら🌞と輝く笑顔が眩しい。
ソーラー 「おおおっ き、きみのつっこみはは、はげしすぎる・・」
アレサ「そうですの。😊
🍎数値データを格納する方法が🍎
ソーラーさんの
プログラムの中に記述されたこの命令文
👇
Cube cube1={1,2.0,3.0,4.0};
Cube cube2={2,4.0,5.0,6.0};
のように
🍎簡単だったとしても🍎
🍋数値データをprintf出力表示するには🍋
🍋非常に労力がかかる🍋
という
効率の悪い方法が示されたのが今のプログラムとなっています。
つまり 数値データを格納する方法が簡単でも
数値データをprintf出力表示するのに手間がかかる場合があり
数値データをprintf出力表示するのにあわせて
数値データを格納する方法を決める必要があるというわけなのですの
(#^.^#)」
ソーラー「はうぅぅん」
アレサ「以上 今日も元気で朗らかなソーラーさんでした~~~
みなさ~ん、いかがでしたでしょうか?
このように
🌞大量の数値データを🌞
🌞構造体型の配列を使って扱う方法は🌞
😊最も効率よく数値データを格納でき😊
かつ
😊最も効率よく数値データを😊
😊printf出力表示させることができるのです😊
シューティングの弾幕も
大量の弾の集まりであり
縦、横、の位置情報をもった
大量の数値データの集まりですね。
その大量の数値データを使って画面に弾を表示するので
シューティングの弾幕に構造体型の配列がつかわれるのは
必然となってくるでしょう。
すこしだけ
弾幕シューティングの片鱗がみえてきましたね。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます