c语言基础课件10.结构.ppt

上传人:sccc 文档编号:5342362 上传时间:2023-06-27 格式:PPT 页数:38 大小:2.79MB
返回 下载 相关 举报
c语言基础课件10.结构.ppt_第1页
第1页 / 共38页
c语言基础课件10.结构.ppt_第2页
第2页 / 共38页
c语言基础课件10.结构.ppt_第3页
第3页 / 共38页
c语言基础课件10.结构.ppt_第4页
第4页 / 共38页
c语言基础课件10.结构.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《c语言基础课件10.结构.ppt》由会员分享,可在线阅读,更多相关《c语言基础课件10.结构.ppt(38页珍藏版)》请在三一办公上搜索。

1、第十章,结构,回顾,字符串与字符数组的区别是字符串的末尾有一个空字符0以标识字符串结束。用scanf()语句读入字符串时不允许输入中存在空格。gets()和 puts()函数分别用于字符串的输入和输出。在 string.h 中定义了很多字符串处理函数函数,比较常用的有:strcpy()、strcat()、strcmp()和 strlen()。假如程序里需要一组字符串,一种常用的做法就是用一个字符指针数组表示它们。字符串可以作为参数,函数传递机制同数组作为参数,为传址方式。,目标,理解为什么使用结构定义结构声明结构变量访问结构成员掌握结构作为函数参数的用法,本章结构,结构简介,结构体,结构数组,

2、使用结构,结构作为函数参数,实现堆栈,结构简介,存储一个班级中 5 名学员的信息(学号、姓名、性别和成绩),问题:,I.使用数组,解决方案:,score,num,sex,name,不能建立数组间的关系,II.使用多维数组,C 语言不允许一个数组包含多种数据类型,III.使用结构,C 语言引入了称为结构的数据存储方式,“结构”是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。,定义结构2-1,struct structurenamedatatype variable1;datatype variable2;.;,结构成员,;,结构名,struct,studen

3、t,int num;,char name20;,char sex;,定义结构,float score;,C 语言中的有效数据类型,定义结构2-2,struct student int num;char name20;char sex;float score;,num,name,sex,student,结构定义并不预留内存,结构定义放置在程序的开始部分,位于头文件声明之后,score,结构定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构变量。,声明结构变量,声明结构变量,struct student int num;char name20;char sex;float score

4、;struct student student1,student2;,I.先定义结构,再声明结构变量,struct student int num;char name20;char sex;float score;student1,student2;,II.在定义结构类型的同时声明结构变量,struct int num;char name20;char sex;float score;student1,student2;,III.直接声明结构变量,声明一个类型为 student 结构的变量,将会为该变量分配内存,大小是大于或等于其所有成员变量的大小之和。,struct date int mon

5、th;int day;int year;,嵌套结构,struct int num;char name20;char sex;struct date birthday;float score;student1,student2;,表示结构变量成员的一般形式是:结构变量名.成员名例如:student1.num、student2.sex、student1.birthday.month,struct student student3=3,Yao Ming,M,90.5;,结构变量初始化,3,Yao Ming,M,赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构成员数目少。,stud

