课件5-函数第五章新_第1页
课件5-函数第五章新_第2页
课件5-函数第五章新_第3页
课件5-函数第五章新_第4页
课件5-函数第五章新_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

第五章函数《C语言程序设计》第七章函数

本章主要内容:7.1概述7.2函数定义7.3函数参数和函数值7.4函数调用7.5函数的嵌套调用本章重点:函数的定义和调用;函数参数;数组名作为函数的参数;局部变量等。7.6函数的递归调用7.7数组作函数参数7.8全局和局部变量7.9内部函数和外部函数本章作业《C语言程序设计》7.1

概述例7.1 main() { PrintStar(); PrintMessage(); PrintStar(); } PrintStar() { printf(“**********\n”); } PrintMessage() { printf(“Hello\n”); }PrintStar函数PrintMessage函数main函数主函数两个自定义函数**********Hello**********函数《C语言程序设计》说明:一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位,即以源程序单位进行编译。一个C程序由一个或多个源程序文件组成。便于调试,提高开发效率。C程序总是从main函数开始执行,而不管将其写在前面、中间或最后。在调用完其它函数后返回到main函数。main函数是系统定义的。所有函数都是平行定义的(即不可以嵌套定义),但可以嵌套调用。《C语言程序设计》从用户角度看,C语言函数分为两种:库函数: 是系统提供的已设计好的函数,只要指定了要调用函数所在的库文件,就可以直接调用了。用户自定义函数: 是用户自己编写的用来解决具体问题的函数。函数从函数的形式看,函数分为两类:无参函数:不需要向函数传递参数。有参函数:需要向函数传递必要的参数。本章将要详细介绍的是用户自定义函数。《C语言程序设计》7.2函数定义函数定义的一般形式 类型符函数名(形式参数说明表) { 说明部分 语句部分

}函数函数首部函数体intadd(intx,inty){ intsum; sum=x+y; returnsum;}完整的函数定义无参函数定义空函数定义intread(){ intx; scanf(“%d”,&x); returnx;}

dummy(){}《C语言程序设计》7.3函数参数和函数的值实参和形参:[例7.2]main(){ inta=15,b=20,c; c=max(a+10,b); printf(“Max=%d”,c);}intmax(intx,inty){ intz; z=x>y?x:y; returnz;}

main函数max函数形参实参15a20bczxy25202525《C语言程序设计》说明:定义函数时,形参是变量,必须指定类型。形参变量需要的存储单元是在函数被调用时才给它分配,函数结束时予以释放。实参与形参在个数和类型上应一一对应。实参可以是常量、变量或表达式。但变量和表达式要有确定的值。如当a=10时:c=max(7,8); /*ok*/c=max(a,2*4); /*ok*/c=max(a,b); /*error,b没有确定的值*/C语言中,参数的传递是“值传递”,即单向传递。数据只能由实参传送给形参,而不由形参传回给实参。函数《C语言程序设计》函数的返回值 通常,在调用一个函数时,都希望被调函数能返回一个确定的值。这就是函数的返回值。函数的返回值是通过返回语句return实现的,返回语句的形式为:

return;或return表达式或(return表达式); 前一种形式,函数返回值是不确定的,这时调用者一般对返回值不感兴趣,同时将函数说明成void类型。后一种形式,函数要把“表达式”的值返回给调用者。函数《C语言程序设计》说明:如果要从被调函数带回一个值,被调函数中必须要有“return表达式”语句。函数中可以有多个return语句,执行到哪个,哪个就起作用且立即返回调用函数。例如:intmax(intx,inty){ if(x>y) returnx; else returny;}例7.3函数《C语言程序设计》函数的返回值要有一个确定的类型,应该在定义函数时指定。如:intmax(x,y) /*max函数值为整型*/charletter(intasc) /*letter函数值为字符型*/longfact(intn) /*fact函数值为长整型*/为了明确函数不返回值,可用关键字“void”定义函数。如:voidadd(intx,inty){ printf(“Sumis%d”,x+y);}函数《C语言程序设计》7.4函数调用函数调用的一般形式函数名(实参表)如果是调用无参函数,则实参表可以没有,但括号不能省略。如果实参表包含多个实参,则各参数之间用逗号隔开。实参与形参的个数应相等,类型应一致。实参与形参按顺序对应,一一传递数据。如:

