《结构体类型》PPT课件.ppt_第1页
《结构体类型》PPT课件.ppt_第2页
《结构体类型》PPT课件.ppt_第3页
《结构体类型》PPT课件.ppt_第4页
《结构体类型》PPT课件.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、重庆电力高等专科学校,10.1 结构体类型,10.3 结构体指针,10.4 枚举类型,10.2 自定义类型,10.5 共用体,10.6 程序综合举例,10.7 上机实训,重庆电力高等专科学校,10.1 结构体类型 10.1.1 结构体类型的用途 理解结构体类型的意义并掌握结构体类型的用法,对进一步学习C+、Java等面向对象编程语言是有帮助的。 考虑这样一个问题:定义a、b、c 三个变量存放三个人通讯信息。 每个通讯信息含有:姓名、生日、电子邮箱和手机号这四项内容。 具体情况如如下图所示: a、b、c三个变量每一个都包含了三个整型和三个字符串,重庆电力高等专科学校,再举一例:学生班级考试成绩排

2、名次的问题。 定义一个数组:数组每个元素(一个学生)都包含一个学生的姓名(一个字符串)、学号(一个字符串)及各科成绩(若干个整数)。 数组的结构如下图所示: 从以上两个问题可知:每一个变量(或元素)都是由基本类型复合而成的多类型。C语言中允许用户在程序里自己构建程序所需要的这种类型由基本类型复合而成的类型,在C语言里称为结构体(structure)类型。,重庆电力高等专科学校,10.1.2结构体类型的构建及结构体变量的定义 1. 结构体类型的构建 构建一个结构体类型的一般形式为: struct 类型名 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名n; ;,注意:在“”后不要忘了

3、写“;”,每个成员的数据类型可以是简单数据类型或复杂类型。,重庆电力高等专科学校,【例10.1】 构建通讯录问题所需要的结构体类型。 struct info /*通讯录类型*/ char name50; /*姓名*/ int year; /*年*/ int month; /*月*/ int day; /*日*/ char email100; /*电子邮箱*/ char mobile_num12; /*手机号*/ ; 这段代码构建了通讯录问题所需要的结构体类型,结构类型名为info。,重庆电力高等专科学校,【例10.2】 构建学生成绩单问题所需要的结构体类型。 struct student /*

4、学生成绩类型*/ char name30; /*姓名*/ char num20; /*学号*/ int c_lang; /*C语言成绩*/ int english; /*英语成绩*/ int math; /*数学成绩*/ ; 这段代码构建了通讯录问题所需要的结构体类型,类型名为student。,重庆电力高等专科学校,2结构体变量的定义 结构体变量定义的一般形式: struct 类型名 变量名表列; 注意:初学者在概念上必须认识清楚:结构体类型虽然由基本类型复合而成,但它也是一种类型,而不是一个变量实体。注意区别结构体类型和结构体变量。 请比较: 两个定义相比较得:struct info相当于i

5、nt的地位,二者都是类型,只不过struct info是结构体类型,是一种复合类型,而int是基本类型。,重庆电力高等专科学校,【例10.3】 用例10.1所构建的struct info类型定义a、b、c三个变量,以备存储王晓明、李大伟和张欣欣三个好友的资料。 struct info a; struct info b; struct info c; 或: struct info a,b,c; 【例10.4】 用例10.2所构建的struct student类型定义数组soft1以备存储软件一班的所有学生的期末考试成绩。 struct student soft130;,重庆电力高等专科学校,3构

6、建结构体类型的同时定义结构体变量 【例10.5】 构建结构体类型struct info的同时定义struct info类型的变量a、b和c。 struct info char name50; int year; int month; int day; char email100; char mobile_num12; a,b,c; 上面定义中的类型名“info”可以省略不写:,重庆电力高等专科学校,struct char name50; int year; int month; int day; char email100; char mobile_num12; a,b,c;,注意:,注意:虽

