C语言程序设计-第3版-第8章-函数_第1页
C语言程序设计-第3版-第8章-函数_第2页
C语言程序设计-第3版-第8章-函数_第3页
C语言程序设计-第3版-第8章-函数_第4页
C语言程序设计-第3版-第8章-函数_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计第8章函数第1讲:简单函数介绍1.函数的概述提纲2.函数的定义3.函数的调用1.函数的概述说明分类C语言程序设计注意说明:(1)C源程序是由函数组成的且只有一个主函数main()。(2)主函数可以调用其它函数,而不允许被其它函数调用。(3)程序由主函数开始执行,并且由主函数结束。源程序主函数自定义函数2自定义函数1…调用(4)主函数可以放在程序的任意位置。1.函数的概述说明分类C语言程序设计库函数和自定义函数:(1)库函数

C系统提供,用户无须定义,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。

例如:printf、scanf、getchar、putchar、gets、puts等函数,都需要加上头文件#include"stdio.h"。求的值。运行结果语句编写#include"stdio.h"#include"math.h"main(){}intx;doubley;scanf("%d",&x);y=sqrt(x);printf("%lf\n",y);

5↙头文件math.h中包含了sqrt函数,其功能就是开方。

2.236068

1.函数的概述说明分类C语言程序设计库函数和自定义函数:(2)自定义函数

由用户按实际需要自己编写的函数,需要被调用才能实现其功能。求两个整数之和。运行结果语句编写intsum(intx,inty)//自定义函数{

}main()//主函数{}ints;s=sum(2,3);printf(“s=%d\n",s);

s=5returnx+y;2.函数的定义无返回值无参数无返回值有参数有返回值无参数有返回值有参数C语言程序设计一般形式:void函数名(){

函数体;}

注意说明:(1)其中void和函数名称为函数头。函数名后有一个空括号,其中无参数,但括号不可少。(2){}中的内容称为函数体。(3)void代表函数无类型,即无返回值,不需要return。运行结果语句编写voidHello()//自定义函数{printf("Helloworld!\n");}main()//主函数{}Hello();

Helloworld!2.函数的定义无返回值无参数无返回值有参数有返回值无参数有返回值有参数C语言程序设计一般形式:void函数名(形式参数表列){

函数体;}注意说明:(1)有参函数比无参函数多了一个内容,即形式参数表列。(2)形式参数可以是各种类型的变量,参数之间用逗号间隔。(3)进行函数调用时,主调函数将传递给形式参数实际的值。运行结果语句编写voidsum(inta,intb)//自定义函数{ints;s=a+b;printf("s=%d\n",s);}main()//主函数{}intx=2,y=3;sum(x,y);

s=52.函数的定义无返回值无参数无返回值有参数有返回值无参数有返回值有参数C语言程序设计一般形式:类型标识符函数名(){

函数体;return表达式;}注意说明:(1)函数的类型实际上是函数返回值的类型。(2)return语句的作用是把值作为函数的值返回给主调函数。(3)有返回值的函数中至少应有一个return语句。运行结果语句编写intsum()//自定义函数{inta,b,s;scanf("%d%d",&a,&b);s=a+b;returns;}main()//主函数{}ints;s=sum();printf("s=%d\n",s);

23↙

s=52.函数的定义无返回值无参数无返回值有参数有返回值无参数有返回值有参数

C语言程序设计一般形式:类型标识符函数名(形式参数表列){

函数体;return表达式;}注意说明:(1)在C程序中,一个自定义函数的定义可以放在任意位置。(2)如果放在main之后,在调用之前,需要对它进行说明。例如:intsum(inta,intb);运行结果语句编写intsum(inta,intb)//自定义函数{ints;s=a+b;returns;}main()//主函数{}intx,y,s;scanf("%d%d",&x,&y);s=sum(x,y);printf("s=%d\n",s);

23↙

s=53.函数的调用形参实参返回值调用方式C语言程序设计内存注意说明:(1)形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。(2)实参可以是常量、变量、表达式等,在进行函数调用时,把具有确定的值传送给形参。(3)函数调用中发生的数据传送是单向的。x2y3实参形参ab23(4)实参和形参在数量、类型和顺序上应严格一致。3.函数的调用形参实参返回值调用方式C语言程序设计return语句一般形式:return表达式;或者为:return(表达式);

注意说明:(1)在函数中允许有多个return语句,但每次调用只能有一个return语句被执行。(2)函数返回值的类型和函数定义中函数的类型应保持一致。(3)不返回函数值的函数,可以明确定义为“空类型”,类型说明符为“void”。3.函数的调用形参实参

