《结构体共用体和用户定义类型优秀PPT.ppt》由会员分享,可在线阅读,更多相关《结构体共用体和用户定义类型优秀PPT.ppt(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、结构体共用体和用户定义类型现在学习的是第1页,共28页结构体类型o结构体类型的定义形式:struct 结构体标识名 类型名1 结构体成员名表1;类型名2 结构体成员名表2;;struct date int year,month,day;struct student char name12;char sex;struct date birthday;float sc4;结构体类型占用字节数是成员项所占字节数的总和。现在学习的是第2页,共28页结构体类型变量的定义、赋值、使用o结构体类型的变量的定义(3种形式)1.紧跟在结构体类型说明之后进行定义。struct student char name1
2、2;char sex;struct date birthday;float sc4;s1,s2;2.结构体类型名可以省略。3.先说明一个结构体类型,再单独进行变量定义。struct student char name12;char sex;struct date birthday;float sc4;struct student s1,s2;现在学习的是第3页,共28页o结构体变量的赋值和使用 struct student char name12;char sex;struct date birthday;float sc4;s1=“Li Ming”,M,1962,5,10,88,76,85.
3、5,90;赋值时,依次给变量中的各个成员均赋值。printf(“%s,%c,%d,%d,%d,%f,%f,%f,%f”,s1.name,s1.sx,s1.birthday.year,s1.birthday.month,s1.birthday.day,s1.sc0,s1.sc1,s1.sc2,s1.sc3);结构体变量的引用:结构体变量名.成员名例1.struct person int ID;char name12;p;请将scanf(%d,);语句补充完整,使其能够为结构体变量p的成员ID正确读入数据。(2009年9月二级C真题)&p.ID现在学习的是第4页,共28页例2.下面结构体的定义语句
4、中,错误的是()。(2009年9月二级C真题)A)struct ord int x;int y;int z;struct ord a;B)struct ord int x;int y;int z;struct ord a;C)struct ord int x;int y;int z;a;D)struct int x;int y;int z;a;例3有以下程序#include main()struct STU char name9;char sex;double score2;struct STU a=Zhao,m,85.0,90.0,b=Qian,f,95.0,92.0);b=a;printf
5、(%s,%c,%2.0f,%2.0fn,b.name,b.sex,b.score0,b.score1);程序的运行结果是()。(2008年9月二级C真题)A)Qian,f,95,92 B)Qian,m,85,90 C)Zhao,f,95,92 D)Zhao,m,85,90 BD现在学习的是第5页,共28页例4.以下程序的运行结果是()main()struct EXAMPLE struct int x;int y;in;int a;int b;e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;printf(“%d,%d”,e.in.x,e.in.y);2,3
6、现在学习的是第6页,共28页结构体指针o结构体指针的定义 struct student*p,s;p=&s;p-name,p-sex;例1.若有以下说明语句:struct student int age;int num;std,*p;p=&std;则以下对结构体变量std中成员age的引用方式不正确的是()A.std.age B.p-age C.(*p).age D.*p.ageD现在学习的是第7页,共28页例2.设有如下定义:struct sk int n;float x;data,*p;若要使p指向data中的n域,则正确的赋值语句是()A.p=&data.n B.*p=data.nC.p=
7、(struct sk*)&data.n D.p=(struct sk*)data.nC现在学习的是第8页,共28页结构体数组的定义、赋值、使用o结构体数组的定义(3种形式)1.紧跟在结构体类型说明之后进行定义。struct student char name12;char sex;struct date birthday;float sc4;s3;2.结构体类型名可以省略。现在学习的是第9页,共28页3.先说明一个结构体类型,再单独进行变量定义。struct student char name12;char sex;struct date birthday;float sc4;struct s
8、tudent s12=“LiMing”,M,1962,5,10,88,76,85.5,90,“WangMei”,F,1980,5,3,42,51,23,56;o结构体数组的引用 s0.name,s0.sex,s0.birthday.month s1.name,s1.sex,s1.birthday.month现在学习的是第10页,共28页o例1.根据下面的定义,能打印出字幕M的语句是()struct person char name9;int age;struct person class10=“John”,17,”Paul”,19,”Mary”,18,”adam”,16;A.printf(“%
9、cn”,class3.name);B.printf(“%cn”,class3.name1);C.printf(“%cn”,class2.name1);D.printf(“%cn”,class2.name0);D现在学习的是第11页,共28页例1.已定义且初始化好结构体数组如上,计算平均成绩,并输出不及格学生的姓名。void main()int i;float ave,sum=0;printf(不及格学生有:n);for(i=0;i5;i+)sum+=si.score;if(si.scorenum B.p+C.(*p).num D.p=&stu.ageD现在学习的是第13页,共28页o例2.设有
10、以下定义和语句,以下引用形式不合法的是()struct s int i1;struct s*i2,*i0;static struct a3=2,&a1,0,4,&a2,&a0,6,0,&a1,*ptr;ptr=a;A.ptr-i1+B.*ptr-i2 C.+ptr-i0 D.*ptr-i1例3.设有如下定义:struct REC int num;char flag;char adr20;rec10,*pr=rec;下面各输入语句中错误的是()A.scanf(“%s”,&rec.adr);B.scanf(“%d”,&(*pr).num);C.scanf(“%c”,&(pr-flag);D.sca
11、nf(“%c”,&rec1.flag);DA现在学习的是第14页,共28页o例4.以下程序的输出结果是()struct stu int x;int*y;*p;int dt4=10,20,30,40;struct stu a4=50,&da0,60,&dt1,70,&dat2,80,&dt3;main()p=a;printf(“%d,”,+p-x);printf(“%d,”(+p)-x);printf(“%dn”,+(*p-y);A.10,20,20 B.50,60,21 C.51,60,21 D.60,70,31C现在学习的是第15页,共28页o例5.以下程序用来按学生姓名查询其排名和平均成绩
12、。查询可连续进行,直到输入0时结束。请填空。#define NUM 4struct studentint rank;char*name;float score;_ stu=3,”Tom”,89.3,4,”Mary”,78.2,1,”Jack”,95.1,2,”Jim”,90.6;main()char str10;int i;doscanf(“%s”,str);for(i=0;i=NUM)printf(“Not founen”);while(strcmp(str,”0”)!=0);struct studentstrcmp(str,stui.name)=0break;现在学习的是第16页,共28页
13、o例6.设有3人的姓名和年龄存在结构数组中,以下程序输出3人中年龄居中者的姓名和年龄。请填空。static struct man char name20;int age;person=“li-ming”,18,”wang-hua”,19,”zhang-ping”,20;main()int i,j,max,min;max=min=person0.age;for(i=1;imax)_;else if(personi.agemin)_;for(i=0;i3;i+)if(personi.age!=max _ if(personi.age!=min)printf(“%s%sn”,personi.name
14、,personi.age);break;max=personi.agemin=personi.age&现在学习的是第17页,共28页结构体普通变量做函数参数o结构体普通变量做实参时,形参也应是一个结构体变量,传递时将实参的值传递给形参,实参和形参占用不同的内存空间。例.以下程序的运行结果是()struct n int x;char c;void func(struct n);main()struct n a=10,x;func(a);printf(“%d,%c”,a.x,a.c);func(struct n b)b.x=20;b.c=y;10,x现在学习的是第18页,共28页结构体指针变量做实
15、参o例1.以下程序的输出结果是()struct abcchar c;float v;void fun1(struct abc b)b.c=A;b.v=80.7;void fun2(struct abc*b)(*b).c=C;(*b).v=92.5;void main()struct abc a=B,98.5;fun1(a);printf(“%c,%4.1fn”,a.c,a.v);fun2(&a);printf(“%c,%4.1fn”,a.c,a.v);B,98.5C,92.5现在学习的是第19页,共28页o例2.有下列程序:struct Sint n;int a20;void f(struct
16、 S*p)int i,j,t;for(i=0;in-1;i+)for(j=i+1;jn;j+)if(p-aip-aj)t=p-ai;p-ai=p-aj;p-aj=t;main()int i;struct S s=10,2,3,l,6,8,7,5,4,10,9;f(&s);for(i=0;is.n;i+)printf(%d,s.ai);程序运行后的输出结果是()。(2007年4月二级C真题)A)1,2,3,4,5,6,7,8,9,10,B)10,9,8,7,6,5,4,3,2,1,C)2,3,1,6,8,7,5,4,10,9,D)10,9,8,7,6,1,2,3,4,5,A现在学习的是第20页,
17、共28页结构体数组做参数o结构体数组做实参,形参可以是结构体数组或者结构体指针变量。例1.函数stdave的功能是:计算N个学生M门课的平均分,请填空。#define M 5#define N 30struct student int num;char name10;float scoreM;float ave;void stdave(struct student s,int n)int i,j;float sum;for(i=0;in;i+)sum=_;for(j=0;jM;j+)sum=sum+_;_=sum/M;void main()struct student persN;stdave
18、(pers,N);0persi.scorejpersi.ave现在学习的是第21页,共28页o例2:有以下程序的输出结果是:struct STU char name10;int num;float TotalScore;void f(struct STU*p)struct STU s2=“SunDan”,20044,550,“Penghua”,20045,537,*q=s;+p;+q;*p=*q;main()struct STU s3=“YangSan”,20041,703,“LiSiGuo”,20042,580;f(s);printf(“%s%d%3.0fn”,s1.name,s1.num,
19、s1.TotalScore);现在学习的是第22页,共28页用typedef定义类型otypedef int INTEGER;otypedef float REAL;o声明一个新的类型名的方法是:(1)先按定义变量的方法写出定义体(如 int i;)(2)将变量名换成新类型名。(3)在最前面加typedef。(4)用新类型名去定义变量。例如:struct abc char c;float v;st;等价于:typedef struct abcchar c;float v;S;等价于:typedef structchar c;float v;S;struct abc s1;等价于 S s1;现在
20、学习的是第23页,共28页o例2.以下对结构体变量st的定义中,不正确的是()A.struct char c;int a;st;B.struct char c;int a;TT;struct TT st;C.typedef structchar c;int a;TT;TT st;D.#define TT struct TTchar c;int a;st;例3.设有以下说明语句:Typedef struct int n;char ch8;PER;则下面叙述中正确的是()A.PER是结构体变量名 B.PER是结构体类型名C.Typedef struct 是结构体类型 D.struct是结构体类型名
21、BB现在学习的是第24页,共28页o例3.某学生的记录由学号、8门课程成绩和平均分组成,学号和8门 课程的成绩已在主函数中给出,请编写函数fun,其功能是:求出该学生的平均分,并放入记录的ave成员中。#define N 8typedef structchar num10;double sN;double ave;STREC;void fun(STREC*a)void main()STREC s=“GA005”,85.5,76,69.5,85,91,72,64.5,87.5;int i;fun(&s);printf(“%s”,s.num);for(i=0;iN;i+)printf(“%4.1f
22、n”,s.si);printf(“nave=%7.3fn”,s.ave);int i;double sum=0;for(i=0;isi;a-ave=sum/N;现在学习的是第25页,共28页使用union定义共用体类型o形式:union 共用体名成员表列变量表列;例如:union dataint i;char ch;float f;union data a,b,c;共用体类型所占字节数等于最大成员所占字节数。例1.下面程序的运行结果是()typedef unionlong a2;int b4;char c8;TY;TY our;main()printf(“%d”,sizeof(our);现在学
23、习的是第26页,共28页o例2.以下程序的运行结果是()union pwint i;char ch2;a;main()a.ch0=13;a.ch1=0;printf(“%dn”,a.i);A.13 B.14 C.208 D.209例3.已知字符0的ASC码味十六进制的30,现有程序如下:main()union unsigned char c;unsigned int i4;z;z.i0=0 x39;z.i1=0 x36;printf(“%cn”,z.c);A.6 B.9 C.0 D.3AB现在学习的是第27页,共28页链表形式:struct slistint data;struct slist*next;链表结构中结点的插入和删除。现在学习的是第28页,共28页