结构体与共用体程序设计甘玲.ppt
《结构体与共用体程序设计甘玲.ppt》由会员分享,可在线阅读,更多相关《结构体与共用体程序设计甘玲.ppt(136页珍藏版)》请在三一办公上搜索。
1、第8章 结构体与共用体程序设计,C语言程序设计,2,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,本章内容,共用体,结构体类型与变量、结构体数组,自引用结构、动态内存分配、链表,结构体指针,位运算、位段,3,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,信息查询问题,数组是非常有用的一种数据结构,但它的所有元素的数据类型都必须相同。但是,在现实生活中,将一组异型的数据看作一个整体也很重要。如:对一个班的所有学生各课程按平均分排名。,假定输入某班30个学生信息(包括:学号、姓名、性别、5门课程成绩、平均分),要求按平均分由高到低输出
2、该班学生信息。我们该怎么做呢?,4,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,问题分析,例8-1 对一个班的学生成绩进行排名。假定要求输入某班30个学生的信息(包括学号、姓名、性别、3门课成绩),求得平均成绩,要求按平均成绩由高到低输出该班学生信息。【分析】学生“学号”、“姓名”、“性别”使用字符型数据,几门课程的“成绩”使用整型数据,“平均分”使用实型数据,可以分别定义不同的变量来存放这几个类型的数据。如果要显示某个学生的信息,那么要找到该学生的信息就要从这几个变量中分别查找,并且还要同步移动数组元素位置,这给程序员带来了很多不便。,5,解析C程序设计(第
3、2版)第8章 结构体与共用体程序设计,2023/10/17,数组解决方式,int studentId30;/*最多可以管理30个学生,每个学生的学号用数组的下标表示*/char studentName3010;int studentSex;int scoreMath30;/*数学课的成绩*/int scoreEnglish30;/*英语课的成绩*/int scoreComputer30;/*计算机原理课的成绩*/int scoreC30;/*C语言课的成绩*/int scoreTelecomm30;/*通信网的成绩*/int aveage30;/*平均成绩*/,6,解析C程序设计(第2版)第8
4、章 结构体与共用体程序设计,2023/10/17,数组解决方式,数据的内存管理方式,分配内存不集中,寻址效率不高 对数组进行赋初值时,容易发生错位 结构显得比较零散,不容易管理,7,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,希望的内存分配,8,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,问题分析,在C语言中,允许用户自己构造一种新的数据类型,它的成员可以包括各种数据类型,这种数据结构就是结构体(structure),它相当于其他高级语言中的“记录”。结构体中的元素称为“成员”,在“记录”中称为“字段”,用来存储所有“记录”的
5、数据集合称为“数据库”。结构体中的所有成员变量在内存中是连续存储的,结构体的内存空间大小为各成员内存空间大小之和。本例声明一个结构体类型struct student,它包括:学号、姓名、性别、3门课成绩、平均成绩共5个成员。存放一个学生的信息定义一个结构体变量,要存放30个学生的信息就要定义一个结构体数组。,9,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-1 实现代码,/*LI8_1.c*/#include/*声明结构体类型*/struct student char num5;/*学号*/char name10;/*姓名*/char sex;/*性别:M
6、男,F女*/int score3;/*3门成绩*/float average;/*平均成绩*/;/*自定义函数的声明*/void enter(struct student a,int n);/*输入学生信息*/void sort(struct student a,int n);/*按平均成绩由高到低排序*/void print(struct student a,int n);/*输出学生信息*/*主函数*/int main()int n;struct student stu30;/*定义结构体数组*/printf(请输入该班学生人数n(n=30):);scanf(%d,10,解析C程序设计(第
7、2版)第8章 结构体与共用体程序设计,2023/10/17,例8-1程序(续1),/*输入函数*/void enter(struct student a,int n)int i,j,sum=0;printf(请输入%d 个学生信息(学号,姓名,性别,3门课成绩):n,n);for(i=0;in;i+)printf(请输入第%d 个学生的学号 姓名 性别:n,i+1);scanf(%s%s%c,ai.num,ai.name,/*求每个学生平均成绩*/,11,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-1程序(续2),/*选择法排序函数*/void sort
8、(struct student a,int n)int i,j,p;struct student temp;/*定义结构体变量*/for(i=0;iap.average)/*引用结构体成员*/p=j;if(p!=i)temp=ai;ai=ap;ap=temp;/*输出函数*/void print(struct student a,int n)int i,j,mc=1;/*mc表示名次*/printf(n按平均成绩排名的名次表:n);printf(学号t姓名t性别tcj1tcj2tcj3t平均成绩t名次n);for(i=0;in;i+)printf(%st%st%ct,ai.num,ai.nam
9、e,ai.sex);for(j=0;j3;j+)printf(%dt,ai.scorej);printf(%6.1ft%dn,ai.average,mc+);,12,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-1程序分析,本例程序定义了一个结构体类型student,并用它定义了包括30个元素的stu结构体数组和结构体变量temp。struct student char num5;/*学号*/char name10;/*姓名*/char sex;/*性别:M男,F女*/int score3;/*3门成绩*/float average;/*平均成绩*/;st
10、ruct student stu30;/*定义结构体数组*/struct student temp;/*定义结构体变量*/在“结构体数组元素之间交换”时,不是对结构体数组元素各成员进行交换,而是对该结构体数组元素进行整体交换。交换语句为:temp=ai;ai=ap;ap=temp;本程序涉及到结构体类型的声明、结构体变量和数组的定义、结构体成员的引用、结构体的赋值和输出等知识点。,13,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体,结构体(structure)是一个或多个相同数据类型或不同数据类型的变量集合在一个名称下的用户自定义数据类型。由于其成员的类
11、型可以不同,因此,用户必须先声明结构体类型,再根据结构体类型定义结构体变量来存放相应数据。,14,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体类型,结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-自定义数据类型结构体类型定义格式:,15,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,声明结构体类型,例 struct student int num;char name20;char sex;int age;float score;char addr30;,结构体类型定义描述结构的组织形式,不分配内存,不能初始化
12、,结构体类型定义的作用域,16,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,使用typedef定义数据类型的别名,功能:用自定义名字为已有数据类型命名类型定义简单形式:typedef type name;,类型定义语句关键字,已有数据类型名,用户定义的类型名,例 typedef int INTEGER;,例 typedef float REAL;,类型定义后,与已有类型一样使用,例 INTEGER a,b,c;REAL f1,f2;,说明:1.typedef 没有创造新数据类型2.typedef 是定义类型,不能定义变量3.typedef 与 define 不
13、同,define typedef预编译时处理 编译时处理简单字符置换 为已有类型命名,17,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,声明一个新的类型别名的方法,1、按定义变量方法先写出定义体 如 int i;2、将变量名换成新类型名 如 int INTEGER;3、最前面加typedef 如 typedef int INTEGER;4、用新类型名定义变量 如 INTEGER i,j;,类型定义可嵌套,例 定义结构体类型 struct date int month;int day;int year;d;,例 定义结构体类型 struct date int m
14、onth;int day;int year;DATE;,例 定义结构体类型typedef struct date int month;int day;int year;DATE;,例 typedef struct club char name20;int size;int year;GROUP;typedef GROUP*PG;PG pclub;,GROUP为结构体类型PG为指向GROUP的指针类型,GROUP*pclub;struct club*pclub;,18,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体变量的定义,先定义结构体类型,再定义结构体变
15、量一般形式:,第一种形式,例 struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu1,stu2;,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 变量名表列;,例#define STUDENT struct student STUDENT int num;char name20;char sex;int age;float score;char addr30;STUDENT stu1,stu2;,19,解析C程序设计
16、(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体变量的定义,定义结构体类型的同时定义结构体变量一般形式:,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.变量名表列;,例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,第二种形式,20,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体变量的定义,第三种形式,直接定义结构体变量一般形式:,struct 类型标识符 成员名;类型标识符 成员名;.变
17、量名表列;,例 struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,用无名结构体直接定义变量,只能使用一次,不能再用该结构体定义变量名表列以外的其他变量,21,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体说明,结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆结构体类型及变量的作用域与生存期,22,解析C程序设计(第2版)第8章 结构体与共用体程序
18、设计,2023/10/17,结构体变量的引用,引用规则 结构体变量不能整体引用,只能引用变量成员,可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用,成员(分量)运算符优先级:1结合性:从左向右,引用方式:结构体变量名.成员名,23,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体变量的初始化,形式一,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 结构体变量=初始数据;,例 struct student int num;char name20;char sex;int age;char addr30;
19、struct student stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,24,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体变量的初始化,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;,例 struct student int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,形式二,25,解析C程序设计(第2版)第8章 结构体与共用体程序
20、设计,2023/10/17,结构体变量的初始化,struct 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;,例 struct int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,形式三,26,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-2 输出3门课平均成绩,【分析】学生的基本信息包括学号、姓名、性别、地址、3门课程成绩、平均成绩,假设这个学生的3门课程的成绩分别为数学90分、英语80分、C语言85分
21、,3门课程成绩用整型数组表示,平均成绩用浮点数表示。,27,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-2程序,/*LI8_2.c*/*声明结构体类型struct scoretype*/#include struct scoretype int score3;/*3门课成绩*/float average;/*平均成绩*/;/*声明结构体类型struct student*/typedef struct scoretype SCORE;struct student char num5;/*学号*/char name10;/*姓名*/char sex;/*性别
22、:M-男,F-女*/char*addr;/*地址*/SCORE a;/*成绩*/;typedef struct student STUDENT;,int main()int i,sum=0;STUDENT s=101,zhangjuan,F,Beijing,90,85,80,0.0;for(i=0;i3;i+)sum+=s.a.scorei;/*求总成绩*/*求平均成绩*/=sum/5.0;/*输出学生信息*/printf(num=%s,name=%s,sex=%c,addr=%s,average=%fn,s.num,s.name,s.sex,s.addr,);return 0;,28,解析C
23、程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体变量作函数参数,结构体变量作为函数的参数,系统采用“数据复制”的方式,系统开销大,影响程序的执行效率,因此一般采用结构体指针作为函数的参数。1、用结构体变量的成员作函数参数 如用:stu1.num、stu2.name2等作函数实参,将实参传给形参。用法和用普通变量作实参是一样的,属于“值传递”方式。应当注意实参与形参的类型保持一致。2、用结构体变量作函数实参 老版本的C系统不允许用结构体变量作实参,而ANSIC取消了这一限制。用结构体变量作实参时,采取的是“值传递”方式,应当注意实参与形参必须是同类型的结构体变量。由
24、于“值传递”时系统开销比较大,一般不采用这种方式。,29,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,函数的返回值为结构体类型,一个函数可以带回一个函数值,这个函数值可以是整型、实型、字符型、指针等,也可以是结构体变量或结构体指针。,30,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-3 输出学生成绩等信息,/*LI8_3.c*/#include#include#define FORMAT%st%st%fn%ft%fn/*声明结构体类型struct student*/struct student char num5;/*学
25、号*/char name10;/*姓名*/int score3;/*3门成绩*/;typedef struct student STUDENT;void print(STUDENT stu);int main()STUDENT stu;Strcpy(stu.num,106);/*给结构体成员赋值*/strcpy(stu.name,Li Lin);stu.score0=67;stu.score1=89;stu.score2=78;print(stu);return 0;void print(STUDENT stu)/*结构体变量作函数参数*/printf(FORMAT,stu.num,stu.n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 共用 程序设计
链接地址:https://www.31ppt.com/p-6332276.html