返回值调用方式C语言程序设计函数调用的一般形式:函数名(实际参数表)实际参数表中的参数可以是常数、变量或表达式,各实参之间用逗号分隔。调用方式:(1)函数表达式:函数作为表达式中的一项出现在表达式中,这种方式要求函数有返回值。例如:s=sum(x,y);把sum的返回值赋予变量s。

(2)函数语句:函数调用的一般形式加上分号即构成函数语句,这种方式不要求函数有返回值。例如:sum(x,y);以函数语句的方式调用函数。(3)函数实参:函数作为另一个函数调用的实际参数出现。例如:printf("%d",sum(x,y));把sum调用的返回值作为printf函数的实参来使用的。C语言程序设计第8章函数第2讲:特殊函数介绍1.函数的嵌套调用提纲2.函数的递归调用3.数组作为函数参数1.函数的嵌套调用调用过程应用实例C语言程序设计嵌套调用定义:main函数调用函数A

结束

C语言允许在被调函数中又调用其它函数,即函数的嵌套调用。调用过程描述图:函数A调用函数B

函数B1.函数的嵌套调用调用过程应用实例C语言程序设计利用函数嵌套实现程序设计,求1!+2!+…+5!算法设计:1、编写求阶乘的函数fact;2、编写求和的函数sum,嵌套调用函数fact;3、编写主函数,其中调用函数sum;语句编写intfact(intn)//求阶乘函数{intf=1,i;for(i=1;i<=n;i++)f=f*i;returnf;}int

sum(inth)//求和函数{inti,s=0;for(i=1;i<=h;i++)s=s+fact(i);returns;}main()//主函数{ints;

s=sum(5);printf("s=%d\n",s);}运行结果s=153调用fact(1)调用fact(4)调用fact(2)调用fact(5)调用fact(3)2.函数的递归调用调用过程应用实例C语言程序设计递归调用定义:s=5*fact(4)一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。

调用过程描述图:4*fact(3)3*fact(2)2*fact(1)12*1=23*2=64*6=245*24=120调用过程应用实例C语言程序设计利用函数递归调用实现程序设计,求n!算法设计:1、编写求阶乘的函数fact;2、判断n=1时,返回值1;3、判断n≥2时,函数fact调用n*fact(n-1);语句编写intfact(intn)//求阶乘函数{}if(n==1)return1;main()//主函数{ints;s=fact(5);

printf("s=%d\n",s);}运行结果s=1202.函数的递归调用elsereturnn*fact(n-1);4、编写主函数调用函数fact;3.数组作为函数参数C语言程序设计数组元素作函数实参:它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。例如:fun(a[1]);判别一个数组中各元素的值,若大于零则输出该值,若小于等于零则输出0值。语句编写voidnzp(intv){if(v>0)printf("%d",v);elseprintf("%d",0);}main(){inta[5],i;printf("请输入五个数据:");for(i=0;i<5;i++){scanf("%d",&a[i]);nzp(a[i]);}}运行结果请输入五个数据:5-7-923↙数组元素数组名500233.数组作为函数参数C语言程序设计数组名作函数实参形式:函数定义时,形参应写成如下的形式:

类型函数名称(类型标识符数组名称[])例如:voidfun(inta[])数组中存放了一名学生5门课程的成绩,求平均成绩。

语句编写floataver(floata[]){inti;floatav,s=a[0];for(i=1;i<5;i++)s=s+a[i];av=s/5;returnav;}main(){floats[5],av;inti;printf("请输入五门课的成绩:");for(i=0;i<5;i++)scanf("%f",&s[i]);av=aver(s);printf("平均成绩是:%5.2f\n",av);}运行结果请输入五个数据:8898768993↙数组元素数组名平均成绩是:88.80函数调用时,实参应写成如下的形式:

函数名称(数组名称)例如:fun(a)

C语言程序设计第8章函数第3讲:变量存储类别及内外部函数1.局部变量和全局变量提纲2.动态变量和静态变量3.变量的其他存储类别4.内部函数与外部函数1.局部变量和全局变量局部变量全局变量C语言程序设计定义:局部变量也称为内部变量。局部变量是在函数内作定义说明的,其作用域仅限于函数内。例如:intf1(inta){intb,c;……}intf2(intx){inty,z;……}main(){intm,n;……}函数f1:函数f2:主函数main:

C语言程序设计注意说明:(1)主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。

(2)形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。

