第7章用户定制数据类型

上传人:仙*** 文档编号:169724071 上传时间:2022-11-17 格式:PPT 页数:73 大小:1.13MB
收藏 版权申诉 举报 下载
第7章用户定制数据类型_第1页
第1页 / 共73页
第7章用户定制数据类型_第2页
第2页 / 共73页
第7章用户定制数据类型_第3页
第3页 / 共73页
资源描述:

《第7章用户定制数据类型》由会员分享,可在线阅读,更多相关《第7章用户定制数据类型(73页珍藏版)》请在装配图网上搜索。

1、C 语 言数据类型基 本数据类型导 出数据类型double(双精度浮点型)long(长整型)char(字符类型)整 型short(短整型)int(整型)浮点型float(单精度浮点型)long double(长双精度浮点型)void类型用户定制类型T*(指针类型)struct(结构体类型)union(共用体类型)文件类型enum(枚举)函数类型构造类型T(数组类型)n 结构体(结构体(struct):也称集合数据类):也称集合数据类型,用于将不同类型的数据组织在一型,用于将不同类型的数据组织在一个名字下。个名字下。n 共用体(共用体(union):允许一个存储空间):允许一个存储空间中存储不同

2、类型的变量。中存储不同类型的变量。n 枚举(枚举(enumeration):用一组符号):用一组符号代替一组整数。代替一组整数。n typedef:用于为已经存在的类型定:用于为已经存在的类型定义新名字。义新名字。7.1.1 结构体类型及其定制结构体类型及其定制1.结构体类型的概念结构体类型的概念现实生活中存在着大量需要作为一个整现实生活中存在着大量需要作为一个整体来处理的数据,而这些数据的类型又不体来处理的数据,而这些数据的类型又不相同。例如:要处理学籍数据,需要处理相同。例如:要处理学籍数据,需要处理学生学号学生学号(num)、姓名(、姓名(name)、性别)、性别(sex)、年龄()、年

3、龄(age)、成绩)、成绩(score)和和地址(地址(addr)等数据。)等数据。而数组则无法容纳不同类型的元素。结而数组则无法容纳不同类型的元素。结构体(构体(structure),也称),也称“结构结构”,就是,就是C语言提供的处理一组不同类型数据的类语言提供的处理一组不同类型数据的类型。型。例如上述处理学籍的结构体类型定制语句为:例如上述处理学籍的结构体类型定制语句为:struct Student unsigned int num;char name20;char sex;int age;float score;char addr30;struc 结构体名成员声明表列;结构体类型的定制

4、结构体类型的定制 是由声明成员的一组语句组成的,形式为是由声明成员的一组语句组成的,形式为 truct Addr char name30;/*姓名姓名*/char street40;/*街道街道*/char city20;/*城市城市*/char provn20;/*省名省名*/unsigned int zip;/*邮编邮编*/同样的方法可以为建立同样的方法可以为建立通信录通信录定制一种定制一种数据类型数据类型struct Addr:说明:说明:(1)一个结构体类型的标志由两个单词)一个结构体类型的标志由两个单词组成:第一个单词为关键组成:第一个单词为关键struct,它,它表明该类型是一种表

5、明该类型是一种结构体类型结构体类型;第二;第二个单词是个单词是结构体名结构体名,如前面介绍的,如前面介绍的Student、Add,由程序设计者按标识,由程序设计者按标识符规则指定。这二者联合起来组成一符规则指定。这二者联合起来组成一个个“类型标识符类型标识符”即即“类型名类型名”,相当相当与与int。(2)age,sex,num不能称为不能称为变量名变量名,而,而是结构体类型是结构体类型struct person的的成员名成员名。在一个函数中,可以另外定义与结构在一个函数中,可以另外定义与结构体类型的成员相同名的变量,它们代体类型的成员相同名的变量,它们代表不同的对象。例如:表不同的对象。例如

6、:struct Student char sex;/*成员名成员名*/int age;/*成员名成员名*/;int age;/*变量名变量名*/char sex;/*变量名变量名*/7.1.2定义结构体类型变量及对变量的初始化定义结构体类型变量及对变量的初始化 定制一个结构体类型后,得到一个结构体类型名。有了这个类型定制一个结构体类型后,得到一个结构体类型名。有了这个类型名,就可以像名,就可以像int、char、float和和double一样,用来定义一些结构一样,用来定义一些结构体类型的变量。定义了变量,系统就会为变量分配存储空间。体类型的变量。定义了变量,系统就会为变量分配存储空间。1.定

