程序设计基础CHP7(结构体)_第1页
程序设计基础CHP7(结构体)_第2页
程序设计基础CHP7(结构体)_第3页
程序设计基础CHP7(结构体)_第4页
程序设计基础CHP7(结构体)_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第八章第八章结构化设计方法结构化设计方法程序设计基础程序设计基础CAUCJSJCAUCJSJ本章教学要求本章教学要求1.1. 掌握掌握结构体结构体与与结构数组结构数组的概念与基本用法。的概念与基本用法。2.2. 掌握指向掌握指向结构体类型数据的指针结构体类型数据的指针的概念及使用。的概念及使用。3.3. 了解了解链表链表结点的结构形式,结点的结构形式,链表的基本操作链表的基本操作。4.4. 理解理解共同体共同体的含义,了解共同体类型变量的定义方法。的含义,了解共同体类型变量的定义方法。5.5. 了解了解枚举类型枚举类型的定义,及枚举类型的输入输出。的定义,及枚举类型的输入输出。6.6. 了解了

2、解typedef的作用。的作用。7.7. 掌握编译预处理的概念的使用方法。掌握编译预处理的概念的使用方法。本章教学内容本章教学内容结构体与结构数组结构体与结构数组结构体的概念结构体的概念1.1. 结构体的定义结构体的定义2.2. 结构体变量的存储特点结构体变量的存储特点3.3. 结构体变量的引用结构体变量的引用4.4. 结构体的初始化结构体的初始化结构体的定义结构体的定义1 1、含义:不同类型数据的集合。、含义:不同类型数据的集合。2 2、功能:用于描述一个、功能:用于描述一个“概念概念”。(或记录)。(或记录)如:如:num name sex age score addrnum name s

3、ex age score addr 10010 LiFun M 18 87.5 BeiJing 10010 LiFun M 18 87.5 BeiJing3 3、定义方法:、定义方法:方法一:在定义结构体类型的同时,直接给出结构体变量。方法一:在定义结构体类型的同时,直接给出结构体变量。如:如: structstruct 结构体名结构体名 结构体成员变量的定义;结构体成员变量的定义; 变量名变量名1 1,变量名,变量名2 2,.,变量名,变量名n n;方法二:先给出结构体类型的定义,再定义结构体变量。方法二:先给出结构体类型的定义,再定义结构体变量。如:如: structstruct 结构体名

4、结构体名 结构体成员变量的定义;结构体成员变量的定义; 例:例: ; structstruct 结构体名结构体名 变量名变量名1 1,变量名,变量名2 2,.,变量名,变量名n n;4 4、要点:要点:方法二:方法二:struct student int number; char name10; char sex; int age; float score; char addr30; ;struct student student1,student2;方法一:方法一:struct student int number; char name10; char sex; int age; float

5、 score; char addr30; student1,student2;请注意两种方法的不同特点:请注意两种方法的不同特点:1 1、“;”的用法;的用法;2 2、方法二可以用一个、方法二可以用一个* *.h.h文件来存储结构体的定义。文件来存储结构体的定义。4 4、要点:、要点:结构体名(结构体名(structstruct) ): 用于标识一种新的数据类型,用于标识一种新的数据类型, 即结构体类型,可以省略。即结构体类型,可以省略。注意区分结构体类型与基本数注意区分结构体类型与基本数 据类型的不同,它是据类型的不同,它是复合数据复合数据 类型。类型。结构体成员变量与普通变量的结构体成员变

6、量与普通变量的 定义一样,它还可以是结构体定义一样,它还可以是结构体 变量。变量。struct dateint month,day,year;struct student int num; char name10; char sex; int age; struct date birthday; char addr30; student1,student2;结构体变量的存储特点结构体变量的存储特点如:如:struct student int number; char name5; char sex; int age; float score; char addr10; student1,stu

7、dent2;structstruct student student所占存储空间的所占存储空间的大小为:大小为:各成员变量所占存储单元字节数各成员变量所占存储单元字节数之和。之和。s sizeof(studentizeof(student) )4student1.sexstudent1.sexstudent1.agestudent1.agestudent1.scorestudent1.scorestudent1.addr0s