p=power(2.5,4); /*ok*/ q=power(2.5,3.8); /*error*/ s=power(2.5); /*error*/ t=power(5,3); /*ok*/《C语言程序设计》函数调用的方式1.函数语句:即把函数调用作为一个语句。如:

PrintStar(); printf(“***********”);

这时不要求函数带回值,只要求完成一定的操作,通常将函数字义为“void”类型。2.函数表达式:函数出现在可以写表达式的地方,此时需要的是函数的值。如:c=2*max(a,b);printf(“%d”,max(a,b));函数《C语言程序设计》对被调函数的声明

main() {inta=10,b=20,c;c=max(a,b); printf(“%d\n”,c); } intmax(intx,inty) {returnx>y?x:y; }怎样使这些信息正确呢?函数C编译系统假定:

1、函数名:max2、函数类型:int根据扫描得知:

3、有两个参数

4、每一个参数的类型均为int该函数与已知信息相符。floatfloatfloatfloat%f由于类型的变化,使该函数与已知信息不相符。这句有错误!float对被调函数的声明《C语言程序设计》函数声明有三种格式:格式1:函数类型函数名(形参说明表);格式2:函数类型函数名(形参类型表);格式3:函数类型函数名();如:intmax(intx,inty);intmax(int,int);intmax();例7.4函数函数原型《C语言程序设计》不必函数声明的情况:当函数定义出现在主调函数之前,可不必函数声明。函数定义包括了函数声明。

示例

如果被调函数的函数值为int类型,也可以不必函数声明。

示例函数《C语言程序设计》7.5函数的嵌套调用例7.5voidprint_star();voidprint_hello();main(){ print_star(); print_hello(); print_star();}voidprint_star(){printf(“**********\n”);}voidprint_hello(){printf(“Hello\n”);}函数《C语言程序设计》7.6函数的递归调用在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C语言的特点之一就在于允许函数的递归调用。例如:intfun(intx){ inty,z; …… z=fun(y); …… returnz-10;}

从递归调用的形式上看,函数会无终止地调用自己,这种情况是我们所不希望的。因此,在定义递归函数时还要有终止条件,使递归调用在条件不满足时不再继续。函数《C语言程序设计》[例7.6]用递归方法求xn。分析: 求解过程:24→23→22→21→20运行过程分析:函数《C语言程序设计》练习:计算n!的数学定义为:

请编写递归函数fact()求n!。《C语言程序设计》7.7数组作函数参数

函数实参可以为变量。数组元素同样是变量(下标变量),也可以作函数的实参。此外,数组名也可以作函数的参数,传递整个数组。数组元素作函数的实参数组元素作函数实参的用法与普通变量的用法一致,是单向传递。[例7.7]找出数组中的最大值练习:打印一批数中的素数。判断是否是素数(PrimeNumber)由函数完成。函数《C语言程序设计》数组名作函数参数当数组名作参数时,传递的是整个数组。按照实参与形参的对应要求,当实参为数组名时,形参必须定义为与实参是同类型的数组。[例7.8]:找出数组中的最大值

intarray_max(intx[5]){……} main() { inta[]={8,7,55,23,49}; …… max=array_max(a); …… }函数形参数组可以不指定大小。为了能正确使用数组元素,再增加一个参数用来存放数组元素的个数。《C语言程序设计》练习1:编写一个函数,求数组元素之和。练习2:编写一个函数,求字符串长度。一般情况下,当函数被调用时,需要为形参变量分配存储单元。但当数组名作参数时,并不给形参数组分配存储单元,而是实现“换名操作”。例7.8的运行分析:[例7.9]调用函数,使数组元素的值扩大k倍。函数intarray_max(intx[],intn){…}main(){inta[]={8,7,55,23,49};…max=array_max(a);…}a87552349x《C语言程序设计》7.8

全局和局部变量函数charch;doublefun2(charc){ floatb; …… ch=c;}intx;main(){ intm,n; ……}