7、义结构体变量定义结构体变量可以采用不同的方法定义一个结构体类型的变量。可以采用不同的方法定义一个结构体类型的变量。(1)在定义了一个结构体类型之后,把变量定义为该类型。如)在定义了一个结构体类型之后,把变量定义为该类型。如有以下声明:有以下声明:struct Student stdnt1,stdnt2,stdnt3;定义了定义了stdnt1、stdnt2,和和stdnt3三个三个struct Student类型的结构类型的结构体变量。注意不能写成:体变量。注意不能写成:struct Student,stdnt1,stdnt2,stdnt3;/*错误逗号错误逗号*/Student stdnt1,

8、stdnt2,stdnt3;/*缺少关键字缺少关键字struct */struct/*注意这个头部没有类型名注意这个头部没有类型名*/unsigned int num;char name20;char sex;int age;float score;char addr30;stdnt1,stdnt2,stdnt3;也不能写成:也不能写成:(2)直接定义结构体类型的变量。如:)直接定义结构体类型的变量。如:此时只是按照花括弧内的结构,直接定义了此时只是按照花括弧内的结构,直接定义了stdnt1,stdnt2和和stdnt3student三个变量,并没有定义此结构体类型的名字。因三个变量,并没有定

9、义此结构体类型的名字。因此此无法用结构体类型名再定义其它变量无法用结构体类型名再定义其它变量。(3)在声明一个结构体类型的同时定义一个)在声明一个结构体类型的同时定义一个或若干个结构体变量。如:或若干个结构体变量。如:struct Student unsigned int num;char name20;char sex;intage;float score;char addr30;stdnt1,stdnt2,stdnt3;它的一般形式为:它的一般形式为:struct 结构体名成员声明表列变量名表列;这种形式紧凑,既声明了类型,又定义了变这种形式紧凑,既声明了类型,又定义了变量。如果需要再用此

10、量。如果需要再用此struct Student定义其它变定义其它变量,还可以用:量,还可以用:struct Student stdnt3,stdnt4,stdnt5;2.结构体变量的初始化结构体变量的初始化在定义了结构体变量之后,在定义了结构体变量之后,stdnt1,stdnt2,stdnt3等就具有等就具有struct Student结构体类型的特结构体类型的特征征,也有了变量的特征。,也有了变量的特征。例如,例如,stdnt1、stdnt2和和stdnt3的值可以有如的值可以有如图图7.1所示的值。所示的值。struct Student unsigned int num;char name

11、20;char sex;int age;float score;char addr30;stdnt1=50201,”ZhangXi”,M,18,90.5,”Shanghai”,stdnt2=50202,”WhangLi”,F,19,88.3,”Beijing”;也可以用以下形式也可以用以下形式Struct Studentstdnt3=50203,”LiHong”,M,17,79.9,”Shanxi”;struct Student unsigned int num;char name20;char sex;unsigned char age;float score;#include int ma

12、in(void)struct Student student1=50201,“WangLi”,M,18,89.5;struct Student student2;student2=student1;/*结构体变量间赋值结构体变量间赋值*/printf(“student1:%u,%s,%c,%u,%5.2fn”,student1.num,student1.name,student1.sex,student1.age,student1.score);printf(“student2:%u,%s,%c,%u,%5.2fn”,student2.num,student2.name,student2.se

13、x,student2.age,student2.score);return 0;运行情况如下:运行情况如下:2.引用结构体变量的成员引用结构体变量的成员 由于一个结构体变量是一个整体,要访问它其中的一个由于一个结构体变量是一个整体,要访问它其中的一个成员,必须先找到这个结构体变量,然后再从中找到它成员,必须先找到这个结构体变量,然后再从中找到它其中的一个成员。例如要访问结构体变量其中的一个成员。例如要访问结构体变量student1中的中的num,应写成以下形式:,应写成以下形式:student1.num 表达式表达式studen1.num=50201将把将把50201赋值给赋值给结构体变量结构

