分校C课件第14讲结构体32-1-3节_第1页
分校C课件第14讲结构体32-1-3节_第2页
分校C课件第14讲结构体32-1-3节_第3页
分校C课件第14讲结构体32-1-3节_第4页
分校C课件第14讲结构体32-1-3节_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 第十四讲第十四讲 结构体结构体 相关数据的集合。相关数据的集合。 数据的类型可以不相同。数据的类型可以不相同。 用来定义保存在文件中的记录。用来定义保存在文件中的记录。 与指针一起创建动态的数据结构:与指针一起创建动态的数据结构: 链表链表 队列队列 栈栈 树树 2 第十四讲第十四讲 结构体结构体 结构体的概念结构体的概念 结构体类型的定义结构体类型的定义 结构体变量结构体变量 定义和声明定义和声明 初始化初始化 使用使用 结构体数组结构体数组 C C语言程序设计语言程序设计 本讲是教材第11章,但我们由 于课时和全国C的大纲关系,第 四至10节不讲,有兴趣者,自己 学习.本课件后面还有一

2、些有 趣的例子,如冼牌,选举计票程 序, 有兴趣者也可以自学. 结构体是派生的数据类型结构体是派生的数据类型 使用其他类型的对象来构造使用其他类型的对象来构造 结构体。结构体。 11.1 定义结构体定义结构体 3 结构体结构体 结构体结构体 数组是由相同类型的数据构成,而现实生活中由一些不相数组是由相同类型的数据构成,而现实生活中由一些不相 同类型的数据构成的一组数据是相当多的,例如学号、姓名和同类型的数据构成的一组数据是相当多的,例如学号、姓名和 学生成绩。学生成绩。C C语言提供了这种数据结构称为语言提供了这种数据结构称为结构体,它是一种结构体,它是一种 较为复杂而又非常灵活的构造型的数据

3、类型。较为复杂而又非常灵活的构造型的数据类型。 一个结构体类型可以由若干个成员(或域)的成分组成,一个结构体类型可以由若干个成员(或域)的成分组成, 不同的结构体类型其成员不同。不同的结构体类型其成员不同。 对于一个具体的结构体而言其成员的数量是固定的(同数对于一个具体的结构体而言其成员的数量是固定的(同数 组),各成员的数据类型可以不同,这是结构体与数组的重要组),各成员的数据类型可以不同,这是结构体与数组的重要 相同和不同点。相同和不同点。 4 结构体类型定义的一般形式为:结构体类型定义的一般形式为: struct struct 结构体名结构体名 类型名类型名1 1 成员名成员名1 1;

4、类型名类型名2 2 成员名成员名2 2; 类型名类型名n n 成员名成员名n n; ; 结构体结构体 其中,其中,structstruct是关键字,是结构体类型的标志。结构体名是是关键字,是结构体类型的标志。结构体名是 由用户定义的标识符,它规定了所定义的结构体类型的名称。由用户定义的标识符,它规定了所定义的结构体类型的名称。 结构体类型的组成成分称为成员,成员名的命名规则与变量名结构体类型的组成成分称为成员,成员名的命名规则与变量名 相同。相同。 如果成员的类型相同,则可以同变量一样在一个类型名后写如果成员的类型相同,则可以同变量一样在一个类型名后写 出几个成员名,他们之间用逗号分隔。出几个

5、成员名,他们之间用逗号分隔。 struct struct student long int xuhao long int xuhao; char name8char name8; int eng ,coup,sum;int eng ,coup,sum; float ave; float ave; ; 5 struct date int year; int month; int day; ; 也可以写成:也可以写成: struct date int year,month,day; struct student int num; char name8,sex; float score4; ; st

6、ruct:引入结构体定义。:引入结构体定义。 date:结构体的名称,必须与:结构体的名称,必须与 struct 一起使用。一起使用。 struct date 结构体包含结构体包含3个个 int * 类型的类型的成员成员: year Month day 例如例如A: 这里struct student结构体包含有: Int 型num(学号) char name8(姓名),sex(性别) Float score4(成绩数组) 例如例如B: 6 结构体类型的定义结构体类型的定义 结构体定义说明结构体定义说明 同一个结构体内不可以有同名的成员。同一个结构体内不可以有同名的成员。 不同结构体的成员名可以

