ImageVerifierCode 换一换
格式:PPT , 页数:101 ,大小:3.06MB ,
资源ID:457602      下载积分:12 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-457602.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第6章函数.ppt)为本站会员(ga****84)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

第6章函数.ppt

1、第6章 函数,学习的意义,子模块1,子模块2,子模块n,学习的意义,功能模块1,功能模块2,功能模块n,软件项目,C语言程序,C语言函数,达积木,第6章 函数,本章要求理解模块化程序设计思想;掌握函数的定义与调用方法;掌握C语言的参数传递方式,尤其是数组参数的传递特点;掌握变量的作用域和存储方式。,本章重点函数的定义与调用参数传递变量的作用域和存储方式,本章难点参数传递变量的作用域和存储方式,第6章 函数,6.1 函数概述 6.2 函数的定义 6.3 函数调用与参数传递 6.4 函数与指针 6.5 main函数的参数 6.6 函数与变量的作用域 6.7 应用程序举例,模块化程序设计方法:人们在

2、求解某个复杂问题时,通常采用逐步分解、分而治之的方法,也就是将一个大问题分解成若干个比较容易求解的小问题,然后分别求解。程序员在设计一个复杂的应用程序时,往往也是把整个程序划分成若干个功能较为单一的程序模块,然后分别予以实现,最后再把所有的程序模块象达积木一样装配起来,这种在程序设计中分而治之的策略,被称为模块化程序设计方法。,6.1.1 程序化设计方法,6.1 函数概述,6.1 函数概述,例6-1 编写一个显示欢迎信息的程序,要求所有的信息均在一个星号组成的矩形框中显示。,程序输出如下:*Please input your name! *Xiao Qiang *Welcome to the

3、C world! *,程序代码如下:#include #include #define USERNAME XiaoQiangvoid message(char *s);/函数声明void main() char name10; message(Please input your name!);/函数调用 scanf(%s,name); if(strcmp(name,USERNAME)=0) message(Welcome to the C world!); else message(Error Username);/函数调用 ,void message(char *s) /函数定义 int n

4、,i; n=strlen(s);/求字符串S的长度 for(i=1;i=n+4;i+) printf(%c,*); printf(n); printf(* %s *n,s); for(i=1;iy?x:y; return(z); ,例 无参函数 printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); ,6.2 函数的定义,6.2 函数的定义,6.2.2 函数返回值C语言通过return语句获得函数返回值的,其格式如下:return 表达式; 或 return(表达式);,说明: 表达式的值即函数返回值,它应与所定义的函数返回值的类

5、型一致 一个函数可以有多条return语句,执行到哪一条return语句,哪一条起作用 return语句的另一作用是终止执行函数 为增加程序的可读性,建议只在函数结尾处使用一次return语句,6.2 函数的定义,6.2.3 形式参数的设计设计形式参数应从函数的功能分析入手,那个数据需要调用函数提供,这就应定义一个形式参数接收该数据 。,例6-3 编写一个函数求一个3位正整数的逆序数,如123的逆序数是321。 #include int fun(int n);/函数声明void main() int x,y; do printf( Enter a number x=?:); scanf(%d,

