【教学课件】第11章结构体.ppt
《【教学课件】第11章结构体.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第11章结构体.ppt(70页珍藏版)》请在三一办公上搜索。
1、1,第 十 一 章,结 构 体与共用休,2,3,例:描述一个学生的姓名、学号、性别、年龄。每个学生都有这样的属性,它们构成一个描述学生具体情况的一个整体。而每个属性又是一个基本的类型,本例中可分别用字符数组、长整型、字符型、和整型来描述。,一、结构体类型的定义,结构体概念的引入,数据的描述:基本类型:整型、实型、字符型。数组:属于同一种类型的元素的集合。有时,需要用不同的数据类型来描述一个事物的各方面属性,故此,C语言引入了结构体的概念。,4,struct 结构体类型名 类型标识符 成员名1;类型标识符 成员名2;类型标识符 成员名n;;,结构体类型的定义,如:struct student c
2、har name10;long id;char gender;int age;,注意:struct student 应作为一个类型整体,name10、id、gender、age都是其成员。struct及花括号后的“;”不能省。,5,定义结构体类型,描述下列数据,struct student int no;/*学号*/char name10;/*姓名*/char sex;/*性别*/int age;/*年龄*/float score10;/*成绩*/;,结构体类型的举例,(1)学生情况:包含学生的学号、姓名、性别、年龄、10门课程成绩:,6,(2)个人数据:包含姓名、性别、年龄、身高、体重、住址
3、:,struct person char name20;/*姓名*/char sex;/*性别*/int age;/*年龄*/float height;/*身高*/float weight;/*体重*/char addr50;/*住址*/;,7,(3)平面上的点:,struct point2 float x;/*横坐标*/float y;/*纵坐标*/;,如考虑空间中的点,可作如下定义:struct point3 float x;/*X坐标*/float y;/*Y坐标*/float z;/*Z坐标*/;,8,(4)日期,包括年、月、日:,如职工信息结构体类型为:struct personch
4、ar name20;/*姓名*/char address40;/*地址*/float salary;/*工资*/float cost;/*扣款*/struct date hiredate;/*聘任日期*/;,结构体类型可以嵌套定义 即一个结构体类型中的某些成员又是其他结构体类型,struct date int year;/*年*/int month;/*月*/int day;/*日*/;,注意,9,例如,对已定义的结构体类型struct student,可以定义结构体变量:struct student zhang,stu1;struct person p50;/*50个职工人的数据*/,二、结
5、构体变量,结构体变量的定义,1.先定义结构体类型,再定义结构体变量,格式:struct 结构体名 结构体变量名表;,三种方法:,10,2.在定义结构体类型的同时定义变量,例如:struct student char name10;char sex;int age;float score;stu1,stu2;,格式:struct 结构体类型名 类型标识符 成员名1;类型标识符 成员名2;类型标识符 成员名n;变量名表;,11,3.用匿名形式直接定义结构体类型变量(不出现结构体名),例如:struct char name10;char sex;int age;float score;stu1,st
6、u2;,格式:struct 类型标示符 成员名1;类型标示符 成员名2;类型标示符 成员名n;变量名表;,(1)类型与变量是不同的概念,不要混同。对结构体变量来说,在定义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配存储空间的,只对变量分配存储空间。(2)对结构体中的成员,可以单独使用,它的作用相当于普通变量。(3)成员也可以是一个结构体变量。(4)成员名可与程序中的变量同名,两者不代表同一对象。,结构体的说明,12,例。定义结构体变量stu1:struct student stu1;stu1.age=2
7、0;scanf(%f,stu1.age 表示引用结构体变量stu1中的age成员,因该成员的类型为int型,所以可以对它执行任何int型变量可以执行的运算。,结构体变量的使用,结构体变量一般不整体引用,而是引用其成员变量。,成员变量引用格式,结构体变量名.成员名,其中的圆点运算符称为成员运算符,它的运算级别是最高的。,13,(1)结构体类型变量的各成员(分量)必须单独引用,成员运算符“”具有最高优先级。(2)不允许对结构体变量进行整体的输入输出 如:scanf(“%s%c%d%f”,(4)严格区分类型与变量的概念。(5)如果结构体成员本身又是结构体类型的,则可继续使用成员运算符取结构体成员的结
8、构体成员,逐级向下,引用最低一级的成员。程序只能对最低一级的成员进行运算。例如,对stu1某些成员的访问:stu1.birthday.day=23;stu1.birthday.month=8;stu1.birthday.year=1985;,说明,14,结构体变量的初始化,结构体变量可以在定义时初始化。,格式,struct 结构体名 成员表;结构体变量=初始化数据表;,例 struct student char name10;char sex;int age;float score;stu1,stu2=“Wangwu”,m,20,88.5;,15,结构体变量存储分配,16,例 11.1 求某同
9、学上学期6门课程的总成绩与平均成绩。,思路分析:可以先构建一个结构体,包含学生的姓名、八门课的成绩、以及总成绩及平均成绩。struct student char name10;float score6;float total,average;;然后在程序中输入姓名及各科成绩后即可进行运算,运算结果存放到total和average两个成员变量中。,17,main()int i;struct student char name10;float score6;float total,average;stu;scanf(%s,stu.name);for(i=0;i6;i+)scan(%f,i+)stu
10、.total+=stu.scorei;stu.average=stu.total/6;printf(”%s的总成绩=%.2fn平均成绩=%.2f”,stu.total,stu.average);,输入数据:CHEN 80 86 79 98 88 72 运行结果:CHEN的总成绩=477.00平均成绩=72.13,程序如下:,18,与结构体变量定义类似,只是结构体变量名为结构体数组变量名,如:struct student stu3;数组各元素在内存中连续存放,三、结构体数组,结构体数组的定义,结构体数组的初始化,一般形式是在定义的数组后面加上=初值表列;,例。struct student int
11、 num;char name20;char sex;int age;float score;char addr30;stu3=101,”WGJ”,M,28,88.5,”CS”,102,”DYH”,F,26,88.0,”CS”,103,”DYC”,M,24,78.5,”CZ”;,19,结构体数组的存储分配,20,通过下面的示例说明结构体数组的使用方法例11.2 候选人得票的统计。设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。,结构体数组的使用,struct person char name20;int count;leader3=Zhang,0,Li,0,Wang,0
12、;,程序如下:,21,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)leaderj.count+;printf(n);for(i=0;i3;i+)printf(%5s:%dn,leaderi.name,leaderi.count);,22,一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以定义一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。,四、指向结构体
13、类型数据的指针,23,指向结构体变量的指针定义形式:struct 结构体名*结构体指针名;例 struct student*p;,使用结构体指针变量引用成员形式,存放结构体变量在内存的起始地址,指向运算符优先级:1结合方向:从左向右,例 指向结构体的指针变量,main()struct student long int num;char name20;char sex;float score;stu_1,*p;p=,例 int n;int*p=n=10,struct student stu1;struct student*p=(*p).num=101,24,指向结构体数组的指针,例 指向结构体数
14、组的指针,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);,25,用指向结构体的指针作函数参数用结构体变量的成员作参数-值传递用指向结构体变量或数组的指针作参数-地址传递用结构体变量作参数-多值传递,效率低,将结构体变量所占的内存单元的内容全部顺序传递给形参。形参也必须是同类型的结构体变量。在函数调
15、用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大,因此一般较少用这种方法,将结构体变量(或数组)的地址传给形参,26,#include#define FORMAT“%dn%sn%fn%fn%fn”struct student int num;char name20;float score3;main()void print(struc student)struct student stu;stu.num=12345;strcpy(stu.name,”Li Li”);stu.score0=67.5;stu.score1=89;stu.score2=78.6;print(stu);v
16、oid print(struct student stu)printf(FORMAT,stu.num,stu.name,stu.score0,stu.score1,stu.score2);printf(n);,例 用结构体变量作函数参数,27,例 用结构体指针变量作函数参数,#include#define FORMAT“%dn%sn%fn%fn%fn”struct student int num;char name20;float score3;stu=12345,”Li Li,67.5,89,78.6;main()void print(struc student*)print(,28,11.
17、7 用指针处理链表,11.7.1 链表概述 链表是一种常见的重要的数据结构,是动态地进行存储分配的一种结构。链表的组成:头指针:存放一个地址,该地址指向一个元素 结点:用户需要的实际数据和链接节点的指针,图11-10,29,11.7 用指针处理链表,用结构体建立链表:struct student int num;float score;struct student*next;;其中成员num和score用来存放结点中的有用数据(用户需要用到的数据),next是指针类型的成员,它指向struct student类型数据(这就是next所在的结构体类型),图11-11,30,11.7 用指针处理链
18、表,11.7.2 简单链表,#include#define NULL 0 struct student long num;float score;struct student*next;main()struct student a,b,c,*head,*p;a.num=99101;a.score=89.5;b.num=99103;b.score=90;c.num=99107;c.score=85;head=,运行结果:1010189.51010390.01010785.0,31,11.7 用指针处理链表,处理动态链表所需的函数 库函数提供动态地开辟和释放存储单元的有关函数:malloc函数 其
19、函数原型为void*malloc(unsigned int size);其作用是内存的动态存储区中分配一个长度为size的连续空间。此函数的值(即“返回值”)是一个指向分配域起始地址的指针(类型为void)。如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)。,32,11.7 用指针处理链表,(2)calloc函数 其函数原型为void*calloc(unsigned,unsigned size);其作用是在内存的动态存储区中分配个长度为size的连续空间。函数返回一个指向分配域起始地址的指针;如果分配不成功,返回NULL。用calloc函数可以为一维数组开辟动态存储空间,
20、n为数组元素个数,每个元素长度为size,33,11.7 用指针处理链表,(3)free函数 其函数原型为 void free(void*p);其作用是释放由指向的内存区,使这部分内存区能被其他变量使用。是最近一次调用calloc或malloc函数时返回的值。free函数无返回值.,34,11.7 用指针处理链表,11.7.4 建立动态链表 所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系例11.5 写一函数建立一个有3名学生数据的单向动态链表.算法如图,图11-12,35,11.7 用指针处理链表,算法的实现:约定学号
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 11 结构
链接地址:https://www.31ppt.com/p-5657759.html