《chap09_结构-精品文档资料整理.ppt》由会员分享,可在线阅读,更多相关《chap09_结构-精品文档资料整理.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Chap 9 结构结构 9.1 构建手机通讯录构建手机通讯录9.2 结构变量结构变量9.3 结构数组结构数组9.4 结构指针结构指针本章要点本章要点n什么是结构?结构与数组有什么差别?什么是结构?结构与数组有什么差别?n有几种结构的定义形式,它们之间有什么不同?有几种结构的定义形式,它们之间有什么不同?n什么是结构的嵌套?什么是结构的嵌套?n什么是结构变量和结构成员变量,如何引用结构成什么是结构变量和结构成员变量,如何引用结构成员变量?员变量?n结构变量如何作为函数参数使用?结构变量如何作为函数参数使用?n什么是结构数组,如何定义和使用结构数组?什么是结构数组,如何定义和使用结构数组?n什么是
2、结构指针,它如何实现对结构分量的操作?什么是结构指针,它如何实现对结构分量的操作?n结构指针是如何作为函数的参数的?结构指针是如何作为函数的参数的?9.1 构建手机通讯录构建手机通讯录 9.1.1 程序解析程序解析9.1.2 结构的概念与定义结构的概念与定义9.1.3 结构的嵌套定义结构的嵌套定义9.1.1 程序解析程序解析例例9-1 构建简单的手机通讯录构建简单的手机通讯录联系人的基本信息:姓名、年龄和联系电话联系人的基本信息:姓名、年龄和联系电话最多容纳最多容纳50名联系人的信息名联系人的信息 具有新建和查询功能具有新建和查询功能9.1.1 程序解析程序结构程序解析程序结构n程序结构程序结
3、构主函数主函数main:程序的总体控制:程序的总体控制函数函数new_friend:新建联系人功能:新建联系人功能函数函数search_friend:查询联系人功能:查询联系人功能 main()new_friend()search_friend()程序解析数据类型程序解析数据类型/变量变量n数据类型数据类型/变量变量结构类型结构类型struct friends_list:在程序首部定义,:在程序首部定义,其中的成员分别代表联系人的基本信息其中的成员分别代表联系人的基本信息struct friends_list char name10;/*姓名姓名*/int age;/*年龄年龄*/char t
4、elephone13;/*联系电话联系电话*/;结构数组结构数组friends:每个元素就是一个结构变量,:每个元素就是一个结构变量,对应一个联系人对应一个联系人struct friends_list friends50;程序解析全局变量程序解析全局变量/函数参数函数参数全局变量全局变量Count:记录当前的联系人总数:记录当前的联系人总数 函数函数new_friend和和search_friend的参数之一是的参数之一是结构数组:结构数组:void new_friend(struct friends_list friends );void search_friend(struct frien
5、ds_list friends,char*name);结构数组名作为函数实参与普通数组名作函数参数一样,结构数组名作为函数实参与普通数组名作函数参数一样,将数组首地址传递给函数形参将数组首地址传递给函数形参程序解析源程序程序解析源程序#include#include/*手机通讯录结构定义手机通讯录结构定义*/struct friends_list char name10;/*姓名姓名*/int age;/*年龄年龄*/char telephone13;/*联系电话联系电话*/;int Count=0;/*全局变量记录当前联系人总数全局变量记录当前联系人总数*/void new_friend(s
6、truct friends_list friends );void search_friend(struct friends_list friends,char*name);源程序源程序int main(void)int choice;char name10;struct friends_list friends50;/*包含包含50个人的通讯录个人的通讯录*/do printf(手机通讯录功能选项:手机通讯录功能选项:1:新建新建 2:查询查询 0:退出退出n);printf(请选择功能:请选择功能:);scanf(%d,&choice);switch(choice)case 1:new_f
7、riend(friends);break;case 2:printf(请输入要查找的联系人名请输入要查找的联系人名:);scanf(%s,name);search_friend(friends,name);break;case 0:break;while(choice!=0);printf(谢谢使用通讯录功能谢谢使用通讯录功能!n);return 0;源程序源程序/*新建联系人新建联系人*/void new_friend(struct friends_list friends)struct friends_list f;if(Count=50)printf(通讯录已满通讯录已满!n);retu
8、rn;printf(请输入新联系人的姓名请输入新联系人的姓名:);scanf(%s,f.name);printf(请输入新联系人的年龄请输入新联系人的年龄:);scanf(%d,&f.age);printf(请输入新联系人的联系电话请输入新联系人的联系电话:);scanf(%s,f.telephone);friendsCount=f;Count+;源程序源程序/*查询联系人查询联系人*/void search_friend(struct friends_list friends,char*name)int i,flag=0;if(Count=0)printf(通讯录是空的通讯录是空的!n);r
9、eturn;for(i=0;i Count;i+)if(strcmp(name,friendsi.name)=0)/*找到联系人找到联系人*/flag=1;break;if(flag)printf(姓名姓名:%st,friendsi.name);printf(年龄年龄:%dt,friendsi.age);printf(电话电话:%sn,friendsi.telephone);else printf(无此联系人无此联系人!);9.1.2 结构的概念与定义结构的概念与定义n使用结构来表示通讯录信息:使用结构来表示通讯录信息:struct friends_list char name10;/*姓名姓
10、名*/int age;/*年龄年龄*/char telephone13;/*联系电话联系电话*/;n结构:结构:构造数据类型构造数据类型,把有内在联系的,把有内在联系的不同类型不同类型的数据的数据统一成一个整体,使它们相互关联统一成一个整体,使它们相互关联n结构又是变量的集合,可以单独使用其成员结构又是变量的集合,可以单独使用其成员结构的定义结构的定义n结构类型定义的一般形式为:结构类型定义的一般形式为:struct 结构名结构名 类型名类型名 结构成员名结构成员名1;类型名类型名 结构成员名结构成员名2;类型名类型名 结构成员名结构成员名n;;结构的定义以分号结束,结构的定义以分号结束,被看
11、作一条语句被看作一条语句 关键字关键字struct和它后面和它后面的结构名一起组成一个的结构名一起组成一个新的数据类型名新的数据类型名 结构定义示例结构定义示例定义平面坐标结构:定义平面坐标结构:struct point double x;double y;虽然虽然x、y的类型相同,也可以用数组的方式的类型相同,也可以用数组的方式表示,但采用结构体描述整体性更强,增加表示,但采用结构体描述整体性更强,增加了程序的可读性,使程序更清晰。了程序的可读性,使程序更清晰。9.1.3 结构的嵌套定义结构的嵌套定义n在实际生活中,一个较大的实体可能由多个成员在实际生活中,一个较大的实体可能由多个成员构成,
12、而这些成员中有些又有可能是由一些更小构成,而这些成员中有些又有可能是由一些更小的成员构成的实体。的成员构成的实体。n在手机通讯录中,增加在手机通讯录中,增加“通信地址通信地址”姓名姓名性别性别年龄年龄 通信地址通信地址联系联系电话电话电子电子邮箱邮箱城市城市街道街道门牌号门牌号邮编邮编结构的嵌套定义结构的嵌套定义struct address char city10;char street20;int code;int zip;struct nest_friendslist char name10;int age;struct address addr;char telephone13;nest
13、_friend;在定义嵌套的结构类型时,必须先定义在定义嵌套的结构类型时,必须先定义成员的结构类型,再定义主结构类型。成员的结构类型,再定义主结构类型。姓名姓名性别性别年龄年龄 通信地址通信地址联系联系电话电话电子电子邮箱邮箱城市城市街道街道门牌号门牌号邮编邮编练习练习n9-1上机运行上机运行9-1的程序。的程序。n9-2定义一个能够表示复数的结构类型,一定义一个能够表示复数的结构类型,一个复数包括实数和虚数。个复数包括实数和虚数。n9-3人的出生日期由年、月、日组成,请在人的出生日期由年、月、日组成,请在例例9-1通讯录结构中增加一个成员:出生日通讯录结构中增加一个成员:出生日期,用嵌套定义
14、的方法重新定义该结构类期,用嵌套定义的方法重新定义该结构类型。型。n9-4在在9.1.3中,先定义了中,先定义了struct address,然后再定义了然后再定义了struct nest_friendslist,两,两者的定义次序是否可以互换?为什么?者的定义次序是否可以互换?为什么?9.2 结构变量结构变量 9.2.1 结构变量的定义和初始化结构变量的定义和初始化9.2.2 结构变量的使用结构变量的使用9.2.1结构变量的定义和初始化结构变量的定义和初始化三种定义结构变量的方式:三种定义结构变量的方式:1.单独定义单独定义先定义先定义结构类型结构类型,再定义具有这种,再定义具有这种结构类型
15、的变结构类型的变量量 struct friends_list char name10;/*姓名姓名*/int age;/*年龄年龄*/char telephone13;/*联系电话联系电话*/;struct friends_list friend1,friend2;结构变量的定义结构变量的定义2.混合定义混合定义在定义结构体类型的同时定义结构体变量在定义结构体类型的同时定义结构体变量 struct friends_listchar name10;int age;char telephone13;friend1,friend2;3.无类型名定义无类型名定义在定义结构体变量时省略结构体名在定义结构
16、体变量时省略结构体名struct char name10;int age;char telephone13;friend1,friend2;结构变量的初始化结构变量的初始化 struct friends_list friend1=Zhang,26,0571-85171880 ;name age telephone Zhang260571-852718809.2.2 结构变量的使用结构变量的使用1.结构变量成员的引用结构变量成员的引用结构变量名结构变量名.结构成员名结构成员名friend1.age=26;strcpy(friend1.name,Zhang San);nest_friend.add
17、r.zip例例9-2 计算实发工资计算实发工资在一个职工工资管理系统中,工资项目包括编号、姓在一个职工工资管理系统中,工资项目包括编号、姓名、基本工资、奖金、保险、实发工资。名、基本工资、奖金、保险、实发工资。输入一个正整数输入一个正整数n,再输入,再输入n个职工的前个职工的前5项信息,计项信息,计算并输出每位职工的实发工资。算并输出每位职工的实发工资。实发工资实发工资=基本工资基本工资+奖金奖金保险。保险。例例9-2 源程序源程序#includestruct employee int num;char name20;float jbgz,jj,bx,sfgz;int main(void)in
18、t i,n;struct employee e;printf(请输入职工人数请输入职工人数n:);scanf(%d,&n);for(i=1;i=n;i+)printf(请输入第请输入第%d个职工的信息个职工的信息:,i);scanf(%d%s,&e.num,e.name);scanf(%f%f%f,&e.jbgz,&e.jj,&e.bx);e.sfgz=e.jbgz+e.jj-e.bx;printf(编号编号:%d 姓名姓名:%s实发工资实发工资:%.2fn,e.num,e.name,e.sfgz);return 0;请输入职工人数请输入职工人数n:1请输入第请输入第1个职工的信息:个职工的信
19、息:102 Zhong 2200.5 800 85.2编号编号:102 姓名姓名:Zhong 实发工资实发工资:2915.30 结构变量的使用整体赋值结构变量的使用整体赋值2.结构变量的整体赋值结构变量的整体赋值具有相同类型的结构变量可以直接赋值。具有相同类型的结构变量可以直接赋值。将赋值符号右边结构变量的每一个成员的值都赋给了左边将赋值符号右边结构变量的每一个成员的值都赋给了左边结构变量中相应的成员。结构变量中相应的成员。struct friends_list char name10;int age;char telephone13;friend1=Zhang,26,“0571-852718
20、80”,friend2;friend2=friend1;结构变量的使用函数参数结构变量的使用函数参数3.结构变量作为函数参数结构变量作为函数参数当程序的规模较大,功能较多时,需要以函数的当程序的规模较大,功能较多时,需要以函数的形式进行功能模块的划分和实现;形式进行功能模块的划分和实现;如果在函数间传递结构数据,则需用结构变量作如果在函数间传递结构数据,则需用结构变量作为函数的参数或返回值。为函数的参数或返回值。例例9-3 结构变量做为函数参数结构变量做为函数参数改写例改写例9-2,要求使用,要求使用结构变量结构变量作为函数参数。作为函数参数。n定义一个用于计算实发工资的函数:定义一个用于计算
21、实发工资的函数:float count_sfgz(struct employee m)return m.jbgz+m.jj-m.bx;n再将主函数再将主函数main中的语句:中的语句:e.sfgz=e.jbgz+e.jj-e.bx;改为:改为:e.sfgz=count_sfgz(e);练习练习9-5n例例9-2中,如果工资项目包括编号、姓名、中,如果工资项目包括编号、姓名、基本工资、奖金、保险、税金、实发工资。基本工资、奖金、保险、税金、实发工资。其中:税金(基本工资奖金)其中:税金(基本工资奖金)0.05,实发工资基本工资奖金保险税金。实发工资基本工资奖金保险税金。改写改写9-2,输入一名职
22、工的前,输入一名职工的前5项信息,计项信息,计算税金和实发工资,并输出所有的信息项。算税金和实发工资,并输出所有的信息项。练习练习9-6n学生的基本信息包括学号、姓名、三门功学生的基本信息包括学号、姓名、三门功课的成绩及平均分。参考课的成绩及平均分。参考9-3,输入一个学,输入一个学生的信息,计算学生的平均成绩,并输出生的信息,计算学生的平均成绩,并输出学生的完整信息。要求定义并调用函数学生的完整信息。要求定义并调用函数aver()计算平均分,结构变量作为函数参数。计算平均分,结构变量作为函数参数。n一个结构变量只能表示一个实体的信息,一个结构变量只能表示一个实体的信息,如果有许多相同类型的实
23、体,就需要使用如果有许多相同类型的实体,就需要使用结构数组。结构数组。n结构数组是结构与数组的结合,与普通数结构数组是结构与数组的结合,与普通数组的不同之处在于每个数组元素都是一个组的不同之处在于每个数组元素都是一个结构类型的数据,包括各个成员项。结构类型的数据,包括各个成员项。9.3 结构数组结构数组 n结构数组的定义方法与结构变量相同结构数组的定义方法与结构变量相同 struct friends_list char name10;int age;char telephone13;friends10;结构数组结构数组friends,它有,它有10个数组元素,从个数组元素,从friends0到
24、到friends9,每个数组元素都是结,每个数组元素都是结构类型构类型struct friends_list9.3 结构数组结构数组 结构数组的初始化结构数组的初始化 struct friends_list friends10=zhang san,26,0571-85271880,Li Si,30,13605732436;friends91360573243630Li Sifriends10571-8527188026Zhang Sanfriends0结构数组元素结构数组元素 n结构数组元素的成员引用结构数组元素的成员引用结构体数组名结构体数组名下标下标.结构体成员名结构体成员名 n使用方法与
25、同类型的变量完全相同使用方法与同类型的变量完全相同friends5.age=26;strcpy(friends5.name,Zhang San);friends4=friends1;friends91360573243630Li Sifriends10571-8527188026Zhang Sanfriends0例例9-4 结构数组排序结构数组排序 输入并保存输入并保存10个学生的信息,计算并输出平均个学生的信息,计算并输出平均分,再按照从高分到低分的顺序输出他们分,再按照从高分到低分的顺序输出他们的信息。的信息。#include struct student int num;char nam
26、e20;int score;struct student stud10;/*定义结构数组定义结构数组*/例例9-4 源程序源程序int main(void)int i,j,index,sum=0;struct student temp;/*输入输入10个学生的记录,并累加成绩个学生的记录,并累加成绩*/for(i=0;i 10;i+)printf(No%d:,i+1);scanf(%d%s%d,&studi.num,studi.name,&studi.score);sum=sum+studi.score;/*按照分数从低到高排序,使用选择排序法按照分数从低到高排序,使用选择排序法*/for(i
27、=0;i 9;+i)index=i;for(j=i+1;j 10;j+)if(studj.score”访问指针指向的结构成员。访问指针指向的结构成员。p-age=36;当当p=&friend1时,以下三条语句相同:时,以下三条语句相同:friend1.age=36;(*p).age=36;p-age=36;9.4.2 结构指针作为函数参数结构指针作为函数参数当当结结构构指指针针作作为为函函数数的的参参数数时时,执执行行效效率率高高,可以完成比基本类型指针更为复杂的操作。可以完成比基本类型指针更为复杂的操作。例例9-5 输输入入10个个学学生生的的学学号号、姓姓名名和和成成绩绩,输输出学生的成绩
28、等级和不及格人数。出学生的成绩等级和不及格人数。每个学生的记录包括学号、姓名、成绩和等级每个学生的记录包括学号、姓名、成绩和等级要要求求定定义义和和调调用用函函数数set_grade根根据据学学生生成成绩绩设设置置等等级级,并统计不及格人数并统计不及格人数等级设置:等级设置:A:85100;B:7084;C:6069;D:059例例9-5 源程序源程序#define N 10struct student int num;char name20;int score;char grade;int main(void)struct student stuN,*ptr;ptr=stu;/*输入输入 略
29、略*/count=set_grade(ptr);int set_grade(struct student*p)int i,n=0;for(i=0;i score=85)p-grade=A;else if(p-score=70)p-grade=B;else if(p-score=60)p-grade=C;else p-grade=D;n+;return n;调用调用set_grade返回主函数后,主函数中结返回主函数后,主函数中结构数组构数组stu的元素的的元素的grade成员已经被赋值成员已经被赋值 例例9-1 说明说明n例例9-1中中,结结构构数数组组名名friends作作为为函函数数参参数数时时,其其实实质质就就是是结结构构指指针针作作为为函函数数参参数数,因因为为数数组组名名代代表表数数组组的的首首地地址址。因因此此,结结构构数数组组名名与与结结构构指指针针变变量量都都可以做为函数的参数。可以做为函数的参数。n与与结结构构变变量量作作为为函函数数参参数数相相比比,用用结结构构指指针针作作为为函函数参数的效率更高,因而是更佳的选择。数参数的效率更高,因而是更佳的选择。