《c程序设计授课》课件-第08章 结构、联合及枚举类型_第1页
《c程序设计授课》课件-第08章 结构、联合及枚举类型_第2页
《c程序设计授课》课件-第08章 结构、联合及枚举类型_第3页
《c程序设计授课》课件-第08章 结构、联合及枚举类型_第4页
《c程序设计授课》课件-第08章 结构、联合及枚举类型_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

第8章结构、联合及枚举类型*重点与难点8.1结构体类型和结构变量的定义8.2结构体变量的引用和初始化8.3结构体数组8.4结构体类型的指针变量8.5结构体与函数8.6用typedef定义类型8.7用指针处理链表8.8共用体8.9枚举类型*本章小结*作业重点与难点重点:结构体、共用体和枚举类型。难点:链表的操作。二维表(关系)学号姓名性别年龄成绩地址10001ZhangXinM1990.5Shanghai10002WangLiF2098Beijing10010LiFunM1887.5Guangzhou8.1结构体类型和结构体变量的定义8.1.1结构体类型的定义8.1.2结构体变量的定义8.1.1结构体类型的定义struct结构体名{

数据类型成员名1;数据类型成员名2;

……

数据类型成员名n;};点坐标yx.(x,y)二维坐标的点structpoint{floatx;floaty;};

点的结构体类型圆的结构体r(x,y)structcircle{structpoint{floatx;floaty;}dot;floatr;}structpointdot;8.1.2结构体变量的定义1、先定义结构体类型,再定义结构体变量2、定义结构体类型的同时定义结构体变量3、直接定义结构体类型变量1、先定义结构体类型,再定义结构体变量structcircle{structpointdot;floatr;};structcirclegraph1,graph2;2、定义结构体类型的同时定义结构体变量structstudent{intnum;charname[20];charsex;intagefloatscore;charaddr[30];}stu1,stu2;3、直接定义结构体类型变量struct{intmonth;intday;intyear;}date1,date2;8.2结构体变量引用和初始化1、结构体变量的引用2、结构体变量的初始化1、结构体变量的引用在ANSI中除了允许具有相同类型的结构体变量相互赋值外,一般对结构体变量的引用是通过其成员来实现。成员引用形式:结构体变量名.成员名举例:

graph1.rgraph1.dot.x例8.1求两个同心圆的面积差main(){structpoint{floatx;floaty;};structcircle{structpointdot;floatr;};structcirclegraph1,graph2;floatarea;

graph1.dot.x=2;graph1.dot.y=3;graph1.r=4;

graph2.dot=graph1.dot;printf("Graph2.r=");scanf("%f",&graph2.r);area=3.14*(graph2.r*graph2.r-graph1.r*graph1.r);printf("Dotis(%-4.1f,%-4.1f)\n",graph1.dot.x,graph1.dot.y);printf("Radiusis%-4.1fand%-4.1f\n",graph1.r,graph2.r);printf("Area(r2-r1)=%-6.1f\n",area);}2、结构体变量的初始化初始化形式

结构体类型结构体变量={初始化数据};举例

structcirclegraph1={{2,3},4};

即x=2,y=3,r=4;其中内层{}可省。8.3结构体数组structcirclecir[3];structcredit{intnum;char*name;charsex;floatscore[3]}stu[5];结构体数组举例structcredit{intnum;char*name;charsex;floatscore[3];}stu[5]={{101,"ZhaoHua",'M',45,80,78},{102,"XianJiang",'M',62.5,76,80},{103,"SunJun",'F',92.5,92,89},{104,"LiWei",'F',87,88,91},{105,"ZhouLi",'M',58,60,77}};例8.2计算学生的总分,按总分排名次及输出名次表stu[i].total+=stu[i].score[j];排序:选择法for(i=0;i<N-1;i++){k=i;for(j=i+1;j<N;j++)if(stu[j].total>stu[k].total)k=j;if(k!=i){temp=stu[i];stu[i]=stu[k];stu[k]=temp;}}8.4结构体类型的指针变量结构体变量可以由不同类型的成员构成,各个成员所占空间字节数之和是结构体变量所占的内存空间。结构体的指针是结构体变量在内存中得首地址。结构体类型的指针变量可以存放结构体的首地址。成员引用方法一般方法

graph1.dot.x指针方法已知p=&graph1;

(*p).r

(*p).dot.x

或p->r

p->dot.x