14、体变量student1中的成员中的成员num。成员运算成员运算符的运算级别最高符的运算级别最高例如:例如:student.1.num+100,在,在num两侧有二个运算符,由两侧有二个运算符,由于成员运算符的运算优先于加号运算符,故相当于:于成员运算符的运算优先于加号运算符,故相当于:(student1.num)+1003.结构体类型数据的输出结构体类型数据的输出printf(“%dn”,student1);scanf(“%d”,&student1);printf(%s,%d,%c,%d/%d/%d,%1d,%5.2fn,student1);printf(%s,%s,%1dn,student1

15、.name,student1.addr,student1.num);为描述方便,假设有一个简单的结构体类型:为描述方便,假设有一个简单的结构体类型:struct char name10;char addr18;unsigned int num;student1=“WangLi”,”12 Beijing Road”,50201;由于由于C规定不允许对结构体变量作整体输入输出。规定不允许对结构体变量作整体输入输出。如果想输出变量如果想输出变量student1的值,应当用语句的值,应当用语句printf(%s,%s,%1dn,student1.name,student1.addr,student1.

16、num);numg LnaW000i210jiieBgnR o a d 0 0 050201nameaddrstudent1图图7.2 student1在内存中的存储在内存中的存储变量变量student1在内存的存储如图在内存的存储如图7.2所示。所示。7.1.4 嵌套结构体类型嵌套结构体类型 在声明一个结构体类型时可以利用已声明了的另一在声明一个结构体类型时可以利用已声明了的另一个结构体类型来定义其成员的类型。这称为嵌套结个结构体类型来定义其成员的类型。这称为嵌套结构体类型。构体类型。例例7.2struct Date int month;int day;int year;/*声明了一个声明了

17、一个struct Date类型类型*/struct Person char name20;/*姓名姓名*/char sex;/*性别性别 */struct Date birthday;/*出生日期出生日期birthday是另一个结构体类型的成员是另一个结构体类型的成员*/unsigned long num;/*身份证号身份证号*/;这样的定义相当于:这样的定义相当于:struct Person char name20;/*姓名姓名*/char sex;/*性别性别*/int month;int day;int year;unsigned long num;/*身份证号身份证号*/;当使用嵌套结

18、构体类型定义了变量后,对结当使用嵌套结构体类型定义了变量后,对结构体变量成员的操作,应采用逐级访问的方构体变量成员的操作,应采用逐级访问的方式进行。例如定义两个变量式进行。例如定义两个变量 struct Person zhang,wang;后,要访问后,要访问zhang的出生年份,应当用表达的出生年份,应当用表达式式 zhang.Data.year下面是一个应用程序下面是一个应用程序:#include int main(void)struct Person p1=WangLi,M,12,15,1974,111000222;struct Person p2;p2=p1;printf(zhang:

19、%s,%c,%d-%d-%d,%lun“,p1.name,p1.sex,p1.birthday.month,p1.birthday.day,p1.birthday.year,p1.num);printf(zhang:%s,%c,%d-%d-%d,%lun,p2.name,p2.sex,p2.birthday.month,p2.birthday.day,p2.birthday.year,p2.num);运行情况如下:运行情况如下:也可以把一个结构体变量中的内嵌结构体类也可以把一个结构体变量中的内嵌结构体类型成员赋给另一个结构体变量的相应部分。型成员赋给另一个结构体变量的相应部分。如上例中如果有下

20、列语句是合法的:如上例中如果有下列语句是合法的:student2.birthday=student1.birthday一个结构体变量只能存放一个对象一个结构体变量只能存放一个对象(如一个学生、一个如一个学生、一个职工职工)的一组数据。如果要存放一个班的一组数据。如果要存放一个班(30人人)学生的有关学生的有关数据就要设数据就要设30个结构体变量,例个结构体变量,例student1,student2,student30,显然是很不方便的。人们自然想到使,显然是很不方便的。人们自然想到使用数组,即将同类型的结构体变量用数组进行组织。用数组,即将同类型的结构体变量用数组进行组织。7.2.1 结构体数

21、组的定义与初始化结构体数组的定义与初始化1.定义结构体数组定义结构体数组图图7.5以以struct Student 为例,说明定义结构体数组为例,说明定义结构体数组可以采用的三种方法。可以采用的三种方法。struct Studentstruct Student unsigned int num;unsigned int num;Struct Student stu30;Struct Student stu30;struct Studentstruct Student unsigned int num;unsigned int num;stu30;stu30;struct struct unsi

22、gned int num;unsigned int num;stu30;stu30;(a)(b)(c)图图7.5 定义结构体数组的三种方法定义结构体数组的三种方法2.结构体数组的初始化结构体数组的初始化struct Student unsigned int num;char name16;char sex;intage;float score;char addr30;;struct Student stu3=50201,”ZhangXi”,M,18,90.5,”Shanghai”,50202,”WhangLi”,F,19,88.3,”Beijing”,50203,”LiHong”,M,17,7

