C语言程序设计第9章 用户自己建立数据类型ppt课件.ppt

上传人:小飞机 文档编号:1375834 上传时间:2022-11-16 格式:PPT 页数:103 大小:1.59MB
返回 下载 相关 举报
C语言程序设计第9章 用户自己建立数据类型ppt课件.ppt_第1页
第1页 / 共103页
C语言程序设计第9章 用户自己建立数据类型ppt课件.ppt_第2页
第2页 / 共103页
C语言程序设计第9章 用户自己建立数据类型ppt课件.ppt_第3页
第3页 / 共103页
C语言程序设计第9章 用户自己建立数据类型ppt课件.ppt_第4页
第4页 / 共103页
C语言程序设计第9章 用户自己建立数据类型ppt课件.ppt_第5页
第5页 / 共103页
点击查看更多>>
资源描述

《C语言程序设计第9章 用户自己建立数据类型ppt课件.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计第9章 用户自己建立数据类型ppt课件.ppt(103页珍藏版)》请在三一办公上搜索。

1、第9章 用户自己建立数据类型,第9章 用户自己建立数据类型,9.1 定义和使用结构体变量9.2 使用结构体数组9.3 结构体指针9.5 共用体类型9.6 使用枚举类型9.7 用typedef声明新类型名,9.1 定义和使用结构体变量,9.1.1 自己建立结构体类型9.1.2 定义结构体类型变量9.1.3 结构体变量的初始化和引用,9.1.1 自己建立结构体类型,用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项,是属于同一个学生的,因此组成一个组合数据,如student_1的变量,反映它们之间的内在联系,9.1.1 自己建立

2、结构体类型,struct Student int num; char name20; char sex; int age; float score; char addr30; ;,由程序设计者指定了一个结构体类型struct Student它包括num,name,sex,age,score,addr等不同类型的成员,9.1.1 自己建立结构体类型,声明一个结构体类型的一般形式为: struct 结构体名 成员表列 ;,类型名 成员名;,9.1.1 自己建立结构体类型,说明:(1)结构体类型并非只有一种,而是可以设计出许多种结构体类型,例如struct Teacherstruct Workers

3、truct Date等结构体类型各自包含不同的成员,9.1.1 自己建立结构体类型,说明:(2) 成员可以属于另一个结构体类型。 struct Date int month; int day; int year; ;struct Stu int num;char name20; char sex;int age; struct Date birthday; char addr30; ;,9.1.1 自己建立结构体类型,说明:(2) 成员可以属于另一个结构体类型。,9.1.2 定义结构体类型变量,前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存

4、储单元。相当于设计好了图纸,但并未建成具体的房屋。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。,9.1.2 定义结构体类型变量,1. 先声明结构体类型,再定义该类型变量声明结构体类型struct Student,可以用它来定义变量 struct Student student1,student2;,结构体类型名,结构体变量名,9.1.2 定义结构体类型变量,1. 先声明结构体类型,再定义该类型变量声明结构体类型struct Student,可以用它来定义变量 struct Student student1,student2;,student1,stud

5、ent2,9.1.2 定义结构体类型变量,2.在声明类型的同时定义变量struct Student int num; char name20; char sex; int age; float score; char addr30; student1,student2;,9.1.2 定义结构体类型变量,3. 不指定类型名而直接定义结构体类型变量其一般形式为: struct 成员表列 变量名表列; 指定了一个无名的结构体类型 。,9.1.2 定义结构体类型变量,(1) 结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不

6、分配空间的,只对变量分配空间。,9.1.2 定义结构体类型变量,(2) 结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。(3) 对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。,例9.1 把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。解题思路:自己建立一个结构体类型,包括有关学生信息的各成员用它定义结构体变量,同时赋以初值输出该结构体变量的各成员,9.1.3 结构体变量的初始化和引用,#include int main()struct Student long int num; char name2

7、0; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; printf(NO.:%ldnname:%sn sex:%cnaddress:%sn, a.num,a.name,a.sex,a.addr); return 0;,#include int main()struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; printf(NO.:%ldnname:%sn sex:

8、%cnaddress:%sn, a.num,a.name,a.sex,a.addr); return 0;,#include int main()struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; ,a.num=10010; 对,rintf(“%sn”,a); 不对,#include int main()struct Student long int num; char name20; char sex; char addr20; a=1