6、ent3.num,student3.name,student3.sex,90.5,student3.score,student1.num=1;student1.name=Zhang Zi Liang;student1.sex=M;printf(请输入成绩:n);scanf(%f,结构变量赋值,1,Zhang Zi Liang,M,用输入语句或赋值语句来给结构变量的各个成员赋值,78,78,student2=student1;,1,Zhang Zi Liang,M,78,说明结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体可嵌套结构体成员

7、名与程序中变量名可相同,不会混淆,引用规则 结构体变量不能整体引用,只能引用变量成员,可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用,成员(分量)运算符优先级:1结合性:从左向右,引用方式:结构体变量名.成员名,结构体变量的引用,形式一:,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 结构体变量=初始数据;,例 struct student int num;char name20;char sex;int age;char addr30;struct student stu1=112,“Wang Lin”,M,19,“200 Bei

8、jing Road”;,结构体变量的初始化,形式二:,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;,例 struct student int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,形式三:,struct 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;,例 struct int num;char name20;char sex;int age;char addr30;stu1=112,“Wang

9、 Lin”,M,19,“200 Beijing Road”;,问题描述:根据学员的成绩,输出不及格学员的详细信息。,使用结构示例,#includestruct studentint num;/学号char*name;/姓名char sex;/性别float score;/成绩;void main()static struct student stu1=1,李亚鹏,M,61;static struct student stu2=2,周晶晶,F,92.5;static struct student stu3=3,姚光明,M,59;printf(不及格学员的名单如下:n);if(stu1.score

10、=60,不及格学员的名单如下:,3 姚光明 M 59.00,1,李亚鹏,M,78,2,周晶晶,F,92,3,姚光明,M,59,struct stu*pstu;(*pstu).num 或者:pstu-num,结构指针变量,一个指针当用来指向一个结构时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。结构指针变量声明的一般形式为:struct 结构名*结构指针变量名通过结构指针可以访问该结构变量的成员,一般形式为:(*结构指针变量).成员名 或者 结构指针变量-成员名,#includestruct studentint num;char*name;char sex;float s

11、core;stu=1,张宾,F,55,*pstu;void main()pstu=,学号:1 姓名:张宾性别:F 成绩:55.00学号:1 姓名:张宾性别:F 成绩:55.00学号:1 姓名:张宾性别:F 成绩:55.00Press any key to continue,指向结构体变量的指针定义形式:struct 结构体名*结构体指针名;例 struct student*p;,使用结构体指针变量引用成员形式,存放结构体变量在内存的起始地址,指向运算符优先级:1结合方向:从左向右,例 指向结构体的指针变量,main()struct student long int num;char name2

12、0;char sex;float score;stu_1,*p;p=,例 int n;int*p=n=10,struct student stu1;struct student*p=(*p).num=101,结构体和指针,指向结构体数组的指针,struct student int num;char name20;char sex;int age;stu3=10101,Li Lin,M,18,10102,Zhang Fun,M,19,10104,Wang Min,F,20;main()struct student*p;for(p=stu;pnum,p-name,p-sex,p-age);,str

13、uct student int num;char*name;char sex;float score;stu30;,结构数组,元素为结构类型的数组称为结构数组。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。例如一个班的学员档案,一个公司的职工档案等。,定义了一个结构数组stu1,共有30个元素,stu0stu29。每个数组元素都具有struct student的结构形式。,结构体数组的定义三种形式:,形式一:struct student int num;char name20;char sex;int age;struct student stu2;,形式二:struct st

14、udent int num;char name20;char sex;int age;stu2;,形式三:struct int num;char name20;char sex;int age;stu2;,结构体数组,例 struct int num;char name20;char sex;int age;stu=,;,顺序初始化:struct student int num;char name20;char sex;int age;struct student stu=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;,例

15、struct student int num;char name20;char sex;int age;stu=,;,结构体数组引用,引用方式:结构体数组名下标.成员名,结构体数组初始化,例 统计候选人选票,struct person char name20;int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0;main()int i,j;char leader_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)lea

16、derj.count+;for(i=0;i3;i+)printf(%5s:%dn,leaderi.name,leaderi.count);,问题描述:求学员的总成绩和平均成绩,并统计不及格人数。,结构指针变量,struct studentint num;char*name;char sex;float score;stuN=1,李芳,F,45,2,于红,F,62.5,3,何万山,M,92.5,4,程亚丽,M,87,5,王明,M,58;void main()int i,count=0;float ave,sum=0;for(i=0;iN;i+)sum+=stui.score;if(stui.sc

17、ore60)count+;printf(总分:%7.2fn,sum);ave=sum/5;printf(平均分:%5.2fn,ave);printf(不及格人数为:%dn,count);,总分:345.00平均分:69.00不及格人数为:2Press any key to continue,结构作为函数参数,可以将结构作为参数传递给函数,也可以定义返回结构值的函数。结构作为函数参数有三种不同方法:将结构成员的值传递给函数处理。将整个结构作为参数值传递给函数。将结构指针变量做函数的参数。,把结构作为整体来处理,但作用方式和效果不同。,结构成员作为函数参数,struct film char nam