8、4student2.sexstudent2.sex.student1student1student2student2结构体类型变量的引用结构体类型变量的引用一、原则:通过结构体的成员来引用结构体变量。一、原则:通过结构体的成员来引用结构体变量。二、成员的引用方法为二、成员的引用方法为: :结构体变量名结构体变量名. .成员名成员名三、要点:三

9、、要点:1.1.结构体变量不能整体输入输出结构体变量不能整体输入输出, ,只能对它的成员进行操作。只能对它的成员进行操作。如如: :student1.num;student1.num;2.2.如果成员本身又是一个结构体类型如果成员本身又是一个结构体类型, ,则要使用若干个成员运算符则要使用若干个成员运算符, ,逐级找到最底层的成员。逐级找到最底层的成员。如如:student1.birthday.day:student1.birthday.day3.3.成员变量可以象一般的变量一样进行各种运算成员变量可以象一般的变量一样进行各种运算, ,只是在运算时要只是在运算时要加上加上“.”.”运算符。运算

10、符。4.4.可以引用成员的地址。可以引用成员的地址。结构体变量的初始化结构体变量的初始化一、只可以给主函数中或外部存储类别和静态存一、只可以给主函数中或外部存储类别和静态存储类别的结构体变量、数组赋初值。储类别的结构体变量、数组赋初值。1 1、对外部存储类型的初始化对外部存储类型的初始化. .2 2、对静态存储类型的结构体变量进行初始化对静态存储类型的结构体变量进行初始化二、给结构体变量赋初值不能跨越前面的成员而二、给结构体变量赋初值不能跨越前面的成员而只给后面的成员变量赋值。只给后面的成员变量赋值。例例exp8_1:对外部存储类型的初始化对外部存储类型的初始化.struct student

11、long number; char name10; char sex; int age; float score; char addr30; a=090342000,”Li Ping”,M,18,86,”Tianjin Street”;void main() cout“No.:”a.numendl; cout“name:”endl; cout“sex:”a.sexendl; cout“address:”a.addrendl);例例exp8_2:对静态存储类型的结构体变量进行初始化对静态存储类型的结构体变量进行初始化.void main() static struct student

12、 long number; char name10; char sex; int age; float score; char addr30; a=090342000,”Li Ping”,M,18,86,” Tianjin Street”; cout“No.:”a.numberendl; cout“name:”endl; cout“sex:”a.sexendl; cout“address:”a.addrendl);结构体数组结构体数组1.1.结构体数组的含义:结构体数组的含义:数组元素是结构体类型数据的数组称为结构体数组。数组元素是结构体类型数据的数组称为结构体数组。2.2.结构体

13、数组的定义结构体数组的定义3.3.结构体数组的初始化结构体数组的初始化4.4.结构体数组的应用举例结构体数组的应用举例结构体数组的定义结构体数组的定义一、含义:若干个相同的结构体类型变量组成的数据集合。一、含义:若干个相同的结构体类型变量组成的数据集合。二、定义方法:二、定义方法:structstruct 结构体名结构体名 例如:例如: 结构体成员定义;结构体成员定义; 数组名数组名 元素个数元素个数 ;三、结构体数组的使用方法三、结构体数组的使用方法1 1、通过数组的下标(或指向数组的指针)来访问结构体变量。、通过数组的下标(或指向数组的指针)来访问结构体变量。2 2、再通过结构体变量的成员

14、实现结构体数据的访问。、再通过结构体变量的成员实现结构体数据的访问。形式为:形式为:数组名数组名 下标下标.成员名成员名如:如:=“Wang Ying”;=“Wang Ying”;struct student long number; char name10; char sex; int age; float score; char addr30;struct student stu3;struct student long number; char name10; char sex; int age; float score; char addr30; s

15、tu3;结构体数组的物理含义:结构体数组的物理含义:表示实体(或记录)的个数。表示实体(或记录)的个数。1 1、含义:在定义结构体数组时完成数组元素的赋值、含义:在定义结构体数组时完成数组元素的赋值2 2、方法:与一般数组元素赋初值的方法相同。、方法:与一般数组元素赋初值的方法相同。struct student long number; char name10; char sex; float score; char addr30; a3=090341,”Li Ping”,M,56,”Tianjin Street”, 090342,”Zhang Fan”,F,78,”Beijing Road”