7、相同,不互相冲突。不同结构体的成员名可以相同,不互相冲突。 结构体结构体 struct date int year,month,day; ; struct Book char title50,writer20,publisher50; int year,month; ; int year,month,day; 7 结构体类型的定义结构体类型的定义 结构体定义说明结构体定义说明 结构体的成员可以是基本类型和构造类型(数组和其他结构体)。结构体的成员可以是基本类型和构造类型(数组和其他结构体)。 结构体结构体 struct date int year,month,day; birthday; st

8、ruct StuRec int num;char name20;/这里包含了数组这里包含了数组 struct date birthday;/这里包含了上面的结构体这里包含了上面的结构体,称称结构体的嵌套结构体的嵌套 ; 结构体的成员不可以包含自身结构体的成员不可以包含自身 但可以包含自身的指针但可以包含自身的指针 struct student char name20; char gender; float scores4; struct student next; /*error*/ struct student *nextPtr; /*correct*/ ; 8 结构体定义说明结构体定义说明

9、 只是创建了新的数据类型,并不能保留内存空间。只是创建了新的数据类型,并不能保留内存空间。 必须定义结构体变量来获得内存空间。必须定义结构体变量来获得内存空间。 定义定义(声明声明)结构体变量结构体变量 有三种方法有三种方法: 1.定义结构体类型后,像声明普通变量一样声明结构体变量。定义结构体类型后,像声明普通变量一样声明结构体变量。 结构体结构体 struct date int year,month,day; ; struct date birth; year month day FF00 FF04 FF08 birth birth 的存储形式的存储形式 TC中与中与VC中的不同中的不同 1

10、1.2 定义和使用结构体变量定义和使用结构体变量 9 结构体变量结构体变量 定义声明结构体变量定义声明结构体变量 2.在定义结构体类型的同时,声明结构体变量在定义结构体类型的同时,声明结构体变量 结构体结构体 struct date int year,month,day; birth, days4, *bPtr; struct int year,month,day; birth, days4, *bPtr; 没有结构体名,没有结构体名, 无法再次使用。无法再次使用。 3.直接(只)声明结构体变量直接(只)声明结构体变量省略类型名。省略类型名。 类型与变量是不同的概念,注意区分。系统能对变量赋值

11、、存取、运算,类型与变量是不同的概念,注意区分。系统能对变量赋值、存取、运算, 而类型则不能,编译时,系统只对变量分配存储空间,而类型则不分配。而类型则不能,编译时,系统只对变量分配存储空间,而类型则不分配。 结构体中的成员也可以是一个结构体变量,即结构体的嵌套。结构体中的成员也可以是一个结构体变量,即结构体的嵌套。 10 struct student /* student是结构体名,结构体成员有是结构体名,结构体成员有num,name,sex,date,scre4 */ int num; char name8,sex; struct date /*date是结构体名,其结构体变量表是是结构体

12、名,其结构体变量表是birthday,成员包括年月日,成员包括年月日*/ int year,month,day; birthday; float score4; /*score4是数组,数组成员类型浮点型是数组,数组成员类型浮点型 */ xuesh; 结构体中的成员名可以和程序中的变量同名;不同结构体结构体中的成员名可以和程序中的变量同名;不同结构体 中的成员名也可以同名。中的成员名也可以同名。 11.4 结构体的嵌套结构体的嵌套 11 结构体的操作结构体的操作 结构体变量可以执行的操作结构体变量可以执行的操作 将结构体变量赋给相同类型的结构体变量。将结构体变量赋给相同类型的结构体变量。 得到

13、结构体变量的地址。得到结构体变量的地址。 访问结构体变量的成员。访问结构体变量的成员。 使用使用 sizeof 确确(测测)定结构体变量的大小。定结构体变量的大小。 结构体结构体 12 结构体变量的初始化结构体变量的初始化 给全部成员赋初值给全部成员赋初值 结构体结构体 struct student int num; char name8,sex; struct date int year,month ,day ; birthday; float sco 4; xuesh=101,“王小宁”,F,1975,5,21,83.6,88,75.5,90; 将结构体变量各成员的初值顺序地放在一对大括号

