C课件:第11章结构体与共用体.ppt
《C课件:第11章结构体与共用体.ppt》由会员分享,可在线阅读,更多相关《C课件:第11章结构体与共用体.ppt(54页珍藏版)》请在三一办公上搜索。
1、C+第11章结构体与共用体,1、结构体类型的定义2、结构体变量的定义及引用3、结构体数组4、结构体类型的指针5、链表的基本操作6、共用体和枚举类型(了解),结构体类型的引入,问题:为了描述一个事物的不同属性,需要用到各种不同类型的数据,这些数据彼此相关,形成一个有机的整体。例如:一个教师的基本信息由姓名、性别、年龄、职称、工资等几项组合而成。如何描述一个教师的情况呢?前面我们已学习过各种基本类型的变量和数组,而且我们知道,各个变量之间是相互独立的,无任何联系;而数组只能用来表示一批相同类型的数据。因此,若用单个变量分别表示教师的姓名、性别、年龄等属性,则难以反映他们之间的内在联系;若用数组,则
2、根本无法表示,因为姓名、性别、年龄等不属同一种数据类型。C语言中用“结构体”来描述由多个不同类型的数据组成的数据集合。相当于其他高级语言中的“记录”.,11.1结构体类型的定义,与基本数据类型不同的是,结构体是又一种构造类型,是由多个类型的数据成员组合而来的。因此该类型的具体内容应根据需要先定义,后使用。可以定义如下结构体类型来描述教师的基本情况:struct teacher/*struct 是关键字*/char name30;/*内是该类型的各成员*/char sex;int age;char position10;float salary;/*语句末尾是“;”*/该结构体类型名为struc
3、t teacher,teacher 是该结构体的标识符;该类型包含有6个成员的数据项:name、sex、age、position 和salary,其中每个成员项都有自己的类型。,可见,定义一种新的结构体类型的一般形式是:struct 结构体类型名 成员类型 成员名;成员类型 成员名;其中,struct 是 关键字,结构体类型名、结构体成员名的命名规则同变量的命名规则一样。特别提示:struct teacher只是一种具体的结构体类型,根据需要,程序员可以定义多个不同内容的结构体类型。其中的成员项是该类型的组成部分,而不是变量。结构体类型的成员可以是基本类型的变量或数组,也可以是结构体类型的数据
4、。即结构体类型的嵌套定义。例如,若将教师的年龄改为出生日期,则可以将出生日期定义为一个结构体类型,然后嵌入 struct teacher中。,将出生日期单独定义为一个结构体类型后再嵌入。Struct date_type int year;int month;int day;Struct teacher_2 char name30;char sex;struct date_type birthday;char position10;float salary;(常用),直接嵌入。Struct teacher_3 char name30;char sex;struct date_type int y
5、ear;int month;int day;birthday;char position10;float salary;/*成员birthday又是一个结构体类型的数据。*/,11.2结构体变量的定义及引用,经以上定义后,结构体类型struct teacher与系统定义的类型int、long、float 等一样,可以用它来定义该类型的变量、数组、函数等。不同的是:结构体类型的作用范围是有限制的。在函数体内定义的结构体类型的作用域为本函数内,在函数体外定义的结构体类型的作用域为本程序文件内,若要引用不在本文件内的结构体类型,通常用#include命令将定义该类型的文件包含进来。例11.1定义一个
6、结构体变量,用于存放一个教师的信息,然后将其输出。,#include stdio.hmain()struct teacher/*该类型的作用范围在本函数内*/char name30;char sex;int age;char position10;float salary;struct teacher person;/*定义结构体变量person*/strcpy(person.name,wang li);person.sex=f;/*给各成员赋值*/person.age=30;strcpy(person.position,middle);person.salary=1600;,printf(n
7、 name sex age position salary);printf(n%-10s%3c%5d%10s%8.2f,person.name,person.sex,person.age,person.position,person.salary);分析:*本例中结构体类型在函数体内定义,其作用范围在本函数体内。*先定义结构体类型,后定义结构体变量。*对结构体变量输入输出操作、或将基本类型的数据赋给结构体变量时,需分别访问各个基本类型的成员,不能整体赋值或输入输出。如:printf(“%s%c%d%s%f”,person);错!person=“li li”,f,24,“primary”,100
8、0;错!,例11.2 定义一个结构体类型,包含通讯录中的如下信息:姓名、年龄、电话、通讯地址;并定义该类型的变量,输入数据并输出。程序l11_2.c#include stdio.hstruct address_list/*在函数体外定义结构体类型*/char name10;/*该类型的作用域为本程序内*/int age;char tel10;char address40;main()struct address_list s;/*定义变量s,占空间62个字节*/printf(n input name:);gets(s.name);,printf(input age:);scanf(%d,分析:
9、*结构体类型address_list 放在函数体外定义,其作用范围为本程序文件内。*结构体变量的输入输出需逐个访问基本类型的成员,引用方法与同类型的变量、数组相同。,例11.3 定义一结构体类型,包含工人的工资信息:编号、姓名、工资。并定义变量存放两人的数据,然后交换,输出交换前后的信息。程序l11_3.c#include stdio.hmain()struct salary_list char no10;char name30;float salary;struct salary_list z,x=10,li ming,2000,y=12,wang yan,2500;/*结构体变量的初始化,
10、给出各成员的数据并用括起来,各成员之间用逗号分开*/,printf(n no name salary);printf(nx:%-5s%-6s%10.2f,x.no,x.name,x.salary);printf(ny:%-5s%-6s%10.2f,y.no,y.name,y.salary);z=x;x=y;y=z;/*交换两个结构体变量*/printf(nafter exchange:);printf(nx:%-5s%-6s%10.2f,x.no,x.name,x.salary);printf(ny:%-5s%-6s%10.2f,y.no,y.name,y.salary);特别提示:同类型的结
11、构体变量可以整体赋值,即可以将一个结构体变量整体赋给相同类型的另一个结构体变量。,说明一、定义结构体变量,定义结构体变量的方法有三种,(经常用第一种):方法一:先定义结构体类型,再定义结构体变量。如:struct teacher t1,t2;(例11.1)方法二:定义结构体类型的同时定义结构体变量(例11.2)。又如:struct course math long no;4B char name30;math,english;30B 若以后还需用到此结构体类型,定义方法同1:struct course chemic;方法三:格式同方法(二),其中类型名course 省略,缺点是该类型无法再次引
12、用。*结构体变量的存储:系统按结构体类型中各成员的类型给变量分配存储空间。如上图:,no name,说明二、结构体变量的引用,结构体变量定义后,可以分两个层次引用:*访问结构体变量的成员。*引用整个结构体变量。1、使用成员运算符“.”引用结构体变量的成员,“.”的优先级仅次于括号。如例11.1、11.2、11.3中的person.name,person.age x.no,s,salary等成员的赋值、输入、输出。person.age+等价于(person.age)+对结构体变量中的成员的操作与基本类型的变量完全相同。注意:当结构体类型嵌套定义时,应逐级访问。如struct teacher_2
13、pp;pp.birthday.year=1999;2、相同类型的结构体变量之间可以整体赋值。如例11.3中交换两个结构体变量的值。,11.2结构体数组,结构体数组用于保存一批同类型的结构体数据。每个数组元素相当于一个结构体变量。例:11.4输入三门课的信息(课程编号、课程名),并输出。分析:*每门课的信息包含2项,用结构体类型表示,其成员有两项,即课程编号和课程名。*三门课的信息,用一维数组保存。输入:可以赋初值,也可由用户输入,本例中采用赋初值的方式。程序l11_2_1.c 说明:结构体数组的初始化同基本类型的一维数组,只不过每个数组元素是用括起的一个结构体常量。数组元素中每个成员的访问,同
14、变量的成员的访问。,例11.5输入N个学生的学号、姓名、三门课的成绩,计算每人的平均成绩,并按平均成绩由高到低排序,输出排序后的成绩表。分析:*每个学生的信息包括多项,用结构体类型表示,其成员有学号、姓名、三门课的成绩、平均成绩。N个学生的信息用一维数组保存。*算法:输入并计算平均成绩、排序、输出三步。可将后面两项功能分别用函数实现,在主函数中调用。设排序函数为sort(),输出函数为output().分析每个函数的具体组成:函数类型 参数 函数体程序l11_2_2.c,/*例11.5程序*/struct stu char no8;char name10;float score3;float
15、aver;#include stdio.h#include stdlib.h#define N 3#define STU_SC struct stu,main()void sort(STU_SC sc1),output(STU_SC sc2);STU_SC sc_listN;int i,j;char temp10;float sum;printf(n input no,name,score(13):);for(i=0;iN;i+)printf(nstudent%d:n,i+1);sum=0;printf(no:);gets(sc_listi.no);printf(name:);gets(sc_
16、listi.name);for(j=0;j3;j+)printf(score%d:,j+1);gets(temp);sc_listi.scorej=atof(temp);sum+=sc_listi.scorej;,sc_listi.aver=sum/3;sort(sc_list);output(sc_list);void sort(STU_SC sc1)int i,j,k;STU_SC t;for(i=0;isc1k.aver)k=j;if(k!=i)t=sc1k;sc1k=sc1i;sc1i=t;,void output(STU_SC sc2)int i;printf(n no name s
17、core1 score2 score3 aver);for(i=0;iN;i+)printf(n%-8s%-10s,sc2i.no,sc2i.name);printf(%8.2f%8.2f%8.2f%8.2f,sc2i.score0,sc2i.score1,sc2i.score2,sc2i.aver);,通过本例说明:1、结构体数组中的每一个数组元素相当于一个同类型的结构体变量。2、对数组元素的输入输出及运算均需对元素的基本类型的成员进行,只有同类型的数组元素才可以作为整体相互赋值。3、结构体数据的成员通常类型各不相同,输入各成员数据时应注意:,4、关于成员数据的输入技巧:*为了正确读入任意字
18、符串,通常用gets()输入字符串,而不用scanf()。*为了避免多余的回车符影响数据的正常输入,整型、实型的数据也用gets()但作字符串读入,然后再用相应的函数转换成所需类型。如:char t20;gets(t);sc_listi.scorej=atof(t);同理,atoi(t)则转换成整型。*但输入单个字符时,通常用:ch=getchar();getchar();5、本例中,用结构体数组名作函数参数,传递的是数组的首地址,实现主、被调函数共用同一个结构体数组。,11.3指向结构体类型的指针,结构体变量在内存中占据一内存段,该内存段的首地址就是该结构体变量的指针。通过指向结构体类型数据
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课件 11 结构 共用
链接地址:https://www.31ppt.com/p-6504394.html