C语言学习课件结构体与共用体.ppt

上传人:小小飞 文档编号:3817228 上传时间:2019-09-25 格式:PPT 页数:40 大小:403.53KB
返回 下载 相关 举报
C语言学习课件结构体与共用体.ppt_第1页
第1页 / 共40页
C语言学习课件结构体与共用体.ppt_第2页
第2页 / 共40页
C语言学习课件结构体与共用体.ppt_第3页
第3页 / 共40页
C语言学习课件结构体与共用体.ppt_第4页
第4页 / 共40页
C语言学习课件结构体与共用体.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《C语言学习课件结构体与共用体.ppt》由会员分享,可在线阅读,更多相关《C语言学习课件结构体与共用体.ppt(40页珍藏版)》请在三一文库上搜索。

1、第8章 结构体与共用体,C语言大学实用教程,本章内容,结构体(结构structure) 、共用体(联合union)类型的定义 结构体变量、结构体数组 向函数传递结构体变量、结构体数组,从基本数据类型到抽象数据类型,二进制数 在早期的机器指令及汇编语言中,数据对象均用二进制数表示,没有类型的概念,基本数据类型 在高级语言中引入了基本数据类型:整型、实型、字符型等 基本数据类型不能方便的解决所有问题,有些语言中试图规定较多的类型,如数组、树、栈等,但实践证明不是个好办法,从基本数据类型到抽象数据类型,用户自己构造的数据类型复合数据类型 表示复杂的数据对象,典型的代表就是“结构体”,数组、指针也可算

2、作此类,抽象数据类型(Abstract Data Type,简称ADT) 在复合数据类型基础上增加了对数据的操作 类跨时代的进步,思考一个问题,在程序里表示一个人(姓名、年龄、性别、),怎么表示? 想表示多个人呢? 如何用计算机程序实现下述表格的管理?,表8-1 某学校学生成绩管理表,数组的解决方法,int studentId30; /* 最多可以管理30个学生, 每个学生的学号用数组的下标表示*/ char studentName3010; /* 最多可以管理30个学生, 每个学生的姓名是一个字符串*/ char studentSex302; /* 性别是一个字符串*/ int timeOf

3、Enter30; /*入学时间用int表示*/ int scoreComputer30;/*计算机原理课的成绩*/ int scoreEnglish30; /*英语课的成绩*/ int scoreMath30; /*数学课的成绩*/ int scoreMusic30; /*音乐课的成绩*/,int score 304; /* 30个学生, 每人4门课的成绩*/,无法使一个数组中存放不同类型的数据,数组的解决方法,int studentId30 = 1,2,3,4,5,6; char studentName3010=“令狐冲“,“林平之“, “岳灵珊“,“任莹莹“; char studentSe

4、x302=“男“,“男“,“女“,“女“; int timeOfEnter30 = 1999,1999,1999,1999; int scoreComputer30 = 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 stu

5、dentID; /*每个学生的序号*/ char studentName10;/*每个学生的姓名*/ char studentSex2; /*每个学生的性别*/ int timeOfEnter; /*每个学生的入学时间*/ int scoreComputer; /*每个学生的计算机原理成绩*/ int scoreEnglish; /*每个学生的英语成绩*/ int scoreMath; /*每个学生的数学成绩*/ int scoreMusic; /*每个学生的音乐成绩*/ ; struct STUDENT是一个类型 struct STUDENT students4;/*声明结构体类型的数组*/

6、 students0.studentID students0.scoreComputer 它们都是变量,一般称为结构体的成员变量,声明结构体类型:,用户自定义的数据类型,结构体: 把关系紧密且逻辑相关的多种不同类型的变量组织到统一的名字之下,也称复合数据类型 这种类型的变量占用相邻的一段内存单元 共用体: 把情形互斥但又逻辑相关的多种不同类型的变量组织在一起 这种类型的变量占用同一段内存单元,因此每一时刻只有一个数据起作用,struct student int num; char name20; char sex; int age; float score; char addr30; ;,形成

7、一个样板,用于形成组成结构体的元素。,一般形式:,struct 结构体名 类型关键字 成员名1; 类型关键字 成员名2; . 类型关键字 成员名n; ;,构成结构体的元素(element)称为结构体的成员(member), 也称域(filed)。,结构体的声明只定义了数据类型的组成形式,即声明了一种复杂的数据类型,并未生成任何变量。,结构体的定义,在先前已定义结构体类型的基础上再声明变量,在定义类型的同时定义变量,直接定义结构体变量(不出现结构体名),struct student student1,student2;,struct student int num; char name20; c

8、har sex; int age; float score; char addr30; student1,student2;,struct int num; char name20; char sex; int age; float score; char addr30; student1,student2;,结构体变量的定义,定义自己的类型名,struct student student1,student2; /* It works */ student student1,student2; /*Can this work?*/ struct student int num; char na