7、然允许在定义结构体类型的同时定义结构体变量,但先定义结构体类型,再用结构体类型定义结构体变量,则更加规范一些;如果能把结构体类型定义在所有的函数之外,并放在文件的开始处则更好;如果自定义类型较多,最好把它们集中放在一个头文件中。,重庆电力高等专科学校,4 结构体变量作为结构体类型的成员 【例10.6】 用新的方式构建例10.1构建的struct info类型。 struct date int year; int month; int day; ; struct info char name50; struct date bith; char email100; char mobile_num1

8、2; ; 结构体类型的成员不但可以是基本类型的变量,也可以是结构体类型变量。,重庆电力高等专科学校,【例10.7】用新的方式构建例10.2构建的struct student类型。 struct student char name30; /*姓名*/ char num20; /*学号*/ struct /*定义结构体类型的同时定义结构体变量score*/ int c_lang; /*C语言成绩*/ int english; /*英语成绩*/ int math; /*数学成绩*/ score; ; 注意:结构体类型的成员还可以是其所在的结构体类型的指针。这样就可以实现复杂的数据结构。,重庆电力高等

9、专科学校,10.1.3 结构体变量的使用 1结构体变量成员的引用 结构体变量的成员需要通过分量运算符“.”来引用。 引用格式:结构体变量.成员名 【例10.8】给例10.3所定义的变量a赋值并输出: strcpy(,王晓明); a.year=1988; a.month=5; a.day=16; strcpy(a.email,); strcpy(a.mobile_num, 19801020304); printf( 姓名:%s 出生时期:%d年%d月%d日 e-mail:%s 手机号:%s ,,a.year,a.month,a.day,a.email,a.mobile_n

10、um );,重庆电力高等专科学校,【例10.9】为例10.4定义的soft1的数组的元素soft10赋值: strcpy(,李文星); strcpy(soft10.num, 0705231); soft10.c_lang=86; soft10.english=72; soft10.math=93; 如果结构体变量的成员又是一个结构体变量,则需要再加一级分量运算符来引用成员变量的成员变量。请看下例: 【例10.10】用例10.6构建的结构体类型定义变量a并赋值。 strcpy(,王晓明); a.birth.year=1988; a.birth.month=5;

11、a.birth.day=16; strcpy(a.email,); strcpy(a.mobile_num, 19801020304);,重庆电力高等专科学校,2结构体变量之间的赋值 结构体变量之间可以直接赋值,而不必用分量运算符一个一个地赋值。 【例10.11】定义struct student类型的变量b,并把例10.10中里每个成员都赋了值的a变量的值赋给b变量。 只需写成: struct student b; b=a; 而不必像下面这样,为对应的成员之间一个一个地赋值: strcpy(,); b.birth.year= a.b.year; ,重庆电力高等专科学校,

12、3结构体变量的初始化 有两种方式: 用赋值语句逐一对结构体变量成员赋值(如例10.8-10.10)。 在定义结构体变量的同时为结构体变量指定初始值。 【例10.12】 用例10.1和例10.6构建的struct info类型定义变量a,并初始化。 例10.1构建: struct info a=王晓明,1988,5,16, 19801020304; 例10.6构建: struct info a=王晓明,1988,5,16, 19801020304;,重庆电力高等专科学校,4结构体数组的初始化 【例10.13】用例10.7构建的struct student类型定义数组soft1并初始化: stru

13、ct student soft130= 李文星, 0705231,86,72,93, 王功名, 0705215,75,84,79, 刘建业, 0705226,58,95,99 . ; 或: struct student soft130= 李文星, 0705231,86,72,93, 王功名, 0705215,75,84,79, 刘建业, 0705226,58,95,99 . ;,重庆电力高等专科学校,10.1.4 结构体数组应用实例 【例10.14】 编程实现对候选人投票并统计票数的程序。 具体要求:有三个候选人,程序运行时,用户要投哪个候选人的票,就输入哪个候选人的代号,程序最后统计并输出每

14、个候选人的得票数。 程序代码: #include struct cand /*定义候选人类型*/ char name30 ; /*候选人姓名*/ int cnt; /*候选人票数*/ ;,重庆电力高等专科学校,void main() /*三个候选人未投票之前票数都为0*/ struct cand p3=张三,0,李四,0,王五,0; int i; /*投票次数循环变量*/ int j; /*候选人数组元素下标循环变量*/ int n; /*投票人数*/ int m; /*被赞成的候选人的代号*/ printf(投票人数:); /*输入投票人数*/ scanf(%d,重庆电力高等专科学校,pri

