C语言程序设计(微课版)ch7-函数_第1页
C语言程序设计(微课版)ch7-函数_第2页
C语言程序设计(微课版)ch7-函数_第3页
C语言程序设计(微课版)ch7-函数_第4页
C语言程序设计(微课版)ch7-函数_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计第七章函数第七章函数第7章函数

7.1函数定义和函数调用

7.2函数的嵌套调用和递归调用

7.3局部变量和全局变量

7.4变量的存储类别

7.5内部函数和外部函数函数概述程序设计有两大最高级的艺术算法设计艺术结构设计艺术函数(function)是结构设计的最基本单位“一个程序应该是轻灵自由的,它的子过程就象串在一根线上的珍珠。”——GeoffreyJames的《编程之道》函数是C语言的基本组成单元。每个函数用来完成某一特定的功能。把单一功能做成函数的方式,有利于软件的复用。第七章函数函数概述C程序的函数有两种:标准库函数:由系统提供,如:sqrt(x),exp(x)。自定义函数:用户自定义函数第七章函数7.1函数定义和函数的调用

返回值类型

函数名

(参数表)

{

函数体

return表达式;

}返回值类型与return语句配合

如果不需要返回值,则应该用void

定义返回值类型。当函数执行到return语句时,就中止函数的执行,返回到调用它的地方。函数内部可以定义只能自己使用的变量,称内部变量。参数表里的变量也是内部变量第七章函数函数名命名Windows风格函数名命名用大写字母开头的单词组合而成变量名形式“名词”或者“形容词+名词”如变量名OldValue与NewValue等函数名形式“动词”或者“动词+名词”(动宾词组)如函数名GetMax()等第七章函数对函数接口加以注释说明/*函数功能:实现××××功能

函数参数:参数1,表示×××××

参数2,表示×××××

函数返回值:×××××*/

返回值类型函数名

(参数表){

函数体

return表达式;}第七章函数【例7.1a】计算两个整数的平均数/*

函数功能:计算平均数

函数入口参数:整型x,存储第一个运算数整型y,存储第二个运算数

函数返回值:平均数*/intAverage(intx,inty){ intresult; result=(x+y)/2;

returnresult;}第七章函数函数调用(call)单向值传递调用函数时,必须提供所有的参数提供的参数个数、类型、顺序与定义时相同有返回值时放到一个数值表达式中,如c=max(a,b);

作为另一个函数调用的参数,如

c=max(max(a,b),c);printf("%d\n",max(a,b));无返回值时函数调用表达式,如display(a,b);第七章函数【例7.1b】

使用了Average函数的main()

#include<stdio.h>intAverage(intx,inty){

intresult; result=(x+y)/2;

returnresult;}main(){

inta=12;

intb=24;

intave; ave=Average(a,b); printf("Averageof%dand%dis%d.\n",a,b,ave);}intAverage(intx,inty){intresult;result=(x+y)/2;returnresult;}main(){inta=12;intb=24;intave;ave=Average(a,b);

printf(……);}数据传递执行顺序第七章函数函数原型(prototype)调用一个函数之前,先要对其返回值类型、函数名和参数进行声明(declare)

不对函数进行声明是非常危险的声明时不要省略参数以及返回值的类型第七章函数#include<stdio.h>intAverage(intx,inty){ intresult; result=(x+y)/2; returnresult;}main(){ inta=12; intb=24; intave=Average(a,b); printf("Averageof%dand%dis%d.\n",a,b,ave);}【例7.1】第七章函数#include<stdio.h>int

Average(intx,inty);/*声明Average()函数*/main(){

inta=12;

intb=24;

intave=Average(a,b);

printf("Averageof%dand%dis%d.\n",a,b,ave);}intAverage(intx,inty)/*计算两个整数的平均数*/{

intresult; result=(x+y)/2;

returnresult;}【例7.1】第七章函数7.2.1函数的嵌套调用

在被调函数中,又调用了函数----嵌套调用7.2函数的嵌套调用和递归调用

main(){……...}a函数{……}b函数{………}①③④⑤⑥⑦②第七章函数【例7.7】

编写程序,输入n,m,求组合数#include<stdio.h>voidmain(){intm,n;longcmn(int,int);