23、9.9,”Shanxi”;定义了一个定义了一个struct Student类型结构体数组类型结构体数组stu,它有,它有3个元个元素,又定义了一个结构体变量素,又定义了一个结构体变量student1,则下面的赋值合法:,则下面的赋值合法:struct Student stu3,student1;7.2.2 对结构体数组元素的操作对结构体数组元素的操作1.结构体数组元素的赋值结构体数组元素的赋值 一个结构体元素(结构体下标变量)相当于一个结构体变量,一个结构体元素(结构体下标变量)相当于一个结构体变量,可以将一个结构体数组元素赋值给同一结构体类型的数组中可以将一个结构体数组元素赋值给同一结构体类

24、型的数组中另一个元素,或赋给同一类型的变量。如另一个元素,或赋给同一类型的变量。如student1=stu0;stu0=stu1;stu1=student1;2.引用结构体数组元素成员引用结构体数组元素成员 引用结构体数组元素的成员的方法与引用结构体数组元素的成员的方法与引用结构体变量成员的方法相同。引用结构体变量成员的方法相同。例如例如 stui.num 是引用下标为是引用下标为i的的stu数组元素中的数组元素中的num成员。成员。如果数组已初始化,且如果数组已初始化,且i=2,则相当于,则相当于stu2.num。#include#include#define StuNUM 3struct

25、StudType char name16;longnum;int age;charsex;float score;int main(void)struct StudType stuStuNUM;int i;char ch;char numstr16;例例7.7 输入输入3个学生的信息并将它们输出个学生的信息并将它们输出。/*输入数据输入数据*/for(i=0;iStuNUM;i+)printf(nenter all data of stu%d:n,i);gets(stui.name);gets(numstr);stui.num=atol(numstr);gets(numstr);stui.ag

26、e=atoi(numstr);stui.sex=getchar();ch=getchar();gets(numstr);stui.score=atof(numstr);/*输出数据输出数据*/printf(n record name t t numtagetsextscoren);for(i=0;iStuNUM;i+)printf(%dt%-16s%-8d%dt%-ct%6.2fn,i,stui.name,stui.num,stui.age,stui.sex,stui.score);return 0;运行情况如下:运行情况如下:7.3.1 指向结构体变量的指针指向结构体变量的指针 1.指向结构

27、体变量的指针及其定义指向结构体变量的指针及其定义 可以定义一个指针变量指向一个结构体变量。可以定义一个指针变量指向一个结构体变量。结构体变量的指针就是这个结构体变量所占内结构体变量的指针就是这个结构体变量所占内存单元段的起始地址。存单元段的起始地址。如果已经如前定义了一个如果已经如前定义了一个struct studtype类型,则可用下面形式定义一个指向这一种类类型,则可用下面形式定义一个指向这一种类型数据的指针变量:型数据的指针变量:struct studtype*p;2.使用指向结构体变量的指针引用结构体使用指向结构体变量的指针引用结构体变量的成员变量的成员#include#include

28、 struct StudType char name16;longnum;int age;charsex;float score;int main(void)struct StudType student,*p;strcpy(student.name,Wang Li);student.num=50101;student.age=18;student.sex=m;student.score=89.5;/*使用指向结构体变量的指针引用成员使用指向结构体变量的指针引用成员*/p=&student;printf(nname:%snnumber:%1dnage:%dnsex:%cnscore:%6.2f

29、n,(*p).name,(*p).num,(*p).age,(*p).sex,(*p).score);return 0;运行结果如下:运行结果如下:说明:说明:可以通过指针变量可以通过指针变量p引用它所指向的结构体变量引用它所指向的结构体变量student中的成员值。中的成员值。(*p).name就是引用就是引用p所指向所指向的结构体变量中的的结构体变量中的name成员。不能写成成员。不能写成p.name,因为因为p不是结构体变量。不是结构体变量。3.使用指向结构体变量的指针指向变量的成员使用指向结构体变量的指针指向变量的成员 用用“(*p).成员名成员名”来引用成员还嫌不直观,来引用成员还嫌

