北京科技大学C语言第7章PPT_第1页
北京科技大学C语言第7章PPT_第2页
北京科技大学C语言第7章PPT_第3页
北京科技大学C语言第7章PPT_第4页
北京科技大学C语言第7章PPT_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

1、12021-10-1122021-10-113 一个学生的信息有一个学生的信息有学号学号、姓名姓名、性别性别、年龄年龄、住住址址、成绩成绩等。等。 一本图书的信息有一本图书的信息有分类编号分类编号、书名书名、作者作者、出版出版社社、出版日期出版日期、价格价格、库存量库存量等。等。 如何描述这些类型不同的相关数据?如何描述这些类型不同的相关数据?一种构造类型数据一种构造类型数据 结构体结构体由若干不同类型的数据项组成,由若干不同类型的数据项组成, 构成结构体的各个数据项称为构成结构体的各个数据项称为结构体成员结构体成员。 2021-10-114 数据类型数据类型1 成员名成员名1; 数据类型数据

2、类型2 成员名成员名2; 数据类型数据类型n 成员名成员名n; ;lstructstruct为关键字;为关键字;l结构体名结构体名是用户定义是用户定义的的类型标识类型标识。l 中是组成该结构体中是组成该结构体的的成员成员。成员的。成员的数据数据类型类型可以是可以是c语言所允语言所允许的任何数据类型许的任何数据类型。2021-10-115例如图书类型的定义:例如图书类型的定义: struct bookcard char num10; /*图书图书分类编号是字符数组类型分类编号是字符数组类型*/ char name30; /*书名是字符数组类型书名是字符数组类型*/ char author30;

3、/*作者是字符数组类型作者是字符数组类型*/ char publisher60; /*出版社是字符数组类型出版社是字符数组类型*/ float price; /*价格是单精度实型价格是单精度实型*/ int n; /*库存量是整型库存量是整型*/ ;2021-10-116例如学生类型的定义:例如学生类型的定义:struct student char num8; /* 学号是学号是字符数组字符数组类型类型 */ char name30; /* 姓名是姓名是字符数组字符数组类型类型 */ char sex; /* 性别是性别是字符型字符型 */ int age; /* 年龄是年龄是整型整型 */

4、char addr60; /* 住址是住址是字符数组字符数组类型类型 */ int score6; /* 成绩是成绩是整型数组整型数组类型类型 */ ;2021-10-117 结构体变量的各个成员在内存中占用连续存储结构体变量的各个成员在内存中占用连续存储区域,区域,结构体变量结构体变量所占内存所占内存结构体中结构体中每个成每个成员员所占用内存的所占用内存的长度之和长度之和。2021-10-118应先定义一个应先定义一个,而后再定义,而后再定义。系统对系统对不分配空间,仅对不分配空间,仅对分配空间。分配空间。只能对只能对赋值、存取或运算,而不能对一个赋值、存取或运算,而不能对一个赋值、存取或运

5、算。赋值、存取或运算。不不同结构体类型的成员名相同,同结构体类型的成员名相同, struct date int year,month,day; struct student char num8; char name30; char sex; birthday; /* 成员为结构体类型成员为结构体类型 */ char addr60; int score6; ;2021-10-119例如:例如:2021-10-1110例如:例如:2021-10-1111 如果初值个数少于结构体成员个数,如果初值个数少于结构体成员个数,则将无初值对应的成员赋以则将无初值对应的成员赋以0值。值。 如果初值个数多于结构

6、体成员个数,如果初值个数多于结构体成员个数,则编译出错。则编译出错。2021-10-1112 元素的个数可以省略,根据赋初值时元素的个数可以省略,根据赋初值时结构体常量的个数确定数组元素的个数结构体常量的个数确定数组元素的个数 2021-10-11132021-10-11142021-10-11152021-10-1116 结构体变量结构体变量a的各成员可分别表示为的各成员可分别表示为a.num、、a.sex、a.birthday、a.score a.birthday.yeara.birthday.montha.birthday.day 2021-10-1117【例例7-6】编写一

