第八部分结构和联合类型.ppt
《第八部分结构和联合类型.ppt》由会员分享,可在线阅读,更多相关《第八部分结构和联合类型.ppt(109页珍藏版)》请在三一办公上搜索。
1、第八章 结构和联合类型,武汉大学计算机学院,主讲:谭成予,教 材:C程序设计导论,本讲重点,结构类型是一种构造数据类型用途:把不同类型的数据组合成一个整体-自定义数据类型,struct 结构名 类型标识符 成员名;类型标识符 成员名;.;,成员类型可以是基本型或构造型(数组、指针或其他结构类型),struct是关键字,不能省略,合法标识符可省:无名结构类型,结构类型,例 struct student long int order;char name20;char sex;short int age;int score10;char addr30;,结构类型定义描述结构的组织形式,不分配内存,结
2、构类型定义的作用域,结构类型,例 struct id_card char name30;char sex;char nationality20;struct date int year,month,day;birthday;char*p_addr;struct date signed_date;long number;char*office;,同一结构类型各成员不能同名,不同结构类型成员可以同名,结构类型可以嵌套定义,结构类型,例 struct wrong char name30;int count;struct wrong a;,结构类型不能递归定义,结构类型,一般形式:struct 结构名
3、 类型标识符 成员名;类型标识符 成员名;.;struct 结构名 变量名表列;,结构变量的定义,先定义结构类型,再定义结构变量,例 struct student long int order;char name20;char sex;short int age;int score10;char addr30;struct student stu1,stu2;,/*struct coord表示屏幕上一个点的坐标*/例 struct coord float x;float y;struct coord first,second;,结构变量的定义,例#define STUDENT struct s
4、tudent STUDENT long int order;char name20;char sex;short int age;int score10;char addr30;STUDENT stu1,stu2;,结构变量的定义,struct 结构名 类型标识符 成员名;类型标识符 成员名;.变量名表列;,一般形式:,定义结构类型的同时定义结构变量,结构变量的定义,例 struct student long int order;char name20;char sex;short int age;int score10;char addr30;stu1,stu2;,例 struct coor
5、d float x;float y;first,second;/*struct coord表示屏幕上一个点的坐标*/,结构变量的定义,直接定义结构类型变量,结构变量的定义,例 struct long int order;char name20;char sex;short int age;int score10;char addr30;stu1,stu2;,例 struct float x;float y;first,second;/*struct coord表示屏幕上一个点的坐标*/,结构变量的定义,说明结构类型与结构类型变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算
6、;变量:可以结构类型可嵌套结构类型成员名与程序中变量名可相同,不会混淆结构类型及变量的作用域与生存期,结构变量的定义,结构变量的定义,结构变量的定义,结构类型变量的引用,引用规则 结构类型变量不能整体引用,只能引用变量成员 引用方式:结构类型变量名.成员名可以将一个结构类型变量赋值给另一个结构类型变量结构类型嵌套时逐级引用,成员(分量)运算符优先级:1结合性:从左向右,结构类型变量不能整体引用,只能引用变量成员引用方式:结构类型变量名.成员名,结构类型变量的引用,结构类型变量的引用,不能整体引用,结构类型变量的引用,不能整体引用,结构类型嵌套时逐级引用,结构类型变量的引用,例 struct s
7、tudent int num;char name20;struct date int month;int day;int year;birthday;stu1,stu2;,stu1.birthday.month=12;,结构类型嵌套时逐级引用,结构类型变量的引用,/*L8-1.C:计算某个同学5门课程成绩的平均分。*/#include int main(void)struct studentchar*name;/*姓名*/long order;/*学号*/int score5;/*成绩*/float average;/*平均分*/who;int sum=0,n;printf(“input na
8、me,order and 5 scoresn”);scanf(“%s%ld”,who.name,char name20;,for(n=0;n5;n+)scanf(“%d”,/*L8-2.C:输入矩形左上角和右下角坐标,计算该矩形长和宽及面积。*/#include#include int main(void)float length,width,area;struct coordfloat x,y;struct rectangle struct coord topleft,bottomrt;mybox;printf(“enter the top left x,y coordinate:n”);s
9、canf(“%f%f”,struct 结构类型名 类型标识符 成员名;类型标识符 成员名;.;struct 结构类型名 结构类型变量=初始数据;,形式一:,结构变量的初始化,例 struct student int num;char name20;char sex;int age;char addr30;struct student stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,结构变量的初始化,例 struct student char name20;long order;int score5;float average;struct studen
10、t who=“Wang Lin”,031112,92,91,89,87,94,0.0;,结构变量的初始化,例 struct coord float x,y;struct rectanglestruct coord topleft;struct coord bottomrt;struct rectangle mybox=1.8,8.3,12.4,1.29;,结构变量的初始化,struct 结构类型名 类型标识符 成员名;类型标识符 成员名;.结构类型变量=初始数据;,形式二:,结构变量的初始化,例 struct student int num;char name20;char sex;int a
11、ge;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,初值表中初值的个数=结构变量长远的个数,结构变量的初始化,例 struct student char name20;long order;int score5;float average;who=“Wang Lin”,031112,92,91,89,87,94,0.0;,例 struct coord float x,y;struct rectanglestruct coord topleft;struct coord bottomrt;mybox=1.8,8.3,12.4,1
12、.29;,结构变量的初始化,struct 类型标识符 成员名;类型标识符 成员名;.结构类型变量=初始数据;,形式三:,结构变量的初始化,例 struct int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,结构变量的初始化,例 struct char name20;long order;int score5;float average;who=“Wang Lin”,031112,92,91,89,87,94,0.0;,例 struct coord float
13、 x,y;struct struct coord topleft;struct coord bottomrt;mybox=1.8,8.3,12.4,1.29;,结构变量的初始化,本讲重点,指向结构类型变量的指针定义形式:struct 结构类型名*结构类型指针名;例 struct student*p;,存放结构类型变量在内存的起始地址,struct student stu1;struct student*p=(*p).num=101,结构类型和指针,结构类型和指针,(*结构类型指针名).成员名,结构类型指针名-成员名,结构类型变量名.成员名,使用结构类型指针变量引用成员形式,指向运算符优先级:1
14、结合方向:从左向右,例 int n;int*p=n=10,结构类型和指针,int main(void)struct student long int num;char name20;char sex;float score;stu_1,*p;p=,例8.3 指向结构类型的指针变量,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;int main(void)struct student*p;for(p=stu;pn
15、um,p-name,p-sex,p-age);return 0;,例 指向结构类型数组的指针,/*L8-3.C:分析下面程序的运行结果*/#include int main(void)struct int x;int y;a2=1,2,3,4,*p=a;printf(“%d,”,+p-x);printf(%dn”,(+p)-x);return 0;,1,2,3,4,2,2,3,结构类型和指针,本讲重点,形式一:struct student int num;char name20;char sex;int age;struct student stu2;,结构数组的定义,三种形式:,形式二:st
16、ruct student int num;char name20;char sex;int age;stu2;,结构数组的定义,形式三:struct int num;char name20;char sex;int age;stu2;,结构数组的定义,结构数组初始化,顺序初始化: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;,结构数组初始化,例 struct int num;char
17、name20;char sex;int age;stu=,;,例 struct student int num;char name20;char sex;int age;stu=,;,结构数组初始化,结构数组引用,引用方式:结构数组名下标.成员名,例8.4 统计后选人选票,struct person char name20;int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0;int main(void)int i,j;char leader_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)
18、if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;for(i=0;i3;i+)printf(%5s:%dn,leaderi.name,leaderi.count);return 0;,应用举例,例8.5 编程,输入10个学生的姓名和数学、英语和语文三门功课的成绩,计算每个学生的平均成绩,并输出学生姓名和平均成绩。,#include#define N 30struct studentchar name20;/*学生姓名*/float math;/*数学成绩*/float eng;/*英语成绩*/float cuit;/*语文成绩*/floa
19、t aver;/*平均成绩*/;,int main(void)struct student sN;int i;for(i=0;iN;i+)printf(“请输入第%d学生的数据n”,i+1);printf(“姓名:”);gets(si.name);printf(“数学、英语、语文成绩:”);scanf(“%f,%f,%f”,例8.6 输入N个整数,记录输入的数和序号,按从小到大的顺序排列(如果两个整数相同,按输入的先后次序排列)。输出排序以后的每个整数和它原来的序号。,#include#define N 10struct dataint no;int num;int main(void)str
20、uct data xN,temp;int i,j;/*输入10个整数*/printf(“输入10个整数:”);for(i=0;iN;i+)scanf(“%d”,int main(void)struct student sN;int i;for(i=0;iN;i+)printf(“请输入第%d学生的数据n”,i+1);printf(“姓名:”);gets(si.name);printf(“数学、英语、语文成绩:”);scanf(“%f,%f,%f”,例8.7,问题描述:n个小孩围成一圈,依次编号。老师指定从第w个小孩开始报数,报数为s的小孩出列;然后从下一个小孩开始重新报数,重复上述过程,直到所
21、有小孩都出列。,分析:数据结构,如何表示队列和小孩?每个小孩用一个结构类型表示:struct child int ino;/*当前小孩编号*/int next;/*下一个小孩编号*/n个小孩组成队列用结构数组表示:struct child linkN+1;/*下标为0的元素不使用*/N为可以容纳的人数上限,约瑟夫问题,分析:算法:(1)初始化队列link:linkk.nextk+1 k=1,n-1 linkn.next1(2)开始报数 if(linkk.ino!=0)如果第k个小孩在队列中 I+1I 报数变量I 加1(3)如果I=s,则第k个人出列,转(5),否则转(4)(4)k更新为下一个小
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八 部分 结构 联合 类型
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5321224.html