9、me20; char sex; int age; float score; char addr30; ; typedef struct student STUD; STUD student1,student2; /* It works! */ typedef 为一种已存在的类型定义一个新名字 STUD与 struct student类型是同义词,结构(Structure)的内存占用,double 占用内存字节数 = 8 struct student 占用内存字节数 = ? 是所有成员变量所占内存的总和吗? 事实上,所有数据类型在内存中都是从偶数地址开始存放的,且结构所占的实际空间一般是按照机器

10、字长对齐的 不同的编译器、平台,对齐方式会有变化 我们可以用sizeof来获得结构的大小,与普通变量一样,在定义结构体类型变量的同时也可以对结构体类型变量赋初值。,【例1】 对结构体变量初始化 。,#include main() struct student long int num; char name20; char sex; char addr20; a=10101,“Li Lin“,M,“123 Beijing Road“; printf(“NO.:%ldnname:%snsex:%cnaddress:%sn“, a.num,a.name,a.sex,a.addr); ,结构体变量的初

11、始化,结构体类型变量的初始化,struct time int hour; int minute; int second; struct date int year; int month; int day; struct time t; ; main() struct date xy=2003,3,15,17,34,55; printf(“date=d/d/d/d:d:dn“, xy.year,xy.month,xy.day,xy.t.hour,xy.t.minute,xy.t.second); ,【例2】,定义:,struct STUDENT int studentID; char stude

12、ntName10; char studentSex4; struct date timeOfEnter; int scoreComputer; int scoreEnglish; int scoreMath; int scoreMusic; ; struct STUDENT stu30;,结构体数组,struct date int year; int month; int day; ;,例8-2.c,struct STUDENT int studentID; char studentName10; char studentSex4; struct date timeOfEnter; int s

13、coreComputer; int scoreEnglish; int scoreMath; int scoreMusic; ; struct STUDENT stu30 = 1,“令狐冲“,“男“,1999,12,20,90,83,72,82, 2,“林平之“,“男“,1999,07,06,78,92,88,78, 3,“岳灵珊“,“女“,1999,07,06,89,72,98,66, 4,“任莹莹“,“女“,1999,07,06,78,95,87,90 ;,初始化,结构体数组,结构体指针,struct point int x; int y; ; struct point pt; /*定义结

14、构体变量*/ struct point *ppt; /*定义结构体指针*/ ppt = /*指向运算符*/ 第二种更常用,ppt,pt,思考题,struct point int x; int y; ; struct rect struct point pt1; struct point pt2; ;,struct rect rt; struct rect *rp = 下面表达式哪些合法? rt.pt1.x (*rp).pt1.x rp-pt1.x rt-pt1.x 上面合法的表达式都是等价的吗?,结构体定义可以嵌套,结构体数组的指针,struct STUDENT *pt; pt = stu;,

15、stu0,stu1,stu2,pt,pt+,stu3,自增跳过一个数组元素的所有成员所占的字节数,例8.1 :洗牌和发牌模拟 (P323),一付扑克有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 card52; /*顺序存放扑克牌*/ int re

16、sult52=70; /*存放洗发牌结果,初值可选为051以外的任意值*/ char *Suit = “Spades“,“Hearts“,“Clubs“,“Diamonds“; char *Face = “A“,“2“,“3“,“4“,“5“,“6“,“7“,“8“,“9“, “10“,“jack“,“Queen“,“King“;,例8.1 :洗牌和发牌模拟(P324),发牌过程 将52张牌按照随机的顺序存放 算法步骤: 产生051的随机数,将其放于resulti内。 i=i+1 如果i=51,则重复第步,否则,结束循环,执行 输出结果 存在一个致命的问题: 在重复第步时,产生的随机数可能与以

17、前产生的随机数相同,相同意味着52张牌中出现2张以上相同的牌,例8.1 :洗牌和发牌模拟(P307),解决方法 增加一步,判断新产生的随机数以前是否出现过 如果出现过,则放弃;如果以前未出现过,则保留 算法步骤: 产生051的随机数m,将其放于resulti内。 判断resulti在以前(result0resulti-1)是否出现过。如果出现过,则回到第步;如果没出现过,则i=i+1 如果i=51,则重复第步,否则,结束循环 输出结果,例8.1 :洗牌和发牌模拟(P309),算法缺陷: 随着生成随机数数量的增加,新的随机数与已经产生的随机数相同的可能性越来越大,有可能出现算法延迟问题 高效算法

18、 先将52张牌按照花色与牌面顺序存放(cardi) 再将其随机打乱 每次循环,程序选择一个051的随机数j,然后将数组中当前的元素cardi与随机选出的元素cardj进行交换,例8.1 :洗牌和发牌模拟(P313),用结构体数组做函数参数 char *suit = “Spades“,“Hearts“,“Clubs“,“Diamonds“; char *face = “A“,“2“,“3“,“4“,“5“,“6“,“7“,“8“,“9“, “10“,“jack“,“Queen“,“King“; /* 函数功能:将52张牌按黑桃、红桃、草花、方块花色顺序,面值按AK顺序排列 函数参数:结构体数组w

19、Card,表示不同花色和面值的52张牌 指针数组wFace,指向面值字符串 指针数组wSuit,指向花色字符串 函数返回值:无 */ void FillCard(struct CARD wCard,char *wFace,char *wSuit) int i; for (i=0; i52; i+) strcpy(wCardi.suit, wSuiti/13); strcpy(wCardi.face, wFacei%13); ,i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

