第11章 C言語の構造体 ~関連のある変数をまとめる~
そのようなときに、C言語では構造体というものを使います。 リスト26を次のように変更してみてください。
— リスト26`` —
#include <stdio.h> #include <stdlib.h> #define BOOK_COUNT 5 #define MAX_LENGTH 256 /** * 書籍情報構造体の定義 */ typedef struct { char name[MAX_LENGTH]; /* 書籍名 */ char publisher[MAX_LENGTH]; /* 出版社名 */ int price; /* 価格 */ } BOOK_INFO; void main() { BOOK_INFO books[BOOK_COUNT]; /* 書籍情報 */ char buf[MAX_LENGTH]; /* 価格の一時保存領域 */ int cnt; /* ループカウンター */ /* データの入力 */ for (cnt = 0; cnt < BOOK_COUNT; cnt++) { printf("%d冊目\n", cnt+1); printf("書籍名を入力してください->"); gets(books[cnt].name); printf("出版社名を入力してください->"); gets(books[cnt].publisher); printf("価格を入力してください->"); gets(buf); books[cnt].price = atoi(buf); } /* データの表示 */ for (cnt = 0; cnt < BOOK_COUNT; cnt++) { printf("%d冊目\n", cnt+1); printf("書籍名=%s\n", books[cnt].name); printf("出版社名=%s\n", books[cnt].publisher); printf("価格=%d円\n", books[cnt].price); } }
少し面倒なことをしてると感じましたか?
しかし、このプログラムを見た人は、name、publisher、priceの三つで、 一冊の書籍情報をあらわしていることが、容易に理解できるはずです。 ですから、キーボードを叩く量が少しくらい増えたとしても、 プログラムが理解しやすくなる方が重要です。
より大きなプログラムになってきた場合には、関連性のある変数同士は、 必ず構造体にしてまとめてください。
それでは、構造体の使い方を説明しましょう。 構造体は以下のように、初めに定義をしておきます。 定義は、変数の宣言とは違って、箱を用意するためのものではありません。 構造体の定義を、家の建築に例えるならば、設計図を書いただけの状態になります。
構造体の定義の例:
typedef struct { 型名 変数名; int data1; long data2; char str1[64]; ・ ・ } 構造体に付ける名前;
この構造体を変数として使用するためには、必ず宣言することが必要です。
構造体も通常の変数と全く同じで、宣言することによって初めて、箱が用意されるのです。 定義するだけでは使えません。 構造体の宣言を、家の建築に例えるなら、実際に建てることにあたります。
通常の変数の宣言の例:
int data;
構造体の宣言の例:
BOOK_INFO book;
(構造体に付けた名前) (変数名)
宣言した後、構造体の中の変数に数値を代入したければ、次のようにします。
book.price = 1500;
この「.」は、日本語に置き換えれば、次のような意味です。
book.price = 1500;
↓
book の price = 1500;
比較する時も、演算する時も同じようにできます。
比較 if((book.price >= 1000) && book.price <= 5000)
演算 book.price = book.price * 105 / 100;
では最後に、リスト26を次のように変更して、比較や演算ができることを確認してください。
— リスト26`` —
#include <stdio.h> #include <stdlib.h> #define BOOK_COUNT 5 #define MAX_LENGTH 256 /** * 書籍情報構造体の定義 */ typedef struct { char name[MAX_LENGTH]; /* 書籍名 */ char publisher[MAX_LENGTH]; /* 出版社名 */ int price; /* 価格 */ } BOOK_INFO; void main() { BOOK_INFO books[BOOK_COUNT]; /* 書籍情報 */ char buf[MAX_LENGTH]; /* 価格の一時保存領域 */ int cnt; /* ループカウンター */ /* データの入力 */ for (cnt = 0; cnt < BOOK_COUNT; cnt++) { printf("%d冊目\n", cnt+1); printf("書籍名を入力してください->"); gets(books[cnt].name); printf("出版社名を入力してください->"); gets(books[cnt].publisher); printf("価格を入力してください->"); gets(buf); books[cnt].price = atoi(buf); } /* データの表示 */ printf("1500円以上の書籍の検索結果\n"); for (cnt = 0; cnt < BOOK_COUNT; cnt++) { if (books[cnt].price >= 1500) { printf("書籍名=%s\n", books[cnt].name); printf("税込み価格=%d円\n", books[cnt].price * 105 / 100); } } }< 前のページへ 次のページへ >
-
IS 559680 / ISO27001
認証範囲 本社、芝大門オフィス情報セキュリティ基本方針 -
個人情報保護方針
個人情報の取扱いについて
保有個人データ又は
第三者提供記録に関する
事項の周知について
特定個人情報の取扱いについて -
FS 671851 / ISO9001
認証範囲 本社、芝大門オフィス品質方針