30、不直观,C语言语言允许将它写为允许将它写为“p-成员名成员名”,例如:例如:p-name和和p-num。它更形象化的表示是它更形象化的表示是p所指向的变量中的成员。用所指向的变量中的成员。用一个一个减号减号“-”和一个和一个大于号大于号“”两个字符组成指向两个字符组成指向运算符,形象地代表一个向右的箭头。运算符,形象地代表一个向右的箭头。“-”运算符的运算符的优先级别最高优先级别最高。又如:又如:p-num+1相当于相当于(p-num)+1p-num+相当于相当于(p-num)+例例7.8中中main()的输出语句可改写为:的输出语句可改写为:printf(“nnam:%snnum:%ldna

31、ge:%dnsex:%cnscore:%6.2fn”,p-name,p-num,p-age,p-sex,p-score);7.3.2 指向结构体数组的指针指向结构体数组的指针C编译器不仅为一个结构体变量分配一个连续的存编译器不仅为一个结构体变量分配一个连续的存储空间,而且还像一般数组一样,为结构体数组中储空间,而且还像一般数组一样,为结构体数组中的元素分配一个连续的存储空间。例如的元素分配一个连续的存储空间。例如struct StudType char name16;long num;int age;char sex;float score;stu3;被分配的存储空间如图被分配的存储空间如图7

32、.6所示。所示。m89.418Wang Li50201m90.519Zhang Fun50202f98.020Li Ling50203pp+1p+2stu0stu1stu2图图7.6 结构体数组的内存分配结构体数组的内存分配 根据根据C语言中指针与数组的关系,如果定义一个指语言中指针与数组的关系,如果定义一个指向结构体数组的指针向结构体数组的指针p=stu,p指向指向stu0,p+1 指指向向stu1,p+2 指向指向stu2。因此,例。因此,例7.9中的程序中的程序可以改用指针实现。可以改用指针实现。#include#include#define StuNUM 3struct StudTyp

33、e char name16;long num;int age;char sex;float score;int main(void)struct StudType stuStuNUM,*p;int i;char numstr16;/*输入数据输入数据*/for(i=0,p=stu;pname);gets(numstr);p-num=atol(numstr);gets(numstr);p-age=atoi(numstr);p-sex=getchar();getchar();gets(numstr);p-score=atof(numstr);/*输出数据输出数据*/printf(n record

34、name t t numtagetsextscoren);for(i=0,p=stu;pname,p-num,p-age,p-sex,p-score);return 0;程序运行结果:程序运行结果:7.6.1 共用体的特点共用体的特点1.共用体类型的定制与共用体变量的定义共用体类型的定制与共用体变量的定义关于共用体(关于共用体(union)数据类型是指将)数据类型是指将不同的数据项不同的数据项存放于存放于同一段内存同一段内存单元的一种构造数据类型。下面是一单元的一种构造数据类型。下面是一个共用体的例子:个共用体的例子:union exam int a;double b;char c;x;这个结

35、构与结构体形式相同,数据类型的定制和变这个结构与结构体形式相同,数据类型的定制和变量的定义形式也与结构体相似,即可以采用如下三量的定义形式也与结构体相似,即可以采用如下三种形式:种形式:(1)然后用共用体类型定义共用体变量。然后用共用体类型定义共用体变量。(2)union共用体名成员表列;union共用体名成员表列变量表列;(3)union成员表列变量表列;2.共用体类型与结构体类型的比较共用体类型与结构体类型的比较共用体与结构体在共用体与结构体在形式上相似形式上相似,但实质上有,但实质上有很大不同。下面在同样成员的情况下对二者很大不同。下面在同样成员的情况下对二者进行比较。假定它们都有如下进

36、行比较。假定它们都有如下3个成员:个成员:4字节的字节的int类型成员类型成员a;8字节的字节的double类型成员类型成员b;1字节的字节的char类型成员类型成员c。chardoubleintdoublecharint(a)结构体的存储分配)结构体的存储分配(b)共用体的存储分配)共用体的存储分配 图图7.13 结构体与共用体的存储分配结构体与共用体的存储分配(1)存储结构不同。)存储结构不同。(2)由于结构体中的每个成员都)由于结构体中的每个成员都有自己的有自己的存储空间存储空间,所有成员可以,所有成员可以同时同时存储;而共用存储;而共用体中所有的成员体中所有的成员共用共用一个存储空间,

37、同一时一个存储空间,同一时间只能存储一个成员。间只能存储一个成员。(3)结构体变量可以在定义时进行初始化;)结构体变量可以在定义时进行初始化;而共用体变量而共用体变量不能在定义时进行初始化不能在定义时进行初始化。例。例如下面的程序段都是非法的。如下面的程序段都是非法的。union m int i;char c;double d;x=3,s,3.141593;/*不能对共不能对共用体变量初始化用体变量初始化*/也不能直接用共用体变量名进行输入输出,如:也不能直接用共用体变量名进行输入输出,如:scanf(“%f”,&x);printf(“%f”,x);#include#include int m

