《语言 第七章 结构体与共用体PPT课件》由会员分享,可在线阅读,更多相关《语言 第七章 结构体与共用体PPT课件(62页珍藏版)》请在金锄头文库上搜索。
1、本章内容,结构体(结构structure) 、共用体(联合union)类型的定义 结构体变量、结构体数组 结构体变量、结构体数组与指针、函数的关系 用结构体实现动态数据结构 链表的概念及操作原理,从基本数据类型到抽象数据类型,二进制数 在早期的机器指令及汇编语言中,数据对象均用二进制数表示,没有类型的概念,基本数据类型 在高级语言中引入了基本数据类型:整型、实型、字符型等 基本数据类型不能方便的解决所有问题,有些语言(如PL/1)中试图规定较多的类型,如数组、树、栈等,但实践证明不是个好办法,用户自己构造数据类型-复合数据类型 表示复杂的数据对象,典型的代表就是“结构体”,数组、指针也可算作此
2、类,抽象数据类型(Abstract Data Type,简称ADT) 在复合数据类型基础上增加了对数据的操作 类跨时代的进步 例如汽车就是一种ADT,思考一个问题,在程序里表示一个人(姓名、年龄、性别、),怎么表示? 想表示多个人呢? 如何用计算机程序实现下述表格的管理?,表8-1 某学校学生成绩管理表,数组的解决方法,int studentId30; /* 最多可以管理30个学生, 每个学生的学号用数组的下标表示*/ charstudentName1030; charstudentSex230; int timeOfEnter30; /*入学时间用int表示*/ int scoreCompu
3、ter30;/*计算机原理课的成绩*/ int scoreEnglish30; /*英语课的成绩*/ int scoreMath30; /*数学课的成绩*/ int scoreMusic30; /*音乐课的成绩*/,数组的解决方法,int studentId30 = 1,2,3,4,5,6; charstudentName1030 = 令狐冲,林平之, 岳灵珊,任莹莹; charstudentSex230 = 男,男,女,女; int timeOfEnter30 = 1999,1999,1999,1999; int scoreComputer30 = 90,78,89,78; int scor
4、eEnglish30 = 83,92,72,95; int scoreMath30 = 72,88,98,87; int scoreMusic30 = 82,78,66,90;,数组的解决方法,数据的内存管理方式,数组的解决方法,分配内存不集中,寻址效率不高 对数组进行赋初值时,容易发生错位 结构显得比较零散,不容易管理,希望的内存分配图,结构体的解决方法,struct STUDENT int studentID; /*每个学生的序号*/ char studentName10;/*每个学生的姓名*/ char studentSex4; /*每个学生的性别*/ inttimeOfEnter; /
5、*每个学生的入学时间*/ intscoreComputer; /*每个学生的计算机原理成绩*/ intscoreEnglish; /*每个学生的英语成绩*/ intscoreMath; /*每个学生的数学成绩*/ intscoreMusic; /*每个学生的音乐成绩*/ ; struct STUDENT是一个类型 struct STUDENT students4; students0.studentNamestudents0.Sex 它们都是变量,一般称为结构的成员变量,用户自定义的数据类型,结构体: 把关系紧密且逻辑相关的多种不同类型的变量组织到统一的名字之下,也称复合数据类型 这种类型的变
6、量占用相邻的一段内存单元 共用体: 把情形互斥但又逻辑相关的多种不同类型的变量组织在一起 这种类型的变量占用同一段内存单元,因此每一时刻只有一个数据起作用,struct student int num; char name20; char sex; int age; float score; char addr30; ;,structure definition形成一个样板,用于生成结构体变量。,一般形式:,struct 结构体名 类型关键字 成员名1; 类型关键字 成员名2 . 类型关键字 成员名n ;,构成结构体的变量称为结构体的成员(member), 也称元素(element)或域(fi
7、led),结构体的定义只定义了数据的形式,即声明了一种复杂的数据类型,并未生成任何变量。,结构体的定义,先定义结构体类型再定义变量名,在定义类型的同时定义变量,直接定义结构体变量(不出现结构体名),struct student student1,student2;,struct student int num; char name20; char sex; int age; float score; char addr30; student1,student2;,struct int num; char name20; char sex; int age; float score; char
8、addr30; student1,student2;,结构体变量的定义,结构体变量的定义,用typedef为已存在的类型定义新名字 struct student int num; char name20; char sex; int age; float score; char addr30; ; typedef struct student STUD; STUD student1,student2; 用STUD代替 struct student类型;,结构体定义可以嵌套,struct date int month; int day; int year; ; typedef struct da
9、te DATE;,struct student int num; char name20; char sex; int age; DATE birthday; char addr30; student1,student2;,struct student 占用内存字节数=?,double 占用内存字节数 = 8,结构体变量的定义,结构(Structure)的内存占用,一个结构变量的成员变量在内存中是相邻的 整个结构变量的将占用多少内存呢? 是所有成员变量的内存总和吗? 事实上,所有数据类型在内存中都是从偶数地址开始存放的,且结构所占的实际空间一般是按照机器字长对齐的 不同的编译器、不同的平台,对
10、齐方式会有变化,不过一般的编译器都可以设定按照多大对齐 我们可以用sizeof来获得结构的大小,结构体指针,struct pointint x;int y; struct point pt; /*定义结构体变量*/ struct point *ppt; /*定义结构体指针*/ ppt = /*指向运算符*/ 第二种更常用,定义:,struct STUDENT intstudentID; charstudentName10; char studentSex4; struct date timeOfEnter; int scoreComputer; int scoreEnglish; int sc
11、oreMath; int scoreMusic; ; struct STUDENT stu30;,结构体数组,struct STUDENT intstudentID; charstudentName10; char studentSex4; struct date timeOfEnter; int scoreComputer; int scoreEnglish; int scoreMath; int scoreMusic; ; struct STUDENT stu30 = 1,令狐冲,男,1999,12,20,90,83,72,82, 2,林平之,男,1999,07,06,78,92,88,7
12、8, 3,岳灵珊,女,1999,07,06,89,72,98,66, 4,任莹莹,女,1999,07,06,78,95,87,90 ;,初始化,结构体数组,例8.1 :洗牌和发牌模拟,一付扑克有52张牌,分为4种花色(Suit): 黑桃(Spades)、红桃(Hearts)、草花(Clubs)、方块(Diamonds) 每种花色有13张牌面(Face): A,2,3,4,5,6,7,8,9,10,Jack,Queen,King 设计一个结构体表示一张牌,由两个成分组成:花色、牌面: struct CARD char suit10; char face10; ; struct CARD card
13、52; /*顺序存放扑克牌*/ int result52; /*存放洗牌发牌结果*/ char *suit = Spades,Hearts,Clubs,Diamonds; char *face = A,2,3,4,5,6,7,8,9, 10,jack,Queen,King;,例8.1 :洗牌和发牌模拟,发牌过程 将52张牌按照随机的顺序存放 算法步骤: 产生051的随机数,将其放于resulti内。 i=i+1 如果i=51,则重复第2步,否则,结束循环 输出结果 存在一个致命的问题: 在重复第2步时,产生的随机数可能与以前产生的随机数相同,相同意味着52张牌中出现2张以上相同的牌,例8.1
14、:洗牌和发牌模拟,解决方法 增加一步,判断新产生的随机数以前是否出现过 如果出现过,则放弃;如果以前未出现过,则保留 算法步骤: 产生051的随机数m,将其放于resulti内。 判断resulti在以前(result0resulti-1)是否出现过。如果出现过,则回到第2步;如果没出现过,则i=i+1 如果i=51,则重复第23步,否则,结束循环 输出结果,例8.1 :洗牌和发牌模拟,算法缺陷: 随着随机数数量的增加,新的随机数与已经产生的随机数相同的可能性越来越大,有可能出现算法延迟问题 高效算法 将按照花色与牌面的顺序存放的牌(cardi)随机打乱 每次循环,程序选择一个051的随机数j
15、,然后将数组中当前的CARD结构cardi与随机选出的j所在的数组元素cardj结构进行交换,主函数以外,#include #include #include #include Struct CARD char suit10;char face10;,main( ) char *suit = Spades,Hearts,Clubs,Diamonds; char *face = A,2,3,4,5,6,7,8,9, 10,jack,Queen,King; int i,j; int result52=0; struct CARD card52; for(i=0;i52;i+) resulti=-1
16、; for(i=0;i52;i+) strcpy(cardi.suit,suiti/13); strcpy(cardi.face,facei%13); srand(time(NULL); i=0;,While(1) resulti=rand( )%52; for(j=0;j=51) break; for(i=0;i52;i+) printf(“%10s%5sn”,cardresulti.suit, cardresulti.face); ,高效算法,#include #include #include #include Struct CARD char suit10;char face10;,main( ) char *suit = Spades,Hearts,Clubs,Diamonds; char *face = A,2,3,4,5,6,7,8,9, 10,jack,Queen,King; int i,j; struct CARD card52,temp; for(i=0;i5