C语言人民邮电出版社张小东课件

上传人:阳*** 文档编号:107673182 上传时间:2022-06-15 格式:PPT 页数:56 大小:553KB
收藏 版权申诉 举报 下载
C语言人民邮电出版社张小东课件_第1页
第1页 / 共56页
C语言人民邮电出版社张小东课件_第2页
第2页 / 共56页
C语言人民邮电出版社张小东课件_第3页
第3页 / 共56页
资源描述:

《C语言人民邮电出版社张小东课件》由会员分享,可在线阅读,更多相关《C语言人民邮电出版社张小东课件(56页珍藏版)》请在装配图网上搜索。

1、第八章第八章 综合设计与应用综合设计与应用C语言人民邮电出版社张小东课件语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C8.18.1变量的作用域与存储类别变量的作用域与存储类别变量可被识别、能够起作用的范围称为变量的作用域。C语言标准根据变量在源程序中可能出现的位置,将源程序划分成四个不同的区域,分别是:文件域、函数域、块域和函数原型域。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C(1)文件域文件域:指在一个源文件的区域内起作用。在函数外声明的变量具有文件域。具有文件域的变量在源文件中有效的范围是从声明它的位置开始到源文件尾,也称为全局变量或外部变量

2、。 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C(2)函数域函数域:指在一个函数定义的区域内起作用。C语言中只有标号(后跟冒号“:”的标识符)具有函数域,这意味着goto语句不能在不同的函数之间跳来跳去,以确保C语言的模块化程序结构的独立性。 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C(3)块域块域:指在块语句中从左花括号开始到右花括号结束的区域内起作用。函数的形参和在块语句中声明的变量具有块域,它们只在块域内可识别,块外不可识别。具有块域的变量称为局部变量或内部变量。 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C(4)

3、 函数原型域函数原型域:指在函数原型声明语句的范围内起作用。对于已经定义好的函数,在调用之前需要对其进行原型声明。在函数原型声明语句中,声明为参数名的变量具有函数原型域 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C8.1.28.1.2变量的存储类别(1) 存储类别的概念变量的存储类别决定了变量的存储位置和存储方式。变量的存储位置有两个:内存的数据区和寄存器(参见寄存器存储类别)。内存中供用户使用的存储区,如表8-1所示。变量的存储方式也有两种:静态和动态。在程序运行时,变量的存储方式如表8-2所示。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C语语

4、言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C(2) 存储类别的声明声明变量的存储类别,一般是与声明变量的类型同时进行,方法是在变量的类型说明符前加上适当的存储类别说明符,每个变量只能有一种存储类别。一般形式是:存储类别说明符存储类别说明符 数据类型说明数据类型说明符符 变量名变量名1,变量名变量名2,变量名变量名n ;语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用CC语言中,变量有四种存储类别说明符。 自动存储类别 寄存器存储类别 外部存储类别 静态存储类别语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C例8-2写出程序清单8-2的运

5、行结果,并说明程序的执行过程。 /* purpose: 静态局部变量 author : Zhanghua created: 2008/09/20 */ #include int f(int nParam) static int nSum=1;/*静态局部变量*/nSum=nSum+nParam;return nSum; void main() printf(%dn,f(1);printf(%dn,f(1); 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C运行结果如图8-4所示。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C8.28.2指针与数组指针与

6、数组8.2.1一维数组与指针123456789*(pointer +i), anArripointer,anArranArrpointer+1,anArr+1pointer+2,anArr+2pointer+i,anArr+ipointer+8,anArr+8*(pointer +8), anArr8*(pointer +2), anArr2*(pointer +0), anArr0*(pointer +1), anArr1语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C例8-4用数组名法从键盘接收并输出一维数组元素。 问题描述:定义一个整型数组anArr,有10元素,采用

7、数组名法实现对数组元素的键盘录入,并输出。 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C程序清单8-38-3.c /* purpose: 数组名法实现数组元素的录入与输出 author : Zhanghua created: 2008/09/20 */ #include stdio.h #define NUM 5 void main() int nArrNUM,i;printf(input elements of nArr:);for(i=0;iNUM;i+)scanf(%d,nArr+i);for(i=0;iNUM;i+)printf(%-4d, * (nArr+i)

