中国石油大学c语言课件第10章自定义数据类型.ppt_第1页
中国石油大学c语言课件第10章自定义数据类型.ppt_第2页
中国石油大学c语言课件第10章自定义数据类型.ppt_第3页
中国石油大学c语言课件第10章自定义数据类型.ppt_第4页
中国石油大学c语言课件第10章自定义数据类型.ppt_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

第10章自定义数据类型,回顾,编译预处理不带参数的宏定义带参数的宏定义,教学目标,理解为什么使用结构体定义结构体声明结构体变量访问结构体成员掌握结构体作为函数参数的用法了解共用体了解自定义数据类型,思考,在程序里表示一个人(姓名、年龄、性别、成绩),怎么表示?想表示多个人呢?如何用计算机程序实现下述表格的管理?,结构体简介,I.使用数组,解决方案:,score,num,sex,name,不能建立数组间的关系,II.使用多维数组,C语言不允许一个数组包含多种数据类型,III.使用结构体,C语言引入了称为结构体的数据存储方式,“结构体”是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构体的成员。,定义结构体2-1,structstructurenamedatatypevariable1;datatypevariable2;.;,结构体成员,;,结构体名,struct,student,intnum;,charname20;,charsex;,定义结构体,floatscore;,C语言中的有效数据类型,定义结构体2-2,structstudentintnum;charname20;charsex;floatscore;,num,name,sex,student,结构体定义并不预留内存,结构体定义放置在程序的开始部分,位于头文件声明之后,score,结构体定义仅描述了一个结构体的形式。如果要在程序里使用结构体,需要声明结构体变量。,声明结构体变量,声明结构体变量,structstudentintnum;charname20;charsex;floatscore;structstudentstudent1,student2;,I.先定义结构体,再声明结构体变量,structstudentintnum;charname20;charsex;floatscore;student1,student2;,II.在定义结构体类型的同时声明结构体变量,structintnum;charname20;charsex;floatscore;student1,student2;,III.直接声明结构体变量,声明一个类型为student结构体的变量,将会为该变量分配内存,大小是大于或等于其所有成员变量的大小之和。,structdateintmonth;intday;intyear;,嵌套结构体,structintnum;charname20;charsex;structdatebirthday;floatscore;student1,student2;,访问成员是通过成员的名字,称为“按名引用”。在程序中使用结构中成员的方法为:结构体变量名.成员名例如:student1.num、student2.sex、student1.birthday.month,structstudentstudent3=3,YaoMing,M,90.5;,结构体变量初始化,3,YaoMing,M,赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构体成员数目少。,student3.num,,student3.sex,90.5,student3.score,student1.num=1;scanf(%s,结构体变量赋值,1,ZhangZiLiang,M,用输入语句或赋值语句来给结构体变量的各个成员赋值,78,78,student2=student1;,1,ZhangZiLiang,M,78,strcpy(,ZhangSan);,结构体变量,如果要将“zhang”改为“zhong”,只要将结构变量student1中的数组成员name下标为2的元素a改为o即可。可以使用下列语句:2=o;/*为结构变量中的数组成员的一个元素赋值*/,结构体变量,对结构变量的整体操作要对结构进行整体操作有很多限制,C语言中能够对结构进行整体操作的运算不多,只有赋值“=”和取地址“/*结构变量整体赋值*/,结构体类型的引用,不能将一个结构变量作为一个整体直接访问。例如,已定义student1为结构变量并且已有值。不能这样引用:printf(%s,%c,%d,%d,%dn,student1);如果成员本身又是一个结构类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。例如,对上面定义的结构变量student1,可以这样访问各个成员:student1.sexstudent1.birthday.monthstudent1.birthday.daystudent1.birthday.year,问题描述:根据学员的成绩,输出不及格学员的详细信息。,使用结构体示例,#includestructstudentintnum;/学号char*name;/姓名charsex;/性别floatscore;/成绩;intmain()staticstructstudentstu1=1,李亚鹏,M,61;staticstructstudentstu2=2,周晶晶,F,92.5;staticstructstudentstu3=3,姚光明,M,59;printf(不及格学员的名单如下:n);if(stu1.score=60,不及格学员的名单如下:,3姚光明M59.00,1,李亚鹏,M,78,2,周晶晶,F,92,3,姚光明,M,59,structstu*pstu;(*pstu).num或者:pstu-num,结构体指针变量,一个指针当用来指向一个结构体时,称之为结构体指针变量。结构体指针变量中的值是所指向的结构体变量的首地址。结构体指针变量声明的一般形式为:struct结构体名*结构体指针变量名通过结构体指针可以访问该结构体变量的成员,一般形式为:(*结构体指针变量).成员名或者结构体指针变量-成员名,#includestructstudentintnum;char*name;charsex;floatscore;stu=1,张宾,F,55,*pstu;intmain()pstu=,学号:1姓名:张宾性别:F成绩:55.00学号:1姓名:张宾性别:F成绩:55.00学号:1姓名:张宾性别:F成绩:55.00Pressanykeytocontinue,structstudentintnum;char*name;charsex;floatscore;stu30;,结构体数组,元素为结构体类型的数组称为结构体数组。在实际应用中,经常用结构体数组来表示具有相同数据结构体的一个群体。例如一个班的学员档案,一个公司的职工档案等。,定义了一个结构体数组stu1,共有30个元素,stu0stu29。每个数组元素都具有structstudent的结构体形式。,问题描述:求学员的总成绩和平均成绩,并统计不及格人数。,结构体指针变量,structstudentintnum;char*name;charsex;floatscore;stuN=1,李芳,F,45,2,于红,F,62.5,3,何万山,M,92.5,4,程亚丽,M,87,5,王明,M,58;intmain()inti,count=0;floatave,sum=0;for(i=0;imonth=5;p-day=22;,intmain()structdated;d.year=1999;d.month=4;d.day=23;printf(“%d,%d,%dn”,d.year,d.month,d.day);func(,1999,4,23,2000,5,22,结构体成员作为函数参数,structfilmcharname25;/电影名chardirector25;/导演intduration;/片长;voiddisplay(char*,char*,int*);intmain()structfilmf1;printf(nt请输入电影的详细信息);printf(nn请输入影片名:);gets();fflush(stdin);printf(n请输入导演姓名:);gets(f1.director);fflush(stdin);printf(n请输入电影片长(分钟):);scanf(%d,voiddisplay(char*n,char*d,int*m)printf(nt电影的详细信息n);printf(n片名:%s,n);printf(n导演:%s,d);printf(n片长:%dn,*m);,前两个参数为字符串,所以不使用/*此结构体表示梯形*/structtrapezoiddoubleheight;/梯形的高度doubleside1;/梯形的上底doubleside2;/梯形的下底;intmain()structtrapezoidtrap;doubletotal_area;/*接受用户输入的详细信息*/printf(n请输入梯形的详细信息n);printf(高度:);scanf(%lf,传值方式与引用方式的区别,#include/*声明一个以结构体体指针作为参数的函数*/doublearea(structtrapezoid*trap1);/*此结构体表示梯形*/structtrapezoiddoubleheight;/梯形的高度doubleside1;/梯形的上底doubleside2;/梯形的下底;intmain()structtrapezoidtrap;doubletotal_area;/*接受用户输入的详细信息*/printf(n请输入梯形的详细信息n);printf(高度:);scanf(%lf,传值方式与引用方式的区别,动态数据结构,结构体声明时不能包含自我,但可以包含指向本结构体类型的指针变量链表(Linkedtable),structLinkintdata;structLink*next;,共用体,共用体(Union)又称联合体,是将不同的数据类型组合在一起,共同占有一段内存的用户自定义数据类型。,unionnumbershortx;charch;floaty;基本上和struct一样x、ch和y处于同样的地址sizeof(unionnumber)取决于占空间最多的那个成员变量,同一内存单元在每一瞬时只能存放其中一种类型的成员;起作用的成员是最后一次存放的成员不能作为函数参数,共用体的应用,structpersoncharname20;charsex;intage;unionintsingle;structcharspouseName20;intchild;married;structdatedivorcedDay;marital;intmarryFlag;,unionintsingle;structcharspouseName20;intchild;married;structdatedivorcedDay;marital;,structcharspouseName20;intchild;married;,共用体和结构体的区别,共用体与结构体都是由多个成员分量组成的一个整体;共用体与结构体在定义、说明和使用(成员引用、指针)上十分相似。结构体:多个成员分量分别占用不同的存储空间构成一个整体;成员分量之间是相互独立的,所进行的各种操作互不影响。共用体:多个成员分量共同占用同一存储空间;成员分量之间是相互联系的,所进行的操作相互依赖。,用户自定义类型,标准类型(如int、char、long、double等):系统已经定义好的类型,用户可以直接使用,无须再进行定义。用户自定义类型:用户根据自己的实际要求,自己定义的新的数据类型。除结构和联合等类型之外,还可以用类型说明语句typedef定义新的类型来代替已有的类型。,用户自定义类型,一般用在结构体类型的重定义上则structstudents1;与STUs1;具有相同的作用。,typedefstructstudentintnum;charname20;charsex;structdatebirthday;floatscore;STU;,用typedef定义数据类型,一般形式:typedef已定义的类型新的类型typedefintINTEGER;typedeffloatREAL;在具有上述typedef语句的程序中,下列语句就是等价的:inti,j;等价于INTEGERi,j;floatpai;REALpai;,总结2-1,结构体是由若干数据项组合而成的复杂数据对象,这些数据项称为结构体的成员。定义一个结构体,需要给出各个成员的类型及名称。结构体定义仅描述了一个结构体的形式。要在程序里使用结构体,需要声明结构体

温馨提示

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

评论

0/150

提交评论