第4章函数.ppt
《第4章函数.ppt》由会员分享,可在线阅读,更多相关《第4章函数.ppt(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、大连大学DaLian University第四章第四章 函函 数数第四章 函 数大连大学DaLian University第四章第四章 函函 数数本章主要内容函数概述函数概述应用函数的编程(函数之间的数据传递)应用函数的编程(函数之间的数据传递)值传递值传递地址传递地址传递变量的作用域与变量的存储类型变量的作用域与变量的存储类型auto变量、变量、static 变量变量局部变量、全局变量局部变量、全局变量大连大学DaLian University第四章第四章 函函 数数C程序是由函数组成的(可以多个)程序是由函数组成的(可以多个)有且只有一个有且只有一个main()其它函数其它函数 库函数库函
2、数自定义函数自定义函数函数是结构化程序设计的基本模块。函数是结构化程序设计的基本模块。具有某种功能的代码段具有某种功能的代码段通用性强,可以被重复使用。通用性强,可以被重复使用。易于维护,可以独立设计,单独调试。易于维护,可以独立设计,单独调试。划分函数时,考虑功能单一完整。划分函数时,考虑功能单一完整。4.1 函数概述函数概述大连大学DaLian University第四章第四章 函函 数数结构化程序设计思想结构化程序设计思想复杂问题复杂问题main()abca1a2b1b2c1c2结构化程序设计结构化程序设计:也称为,自顶向下、逐步细化。也称为,自顶向下、逐步细化。将复杂的系统划分为功能相
3、对独立的子系统的组合,将复杂的系统划分为功能相对独立的子系统的组合,对各子系统再进行如此划分对各子系统再进行如此划分每个模块,每个模块,在在C语言中表现为函数。语言中表现为函数。大连大学DaLian University第四章第四章 函函 数数C中函数分类:中函数分类:用户角度分:系统函数和用户函数;用户角度分:系统函数和用户函数;参数角度分:有参函数和无参函数;参数角度分:有参函数和无参函数;返回值角度分:有返回值函数和无返回返回值角度分:有返回值函数和无返回值函数。值函数。标准库函数的调用标准库函数的调用 Turbo CTurbo C中提供了中提供了300300多条标准库函数,多条标准库函
4、数,都放在函数库(都放在函数库(.lib.lib)中,函数的说明按功能)中,函数的说明按功能分类放在标题文件(分类放在标题文件(.h.h,也称头文件)中。,也称头文件)中。添加一行:添加一行:#include#include“头文件名称头文件名称”或者或者#include#include 大连大学DaLian University第四章第四章 函函 数数函数例子:函数例子:#include void PrintStar()printf(*n);void main()PrintStar();printf(Hello Everybody!n);PrintStar();使用函数组装程序好处:代码重用
5、 程序模块化 维护方便大连大学DaLian University第四章第四章 函函 数数4.2 4.2 函数的定义与调用函数的定义与调用 4.2.1 4.2.1 函数的定义函数的定义#includevoidmain(void)inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“%d”c);intmax(intx,inty)intz;z=x=y?x:y;return(z);主主函函数数函函数数体体函数的类型,返回值的类型。函数的类型,返回值的类型。函数名函数名形式参数说明表。形式参数说明表。定义!定义!调用!调用!函数头函数头大连大学DaLian U
6、niversity第四章第四章 函函 数数函数的定义函数的定义格式:格式:返回值类型返回值类型 函数名函数名(形式参数列表形式参数列表)声明部分声明部分 功能语句功能语句 返回语句返回语句 /*函数头函数头*/*函数体函数体*/(1)函数头)函数头 返回值类型返回值类型 函数名函数名 形参列表:形参列表:0个或多个,逗号分隔,给出参数名称及类型。个或多个,逗号分隔,给出参数名称及类型。(2)函数体)函数体 代码段,实现功能。一对代码段,实现功能。一对 括起来。括起来。返回语句返回语句return:有返回值:有返回值:return(表达式表达式);或;或return 表达式;返回表达式;返回无返
7、回值:可无无返回值:可无return语句,末尾的右语句,末尾的右“”作为函数的返回。作为函数的返回。大连大学DaLian University第四章第四章 函函 数数4.2.24.2.2函数的调用函数的调用1 1、函数调用形式:、函数调用形式:函数名函数名(实参列表实参列表);v单独语句形式:单独语句形式:max(a,b);printf(“fdsa”);v表达式形式:表达式形式:c=max(a,b);v作为函数参数:作为函数参数:printf(“%d”,max(a,b);1 1、函数调用形式:、函数调用形式:函数名函数名(实参列表实参列表);2 2、函数返回值:被调函数执行后返给主调函数的值。
8、、函数返回值:被调函数执行后返给主调函数的值。vreturn(表达式);或(表达式);或return表达式;表达式;v可有多条可有多条return语句,遇到一条语句,遇到一条return时,程序即返回。时,程序即返回。v函数没有返回值,可以没有函数没有返回值,可以没有return语句,利用语句,利用“”返回。返回。3 3、函数的声明:、函数的声明:调用之前,对被调函数要进行声明。如:调用之前,对被调函数要进行声明。如:intmax(intx,inty);大连大学DaLian University第四章第四章 函函 数数#include long Multiply(int,int);void m
9、ain()int num1,num2;long result;scanf(“%d%d”,&num1,&num2);printf(%ldn,Multiply(num1,num2);result=2*Multiply(2*num1,2*num2);printf(%ldn,result);long Multiply(int x,int y)long z;z=x*y;return z;【例4-2】大连大学DaLian University第四章第四章 函函 数数4.3 函数间的数据传递函数在调用时,主调函数和被调函数之间一般存在着数据的传递。传递有两种方式:值传递和地址传递将值或地址传递给被调函数;将
10、被调函数的结果返回给调用函数。主调函数被调函数向被调函数传递数据(值或地址)。将结果返回给主调用函数。大连大学DaLian University第四章第四章 函函 数数传值调用方式:传值调用方式:形参是普通变量形参是普通变量-值参值参(1)形参是普通变量:必须传同类型的数值 形参及被调函数内的变量只有在被调用时才分配内存单元,此时将实参的值初始化给相应的形参。形参与实参完全脱离了关系,形参的值不影响实参。调用结束时,形参所占据的内存单元被释放。(2)实参必须有确定的值,以便把这些值传递给形参。(3)实参与形参在数量、位序和类型上必须一致。【例例4-5】观察程序运行结果。观察程序运行结果。#in
11、cludevoidswap(int,int);voidmain(void)inta,b;a=10;b=20;printf(“调用前:调用前:na=%d,b=%dn”,a,b);swap(a,b);printf(“调用后:调用后:na=%d,b=%dn”,a,b);voidswap(intx,inty)intz;z=x;x=y;y=z;大连大学DaLian University第四章第四章 函函 数数指针变量作形参,必须传同类型的地址指针变量作形参,必须传同类型的地址(指针)数据。(指针)数据。此时在主调函数和被调函数之间可以实此时在主调函数和被调函数之间可以实现信息的现信息的“双向传递双向传递
12、”。4.3.2 4.3.2 4.3.2 4.3.2 传地址调用方式传地址调用方式传地址调用方式传地址调用方式例例4-6/*函数参数为指针变量函数参数为指针变量*/voidswap(int*x,int*y);voidmain()inta,b;a=10;b=20;printf(“调用前:调用前:na=%d,b=%dn”,a,b);swap(&a,&b);printf(“调用后:调用后:na=%d,b=%dn”,a,b);voidswap(int*x,int*y)intz;z=*x;*x=*y;*y=z;大连大学DaLian University第四章第四章 函函 数数2.2.2.2.形参为数组类型
13、,实参为数组名形参为数组类型,实参为数组名形参为数组类型,实参为数组名形参为数组类型,实参为数组名#include#include voidvoidfun(intfun(intb);b);main()main()intinta10,i;a10,i;for(ifor(i=0;i10;i+)=0;i10;i+)scanf(“%d”,&aiscanf(“%d”,&ai););fun(afun(a););for(ifor(i=0;i10;i+)=0;i10;i+)printf(“%d”,aiprintf(“%d”,ai););voidfun(voidfun(intintb)b)intint max,k
14、,imax,k,i;max=b0;max=b0;k=0;k=0;for(ifor(i=1;i10;i+)=1;imax)max=max)max=bi;kbi;k=i;=i;max=b0;b0=max=b0;b0=bk;bkbk;bk=max;=max;例例例例:编写函数,将数组中的最大值与第一个数交换。要求在编写函数,将数组中的最大值与第一个数交换。要求在编写函数,将数组中的最大值与第一个数交换。要求在编写函数,将数组中的最大值与第一个数交换。要求在mainmainmainmain()()()()中进行数据的输入输出,中进行数据的输入输出,中进行数据的输入输出,中进行数据的输入输出,大连大学D
15、aLian University第四章第四章 函函 数数【例例4-7】输入输入5个数到数组中,求这个数到数组中,求这5个数的平均个数的平均值。求平均值编写函数实现,并将该值作为返回值。值。求平均值编写函数实现,并将该值作为返回值。#include#defineN5floataver(intdata,int);voidmain(void)inti,arrayN,av;for(i=0;iN;i+)scanf(%d,&arrayi);av=aver(array,N);printf(av=%fn,av);floataver(intdata,intn)inti;floatavg=0;for(i=0;in
16、;i+)avg+=datai;avg/=n;return(avg);大连大学DaLian University第四章第四章 函函 数数【例例4-8】输入输入10个数到数组中,再输入一个数到数组中,再输入一实数,判断该数在数组中是否存在?如果实数,判断该数在数组中是否存在?如果存在,输出该数在数组中下标;如果不存存在,输出该数在数组中下标;如果不存在,输出在,输出-1。查找编写函数实现。查找编写函数实现。#includeintsearch(floata,floatx);voidmain()inti,position;floata10,x;printf(输入输入10个实数:个实数:n);for(i
17、=0;i10;i+)scanf(%f,&ai);printf(输入要找的实数:输入要找的实数:n);scanf(%f,&x);position=search(a,x);if(position=-1)printf(“没找到。没找到。n);elseprintf(“找到了。下标是找到了。下标是%d,position);intsearch(floata,floatx)intxpos=-1,i;for(i=0;i10;i+)if(ai=x)xpos=i;returnxpos;大连大学DaLian University第四章第四章 函函 数数4.4 函数的嵌套调用和递归调用函数的嵌套调用和递归调用 C中不
18、允许作嵌套的函数定义,各函数中不允许作嵌套的函数定义,各函数之间都是平等和独立的。之间都是平等和独立的。C允许在一个函数的定义中出现对另一个允许在一个函数的定义中出现对另一个函数的调用。函数的调用。【例例4-9】函数嵌套调用的例子。函数嵌套调用的例子。#includefloatfun2(floatx);floatfun1(floatx);voidmain()floata;scanf(%f,&a);printf(%f,myfun1(a);floatfun1(floatx)return2*fun2(x);floatfun2(floatx)returnx0?x:-x;大连大学DaLian Unive
19、rsity第四章第四章 函函 数数【例例4-10】使用函数的嵌套调用编程,计算使用函数的嵌套调用编程,计算S。voidmain()intN,K;scanf(%d%d,&N,&K);printf(n%.0fn,fsum(N,K);分析分析(1)求累加和编一函数)求累加和编一函数fsum();(2)累加的每一项,再编一函数)累加的每一项,再编一函数fexp()(3)循环中,进行累加时,调用)循环中,进行累加时,调用fexp()求出该项求出该项double fsum(int n,int k)double sum=0;int i;for(i=0;in;i+)sum+=fexp(i,k);return
20、sum;double fexp(int n,int k)double power=1;int i;for(i=0;ik;i+)power*=n;return power;大连大学DaLian University第四章第四章 函函 数数4.4.2 4.4.2 函数的递归调用函数的递归调用含义:一个函数在它的函数体内直接或间含义:一个函数在它的函数体内直接或间接地调用它自身称为递归调用。接地调用它自身称为递归调用。用递归法解决的问题,应该符合以下用递归法解决的问题,应该符合以下2个个条件:条件:边界问题(也称基本问题)有直接解。边界问题(也称基本问题)有直接解。原问题能够转化成一个规模较小的新问
21、题,原问题能够转化成一个规模较小的新问题,新问题的求解方法与原问题相同。新问题的求解方法与原问题相同。大连大学DaLian University第四章第四章 函函 数数【例例4-11】计算计算n!。使用递归函数实现。使用递归函数实现。long fac(int n)if(n=1)return(1);else return n*fun(n-1);void main()int n;scanf(“%d”,&n);printf(“%d”,fac(n);大连大学DaLian University第四章第四章 函函 数数【例例5-】汉诺塔问题汉诺塔问题(Hanoi)(Hanoi)问题的提出:问题的提出:相传
22、相传是是在古印度圣庙在古印度圣庙中的一种游戏。中的一种游戏。在一块铜板装置上,有三根杆在一块铜板装置上,有三根杆A A、B B、C C,在,在A A杆自下杆自下而上、由大到而上、由大到。小放置小放置6464个金盘。个金盘。游戏的目标游戏的目标:把把A A杆上的金盘全部移到杆上的金盘全部移到C C杆上,并仍保杆上,并仍保持原有顺序叠好。持原有顺序叠好。操作规则:操作规则:每次只能移动一个盘子每次只能移动一个盘子;移动过程中三根移动过程中三根杆上始终保持大盘在下,小盘在上,操作过程中盘子杆上始终保持大盘在下,小盘在上,操作过程中盘子可以置于可以置于A A、B B、C C任一杆上。任一杆上。大连大学
23、DaLian University第四章第四章 函函 数数4.5变量的作用域与存储类型变量的作用域与存储类型C程序中变量的使用规则是:先定义后使用。定义形式中:类型:表明变量占用的内存空间的大小;位置(函数内与外):表明变量在程序中的作用域。一般,还要说明其存储类型,说明变量的存储方式。不同的存储方式影响变量在内存中存在的时间。大连大学DaLian University第四章第四章 函函 数数4.5.1局部变量与全局变量局部变量与全局变量 局部变量:在函数内部或复合语句内部局部变量:在函数内部或复合语句内部定义的变量(包括函数的定义的变量(包括函数的形参形参)。)。不同函数内的局部变量之间没有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 函数
限制150内