続いては構造体について。
異なったデータ型をひとまとめにして扱いたい場合に構造体を利用する。
構造体の宣言は↓のような感じで行う。
struct 構造体タグ {
メンバ;
・・・;
};
↑だけではまだ構造体のテンプレートを宣言しただけで使えない。
実際に使うには構造体タグをを使って構造体変数を宣言する必要がある。
struct data man;
↑ ↑
タグ 変数
構造体テンプレートを宣言するのと同時に、構造体変数を宣言するやり方もある↓。
struct 構造体タグ{
メンバ;
・・・;
} 構造体変数1, 構造体変数2, ・・・;
↑のように同時に宣言する場合は構造体タグを省略することもできる。
構造体のメンバへアクセスするには構造体メンバ演算子「.」を利用する。
構造体変数の配列を作ることも可能。
struct Man student;
と構造体変数を宣言していたところを
struct Man student[5];
とかすればいい。
student[2]のnameメンバにアクセスする場合は
student[2].name でOK。
構造体へのポインタ
構造体変数を
struct Man *student;
のように宣言すると、studentはManへの構造体へのポインタとなる。
このときメンバにアクセスするのは
(*student).name とする。
でも一般的にはアロー演算子を使って
student->name
とする。
新しい型を定義する
typedefキーワードを使えばデータ型の名前を自由に定義することができる。
typedef 既存の型名 新しい型名;
typedef int SEISU; こんな感じで。
上の例では何がうれしいのかあまりわからない・・・。
でも構造体にこのtypedefを適用するとあたかも新しい型ができたかのように見える。
たとえば
typedef struct _tagData {
int age;
double bl;
double bw;
} MYDATA, *LPMYDATA;
とすると_tagData型の構造体変数を定義するとき、
MYDATA mydata;
と書ける。
構造体へのポインタを宣言する場合も
 
LPMYDATA lpmydata;
と宣言できる。
以上のことを踏まえてのサンプルプログラム↓。
 
実行結果
 後半の説明に難あり?
 後半の説明に難あり?
 猫でもわかるC言語プログラミング
 猫でもわかるC言語プログラミング
 猫どころか人間でもわからない
 猫どころか人間でもわからない
 実際にコードを書いて覚える本
 実際にコードを書いて覚える本
 ポインタや配列の説明が内容的に薄いかな。
 ポインタや配列の説明が内容的に薄いかな。
                                    
                                異なったデータ型をひとまとめにして扱いたい場合に構造体を利用する。
