计算机软件基础课件:函数_第1页
计算机软件基础课件:函数_第2页
计算机软件基础课件:函数_第3页
计算机软件基础课件:函数_第4页
计算机软件基础课件:函数_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

函数《计算机软件基础》01.函数的概念02.函数的调用03.局部变量和全局变量主要内容04.函数的递归调用05.函数应用举例本章重点难点本章重点:函数的定义和调用方法;实参与形参的对应关系;调用函数时数据的传递方式;变量的作用域;变量的生存期;递归调用过程;编写含有自定义函数、递归函数的程序。本章难点:调用函数时数据的传递方式;递归调用过程;编写含有自定义函数、递归函数的程序。模块化程序设计思想:

为了降低开发大规模软件的复杂度,往往需将大规模的问题分解为若干个小问题,小问题再分解为更小的问题。模块:一个具有独立功能的程序段。函数是C语言中模块化程序设计的最小单位01函数的概念函数是构成程序的基本模块1.函数的分类1)库函数:要用预编译命令“#include”将指定头文件。输入、输出类。例如,程序中凡是出现getchar()、putchar()、printf()、scanf()、gets()、puts()等函数时,在程序的开头必须写上预编译命令:

#include"stdio.h"或#include<stdio.h>字符串处理类。例如,程序中出现strlen()、strcpy()、strcat()、strcmp()等函数时,在程序的开头必须写上预编译命令:#include"string.h"或#include<string.h>数学类。例如,程序中出现fabs()、sqrt()、sin()、cos()等数学类函数时,在程序的开头必须写上预编译命令:#include"math.h"或#include<math.h>2)用户自定义函数函数在使用之前必须定义。函数定义的基本格式为:返回值类型函数名(类型1形式参数1,类型2形式参数2,…) /*函数头部*/{/*花括号{}之间为函数体,花括号为函数体的定界符*/

说明部分;/*对函数体内所有变量和即将要调用的函数作声明*/

语句部分;/*可执行语句序列*/}函数可以分为:有参函数,无参函数。C语言不允许函数的嵌套定义。2.函数的定义02函数的调用函数的使用1.函数调用和实参一个完整的C程序可由一个主函数main()组成,或由一个主函数和若干子函数构成。主函数可以调用子函数,子函数不能调用主函数。子函数之间可以相互调用。若A函数调用B函数,一般情况下,B函数在A的前面定义。若要将B放在A的后面定义,则需要在A函数体的说明部分对B进行声明。形参和实参总的来讲是一一对应的关系,具体是:①个数相等。②顺序一致。③类型相符(或实参可以给形参正确的赋值)……f1();f2();……main()……f3()………………f1()f2()…………f3()2.函数调用和返回值1)无返回值函数的调用若函数中return语句后面无表达式或者函数无return语句,这时函数没有返回值。没有返回值的函数,其类型定义空类型,用类型名void表示。intmain(){voidmax(int,int); …max(a,b); /*无返回值函数调用*/return0;} /*无返回值函数定义*/voidmax(intx,inty){}对函数max的调用声明两个形式参数x,y两个实际参数a,b2)有返回值函数的调用若函数中有“return(表达式);”语句或“return表达式;”语句,则该函数一定有返回值。return后面表达式值的类型应以所在函数返回值类型为准。当函数类型为int时,可以不写,系统默认为int。intmain(){intmax(int,int); …c=max(a,b);/*有返回值函数调用*/return0;} /*无返回值函数定义*/intmax(intx,inty){…returnz;}对函数max的调用声明两个形式参数x,y两个实际参数a,b返回值z3.函数调用时的数据传递数据传递方式有4种:单向值传递方式地址传递方式返回值传递方式全局变量传递方式1)单向值传递方式单向值传递方式是调用函数时,将实参值计算出来赋给对应的形参,即数据只能从实参单向传给形参。单向值传递的调用过程①形参和实参各占一个独立的存储空间。②形参的存储空间是在函数调用时才分配的,调用前是不占存储的。调用开始,系统为形参开辟一个临时存储区,然后将各实参值传给对应的形参,这时形参就得到了实参的值。③函数执行完返回时,形参的临时存储区被回收。单向值传递调用的特点①函数中对形参的操作不会影响到主调函数中的实参。②单向值传递时实参可以是常数、已有值的变量和表达式,而形参一般是变量。2)地址传递方式在函数调用中,把实参数组的起始地址传给形参,这样两个数组就共占同一段内存空间(形参数组是不分配内存的)。传递了数组的首地址后,被调函数就能够准确的知道该数组的存储位置。形参数组中各元素值如发生变化会使这个实参数组的值同时发生变化。也称为双向传递,即不仅能将主调函数中的数据带到被调函数,而且能把被调函数变化了的数据带回主调函数。注意:

①以一维数组名作参数时,实参数组必须定义为具有确定长度的数组,而形参可以不定义长度。

②使用形参数组时,其下标不要超过实参数组的长度。