14、中,并用逗号分隔。对将结构体变量各成员的初值顺序地放在一对大括号中,并用逗号分隔。对 结构体类型变量赋初值时,按每个成员在结构体中的顺序一一对应赋值。结构体类型变量赋初值时,按每个成员在结构体中的顺序一一对应赋值。 同变量一样结构体变量在定义时也可以进行初始化。同变量一样结构体变量在定义时也可以进行初始化。 13 结构体变量的初始化结构体变量的初始化 初始化结构体变量初始化结构体变量 给部分成员赋初值。给部分成员赋初值。 结构体结构体 struct StuRec int num; char name20; struct date int year,month,day; birthday; fl

15、oat score; student=101, “王小宁”; num (2B) name (20B) birthday(6B)score (4B) yearmonthday 101 王小宁 0000.0 14 访问结构体成员的两种方式访问结构体成员的两种方式 结构体成员运算符:结构体成员运算符:. 用于结构体变量用于结构体变量 结构体指针运算符:结构体指针运算符:- 用于指向结构体的指针用于指向结构体的指针 等价于等价于 (*cardPtr).face 结构体结构体 struct card myCard; printf(“%s”, myCard.face); struct card *card

16、Ptr; printf(“%s”, cardPtr-face); struct card char *face; char *suit; myCard.face; 11.5 结构体指针结构体指针 15 案例分析:结构体变量的成员案例分析:结构体变量的成员 问题:访问结构体变量的成员。问题:访问结构体变量的成员。(cw1301.c) 结构体结构体 #include struct card char *face; char *suit; a; Int main() struct card a, *aPtr; a.face = Ace; a.suit = Spades; aPtr = printf(

17、%s%s%sn%s%s%sn%s%s%sn, a.face, of , a.suit, aPtr-face, of , aPtr-suit, (*aPtr).face, of , (*aPtr).suit); 与数组的不同:与数组的不同: 结构变量名不是指针结构变量名不是指针 Ace of Spades Ace of Spades Ace of Spades 注意:注意: 结构不能作为整体输入输出。结构不能作为整体输入输出。 必须逐个成员输入输出。必须逐个成员输入输出。 16 问题:编写函数实现结构体的复制。问题:编写函数实现结构体的复制。 结构体结构体 #include#include st

18、ructstruct date date int year, month, day; ; int year, month, day; ; voidvoid show(char show(char * *, struct date);, struct date); voidvoid copy(struct date, struct date); copy(struct date, struct date); voidvoid clone(struct date, struct date clone(struct date, struct date * *);); intint main() ma

19、in() structstruct date d1, d2, d3, d4; date d1, d2, d3, d4; d1.year = 2004; d1.year = 2004; d1.month = 5; d1.month = 5; d1.day = 1; d1.day = 1; show(“d1”, d1); show(“d1”, d1); /结构体变量作实参,值传递结构体变量作实参,值传递 d2 = d1;d2 = d1; show(d2, d2); show(d2, d2); 实现实现(cw1302.c) 11.6 结构体与函数结构体与函数 17 案例分析:结构体作为函数的参数案例