7、个统计选票的程序。编写一个统计选票的程序。 struct candidate char name20; /* name为候选人姓名为候选人姓名 */ int count; /* count为候选人得票数为候选人得票数 */ list =invalid,0,zhang,0,“wang,0, “li,0,“zhao,0,“liu,0;2021-10-1118main( ) int i,n; printf(enter voten); scanf(%d,&n); /* 输入所投候选人编号,编号从输入所投候选人编号,编号从1 1开始开始 */ while (n!=-1) /* 当输入编号为当输入编号为-

8、1-1时,表示投票结束时,表示投票结束 */ if (n=1 & n=5) listn.count+; /* 有效票,则相应候选人计票成员加有效票,则相应候选人计票成员加1 1 */ else printf(invalidn); list0.count+; /* 无效票无效票,list0的计票成员加的计票成员加1 */ scanf(%d,&n); /* 输入所投候选人编号输入所投候选人编号 */ 2021-10-1119for (i=1; iyear,p- -month,p- -day); enter today date(yyyy/mm/dd):2006/06/23today:2006/6/

9、232021-10-11232021-10-1124ppppp1 h 1.0082 he 4.00263 li 6.9414 be 9.012182021-10-11252021-10-1126p100130011001f2000h300030012021-10-1127head 1782 2008 3246 1085 5736图图7-2 动态单向链表示意图动态单向链表示意图c3246h1085a5736inull1782 2008 struct nodechar c; struct node *next; ;2021-10-1128 c语言提供了相关的存储管理库函数。这里语言提供了相关的存储

10、管理库函数。这里仅介绍其中三个,它们的原型说明在仅介绍其中三个,它们的原型说明在“stdlib.h”头文件和头文件和“alloc.h”头文件中,使用头文件中,使用这三个函数时,应选择其中一个头文件包含到这三个函数时,应选择其中一个头文件包含到源程序中。源程序中。2021-10-1129将函数返回值转换将函数返回值转换成结构体指针成结构体指针 p- -n=5 p- -next=0nnext5nullp2021-10-11302021-10-1131动态分配了动态分配了10个存放整个存放整型数据的存储单元型数据的存储单元 2021-10-1132 实参必须是一个指向动态分配存储区实参必须是一个指向

11、动态分配存储区的指针,它可以是任何类型的指针变量。的指针,它可以是任何类型的指针变量。2021-10-1133q 建立链表就是根据需要一个一个地开建立链表就是根据需要一个一个地开辟新结点,在结点中存放数据并建立结点辟新结点,在结点中存放数据并建立结点之间的链接关系。之间的链接关系。 头指针头指针h设为设为null读入一个学生姓名读入一个学生姓名 当姓名长度不为当姓名长度不为0 开辟新结点开辟新结点 p=new 数据送入新结点数据送入新结点 strcpy(p-name,name) gets(p-tel);p-next=null h=null t f h指向第一个指向第一个 连接新结点连接新结点

12、结点结点 h=p q-next=p q指向新的尾结点指向新的尾结点 q=p 读入一个学生姓名读入一个学生姓名图图7-3 建立单向链表建立单向链表nullhppq 2021-10-11342021-10-11352021-10-11362021-10-1137 p指向第一个结点指向第一个结点 p=head 当当p不为不为null 输出结点数据输出结点数据 p指向下一个结点指向下一个结点: p=p- -next图图7-5 输出链表的输出链表的n-s图图headppppnullnull2021-10-11382021-10-1139 headnullnull第第i-1个结点个结点 第第i个结点个结点

13、 第第i+1个结点个结点 2021-10-1140 headp2021-10-1141 headpp q2021-10-1142 headppp qq 2021-10-1143 p=head while(strcmp(x,p-name)!=0 & p-next!=nullnull) q指针跟随指针跟随p指针后移查找指针后移查找 (q=p;p=p-next;) strcmp(x,p-name)=0 t f p=head t f head=p-next q-next=p-next 没找到没找到 free(p)图图7-9 删除链表中指定结点的删除链表中指定结点的n-s图图删除删除第一个第一个结点结点