15、ntf(n(还有%d票未投)输入您要选的候选人的代号:,n-i); while(1) scanf(%d, ,重庆电力高等专科学校,程序运行结果(斜粗体表示用户输入文字): 投票人数:10 1 张三 2 李四 3 王五 (还有10票未投)输入您要选的候选人的代号:1 1 张三 2 李四 3 王五 (还有9票未投)输入您要选的候选人的代号:2 1 张三 2 李四 3 王五 (还有8票未投)输入您要选的候选人的代号:3 1 张三 2 李四 3 王五 (还有7票未投)输入您要选的候选人的代号:1 1 张三 2 李四 3 王五 (还有6票未投)输入您要选的候选人的代号:2 1 张三 2 李四 3 王五

16、(还有5票未投)输入您要选的候选人的代号:1 1 张三 2 李四 3 王五 (还有4票未投)输入您要选的候选人的代号:1 1 张三 2 李四 3 王五,重庆电力高等专科学校,(还有3票未投)输入您要选的候选人的代号:2 1 张三 2 李四 3 王五 (还有2票未投)输入您要选的候选人的代号:2 1 张三 2 李四 3 王五 (还有1票未投)输入您要选的候选人的代号:2 得票统计: 张三: 4票 李四: 5票 王五: 1票,重庆电力高等专科学校,10.2 自定义类型 10.2.1 自定义类型的定义及使用 C语言语法规定:可以用typedef关键字声明新的类型名来代替已有的类型名。 例如:type

17、def int INTEGER; typedef float SINGLE; 则可以用: INTEGER a; /*等价于int a; */ SINGLE f; /*等价于float f; */ 注意:用typedef声明了新的类型名后,原有的类型名和新的类型名都可以使用。主要是为了照顾有其他编程语言背景的人对C语言的使用。,重庆电力高等专科学校,【例10.15】构建最多可以拥有250个字符的字符串类型。 typedef char string250; string s; /*等价于char s250;*/ strcpy(s, C Language); 【例10.16】把字符指针定义为字符串类

18、型 typedef char* string; string s1,s2; /*等价于char *s1,s2;*/ s1= C Language; s2=s1; 这样一来就使得自定义类型string更像C+和Java语言里的字符串类型,变量s则更像Java里的字符串对象引用变量。,重庆电力高等专科学校,10.2.2 自定义类型编程实例 【例10.17】用户输入某班每个学生的姓名、学号及每个学生的每门课程的分数,程序输出成绩单。 程序如下: #include #include #include typedef struct int c_lang; int english; int math; i

19、nt sum; score;,重庆电力高等专科学校,10.3 结构体指针 10.3.1 引用结构体指针指向的结构体变量的成员 1结构体指针变量的定义 结构体指针变量定义形式: struct 结构体类型名 *变量, *变量,; 2利用结构体指针引用指向的结构体变量的成员 引用格式: 结构体指针变量-成员 或:(*结构体指针变量).成员,重庆电力高等专科学校,【例10.18】 把例10.17的程序中的void output(stu s)函数的参数改为结构体指针的形式。 原函数定义部分: void output(stu s) printf(%-8s%-8s%-8d%-8d%-8d%-8dn, s.n

20、um,,s.sc.c_lang,s.sc.english,s.sc.math,s.sc.sum ); 改为: void output(stu* p) printf( %-8s%-8s%-8d%-8d%-8d%-8dn, (*p).num, (*p).name, (*p).sc.c_lang, (*p).sc.english, (*p).sc.math, (*p).sc.sum ); 主调函数中调用语句部分: output(si); 需改为: output(,重庆电力高等专科学校,【例10.19】显示俱乐部会员信息 #define MALE 男 #define FEMALE 女 ty

21、pedef char Sex3; typedef struct char name30; Sex sex; int age; Person; Person member =张伟, MALE,23,李壮, MALE,19,王霞, FEMALE,21; void main() Person* p; int cnt; cnt=sizeof(member)/sizeof(member0); for(p=member;pname,p-sex,p-age); ,程序运行结果: 张伟 男 23 李壮 男 19 王霞 女 21,重庆电力高等专科学校,10.3.2 通过结构体的指针成员实现链表的原理 线性表:为

22、了实现同一类型的若干个数据形成一个有序的集合,这种有序的同类型数据集合在数据结构里被称作线性表。 链表也是一种线性表,也就是说链表能实现数组所能实现的功能。下面的程序用以说明单向链表的原理。 试着读这个程序,看一看链表的作用与数组是否相同。 【例10.20】试读下面的程序,体会链表原理(建立链表、输出链表)。 typedef struct PersonX char* name; struct PersonX *next; Person; #define NULL 0 void create(); void show(Person* p); Person a,b,c,d;,重庆电力高等专科学校,

23、void main() create(); show( ,程序运行结果: 张伟 李壮 王霞,重庆电力高等专科学校,create()函数使得a、b和c构成以下关系: 这个结构就是一个单向链表。 在结点C前(王霞)插入赵海结点d。 在create();与show(,重庆电力高等专科学校,产生的效果如下图所示:,重庆电力高等专科学校,删除第1个节点(指从0开始计数的第1个,即b结点): a.next= 产生的效果如下图所示:,重庆电力高等专科学校,10.4 枚举类型 10.4.1 C语言枚举类型的语法规定 枚举:就是将变量的值一一列出来,变量的值仅限于列举出来的范围内。 1枚举类型的定义 Enum

24、枚举类型名 枚举常量1= 整型常量, 枚举常量2= 整型常量, 枚举常量n= 整型常量 ; 说明:整型常量是为枚举常量的序号值,默认第一个为0,以后每个依次递增。,重庆电力高等专科学校,例如: enum week Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday; 定义了一个枚举类型week含7个枚举常量。SundaySaturday默认值依次为06。 2枚举变量的定义 Enum 枚举类型名 枚举变量名表 例如:enum week workday; enum color c1,c2; 3引用枚举类型应用 下面通过程序实例来说明如何

25、创建枚举类型,及如何指定枚举常量的值和使用枚举值。 【例10.21】 enum weekdaySUN,MON,TUE,WED,THU,FRI,SAT; void main() enum weekday a,b; a=MON; b=FRI; printf(a=%d,b=%d,a,b); ,程序运行结果: a=1,b=5,重庆电力高等专科学校,【例10.22】 enum weekdaySUN,MON,TUE,WED,THU,FRI,SAT; void main() printf(%d %d %d %d %d %d %dn, SUN,MON,TUE,WED,THU,FRI,SAT); 程序运行结果:

26、 0 1 2 3 4 5 6 【例10.23】把例10.22中的enum weekday的定义改为: enum weekdaySUN=5,MON,TUE,WED,THU,FRI,SAT; 程序运行结果: 5 6 7 8 9 10 11,重庆电力高等专科学校,【例10.24】 把例10.22中的enum weekday的定义改为: enum weekdaySUN=5,MON,TUE,WED=10,THU,FRI,SAT; 程序运行结果: 5 6 7 10 11 12 13 【例10.25】 把例10.22中的enum weekday的定义改为: enum weekdaySUN=9,MON,TUE,WED=10,THU,FRI,SAT; 程序运行结果:9 10 11 10 11 12 13 说明:在C语言里,同一枚举类型定义时所指定的不同名字的枚举常量可以有相同的值。 【例10.26】 把例10.22中的enum weekday的定义改为: enum weekdaySUN=9,MON,TUE,WED=-5,THU,FRI,SAT; 程序运行结果:9 10 11 -5 -4 -3 -2 说明:枚举常量的值可以是负数。,重庆电力高等专科学校,10.5 共用体 共用体:所有成员的存储单元共用同一个存储单元,又称为联合体。 创建共用体的一般形式为: unio

温馨提示

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

评论

0/150

提交评论