9、0101,“Li Lin”,M, “123 Beijing Road”; ,b=a; 对,struct Student b;,b.num+; 对,#include int main()struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; ,scanf(%ld, 对,rintf(%o, 对,scanf(“%ld,%s,%c,%sn”, 错,#include int main() struct Date int month; int day;

10、int year; ;struct Stu int num;char name20; char sex;int age; struct Date birthday; char addr30; a,b;,a.birthday.month=12; 对,a.age=10; b.age=9; 对,sum=a.age+b.age; 对,例9.2 输入两个学生的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩解题思路:(1)定义两个结构相同的结构体变量student1和student2;(2)分别输入两个学生的学号、姓名和成绩;(3)比较两个学生的成绩,如果学生1的成绩高于学生2,就输出学生1的全部信

11、息,如果学生2的成绩高于学生1,就输出学生2的全部信息。如果二者相等,输出2个学生的全部信息,#include int main() struct Student int num; char name20; float score; student1,student2; scanf(%d%s%f,不能加&,printf(The higher score is:n); if (student1.scorestudent2.score) printf(%d %s %6.2fn,student1.num, student1.name, student1.score); else if (studen

12、t1.scorestudent2.score) printf(%d %s %6.2fn,student2.num, student2.name, student2.score); else printf(%d %s %6.2fn,student1.num, student1.name, student1.score); printf(%d %s %6.2fn,student2.num, student2.name, student2.score); return 0;,9.2 使用结构体数组,9.2.1定义结构体数组9.2.2 结构体数组的应用举例,9.2.1定义结构体数组,例9.3 有3个候

13、选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。,9.2.1定义结构体数组,解题思路:设一个结构体数组,数组中包含3个元素每个元素中的信息应包括候选人的姓名(字符型)和得票数(整型)输入被选人的姓名,然后与数组元素中的“姓名”成员比较,如果相同,就给这个元素中的“得票数”成员的值加1输出所有元素的信息,#include #include struct Person char name20; int count; leader3=“Li”,0,“Zhang”,0,“Sun”,0;,全局的结构体数组,name,count,leader0,Li,0

14、,Zhang,0,Sun,0,int main() int i,j; char leader_name20; for (i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name, leaderj.name)=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn“,leaderi.name, leaderi.count); return 0;,leaderj.count=leaderj.count+1;,int main() int i,j; char lead

15、er_name20; for (i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name, leaderj.name)=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn“,leaderi.name, leaderi.count); return 0;,说明:(1)定义结构体数组一般形式是 struct 结构体名 成员表列 数组名数组长度; 先声明一个结构体类型,然后再用此类型定义结构体数组: 结构体类型 数组名数组长度; 如: struct Person

16、leader3;,说明:(2)对结构体数组初始化的形式是在定义数组的后面加上:初值表列; 如:struct Person leader3= Li,0,Zhang,0,Fun,0;,9.2.2 结构体数组的应用举例,例9.4 有n个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。解题思路:用结构体数组存放n个学生信息,采用选择法对各元素进行排序(进行比较的是各元素中的成绩)。,#include struct Student int num; char name20; float score; ; int main() struct Student stu5=10101

17、,Zhang,78 , 10103,Wang,98.5, 10106,Li, 86 , 10108,“Ling”, 73.5, 10110,“Fun”, 100 ; struct Student temp; const int n = 5 ; int i,j,k;,常变量,若人数变为30,30,#include struct Student int num; char name20; float score; ; int main() struct Student stu5=10101,Zhang,78 , 10103,Wang,98.5, 10106,Li, 86 , 10108,“Ling

18、”, 73.5, 10110,“Fun”, 100 ; struct Student temp; const int n = 5 ; int i,j,k;,#define N 5,注意temp的类型,printf(The order is:n); for(i=0;istuk.score) k=j; temp=stuk; stuk=stui; stui=temp; for(i=0;in;i+) printf(%6d %8s %6.2fn, stui.num,stui.name,stui.score); printf(n); return 0;,写法上与普通变量一致,9.3 结构体指针,9.3.1

