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

< 前のページへ
お問い合わせ
  • ようかん
  • SG Labs(エスジー ラボ)
  • ITERACY
  • RiceLog(ライスログ)
  • Salesforce導入コンサルティング
  • SES営業向け用語講座

Pagetop