scanf("%d%d",&m,&n);printf("cmn=%ld\n",cmn(m,n));}longJc(intn){inti;longt=1;for(i=1;i<=n;i++)t*=i;return(t);}longcmn(intm,intn){return(Jc(m)/(Jc(n)*Jc(m-n)));}第七章函数7.2.2函数的递归调用

当一个函数直接或间接的调用它自身时,称为函数的递归调用。前者称为直接递归,后者称为间接递归第七章函数7.7.2函数的递归调用递归方法:两步:递推、回归。例如:求4!4!=4*3!→3!=3*2!→2!=2*1!→1!=1*0!→0!=14!=4*6←3!=3*2←2!=2*1←1!=1*1←0!=1第七章函数【例7.8】

用递归计算n!#include<stdio.h>longJc(intn){longf;

if(n==1||n==0)f=1;elsef=n*Jc(n-1);returnf;}voidmain(){longy;intn;scanf("%d",&n);y=Jc(n);printf("%d!=%ld",n,y);}main函数y=Jc(3)jc函数f=3*Jc(2)jc函数f=2*Jc(1)jc函数f=1return1jc函数f=2*Jc(1)return2jc函数f=3*Jc(2)return6第七章函数【例7.9】

把十进制整数按相反的顺序将各位数字打印出来。如:print(123456);输出:654321#include<stdio.h>voidprint(longn){if(n==0)return;

else

{printf("%d",n%10);

print(n/10);

return;

}}voidmain(){longn;scanf("%ld",&n);

print(n);}运行结果如下:

123456↙654321第七章函数7.3局部变量和全局变量变量的分类作用域:变量的有效范围(空间)局部变量全局变量生存期:变量存在的时间(时间)静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义的函数开始执行至函数执行结束第七章函数7.3.1局部变量(内部变量)定义:在函数内定义的变量。作用域:在本函数内有效。

说明:(1)main函数中定义的变量只在

main函数中有效。(2)形参属于局部变量。(3)不同函数中同名变量,占不同内存单元。(4)在复合语句中定义的变量,只在本复合语句中有效。7.3局部变量和全局变量voidmain(){inta,b,c;a=1;b=2;

c=a+b;

{intc;

c=a-b;printf("%d\n",c);

}printf("%d\n",c);}输出:-13第七章函数7.3.2全局变量(外部变量)定义:在函数外部定义的变量。作用域:从定义的位置到本文件结束。7.3局部变量和全局变量x,i,ja,b,c,dm,nc1,c2a1,a2inta1=1,a2=5;

floatf1(floatx){inti,j;......}charc1,c2;charf2(inta,intb){intc,d;......}voidmain(){intm,n;......}第七章函数注意:

(1)设置全局变量的作用是增加了函数间数据传递的通道。(2)全局变量定义时未初始化,系统为其赋初值0。(3)若全局变量与局部变量同名,则在局部变量的作用范围内,同名的全局变量不起作用。7.3局部变量和全局变量【例7.10】编写函数求两个数的和与积。#include<stdio.h>floatadd,mult;voidfunc(floatx,floaty){add=x+y;

mult=x*y;}voidmain(){floata,b;scanf("%f%f",&a,&b);func(a,b);printf("%.2f%.2f\n",add,mult);}运行情况如下:38↙11.0024.00第七章函数注意:

(4)当全局变量定义在后,引用在前时,应在引用它的函数中用extern

对此全局变量进行声明(说明)。7.3局部变量和全局变量【例7.11】用extern声明外部变量,扩展它在程序文件中的作用域#include<stdio.h>intmax(intx,inty){intz;z=x>y?x:y;return(z);}voidmain(){

externA,B;

printf("%d",max(A,B));}intA=8,B=2;第七章函数

(5)当一个程序由多个源文件组成时,如果想在一个文件中引用另一个文件中的已定义的外部变量,要用extern对该变量进行声明。文件a1.c中的内容为:#include<stdio.h>inta;

main(){intpower(int);intd,m;printf("enteranumberanditspower:\n");scanf("%d,%d",&a,&m);d=power(m);printf("%d**%d=%d",a,m,d);}文件a2.c中的内容为:externa;

