用户自定义数据类型.ppt_第1页
用户自定义数据类型.ppt_第2页
用户自定义数据类型.ppt_第3页
用户自定义数据类型.ppt_第4页
用户自定义数据类型.ppt_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

第8章 用户自定义数据类型 在现实中,经常要处理一些复杂的数 据,它们由多个数据对象聚合而成,且这 些数据分项的数目和数据类型不尽相同。 C语言了提供类型构造器,使程序员可 以自行定义数据类型,本章介绍结构类型 、联合类型和枚举类型。 1 第8章 用户自定义数据类型 8.1 结构类型及其变量的定义 8.2 结构数组 8.3 结构和指针 8.4 联合类型 8.5 枚举类型 8.6 用typedef定义类型别名 2 8.1 结构类型及其变量的定义 在应用中,一组数据往往具有不同的数据类型 。例如:学生数据(描述学生的基本情况) 学号、姓名、性别、籍贯、出生年月、成绩 (这些数据项称为学生数据的分量或成员)。 它们具有如下特征: (1) 由多个数据对象聚合而成 (2) 被聚合的数据对象,类型可相同,也可不同 (3) 成员具有相对的独立性,可以单独被访问 3 8.1 结构类型及其变量的定义 8.1.1 结构类型的定义 结构类型是聚合数据对象的抽象,通常由程 序员根据聚合数据对象的聚合形态自行定义,因 此结构类型是用户自定义数据类型。 定义结构类型的语法格式 struct 结构类型名 成员列表; ; 1. 定义结构类型的一般格式 4 8.1 结构类型及其变量的定义 8.1.1 结构类型的定义 struct Student int number; char name9; int age; char sex; ; 例8.1 定义一个用于描述学生数据的结构类型 5 说明: struct是关键字,声明要定义一个结构类型; 结构类型名用标识符命名, (注意:“见名知义”); 成员列表给出n个成员的声明,成员可以是基本类 型变量、数组,也可以是另一结构类型变量等。对 每个成员必须作类型声明,成员之间用分号分隔。 大括号“”后面的;是必不可少的。 8.1 结构类型及其变量的定义 6 8.1 结构类型及其变量的定义 8.1.1 结构类型的定义 (1) 系统不会为结构类型分配内存单元; (2) 每个成员都不是独立的,它不是一般的 变量,而是跟结构联系在一起的。 (3) 结构类型可以嵌套定义。(在一个结构类 型中包含另一个或一些结构类型),通常用于 结构类型的成员是一个结构变量的场合。 2. 结构类型的几点说明 7 8.1 结构类型及其变量的定义 struct Student int number; char name9; struct Birthday int year; int month; int day; birthday; char sex; ; 例8.2 将例8.1中struct Student的第三个成员年 龄age改为出生年月birthday。 成员birthday的类 型又是结构类型 (struct Birthday, 描述日期的类型) 8 8.1 结构类型及其变量的定义 (4) 允许定义无类型名的结构类型 2. 结构类型的几点说明 struct int year; int month; int day; birthday; (5) 可用sizeof运算符计算结构类型的长度(字节数) “无名”结构类型必须后 随结构变量的定义,常 用于内嵌的结构类型。 例如:printf(“%d”,sizeof(struct Student); 9 8.1 结构类型及其变量的定义 8.1.2 结构类型数据对象的定义及初始化 结构类型数据对象包括一般变量、指针、数 组等,对应称为结构变量、结构指针、结构数组 。 先定义结构类型再定义结构变量 struct 结构类型名 结构变量名表; 1. 定义结构变量(三种方式) 用已定义的struct Student定义学生结构变量; struct Student student1,student2; 10 8.1 结构类型及其变量的定义 8.1.2 结构类型数据对象的定义及初始化 在定义结构类型的同时定义结构变量 struct Student int number; char name9; struct Birthday int year; int month; int day; birthday; char sex; student1,student2; 11 8.1 结构类型及其变量的定义 8.1.2 结构类型数据对象的定义及初始化 直接定义结构变量 struct int number; char name9; struct Birthday int year; int month; int day; birthday; char sex; student1,student2; struct 成员表列; 变量名列表; 该方式没有给出结 构类型名,通用性不强 。 12 8.1 结构类型及其变量的定义 在定义结构变量的同时对其初始化,格式为 : struct 结构类型名 结构变量名=成员初始化值表; 2. 结构变量的初始化 struct Student int number; char name9; struct Birthday int year; int month; int day; birthday; char sex; student1=1101,”lilin”,1985,08,01,M; 13 8.1 结构类型及其变量的定义 8.1.3 结构成员的引用 1. 结构成员的表示 如同定义了数组就可以访问数组的任意一个元 素一样,定义了结构数据对象(结构变量),就可以访 问其中每一个成员。 结构成员可以像基本变量那样使用,如:赋值 、 输入输出、参加表达式的计算等。 要访问结构变量中的一个成员,必须同时给出 整体(结构变量)的名称和个体(成员)的名称。 14 8.1 结构类型及其变量的定义 假设有如下定义: struct Student s1, s2100, *s3= s2是结构数组,该数组包含100个类型是struct Student的变量,可存储100个学生的信息; s3是结构指针,用来存放struct Student类型数据 对象s1的内存首地址; 15 8.1 结构类型及其变量的定义 假设有如下定义: struct Student s1, s2100, *s3= 结构数组元素成员的表示: 即:s2的第六个元素(结构变量)的name成员; 结构指针成员的表示:s3-name 或 (*s3).name 即:结构指针s3所指向的结构变量s1的name成员; 16 8.1 结构类型及其变量的定义 8.1.3 结构成员的引用 2. 成员运算符 (1) “.” 作用在结构变量(含数组元素)上,其左操作数 是结构变量名(或数组元素),右操作数是成员名。 (2) “-” 作用在结构指针上,其左操作数是结构指针 名,右操作数是成员名。 17 8.1 结构类型及其变量的定义 8.1.3 结构成员的引用 3. 嵌套结构的结构成员的表示 结构成员本身又是结构变量,称为嵌套结构。 必须使用若干个成员运算符来连接多个结构变量及 其对应的分量,逐级表示到最低一级成员。 语法格式为: 结构变量名.结构变量名. .成员名 例如: student1.birthday.year 18 8.1 结构类型及其变量的定义 8.1.3 结构成员的引用 4. 结构变量成员的引用 结构变量的成员可以像普通变量一样进行各 种运算,如:赋值、输入输出、计算及地址操作等 。 student1.number=11001 scanf(“%c”, 则:printf(“%d,%s,%cn”,student1); printf(“%d,%s,%cn”,student1.number, ,student1.sex); student1=student1+student2; (1) 若成员是基本数据类型,可以直接引用; 20 8.1 结构类型及其变量的定义 8.1.3 结构成员的引用 5. 结构成员的表示和引用的注意事项 (3) 可以将一个结构变量作为一个整体赋给另一个具 有相同类型的结构变量,其作用相当于逐个对位于 赋值语句左部的结构变量的每个分量赋值。如: student2=student1; 等效于: student2.number=student1.number; strcpy(,); student2.sex=student1.sex; 21 例8.3 试分析以下程序的执行结果。 #include struct Birthday int m; int d; int y; ; struct Student long num; char name10; int age; char sex; struct Birthday birthday1; 运行结果为: student1:01001 lili 18 M 12/15/1982 student2:01001 lili 18 M 12/15/1982 8.1 结构类型及其变量的定义 22 例8.3 试分析以下程序的执行结果。(续) void main() struct Student student1=1001,“lili“,18,M, 12,15, 1982,student2; student2=student1; /*把student1赋值给student2*/ printf(“student1:%ld %s %d %c %d/%d/%dn“, student1.num, , student1.age, student1.sex, student1.birthday1.m, student1.birthday1.d, student1.birthday1.y); printf(“student2:%ld %s %d %c %d/%d/%dn“, student2.num, ,student2.age, student2.sex, student2.birthday1.m, student2.birthday1.d, student2.birthday1.y); 8.1 结构类型及其变量的定义 23 8.1 结构类型及其变量的定义 8.1.3 结构成员的引用 5. 结构成员的表示和引用的注意事项 (4) 不允许将一组常量直接赋给一个结构变量。 例如: student1=1001,“lili“,18,M,12,15, 1982; 24 例8.4 假设职工数据包括:职工编号、姓名 、工资、地 址、电话,试定义职工类型并用它来声明职工变量,然后访 问其各个成员。 struct Employee long code; char name20; float salary; char address50; char phone11; ; 8.1 结构类型及其变量的定义 25 例8.4 (续) #include void main( ) struct Employee ps1=123,“chen“,2000.0,“qianzhou“,“2699999“,ps2; printf(“please input data of the second employee“); scanf(“%ld“, printf(“name:“); scanf(“%s“,); printf(“phone:“); scanf(“%s“,ps2.phone); strcpy(ps2.address,ps1.address); ps2.salary = ps1.salary*1.5; 8.1 结构类型及其变量的定义 26 例8.4 (续) printf(“ncode:%ldn“,ps1.code); printf(“name:%sn“,); printf(“salary:%6.2fn“,ps1.salary); printf(“address:%sn“,ps1.address); printf(“phone:%sn“,ps1.phone); printf(“ncode:%ldn“,ps2.code); printf(“name:%sn“,); printf(“salary:%6.2fn“,ps2.salary); printf(“address:%sn“,ps2.address); printf(“phone:%sn“,ps2.phone); 8.1 结构类型及其变量的定义 27 8.2 结构数组 一个职工结构类型(struct Employee)变量 一次只能存储单个职工数据的各个数据项。若 程序中要处理多名职工的数据(输入n个职工的 数据并按姓氏排序)。 需建立职工类型数组,再对数组的成员排序。 28 8.2 结构数组 姓名性 别 出生年月部门职称工资奖金健康 状况 陈沙 风 男67.03.25财务 部 会计2000.0 1500.0良好 孙小雄 男58.10.01 技术部 高工 3000.0 2000.0良好 黎珂女60.05.10质检 部 助工 2000.0 1000.0良好 吴江女77.07.20营销 部 职员1500.0500.0良好 林天阳男80.08.21物流部 职员1500.0600.0良好 emp1 emp2 emp3 emp4 emp5 emp5 29 8.2 结构数组 8.2.1 结构数组的定义及其应用 定义结构数组的语法格式 格式二: struct 结构类型名 成员表; 数组名常量表达式; 1. 结构数组的定义 格式一:struct 结构类型名 数组名常量表达式; struct Student st10; struct Student int number; char name9; char sex; st5;30 8.2 结构数组 8.2.1 结构数组的定义及其应用 一维结构数组的初始化 2. 结构数组的初始化 struct Student st3= 1101,“lilin”,1985,08,01,M, 1102,“wangjing”,1985,07,01,F, 1103,“chenfei”,1986,03,25,F; 31 8.2 结构数组 8.2.2 对结构数组的操作 结构数组名下标表达式 或: *(结构数组名+i) 1. 引用结构数组元素 例如: employee2 或: *(employee+3) 32 8.2 结构数组 8.2.2 对结构数组的操作 结构数组名下标表达式.成员名 例如: employee3.salary 2. 引用结构数组元素的成员 (1) 结构数组元素成员可以像基本变量一样使用 ; scanf(“%s”,); (2) 不能将结构数组元素作为一个整体输入输出; printf(“%dn”,employee0); 或:scanf(“%d”, (3) 可以将结构数组元素作为一个整体进行赋值。 employee0=employee1; 33 8.2 结构数组 8.2.2 对结构数组的操作 3. 结构数组应用实例 例8.5 计算学生的平均年龄。 #include struct Student int number; char name20; int age; stu4= 1011,“li li“,21, 1022,“li hong“,23, 1023,“wang ping“,22, 1024,“zhang san“,22 ; /* 定义学生结构数组并初始化之 */ 34 8.2 结构数组 例8.5 计算学生的平均年龄。(续) void main() int i=0; float ave,s=0; for(i=0;i #define N 10 /*设备数量*/ struct Device char type; int count; ; 8.2 结构数组 36 例8.6 (续) void main() struct Device array =A, 0, B, 0, C, 0; int i, j; char device_type; for(i=1; iname 等价 38 8.3 结构和指针 8.3.1 指向结构变量的指针 赋于其一个已存在的、基类型相同的结 构变量地址,也可赋空地址(NULL)。 2. 结构指针的初始化 例如:struct Employee employee1, *EmpPtr= 39 8.3 结构和指针 8.3.1 指向结构变量的指针 3. 通过结构指针来引用结构变量成员 例8.7 将一个学生数据存放在学生类型结构变量中, 并以直接访问结构成员、通过结构指针间接访问结 构变量成员的方式输出各个成员的值。 #include #include struct Student long num; char name20; int age; char sex; ; 运行结果为: name:Wang Li number:89101 age:18 wex:M 40 例8.7 (续) void main() struct Student student, *p; p= strcpy(, “Wang Li“); student.num=89101; student.age=18; student.sex=M; printf(“nname:%snnumber:%ldnage:%dnsex:%cn“, , student.num, student.age, student.sex); /*直接访问结构变量成员*/ printf(“nname:%snnumber:%ldnage:%dnsex:%cn“, (*p).name, (*p).num, (*p).age, (*p).sex); /*通过结构指针间接访问结构变量成员*/ printf(“nname:%snnumber:%ldnage:%dnsex:%cn“, p-name, p-num, p-age, p-sex); /*通过结构指针间接访问结构变量成员*/ 8.3 结构和指针 41 8.3 结构和指针 8.3.2 指针变量作为结构成员 例8.8 指针变量作结构变量的成员。 #include struct Student /*定义结构类型*/ int number; char *name; /*为指针变量,可指向一字符串*/ ; void main() struct Student stu=1101,“lili“; /*定义结构变量并对其进行初始化*/ printf(“%sn“, stu.(*name); /*输出stu成员*/ 42 8.3 结构和指针 8.3.2 指针变量作为结构成员 例8.8 如果没有上面的初始化,则name的指向是不确 定的,即不可用,欲使用之,必须调用calloc函数为其申 请内存空间。与此相应,我们将主函数改为: void main() struct Student stu; /*定义结构变量,但未初始化*/ scanf(“%d“, =(char *)calloc(21,sizeof(char); /*申请字符数组的空间,并将首址存在name指针中*/ scanf(“%s“,); printf(“%sn“, stu.(*name); 43 8.3 结构和指针 定义一个结构指针指向一个结构数组, 即可利用该指针间接访问结构数组的元素。 例如: struct A int a; float b; ;arr3,*p; p=arr; 1 1.5 2 2.5 3 3.5 arr0 arr1 arr2 arr p 请分析: p-a; (p+)-a; (+p)-a; (p-a)+; 8.3.3 指向结构数组的指针 44 例8.9 指向结构数组的指针应用:学生类型结构数组中存 放若干学生的数据,通过结构指针输出各个学生的数据。 #include struct Student int num; char name20; char sex; int age; struct Student stu2=10101,“li lin“,M,18, 10102,“zhang fan“,M,19; 8.3 结构和指针 运行结果为: No. Name sex age 10101 Li lin M 18 10102 Zhang fan M 19 45 例8.9 指向结构数组的指针应用:学生类型结构数组中存 放若干学生的数据,通过结构指针输出各个学生的数据。 void main() struct Student *p; printf(“No. Name sex agen“); for(p=stu; pnum,p-name,p-sex,p-age); 8.3 结构和指针 46 8.3 结构和指针 8.3.4 结构指针作为函数参数 例8.10 输出学生的姓名及年龄 。 #include struct Student int number; char name20; int age; /*定义函数age,参数为结构指针*/ void age (struct Student *p) printf(“%sn“,p-name); /*输出P指针指向的name这个成员*/ printf(“%dn“,p-age); /*输出P指针指向的age这个成员*/ 47 8.3 结构和指针 8.3.4 结构指针作为函数参数 例8.10 输出学生的姓名及年龄 (续)。 void main() struct Student stu3=1101, “kiki“, 23, 1102, “honghong“, 24, 1103, “mingming“, 23; struct Student *p; p= /*将结构数组的第一个元素的地址赋给指针变量p*/ age(p+1); /*将第二个元素的地址作为实参传递给函数age*/ 48 8.3 结构和指针 例8.11 编写一个程序用来建立一份职工花名册(输入五个 职工数据),统计员工工资和奖金的总和。 (要求:输入、输出和统计等功能用函数实现) #include Struct Employee /*定义职工结构类型*/ char name9; char sex; char birthday9; char dept11; char ProTitle9; float salary; float bonus; char health; ; 49 8.3 结构和指针 例8.11 (续) /*定义表示工资和奖金统计结果的类型,该类型可以作为 sum函数的返回值类型*/ struct Total char title110; float sum1; char title210; float sum2; #define NUM 5 /*定义职工人数*/ void ReadEmplo(struct Employee employee ); void WriteEmplo(struct Employee employee); struct Total sum(struct Employee employee ,struct Total temp); 50 8.3 结构和指针 例8.11 (续) void main() struct Employee employeeNUM; struct Total t1=“工资总和:“, 0, “奖金总和:“ , 0; int i; ReadEmplo(employee); for(i=0;ib 与结构变量一样,对联合变量只能在成员级 上进行操作。例如: union data int i; float j; char c; data1,*p; 60 8.4 联合类型 8.4.3 联合类型的应用示例 假设有若干人员的数据,包括教师和学生。学生的数 据包括:姓名、号码、性别、职业、班级。教师的数据 包括:姓名、号码、性别、职业、职务。要求把它们放 在一张表中。如果job项是“s”,则第5项为class;如果 job项是“t”,则第5项为position。 分析:如果job项输入s(学生),则使程序接收一个整 数给class(班号),如果job的值为t(教师),则接收一 个字符串给position20。 61 8.4 联合类型 8.4.3 联合类型的应用示例 struct Persin long num; char name20; char sex; char job; /*职业*/ union Category int class; /*班级*/ char position20; category; person10; 62 8.5 枚举类型 上述表示法存在两个问题: (1)含义不明确,可读性差; (2)无法实现用区间限制来防止越界。 week:Sunday,Monday,Tuesday,Wednesday, Thursday,Friday,Saturday 看下列一组常用又特殊的数据: 可用整型数的一个子集0,1,2,3,4,5,6作为值域 63 8.5 枚举类型 8.5.1 枚举类型的定义 enum 枚举类型名 枚举值表; 枚举型是一种特殊的数据类型,它的值域是某些 个整数的集合。集合是可以指定的,集合中的所有整 数都可以命名。枚举类型定义的语法格式为: enum WeekSunday=7, Monday=1, Tuesday, Wednesday, Thursday, Friday, Saturday; 枚举值表中的每个值都是一个命名的整型常量,称为 枚举常量。其格式为:枚举常量名=整数 64 8.5 枚举类型 8.5.2 枚举变量的定义和使用 用已定义的enum Week类型定义weekDays变量 1. 用变量定义语句定义枚举类型变量 enum Week weekDays=Sunday; enum WeekSunday=7, Monday=1, Tuesday, Wednesday, Thursday, Friday, SaturdayweekDays=Sunday; 在定义enum Week类型同时定义weekDays变量 65 8.5 枚举类型 8.5.2 枚举变量的定义和使用 (1) 枚举类型变量的取值只能在枚举类型定义的值域 内,并且依次只能取一个值 注意事项: workDays=Monday; () workDays=(enum Week) 2; () workDays

温馨提示

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

评论

0/150

提交评论