38、ain(void)union exam int a;float b;char c;x,y;x.a=3;y=x;printf(“%dn”,y.a);37.6.2 共用体变量的应用共用体变量的应用一个学校的人员数据管理中,对教师则应登记其一个学校的人员数据管理中,对教师则应登记其“单位单位”,对,对“学生学生”则应登记其则应登记其“班级班级”,它们,它们都在同一栏中。可以都在同一栏中。可以:struct long num;char name20;char sex;char job;/*职业职业*/union int class;/*班级班级*/char group20;/*单位名单位名*/cate

39、gory;person10;如果如果job项输入为项输入为s(学生学生),则使程序接着接收一则使程序接着接收一个整数给个整数给class(班号班号),如果如果job的值为的值为t(教师教师),则接收一个字符串给则接收一个字符串给group20。下面是一段应。下面是一段应用程序用程序:scanf(“%c”,&person0.job);if(person0.job=s)scanf(“%d”,&person0.category.class);else if(person0.job=t)scanf(“%”,person0.category.group);所谓所谓“枚举枚举”类型,是指这种类型的变量的值

40、只能是类型,是指这种类型的变量的值只能是指定的若干个名字之一。例如一个枚举类型和枚举变量指定的若干个名字之一。例如一个枚举类型和枚举变量可以定义如下:可以定义如下:enumcolorname red,yellow,blue,white,black;/*定义枚举类型定义枚举类型enum colorname*/enum colorname color;/*定义枚举变量定义枚举变量color*/变量变量color是枚举型是枚举型enum colorname的,它的值只的,它的值只能是能是red,yellow,blue,white,black五者之一。五者之一。enumcolorname red,ye

41、llow,blue,white,black;/*定义枚举类型定义枚举类型enum colorname*/enum colorname color;/*定义枚举变量定义枚举变量color*/例如下面的赋值合法例如下面的赋值合法color=red;color=white;而下面的语句不合法:而下面的语句不合法:color=green;color=orange;说明:说明:(1)enum是关键字,是关键字,标识枚举类型标识枚举类型,定义,定义枚举类型必须用枚举类型必须用enum开头。开头。(2)在定义枚举类型时,花括弧中的一些名在定义枚举类型时,花括弧中的一些名字字(red,yellow,blue,

42、white,black)是程序设是程序设计者自己指定的,命名规则与标识符相同。计者自己指定的,命名规则与标识符相同。这些名字并无固定的含义,这些名字并无固定的含义,只是一个符号只是一个符号。程序设计者仅仅为了使程序程序设计者仅仅为了使程序可读性可读性提高才使提高才使用这些名字。用这些名字。(3)它的值是一些整数。从花括弧中第一个名字开始,各名字它的值是一些整数。从花括弧中第一个名字开始,各名字分别代表分别代表0,1,2,3,4。这是系统自动赋给的,如:。这是系统自动赋给的,如:printf(“%d”,red);输出的值为输出的值为0。但是定义枚举类型时不能写成:。但是定义枚举类型时不能写成:e

43、num colorname 0,1,2,3,4;必须用符号必须用符号red,yellow,:或其它标识符。这些符号称为枚举常或其它标识符。这些符号称为枚举常量,或枚举元素。量,或枚举元素。(4)可以在定义类型时对枚举常量初始化可以在定义类型时对枚举常量初始化enum colornamered=3,yellow,blue,while=8,black;此时,此时,red为为3,yellow为为4,blue为为5,while为为8,black为为9。因为因为yellow在在red之后,之后,red为为3,yellow顺序加顺序加1,同理,同理black为为9,如果没有初始化如果没有初始化,系统自动系

44、统自动赋值赋值,从花括弧中第一个从花括弧中第一个名字开始,各名字分别代表名字开始,各名字分别代表0,1,2,3,4。(5)枚举常量可以进行比较,如:枚举常量可以进行比较,如:if(color=red)printf(“red”);if(color!=black)printf(“it is not black!”);if(colorwhile)printf(“it is black”);C语言还允许在程序中用语言还允许在程序中用typedef来定义新的来定义新的类型名来代替已有的类型名。类型名来代替已有的类型名。下面介绍下面介绍typedef的几种用法。的几种用法。1.简单的名字替换简单的名字替换