intpower(intn){inti,y=1;for(i=1;i<=n;i++)y*=a;return(y);}【例7.12】用extern将外部变量的作用域扩展到其他文件。第七章函数intx=1,y=2;voidsub(inty){

x++;y++;printf(“(1)x=%d,y=%d\n”,x,y);}voidmain(){intx=5;sub(x);printf(“(2)x=%d,y=%d\n”,x,y);}练习:程序结果(1)x=2,y=6(2)x=5,y=2第七章函数#include<stdio.h>intm=10,n=100;voidde(){intn=100;

n-=20;

m-=2;}main(){intn=80;

for(;n>=60;){de();

n=n-20;

printf(“%d\n”,n+m);}}de()函数中局部变量n的作用域main()中局部变量n的作用域全局变量m,n的作用域运行结果:6846全局变量可以与局部变量同名。在局部变量的作用范围内,全局变量不起作用。第七章函数7.4变量的存储类型变量的属性:intx;

数据类型:如int,float等。

存储类型:是指数据在内存中的存储方式。分两大类:静态存储类动态存储类用户内存空间静态存储区动态存储区程序区具体包括四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern)。变量定义的形式:存储类型标识符类型标识符变量名;例如:autointx;或intx;第七章函数7.4变量的存储类型auto自动变量——动态存储区

register寄存器变量——CPU中的寄存器

extern外部变量——静态存储区

static静态变量——静态存储区存储类型程序区静态存储区动态存储区形参、自动变量、函数调用的现场等全局变量、静态变量存放数据第七章函数7.4变量的存储类型局部变量的存储方式(三种)自动变量静态局部变量寄存器变量第七章函数1、自动变量(auto)

“自动”体现在进入语句块时自动申请内存,退出时自动释放内存对它们分配和释放存储空间的工作由编译系统自动处理,故称其为自动变量标准定义格式

auto类型名变量名;动态局部变量缺省的存储类型不初始化时,值是不确定的例如:intf(inta)/*形参a为自动变量,auto省略*/{autointb,c=3;/*定义b,c为自动变量*/……}第七章函数2、静态局部变量

有时希望函数中局部变量的值在函数调用结束后不消失(以后一直存在,并总是保持它的最新值,即具有记忆性。)即不释放存储单元。此时可指定该变量为“静态局部变量”,用关键字“static”说明。静态局部变量系统自动初始化为0。存放在静态存储区中第七章函数2、静态局部变量有时希望函数中局部变量的值在函数调用结束后不消失(以后一直存在,并总是保持它的最新值,即具有记忆性。)即不释放存储单元。此时可指定该变量为“静态局部变量”,用关键字“static”说明。静态局部变量系统自动初始化为0。存放在静态存储区中

静态变量和全局变量都是静态存储类型

自动初始化为0

从静态存储区分配,生存期为整个程序运行期间但作用域不同第七章函数【例7.13】考察静态局部变量的值#include<stdio.h>intfunc(inta){intb=0;

staticintc

=

1;

b

=

b

+

1;

c

=

c

+

1;return(

a

+

b

+

c

);}voidmain(){inta=2,i;for(i=0;i<3;i++)printf("%d",func(a));}分析:i=0时:

a:2b:0

c:1b:1

c:2a+b+c=2+1+2=5;运行结果:567分析:i=1时:

a:2b:0

c:2b:1

c:3a+b+c=2+1+3=6;第七章函数3、寄存器变量(register)对频繁使用的变量,为减少存取变量花费的时间,C语言允许将局部变量的值存放在CPU运算器的寄存器中,称为“寄存器变量”,用关键字“register”说明。说明:寄存器变量的类型一般只限于整型、字符型或指向整型、字符型的指针,且只用于局部变量和形参。因此,全局寄存器变量是非法的。不能定义任意多个寄存器变量,因为一个计算机系统中寄存器的数目是有限的。不能取寄存器变量的地址第七章函数7.5内部函数和外部函数1.

内部函数

内部函数只能被本文件中的其他函数所调用。

在定义函数时,在前面加static

即:

static

类型标识符函数名(形参表)例如:

staticfloatfun(floatx,floaty){……}第七章函数7.5内部函数和外部函数2.外部函数(1)在定义函数时,在前面加上extern,则表示该函数为外部函数,可供其他文件调用。如

externfloatfun(floatx,floaty){……}

温馨提示

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

评论

0/150

提交评论