6、6.2 函数的定义,6.2.4 函数原型 在使用自定义函数时,除了进行函数的定义外,还需要在调用该函数之前对其进行原型声明 函数原型声明和函数定义的区别函数原型声明的作用是将函数类型告诉编译系统,使程序在编译阶段对调用函数的合法性进行全面的检查,避免函数调用时出现参数的个数或类型不一致的运行错误。函数定义部分则是函数的实际实现代码 函数原型声明的格式:类型符 函数名(形式参数);,说明:(1)函数原型声明语句最后的分号不能省略,其作用是表示该语句是进行函数声明而不是函数定义。(2)在原型声明中,形式参数名可以省略。(3)如果被调用函数的定义出现在调用函数之前,可以不对被调用函数进行原型声明。(

7、4)如果被调用函数已在所有函数定义之前进行了原型声明,则在各个调用函数中不必再对该函数进行原型声明 。,例: 函数说明举例,void main( ) float add(float,float); /函数原型声明 float a, b ,c; scanf (%f,%f, ,6.3 函数调用与参数传递,6.3.1 函数的调用方式 有参函数调用的格式:函数名(实际参数)无参函数的调用格式:函数名( ) 说明 函数总是在某个函数体中被调用 函数调用可以在结尾处加上分号,单独作为一条语句 对于有返回值的函数,其调用也可以出现在某条语句中函数的调用过程,四类函数的详细说明,1、无参数无返回值的函数,定义

8、格式,void 函数名 (void) 变量声明部分 执行部分,空类型,表明函数无返回值,不可省!,表明无参数,可缺省!,必须为合法的标识符,函数用途,此类函数用于完成某项固定的处理任务,执行完成后不向调用者返回函数值。,函数的原型声明,void 函数名( void ); 或 void 函数名( );,C规定,对函数调用前必须对其原型加以声明,否则会出现编错!,6.3 函数调用与参数传递,1、无参数无返回值的函数,函数的调用,函数名( );,注意:不能将这种函数调用赋值给任何变量,因为它没有返回值。调用时,( )中间不能有void。,实例,#include #include void showe

9、rror ( ); /声明showerror函数的原型void main ( ) int a; scanf (%d, /函数体,没有声明变量,注意:对函数调用之前,必须要先声明或先定义,否则编译错!,编写C程序的一般格式,文件包括(如include 等,用于标准库库函数原型声明)常量定义(根据需要而定,如#define PI 3.1415等)变量定义(根据需要而定)用户自定义函数原型声明main函数用户自定义函数,函数的返回,形式, rerurn (表达式); /有返回值 rerutn 表达式; /有返回值 return; /无返回值,使程序控制从被调用函数返回到调用函数中,如果有返回值,同时

10、把返值带给调用函数。,功能,说明,函数中可以有多个return语句。在无返回值的函数中,return语句的形式只能是第种形式。,例如:void showyes ( ) char key; key = getchar ( ); if (strupr(key) != Y) return; printf (YES! );,函数showyes的功能是: 如果输入的字符不是Y或y,则什么都不输出,直接返回,否则,输出YES! ,标准库函数,其功能是将小写字符转换成大写字符,2、无参数有返回值的函数,定义格式,返回值类型符 函数名 (void) 变量声明部分 执行部分,可以为除数组类型外的任何类型,缺省时

11、,默认为int型,表明无参数,可缺省!,必须为合法的标识符,函数用途,此类函数用于完成某项固定的处理任务,执行完成后向调用者返回函数值。,函数的原型声明,返回值类型符 函数名( void ); 或 返回值类型符 函数名( );,函数的调用,函数名( void ); 或 变量 = 函数名( );,2、无参数有返回值的函数,函数的返回,表达式的值即是函数的返回值; 函数体中一般都包含return(表达式)语句, 如果没有, 函数也会返回一个值。这个值是不可预知的, 将会使程序可能犯有逻辑错; 一般情况下,表达式值的类型应与函数返回值类型一致; 当return(表达式)语句中的表达式的类型与函数的返

12、回值类型不一致时,编译器将对表达式进行强制类型转换, 将表达式的值强制转换成函数返回值类型, 然后返回给调用者。,格式,rerurn (表达式); 或 rerutn 表达式;,说明,int func ( ) float f = 5; f = f / 2; return ( f );,函数将返回2,而不是2.5,注意:如果不将函数调用赋值给任何变量,它的返回值将被丢弃!,3、有参数无返回值的函数,定义格式,void 函数名 (类型符1 形参名1, 类型符2 形参名2, , 类型符n 形参名n ) 变量声明部分 执行部分,函数用途,此类型的函数主要是根据形参的值来进行某种事务的处理。灵活性上要比无

13、形参的函数强,它更能体现调用函数与被调函数之间的数据联系。,函数的原型声明,void 函数名(类型符1 形参名1, 类型符2 形参名2, , 类型符n 形参名n ); 或 void 函数名(类型符1 , 类型符2 , , 类型符n );,至少要有一项,形参之间要用逗号“,”分开,指明形参类型,不允许对形参赋初值,3、有参数无返回值的函数,函数调用,函数名( 实参1,实参2,实参n );,实参可以是常量、变量、表达式、函数等,注意事项: (1) 实参列表中的实参必须与函数定义时的形参数量相同、类型相符。 (2) 赋值对应关系: 实参1 - 形参1 实参2 - 形参2 实参n - 形参n (3)实

14、参表求值顺序(即实参赋值给形参的顺序) 因系统而定。TC、BC、VC均是自右向左,也就是说最右边的实参最先赋值给最右边的形参, 最左边的实参最后赋值给最左边的形参。但VC与TC、BC在具体赋值时稍有不同,注意它们之间的区别。,3、有参数无返回值的函数,#include void compare (int a, int b); void main ( ) int i = 2,j=3; compare ( i, j ); printf (i = %d,j=%dn, i,j);void compare ( int a, int b ) printf (a = %d b = %dn, a, b); i

15、f ( a b) printf (a bn); else if (a = b) printf (a = bn); else printf (a bn);,i,j为实参,a、b为形参,原型声明,3,2,2,4、有参数有返回值的函数,定义格式,返回值类型符 函数名 (类型符1 形参名1, , 类型符n 形参名n ) 变量声明部分 执行部分,函数用途,此类型的函数主要是根据形参的值来进行某种事务的处理,同时可将处理后的结果值返回给调用函数 。它最能体现调用函数与被调函数之间的数据联系。,函数的原型声明,返回值类型符 函数名(类型符1 形参名1, , 类型符n 形参名n ); 或 返回值类型符 函数名

16、(类型符1 , 类型符2 , , 类型符n );,4、有参数有返回值的函数,函数调用,函数名( 实参1,实参2,实参n ); 或变量名 = 函数名( 实参1,实参2,实参n );,#include int max (in t a, int b); /函数的原型声明void main ( ) int a, b, c; scanf (%d%d, ,运行结果:5 9the biggest number is 9,函数调用和函数说明小结,函数调用,函数语句: 例:printstar ( ); printf (“Hello,World!n”); 函数表达式: 例: m = max (a, b) * 2;

17、 函数参数: 例: printf (“%d”, max(a,b); m = max (a, max(b,c);,6.3 函数调用与参数传递,函数说明 对被调用函数要求:必须是已存在的函数库函数: #include 用户自定义函数: 函数类型说明 函数说明一般形式: 函数类型 函数名(形参类型 形参名,. ); 或 函数类型 函数名( );作用:告诉编译系统函数类型、参数个数及类型,以便检验函数定义与函数说明不同函数说明位置:程序的数据说明部分(函数内或外)下列情况下,可不作函数说明 若函数返值是char或int型,系统自动按int型处理 被调用函数定义出现在主调函数之前有些系统(如BC、VC)

18、要求函数说明指出函数返值类型和形参类型,并且对void 和 int 型函数也要进行函数说明,6.3 函数调用与参数传递,6.3.2 参数传递 参数是函数调用进行信息交互的载体,分形参和实参。形式参数又称为形参或虚参:定义函数时,写入函数圆括号内的参数。事实上,形参是一种局部变量,它在函数被调用前并没有被分配存储空间,也没有具体的值。形参仅仅是一个“符号”。 实际参数又称为实参:调用函数时,写入函数圆括号内的参数,可以是常量、变量或表达式,它有具体的值。对于实参变量而言,它已经被分配了相应的存储空间。,函数之间参数的传递:调用有参函数,系统根据形参的类型为其分配存储空间,其内容为形参的值。调用时

19、应该提供与形参匹配的实参,匹配个数和类型。,例: 交换两个数(值传递方式),#include void swap (int a, int b); void main ( ) int x = 7, y = 11; printf (before swapped: ); printf (x=%d, y=%dn, x, y); swap (x, y); printf (after swapped: ); printf (x=%d, y=%dn, x, y);void swap (int a, int b) int temp; temp = a; a = b; b = temp;,运行结果:before

20、 swapped: x = 7, y = 11after swapped: x = 7, y = 11,7,11,7,Why?,#include void swap (int a, int b); void main ( ) int x = 7, y = 11; printf (before swapped: ); printf (x=%d, y=%dn, x, y); swap (,运行结果:before swapped: x = 7, y = 11after swapped: x = 11, y =7,6.3.3 指针变量作参数(仍为值传递), swap, swap, swap, swap

21、, swap,6.3 函数调用与参数传递,注意:不能试图通过调用以下函数来交换实参变量的值。程序代码如下:void swap(int *a,int *b) int *t; t=a; a=b; b=t; ,1、值传递方式,方式: 函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值。 特点: 形参与实参占用不同的内存单元 单向传递 这种参数传递过程被形象的称为“虚实结合”。,6.3 函数调用与参数传递,C语言中的参数传递是一种单向的“值传递”。,6.3 函数调用与参数传递,6.3.4 数组参数 当程序中需要处理一批相关数据时,往往用数组。若要实

22、现函数功能时需要获取一批相关数据作为原始信息,这个时候就可以考虑用数组参数。本节主要讨论的是数组整体作为参数传递。单个数组元素作为实参仍然为值传递,值传递,main( ) float fun(float a,float b,float c); float a3=1,2,3; float ave=0; ave=fun(a0,a1,a2); float fun(float a,float b,float c) float sum,aver; sum=a+b+c; aver=sum/3.0; return(aver);,求三个数的平均值:,数组元素作为参数,程序的运行:,fun( ),main( )

23、,执行函数体,返回函数值释放相应空间,数组元素a0 , a1,a2作实参,6.3 函数调用与参数传递,6.3 函数调用与参数传递,一维数组参数(与值传递方式不同) 例6-7 定义一个函数max_value用于返回一个10个元素组成的一维整型数组中的最大值。,程序代码如下:#include #include #include int max_value(int a);/函数原型声明void main() int x10,i; printf(Array:); srand(time(NULL);/初始化随机数发生器 for(i=0;it)t=ai; return(t); ,6.3 函数调用与参数传递

24、,一维数组参数数组参数传递 传递数组的首地址 通常情况下,数组做函数参数,需要再定义一个整型形参,用于传递数组元素个数的信息。,#include main( ) float fun2(float x3); float a3=87.5,90,100; float ave=0; ave=fun2(a); float fun2(float x3) float sum,aver; sum=x0+x1+x2; aver=sum/3.0; return(aver);,求三个数的平均值:,数组名作为函数参数,程序的运行:,fun2( ),main( ),执行函数体,返回函数值释放相应空间,传地址,形参与实参

25、共用地址空间,x,地址传递,地址传递,#include main( ) void swap(int x2); int a2=4,9; swap(a); printf(“%d,%dn”,a0,a1); void swap(int x2) int t; t=x0; x0=x1; x1=t;,两个数交换数值:,地址传递使形参与实参共用地址空间,形参值改变,则实参值也改变,执行函数体,返回函数值释放相应空间,传地址,程序的运行:,swap( ),main( ),x,实参数组必须指定长度,形参数组则不必。 形参数组并没有另外分配空间,而是共享实参数组的数据。 使用形参数组时不要超过实参数组的长度。,长度

26、2可省,2、地址传递方式,定义形式:类型名 形参数组名 方式: 函数调用时,将数据的存储地址(同类型数组名称)作为参数传递给形参 特点: 形参与实参占用同样的存储单元 双向传递 实参和形参必须是地址常量或变量,用数组名作为函数参数时还应注意以下几点: 形参数组和实参数组的类型必须一致,否则将引起错误。 形参数组和实参数组的长度可以不相同,因为在调用时,只传送首地址而不检查形参数组的长度。 多维数组也可以作为函数的参数。在函数定义时对形参数组可以指定每一维的长度,也可省去第一维的长度。,判断以下定义形式哪些是正确的?int max(int x3) int max(int x) int max(x

27、3) int max(int x),6.3 函数调用与参数传递,例6-8编写一个实现一维数组排序的函数。 程序代码如下: #include #include #include void sort(int a,int n);/函数原型声明void main() int x10,i; srand(time(NULL); printf(Before sorting:n); for(i=0;i10;i+) xi=rand()%90+10; printf(%3d,xi); sort(x,10);/函数调用 printf(nAfter sorting:n); for(i=0;i10;i+) printf(

28、%3d,xi);,6.3 函数调用与参数传递,void sort(int a,int n)/排序函数 int i,j,k,t; for(i=0;iaj)k=j; if(k!=i) t=ai; ai=ak; ak=t; ,6.3 函数调用与参数传递,多维数组参数 多维形参数组的定义形式为:类型名 形参数组名数值数值,即除了最左边的方括号可能留空外,其余都要填写数值。调用使用多维数组参数的函数时,与形参数组对应的实参是一个同类型的数组名,也不需要加上任何方括号。例6-10 编写一个函数用于查找并返回34的矩阵中的最大元素。程序代码如下:#include #include #include int

29、max_value(int a4,int n, int *row, int *col);void main() int x34; int m,i,j,r,c; srand(time(NULL); for(i=0;i3;i+) for(j=0;j y ? x : y; return (r z ? r : z); int min (int x, int y, int z) int r; r = x y ? x : y; return (r z ? r : z); ,main( ),调用函数dif,输出结束,dif函数,max函数,调用函数max,调用函数min,min函数,6.3 函数调用与参数传

30、递,例6-11 编写一个小学四则运算练习程序,程序可根据用户的选择随机生成加、减、乘、除练习题目,并分析运算结果是否正确。 程序代码如下:#include #include #include void exam(int n);void add(void);void sub(void);void mul(void);void division(void);,6.3 函数调用与参数传递,void main() int n; while(1) printf(*n); printf(*1-ADD *n); printf(*2-SUB *n); printf(*3-MUL *n); printf(*4-

31、DIV *n); printf(*0-EXIT*n); printf(*n); printf(Please select 0-4:); scanf(%d, ,6.3 函数调用与参数传递,void exam(int n) switch(n) case 1:add(); break; case 2:sub(); break; case 3:mul(); break; case 4:division(); ,6.3 函数调用与参数传递,void add(void)/求两随机整数之和 int x,y,z,result; srand(time(NULL);/初始化系统随机数发生器 x=rand()%10

32、0;/产生099的随机整数 y=rand()%100; z=x+y; printf(%d+%d=,x,y); scanf(%d,6.3 函数调用与参数传递,void sub(void)/求两随机整数之差 int x,y,z,result; srand(time(NULL); x=rand()%100; y=rand()%100; z=x-y; printf(%d-%d=,x,y); scanf(%d,6.3 函数调用与参数传递,void mul(void)/求两随机整数之乘积 int x,y,z,result; srand(time(NULL); x=rand()%100; y=rand()%

33、100; z=x*y; printf(%d*%d=,x,y); scanf(%d,6.3 函数调用与参数传递,void division(void)/求两随机整数之商 int x,y,z,result; srand(time(NULL); do/产生两随机整数使得x能被y整除 x=rand()%100; y=rand()%100; while(x%y!=0|y=0); z=x/y; printf(%d/%d=,x,y); scanf(%d,6.3 函数调用与参数传递,2、函数递归调用 定义:函数直接或间接的调用自身叫函数的递归调用,说明,int f (int x) int y, z; z =

34、f (y); . return (2*z);,直接递归,间接递归,C编译系统对递归函数的自调用次数没有限制递归调用应注意的问题: 要防止无限次的递归调用。防止无限递归调用的方法:使用 if 语句设置一个递归过程结束的条件,且在递归过程中使该条件逐步趋于成立,【例1】递归的执行情况分析,递归过程及其实现 递归:函数直接或间接的调用自身叫递归 实现:建立递归工作栈,运行结果:1,2,2,3,3,3,,#include void print (int w);void main ( ) print ( 3 ); void print (int w) /递归函数 int i; if ( w != 0)

35、/递归结束条件 print (w-1); for (i = 1; i = w; +i) printf (%d , w); printf (n); ,递归调用执行情况如下:,void print (int w) /递归函数 int i; if ( w != 0) /递归结束条件 print (w-1); for (i = 1; i = w; +i) printf (%d , w); printf (n); ,void main ( ) print ( 3 ); ,【例2】求n的阶乘n!,long factn (int n) long L = 1; int i; for (i = 1; i = n

36、; i+) L *= i; return ( L );,方法一:利用循环 因为n! = n * (n-1) * (n-2) * * 2 * 1,我们完全可以用循环语句来编写这个非递归函数factn:,long factn (int n) long L; if (n = 1) return (1); L = n * fact (n-1); return (L); ,void main ( ) L = factn(4); ,递归调用执行情况如下:,long factn(4) long L; L = 4*factn(3); return (L);,long factn(3) long L; L =

37、3*factn(2); return (L);,long factn(2) long L; L = 2*factn(1); return (L);,long factn(1) long L; return (1);,6.3 函数调用与参数传递,总结函数递归调用:递归条件: (1)原有的问题能够分解为一个新问题,而新问题又用到了原有的解法,这就出现了递归。递归公式。 (2)按照这个原则分解下去,每次出现的新问题是原有问题的简化的子问题 (3)最终分解出来的新问题是一个已知解的问题。递归结束条件递归调用过程(两个阶段) (1)递推阶段:将原问题不断地分解为新的子问题,逐渐从未知的向已知的方向推测,最终达到已知的条件,即递归结束条件,这时递推阶段结束。 (2)回归阶段:从已知条件出发,按照“递推”的逆过程,逐一求值回归,最终到达“递推”的开始处,结束回归阶段,完成递归调用。,

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。