16、, 090241,”Ren Zhong”,M,34,”Shenyang Road”;结构体数组的初始化结构体数组的初始化例例exp8_3: exp8_3: 对候选人得票的统计程序对候选人得票的统计程序, ,设有三个候选人设有三个候选人, ,每次输入一个每次输入一个候选人的名字候选人的名字, ,最后统计出每个候选人的得票的结果最后统计出每个候选人的得票的结果. .struct person char name10;int count; leader3=“Li”,0,”Zhang”,0,”Fun”,0;void main()int i,j; char leader_name10; for(i=1;

17、ileader_name); for(j=0;j3;j+) if(strcmp(leader_name,)=0) leaderj.count+; coutendl; for(i=0;i3;i+) “,”nump-num。3 3、区分下面的两种用法:、区分下面的两种用法: p-n+ p-n+ 和和 +p-n+p-n1 1、结构体指针的定义:、结构体指针的定义:main() struct student long number; char name10; char sex; int age; float score; char addr30;

18、 a=090342000,”Li Ping”,M,18,86,” Tianjin Street”,*p=&a;2 2、结构体指针的使用:、结构体指针的使用:a.num,,a.sex,a.addr(*p).num,(*p).name,(*p).sex,(*p).addr;p-num,p-name,p-sex,p-addr;指向结构体数组的指针指向结构体数组的指针1 1、定义方法举例:定义方法举例:2 2、使用要点:、使用要点: p+:p+:是指针是指针p p指向数组的下个元素指向数组的下个元素, ,而这个元素而这个元素是由结构体类型数据组成的是由结构体类型数据组成的, ,它不

19、是一个简单它不是一个简单的变量的变量. . (+p)-num(+p)-num: :先使指针先使指针p p指向结构体数组当前位指向结构体数组当前位置的下一个元素置的下一个元素, ,再访问其元素成员再访问其元素成员num;num; 请区别与请区别与(p+)-num(p+)-num的不同。的不同。例例exp8_4exp8_4:指向结构体数组的指针:指向结构体数组的指针struct student long number;char name10; char sex; float score; char addr30; a3=090341000,”Li Ping”,M,86,”Tianjin Stree

20、t”, 090342000,”Zhang Fan”,F,78,”Beijing Road”, 090241000,”Ren Zhong”,M,94,”Shenyang Road”;void main() struct student *p; for(p=a;pa+3;p+) coutnumnamesexscoreaddr; 指向结构体的指针作函数的参数指向结构体的指针作函数的参数1 1、用结构体变量的成员作函数的参数与一般、用结构体变量的成员作函数的参数与一般变量作函数的参数一致变量作函数的参数一致; ;2 2、用指向结构体变量的指针作函数的参数、用指向结构体变量的指针作函数的参数, ,实实参

21、将地址传递给形参参将地址传递给形参, ,与前面指针作函数参与前面指针作函数参数一致数一致; ;3 3、新版本的、新版本的c c语言允许将整个结构体变量作为语言允许将整个结构体变量作为函数的参数进行传递函数的参数进行传递, ,要求形参与实参的类要求形参与实参的类型必须一致型必须一致, ,而且程序占用内存大而且程序占用内存大, ,运行速运行速度慢度慢. .单链表单链表一、链表的含义:一、链表的含义: 当一个结构体中有一个成员是指向本结构体的指针时,通当一个结构体中有一个成员是指向本结构体的指针时,通过这样的指针可以将若干个相同的结构体存储单元连接成过这样的指针可以将若干个相同的结构体存储单元连接成

22、一个新的数据结构。一个新的数据结构。举例:举例:二、功能:二、功能:可以根据需要动态的开辟存储空间。可以根据需要动态的开辟存储空间。1.malloc(size):在内存中动态的分配一个长度为在内存中动态的分配一个长度为sizesize的连续的连续空间空间; ;2.calloc(n,size):在内存中分配在内存中分配n n个长度为个长度为sizesize的连续空间的连续空间; ;3.free(ptr):释放由释放由ptrptr指针指向的内存区域指针指向的内存区域. .二、链表操作链表操作建立链表建立链表、在链表、在链表插入结点插入结点、删除链表结点删除链表结点单链表的结构:单链表的结构:str

