




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、苏小红,第8章 结构体与共用体,C语言大学实用教程,本章内容,结构体(结构structure) 、共用体(联合union)类型的定义 结构体变量、结构体数组 结构体变量、结构体数组与指针、函数的关系 用结构体实现动态数据结构 链表的概念及操作原理,从基本数据类型到抽象数据类型,二进制数 在早期的机器指令及汇编语言中,数据对象均用二进制数表示,没有类型的概念,基本数据类型 在高级语言中引入了基本数据类型:整型、实型、字符型等 基本数据类型不能方便的解决所有问题,有些语言(如PL/1)中试图规定较多的类型,如数组、树、栈等,但实践证明不是个好办法,用户自己构造数据类型-复合数据类型 表示复杂的数据
2、对象,典型的代表就是“结构体”,数组、指针也可算作此类,抽象数据类型(Abstract Data Type,简称ADT) 在复合数据类型基础上增加了对数据的操作 类跨时代的进步 例如汽车就是一种ADT,思考一个问题,在程序里表示一个人(姓名、年龄、性别、),怎么表示? 想表示多个人呢? 如何用计算机程序实现下述表格的管理?,表8-1 某学校学生成绩管理表,数组的解决方法,int studentId30; /* 最多可以管理30个学生, 每个学生的学号用数组的下标表示*/ charstudentName1030; charstudentSex230; int timeOfEnter30; /*入
3、学时间用int表示*/ int scoreComputer30;/*计算机原理课的成绩*/ int scoreEnglish30; /*英语课的成绩*/ int scoreMath30; /*数学课的成绩*/ int scoreMusic30; /*音乐课的成绩*/,数组的解决方法,int studentId30 = 1,2,3,4,5,6; charstudentName1030 = 令狐冲,林平之, 岳灵珊,任莹莹; charstudentSex230 = 男,男,女,女; int timeOfEnter30 = 1999,1999,1999,1999; int scoreComputer
4、30 = 90,78,89,78; int scoreEnglish30 = 83,92,72,95; int scoreMath30 = 72,88,98,87; int scoreMusic30 = 82,78,66,90;,数组的解决方法,数据的内存管理方式,数组的解决方法,分配内存不集中,寻址效率不高 对数组进行赋初值时,容易发生错位 结构显得比较零散,不容易管理,希望的内存分配图,结构体的解决方法,struct STUDENT int studentID; /*每个学生的序号*/ char studentName10;/*每个学生的姓名*/ char studentSex4; /*每
5、个学生的性别*/ inttimeOfEnter; /*每个学生的入学时间*/ 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 ;,构成结构体的变量称为结构体的成员(m
7、ember), 也称元素(element)或域(filed),结构体的定义只定义了数据的形式,即声明了一种复杂的数据类型,并未生成任何变量。,结构体的定义,先定义结构体类型再定义变量名,在定义类型的同时定义变量,直接定义结构体变量(不出现结构体名),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; i
8、nt age; float score; char 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
9、 year; ; typedef struct date 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
11、; int scoreEnglish; int scoreMath; 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,林
12、平之,男,1999,07,06,78,92,88,78, 3,岳灵珊,女,1999,07,06,89,72,98,66, 4,任莹莹,女,1999,07,06,78,95,87,90 ;,初始化,结构体数组,结构体数组的指针,struct STUDENT *pt; pt = stu;,stu0,stu1,stu2,pt,pt+,stu3,for (pt=stu; ptscoreComputer; sum1 = sum1 + pt-scoreEnglish; sum2 = sum2 + pt-scoreMath; sum3 = sum3 + pt-scoreMusic; for (i=0; i4
13、; i+) averagei = sumi/4; printf(%20s : %4.2fn, namei, *(average+i); ,例8.2:利用指向结构体数组的指针计算学生各科的平均成绩,例8.2,main() struct STUDENT *pt; float sum4 = 0.0,average4 = 0.0; int i; char *name=score of Computer,score of English, score of Math,score of Music; pt = stu; /*pt指向结构体数组的第一个元素*/ for (pt=stu; ptscoreCom
14、puter; sum1 = sum1 + pt-scoreEnglish; sum2 = sum2 + pt-scoreMath; sum3 = sum3 + pt-scoreMusic; for (i=0; i4; i+) averagei = sumi/4; printf(%20s : %4.2fn, namei, *(average+i); ,例8.1 :洗牌和发牌模拟,一付扑克有52张牌,分为4种花色(Suit): 黑桃(Spades)、红桃(Hearts)、草花(Clubs)、方块(Diamonds) 每种花色有13张牌面(Face): A,2,3,4,5,6,7,8,9,10,Ja
15、ck,Queen,King 设计一个结构体表示一张牌,由两个成分组成:花色、牌面: struct CARD char suit10; char face10; ; struct CARD card52; /*顺序存放扑克牌*/ 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内。
16、i=i+1 如果i=51,则重复第2步,否则,结束循环 输出结果 存在一个致命的问题: 在重复第2步时,产生的随机数可能与以前产生的随机数相同,相同意味着52张牌中出现2张以上相同的牌,例8.1 :洗牌和发牌模拟,解决方法 增加一步,判断新产生的随机数以前是否出现过 如果出现过,则放弃;如果以前未出现过,则保留 算法步骤: 产生051的随机数m,将其放于resulti内。 判断resulti在以前(result0resulti-1)是否出现过。如果出现过,则回到第2步;如果没出现过,则i=i+1 如果i=51,则重复第23步,否则,结束循环 输出结果,例8.1 :洗牌和发牌模拟,算法缺陷: 随
17、着随机数数量的增加,新的随机数与已经产生的随机数相同的可能性越来越大,有可能出现算法延迟问题 高效算法 将按照花色与牌面的顺序存放的牌(cardi)随机打乱 每次循环,程序选择一个051的随机数j,然后将数组中当前的CARD结构cardi与随机选出的j所在的数组元素cardj结构进行交换,例8.1 :洗牌和发牌模拟(P313),用结构体数组做函数参数 /*函数功能:将52张牌按黑桃、红桃、草花、方块花色顺序,面值按AK的顺序排列 函数参数:结构体数组wCard,表示不同花色和面值的52张牌 指针变量wFace,表示指向面值字符串数组face的指针 指针变量wSuit,表示指向花色字符串数组su
18、it的指针 函数返回值:无 */ void FillCard(struct CARD wCard,char *wFace,char *wSuit) inti; for (i=0; i52; i+) strcpy(wCardi.suit, wSuiti/13); strcpy(wCardi.face, wFacei%13); ,用结构体指针做函数参数 /*函数功能:将52张牌的顺序打乱, 函数参数:结构体数组变量wCard,表示52张牌 函数返回值:无 */ void Shuffle(struct CARD *wCard) int i,j; struct card temp; for (i=0;
19、 i52; i+) j = rand()%52; /*j = random(52);TC的库函数*/ temp = wCardi; wCardi = wCardj; wCardj = temp; /* 洗牌过程 */ ,例8.1 :洗牌和发牌模拟(P313),用结构体指针做函数参数 /*函数功能:输出发牌结果 函数参数:结构体数组变量wCard,表示有52张牌 函数返回值:无 */ void Deal(struct CARD *wCard) int i; for (i=0; i52; i+)/*输出发牌结果*/ printf(%10s%10sn, wCardi.suit, wCardi.fac
20、e); ,例8.1 :洗牌和发牌模拟(P313),结构体与函数,向函数传递结构体的单个成员 单向值传递,函数内对结构内容的修改不影响原结构 向函数传递结构体的完整结构 单向值传递,函数内对结构内容的修改不影响原结构,开销大 向函数传递结构体的首地址 用结构体数组或者结构体指针做函数参数 除提高效率外,还可以修改结构体指针所指向的结构体的内容,思考,下面的结构什么意思? struct temp int data; struct temp pt; TC下的错误提示: Undefined structure temp Structure size too large VC下的错误提示: pt use
21、s undefined struct temp 下面的的呢? struct temp int data; struct temp *pt;,动态数据结构,结构体声明时不能包含自我,但可以包含指向本结构体类型的指针变量 链表(Linked table) struct Link int data; struct Link *next; ,位字段,想表达人的姓名、出生年、月、日,都定义什么类型的成员变量? struct personchar name12;int year;char month;char day; ; 这样有很多的空间浪费,比如month只可能取值1-12,4bits足够,位字段,struct personchar name12;unsigned int year : 12; unsigned int month : 4;unsigned int day : 5; ; 调整成员顺序可以让结构更紧凑 每个位段都可以当作一个无符号整型数使用 表达范围当然受限,而且当然不能取地址,共用体,或称为联合(Union),union numbershort x;char ch; float y; 基本
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高粱根教学课件
- 赵志祥的一分钟教学课件
- 纹身教学课件
- 美术教学课件大纲
- 阅读教学指导课件
- 顺采茶教学课件
- 教学课件母版设计
- 散步教学说课课件
- 幼儿教学挂图课件
- 浙江宁波宁海县2022自主招生考试数学试题真题(含答案详解)
- GB/T 4074.8-2009绕组线试验方法第8部分:测定漆包绕组线温度指数的试验方法快速法
- GB/T 28575-2020YE3系列(IP55)三相异步电动机技术条件(机座号63~355)
- 国际公法学 马工程课件 4 第四章
- 青海省西宁市《职业能力测试》事业单位国考真题
- 沟通中的提问技巧课件
- 2023年浙江黄龙体育发展有限公司招聘笔试模拟试题及答案解析
- 外科学骨折概论课件
- 阿片类药物镇痛机制课件
- 产品成本核算流程图
- 母线槽安装检验批质量验收记录
- 生物吸附课件
评论
0/150
提交评论