45、定义定义a,b为为INTEGER类型,也即类型,也即int类型。类型。typedef int INTEGER;意思是将意思是将int型定义为型定义为INTEGER,这二者等价,在程,这二者等价,在程序中就可以用序中就可以用INTEGER作为类型名来定义变量了。作为类型名来定义变量了。INTEGER a,b;/*相当于相当于int a,b;*/2.定义一个结构体类型名定义一个结构体类型名,如如这样以后就可以用名字这样以后就可以用名字STUDENT来定义变量了。如来定义变量了。如typedef struct char name20;long num;float score;STUDENT;STUD

46、ENT student1,student2,*p;4.定义指针类型。定义指针类型。Typedef int COUNT20;/*定义定义COUNT为整型数组为整型数组*/Typedef char NAME20;/*定义定义NAME为字符数组为字符数组*/COUNT a,b;/*a,b为整型为整型*/NAME c,d;/*c,d为字符数组为字符数组*/typedef char*STRING;/*定义定义STRING为字符指针类型为字符指针类型*/STRING p1,p2,p10;/*p1,p2为字符指针变量,为字符指针变量,p为字为字 符指针符指针 数组名数组名*/3.定义数组类型。定义数组类型。

47、5.小结小结 归纳起来,用归纳起来,用typedef定义一个新类型名的方法如下:定义一个新类型名的方法如下:先按定义变量的方法写出定义体先按定义变量的方法写出定义体(如如char a20);将变量名换成新类型名将变量名换成新类型名(如如char NAME20;)在最前面加上在最前面加上typedef(如如typedef char NAME20;)然后可以用新类型名去定义变量然后可以用新类型名去定义变量(如如NAME c,d;)对于下面的声明对于下面的声明struct xyzint a;char bstruct xyz s1,s2;在编译时,将会发生那种情形:(在编译时,将会发生那种情形:()A

48、.编译时错编译时错 B.编译、链接、执行都通过编译、链接、执行都通过 C.编译和链接都通过,但不能执行编译和链接都通过,但不能执行 D.编译通过,但链接出错编译通过,但链接出错 有结构体类型定义有结构体类型定义struct s int a;int b;vs;在下列候选答案中,选择正确的赋值操作:(在下列候选答案中,选择正确的赋值操作:()A.s.a=5;B.s.vs.a=5;C.struct va;va.x=5;D.struct s va=5;E.struct s vs.a=5;F.vs.a=5;对于定义对于定义struct saint x;float y;data,*p=&data;请从下列

49、候选答案中,选择数据请从下列候选答案中,选择数据data的的x成员的正确引用:成员的正确引用:()A.(*p).data B.(*p).x C.p-data.x D.p.data.x 对于定义对于定义 struct st int n;struct st*next;a3=5,7,(9),*p=&a0;则值为则值为6的表达式为:(的表达式为:()A.p+-n B.p-n+C.+p-n D.(*p).n+阅读程序,指出程序的输出结果阅读程序,指出程序的输出结果#include struct sint x;int y;cnum2=1,3,2,7;main()printf(“%dn”,cnum0.y*c

50、num1.x);#include main()enum teammy,your=4,his,her=his+10;printf(“%d%d%d%dn”,my,your,his,her);阅读程序,指出程序的输出结果阅读程序,指出程序的输出结果(5)#include main()unionunsigned char c;unsigned int i4;z;z.i0=0 x39;z.i0=0 x36;printf(%cn“,z.c);#include typedef union long x2;int y4;char z8;MYTYPE;MYTYPE them;main()printf(“%dn”

51、,sizeof(them);提示:字符提示:字符0的十六进制的十六进制ASCII码为码为30。(6)7.3 职工数据包括:职工号、职工名、性别、年龄、工龄、工资、地址。职工数据包括:职工号、职工名、性别、年龄、工龄、工资、地址。(1)为其定义一个结构体变量。)为其定义一个结构体变量。(2)对上述定义的变量,从键盘输入所需的具体数据,然后用)对上述定义的变量,从键盘输入所需的具体数据,然后用printf函数显示出函数显示出来。来。(3)定义一个职工数据的结构体数组,从键盘输入每个结构体元素所需的数据,)定义一个职工数据的结构体数组,从键盘输入每个结构体元素所需的数据,然后逐个输出这些元素的数据然

52、后逐个输出这些元素的数据(为简化起见,可设数组只有三个元素为简化起见,可设数组只有三个元素)。7.4 设计一个用于人事管理的结构体:设计一个用于人事管理的结构体:(1)每个人的数据包括:职工号、姓名、性别、出生日期;)每个人的数据包括:职工号、姓名、性别、出生日期;(2)性别和出生日期用位段表示。)性别和出生日期用位段表示。7.5 有有n个学生,每个学生的数据包括学号个学生,每个学生的数据包括学号(num),姓名,姓名(name20),性别,性别(sex),年龄年龄(age),三门课成绩,三门课成绩(score3)。(1)要求在)要求在main函数中输入这几个学生的数据,然后调用一个函数函数中