23、uct student int num; float score; struct student *next;要点:要点:1 1、链表中的元素在内存中存放顺序是不连续的。、链表中的元素在内存中存放顺序是不连续的。 由由nextnext指针来连接各节点。指针来连接各节点。2 2、链表数据结构的实现、链表数据结构的实现, ,必须利用指针变量必须利用指针变量. .headheadnumnumscorescorenextnext numnumscorescorenextnext numnumscorescoreNULLNULL .节点节点建立含建立含n n个节点的个节点的链表过程链表过程: :mall

24、ocmalloc()()mallocmalloc()()headheadnumnumscorescorenextnext numnumscorescorenextnext numnumscorescoreNULLNULL .struct student *creat( )struct student *head,*p1,*p2; n=0;head=NULL; p1=p2=(struct student *)(malloc(sizeof(struct student); cinp1-nump1-score; while(p1-num!=0) n=n+1;if(n=1) head=p1; else

25、 p2-next=p1; p2=p1;p1=(struct student *)(malloc(sizeof(struct student); cinp1-nump1-score; p2-next=NULL;return(head); 在链表中插入结点的过程在链表中插入结点的过程.mallocmalloc()()mallocmalloc()()headheadnumnumscorescorenextnext numnumscorescorenextnext numnumscorescoreNULLNULL numnumscorescorenextnext mallocmalloc()()删除链

26、表结点的过程删除链表结点的过程: :mallocmalloc()()headheadnumnumscorescorenextnext numnumscorescorenextnext numnumscorescorenextnext.共同体(共同体(unionunion)1.1.共同体的含义与定义方法共同体的含义与定义方法2.2.共同体的共同体的存储特点存储特点3.3.共同体的使用共同体的使用共同体的含义与定义方法共同体的含义与定义方法一、含义:一、含义: 几个不同变量共同占用同一块内存空间几个不同变量共同占用同一块内存空间, ,只是一种覆盖技术只是一种覆盖技术, ,所谓的共同占用是指这几个变

27、量共同拥有内存的同一个起始地址所谓的共同占用是指这几个变量共同拥有内存的同一个起始地址. .共用相同的存储单元。共用相同的存储单元。二、定义形式二、定义形式: : union union 共用体名共用体名 例如例如: : 成员表列;成员表列; union date union date 变量表列变量表列; ; int int i; i; char ch char ch; ; float f;a,b,c; float f;a,b,c; 共同体的存储特点共同体的存储特点1.1.同一块内存可以存放不同类型的数同一块内存可以存放不同类型的数据据, ,但在某一时刻只能存放其中的但在某一时刻只能存放其中的

28、一种一种; ;2.2.共用体变量中起作用的成员是最后共用体变量中起作用的成员是最后一次存放的成员一次存放的成员; ;3.3.共用体变量的地址和它的成员的地共用体变量的地址和它的成员的地址是同一个地址址是同一个地址; ;4.4.共用体变量不能整体被赋值共用体变量不能整体被赋值, ,也不也不能给共用体变量赋初值能给共用体变量赋初值; ;5.5.不能把共用体变量作为函数的参数不能把共用体变量作为函数的参数进行传递进行传递, ,但可以使用指向共用体但可以使用指向共用体变量的指针作为函数的参数变量的指针作为函数的参数; ;6.6.结构体类型和共用体类型可以嵌套结构体类型和共用体类型可以嵌套使用。使用。a

29、.i/a.ch/a.fa.i/a.ch/a.fb.i/b.ch/b.fb.i/b.ch/b.fc.i/c.ch/c.fc.i/c.ch/c.fa ab bc c例如例如:union date int i; char ch; float f;a,b,c;共同体的使用共同体的使用例例exp8_5:已知字符已知字符“0”的的ASCII马为十六进制的马为十六进制的30,下面程序的输出下面程序的输出为为:main() union unsigned char c; unsigned int i4; z; z.i0=0 x39; z.i1=0 x36; coutz.cendl;运行结果:运行结果:90011011000000000i1? ?.i20011100100000000i0c的地址i0的低位地址例例exp8_6exp8_6:下列程序的运行结果是什么:下列程序的运行结果是什么? ? main() union zj int a; char ch2; au; au.a298; coutau.ch0,au.ch1tue if (workdaytue) ) 4.4.一个整数不能直接赋值给一个枚举变量一个整数不能直接赋值给一个枚举变量, ,如如: : workday=2; w

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论