19、 指向结构体变量的指针9.3.2 指向结构体数组的指针9.3.3 用结构体变量和结构体变量的指针作函数参数,9.3.1 指向结构体变量的指针,指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同。例如: struct Student *pt;,9.3.1 指向结构体变量的指针,例9.5 通过指向结构体变量的指针变量输出结构体变量中成员的信息。解题思路:在已有的基础上,本题要解决两个问题:怎样对结构体变量成员赋值;怎样通过指向结构体变量的指针访问结构体变量中成员。,#include #include int main() st

20、ruct Student long num; char name20; char sex; float score; ;,struct Student stu_1; struct Student * p; p=,stu_1,10101Li LinM89.5,p,struct Student stu_1; struct Student * p; p=,stu_1,10101Li LinM89.5,p,说明:为了使用方便和直观,C语言允许把(*p).num用p-num来代替(*p).name等价于p-name如果p指向一个结构体变量stu,以下等价: stu.成员名(如stu.num) (*p).

21、成员名(如(*p).num) p-成员名(如p-num),9.3.2 指向结构体数组的指针,例9.6 有3个学生的信息,放在结构体数组中,要求输出全部学生的信息。,解题思路:用指向结构体变量的指针处理(1)声明struct Student,并定义结构体数组、初始化(2)定义指向struct Student类型指针p(3)使p指向数组首元素,输出元素中各信息(4)使p指向下一个元素,输出元素中各信息(5)再使p指向结构体数组的下一个元素,输出它指向的元素中的有关信息,#include struct Student int num; char name20; char sex; int age;s

22、truct Student stu3= 10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20 ;,int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0;,stu0,stu1,stu2,int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age)

23、; return 0;,p,stu0,stu1,stu2,int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0;,p,stu0,stu1,stu2,int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0;,p,stu0,stu1,stu2,9.3.3 用结构体变量和结构体变量的指针作函

24、数参数,将一个结构体变量的值传递给另一个函数,有3个方法。,(1) 用结构体变量的成员作参数。 例如,用stu1.num或stu2.name作函数实参,将实参值传给形参。用法和用普通变量作实参是一样的,属于“值传递”方式。应当注意实参与形参的类型保持一致。,(2) 用结构体变量作实参。用结构体变量作实参时,将结构体变量所占的内存单元的内容全部按顺序传递给形参,形参也必须是同类型的结构体变量在函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大在被调用函数期间改变形参(也是结构体变量)的值,不能返回主调函数一般较少用这种方法,(3)用指向结构体变量(或数组元素)的指针作实参,将结

25、构体变量(或数组元素)的地址传给形参。,例9.7 有n个结构体变量,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)。,解题思路:将n个学生的数据表示为结构体数组。按照功能函数化的思想,分别用3个函数来实现不同的功能:用input函数输入数据和求各学生平均成绩用max函数找平均成绩最高的学生用print函数输出成绩最高学生的信息在主函数中先后调用这3个函数,用指向结构体变量的指针作实参。最后得到结果。本程序假设n=3,#include #define N 3struct Student int num; char name20; f