在函数内部说明的变量是局部变量。作用域:自说明位置起至函数结束止。在函数外部说明的变量是全局部变量。作用域:自说明位置起至文件结束止。cbm,nchx《C语言程序设计》在定义一个变量时,除了指定其数据类型外,还可以指定其存储类别。C语言中用四个关键字来表示存储类别:auto————自动的register———寄存器的static ———

静态的extern———

外部的局部变量全局变量《C语言程序设计》一、局部变量自动变量(auto)intf(inta){ autointb,c=3; ……}

自动变量在内存的动态存储区分配:当函数(或分程序)执行时为自动变量分配存储空间;当函数(或分程序)结束时释放自动变量所占的存储空间。auto关键字可以省略。函数《C语言程序设计》寄存器变量(register)intf(inta){ registerinti; ……}

寄存器变量存在于CPU的寄存器中:当函数(或分程序)执行时为寄存器变量分配寄存器;当函数(或分程序)结束时释放寄存器变量所占用的寄存器。函数《C语言程序设计》函数自动变量与寄存器变量之间的区别自动变量main(){ ints=0,i; for(i=1;i<=3;i++)s=s+i; ……}寄存器变量main(){ registerints=0,i; for(i=1;i<=3;i++)s=s+i; ……}CPU运算器寄存器si内存0CPU运算器内存si寄存器运行分析运行分析1131011201312寄存器变量的使用可以减少内存与CPU之间的数据交换,从而提高程序执行的效率。《C语言程序设计》静态的局部变量(static)如:staticintx;

静态的局部变量在内存的静态存储区分配。静态存储区具有如下性质:在编译时即分配存储空间;当程序执行结束后,由操作系统把应用程序撤消时才被释放。存储在静态区的变量,未初始化时为0。

虽然它在整个程序的运行期间总是存在的,但由于它是局部变量,还要受作用域的限制。函数这与其所在的函数无关《C语言程序设计》[例7.10]静态变量与动态变量的比较voidinc(intz){ staticintx=0; autointy=0; x++; y++;z++; printf(“%d,%d,%d\n”,x,y,z);}main(){intp=5; inc(p);inc(p);}

函数运行分析问题函数动态区静态区mainincx00yzp55116运行结果:1,1,62,1,60yz5162此处加一句:printf(“%d”,x);可以吗?《C语言程序设计》二、全局变量全局(程)变量,它是在函数外部定义的。存储在静态区,它的内存分配与释放是由系统完成的。全局变量未初始化时,其初值为0。全局变量的作用域是从定义它的位置开始,一直到本文件结束。[例7.11]在程序中使用全局变量求1!+2!+……+5!全局变量虽然增加了函数传递数据的渠道,但它的使用使函数的通用性降低。又由于全局变量在程序执行期间一直占用内存空间,增加了内存开销。所以不在必要时,最好不使用全局变量。

函数《C语言程序设计》7.9内部函数和外部函数内部函数内部函数又称静态函数。定义函数时前面加上static类别,如:

staticintmax(intx,inty) { returnx>y?x:y; }静态函数只局限于它所在文件,其它文件不能调用该函数。函数《C语言程序设计》外部函数定义函数时被说明成extern类别的函数为外部函数。如:

externintmax(intx,inty) { returnx>y?x:y; }函数的隐含类别就是extern类别,外部函数可以被其它文件调用。函数《C语言程序设计》第七章作业7.1写一个函数,判断两个实数是否相等。两数误差在10-4之内认为相等。7.2给定的三个数,判断:

(1)能否构成三角形;

(2)能否构成直角三角形;

(3)能否构成等腰三角形;

(4)能否构成等腰直角三角形。 分别编写自定义函数。对已定义完的函数,编写新函数时可以调用。函数《C语言程序设计》7.3下列程序的运行结果是5和8,还是8和5。请说明为什么。voidswap(intx,inty){ intt; t=x; x=y; y=t;}main(){ inta=5,b=8; swap(a,b); printf(“%d,%d”,a,b);}

函数《C语言程序设计》7.4写出下列程序的输出结果。voidfun(int,int);main(){ inti,j,x,y,n,g; i=2;j=3;g=x=5;y=9;n=7; fun(n,6); printf(“g=%d,i=%d,j=%d,x=%d,y=%d\n”,g,i,j,x,y); fun(n,6);}voidfun

温馨提示

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

评论

0/150

提交评论