8、; 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C运行结果如图8-8所示。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C8.2.28.2.2多维数组与指针(1) 多维数组的地址表示行地址与列地址。二维数组anArr的内存状态语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C(2) 用列指针访问二维数组元素由于C语言中的二维数组元素是以行优先连续存储的,且在内存中元素的存储仍然是线性的,这一点从图8-8不难看出。因此可以定义一个指针变量pointer指向二维数组的第一个元素,那么 i行j列元素的地址可表示为pointer+i*n+j,

9、而元素的值为*(pointer+i*n+j),也可以使用pointer+这样的语句逐一访问二维数组的元素。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C例8-6 用列指针实现二维数组的各元素的输入与输出 问题描述:定义一个整型数组anArr,2行2列,通过列指针变量输入与输出各元素的值。 #include stdio.h void main() int anArr22;int *pointer;pointer=anArr0;/*pointer指向二维数组的第一个元素的地址*/int i,j;printf(请输入各元素:请输入各元素:);for(i=0;i2;i+)for(

10、j=0;j2;j+)scanf(%d,pointer+i*2+j);for(pointer=*anArr;pointer*anArr+2*2; pointer+)printf(%4d,*pointer); 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C运行结果如图8-11所示。(3)用行指针访问二维数组元素为了便于访问二维数组,C语言中还专门设置了指向由n个元素组成的一维数组的指针。定义格式为:类型说明符类型说明符 (*指针名指针名)常量常量N语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C8.2.38.2.3指针数组指针数组是一个数组,只不过数组中的

11、元素都是相同的指针类型。其定义形式为:存储存储类型类型 数据类型数据类型 *数组名数组名元素个数元素个数如,int *pointer5;pointer是一个有5个元素的数组,每个元素都是指向整形变量的指针。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C8.3 8.3 函数函数main()main()中的参数中的参数带参数的主函数有什么特殊的意义吗?main()函数可以带多少个参数?其参数有何要求?语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C8.4 8.4 指针型函数指针型函数当一个函数的返回值是指针类型时,这个函数就是指针型函数。指针型函数的一般定

12、义形式为:函数类型函数类型 *函数名函数名(形参表形参表)函数体函数体语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C8.58.5动态存储空间分配动态存储空间分配动态存储空间分配相对于静态存储空间分配动态存储空间分配相对于静态存储空间分配具有如下特点:具有如下特点:不需要预先分配存储空间;不需要预先分配存储空间;分配的空间可以根据程序的需要扩大或缩分配的空间可以根据程序的需要扩大或缩小。小。C语言提供了若干动态存储空间分配函数,常语言提供了若干动态存储空间分配函数,常用的有:用的有:malloc函数、函数、calloc函数和函数和free函数。函数。语语言言程程序序设设计计

13、 第第八八章章综综合合设设计计与与应应用用C(1) malloc()函数原 型:void *malloc(unsigned int size);头文件:#include 参数:size参数是一个无符号整形数,表示分配存储空间的字节数功 能:在内存的动态存储区中分配一个长度为size的连续空间说 明:若成功,返回指向分配区域起始地址的指针(类型为void);若失败,返回空指针NULL语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C(2) calloc()函数原 型:void * calloc( unsigned n, unsigned size );头文件:#include

14、参数:size表示分配存储空间的字节数;n有多少个size功 能:在内存的动态区存储中分配n个长度为size的连续空间说 明:若成功,返回指向分配区域起始地址的指针(类型为void);若失败,返回空指针NULL语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C(3) free()函数原 型:void free(void *ptr);头文件:#include 参数:ptr欲释放内存单元的地址功 能:在完成对所分配内存空间的使用之后,要通过调用free()函数来释放它,释放后的内存区能够重新分配给其他变量使用说 明:参数ptr必须是先前调用动态空间分配函数(malloc或call