26、loat score3; float aver; ;,4个成员,输入前3个成员值,计算最后成员值,int main() void input(struct Student stu); struct Student max(struct Student stu); void print(struct Student stu); struct Student stuN,*p=stu; input(p); print(max(p); return 0;,void input(struct Student stu) int i; printf(请输入各学生的信息: 学号、姓名、三门课成绩:n); fo

27、r(i=0;iN;i+) scanf(%d %s %f %f %f, ,输入第1个成员值,输入第2个成员值,stu0,stu1,stu2,stu,10101,Li,78 89 98,88.33,i=0,void input(struct Student stu) int i; printf(请输入各学生的信息: 学号、姓名、三门课成绩:n); for(i=0;iN;i+) scanf(%d %s %f %f %f, ,输入第1个成员值,输入第2个成员值,stu0,stu1,stu2,stu,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,

28、i=1,void input(struct Student stu) int i; printf(请输入各学生的信息: 学号、姓名、三门课成绩:n); for(i=0;iN;i+) scanf(%d %s %f %f %f, ,输入第1个成员值,输入第2个成员值,stu0,stu1,stu2,stu,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,10106,Sun,88 76.5 89,84.5,i=2,struct Student max(struct Student stu) int i,m=0; for(i=0;istum.ave

29、r) m=i; return stum; ,stu0,stu1,stu2,stu,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,10106,Sun,88 76.5 89,84.5,最大,返回,void print(struct Student stud) printf(n成绩最高的学生是:n);printf(学号:%dn姓名:%sn 三门课成绩:%5.1f,%5.1f,%5.1fn 平均成绩:%6.2fn”, stud.num, stud.name,stud.score0, stud.score1,stud.score2,stud.av

30、er); ,stud,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,10106,Sun,88 76.5 89,84.5,num,name,score,aver,stu0,stu1,stu2,以上3个函数的调用,情况各不相同:调用input函数时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址,函数无返回值。调用max函数时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址,函数的返回值是结构体类型数据。调用print函数时,实参是结构体变量,形参是结构体变量,传递的是结构体变量中各成员的值,函数无返回值。,9.5

31、共用体类型,9.5.1 什么是共用体类型9.5.2 引用共用体变量的方式9.5.3 共用体类型数据的特点,9.5.1 什么是共用体类型,有时想用同一段内存单元存放不同类型的变量。使几个不同的变量共享同一段内存的结构,称为 “共用体”类型的结构。,1000,1001,1002,1003,字符ch,整 型 变 量 i,实 型 变 量 f,定义共用体类型变量的一般形式为:union共用体名 成员表列变量表列; 例如:union Data int i; char ch; float f; a,b,c;,union Data int i; char ch; float f; ;union Data a,

32、b,c;,“共用体”与“结构体”的定义形式相似,但它们的含义是不同的。结构体变量所占内存长度是各成员占的内存长度之和,每个成员分别占有其自己的内存单元。而共用体变量所占的内存长度等于最长的成员的长度。,9.5.2 引用共用体变量的方式,只有先定义了共用体变量才能引用它,但应注意,不能引用共用体变量,而只能引用共用体变量中的成员。例如,前面定义了a,b,c为共用体变量,下面的引用方式是正确的: a.i a.ch a.f,9.5.3 共用体类型数据的特点,在使用共用体类型数据时要注意以下一些特点:(1) 同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一个成员,而不是同时存放几

33、个。,9.5.3 共用体类型数据的特点,在使用共用体类型数据时要注意以下一些特点:(2)可以对共用体变量初始化,但初始化表中只能有一个常量。,9.5.3 共用体类型数据的特点,在使用共用体类型数据时要注意以下一些特点:(3)共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就取代。,9.5.3 共用体类型数据的特点,在使用共用体类型数据时要注意以下一些特点:(4) 共用体变量的地址和它的各成员的地址都是同一地址。(5) 不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。,9.5.3 共用体类型数据的特点,在使用共用体类型数据时要注意

34、以下一些特点:(6) 以前的C规定不能把共用体变量作为函数参数,但可以使用指向共用体变量的指针作函数参数。C99允许用共用体变量作为函数参数。,9.5.3 共用体类型数据的特点,在使用共用体类型数据时要注意以下一些特点:(7) 共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。,9.6 使用枚举类型,如果一个变量只有几种可能的值,则可以定义为枚举类型所谓“枚举”就是指把可能的值一一列举出来,变量的值只限于列举出来的值的范围内,9.6 使用枚举类型,声明枚举类型用enum开头。例如:enum Weekdaysun,m

35、on,tue, wed,thu,fri,sat;声明了一个枚举类型enum Weekday然后可以用此类型来定义变量enum Weekday workday,weekend;,枚举元素,枚举变量,9.6 使用枚举类型,workday=mon; 正确weekend=sun; 正确weekday=monday; 不正确,说明:(1) C编译对枚举类型的枚举元素按常量处理,故称枚举常量。不要因为它们是标识符(有名字)而把它们看作变量,不能对它们赋值。例如: sun=0; mon=1; 错误,说明:(2) 每一个枚举元素都代表一个整数,语言编译按定义时的顺序默认它们的值为0,1,2,3,4,5在上面定

36、义中,sun的值为0,mon的值为1,sat的值为6如果有赋值语句: workday=mon; 相当于workday=1;,说明:(2) 每一个枚举元素都代表一个整数,语言编译按定义时的顺序默认它们的值为0,1,2,3,4,5也可以人为地指定枚举元素的数值,例如: enum Weekdaysun=7,mon=1,tue,wed,thu,fri,satworkday,week_end; 指定枚举常量sun的值为7,mon为1,以后顺序加1,sat为6。,说明:(3) 枚举元素可以用来作判断比较。例如: if(workday=mon)if(workdaysun) 枚举元素的比较规则是按其在初始化时

37、指定的整数来进行比较的。如果定义时未人为指定,则按上面的默认规则处理,即第一个枚举元素的值为,故monsun,satfri,例9.12 口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中先后取出3个球,问得到3种不同颜色的球的可能取法,输出每种排列的情况。,解题思路:,解题思路:,#include int main()enum Colorred,yellow,blue,white,black; enum Color i,j,k,pri; int n,loop; n=0; for (i=red;i=black;i+) for (j=red;j=black;j+) if (i!=j) fo

38、r (k=red;k=black;k+) if (k!=i) ,for (loop=1;loop=3;loop+) switch (loop) case 1: pri=i;break; case 2: pri=j;break; case 3: pri=k;break; default:break; ,switch (pri) case red: printf(“%-10s”,“red”); break; case yellow:printf(%-10s,yellow); break; case blue: printf(“%-10s”,“blue”); break; case white: p

39、rintf(“%-10s”,“white”); break; case black: printf(%-10s,black); break; , printf(n); printf(ntotal:%5dn,n); return 0;,9.7 用typedef声明新类型名,1.简单地用一个新的类型名代替原有的类型名typedef int Integer; typedef float Real;int i,j; float a,b; 与Integer i,j; Real a,b;等价,9.7 用typedef声明新类型名,2.命名一个简单的类型名代替复杂的类型表示方法(1)命名一个新的类型名代表结

40、构体类型: typedef struct int month; int day; int year; Date;Date birthday; Date *p;,9.7 用typedef声明新类型名,2.命名一个简单的类型名代替复杂的类型表示方法(2) 命名一个新的类型名代表数组类型typedef int Num100; Num a;,9.7 用typedef声明新类型名,2.命名一个简单的类型名代替复杂的类型表示方法(3)命名一个新的类型名代表一个指针类型typedef char *String; String p,s10;,9.7 用typedef声明新类型名,2.命名一个简单的类型名代替复

41、杂的类型表示方法(4)命名一个新的类型名代表指向函数的指针类型typedef int (*Pointer)(); Pointer p1,p2;,9.7 用typedef声明新类型名,归纳起来,声明一个新的类型名的方法是 先按定义变量的方法写出定义体(int i;) 将变量名换成新类型名(将i换成Count) 在最前面加typedef (typedef int Count) 用新类型名去定义变量,9.7 用typedef声明新类型名,以定义上述的数组类型为例来说明: 先按定义数组变量形式书写:int a100; 将变量名a换成自己命名的类型名:int Num100; 在前面加上typedef,得

42、到typedef int Num100;用来定义变量:Num a; 相当于定义了:int a100;,9.7 用typedef声明新类型名,对字符指针类型,也是:char *p; char *String; typedef char *String; String p;,9.7 用typedef声明新类型名,说明:(1)以上的方法实际上是为特定的类型指定了一个同义字(synonyms)。例如typedef int Num100; Num a; Num是int 100的同义词typedef int (*Pointer)();Pointer p1; Pointer是int (*)()的同义词,9.

43、7 用typedef声明新类型名,说明:(2) 用typedef只是对已经存在的类型指定一个新的类型名,而没有创造新的类型。(3)用tyoedef声明数组类型、指针类型,结构体类型、共用体类型、枚举类型等,使得编程更加方便。(4)typedef与#define表面上有相似之处,9.7 用typedef声明新类型名,说明:(5) 当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型。可以把所有的typedef名称声明单独放在一个头文件中,然后在需要用到它们的文件中用#include指令把它们包含到文件中。这样编程者就不需要在各文件中自己定义typefef名称了。,9.7 用typedef声明新类型名,说明:(6) 使用typedef名称有利于程序的通用与移植。有时程序会依赖于硬件特性,用typedef类型就便于移植。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号