1999年度のプログラミングIIIの授業は終りました。 この授業のページは参照用の資料として保存しているものです。最新の情報・資料は江上の授業ページで。 |
構造体学習の手順 |
構造体は「少々複雑な宣言をする型」として振る舞い、他の通常の変数(char, int, float, double)と同じようにこれまで学習したC言語の規則にしたがう。
[Q] C言語の変数が従う規則とは?
我々はこれまで色々なデータ構造を見てきた・・・テキストではこれらを順を追って説明している。
- 構造体・・・> の宣言・代入・参照・初期化(普通の使い方) (p.172-p.179)
- 構造体・・・> 配列(と組み合わせて使う) (p.180-p.181)
- 構造体・・・> 関数の引数・戻り値として使う (p.181-p.183)
- 構造体・・・> ポインタ変数として組み合わせる (p.183-p.184)
- 構造体・・・> 構造体を構造体として (p.185-p.188)
例題群
上記の学習手順に従ってそれぞれの項目の例題プログラムを示しておく(授業が進む従い順次説明を加える)。
次のような個人情報を保存するためのデータ構造を考える
- 個人コード ( code, int )
- 名前 ( name, char ... 19文字 )
- 性別 ( seibetsu, char )
- 住所 ( address, char ... 99文字 )
- 電話番号 ( tel, char ... 11 文字 )
構造体名 ADR_DATA
code
(int 型)
name
(19文字)
seibetsu
(char 型)
address
(99文字)
tel
(11文字)
普通の宣言・代入・参照
#include <stdio.h>
#include <string.h> /* strcpy() を使うために */int main(void)
{
/* 構造体準備 */
struct ADR_DATA
{
int code;
char name[20];
char seibetsu; /* 0:male 1:female ? */
char address[100];
char tel[12];
} data1 ;/* 構造体変数への代入 */
data1.code = 35;
data1.seibetsu = 0;
strcpy(data1.name , "ChibaKei" );
strcpy(data1.address , "Chiba-ken Chiba-shi");
strcpy(data1.tel , "043-255-3451" );/* 構造体変数の参照 */
printf("%d\n", data1.code );
printf("%s\n", data1.name );
printf("%d\n", data1.seibetsu );
printf("%s\n", data1.address );
printf("%s\n", data1.tel );
}
#include <stdio.h>
#include <string.h>struct ADR_DATA /* 構造体宣言をグローバル化してみました */
{
int code;
char name[20];
char seibetsu; /* 0:male 1:female ? */
char address[100];
char tel[12];
};int main(void)
{
struct ADR_DATA data1; /* 構造体変数宣言を2回にわけてみました */data1.code = 35;
data1.seibetsu = 0;
strcpy(data1.name , "ChibaKei" );
strcpy(data1.address , "Chiba-ken Chiba-shi");
strcpy(data1.tel , "043-255-3451" );printf("%d\n", data1.code );
printf("%s\n", data1.name );
printf("%d\n", data1.seibetsu );
printf("%s\n", data1.address );
printf("%s\n", data1.tel );
}・strcpy (p.225) と練習問題として行った strcopy ( p.166 )
→ p.177 のリスト8_7中
構造体変数間の代入
→ 作業の簡略化(ミスが減り・バグも減る)・・・構造体の「うまみ」
- 上のプログラムに対して新たに data2 という名前で構造体変数を準備
- 構造体変数 data1 の内容を data2 にコピーする
- 構造体変数 data2 の内容を画面に出力する
[Q] 上の箇条書きの条件を満たすプログラムを作成してみましょう。
[Q] 「うまみ」がどこにあるか考えてみましょう。
普通の宣言・代入・参照 + 構造体変数の初期化
#include <stdio.h>
#include <string.h> /* strcpy() を使うために */int main(void)
{
/* 構造体準備 */
struct ADR_DATA
{
int code;
char name[20];
char seibetsu; /* 0:male 1:female ? */
char address[100];
char tel[12];
} data1 = { 35, "ChibaKei", 0, "Chiba-ken Chiba-shi", "043-255-3451" } ;
/* 初期化するデータをメンバの順番に並べる */
/* 構造体変数の参照 */
printf("%d\n", data1.code );
printf("%s\n", data1.name );
printf("%d\n", data1.seibetsu );
printf("%s\n", data1.address );
printf("%s\n", data1.tel );
}
普通の宣言・代入・参照 + 関数呼び出し(引数として使用)
#include <stdio.h>
#include <string.h>struct ADR_DATA
{
int code;
char name[20];
char seibetsu; /* 0:male 1:female ? */
char address[100];
char tel[12];
};void display( struct ADR_DATA d ) ; /* 関数のプロトタイプ宣言 */
int main(void)
{
struct ADR_DATA data1;data1.code = 35;
data1.seibetsu = 0;
strcpy(data1.name , "ChibaKei" );
strcpy(data1.address , "Chiba-ken Chiba-shi");
strcpy(data1.tel , "043-255-3451" );display( data1 ); /* 関数呼び出し */
}
void display( struct ADR_DATA data )
{
printf("%d\n", data.code );
printf("%s\n", data.name );
printf("%d\n", data.seibetsu );
printf("%s\n", data.address );
printf("%s\n", data.tel );
}
普通の宣言・代入・参照 + 配列
#include <stdio.h>
#include <string.h>int main(void)
{
int i;
struct ADR_DATA
{
int code;
char name[20];
char seibetsu; /* 0:male 1:female ? */
char address[100];
char tel[12];
} data[ 3 ] ;data[0].code = 35;
data[0].seibetsu = 0;
strcpy(data[0].name , "ChibaKei" );
strcpy(data[0].address , "Chiba-ken Chiba-shi");
strcpy(data[0].tel , "043-255-3451" );data[1].code = 37;
data[1].seibetsu = 1;
strcpy(data[1].name , "Keiei" );
strcpy(data[1].address , "Chiba-ken Chiba-shi");
strcpy(data[1].tel , "043-252-6050" );data[2].code = 77;
data[2].seibetsu = 0;
strcpy(data[2].name , "nobody" );
strcpy(data[2].address , "Dokokano-ken Asokono-shi");
strcpy(data[2].tel , "123-456-7890" );for (i = 0; i < 3; i++ ) {
printf("%d 番目\n", i + 1);
printf(" %d\n", data[i].code );
printf(" %s\n", data[i].name );
printf(" %d\n", data[i].seibetsu );
printf(" %s\n", data[i].address );
printf(" %s\n", data[i].tel );
}
}
#include <stdio.h>
#include <string.h>int main(void)
{
int i;
struct ADR_DATA
{
int code;
char name[20];
char seibetsu; /* 0:male 1:female ? */
char address[100];
char tel[12];
} data[ 3 ] =
{
{ 35, "ChibaKei", 0, "Chiba-ken Chiba-shi", "043-255-3451" },
{ 37, "Keiei", 1, "Chiba-ken Chiba-shi", "043-252-6050" },
{ 77, "nobody", 0, "Dokokano-ken Asokono-shi", "123-456-7890" }
};for (i = 0; i < 3; i++ ) {
printf("%d 番目\n", i + 1);
printf(" %d\n", data[i].code );
printf(" %s\n", data[i].name );
printf(" %d\n", data[i].seibetsu );
printf(" %s\n", data[i].address );
printf(" %s\n", data[i].tel );
}
}
普通の宣言・代入・参照 + ポインタ
#include <stdio.h>
#include <string.h>struct ADR_DATA
{
int code;
char name[20];
char seibetsu; /* 0:male 1:female ? */
char address[100];
char tel[12];
};void display( struct ADR_DATA *d ) ;
int main(void)
{
struct ADR_DATA data1;data1.code = 35;
data1.seibetsu = 0;
strcpy(data1.name , "ChibaKei" );
strcpy(data1.address , "Chiba-ken Chiba-shi");
strcpy(data1.tel , "043-255-3451" );display( & data1 );
}
void display( struct ADR_DATA *data )
{
printf("%d\n", (*data).code );
printf("%s\n", (*data).name );
printf("%d\n", (*data).seibetsu );
printf("%s\n", (*data).address );
printf("%s\n", (*data).tel );
}