14、 删除中间删除中间结点或尾结点或尾结点结点 删除结点工删除结点工作分两步:作分两步:查找结点查找结点删除结点删除结点学生姓名学生姓名当姓名不同并且当姓名不同并且不是尾结点循环不是尾结点循环2021-10-1144查找结点查找结点 2021-10-11452021-10-1146 headnullnull第第i个结点个结点ppqqp0p新的第新的第i个结点个结点2021-10-1147 headpp02021-10-1148 headpqp02021-10-1149 headpp q p0pq 2021-10-1150 head=null t f p=head head=p0 while(str

15、cmp(x,p-name)!=0 & p-next!=nullnull) p0-next q指针跟随指针跟随p指针后移查找指针后移查找 (q=p;p=p-next;) =null null strcmp(x,p-name)=0 t f p=head t f p-next=p0 head=p0 q-next=p0 p0-next=nullnull p0-next=p图图7-11 在链表指定位置前插入结点的在链表指定位置前插入结点的n-s图图当姓名不同并且当姓名不同并且不是尾结点循环不是尾结点循环空表时空表时插入插入结点结点在表尾在表尾追加结点追加结点 插入结点工插入结点工作分两步:作分两步:查找

16、插查找插入位置入位置连接连接新结点新结点在表头在表头插入结点插入结点 在表中间在表中间插入结点插入结点 2021-10-11512021-10-1152查找插入点查找插入点 2021-10-11532021-10-11542021-10-11552021-10-1156可以先选择可以先选择1 1建建立一个链表,然立一个链表,然后根据需要选择后根据需要选择功能功能2 2、功能、功能3 3、功能功能4 4、直到选、直到选择择0 0退出程序的退出程序的运行运行 2021-10-11572021-10-1158 结构体类型解决了如何描述一个逻辑上相关,但结构体类型解决了如何描述一个逻辑上相关,但数据类

17、型不同的一组分量的集合。数据类型不同的一组分量的集合。 在需要节省内存储空间时,在需要节省内存储空间时,c c语言还提供了一种语言还提供了一种由若干个不同类型的数据项组成,但由若干个不同类型的数据项组成,但共享同一存储空共享同一存储空间间的构造类型。的构造类型。一种构造类型数据一种构造类型数据 共用体共用体由若干不同类型的数据项组成,由若干不同类型的数据项组成, 构成共用体的各个数据项称为构成共用体的各个数据项称为共用体成员共用体成员。2021-10-1159 数据类型数据类型1 成员名成员名1; 数据类型数据类型2 成员名成员名2; 数据类型数据类型n 成员名成员名n; ;lunionuni

18、on为关键字;为关键字;l共用体名共用体名是用户定义是用户定义的的类型标识类型标识。l 中是组成该共用体中是组成该共用体的的成员成员。成员的。成员的数据数据类型类型可以是可以是c语言所允语言所允许的任何数据类型许的任何数据类型。2021-10-1160例如:例如: union utype int i; char ch; long l; char c4; ; 定义了一个定义了一个union union utypeutype共用体共用体类型,共用体类型定义不分配内存类型,共用体类型定义不分配内存空间,只是说明此类型数据的组成空间,只是说明此类型数据的组成情况。情况。 2021-10-1161 按照

19、共用体类型的组成,系统为定义的共用体按照共用体类型的组成,系统为定义的共用体变量分配内存单元。变量分配内存单元。共用体变量共用体变量所占内存所占内存共用体中占用内存的共用体中占用内存的长度最长的成员长度最长的成员。2021-10-1162例如:例如:union utype int i; char ch; long l; char c4; a, b, c;2021-10-1163例如:例如:union int i; char ch; long l; char c4; 2021-10-1164 union utype int i; char ch; long l; char c4; a, b, c