20、分析:结构体作为函数的参数 结构体结构体 copy(d1, d3); copy(d1, d3); show(d3, d3); show(d3, d3); clone(d1, clone(d1, show(d4, d4); show(d4, d4); voidvoid show(char show(char * *name, struct date d)name, struct date d) printf(%s: %d-%d-%dn, name, d.year, d.month, d.day); printf(%s: %d-%d-%dn, name, d.year, d.month, d.da

21、y); voidvoid copy(struct date s, copy(struct date s, struct date dstruct date d) ) d = s; d = s; voidvoid clone(struct date s, clone(struct date s, struct date struct date * *dPtrdPtr) ) * *dPtr = s; dPtr = s; d1: 2004-5-1 d2: 2004-5-1 d3: 0-0-24 (TC)在在VC中运行的结果不一样中运行的结果不一样-858993460-858993460-858993

22、460 d4: 2004-5-1 用指针作形参 用地址作实参传递 /结构体变量作实参,值传递,d3未赋值作实参值不确定 空返回,无值返回 (cw1302.c)续)续 18 一、结构体数组的定义一、结构体数组的定义 定义结构体数组的方法和定义结构体变量的方法一样,只定义结构体数组的方法和定义结构体变量的方法一样,只 是必须说明其为数组。是必须说明其为数组。 定义结构体变量的三种方法都可以用来定义结构体数组。定义结构体变量的三种方法都可以用来定义结构体数组。 二、结构体数组的初始化二、结构体数组的初始化 和一般数组一样,结构体数组也可以进行初始化。和一般数组一样,结构体数组也可以进行初始化。 数组

23、每个元素的初值都放在一对大括号中,括号中依次排数组每个元素的初值都放在一对大括号中,括号中依次排 列元素各成员的初始值列元素各成员的初始值 三、结构体数组的引用三、结构体数组的引用 对结构体数组的引用一般是对数组元素的成员进行引用。对结构体数组的引用一般是对数组元素的成员进行引用。 引用只要遵循对数组元素的引用规则和对结构体变量成员的引用只要遵循对数组元素的引用规则和对结构体变量成员的 引用规则即可。引用规则即可。 11.3 定义结构体数组定义结构体数组 19 结构体数组结构体数组 结构体数组结构体数组 数组的元素是结构体变量。数组的元素是结构体变量。 常用结构体来表示记录,那么结构体数组就可

24、以表示一组记常用结构体来表示记录,那么结构体数组就可以表示一组记 录。录。 案例分析案例分析 全班全班 N 个学生,每个学生有学号、姓名、四门课的成绩。个学生,每个学生有学号、姓名、四门课的成绩。 结构体结构体 学号学号姓名姓名成绩成绩1成绩成绩2成绩成绩3成绩成绩4 101WangHai80787681 102ZhaoFei68667175 130LiRui82768184 20 结构体数组结构体数组 结构体数组结构体数组 案例分析案例分析 那么,可以定义结构体数组来保存那么,可以定义结构体数组来保存 N 个学生的数据。个学生的数据。 这样,每个学生的数据就对应一个结构体变量(一条记录),便

25、于这样,每个学生的数据就对应一个结构体变量(一条记录),便于 编程处理。编程处理。 结构体结构体 struct student int num; char name20; float scores4; ; struct student students30; 21 程序举例程序举例 设某班有设某班有N名学生,每个学生数据包括学号,姓名,性别,年龄,平均成绩。名学生,每个学生数据包括学号,姓名,性别,年龄,平均成绩。 要求输入任意一个学号,输出该学生的所有数据。要求输入任意一个学号,输出该学生的所有数据。 分析:从一组数据中查找所需要的具有某特征的内容,最简单的是顺序查找。分析:从一组数据中查找

26、所需要的具有某特征的内容,最简单的是顺序查找。 直到找到或找完为止。直到找到或找完为止。 /*Cw1303.c 教材教材P171L11-1*/ #include #define N 2 struct student /定义结构体定义结构体 long int num;/学号学号 char name7;/姓名姓名 char sex3;/性别性别 int age,score;/成绩成绩 stuN;/定义结构体数组定义结构体数组 main() int i,t=-1;/t=-1为未查找到时的标志为未查找到时的标志 long int xuehao;/查找学号变量查找学号变量 struct student

27、stuN; /定义结构体类型数组定义结构体类型数组 (cw1303.c)案例分析:结构体数组案例分析:结构体数组 22 printf(请按下列顺序输入请按下列顺序输入%d个学生的信息个学生的信息:n,N); /为结构体变量赋值为结构体变量赋值 printf(t学号学号 姓名姓名 性别性别 年龄年龄 平均平均n); for (i=0;iN;i+) printf(NO%d:t,i+1); scanf(%ld%s%s%d%d, printf(请输入需查找学生的学号:请输入需查找学生的学号:); scanf(%ld, for(i=0;iN;i+) if(xuehao=stui.num) t=i;bre

28、ak; if (t!=-1) /*以下输出检索结果以下输出检索结果*/ printf(%ld%8s%4s%4d%4dn,stut.num,,stut.sex,stut.age, stut.score); else printf(查无此人查无此人!n); (cw1303.c)续)续 23 案例分析:结构体数组案例分析:结构体数组 检索检索 问题:问题: 某班有某班有 n 个学生,每个学生的数据包括学号、姓名、年龄和性别。个学生,每个学生的数据包括学号、姓名、年龄和性别。 要求给定任意一个学号,程序能输出检索的结果,并显示对应的学要求给定任意一个学号,程序能输出检索的结果,并显示

29、对应的学 生的数据。生的数据。 分析分析 定义结构体表示学生定义结构体表示学生 用结构体数组保存学生数据用结构体数组保存学生数据 采用顺序查找法采用顺序查找法 结构体结构体 输入学生信息输入学生信息 输入查询条件输入查询条件 查找学生信息,报告结果查找学生信息,报告结果 24 案例分析:结构体数组案例分析:结构体数组 检索检索 实现实现(cw1304.c) 结构体结构体 #include #define MAX 20 int main() struct StuRec int num; char name20; char gender; int age; studentMAX; int i, N

30、, num; 25 案例分析:结构体数组案例分析:结构体数组 检索检索 实现实现 结构体结构体 printf(tInput a integer as the number of students:); scanf(%d, printf(tInput %d students information:n,N); printf(ntNo.tNametGendertAgen); for (i=0;iN;i+) printf(student %d:nt, i+1); scanf(%d %s %c %d, (cw1304.c)续)续 26 案例分析:结构体数组案例分析:结构体数组 检索检索 实现实现 结构

31、体结构体 printf(ntInput a number:); scanf(%d, printf(ntPlease wait. Searching.n); for (i=0;iN;i+) if (num=studenti.num) break; if (iN) printf(ntNo.:%dntName:%sntGender:%cntAge:%dn, studenti.num, , studenti.gender, studenti.age); else printf(ntNot found!n); 输入查找条件输入查找条件 查找查找 (cw1304.c)续)续 27

32、 案例分析:结构体数组案例分析:结构体数组 检索检索 问题:问题: 可以多次查找。可以多次查找。 结构体结构体 输入学生信息输入学生信息 输入查询条件输入查询条件 查找学生信息,报告结果查找学生信息,报告结果 是否继续查询是否继续查询 Y N 人机交互人机交互 28 案例分析:结构体数组案例分析:结构体数组 检索检索 实现实现(cw1304m.c) 部分代码部分代码 结构体结构体 do scanf(%d, for (i=0;iN;i+) if (num=studenti.num) break; if (iN) /* Found! */ else printf(ntNot found!n); p

33、rintf(ntContinue?(y/n); c=getchar(); while (c=y|c=Y); 1001y (cw1304.c)续)续 29 小结:知识要点小结:知识要点 结构体是由若干个不同类型数据项构成的集合。结构体是由若干个不同类型数据项构成的集合。 结构体类型的定义:结构体类型的定义: 1. 结构体类型定义的一般形式结构体类型定义的一般形式 2. 结构体类型定义中的注意事项结构体类型定义中的注意事项 结构体类型变量:结构体类型变量: 结构体数组:结构体数组: 1. 结构体数组定义的三种方法结构体数组定义的三种方法 2. 结构体数组的初始化结构体数组的初始化 3. 对结构体数组元素的成员进行引用对结构体数组元素的成员进行引用 1. 结构体类型变量定义的三种方法结构体类型变量定义的三种方法 2. 结构体类型变量的初始化结构体类型变量的初始化 3. 对结构体变量中成员的引用对结构体变量中成员的引用 4. 对整个结构体变量的引用对整个结构体变量的引用 30 #include /预处理调用输入输出头文件预处理调用输入输出头文件 #include / #define N 10/定义符号常量定义符号常量 struct stu/定义结构体定义结构体 long int sno;/学号长整型学号长整型

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论