C语言培训教材课件第8章.ppt

上传人:max****ui 文档编号:11544805 上传时间:2020-04-28 格式:PPT 页数:49 大小:475KB
返回 下载 相关 举报
C语言培训教材课件第8章.ppt_第1页
第1页 / 共49页
C语言培训教材课件第8章.ppt_第2页
第2页 / 共49页
C语言培训教材课件第8章.ppt_第3页
第3页 / 共49页
点击查看更多>>
资源描述
1,第8章结构体与共用体,C语言程序设计,烟台大学计算机学院,刘培华,2020/4/28,2,第8章结构体与共用体,8.1结构体8.2共用体8.3枚举类型与类型命名,2020/4/28,3,一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。一本图书的信息有分类编号、书名、作者、出版社、出版日期、价格、库存量等。如何描述这些类型不同的相关数据?,8.1结构体,8.1.1结构体与结构体类型的定义,?,信息管理,结构体一种构造类型数据结构体由若干不同类型的数据项组成,构成结构体的各个数据项称为结构体成员。,2020/4/28,4,struct结构体名数据类型1成员名1;数据类型2成员名2;数据类型n成员名n;,8.1结构体,8.1.1结构体与结构体类型的定义,结构体类型定义的一般形式:,struct为关键字;结构体名是用户定义的类型标识。中是组成该结构体的成员。成员的数据类型可以是C语言所允许的任何数据类型。,2020/4/28,5,例如图书类型的定义:structbookcardcharnum10;/*图书分类编号是字符数组类型*/charname30;/*书名是字符数组类型*/charauthor30;/*作者是字符数组类型*/charpublisher60;/*出版社是字符数组类型*/floatprice;/*价格是单精度实型*/intn;/*库存量是整型*/;,例如学生类型的定义:structstudentcharnum8;/*学号是字符数组类型*/charname30;/*姓名是字符数组类型*/charsex;/*性别是字符型*/intage;/*年龄是整型*/charaddr60;/*住址是字符数组类型*/intscore6;/*成绩是整型数组类型*/;,8.1结构体,8.1.1结构体与结构体类型的定义,2020/4/28,6,8.1结构体,8.1.2结构体变量的定义与初始化,1.结构体类型变量的定义,利用已定义的结构体类型名定义变量struct结构体名变量名表;例如:structbookcardbook1100;structstudents30,t1,t2;,按照结构体类型的组成,系统为定义的结构体变量分配内存单元。结构体变量的各个成员在内存中占用连续存储区域,结构体变量所占内存大小为结构体中每个成员所占用内存的长度之和。,2020/4/28,7,8.1结构体,结构体类型与变量的说明,类型与变量是不同的概念。应先定义一个结构体类型,而后再定义结构体变量。系统对类型不分配空间,仅对变量分配空间。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。,成员也可以是结构变量。对结构中的成员,可以单独使用,它的作用与地位相当于普通变量。成员名可与程序中的变量名相同时,也可与不同结构体类型的成员名相同,二者代表不同的对象。,structdateintyear,month,day;structstudentcharnum8;charname30;charsex;structdatebirthday;/*成员为结构体类型*/charaddr60;intscore6;,2020/4/28,8,8.1结构体,8.1.2结构体变量的定义与初始化,1.结构体类型变量的定义,在定义结构体类型的同时定义变量,例如:structstudentcharnum8,name20,sex;intage;floatscore;st30;,struct结构体名成员定义表;变量名表;,2020/4/28,9,8.1结构体,8.1.2结构体变量的定义与初始化,1.结构体类型变量的定义,直接定义结构体类型变量,例如:structcharnum8,name20,sex;intage;floatscore;st30,a,b,c;,struct成员定义表;变量名表;,2020/4/28,10,8.1结构体,8.1.2结构体变量的定义与初始化,2.结构体变量的初始化,【例8.4】结构体变量的初始化。structdateintyear,month,day;structstudentcharnum8,name20,sex;structdatebirthday;floatscore;a=9606011,Liming,M,1977,12,9,83,b=9608025,Zhangliming,F,1978,5,10,87,c;,如果初值个数少于结构体成员个数,则将无初值对应的成员赋以0值。如果初值个数多于结构体成员个数,则编译出错。,2020/4/28,11,8.1结构体,8.1.2结构体变量的定义与初始化,2.结构体变量的初始化,【例8.5】结构体数组的初始化。structscharnum8,name20,sex;floatscore;stu3=9606011,Liming,M,87.5,9606012,Zhangjiangguo,M,79,9606013,Wangping,F,90;,元素的个数可以省略,根据赋初值时结构体常量的个数确定数组元素的个数,2020/4/28,12,8.1结构体,8.1.2结构体变量的定义与初始化,3.结构体变量的运算,用sizeof运算符计算结构体变量所占内存空间,structdateintyear,month,day;structstudentcharnum8,name20,sex;structdatebirthday;floatscore;a;,sizeof(a)的结果为8+20+1+6+4=39sizeof(structstudent)的结果为39,2020/4/28,13,8.1结构体,8.1.2结构体变量的定义与初始化,3.结构体变量的运算,同类型结构体变量之间的赋值运算,结构体变量之间进行赋值时,系统将按成员一一对应赋值。,structdateintyear,month,day;structstudentcharnum8,name20,sex;structdatebirthday;floatscore;a=9606011,Liming,M,1977,12,9,83,b,c;c=a;,2020/4/28,14,8.1结构体,8.1.2结构体变量的定义与初始化,3.结构体变量的运算,对结构体变量进行取址运算,structdateintyear,month,day;structstudentcharnum8,name20,sex;structdatebirthday;floatscore;a;,对结构体变量a进行;structstudentcharnum8,name20,sex;structdatebirthday;floatscore;a;,“.”是分量运算符,运算级别最高。,a.birthday.yeara.birthday.montha.birthday.day,结构体变量的各个成员可进行何种运算,由该成员的数据类型决定,2020/4/28,16,8.1结构体,8.1.2结构体变量的定义与初始化,【例8.6】编写一个统计选票的程序。structcandidatecharname20;/*name为候选人姓名*/intcount;/*count为候选人得票数*/list=invalid,0,Zhao,0,Qian,0,Sun,0,Li,0,Zhou,0;,2020/4/28,17,8.1结构体,8.1.2结构体变量的定义与初始化,main()inti,n;printf(Entervoten);scanf(%d,/*输入所投候选人编号*/,2020/4/28,18,9.1结构体,9.1.2结构体变量的定义与初始化,for(i=1;iyearp-monthp-day,“-”是指向结构体成员运算符,优先级为一级,2020/4/28,21,8.1结构体,8.1.3结构体的指针,【例】输入今天的日期,然后输出该日期。main()structdate/*在函数中定义结构体类型*/intyear,month,day;today,*p=,2020/4/28,22,结构体类型解决了如何描述一个逻辑上相关,但数据类型不同的一组分量的集合。在需要节省内存储空间时,c语言还提供了一种由若干个不同类型的数据项组成,但共享同一存储空间的构造类型。,8.2共用体,8.2.1共用体与共用体类型的定义,共用体一种构造类型数据共用体由若干不同类型的数据项组成,构成共用体的各个数据项称为共用体成员。,由于共享的特性,只有最新存储的数据是有效的。,2020/4/28,23,union共用体名数据类型1成员名1;数据类型2成员名2;数据类型n成员名n;,8.2共用体,8.2.1共用体与共用体类型的定义,共用体类型定义的一般形式:,union为关键字;共用体名是用户定义的类型标识。中是组成该共用体的成员。成员的数据类型可以是C语言所允许的任何数据类型。,2020/4/28,24,例如:unionutypeinti;charch;longl;charc4;,8.2共用体,8.2.1共用体与共用体类型的定义,定义了一个unionutype共用体类型,共用体类型定义不分配内存空间,只是说明此类型数据的组成情况。,2020/4/28,25,8.2共用体,8.2.2共用体变量的定义与初始化,1.共用体变量的定义,利用已定义的共用体类型名定义变量union共用体名变量名表;例如:unionutypeu1,u2;,按照共用体类型的组成,系统为定义的共用体变量分配内存单元。共用体变量所占内存大小等于共用体中占用内存的长度最长的成员。,2020/4/28,26,8.2共用体,8.2.2共用体变量的定义与初始化,1.共用体变量的定义,在定义共用体类型的同时定义变量,例如:unionutypeinti;charch;longl;charc4;a,b,c;,union共用体名成员定义表;变量名表;,2020/4/28,27,8.2共用体,8.2.2共用体变量的定义与初始化,1.共用体变量的定义,直接定义共用体类型变量,例如:unioninti;charch;longl;charc4;a,b,c;,union成员定义表;变量名表;,2020/4/28,28,8.2共用体,8.2.2共用体变量的定义与初始化,2.共用体变量的运算,用sizeof运算符计算共用体变量所占内存空间,unionutypeinti;charch;longl;charc4;a,b,c;,sizeof(a)的结果为4sizeof(unionutype)的结果为4,2020/4/28,29,8.2共用体,8.2.2共用体变量的定义与初始化,2.共用体变量的运算,同类型共用体变量之间的赋值运算,共用体变量之间进行赋值时,系统仅赋当前有效成员的值(即最新存储的数据)。,unionutypeinti;charch;longl;charc4;a,*p=,对共用体变量进行取址运算,2020/4/28,30,8.2共用体,8.2.2共用体变量的定义与初始化,3.共用体变量成员的引用,共用体变量成员的引用有三种形式。,例如:unionucharu1;intu2;x,*p=,用共用体变量名的引用形式:x.u1x.u2,用共用体指针变量的引用形式:(*p).u1(*p).u2p-u1p-u2,2020/4/28,31,8.2共用体,8.2.2共用体变量的定义与初始化,4.共用体变量赋初值,【例8.18】共用体变量赋初值。unionucharu1;intu2;main()unionua=0 x9741;printf(1.%c%xn,a.u1,a.u2);a.u1=a;printf(2.%c%xn,a.u1,a.u2);,共用体类型变量在定义时只能对第一个成员进行赋初值。由于第一个成员是字符型,用一个字节,所以对于初值0 x9741仅能接受0 x41,初值的高字节被截去。,1.A41,2.a61,2020/4/28,32,8.2共用体,8.2.2共用体变量的定义与初始化,main()unionlongn;intk;charc;un;un.n=0 x12345678;printf(%lxn,un.n);printf(%xn,un.k);printf(%xn,un.c);un.c=A;printf(%ldn,un.n);printf(%dn,un.k);printf(%cn,un.c);,12345678,5678,78,305419841,22081,A,2020/4/28,33,enum是关键字;枚举名和枚举常量是标识符;枚举常量之间用逗号分隔。,例如:enumweekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;enumcolor1blue,green,red;enumflagfalse,true;,8.3枚举类型与类型命名,8.3.1枚举类型,1.枚举类型的定义,枚举类型定义的一般形式:enum枚举名枚举常量取值表;,枚举是一个具有有限个整型符号常量的集合,这些整型符号常量称为枚举常量。每个枚举类型都必须进行类型的定义,定义时必须将其所有的枚举常量一一列举,以便限定此枚举类型变量的取值范围。,2020/4/28,34,在枚举类型中,每个枚举常量都代表一个整型值。在定义枚举类型的同时可隐式或显式地定义枚举常量所代表的值。,例如:enumweekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;,8.3枚举类型与类型命名,8.3.1枚举类型,2.枚举常量的整型值,隐式定义:按照类型定义时枚举常量列举的顺序分别代表0、1、2、等整型值。,0,1,2,3,4,5,6,2020/4/28,35,例如:enumopplus=43,minus=45,multiply=42,divide=47;enumworkdayMon=1,Tue,Wed,Thu,Fri;,8.3枚举类型与类型命名,8.3.1枚举类型,2.枚举常量的整型值,显式定义:在定义类型的同时指定枚举常量的值,其中如有未指定值的枚举常量,则根据前面的枚举常量的值依次递增1。,2,3,4,5,2020/4/28,36,例如:enumflagfg;enumcolor1c1;enumcolor2blank,brown,yellow,whitec2;enumlightblue,lightgreen,lightredc3;,8.3枚举类型与类型命名,8.3.1枚举类型,3.枚举变量的定义,枚举类型变量定义的三种形式:enum枚举名枚举变量名表;enum枚举名枚举常量取值表枚举变量表;enum枚举常量取值表枚举变量表;,2020/4/28,37,赋值运算fg=true;c1=red;c2=yellow;c3=lightblue;c3=white;,8.3枚举类型与类型命名,8.3.1枚举类型,4.枚举数据的运算,用sizeof运算符计算枚举变量所占内存空间,枚举变量中存放的是整型值,每个枚举变量占用2个字节,是enumcolor2类型的枚举值,2020/4/28,38,取址运算enumcolor2blank,brown,yellow,whitec2;enumflagfg;printf(%d,fg);,2020/4/28,40,switch(fg)casefalse:printf(false);break;casetrue:printf(true);,8.3枚举类型与类型命名,8.3.1枚举类型,5.枚举数据的输入输出,枚举变量的输出,方法二:利用多分支选择语句输出枚举常量对应的字符串。,2020/4/28,41,enumflagfalse,truefg;char*name=false,true;fg=true;printf(%s,namefg);,8.3枚举类型与类型命名,8.3.1枚举类型,5.枚举数据的输入输出,枚举变量的输出,方法三:依据枚举值,运用指针方法输出对应的字符串。,2020/4/28,42,fg=true;printf(%s,fg);,8.3枚举类型与类型命名,8.3.1枚举类型,5.枚举数据的输入输出,枚举变量的输出,枚举常量是标识符,不是字符串,以输出字符串方式输出枚举常量是错误的。,2020/4/28,43,8.3枚举类型与类型命名,8.3.1枚举类型,【例8.20】编制一个程序。当输入今天的星期序号后,输出明天是星期几。enumweekdayMon=1,Tue,Wed,Thu,Fri,Sat,Sun;char*name8=error,Mon,Tue,Wed,Thu,Fri,Sat,Sun;,2020/4/28,44,8.3枚举类型与类型命名,8.3.1枚举类型,main()enumweekdayd;printf(Inputtodaysnumeral(1-7):);scanf(%d,2020/4/28,45,8.3枚举类型与类型命名,8.3.2类型的重新命名,1.为类型名定义别名,为类型名定义别名的一般形式:typedef类型名新类型名或typedef类型定义新类型名,用typedef为已存在的类型名再命名一个新的类型名(即别名)。,typedef是关键字;类型名可以是基本类型、构造类型、指针类型或自定义类型名;新类型名是自定义的类型名。,2020/4/28,46,8.3枚举类型与类型命名,8.3.2类型的重新命名,typedefintCOUNTER;/*定义COUNTER为整型类型名*/typedefstructdateintyear;intmonth;intday;DATE;/*定义DATE为structdate结构体类型名*/,新类型名与旧类型名作用相同,并且可同时使用。,inti;与COUNTERi;等价。structdatebirthday;与DATEbirthday;等价。,2020/4/28,47,8.3枚举类型与类型命名,8.3.2类型的重新命名,2.为类型命名的方法,为基本类型命名例如:typedeffloatREAL;REALx,y;/*相当于floatx,y;*/,以typedef开头,加上变量定义的形式,并用新类型名替代变量名。,为数组类型命名例如:typedefcharCHARR80;CHARRc,d4;/*相当于charc80,d480;*/,2020/4/28,48,8.3枚举类型与类型命名,8.3.2类型的重新命名,2.为类型命名的方法,为指针类型命名例如:typedefint*IPOINT;IPOINTip;/*相当于int*ip;*/IPOINT*pp;/*相当于int*pp;*/,typedefint(*FUNpoint)();FUNpointfunp;/*相当于int(*funp)();*/,2020/4/28,49,8.3枚举类型与类型命名,8.3.2类型的重新命名,2.为类型命名的方法,为结构体、共用体类型命名例如:structnodecharc;structnode*next;typedefstructnodeCHNODE;CHNODE*p;/*相当于structnode*p;*/,structCHNODE*p;,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


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

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


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