其中:“结构体指针变量名->成员名”方法直观。举例:成员的指针引用方式structcredit*p=&pupil;printf("%-3d%-20s%-3c",(*p).num,(*p).name,(*p).sex);printf("%-3d%-20s%-3c",p->num,p->name,p->sex);索引表结构structindex{intnum;structcredit*link;}index_id[5]structcredit{intnum;char*name;charsex;floatscore[3];floattotal;}stu[5];索引图示101102103104105103SunJunF92.592.089.0273.5104LiWeiF87.088.091.0266.0102QianJiangM62.576.080.0218.5101ZhaoHuaM45.080.078.0203.0105ZhouLiM58.060.077.0195.08.5结构体与函数结构体成员可以像简单变量一样作为函数的参数。结构体变量也可以作为函数的参数。它的传递方式是值传递。由于在值传递时,实参拷贝到形参变量,如果结构体变量的成员较多、数据量较大时,传递效率会很低。一般采用结构体指针变量作为函数的参数。这样,在参数传递时仅需要拷贝一个地址而已。例8.4结构体与函数voidcaltotal(structcreditstu[],intn){inti,j;for(i=0;i<n;i++)stu[i].total=0;for(j=0;j<3;j++)stu[i].total+=stu[i].score[j];}形参也可以为:structcredit*p,intn8.6用typedef定义类型typedef声明新的类型名来代替已有的类型名。注意:typedef并不是创造新的类型。举例:typedefstructdate{intmonth;intday;intyear;}DATE;DATEbirthday;声明一个新的类型名的步骤1、先按定义变量的方法写出定义体

inti;2、将变量名换成新类型名

将i换成COUNT3、在最前面加typedef

typedefintCOUNT4、然后可以用新类型名去定义变量

COUNTi,j;举例typedefintNUM[100];NUMn;typedefstructstudent{intnum;charname[20];}STU;STUst1;说明typedef与#define#define是在预编译时处理的,它只作简单的字符串替换;typedef是在编译时处理的,并不是作简单的字符串替换。typedef的作用有利于程序的通用与移植。譬如:

typedefintINTEGER;

课堂训练

1、已知5个学生的数据存储在一个数组中,每个学生包括学号、姓名、3门课程的成绩和平均成绩。编写输入、输出函数:(1)输入函数:输入5个学生数据,计算平均分;(2)输出函数:在屏幕上输出5个学生的数据。8.7用指针处理链表1、链表概述2、简单链表3、处理动态链表所需的函数4、建立动态链表5、输出链表6、对链表的删除操作7、对链表的插入操作8、对链表的综合操作1、链表概述1249headA13561249B14571356C10211475DNULL1021structnode{charch;structnode*next;};structnode*node1,*node2;表尾typedefstructnode{charch;structnode*next;}*NODE;NODEnode1,node2;2、简单链表(举例)#defineNULL0structstudent{longnum;floatscore;structstudent*next;};main(){structstudenta,b,c,*head,*p;a.num=99101;a.score=89.5;b.num=99103;b.score=90;c.num=99107;c.score=85;head=&a;a.next=&b;b.next=&c;c.next=NULL;