53、输入这几个学生的数据,然后调用一个函数count,在该,在该函数中计算出每个学生的总分和平均分,然后打印出所有各项数据函数中计算出每个学生的总分和平均分,然后打印出所有各项数据(包括原有的和新求出的包括原有的和新求出的)。提示:提示:在定义结构体类型时应预留出准备计算结果的成员项;在定义结构体类型时应预留出准备计算结果的成员项;用结构体变量为函数参数,将各数据传给用结构体变量为函数参数,将各数据传给count函数。函数。(2)改为用指针方法处理,即用指针变量逐次指向数组中各元素,然后向指针变)改为用指针方法处理,即用指针变量逐次指向数组中各元素,然后向指针变量所指向的元素输入数据,并将指针变量

54、作为函数参数将地址值传给量所指向的元素输入数据,并将指针变量作为函数参数将地址值传给count函数,在函数函数,在函数count中作统计,然后将数据返回中作统计,然后将数据返回main函数,在函数,在main函数输出。函数输出。7.6 有有4名学生,每个学生包括学号、姓名、成绩,要求用指针方法找出成绩最高名学生,每个学生包括学号、姓名、成绩,要求用指针方法找出成绩最高者的姓名和成绩。者的姓名和成绩。7.7 建立一个链表,每个节点包含的成员为:职工号、工资。建立一个链表,每个节点包含的成员为:职工号、工资。(1)用)用malloc函数开辟新节点。要求链表包含函数开辟新节点。要求链表包含5个节点,

55、从键盘输入节点中的有个节点,从键盘输入节点中的有效数据。然后把这些节点的数据打印出来。要求用函数效数据。然后把这些节点的数据打印出来。要求用函数creat来建立函数,用来建立函数,用list函数来输出函数来输出数据。这数据。这5个职工的号码为个职工的号码为0601,0603,0605,0607,0609。(2)在()在(1)的基础上,新增加一个职工的数据。这个新节点不放在最后,而是)的基础上,新增加一个职工的数据。这个新节点不放在最后,而是按职工号顺序插入,新职工号为按职工号顺序插入,新职工号为0606。写一个函数。写一个函数insert来插入新节点。来插入新节点。(3)在()在(1)、()、

56、(2)的基础上,写一个函数)的基础上,写一个函数delete,用来删除一个节点,用来删除一个节点(按指定按指定的职工号删除的职工号删除)。要求删除职工号为。要求删除职工号为0606的节点;的节点;7.7 有一个有一个unsigned long类型整数(类型整数(4字节),想分别将前字节),想分别将前2个字节和后两个字节个字节和后两个字节作为两个作为两个unsigned short类型输出类型输出(各占各占2个字节个字节)。用一函数实现,并要将。用一函数实现,并要将unsigned long型数作为参数,在函数中输出这两个型数作为参数,在函数中输出这两个unsigned short数据数据 7.

57、8 将将4个字符个字符“拼拼”成一个成一个long型数,这型数,这4个字符为个字符为“a”,“b”,“c”,“d”。写一函数,把由这写一函数,把由这4个字符连续组成的个字符连续组成的4个字节内容作为一个个字节内容作为一个long int数输出。数输出。7.9 某校建立一个人员登记表,内容示例如下:某校建立一个人员登记表,内容示例如下:号码姓名性别职业级别(年级/职称/职务)50201Wang Lim学生310058Zhang He m教师教授20067Li Feng f职员科级 请为之建立一个数据库。请为之建立一个数据库。7.10 口袋中有红、黄、兰、白、黑五种颜色的球若干个,每次从口袋中取出口袋中有红、黄、兰、白、黑五种颜色的球若干个,每次从口袋中取出3个。个。问得到三种不同色的球的可能取法,打印出每种组合的三种颜色问得到三种不同色的球的可能取法,打印出每种组合的三种颜色(提示,用枚举类型提示,用枚举类型)。7.11 有一个信息系统,需要设计一个菜单程序,进行有关功能的调用。请用菜单有一个信息系统,需要设计一个菜单程序,进行有关功能的调用。请用菜单程序设计一个用指向函数的指针实现这一调用功能。程序设计一个用指向函数的指针实现这一调用功能。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!