版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、百尺竿头,更进一步百尺竿头,更进一步 第十一章第十一章 结构体与共用体结构体与共用体一、结构体类型定义一、结构体类型定义 在实际问题中,一组数据往往具有不同的数据类型。如下所示,在实际问题中,一组数据往往具有不同的数据类型。如下所示, 在学生登记表中,姓名应为字符型;学号可为整型或字符型;在学生登记表中,姓名应为字符型;学号可为整型或字符型; 年年 龄应为整型;性别应为字符型;成绩可为整型或实型。龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能显然不能 用一个数组来存放这一组数据。用一个数组来存放这一组数据。 语言中提供了另一种构造数据类型语言中提供了另一种构造数据类型“结构体结构体
2、”。 “结构体结构体”是一种构造类型,它是由若干是一种构造类型,它是由若干“成员成员”组成的。组成的。 num name sex age score addr 10010 Li Fan M 18 87.5 Beijing百尺竿头,更进一步百尺竿头,更进一步 定义一个定义一个 结构体数据类型的一般形式为:结构体数据类型的一般形式为: struct 结构名结构名 成员表列;成员表列; ; 成员表由若干个成员组成,成员表由若干个成员组成, 每个成员都是该结构的一个组成每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:部分。对每个成员也必须作类型说明,其形式为: 类型说明符类型说
3、明符 成员名成员名; 百尺竿头,更进一步百尺竿头,更进一步成员名的命名应符合标识符的书写规定。例如:成员名的命名应符合标识符的书写规定。例如: struct stu int num; char name20; char sex; float score; ; 在这个结构体类型的定义中,结构名为在这个结构体类型的定义中,结构名为stu,该,该结构体类型结构体类型由由4个成员组成。第一个成员为个成员组成。第一个成员为num,整型变量;第二个成员为,整型变量;第二个成员为name,字符数组;第三个成员为,字符数组;第三个成员为sex,字符变量;第四个成员,字符变量;第四个成员为为score,实型变量
4、。,实型变量。 应注意在括号后的分号是不可少的。应注意在括号后的分号是不可少的。百尺竿头,更进一步百尺竿头,更进一步二、结构类型变量的说明二、结构类型变量的说明 说明结构变量有以下三种方法。以上面定义的说明结构变量有以下三种方法。以上面定义的stu为例来加以说为例来加以说明。明。1. 先定义结构类型,再定义结构变量。如:先定义结构类型,再定义结构变量。如: struct stu int num; char name20; char sex; float score; ; struct stu boy1,boy2;百尺竿头,更进一步百尺竿头,更进一步说明了两个变量说明了两个变量boy1和和boy
5、2为为stu结构类型。也可以用宏定义使结构类型。也可以用宏定义使一个符号常量来表示一个结构类型,例如:一个符号常量来表示一个结构类型,例如: #define STU struct stu STU int num; char name20; char sex; float score; ; STU boy1,boy2; 百尺竿头,更进一步百尺竿头,更进一步2. 在定义结构类型的同时定义结构变量。例如:在定义结构类型的同时定义结构变量。例如: struct stu int num; char name20; char sex; float score; boy1,boy2; num name se
6、x score 10001 Zhang Xin M 90.5 num name sex score 10002 Wang Li F 98 boy1 boy2百尺竿头,更进一步百尺竿头,更进一步3. 直接定义结构变量。例如:直接定义结构变量。例如: struct int num; char name20; char sex; float score; boy1,boy2; 第三种方法与第二种方法的区别在于第三种方法中省去了结构第三种方法与第二种方法的区别在于第三种方法中省去了结构名,而直接给出结构变量。三种方法中说明的名,而直接给出结构变量。三种方法中说明的boy1,boy2变量都具有变量都具有
7、上图所示的结构。说明了上图所示的结构。说明了boy1,boy2变量为变量为stu类型后,即可向这两类型后,即可向这两个变量中的各个成员赋值。在上述个变量中的各个成员赋值。在上述stu结构定义中,所有的成员都是结构定义中,所有的成员都是基本数据类型或数组类型。成员也可以又是一个结构,基本数据类型或数组类型。成员也可以又是一个结构, 即构成了嵌即构成了嵌套的结构。例如,下图给出了另一个数据结构。套的结构。例如,下图给出了另一个数据结构。 百尺竿头,更进一步百尺竿头,更进一步num name sex age birthdaymonth day yearaddr struct date int mon
8、th; int day; int year; ; struct int num; char name20; char sex; int age; struct date birthday; float score; char addr30; boy1,boy2;首先定义一个结构首先定义一个结构date,由,由month(月月)、day(日日)、year(年年) 三个成员组成。三个成员组成。 在定义并说明变量在定义并说明变量 boy1 和和 boy2 时,时, 其中的成员其中的成员birthday被说明为被说明为data结构类结构类型。型。成员名可与程序中其它变量成员名可与程序中其它变量同名,互
9、不干扰。同名,互不干扰。百尺竿头,更进一步百尺竿头,更进一步三、结构变量成员的表示方法三、结构变量成员的表示方法 在程序中一般对结构变量的使用,包括赋值、输入、输出、在程序中一般对结构变量的使用,包括赋值、输入、输出、 运算运算等都是通过结构变量的成员来实现的。等都是通过结构变量的成员来实现的。 表示结构变量成员的一般形式是:表示结构变量成员的一般形式是: 结构变量名结构变量名.成员名成员名 例如:例如: boy1.num 即第一个人的学号即第一个人的学号 boy2.sex 即第二个人的性别即第二个人的性别 如果成员本身又是一个结构则必须逐级找到最低级的成员才能如果成员本身又是一个结构则必须逐
10、级找到最低级的成员才能使用。例如:使用。例如: boy1.birthday.month 即第一个人出生的月份即第一个人出生的月份 成员可以在程序中单独使用,与普通变量完全相同成员可以在程序中单独使用,与普通变量完全相同百尺竿头,更进一步百尺竿头,更进一步四、结构变量的赋值。四、结构变量的赋值。 前面已经介绍,结构变量的赋值就是给各成员赋值。前面已经介绍,结构变量的赋值就是给各成员赋值。 可用输入可用输入语句或赋值语句来完成。语句或赋值语句来完成。 例如:给结构变量赋值并输出其值。(见下页)例如:给结构变量赋值并输出其值。(见下页)百尺竿头,更进一步百尺竿头,更进一步main( ) struct
11、 stu int num; char *name; char sex; float score; boy1; boy1.num=102; =Zhang ping; printf(input sex and scoren); scanf(%c %f,&boy1.sex,&boy1.score); printf(Number=%dnName=%sn,boy1.num,); printf(Sex=%cnScore=%fn,boy1.sex,boy1.score);本程序中用赋值语句给本程序中用赋值语句给num和和name两个成员赋值,两个成员赋值,
12、name是一是一个字符串指针变量。用个字符串指针变量。用scanf函函数动态地输入数动态地输入sex和和score成员值,成员值,然后分别输出然后分别输出boy1 的各个成员的各个成员值。本例表示了结构变量的赋值。本例表示了结构变量的赋值、输入和输出的方法。值、输入和输出的方法。百尺竿头,更进一步百尺竿头,更进一步五、结构变量的初始化五、结构变量的初始化 和其他类型变量一样,对结构变量的初始化可以在定义时指定和其他类型变量一样,对结构变量的初始化可以在定义时指定初始值。初始值。 1、外部结构变量初始化。、外部结构变量初始化。 struct stu /*定义结构类型定义结构类型*/ int nu
13、m; char *name; char sex; float score; boy2,boy1=102,Zhang ping,M,78.5; / /* *定义结构变量定义结构变量* */ /main( ) printf(Number=%dnName=%sn,boy1.num,); printf(Sex=%cnScore=%fn,boy1.sex,boy1.score);百尺竿头,更进一步百尺竿头,更进一步2、内部结构变量初始化。、内部结构变量初始化。main( ) struct stu /*定义结构类型定义结构类型*/ int num; char *name; char se
14、x; float score; boy2,boy1=102,“Zhang ping”,M,78.5; / /* *定义结构变量定义结构变量* */ / printf(Number=%dnName=%sn,boy1.num,); printf(Sex=%cnScore=%fn,boy1.sex,boy1.score);百尺竿头,更进一步百尺竿头,更进一步六、结构数组六、结构数组 在实际应用中,经常用结构数组来表示具有相同数据结构的一个在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。群体。如一个班的学生档案,一个车间职工的
15、工资表等。 结构数组的定义方法和结构变量相似,只需说明它为数组类型结构数组的定义方法和结构变量相似,只需说明它为数组类型即可。例如:即可。例如: struct stu int num; char *name; char sex; float score; boy5; 定义了一个结构数组定义了一个结构数组boy,共有,共有5个元素,个元素,boy0boy4。每。每个数组元素都具有个数组元素都具有struct stu的结构形式。的结构形式。百尺竿头,更进一步百尺竿头,更进一步 和其他类型的数组一样,可以对结构体数组作初始化赋值,和其他类型的数组一样,可以对结构体数组作初始化赋值,例如:例如: st
16、ruct stu int num; char *name; char sex; float score; boy5= 101,Li ping,M,45, 102,Zhang ping,M,62.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58; 当对全部元素作初始化赋值时,也可不给出数组长度。当对全部元素作初始化赋值时,也可不给出数组长度。百尺竿头,更进一步百尺竿头,更进一步计算学生的平均成绩和不及格的人数。计算学生的平均成绩和不及格的人数。struct stu int num; char *name; char se
17、x; float score;boy5= 101,Li ping,M,45, 102,Zhang ping,M,62.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58, ;百尺竿头,更进一步百尺竿头,更进一步main( ) int i,c=0; float ave,s=0; for(i=0;i5;i+) s+=boyi.score; if(boyi.score成员名成员名 例如:例如: (*pstu).num或者:或者: pstu-num注意注意(*pstu)两侧的括号不可少两侧的括号不可少! 因为成员符因为成员符“.
18、”的优先级高于的优先级高于“*”。如去掉括号写作如去掉括号写作*pstu.num则等效则等效于于*(pstu.num),这样,意义就完,这样,意义就完全不对了。全不对了。百尺竿头,更进一步百尺竿头,更进一步下面通过例子来说明结构指针变量的具体说明和使用方法。下面通过例子来说明结构指针变量的具体说明和使用方法。struct stu int num; char *name; char sex; float score; boy1=102,Zhang ping,M,78.5,*pstu;main() pstu=&boy1; printf(Number=%dnName=%sn,boy1.num
19、,); printf(Sex=%cnScore=%fnn,boy1.sex,boy1.score); printf(Number=%dnName=%sn,(*pstu).num,(*pstu).name); printf(Sex=%cnScore=%fnn,(*pstu).sex,(*pstu).score); printf(Number=%dnName=%sn,pstu-num,pstu-name); printf(Sex=%cnScore=%fnn,pstu-sex,pstu-score);百尺竿头,更进一步百尺竿头,更进一步本例程序定义了一个结构本例程序定义了一个结构s
20、tu,定义了,定义了stu类型结构变量类型结构变量boy1 并并作了初始化赋值,还定义了一个指向作了初始化赋值,还定义了一个指向stu类型结构的指针变量类型结构的指针变量pstu。 在在main函数中,函数中,pstu被赋予被赋予boy1的地址,因此的地址,因此pstu指向指向boy1 。然后在然后在printf语句内用三种形式输出语句内用三种形式输出boy1的各个成员值。的各个成员值。 从运行结从运行结果可以看出:果可以看出: 结构变量结构变量.成员名成员名 (*结构指针变量结构指针变量).成员名成员名 结构指针变量结构指针变量-成员名成员名 这三种用于表示结构成员的形式是完全等效的。这三种
21、用于表示结构成员的形式是完全等效的。百尺竿头,更进一步百尺竿头,更进一步2、结构数组指针变量、结构数组指针变量 结构指针变量可以指向一个结构数组,结构指针变量可以指向一个结构数组, 这时结构指针变量的值这时结构指针变量的值是整个结构数组的首地址。是整个结构数组的首地址。 结构指针变量也可指向结构数组的一个结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的地址。元素,这时结构指针变量的值是该结构数组元素的地址。 设设ps为指向结构数组的指针变量,则为指向结构数组的指针变量,则ps也指向该结构数组的也指向该结构数组的0号号元素,元素,ps+1指向指向1号元素,号元素,p
22、s+i则指向则指向i号元素。号元素。 这与普通数组的情这与普通数组的情况是一致的。况是一致的。百尺竿头,更进一步百尺竿头,更进一步用指针变量输出结构数组。用指针变量输出结构数组。struct stu int num; char *name; char sex; float score;boy5= 101,Zhou ping,M,45, 102,Zhang ping,M,62.5, 103,Liou fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58, ;百尺竿头,更进一步百尺竿头,更进一步main() struct stu *ps; pri
23、ntf(NotNametttSextScoretn); for(ps=boy;psnum, ps-name,ps-sex,ps- score);在程序中,定义了在程序中,定义了stu结构类型的外部数组结构类型的外部数组boy 并作了初始化赋并作了初始化赋值。在值。在main函数内定义函数内定义ps为指向为指向stu类型的指针。在循环语句类型的指针。在循环语句for 的的表达式表达式1中,中,ps被赋予被赋予boy的首地址,然后循环的首地址,然后循环5次,输出次,输出boy 数组数组中各成员值。中各成员值。psboy1101 Zhou Ping M 45boy0 102ps百尺竿头,更进一步百尺
24、竿头,更进一步 应该注意的是,应该注意的是, 一个结构指针变量虽然可以用来访问结构变量一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能使它指向一个成员。或结构数组元素的成员,但是,不能使它指向一个成员。 也就是也就是说不允许取一个成员的地址来赋予它。因此,下面的赋值是错误说不允许取一个成员的地址来赋予它。因此,下面的赋值是错误的。的。 ps=&boy1.sex;而只能是:而只能是: ps=boy;(赋予数组首地址赋予数组首地址)或者是:或者是: ps=&boy0;(赋予赋予0号元素首地址号元素首地址)百尺竿头,更进一步百尺竿头,更进一步3、用结构体变量和
25、、用结构体变量和指向结构体的指针作函数参数指向结构体的指针作函数参数 将一个结构体变量的值传递给另一个函数,有将一个结构体变量的值传递给另一个函数,有3 3个方法:个方法: 1 1)用结构体变量的成员做参数。例如:)用结构体变量的成员做参数。例如:stu1.numstu1.num或或作函数实参,将实参值传给形参。用法和普通变量作作函数实参,将实参值传给形参。用法和普通变量作实参是一样的。属于实参是一样的。属于“值传递值传递”方式。方式。 2 2)用结构体变量作实参。)用结构体变量作实参。ANSI CANSI C用结构体变量作实参时,采用结构体变量作实参时,采
26、取的是取的是“值传递值传递”方式。将结构体变量所占的内存单元的内容全方式。将结构体变量所占的内存单元的内容全部顺序传递给形参。形参也必须是同类型的结构体变量。在函数部顺序传递给形参。形参也必须是同类型的结构体变量。在函数调用期间也要占用内存单元调用期间也要占用内存单元 缺点:缺点: a a)这种传递方式的空间和时间开销大)这种传递方式的空间和时间开销大 b b)如果在执行被调用函数期间改变了形参(也就是结构体)如果在执行被调用函数期间改变了形参(也就是结构体变量)的值,该值不能返回主调函数,造成使用上的不方便。变量)的值,该值不能返回主调函数,造成使用上的不方便。 这种方法较少使用。这种方法较
27、少使用。 3 3)用指向结构体变量(或数组)的指针作实参,将结构体变)用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。量(或数组)的地址传给形参。百尺竿头,更进一步百尺竿头,更进一步1. 1. 什么是链表?什么是链表? 一种动态分配的数据结构。一种动态分配的数据结构。 是用指针变量将非是用指针变量将非连续的数据块连成一个整体的一种数据结构。连续的数据块连成一个整体的一种数据结构。 解决了数组存放数据的弊端解决了数组存放数据的弊端 解决了内存分配零乱的问题解决了内存分配零乱的问题Head数据数据D DNull数据数据C C数据数据B B数据数据A AHead: He
28、ad: 称为表头,仅存放一个地址,无数据。称为表头,仅存放一个地址,无数据。数据数据指针指针: : 为数据块,又称为链表的结点,由两部分组成,为数据块,又称为链表的结点,由两部分组成,数据和指针。数据和指针。数据:该结点的具体数据数据:该结点的具体数据指针:下一个结点的地址指针:下一个结点的地址百尺竿头,更进一步百尺竿头,更进一步实现方法:实现方法:2. 2. 用指向该种类型的结构指针作为表头;用指向该种类型的结构指针作为表头;3. 3. 每一个结点中包含同种类型的指针每一个结点中包含同种类型的指针变量用以存放下一个结点的地址。变量用以存放下一个结点的地址。1. 1. 用结构型变量表示每一个结
29、点;用结构型变量表示每一个结点;百尺竿头,更进一步百尺竿头,更进一步实现过程中用到的三个函数实现过程中用到的三个函数( (由系统提供由系统提供) )void void * *malloc(unsinged intmalloc(unsinged int size) size)void void * *calloc(unsigned n,unsignedcalloc(unsigned n,unsigned size) size) 在内存的动态区分配在内存的动态区分配n n个长度为个长度为sizesize的连续空间的连续空间。函。函数数 返回一个指向分配域起始地址的指针;返回一个指向分配域起始地址的
30、指针;若若百尺竿头,更进一步百尺竿头,更进一步 void void free(void free(void * *ptrptr) ) ptr ptr为指针变量,该函数释放最近一次调用为指针变量,该函数释放最近一次调用mallocmalloc或或calloccalloc分配且由分配且由ptrptr指向的内存空间。指向的内存空间。百尺竿头,更进一步百尺竿头,更进一步2. 2. 建立链表建立链表例例: : 写一个函数,建立写一个函数,建立5 5名学生数据的单向链表,每一名学生数据的单向链表,每一个学生结点的类型定义如下:个学生结点的类型定义如下: structstruct student stude
31、nt long num; long num; float score; float score; struct struct student student next;next;然后定义三个指向这种类型的指针变量然后定义三个指向这种类型的指针变量. . struct struct student student * *head,head,* *p1,p1,* *p2;p2;开始时开始时 headhead= =NULLNULLp1: p1: 新分配的结点地址新分配的结点地址p2: p2: 已分配的最后一个结点地址已分配的最后一个结点地址约定:当输入学号为约定:当输入学号为0 0时,结束,返回表头
32、时,结束,返回表头百尺竿头,更进一步百尺竿头,更进一步#define NULL 0#define NULL 0#define LEN sizeof(struct#define LEN sizeof(struct student) student)structstruct student student long num; long num; float score; float score; struct struct student student next;next; ; ;intint n; n;structstruct student student creatcreat( )( )
33、struct struct student student head, head, p1, p1, p2;p2; n=0; n=0; head=NULL;head=NULL; p1=p2=(struct p1=p2=(struct student student ) malloc(LEN) malloc(LEN);); scanf(%ld%f scanf(%ld%f, &p1, &p1num, &p1num, &p1score);score); 百尺竿头,更进一步百尺竿头,更进一步 p2p2next=NULL;next=NULL; return(head ret
34、urn(head);); else p2else p2next = p1;next = p1;p2=p1;p2=p1;p1=(struct student p1=(struct student ) malloc(LEN) malloc(LEN););scanf(%ld%fscanf(%ld%f, &p1, &p1num, &p2num, &p2score);score); while (p1 while (p1num!=0)num!=0) n+; n+; if(n if(n=1) head=p1;=1) head=p1;百尺竿头,更进一步百尺竿头,更进一步voi
35、d print (struct student *head) struct student p; p=head; if (p=NULL) return; 3. 3. 输出链表输出链表该问题比较容易解决该问题比较容易解决。链表首地址链表首地址 do do printf(%ld %5.1f , p printf(%ld %5.1f , pnumnum, p, pscore);score); p=p p=pnextnext; ; while (p!=NULL); while (p!=NULL); 百尺竿头,更进一步百尺竿头,更进一步 一般给出某一条件,当某一条件成立时,则删除该结一般给出某一条件,当
36、某一条件成立时,则删除该结点:点: 当第一个结点被删除时,修改表头当第一个结点被删除时,修改表头 查找完整个链表查找完整个链表,结束结束。struct student del(head, num)struct student head;long num; struct student p1, p2;4. 4. 删除一个结点删除一个结点 表为空时,无任何删除表为空时,无任何删除 其它其它结点被删除时,结点被删除时,其其前驱指向前驱指向其其后继后继百尺竿头,更进一步百尺竿头,更进一步if (head= =NULL) printf(“List is null!); return (head); p1
37、=head;while (num!=p1num &p1next!=NULL) p2=p1; p1=p1next;if (num= =p1num) if (p1= =head) head=p1next; else p2next=p1next;printf (delete: %ld n, num);n ; else printf (%ld has not been found!n, num); return; 百尺竿头,更进一步百尺竿头,更进一步 一般情况:链表中结点的关键数据已排好序,待插入一般情况:链表中结点的关键数据已排好序,待插入结点的关键数据与链表中的关键数据一一比较,插入适当结
38、点的关键数据与链表中的关键数据一一比较,插入适当的位置。的位置。 方法:设链表中按方法:设链表中按numnum已排序好已排序好struct student struct student insert (head, stud)insert (head, stud)struct student struct student head, head, stud;stud; struct student struct student p0p0, , p1, p1, p2;p2; p1=head; p1=head; p0=stud; p0=stud; if(head if(head= =NULL)= =N
39、ULL) head=p0; p0 head=p0; p0next=NULL;next=NULL; else else 5. 5. 对链表的插入操作对链表的插入操作百尺竿头,更进一步百尺竿头,更进一步 while(p0nump1num)&(p1next!=NULL) p2=p1; p1=p1next; if (p0numnum, &stunum, &stuscore);score);while (stuwhile (stunum!=0)num!=0) head=insert(head, stu head=insert(head, stu);); printf(input
40、printf(input the inserted record: ); the inserted record: ); stu=(struct student stu=(struct student * * ) malloc(LEN ) malloc(LEN););scanf(%ld%f,&stuscanf(%ld%f,&stunum, &stunum, &stuscore);score); 百尺竿头,更进一步百尺竿头,更进一步九、九、 共用体共用体一一. . 共用体的概念共用体的概念 当需要把不同类型的变量存放到同一段内存当需要把不同类型的变量存放到同一段内
41、存单元,或对同一段内存单元的数据按不同类型处单元,或对同一段内存单元的数据按不同类型处理,则需要使用理,则需要使用“共用体共用体”数据结构。数据结构。 共用体数据类型是指将不同的数据项组织为共用体数据类型是指将不同的数据项组织为一个整体,它们在内存中占用同一段存储单元。一个整体,它们在内存中占用同一段存储单元。 百尺竿头,更进一步百尺竿头,更进一步2000200120022003chif百尺竿头,更进一步百尺竿头,更进一步(1 1)先定义类型,再定义变量,)先定义类型,再定义变量,例如:例如:union data /union data /* *共用体类型定义共用体类型定义* */ / int
42、 int i i; char chchar ch; float ffloat f; ;union data aunion data a,b b,c c;/ /* *共用体类型变量定义共用体类型变量定义* */ /百尺竿头,更进一步百尺竿头,更进一步(2 2)定义类型时同时说明变量,例如:定义类型时同时说明变量,例如: union dataunion data int int i i; char chchar ch; float ffloat f; aa,b b,c c;(3 3)不定义类型名而直接定义变量,)不定义类型名而直接定义变量,例如:例如: unionunion int int i i
43、; char chchar ch; float ffloat f; aa,b b,c c;百尺竿头,更进一步百尺竿头,更进一步二二. . 共用体变量的引用方式共用体变量的引用方式 对共用体变量的引用,是通过其成员的引用对共用体变量的引用,是通过其成员的引用来实现的。来实现的。 a.i a.i / /* *引用共用体变量中的成员引用共用体变量中的成员i i,a.ia.i就相当于一个整型变量就相当于一个整型变量* */ / a.ch a.ch / /* *引用共用体变量中的成员引用共用体变量中的成员chch,a.cha.ch就相当于一个字符变量就相当于一个字符变量* */ / a.f a.f /
44、/* *引用共用体变量中的成员引用共用体变量中的成员f f,a.fa.f就相当于一个实型变量就相当于一个实型变量* */ /不能对共用体变量进行整体的输入输出,例如:不能对共用体变量进行整体的输入输出,例如:printfprintf(”%d%d”,a a););百尺竿头,更进一步百尺竿头,更进一步【例例】共用体变量引用。共用体变量引用。#include stdio.h#include void mainvoid main()()unionunion char a char a; intint b b; long clong c;u1u1;u1.a=u1.a=A A;printfprintf(”
45、(”n1n1: :a=a=% %x x, ,b=b=% %x x, ,c=c=% %lxlx”,”,u1.au1.a, ,u1.bu1.b, ,u1.cu1.c) );uu.buu.b=0 x7656=0 x7656;printfprintf(”(”n2n2: :a=a=% %x x, ,b=b=% %x x, ,c=c=% %lxlx”,”,u1.au1.a, ,u1.bu1.b, ,u1.cu1.c) );uu.cuu.c=0 x12345678=0 x12345678;printfprintf(”(”n3n3: :a=a=% %x x, ,b=b=% %x x, ,c=c=% %lxlx
46、”,”,u1.au1.a, ,u1.bu1.b, ,u1.cu1.c) ); 65000000abc5676000078563412百尺竿头,更进一步百尺竿头,更进一步十、十、 枚举类型枚举类型 在处理实际问题时,常常要涉及到一些非数值性在处理实际问题时,常常要涉及到一些非数值性数据,而这些数据难以用前面介绍的标准类型准确描数据,而这些数据难以用前面介绍的标准类型准确描述,只好采用一些替代方法。述,只好采用一些替代方法。 性别有男女之分,用整数性别有男女之分,用整数0 0、1 1分别表示;分别表示;例如例如: : 红、橙、黄、绿、青、蓝、紫七种颜色,用红、橙、黄、绿、青、蓝、紫七种颜色,用1
47、1、2 2、3 3、4 4、5 5、6 6、7 7分别表示;分别表示; 一周有七天,以一周有七天,以0 0、1 1、2 2、3 3、4 4、5 5、6 6分别表示;分别表示;一年有一年有1212个月,用个月,用112112分别表示。分别表示。百尺竿头,更进一步百尺竿头,更进一步 显然,这种用数值代码来代表某一具体非数值数据的方显然,这种用数值代码来代表某一具体非数值数据的方法在程序设计中属于个别约定,虽可采用,但使用起来有诸法在程序设计中属于个别约定,虽可采用,但使用起来有诸多的不便多的不便: : 一方面这种描述方法不易明确数据与代码的对应关系,一方面这种描述方法不易明确数据与代码的对应关系,
48、不直观,可读性差;不直观,可读性差; 另一方面,这些数值代码的整数形式容易混淆其真实含另一方面,这些数值代码的整数形式容易混淆其真实含义,对这些数字代码进行的某些语法正确的运算,可能毫无义,对这些数字代码进行的某些语法正确的运算,可能毫无意义,更可能导致不必要的错误。意义,更可能导致不必要的错误。 所谓枚举,是将具有相同属性的一类数据值一一列举。所谓枚举,是将具有相同属性的一类数据值一一列举。 枚举类型是枚举类型是ANSI CANSI C新标准所增加的,它是新标准所增加的,它是C C语言中的简单语言中的简单类型而非构造类型,它的值域是有穷的,可以一一列举出来。类型而非构造类型,它的值域是有穷的
49、,可以一一列举出来。 枚举变量的取值只限于列举出来的值的范围。枚举变量的取值只限于列举出来的值的范围。百尺竿头,更进一步百尺竿头,更进一步一一. . 枚举类型的定义枚举类型的定义1.1.enumenum 枚举类型名枚举类型名 标识符标识符1 1,标识符,标识符2 2,标识符,标识符nn;enumenum是枚举类型定义的关键字是枚举类型定义的关键字枚举类型名是用户命名的标识符,它与枚举类型名是用户命名的标识符,它与enumenum构成枚构成枚举类型的标识符举类型的标识符花括号中花括号中“标识符标识符1 1,标识符,标识符2 2,标识符,标识符n”n”是是所定义枚举类型的全部取值,通常称这些标识符
50、为所定义枚举类型的全部取值,通常称这些标识符为“枚举元素枚举元素“或或“枚举常量枚举常量”。这些标识符是用户定义的标识符,一般是所代表事物的名称,但这些标识符并不自动地代表事物本身。例如例如 enumenum colorred colorred,blueblue,greengreen,blackblack;百尺竿头,更进一步百尺竿头,更进一步 用户可根据需要在定义时直接指定某一枚举元素的编号,用户可根据需要在定义时直接指定某一枚举元素的编号,从而改变量系统默认的编号。例如:从而改变量系统默认的编号。例如:enum week sun=7enum week sun=7,monmon,tue=2tu
51、e=2,wedwed,thuthu,frifri,satsat; 则则sunsun的序号为的序号为7 7,monmon的序号为的序号为8 8, tuetue的序号为的序号为2 2, wedwed的序号为的序号为3 3, thuthu的序号为的序号为4 4,frifri的序号为的序号为5 5,satsat的序号为的序号为6 6。2. 2. 枚举类型是有序类型枚举类型是有序类型 一般地,枚举类型中各枚举元素按定义时的先后次序分别一般地,枚举类型中各枚举元素按定义时的先后次序分别编号为编号为0 0、1 1、2 2、.、n-1n-1。例如例如: :redblue redblue 值为真值为真, ,各枚
52、举元素可根据其序号进行大小比较和相应的运算各枚举元素可根据其序号进行大小比较和相应的运算green-redgreen-red值为值为2 2百尺竿头,更进一步百尺竿头,更进一步二二. . 枚举类型的应用枚举类型的应用 1 1枚举类型变量的定义枚举类型变量的定义 enumenum male male,female sex1female sex1,sex2sex2;先定义枚举类型,再定义枚举类型变量先定义枚举类型,再定义枚举类型变量enum weeksunenum weeksun,monmon,tuetue,wedwed,thuthu,frifri,satsat; enumenum week wee
53、kday week weekday,workdayworkday;定义枚举类型的同时定义枚举变量定义枚举类型的同时定义枚举变量enum colorredenum colorred,blueblue,greengreen,black ablack a,b b,c c;直接定义枚举变量直接定义枚举变量百尺竿头,更进一步百尺竿头,更进一步2 2枚举变量的输入枚举变量的输入/ /输出输出 枚举变量的值不能直接输入枚举变量的值不能直接输入/ /输出输出 要输入性别:要输入性别:printf(printf(”enterenter male(0) male(0),female(1)female(1):”)
54、);scanf(scanf(”%d%d”,&sex_dm)&sex_dm);switch(sex_dm)switch(sex_dm)case 0case 0:sex1=malesex1=male; breakbreak; case 1case 1:sex1=femalesex1=female;breakbreak; 要输出某人的性别:要输出某人的性别:switch(sex1)switch(sex1)case malecase male: printf(printf(”nn male male”) ); breakbreak; case femalecase female:pri
55、ntf(printf(”nn female female”) );breakbreak; 百尺竿头,更进一步百尺竿头,更进一步【例】利用枚举类型表示一周中的每一天,要求输入【例】利用枚举类型表示一周中的每一天,要求输入今天是星期几,判断今天是是工作日还是休息日,并今天是星期几,判断今天是是工作日还是休息日,并输出今天起直到星期五的工作安排。输出今天起直到星期五的工作安排。 分析:分析:(1 1)为了直观性,定义星期的枚举类型。)为了直观性,定义星期的枚举类型。(2 2)利用间接的方法输入枚举类型的星期几,)利用间接的方法输入枚举类型的星期几,即用数字代码分别表示不同的一天,例如即用数字代码分别
56、表示不同的一天,例如0 0代表星期代表星期日,日,1 1代表星期一,代表星期一,.。(3 3)判断今天是工作日还是休息日,工作日从)判断今天是工作日还是休息日,工作日从星期一至星期五。星期一至星期五。(4 4)用间接的方法输出工作安排表。)用间接的方法输出工作安排表。 百尺竿头,更进一步百尺竿头,更进一步#include stdio.h#include main()main() enum dayssun enum dayssun,monmon,tuetue,wedwed,thuthu,frifri,satsat today today,weekdayweekday; intint day da
57、y; printf(printf(”enterenter today(0 today(0 6)6):”) ); scanf(scanf(”%d%d”,&day)&day); switch(day) /switch(day) /* *间接输入今天是星期几间接输入今天是星期几* */ / case 0 case 0:today=suntoday=sun;breakbreak; case 1case 1:today=montoday=mon;breakbreak; case 2case 2:today=tuetoday=tue;breakbreak; case 3case 3:today=wedtoday=wed;breakbreak; case 4case 4:today=thutoday=thu;breakbreak; case 5case 5:today=fritoday=fri;breakbreak; case 6case 6:today=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026ios 网络面试题目及答案
- 2026jsonp面试题及答案
- 2026mba案例分析面试题及答案
- 2026年事业单位卫生类公共基础知识试题及答案
- 初中九年级物理《电功率》高效课堂导学案
- 2026年临床专业传染病学复习试题及答案
- 初中英语八年级上册Unit 9 Section A (2d3c) 第二课时教学设计
- 初中英语七年级上册 Unit 2 第1课时(Section A 1a1d)核心素养导向教案
- 小学六年级英语单元整体教学设计:自然与文化的交响
- 从算式到方程课件2026-2027学年人教版七年级数学上册
- 奥巴马就职演讲-中英对照
- 职业指导师-国家职业标准
- 华能历年笔试真题及答案
- 2024-2025学年吉林省长春市外研版(一起)(2012)六年级下学期7月期末英语试卷含答案
- 气瓶安全操作培训记录课件
- 环保安全知识培训内容
- DBJT15-245-2022 广东省城市轨道交通工程设计规范
- 学生干部留任汇报
- 《HJ 212-2025 污染物自动监测监控系统数据传输技术要求》
- 民航旅客投诉培训课件
- 高二升高三数学高二数学暑期综合测评卷(19题新高考新结构)(原卷版)
评论
0/150
提交评论