p=head;do{printf("\n%ld,%g",p->num,p-score);p=p->next;}while(p!=NULL);

}指向下一个结点3、处理动态链表所需的函数函数原型功能void*malloc(unsignedintsize)在内存中分配长度为size的连续空间void*calloc(unsignedn,unsignedintsize)在内存中分配n个长度为size的连续空间void*free(void*p)释放p所指的内存空间4、建立动态链表建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。建立过程图示head9910189.599103909910585表尾,链表建立完毕9910788^创建链表函数structstudent*creat(void){structstudent*head,*p1,*p2;intn=0;head=NULL;p2=head;while(1){p1=p2=(structstudent*)malloc(sizeof(structstudent));scanf("%ld,%f",&p1->num,&p1->score);if(p1->num1==0)break;n++;if(n==1)head=p1;elsep2->next=p1;p2=p1;}

p2->next=NULL;return(head);}head指向表头p2指向表尾p1指向新结点5、输出链表输出链表:首先要得到链表第一个结点的地址,即head的值,然后设一个指针变量p,先指向第一个结点,输出p所指的结点,然后使p后移一个结点,再输出,直到链表的尾结点。编写一个输出链表的函数voidprint(structstudent*head){structstudent*p;

p=head;if(head!=NULL)do{printf("\n%ld%5.1f",p->num,p->score);

p=p->next;}while(p!=NULL);elseprintf("\nlinktableisempty!");}输出链表图示head9910189.5991039099105859910788^p6、对链表的删除操作从动态链表中删除结点是将某个结点的前驱结点和它的后续结点链结起来。并将该结点所占的内存释放。删除结点图示head9910189.5991039099105859910988^p19910765p2p2head9910189.5991039099105859910988^9910765p1删除结点程序while(num!=p1->num&&p1->next!=NULL){p2=p1;p1=p1->next;}/*查找将被删除的结点*/if(num==p1->num){if(p1==head)head=p1->next;elsep2->next=p1->next;}7、对链表的插入操作对链表的插入:是将一个结点插入到一个已有的链表中。p2head9910189.5991039099105859910988^9910765p1p0插入操作if(head==NULL){head=p0;p0->next=NULL;}else{while((p0->num>p1->num)&&(p1->next!=NULL)){p2=p1;p1=p1->next;}if(p0->num<=p1->num){if(head==p1)head=p0;elsep2->next=p0;p0->next=p1;}else{p1->next=p0;p0->next=NULL;}}链到表头链到表尾链到表中8、对链表的综合操作链表的综合操作包括链表的建立、插入结点、删除结点和输出链表的结点数据等操作。其中,建立链表的操作可以由插入操作完成,插入操作可以控制链表的建立是有序的。8.8共用体1、共用体的概念2、共用体变量的引用方式3、共用体类型数据的特点1、共用体的概念共用体:实现不同类型的变量存放在同一内存单元中,使用覆盖技术,几个变量相互覆盖。1000地址整型变量i整型变量i字符变量ch实型变量f实型变量f实型变量f实型变量f共用体类型定义一般形式

union共用体名{

成员表列}变量表列;举例:uniondata{inti;charch;floatf;}a,b,c;2、共用体变量的引用方式引用方式:不能引用共用体变量,而只能共用变量中的成员。举例:uniondata{inti;charch;floatf;}a,b,c;成员引用:a.ia.cha.f共用体与结构体比较项目结构体共用体所占内存各成员所占内存之和由占内存最多成员决定成员存在各个成员都在内存中存在只有最后使用的成员存在成员地址各个成员都有不同的地址所有成员都是一样的地址,与共用体变量地址一样例8.7验证共用体变量的存储形式main(){unionuarea{charc_data;inti_data;floatf_data;}udata;printf("&udatais%u\n",&udata);udata.c_data='A';printf("&udata.c_datais%u,valueis%c\n",&udata.c_data,udata.c_data);udata.i_data=114;printf("&udata.i_datais%u,valueis%i\n",&udata.i_data,udata.i_data);udata.f_data=118.0;printf("&udata.f_datais%u,valueis%e\n",&udata.f_data,udata.f_data);printf("&udata.i_datais%u,valueis%i\n",&udata.i_data,udata.i_data);}3、共用体类型数据的特点1、每一瞬时只有一个成员起作用,其他的成员不起作用,即不是同时都存在和起作用。2、新存入的成员值覆盖原来成员的值,只有最近一次存放的成员起作用。3、共用体变量的地址与各个成员地址相同。4、由于只有一个成员起作用,故不能使用定义共用体变量时对它初始化。同样地,不能把共用体作为函数参数,也不能使函数返回值为共用体变量。程序输出程序运行情况:&udatais65498&udata.c_datais65498,valueisA&udata.i_datais65498,valueis114&udata.f_datais65498,valueis1.18000e+02&udata.i_datais65498,valueis0共用体应用举例

设有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、职务。根据职业(教师或学生)的不同,职务成员存放的值可以为职称(教师)或班级(学生)。从中可知,“职务”成员应该是共用体数据定义struct{intnum;charname[10];charsex;charjob;

union{intclass;charposition[10];}category;}person[2];共用体变量8.9枚举类型枚举:是指将变量的值一一列举出来,变量的值只限于列举出来值的范围内。举例

enum

weekday{sun,mon,tue,wed,thu,fri,sat};

其中:sun,mon...是枚举常量

enum

weekdayworkday,week_end;

其中:workday,...是枚举变量枚举常量不能对它赋值;枚举常量按定义时的顺序确定它们的值为:0,1,2,...可以改变枚举元素的值:enum

weekday{sun=7,mon=1,tue,wed,thu,fri,sat};应用举例

口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中取出3个球,问得到3中不同色的球可能取法,打印出每种组合的3种颜色。

分析:可以使用简单类型(1、2、...),使用枚举类型更直观。枚举变量

温馨提示

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

评论

0/150

提交评论