结构体共用体和用户定义的数据类型.ppt

上传人:zhu****ei 文档编号:3523073 上传时间:2019-12-17 格式:PPT 页数:38 大小:437KB
返回 下载 相关 举报
结构体共用体和用户定义的数据类型.ppt_第1页
第1页 / 共38页
结构体共用体和用户定义的数据类型.ppt_第2页
第2页 / 共38页
结构体共用体和用户定义的数据类型.ppt_第3页
第3页 / 共38页
点击查看更多>>
资源描述
全国计算机等级考试二级教程C语言程序设计,计算中心-NEUComputingCenter,敖志广azg,1typedef,说明一种新的类型名,typedefintINTEGER;INTEGERm,n;intm,n;,typedefchar*CHAR;CHARp;char*p;,2定义,在实际问题中我们常需要把不同类型的几个数据组合起来,构成一个整体。如一个公司职员的个人信息,或学校中教师和学生的信息。以学生信息为例,它可能包括学生的学号、班级、姓名、性别、年龄、成绩等。这时原有的那些数据类型就显的有点无能为力了,所以引入一种新的数据类型-结构体。,结构体是由一些逻辑相关,但数据类型不同的分量组成的一组数据。,注意:用户需要先定义结构体类型,之后才能定义结构体变量,注意不要忘了分号,关键字,用户定义的标识符,一、定义结构体变量1.先定义结构体类型,再定义变量structstudentcharname10;intage;floats1,s2;structstudentst1,st2;,nameages1s2,nameages1s2,结构体变量st1和st2各自都需要20个字节的存储空间,2.定义结构体类型同时定义变量structstudentcharname10;intage;floats1,s2;st1,st2;,3.直接定义结构体变量structcharname10;intage;floats1,s2;st1,st2;,4.说明:(1)结构体变量具有结构体类型的一切特征在内存中结构体变量占有一片连续的存储单元存储单元的字节数可用sizeof运算符算出printf(“%dn”,sizeof(structstudent);printf(“%dn”,sizeof(st1);,(2)结构体类型可以嵌套定义例:structdateintyear;intmonth;intday;structstudcharname10;structdatebirthday;floats1,s2;,或:structstudcharname10;structdateintyear;intmonth;intday;birthday;floats1,s2;,3结构体变量的初始化,structstudentcharname10;intage;floatscore1,score2;st1=“Mary”,21,78,86;,structstudcharname10;structdatebirthday;floatscore1,score2;structstudst2=“John”,1980,11,23,89,95;,structstudentcharname10;intage;floatscore1,score2;structstudentst3;st3=“Mary”,21,78,86;,这是初始化,正确,错误,C不允许这样赋值,4结构体变量的引用,1.引用结构体变量中的成员格式:结构体变量名.成员名,structstudentcharname10;intage;floats1,s2;,注意:一般是对结构体变量的各个成员分别进行赋值st1=“Mary”,21,78,86;这样的赋值是不允许的,structstudentst1;st1.name=“Mary”;st1.age=21;st1.s1=78;st1.s2=86;,4.使用结构体,结构成员的引用结构作为若干成员的集合是一个整体可对结构整体进行操作可访问结构中的每个成员使用结构中成员的方法结构变量名.成员名称运算符“.”的含义是访问结构中的成员“.”操作的优先级最高结合性为从左到右指针变量名-成员名在结构体指针变量情况下使用运算符“-”,structdateintyear;intmonth;intday;structstudcharname10;intage;structdatebirthday;floats1,s2;,structstudst2;intage,year;st2.name=“John”;st2.age=20;st2.birthday.year=1980;st2.birthday.month=11;st2.birthday.day=23;st2.s1=89;st2.s2=95;age=24;year=2000;,可以定义与结构体变量成员名相同名字的变量它们之间不会发生混乱,2.相同类型的结构体变量可以进行整体赋值,structdateintyear;intmonth;intday;structstudcharname10;intage;structdatebirthday;floats1,s2;,structstudst1,st2,st3;st1.name=“John”;st1.age=20;st1.birthday.year=1980;st1.birthday.month=11;st1.birthday.day=23;st1.s1=89;st1.s2=95;st2=st1;st3.name=“Mary”;st3.age=20;st3.birthday=st1.birthday;st3.s1=76;st3.s2=85;,3.结构体变量的输入输出C语言不允许结构体变量整体进行输入和输出,只能对结构体变量的成员进行输入和输出,gets(st1.name);scanf(“%d%d%d”,5结构体数组,一、结构体数组的定义1.先定义结构体类型再定义结构体数组structstudentcharname10;intage;floats1,s2;structstudentst6;,2.定义结构体类型的同时定义数组structstudentcharname10;intage;floats1,s2;st6;,3.直接定义结构体数组structcharname10;intage;floats1,s2;st6;,二、结构体数组的初始化将每个数组元素的数据用花括号括起来,structstudentcharname10;intage;floats1,s2;structstudentst3=“Mary”,21,78,86,“Alex”,20,90,80,“Mike”,19,75,68;,2.数组元素之间可以整体赋值也可以将一个元素赋给一个相同类型的结构体变量structstudentx,st3=“Mary”,21,78,86,“Alex”,;st2=st0;x=st1;,3.只能对数组元素的成员进行输入和输出,gets(st2.name);scanf(“%d”,三、结构体数组的引用1.引用某个数组元素的成员例:puts(st0.name);printf(“%d,%d”,st1.age,st1.s1);,例:有30名学生,输入每个学生信息包括学号、姓名、成绩,要求找出成绩最高者,并输出他的信息,#include#defineN30voidmain()structstudentintn;charname10;intscore;structstudentstN;inti,m;intmax;for(i=0;iN;i+)scanf(“%d%s%d”,max=st0.score;for(i=1;imax)max=sti.score;m=i;printf(“%4d”,stm.n);printf(“%10s”,stm.name);printf(“%5d”,stm.score);,例:按成绩对学生信息进行从高到底的排序,#include#defineN30,voidmain()structstudintn;charname10;ints;structstudstN,temp;inti,j,k;for(i=0;is2=90;,(2)(*指针变量名).成员名(*p).age,(3)指针变量名-成员名p-s1,p只能指向一个结构体变量,如:p=intage;*p;则表达式:+p-age:表示age的值增加1。等价于+(p-age),使用结构体指针变量应注意以下几点:p不是结构体变量(是指向结构体变量的指针),因此不能写成成员引用方式p.age的形式。,二、指向结构体数组的指针1.定义structstudentst3,*p;2.使用for(p=st;pname);scanf(“%d%d%d”,对于指向结构体数组的指针:p只能指向一个结构体数组的一个元素(相当于变量),然后用-指向运算符取其成员的值,而不能直接指向一个数组元素的成员。(+p)-age:表示p指针指向下一个数组元素后,再访问其成员age。(p+)-age:先访问age操作,再对指针p加1。,结构体变量作为函数参数1.函数的实参和形参都用结构体变量,参数之间为值传递即:实参结构体变量各成员的值依次传给形参结构体变量,2.返回结构体类型值的函数函数定义格式:结构体类型名函数名(形参表列)函数体;例:structstudentfunct(intx,floaty)函数体;,注意结构体类型是已经定义好的,三、结构体与函数,注意结构变量作为参数传递时,其实参与形参的结构类型必须一致,传递时其实参只需指定其结构变量名即可。当实参为数组时,其形参可以定义为同类型结构的结构数组或结构指针。,与普通变量一样,结构变量在函数内部定义时为局部的,其值只在本函数范围内有效,不会影响其它函数将结构传递给函数的方式有三种传递单个成员传递整个结构传递指向结构的指针传递结构变量的地址可以实现结构的传址调用。结构数组也可作为函数参数传递。,在调用print时,charname20;floatscore;main()voidprint();structstudentstud;stud.num=1001;strcpy(stud.name,”michell”);stud.score=90.9;print(,例:求学生成绩的总分和平均分#include#defineN5structstudcharname10;ints3;floatsum,ave;,structstudcomp(structstudx)intj;x.sum=0;for(j=0;j3;j+)x.sum=x.sum+x.sj;x.ave=x.sum/3;return(x);,voidmain()structstudaN;intj;for(j=0;jN;j+)scanf(“%s%d%d%d”,例:按成绩对学生信息进行从高到底的排序,#include#defineN30structstudintn;charname10;ints;,voidinput(structstuda)inti;for(i=0;iN;i+)scanf(“%d%s%d”,voidoutput(structstuda)inti;for(i=0;iN;i+)printf(“%4d%10s%4d”,ai.n,ai.name,ai.s);,voidsort(structstuda)inti,j,k;structstudtemp;for(i=0;iN-1;i+)k=i;for(j=i+1;jscore);p=p-next;,2010,1428,1570,2010,1951428,2861570,382NULL,2010,1428,1570,NULL,2010,1428,2010,1570,2,3.链表的删除ST*del(ST*head,intnum)ST*p1,*p2;p1=head;while(num!=p1-num),4.链表的插入ST*insert(ST*head)ST*p0,*p1,*p2;p1=head;p0=(ST*)malloc(LEN);scanf(“%d%d”,4,2680,2010,2010,475,1428,1570,1428,2680,1570,4,2680,2010,175,插入的结点作为表头,2010,2680,4,2680,2010,875,插入的结点作为表尾,NULL,2010,1428,1428,1570,2680,5.main函数voidmain()ST*h;intdelnum;h=creat();list(h);scanf(“%d”,/*建立一个链表*/,/*输出链表*/,/*输入要删除的学号*/,/*删除学号为delnum的结点*/,/*在链表中插入一个结点*/,
展开阅读全文
相关资源
相关搜索

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


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

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


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