18、e25;/电影名 char director25;/导演 int duration;/片长;void display(char*,char*,int*);void main()struct film f1;printf(nt 请输入电影的详细信息);printf(nn 请输入影片名:);gets(f1.name);fflush(stdin);printf(n 请输入导演姓名:);gets(f1.director);fflush(stdin);printf(n 请输入电影片长(分钟):);scanf(%d,演示:示例4,void display(char*n,char*d,int*m)print

19、f(nt 电影的详细信息n);printf(n 片名:%s,n);printf(n 导演:%s,d);printf(n 片长:%dn,*m);,前两个参数为字符串,所以不使用“&”,问题描述:求已知两个复数的和。分析:两个复数a+ib和c+id的和为:x+iy 其中:x=a+c y=b+d,#includestruct complex double re;/实部 double im;/虚部;struct complex add(struct complex,struct complex);void main()struct complex x=6.5,8.9,y=7.1,9.4;struct

20、complex z;z=add(x,y);printf(和为:%5.2lf+i%5.2lfn,z.re,z.im);,整个结构作为参数,演示:示例5,struct complex add(struct complex a,struct complex b)struct complex c;c.re=a.re+b.re;c.im=a.im+b.im;return c;,传递结构时不使用“&”,所以实际上是传值调用,即,将结构变量的每个成员值逐个传送。,结构指针做为参数,问题描述:求已知两个复数的和。分析:两个复数a+ib和c+id的和为:x+iy 其中:x=a+c y=b+d,struct st

21、udent int num;char*name;char sex;float score;stuN=1,李芳,F,45,2,于红,F,62.5,3,何万山,M,92.5,4,程亚丽,M,87,5,王明,M,58;void ave(struct student*ps);void main()struct student*ps;ps=stu;ave(ps);,演示:示例6,void ave(struct student*ps)int i,count=0;float ave,sum=0;for(i=0;iscore;if(ps-score60)count+;printf(总分:%7.2fn,sum)

22、;ave=sum/5;printf(平均分:%5.2fn,ave);printf(不及格人数为:%dn,count);,用指针变量作函数参数进行传送时由实参传向形参的只是结构的地址。,堆栈是一种先进后出的数据结构。用堆栈实现简单的行编辑功能,问题描述如下:接受用户从键盘输入的程序或数据,并存入用户的数据区。由于用户在键盘上进行输入时,不能保证不会出错,因此,需要设立一个输入缓冲区,允许用户输入出差错,并在发现有误时可以及时更正。例如,当用户发现刚刚键入的一个字符错了时,可以补进一个“#”,以表示前一个字符无效;如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符“”,以表示当前行中的

23、字符均无效。,实现堆栈 5-1,实现堆栈 5-2,W,h,i,e,使用堆栈实现行编辑功能,whiel#lr#e(s#*s),l,l,r,e,(,s,*,s,输出缓冲区(堆栈)中的所有字符,即有效字符:while(*s),o,u,t,c,outchaputchar(*s=#+);,h,a,遇到字符清空缓冲区(堆栈),p,u,t,c,h,a,r,(,*,s,=,+,+,),;,遇到字符#时,栈顶元素出栈,输出缓冲区(堆栈)中的所有字符,即有效字符:putchar(*s+);,实现堆栈 5-3,由此可见,需要实现堆栈的以下几个操作:入栈出栈清空栈显示从栈底到栈顶所有的元素 判断栈是否为空,#defi

24、ne m 100struct Mystack char elementm;int top;/栈顶;,栈结构,void push(struct Mystack*s,char x)/*将x的值压入栈顶*/s-elements-top=x;s-top+;,入栈操作,void pop(struct Mystack*s)/*将栈顶元素删除*/s-top-;,出栈操作,int IsEmpty(struct Mystack*s)if(s-top=0)return 1;elsereturn 0;,判断栈是否为空,实现堆栈 5-4,void Clearstack(struct Mystack*ss-top=0;

25、,清空栈,void Displaystack(struct Mystack*s)int i;for(i=0;itop;i+)printf(%c,s-elementi);,显示从栈底到栈顶所有的元素,实现堆栈 5-5,void main()struct Mystack st;char ch;int i;for(i=0;i100;i+)st.elementi=0;st.top=0;printf(请输入一行字符:n);ch=getchar();while(ch!=EOF,声明栈,初始化栈,遇到#,如果栈不空,则栈顶元素出栈,遇到,则清空栈,既不是#也是,将字符入栈,显示从栈底到栈顶元素,即所有的有效

26、字符,main函数,演示:示例7,功能:用自定义名字为已有数据类型命名类型定义简单形式:typedef type name;,例 typedef int INTEGER;,类型定义语句关键字,已有数据类型名,用户定义的类型名,例 typedef float REAL;,类型定义后,与已有类型一样使用,例 INTEGER a,b,c;REAL f1,f2;,说明:1.typedef 没有创造新数据类型2.typedef 是定义类型,不能定义变量3.typedef 与 define 不同,define typedef预编译时处理 编译时处理简单字符置换 为已有类型命名,用typedef定义类型,t

27、ypedef说明,新类型名一般用大写表示,以便于区别。用typedef只能声明新的类型名,不能创造新的类型,只是为已经存在的类型起一个别名,也不能用来定义变量,即只能用其声明的类型来定义变量;有时也可用宏定义来代替typedef的功能,但是宏定义是由预处理完成的,而typedef则是在编译时完成的,更为灵活方便,总结2-1,结构是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。定义一个结构,需要给出各个成员的类型及名称。结构定义仅描述了一个结构的形式。要在程序里使用结构,需要声明结构变量。访问结构成员的操作要用圆点运算符(.),一般形式为:结构变量名.成员名。,总结2-2,可以通过指向结构的指针访问结构成员,常用形式为:结构指针变量-成员名。数组元素的类型为结构的数组称为结构数组。结构作为函数参数有三种不同的方式:结构成员的值传递给函数参数、整个结构作为参数传递、结构指针变量做函数的参数。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号