15、oc等)时返回的指针语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C例8-10动态分配一块区域,存储一个学生数据,并输出该学生数据。 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C程序清单8-11StructStu.c /* purpose: 学习动态存储空间分配 author : Zhanghua created: 2008/09/20 */ #include stdio.h #include stdlib.h struct sStudent int nNum;char *cName;char cSex;float fScore; *psStu; v

16、oid main(void) /*分配sizeof(struct stu)字节空间,强制转换为stu类型,并把其首地址赋予指针变量pStu*/ psStu=(struct sStudent*)malloc(sizeof(struct sStudent); 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C程序清单8-11StructStu.c psStu-nNum=102; psStu-cName=Zhang ping; psStu-cSex=M; psStu-fScore=62.5; printf(Number=%dnName=%sn,psStu-nNum,psStu-cN

17、ame); /*输出空间数据*/printf(Sex=%cnScore=%fn,psStu-cSex,psStu-fScore);free(psStu); /*释放空间*/语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C运行结果如图8-22所示。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C8.68.6链表链表8.6.1链表的概念链表的概念问题:结构体内的成员类型可以是其本身吗? 程序清单8-12StuTest.c语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C程序清单8-12StuTest.c/*一个小测试*/#include s

18、tdio.h#include stdlib.hstruct studentint nNum;char cName20;int nScoreAvg;struct student sStu;void main() printf(仅用来测试!仅用来测试!); 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C其编译结果如图8-23。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C说明错误提示的意思为:用正在定义的student声明成员变量stu1有错误。这样,可以得到结论:结构体内的成员不可以用“自己”去定义。现在把上述结构体的定义做一点变化,代码如图8-24所

19、示。struct studentint nNum;char cName20;int nScoreAvg;struct student * sStu;数据域指针域语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C再次进行编译,发现错误没有了,编译通过了,程序可以运行了。这是什么原因呢? 这个奇妙的指针可以指向什么样的内存单元呢? 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C根据分析,可以得出:(1)链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表各结点指针域进行链接的。链表由一系列结点组成,结点可以在运行时动态生成。语语言言

20、程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C(2)链表中的每个结点通常由两个域组成,一个称为数据域data,另一个称为指针域next。数据域用来存储用户的数据,而指针域是一个结构类型的指针,用来存储下一个结点的地址。结点的结构定义的一般形式为:struct node数据类型数据类型 data; struct node *next;语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C8.6.28.6.2链表的基本操作对链表的主要操作有:建立链表、查找链表、插入链表和删除链表等。下面定义一个学生结点,并据此进行详细介绍。struct studentchar cNum

21、10;/*学号*/float fScore;/*成绩*/struct student *next;/*指针域*/;语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C1. 1. 建立链表例8-11编写一个create()函数,按照规定的学生结点结构,创建一个学生成绩链表。 首先向系统申请一个结点的空间,然后向数据域输入信息(学号cNum、成绩fScore),并将指针域置为NULL(链尾标志),最后将新结点插入到链表尾,完成链表的建立过程,需要用到3个指针变pHead、pNew、pTail。 解决方案解决方案语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C(1

22、)pHead头指针变量,指向链表的第一个结点,用作函数返回值。由于单链表中每个结点的存储地址存放在其前趋结点next域中,而开始结点无前趋,故应让头指针head指向开始结点。链表可以由头指针唯一确定,因此用Create()函数建立完链表后,应该返回链表的头指针。(2)pNew指向新申请的结点。(3)pTail指向链表的尾结点,可用pTail-next= pNew实现将新申请的结点插入到链表尾,使之成为新的尾结点。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C根据上述,建立链表流程如图8-26所示。如果输入的学号为0,表示链表建立完毕。语语言言程程序序设设计计 第第八八章章

23、综综合合设设计计与与应应用用C为了验证链表建立的正确性,还需要一个链表顺序输出功能,由函数Display()实现,功能是从头到尾依次输出链表各结点的数据域。参数为头结点指针pHead。实现流程如图8-27所示。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C程序清单8-13CreateLinkList.c/*定义学生结点结构定义学生结点结构*/struct studentchar cNum10;/*学号学号*/float fScore;/*成绩成绩*/struct student *next;/*指针域指针域*/;语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应

24、应用用C程序清单8-13CreateLinkList.c struct student *Create() struct student *pHead=NULL,*pNew,*pTail;int nCount=0;/*链表中的结点个数(初值为0)*/while(1) pNew=(struct student *)malloc(LEN); /*申请一个新结点的空间*/*1、输入结点数据域的各数据项*/printf(Input the number of student Num.%d(9 bytes): , nCount+1);scanf(%9s, pNew-cNum);if(strcmp(pNe

25、w-cNum,0)=0)/*如果学号为0,则退出*/ free(pNew);/*释放最后申请的结点空间*/break;/*结束while循环*/语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C程序清单8-13CreateLinkList.c printf(Input the Score of the student Num.%d: , nCount+1);scanf(%f, &pNew-fScore);nCount+;/*结点个数加1*/*2、置新结点的指针域为空*/pNew-next=NULL;/*3、将新结点插入到链表尾,并设置新的尾指针*/if(nCount=1) p

26、Head=pNew;/*是第一个结点, 置头指针*/else pTail-next=pNew;/*非首结点, 将新结点插入到链表尾*/pTail=pNew;/*设置新的尾结点*/return pHead; 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C程序清单8-13CreateLinkList.cvoid Display(struct student *pHead)struct student *p;p=pHead;/*指向头结点*/printf(学号学号tt成绩成绩n);while(p!=NULL)/*循环输出*/printf(%st,p-cNum);printf(%

27、.1fn,p-fScore);p=p-next;/*指向下一个结点*/void main()struct student *pHead;/*链表头指针*/pHead=create();/*建立链表*/display(pHead);/*输出链表*/语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C运行结果如图8-28所示。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C2. 2. 查找链表例8-12编写一个search()函数,按照规定的学生结点结构,实现按学号查找。 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C3. 3. 插入链表

28、向链表中插入结点分为3种情况。 (1)在链表最前端插入,如图8-31所示。插入前到插入后的变化通过如下代码来实现。 (2)在链表中间插入,如图8-32所示。根据链表的特性,中间插入需要找到插入点。设p为找到的插入点,则下述语句可完成中间插入 。 (3)在链表末尾插入,如图8-33所示。与(2)相同,在找到指向链表的末尾结点的指针p后。通过如下代码来实现。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C4. 4. 删除链表分为3种情况 (1) 在删除链表的第一个结点。如图8-36所示,删除前到删除后的变化通过如下代码来实现。(2) 在删除链表的某个中间结点。如图8-37所示,

29、删除前到删除后的变化通过如下代码来实现 。(3) 在删除链表的末尾结点。如图8-38所示,删除前到删除后的变化通过如下代码来实现 。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C8.6.38.6.3带头结点链表简介头结点是在链表的开始结点之前附加一个结点,如图8-41所示。(1) 无论链表是否为空,其头指针都是指向头结点的非空指针(空表中头结点的指针域空),因此空表和非空表的处理也就统一了。 语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C8.6.38.6.3带头结点链表简介(2) 由于开始结点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的

30、操作就和在链表的其它位置上操作一致,无须进行特殊处理。针对空表和非空表,图8-43描述了单链表中插入新结点的情况。图8-44描述了单链表中删除结点的情况。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C8.78.7本章小结本章小结 知识的层面 技术的层面语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C8.78.7本章小结本章小结(4) 带参的main函数。介绍了带参的main函数中各参数的意义和简单应用。(5) 指针型函数。指针型函数是指函数的返回值是一块数据区的地址,进而可以访问其中的数据。(6) 动态存储分配。该部分讲解了动态存储空间分配的意义和C语言中常用的动态存储空间分配函数,为链表的学习做了一个铺垫。(7) 链表。详细讲解了链表的概念,以及链表对应的一些基本操作,包括:建立链表、查询链表、插入链表和删除链表。语语言言程程序序设设计计 第第八八章章综综合合设设计计与与应应用用C 技术的层面

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!