20、;2021-10-1165 union utype int i; char ch; long l; char c4; a, *p=&a;2021-10-1166例如:例如:2021-10-1167 共用体类型变量在定义时只能对第一共用体类型变量在定义时只能对第一个成员进行赋初值。个成员进行赋初值。 由于第一个成员是字符型,用一个字由于第一个成员是字符型,用一个字节,所以对于初值节,所以对于初值0 0 x9745x9745仅能接受仅能接受0 0 x45x45,初值的高字节被截去。初值的高字节被截去。 1. e 45e 452. e 65e 65对对u2u2成员的引成员的引用是无意义的用是无意义的

21、2021-10-1168低地址低地址高地址高地址123456781234567878305419841305419841a高地址高地址低地址低地址2021-10-1169 枚举枚举是一个具有有限个是一个具有有限个整型符号常量的整型符号常量的集合集合,这些整型符号常量称为枚举常量。,这些整型符号常量称为枚举常量。 每个枚举类型都必须进行类型的定义,每个枚举类型都必须进行类型的定义,定义时必须将其所有的枚举常量一一列举,定义时必须将其所有的枚举常量一一列举,以便限定此枚举类型变量的取值范围。以便限定此枚举类型变量的取值范围。 2021-10-11700123456 在枚举类型中,每个在枚举类型中,

22、每个枚举常量枚举常量都代表一都代表一个整型值。在定义枚举类型的同时可隐式或个整型值。在定义枚举类型的同时可隐式或显式地显式地定义枚举常量所代表的值定义枚举常量所代表的值。 2021-10-117123452021-10-1172 enumenum 枚举名枚举名 枚举变量名表枚举变量名表; ; enumenum 枚举名枚举名 枚举常量取值表枚举常量取值表 枚举变量表枚举变量表; ; enumenum 枚举常量取值表枚举常量取值表 枚举变量表枚举变量表; ;2021-10-1173 用用sizeofsizeof运算符计算枚举变量所占内存空间运算符计算枚举变量所占内存空间 赋值运算赋值运算 =tru

23、e;=red;=yellow;=lightgreen; =white;是是enum color2类型的枚举值类型的枚举值2021-10-1174 关系运算关系运算 取址运算取址运算truefalse sunsat (1) (0) 2021-10-1175 枚举变量的输入枚举变量的输入 枚举变量的输出枚举变量的输出 枚举变量作为整型变量进行输入。例如:枚举变量作为整型变量进行输入。例如: scanf(%d,&fg);1含义不直观含义不直观 2021-10-1176switch(fg) case false: printf(false); break; case true: printf(true

24、); 枚举变量的输出枚举变量的输出方法二:利用多分支选择语句输出枚举常量对应方法二:利用多分支选择语句输出枚举常量对应的字符串。的字符串。 2021-10-1177enum flag false,true fg;char *name =false,true; fg=true;printf(%s,namefg); 枚举变量的输出枚举变量的输出方法三:依据枚举值,运用指针方法输出对应的方法三:依据枚举值,运用指针方法输出对应的字符串。字符串。2021-10-1178fg=true;printf(%s,fg); 枚举变量的输出枚举变量的输出 枚举常量是标识符,不是字符串,以输出字符枚举常量是标识符,

25、不是字符串,以输出字符串方式输出枚举常量是错误的。串方式输出枚举常量是错误的。 2021-10-1179【例【例7-18】编制一个程序。当输入今天的星期序号后,编制一个程序。当输入今天的星期序号后,输出明天是星期几。输出明天是星期几。 enum weekday mon=1,tue,wed,thu,fri,sat,sun ; char *name8=error,mon,tue,wed, thu,fri,sat,sun;2021-10-1180main( ) enum weekday d; printf(input todays numeral(1-7):); scanf(%d,&d); if (d0&d7) d+; /* 今天是星期一到星期六的时候今天是星期一到星期六的时候 */ else if (d=7) d=1; /* 今天是星期日今天是星期日 */ else d=0; if (d) printf(tomorrow is %s.n,named); else printf(%sn,named); 2021-10-1181为类型名定义别名的一般形式为类型名定义别名的一般形式: 类型名类型名 或或 类型定义类型定义 是关键字是关键字;可以是可以是基本类型、构造类型、指针类基本

温馨提示

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

评论

0/150

提交评论