语言函数与程序结构课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《语言函数与程序结构课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 函数 程序结构 课件
- 资源描述:
-
1、语言函数与程序结构语言函数与程序结构教学内容 4.1 概述概述4.1 概述概述(P73)问题提出问题提出 前面的程序中前面的程序中,都用到了主函数都用到了主函数“main”及及 C语言提供的输入输出库语言提供的输入输出库函数函数 scanf 和和 priintf 等函数等函数,目前除目前除了调用库函数实现某些功能外了调用库函数实现某些功能外,所有所有的练习中程序功能均在主函数中完的练习中程序功能均在主函数中完成成,当问题有一定规模和复杂度时不当问题有一定规模和复杂度时不可避免地会出现如下问题可避免地会出现如下问题 程序越来越长程序越来越长,难于理解且可读难于理解且可读性下降。性下降。重复代码增
2、多重复代码增多,某段程序可能被执某段程序可能被执行多次。行多次。某一问题中的代码某一问题中的代码,无法在其他同无法在其他同类问题中再用类问题中再用,必须重复原来设计编必须重复原来设计编码的过程。码的过程。程序各部分之间联系复杂、保持程序各部分之间联系复杂、保持重用代码段的一致性等原因导致程重用代码段的一致性等原因导致程序调试难度加大。序调试难度加大。4.1 概述概述 4.1 概述概述 函数可以被多次调用,从而减少程序的长度。增加程序的可读性。程序的模块化、结构化模块化、结构化更强。C语言中,函数名是上述封装体的名称。函数定义是按照规定形式对函数的描述。函数调用是要求执行函数的描述。一个实用的C
3、语言源程序总是由许多函数组成,这些函数多数都是根据实际任务由用户来编写的,在这些函数中,可以调用C语言提供的库函数,也可调用用户自己写的或他人编写的函数。4.1 概述概述 C程序总是从主函数 main 开始执行,到主函数的最后一个“”处结束。在 main 中,调用库函数或自己定义的函数时,控制权转移到函数,主程序等待,待函数执行完毕后,控制返回到调用处,主函数继续执行。其他函数中调用函数的过程与此相同。从C语言函数来讲,一方面要掌握库函数的调用方法,尽可能地熟悉系统提供的常用库函数的功能,尽量使用库函数实现程序功能。另一方面,库函数毕竟不能解决所有的问题,需要掌握自己定义函数的方法。4.1 概
4、述概述 一种观点是从函数外部调用者的角度考虑一种观点是从函数外部调用者的角度考虑怎样使用和设计函数,不论是库函数还是自定义函数,我们只关心函数如何使用,实现什么功能、函数名字是什么、有几个参数、类型是什么、返回什么值,而不关心函数内部的实现细节,也没有必要关心。从这个层次上考虑问题,可以摆脱细节干扰、把握总体和全局应该具有的功能和结构。另一种观点是从函数内部实现者的角度另一种观点是从函数内部实现者的角度,定义函数实现的功能,要考虑函数启动时需外部提供什么数据及其类型、函数如何工作、如何得到结果、何时结束、如何返回结果,而不关心外部什么地方调用这个函数,调用时具体参数是什么。我们在函数内部定义的
5、计算功能是具有一般性的抽象计算功能,只有函数被调用的时候,才具体化地解决一个实际问题。模块化程序设计 4.1 概述概述l基本思想 将一个大的程序按功能分割成一些小模块。l特点 Y 各模块相对独立、功能单一、结构清晰、接口简单。Y 控制了程序设计的复杂性。Y 提高元件的可靠性。Y 缩短开发周期。Y 避免程序开发的重复劳动。Y 易于维护和功能扩充。l开发方法 自上向下,逐步分解,分而治之。4.2 库函数库函数4.2 库函数库函数(P74)C语言非常简洁,程序所需的许多东西通过函数方式提供。掌握C语言的一个重要方面,就是要熟悉库函数的使用。ANSI C标准对过去各种C语言系统的函数进行了分析,并将其
6、规范化,它将一批最常用的功能总结出来,定义了C语言的标准库、每种C语言系统,都按照这个标准提供了一批标准库函数,还根据实际运行环境提供了扩充函数库。写C程序时可直接调用函数,不必关心函数是如何实现的,这样可节省大量的时间和精力。使用库函数,要学会使用联机帮助或系统的有关手册。参考 P234 列出了常用的库函数。auto(自动)变量采用这种形式后,如果这个文件第二次被包含时,由于 MY_HEAD_FILE 已经有了定义,#if 和#endif之间的所有东西都将被丢掉。不鼓励使用这种用法,原因是在这种情况下C语言编译器无法得到关于函数参数和参数类型的信息。/*定义局部变量 i,j*/return(
7、x+y);int f1(int x)无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。math.概念 函数的递归调用是指,一个函数在它的函7 多文件程序的组织和调试方法 hanoi(n1,two,one,three);解决的方法是,在一个文件中定义全局变量,在其他要引用的文件中用 extern 对变量进行说明。float add(float x,float y)/*x,y 为实形参*/请读者在第 5 章的内容学习完毕之后,再回到本例仔细体会本例所示例的结构。/*a 自动进行初始化,为 0*/x*=2;4.2 库函数库函数 4.2 库函数库函数 表达式中调
8、用。函数是表达式的一个运算对象,如 y=z*sin(x)+0.5 这种调用方式,通常需要使用函数的返回值进行计算;作为独立语句。可看作表达式语句如printf(%dn”,a);在 Turbo C的编辑器中,将光标置于库函数的任意一个字符上,按下 Ctrl+F1,可得到关于此库函数的定义信息。调用库函数时,要注意按照库函数的参数类型(形参)要求,给出调用的参数(实参)。实参可以是表达式,函数调用的第一步就是计算实参的值,然后传给形参变量。4.3 函数函数定义定义4.3 函数函数定义定义(P75)函数类型 函数名(类型名 形参1,类型名 形参2)说明部分 语句部分 函数名、形参是用户命名的标识符,
9、同一程序中,函数名必须唯一,形参名在同一函数中唯一即可,可以与其他函数中的变量同名。C语言规定,不能在函数的内部再定义函数(即嵌套定义)。所有函数都是互相平行独立的。省略返回类型名时,缺省值为 int。函数体 4.3 函数函数定义定义 函数名后括号内的参数叫形参,形参必须用括号括起来,可有多个形参,也可以一个也没有。函数定义的一对 中可以为空,这样的函数什么也不做。函数体中说明部分的变量,只在函数体内有效,并在进入函数时为变量开辟单元,退出时释放分配的单元。函数体中说明部分的变量与其他函数体中的变量互不相关。函数头部构成函数内外部之间的界面。函数接口定义清楚了,函数的定义和使用完全可以由不同人
10、来完成。函数允许递归调用,即在函数中可直接或间接地调用自己。函数值通过 return 语句返回。例 无参函数 printstar()printf(*n);或 printstar(void)printf(*n);例 有参函数(现代风格)int max(int x,int y)int z;z=xy?x:y;return(z);例 空函数 dummy()【例4.1】写一个函数,求两个双精度浮点数的和。double add(double a,double b)double s;s=a+b;return s;不能省略例:int max(int x,int y)int z;z=xy?x:y;return(
11、z);4.3 函数函数定义定义 在老版本 C语言中,参数类型说明允许放在函数说明部分的第 2 行单独指定。其格式如下:函数类型 函数名(形参表)形参类型说明 说明部分 语句部分 例如:求两个双精度浮点数的和,写成传统风格的有参函数如下:double add(a,b)double a,b;/*参数类型说明*/double s;s=a+b;return s;4.3 函数函数定义定义uvoid 型函数 表示该函数没有值返回,调用这类函数的惟一的方法就是作为独立的语句。例 无返回值函数 void swap(int x,int y)int temp;temp=x;x=y;y=temp;void prin
12、tstar()printf(*);main()int a;a=printstar();printf(%d,a);编译错误!例:函数返回值类型转换 main()float a,b;int c;scanf(%f,%f,&a,&b);c=max(a,b);printf(Max is%dn,c);max(float x,float y)float z;z=xy?x:y;return(z);int 为了使程序具有良好的可读性为了使程序具有良好的可读性并减少出错并减少出错,凡不要求返回值的函数凡不要求返回值的函数都应定义为空类型都应定义为空类型;即使函数类型即使函数类型为整型为整型,也不使用系统的缺省处理
13、。也不使用系统的缺省处理。sub();7 多文件程序的组织和调试方法 参考 P234 列出了常用的库函数。printf(main:a=%d,b=%dn,a,b);从而可避免因不慎赋值所导致的错误影响到其他函数。printf(file1:%dn,n);else hanoi(n1,one,three,two);作用域 只在函数或复合语句体(复合体)范围内有效,在此函数或复合语句体外不能使用这些变量。int x;/*定义全局变量*/大的源程序在处理中存在的问题void move(char getone,char putone)printf(main:a=%d,b=%dn,a,b);5 调用函数和被调
14、函数的数据传递语句部分(2)x=10,y=20从而可避免因不慎赋值所导致的错误影响到其他函数。函数体中说明部分的变量,只在函数体内有效,并在进入函数时为变量开辟单元,退出时释放分配的单元。printf(x=%dn,x);程序各部分之间联系复杂、保持重用代码段的一致性等原因导致程序调试难度加大。4.4 函数的调用和函数说明函数的调用和函数说明 4.4 函数的调用和函数说明函数的调用和函数说明(P76)l 函数调用的形式 函数名(实参表);l 函数调用方式。与库函数的调用类似,有以下两种调用方式:函数语句。只进行某些操作,不返回函数值。以函数作为独立的语句,末尾一定要加“;”号。函数表达式。函数作
15、为表达式的一项,出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。如:函数表达式 例 4.l 定义的函数 add,允许下列的调用方式:y=add(3.0,4.0);for(y=0,i=1;i 0 printf(“%d”,add(a,b);/*函数为参数*/函数语句而对于前面定义的函数 printstar 只能用函数语句调用方式:printstar();4.4 函数的调用和函数说明函数的调用和函数说明 l 说明Y 函数名后面的列表内的参数叫实参。Y 调用的函数名字必须与定义的函数名字完全一致。Y 实参个数与形参个数应一致,类型也应统一;如不匹配,系统进行自动转换。不兼容
16、的赋值转换(某些类型之间不能进行赋值,如指针和浮点类型之间)并不给出错误信息,程序继续运行,但结果不正确,这点应特别注意。Y 函数可以嵌套调用。如 a 函数调用 b 函数,b 函数中又调用 C 函数。(但数不许嵌套定义)Y 实参表求值顺序,因系统而定(Turbo C 自右向左)如:参数求值顺序main()int i=2,p;p=f(i,+i);printf(p=%d,p);int f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);运行结果:p=0p=f(i,i+);运行结果:p=1 4.4 函数的调用和函数说明函
17、数的调用和函数说明 l【例 4.2】写程序,从键盘读入两个浮点数,用例 4.1 中定义的函数求两个双精度浮点数的和。Y 程序#includedouble add(double,double)/*原型说明*/main()double x,y,z;scanf(%lf%lf,&x,&y);z=add(x,y)printf(z=%lf,z);double add(double a,double b)return(a+b);4.4 函数的调用和函数说明函数的调用和函数说明 l 函数的原型说明概念 C语言规定,函数必须先定义,后调用。但实际写程序时,由于函数之间可能互相调用,也很难保证这种关系总是成立。解
18、决这种问题的方法是在调用之前对函数进行说明,这种方法称为函数的原型说明。l 对被调用函数要求 Y 必须是已存在的函数Y 库函数:#include Y 用户自定义函数:函数类型说明 4.4 函数的调用和函数说明函数的调用和函数说明 l 函数说明一般形式 l 函数类型 函数名(形参类型 形参名,);l 或 函数类型 函数名();l 函数说明作用 l 告诉编译系统函数类型、参数个数及类型,以便检验,因此参数列表中,只需类型名即可。如形参名可以是任意的用户标识符,不一定要和函数定义的形参名相同。l 说明l函数原型说明的形式可理解为函数定义的首都加分号“;”l函数说明位置程序的数据说明部分(函数内或外)
19、。p78l函数定义与函数说明不同。函数说明举例main()float add(float,float);/*函数说明*/float a,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sum is%f,c);float add(float x,float y)float z;z=x+y;return(z);4.4 函数的调用和函数说明函数的调用和函数说明 l 可以省去对被调用函数的说明两种情况 被调用函数定义出现在主调函数之前。若函数返值是 char 或 int 型,系统自动按 int型处理。不鼓励使用这种用法,原因是在这种情况下C语言编译器无法得到关于函数参
20、数和参数类型的信息。l 函数原型说明给程序设计带来了极大的灵活性 在一个比较复杂的设计中,总是包含很多函数,通过使用函数原型说明,可以随意安排函数定义的位置,如既可以把主函数写在所有其他函数的后面,也可以把主函数写在所有其他函数的前面。例:被调函数出现在主调函数之前,不必函数说明float add(float x,float y)float z;z=x+y;return(z);main()float a,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sum is%f,c);例:int 型函数可不作函数说明main()float a,b;int c;scanf
21、(%f,%f,&a,&b);c=max(a,b);printf(Max is%dn,c);max(float x,float y)return(xy?x:y);错误!但没有错误信息的报告!改为:c=max(a)4.5 调用函数和被调函数的数据传递调用函数和被调函数的数据传递 4.5 调用函数和被调函数的数据传递调用函数和被调函数的数据传递l 形参 定义函数时函数名后面括号中的变量名。只能在该函数体内使用。l 实参 调用函数时函数名后面括号中的表达式。l 作用 实现数据传送。实参和形参之间进行数据传递。return 语句把函数值返回调用函数。通过全局变量进行数据传递(稍后讨论)main()flo
22、at add(float,float);/*函数说明*/float a=5,b=8,c;c=add(a,b);/*a,b 为实参*/printf(sum is%f,c);float add(float x,float y)/*x,y 为实形参*/return(x+y);4.5 调用函数和被调函数的数据传递调用函数和被调函数的数据传递 l 值传递方式 函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值l 值传递特点 Y 形参与实参占用不同的内存单元,即使同名也互不影响。Y 单向传递,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参
23、。l 实参与形参结合的本质 C语言的函数调用机制是很简单的,值传递是C语言实参与形参结合的惟一方法,后面的实参的其他情形,离不开值传递这个本质。值传递!所谓外部,是指写在源程序文件表层的定义和说明,这种说法是相对于出现在函数体里面的定义或说明而言的。c=add(a+b,3);printf(a=%d n,a);fact(1)char f2(int x,int y)7 变量的作用域和生命期 在进行实际项目开发时,程序开发者通常临时写一些用于调试的主程序,和这些程序文件进行连接,以发现其中的问题。不同函数中同名变量,占不同内存单元,实例采用这种形式后,如果这个文件第二次被包含时,由于 MY_HEAD
24、_FILE 已经有了定义,#if 和#endif之间的所有东西都将被丢掉。解决这种问题的方法是在调用之前对函数进行说明,这种方法称为函数的原型说明。本例中,宏的概念在第 5 章才会介绍,这里请注意的是解决重复包含问题的程序语句结构问题。for(y=0,i=1;i 0 调试时,个别地方的修改引起整个文件重新编译;实例 int p=1,q=5;/*外部变量的定义*/*a 自动进行初始化,为 0*/int max(int x,int y,int z);在复合语句中也可定义局部变量。概念 存储类别指的是变量在内存中的存储位置,有静态和动态两种存储类别。printf(“%d;%d,x,y);printf
25、(file1:%dn,n);4.5 调用函数和被调函数的数据传递调用函数和被调函数的数据传递 l 说明 Y 实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。Y 形参必须指定类型;Y 形参与实参类型一致,个数相同;Y 若形参与实参类型不一致,自动按形参类型转换 函数调用转换;Y 形参变量只有在被调用时,才分配内存单元;调用结束时,即刻释放所分配的内存单元。因此,形参只有在该函数内有效。调用结束,返回后,则不能再使用该形参变量。float add(float x,float y)return(x+y);main()fl
展开阅读全文