③实参数组与相应的形参数组类型应一致。03局部变量和全局变量作用域:变量在什么范围内有效根据作用域不同,分为:局部变量全局变量1.局部变量在函数内定义,只在本函数范围内有效的变量。局部变量只是当其所在的函数被调用时才具有确定的存储空间主函数main中定义的局部变量只在主函数中有效,主函数不能使用其他函数中定义的局部变量。不同函数中可以使用相同的变量名,但它们有各自的作用域,互不干扰。作用:增强了函数模块的独立性。如例4-7。2.全局变量在函数外部定义的量,可以为程序中各个函数所引用,其作用域是整个程序。从程序运行开始起就占据内存,仅在程序结束时才将其释放。优点:使函数之间的数据交换更容易,也更高效。缺点:全局变量在程序的执行过程中一直占用存储空间,降低了空间利用率。各函数执行时都可能改变全局变量的值,程序易出错,降低了程序的可读性。全局变量的作用牵制了各个函数,降低了各函数之间的相对独立性。建议程序设计过程中尽量不使用全局变量。如例4-9。3.变量的生存期变量的生存期是指变量从生产到被撤销的时间段,实际上就是变量占用内存的时间。

变量的生存期是由变量的存储类型声明的。其一般声明方式如下:存储类型数据类型变量名表;C语言中提供的存储类型主要有四种:auto(自动变量)register(寄存器变量)static(静态变量)extern(外部变量)1)用auto声明的自动变量变量定义时缺少存储类型说明则系统默认为自动变量。例如:autointa=2,b=3;等价于:inta=2,b=3;特点:函数调用结束,该种变量即被释放,属于动态存储方式。2)用register声明的寄存器变量寄存器是CPU内部的一种容量有限但速度极快的存储器。

寄存器的存取速度高于内存的存取速度。现代编译程序能自动优化程序,自动把普通变量优化为寄存器变量,并且可以忽略用户的register指定,所以一般无需特别声明变量为寄存器变量。3)用extern声明的外部变量如果在所有函数之外定义的变量没有指定其存储类别,那么它就是一个外部变量。外部变量是全局变量。

没有显示初始化的外部变量由编译程序自动初始化为0。file2.cexterna;print(){……}modify(){……c=a*2;}file1.cinsert(){

externa;……

}inta;query(){……}/*在定义点之前*//*在其他文件中*/4)用static声明的静态变量这种变量的值在函数结束后占用的存储空间不回收,在下一次调用该函数时,变量的值仍保持上一次退出函数前所拥有的值。优点:提高了程序的运行效率。缺点:对于相同的输入参数输出不同的结果,因此建议尽量少用静态局部变。C语言规定在定义局部静态变量时,如不赋初值,自动赋初值,数值型变量则赋0值,字符型变量赋空字符。04函数的递归调用调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。函数是可以嵌套调用的,如下图所示,main可以调用函数A,函数A继续调用函数B。main函数{............调用函数A;............}函数A{............调用函数B;............}函数B{..............................}调用返回调用返回求n的阶乘n!

longfactn(4){longfac;......fac=4*factn(3);returnfac;}返回6longfactn(3){longfac;......fac=3*factn(2);returnfac;}返回2longfactn(2){longfac;......fac=2*factn(1);returnfac;}返回1longfactn(1){longfac;if(n==1)return1;......}intmain(){…w=factn(4);printf(“4!=%1d\n”,w);return0;}返回24以求4!为例,递归调用执行过程如下:当main函数开始调用factn(4)时,开始递归过程,依次调用factn(3),factn(2),factn(1)。这个过程就是函数的嵌套调用,比较容易理解。longfactn(4){longfac;......fac=4*factn(3);returnfac;}返回6longfactn(3){longfac;......fac=3*factn(2);returnfac;}返回2longfactn(2){longfac;......fac=2*factn(1);returnfac;}返回1longfactn(1){longfac;if(n==1)return1;......}intmain(){…w=factn(4);printf(“4!=%1d\n”,w);return0;}返回24以求4!为例,递归调用执行过程如下:最重要的是当执行factn(1)时,因为满足n==1,执行return(1),递归调用被终止,但程序没有结束。它将返回值1传递给调用它的factn(2),以此类推,最终factn(4)将计算结果24返回给main函数,得到期望的结果。longfactn(4){longfac;......fac=4*factn(3);returnfac;}返回6longfactn(3){longfac;......fac=3*factn(2);returnfac;}返回2longfactn(2){longfac;......fac=2*factn(1);returnfac;}返回1longfactn(1){longfac;if(n==1)return1;......}intmain(){…w=factn(4);printf(“4!=%1d\n”,w);return0;}返回24以求4!为例,递归调用执行过程如下:总而言之,调用的过程容易被理解,但是初学者往往容易忽视返回的过程。递归优点:思路简洁清晰(因为具体的实施过程不需要编程者

温馨提示

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

评论

0/150

提交评论