当前位置:文档之家› 济南大学C语言程序设计05

济南大学C语言程序设计05

Rose

第五章

复杂构造数据类型结构体与共用体

1 概述

的数据类型组合在一起表达一个整体的信息。

例如:描述一个学生的完整信息时,有学号、姓名、年龄、成绩、家庭地址等项。

这些项目之间是彼此联系的,应组织定义成一个组合项,统一表示和使用,见下例:

结构体类型举例

学号姓名性别年龄成绩家庭地址

int num char

name[8]

char

sex

int

age

float

score

char

addr[20]

9001李华女2086济南某一个学生的具体信息表示:

结构体类型定义

这种由若干个不同类型的数据项组成的组合类型,在C语言中叫做结构体类型,相当于其它语言中描述的“记录”。

结构体类型在使用之前应先定义其类型结构,然后再定义该类型变量,才能使用。如上实例:

济南大学

Rose

结构体类型定义:struct student

{ int num;

char name[8];

char sex;int age; float score;char addr[20];};

关键字数据项(成员)

结构体描述:学号

姓名

性别年龄成绩

家庭地址int num char name[8]char sex int age float

score

char

addr[20]自己命名的结构体类型名

济南大学Rose 定义有n个成员的结构体类型的一般形式:

struct结构体类型名

{

类型标识符1成员名1;

类型标识符2 成员名2;

…..…….

类型标识符n 成员名n;

};

说明:1、用{ } 将成员扩起来。

2、成员的类型可以是任意类型,称为一个域或一个数据项。注意此处是类型名,不是变

量名。

济南大学

Rose

2定义结构体变量

注意前面定义的student 同int 、char 等一样只是类型的名字,不是结构体变量,不能直接使用,需由此

类型继续定义结构体变量才能使用,步骤:先定义一个结构体类型,再定义变量。

struct 结构体类型名变量名列表;

注:关键字struct 与结构体类型标识符一起使用。

例:struct student stu1, stu2,stu[50];

已定义的

类型名

济南大学

Rose

定义了结构体变量后,系统为之分配内存单元,结构体的各成员在内存中是按顺序连续存放的,所以结构体变量在内存中占据的字节数是各个成员的长度和,如stu1变量占据内存字节数为2+8+1+2+4+20=37。

学号姓名性别年龄成绩

家庭地

址int num

char name[8]char sex int age

float score

char addr[20]

济南大学Rose 还可以用如下方法定义结构体变量:

2、定义类型的同时定义结构体变量:

例如:

struct 结构体类型名

{

类型标识符1 成员名1;

类型标识符2 成员名2;

…………

类型标识符n 成员名n; }变量名表;例:

struct note

{

char name[20]; char sex; char addr[20]; char tel[8];

} txl1, txl2;

济南大学Rose

3、直接定义结构体类型变量:

例如:

struct

{

类型标识符1 成员名1;

类型标识符2 成员名2;

…………

类型标识符n 成员名n; } 变量名表;例:

struct

{

char name[20]; char sex; char addr[20]; char tel[8];

} txl1, txl2;

注意:不出现类型名

济南大学Rose struct date

{ int month;

int day;

int year;

}

struct student

{ int num;

char name[8];

char sex;

int age;

struct date birthday;

3 结构体变量的引用

结构体变量名.成员名

成员运算符

一般来说, 在程序设计中不直接引用结构体变量,而是引用结构体变量的某个成员变量1、成员的引用形式为:

成员运算符优先级最高。

例: struct student stu1;

引用成员stu1.num=9002;

gets(https://www.doczj.com/doc/be9664856.html,);

stu1.sex=…m? ;

printf(“%d,%d”,stu1.num,https://www.doczj.com/doc/be9664856.html,);

2、结构体变量使用说明

1.结构体变量通常不能整体使用,不能整体

输入、输出,只能对单个成员分别引用。

但当结构体变量作为函数参数或赋初值时,可以整体输入;或者两个相同类型的结构体变量,如果一个已经赋值,可以对另外一个整体赋值。

如果student1已被赋值,则可以:

2、结构体变量使用说明

2.如果成员本身又属于一个结构体类型,

则这个成员也不能整体赋值,要用若干各成员运算符引用,如前面的birthday

成员本身又是date类型的变量,则需stu1.birthday.month=4;

stu1.birthday.day=5;

stu1.birthday.year=1998;

举例:

编程输入一个班级的30名同学信息,统计来自山东的学生人数。学生信息由以下几项组成:

学号,姓名,性别,籍贯

济南大学Rose 程序主要步骤:

1、定义数据类型,结构体类型student。

2、定义该类型的数组cai0801,长度30。

3、循环程序,输入30名同学信息。

循环次数:30次,固定次数的循环。

循环体内容:⑴依次为每个元素的各个成员输入数据。⑵比较籍贯成员项的数据是否为

“山东”,如果是,则计数器加1.

4、输出统计后的count值。

济南大学Rose struct student

{char num[11];

char name[8];

char sex;

char addr[20];

};

main()

{ struct student cai0801[10];

int i,count=0;

printf(“input 30 students information:\n”);

for(i=0;i<30;i++)

{ gets(cai0801[i]num); gets(cai0801[i].name);

getchar(cai0801[i].sex); gets(cai0801[i].addr);

if(strcmp(cai0801[i].addr,“山东”)==0)

count++;

}

printf(“%d come from 山东\n”);

4 结构体变量的初始化

可以在定义结构体变量的同时, 对其初始化例:struct student

{ long int num;char name[20];char sex;char addr[20];

}a={9001, “曹名”,‘m?, “123 北京路”};

说明:{ }和,一一对应

:

a.num=9001;strcpy(https://www.doczj.com/doc/be9664856.html,, “曹名”);

a.sex=…m?;

strcpy(a.addr, “123 北京路”);

5、结构体数组的定义及初始化

例1:struct student

{ int num;

char name[20];

char sex;

float score;

char addr[20];

}stu[3]={{10101,”Li Lin”,?M?,87.5,”103

Beijing”},{10102,”Zu Feng”,

?F?,98,”130 Shanghai”},

{10103,”Wang Mi”,?M?,78,

相关主题
文本预览
相关文档 最新文档