(3)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰。运行结果语句编写voidf(inta,intb){inti,j;i=a+2;j=b-1;printf("函数f中:a=%d,b=%d\n",a,b);printf("函数f中:i=%d,j=%d\n",i,j);}main(){inti=4,j=5;f(i,j);printf("主函数中:i=%d,j=%d\n",i,j);}函数f中:a=4,b=5函数f中:i=6,j=4主函数中:i=4,j=51.局部变量和全局变量局部变量全局变量1.局部变量和全局变量局部变量全局变量C语言程序设计定义:全局变量也称为外部变量,它是在函数外部定义的变量,其作用域是整个源程序。例如:函数f1:函数f2:主函数main:

inta,b;voidf1(){……}floatx,y;intf2(){……}main(){……}1.局部变量和全局变量局部变量全局变量C语言程序设计输入圆的半径,求圆的周长和面积。

运行结果语句编写floats;floatls(floatr){floatlen;

len=2*3.14*r;s=3.14*r*r;returnlen;}main(){floatc,r;printf("请输入圆的半径:");scanf("%f",&r);c=ls(r);printf("圆的周长为:%f\n",c);printf("圆的面积为:%f\n",s);}请输入圆的半径:5↙圆的周长为:31.400000圆的面积为:78.5000002.动态变量和静态变量动态变量静态变量C语言程序设计定义:变量前如不加以任何声明或者专门声明为auto存储类别,称为动态变量。f(inta){autointb,c=3;

……

}例题:说明:a是形参,属于动态变量,b和c是函数中定义的变量,也属于属于动态变量,对c赋初值3。执行完f函数后,自动释放a,b,c所占的存储单元。2.动态变量和静态变量动态变量静态变量C语言程序设计定义:变量的值在函数调用结束后保留原值,用关键字static进行声明,称为静态变量。注意说明:(1)静态变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放。(2)静态变量在编译时赋初值,即只赋初值一次。语句编写f(inta){autob=2;staticc=3;b=b+1;c=c+1;returna+b+c;}main(){inta=1,i;for(i=1;i<=2;i++)printf("第%d次调用后结果:%d\n",i,f(a));}变量存储图:实参a1b2c3调用f(1)形参a134运行结果第1次调用后结果:8调用f(2)5第2次调用后结果:93.变量的其他存储类别register

externC语言程序设计寄存器变量定义:C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。注意说明:(1)只有局部自动变量和形式参数可以作为寄存器变量。(2)一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量。(3)局部静态变量不能定义为寄存器变量。3.变量的其他存储类别register

externC语言程序设计声明外部变量定义:如果在定义点之前想引用某外部变量,则应该在引用之前用关键字extern作“外部变量声明”。用extern声明外部变量,扩展变量的作用域。语句编写运行结果请输入存款金额:800↙余额为:10800元voidsave(){intmoney;externamount;printf("请输入存款金额:");scanf("%d",&money);amount=amount+money;}intamount=10000;main(){save();printf("余额为:%d元\n",amount);}如果没有声明语句externamount;那么在save函数中amount不会识别,系统报错。4.内部函数与外部函数内部函数外部函数C语言程序设计定义:如果一个函数只能被本文件中其他函数所调用,它称为内部函数。内部函数又称静态函数。格式:static

类型标识符函数名(形参表)static

int

fun(int

a,int

b)

例如:使用内部函数解决两个文件中存在重名函数问题。文件test0.c文件test.cstaticintsum(inta,intb,intc){ints;s=a+b+c;returns;}#include"stdio.h"intsum(inta,intb){ints;s=a+b;returns;}main(){intx,y,s;scanf("%d%d",&x,&y);s=sum(x,y);printf("s=%d\n",s);}4.内部函数与外部函数内部函数外部函数C语言程序设计定义:在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数。格式:extern

类型标识符函数名(形参表)extern

int

fun

(int

a,

int

b)

例如:使用外部函数解决一个文件调用其他文件中函数问题。文件test0.c文件test.cexternintdiffer(inta,intb){intz;z=a-b;returnz;}#include"stdio.h"intsum(inta,intb){ints;s=a+b;returns;}main(){intx,y,s,z;scanf("%d%d",&x,&y);s=sum(x,y);printf("s=%d\n",s);z=differ(x,y);printf("z=%d\n",z);}注意说明:(1)外部函数可供其他文件调用。(2)在定义函数时省略extern,则隐含为外部函数。C语言程序设计第4讲:常见编译错误与调试第8章函数1.库函数引用问题提纲2.函数声明问题3.形参和实参问题1.库函数引用问题解决办法:C语言程序设计问题描述:使用库函数时,没有加相应的头文件。在头文件中添加#include"math.

温馨提示

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

评论

0/150

提交评论