20、31 32 33 34 35 36 37 38 39 40 i/13 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 i%13 0 1 2 3 4 5 6 7 8 9 10 11 12 0 1 2 3 4 5 6 7 8 9 10 11 12 0 1 2 3 4 5 6 7 8 9 10 11 12 0 1 ,用结构体指针做函数参数 /* 函数功能:将52张牌的顺序打乱, 函数参数:结构体数组wCard,表示52张牌 函数返回值:无 */ void Shuffle(struct

21、CARD *wCard) int i,j; struct card temp; for (i=0; i52; i+) j = rand()%52; /*j=random(52);TC的库函数*/ temp = wCardi; wCardi = wCardj; wCardj = temp; /* 洗牌过程 */ ,例8.1 :洗牌和发牌模拟(P314),用结构体指针做函数参数 /*函数功能:输出发牌结果 函数参数:结构体数组wCard,表示有52张牌 函数返回值:无 */ void Deal(struct CARD *wCard) int i; for (i=0; i52; i+) /*输出发牌

22、结果*/ printf(“%10s%10sn“, wCardi.suit, wCardi.face); ,例8.1 :洗牌和发牌模拟(P314),结构体与函数,向函数传递结构体的单个成员 单向值传递,函数内对结构内容的修改不影响原结构 向函数传递结构体的完整结构 单向值传递,函数内对结构内容的修改不影响原结构,开销大 向函数传递结构体的首地址 用结构体数组或者结构体指针做函数参数 除提高效率外,还可以修改结构体指针所指向的结构体的内容,struct date int year; int month; int day; ; void func(struct date p) p.year = 20

23、00; p.month = 5; p.day = 22; ,main() struct date d; d.year = 1999; d.month = 4; d.day = 23; printf(“%d,%d,%dn”, d.year, d.month, d.day); func(d); printf(“%d,%d,%dn”, d.year, d.month, d.day); ,1999,4,23,1999,4,23,结构体与函数,结构体变量,单向值传递,struct date int year; int month; int day; ; void func(struct date *p)

24、 p-year = 2000; p-month = 5; p-day = 22; ,main() struct date d; d.year = 1999; d.month = 4; d.day = 23; printf(“%d,%d,%dn”, d.year, d.month, d.day); func( ,1999,4,23,结构体与函数,2000,5,22,结构体变量地址值传递,struct类型的特点,一个普通的类型 可以定义该类型的变量、数组、指针 可以做函数的参数类型和返回值类型 它的成员可以是任意类型 基本类型、数组、指针、结构体、共用体 struct类型的变量 两个结构体变量之间

25、可以相互赋值 所以做为函数的参数时,是传值调用 可以取地址& 不可能直接参与算术和比较运算 面向对象和数据库是struct的思想的发展,思考,下面的结构是什么意思? struct temp int data; struct temp pt; ; VC下的错误提示: pt uses undefined struct temp 下面的结构是什么意思呢? struct temp int data; struct temp *pt; ;,动态数据结构,结构体声明时不能包含自我,但可以包含指向本结构体类型的指针变量 链表(Linked table) struct Link int data; struc

26、t Link *next; ;,共用体,或称为联合(Union),union number short x; char ch; float y; ; 基本上和struct一样 x、ch和y处于同样的地址 sizeof(union number)取决于占空间最多的那个成员变量,同一内存单元在每一瞬时 只能存放其中一个成员; 起作用的成员是最后一次存放的成员 不能作为函数参数,struct person char name20; char sex; int age; union int single; struct char spouseName20; int child; married; st

27、ruct date divorcedDay; marital; int marryFlag; ;,共用体的应用,union int single; struct char spouseName20; int child; married; struct date divorcedDay; marital;,struct char spouseName20; int child; married;,实验九 结构体编程练习 在屏幕上模拟显示一个数字式时钟,定义一个时钟结构体类型: struct clock int hour; int minute; int second; ; typedef st

28、ruct clock CLOCK;,void update(CLOCK *t) t-second+; if (t-second = 60) t-second = 0; t-minute+; if (t-minute = 60) t-minute = 0; t-hour+; if (t-hour = 24) t-hour = 0; ,void display(CLOCK *t) printf(“%2d:%2d:%2dr“, t-hour, t-minute, t-second); ,实验九 结构体编程练习 在屏幕上模拟显示一个数字式时钟,这一章我们学习了,两种新的数据类型 结构体和共用体 几种重要的应用 结构体数组 结构体指针 用结构体数组或者结构体指针做函数参数 用结构体指针实现动态数据结构,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育


经营许可证编号:宁ICP备18001539号-1