構造体の宣言は↓のような感じで行う。
struct 構造体タグ {
メンバ;
・・・;
};
↑だけではまだ構造体のテンプレートを宣言しただけで使えない。
実際に使うには構造体タグをを使って構造体変数を宣言する必要がある。
struct data man;
↑ ↑
タグ 変数
構造体テンプレートを宣言するのと同時に、構造体変数を宣言するやり方もある↓。
struct 構造体タグ{
メンバ;
・・・;
} 構造体変数1, 構造体変数2, ・・・;
↑のように同時に宣言する場合は構造体タグを省略することもできる。
構造体のメンバへアクセスするには構造体メンバ演算子「.」を利用する。
構造体変数の配列を作ることも可能。
struct Man student;
と構造体変数を宣言していたところを
struct Man student[5];
とかすればいい。
student[2]のnameメンバにアクセスする場合は
student[2].name でOK。
構造体へのポインタ
構造体変数を
struct Man *student;
のように宣言すると、studentはManへの構造体へのポインタとなる。
このときメンバにアクセスするのは
(*student).name とする。
でも一般的にはアロー演算子を使って
student->name
とする。
新しい型を定義する
typedefキーワードを使えばデータ型の名前を自由に定義することができる。
typedef 既存の型名 新しい型名;
typedef int SEISU; こんな感じで。
上の例では何がうれしいのかあまりわからない・・・。
でも構造体にこのtypedefを適用するとあたかも新しい型ができたかのように見える。
たとえば
typedef struct _tagData {
int age;
double bl;
double bw;
} MYDATA, *LPMYDATA;
とすると_tagData型の構造体変数を定義するとき、
MYDATA mydata;
と書ける。
構造体へのポインタを宣言する場合も
LPMYDATA lpmydata;
と宣言できる。
以上のことを踏まえてのサンプルプログラム↓。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct DATA {
        char name[32];
        char tel[32];
} MYDATA, *LPMYDATA;
int menu();
int meibo_input( LPMYDATA );
int meibo_output( LPMYDATA );
int main() {
        int selectno, loopend = 0;
        MYDATA mydata[10];
        LPMYDATA lpMydata = mydata;
        
        memset( mydata, '\0', sizeof(MYDATA[10]) );
        while(1) {
                selectno = menu();
                switch (selectno) {
                        case 1:
                                meibo_input( lpMydata );
                                break;
                        case 2:
                                meibo_output( lpMydata );
                                break;
                        default:
                                loopend = 1;
                                break;
                }
                if( loopend )
                        break;
        }
        return 0;
}
int menu() {
        char ret[8];
        
        printf( "****** MENU ******\n" );
        printf( "1:データ入力\n" );
        printf( "2:データ表示\n" );
        printf( "0:終了\n" );
        printf( "********************\n" );
        printf( "---->" );
        gets(ret);
        return atoi(ret);
}
int meibo_input( LPMYDATA lpData ) {
        char strno[8];
        int no;
        printf( "何番のデータを入力しますか(0-9)--" );
        gets(strno);
        if( strno[0] < '0' || strno[0] > '9' ) {
                printf( "入力が不正です\n" );
                return -1;
        }
        strno[1] = '\0';
        no = atoi(strno);
        printf("氏名--");
        gets( (lpData + no)->name );
        printf( "電話番号--" );
        gets( (lpData + no)->tel );
        return 0;
}
int meibo_output( LPMYDATA lpData ) {
        char strno[8];
        int no;
        
        printf( "何番のデータを読み出しますか(0-9)--" );
        gets( strno );
        
        if(strno[0] < '0' || strno[0] > '9') {
                printf( "入力が不正です\n" );
                return -1;
        }
        strno[1] = '\0';
        no = atoi( strno );
        if(!strcmp( (lpData + no )->name, "" )) {
                printf( "データがありません。\n" );
                return -1;
        }
        printf( "氏名-- %s\n", ( lpData + no )->name );
        printf( "電話番号-- %s\n", (lpData + no)->tel );
        return 0;
}
実行結果
$ ./type03.exe ****** MENU ****** 1:データ入力 2:データ表示 0:終了 ******************** ---->1 何番のデータを入力しますか(0-9)--3 氏名--test 電話番号--1234567 ****** MENU ****** 1:データ入力 2:データ表示 0:終了 ******************** ---->2 何番のデータを読み出しますか(0-9)--3 氏名-- test 電話番号-- 1234567 ****** MENU ****** 1:データ入力 2:データ表示 0:終了 ******************** ---->0
もうちょっと色々やってみないとしっくりこないな。
猫でもわかるC言語プログラミング 第2版 猫でもわかるプログラミングシリーズ (NEKO Series)
posted with amazlet at 10.04.05
粂井 康孝 
ソフトバンククリエイティブ
売り上げランキング: 30287
ソフトバンククリエイティブ
売り上げランキング: 30287
おすすめ度の平均: 

 後半の説明に難あり?
 後半の説明に難あり? 猫でもわかるC言語プログラミング
 猫でもわかるC言語プログラミング 猫どころか人間でもわからない
 猫どころか人間でもわからない 実際にコードを書いて覚える本
 実際にコードを書いて覚える本 ポインタや配列の説明が内容的に薄いかな。
 ポインタや配列の説明が内容的に薄いかな。
 
 
The Professor will discover that. Just how can they look human? There's no delusion in 1 case or alternatively the other, Miss Middleton.