欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第8章 函数-精品文档.ppt

    • 资源ID:27076020       资源大小:936KB        全文页数:83页
    • 资源格式: PPT        下载积分:10.8金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要10.8金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第8章 函数-精品文档.ppt

    第8章 函数 C语言程序设计 第八章第八章 函数函数概述函数定义的一般形式函数参数和函数的值函数的调用函数的嵌套调用函数的递归调用数组作为函数参数局部变量和全局变量变量的存储类别内部函数和外部函数运行一个多文件的程序本章学习目标:本章学习目标: C语言程序设计 第八章第八章 函数函数认识到函数是一种简化程序结构的重要手段;认识到函数是一种简化程序结构的重要手段;理解函数调用和函数调用过程中的参数传递;理解函数调用和函数调用过程中的参数传递;理解函数原型理解函数原型(声明声明)和怎样写函数原型;和怎样写函数原型;能够用前几章的知识实现简单的函数;能够用前几章的知识实现简单的函数;能够用能够用return语句实现函数的返回值;语句实现函数的返回值;能够理解函数调用过程中形式参数和实际参数的能够理解函数调用过程中形式参数和实际参数的关系,理解数组名作为函数参数时代表的意义;关系,理解数组名作为函数参数时代表的意义;能够理解函数的嵌套调用和递归调用机制能够理解函数的嵌套调用和递归调用机制 。8.1 概述概述函数的概念函数的概念 C语言程序设计 第八章第八章 函数函数一个大的程序一般应分为若干个程序模块,每个模块实现一个特一个大的程序一般应分为若干个程序模块,每个模块实现一个特定的功能,这些模块称为子程序,在定的功能,这些模块称为子程序,在C C语言中子程序用函数实现。语言中子程序用函数实现。mainabca1abb1b2不能被调用不能被调用所有函数都是所有函数都是平行的,不能平行的,不能嵌套定义嵌套定义分为分为:库函数和库函数和自定义函数自定义函数 C语言程序设计 第八章第八章 函数函数举例:用常规、工程和文件包含三种方法打印字符串举例:用常规、工程和文件包含三种方法打印字符串 一、常规方法:一、常规方法:各函数包含在一个文件中各函数包含在一个文件中例例T8-1.c #include void main( ) void printstar( ); void print_message( ); printstar( ); print_message( ); printstar( ); void printstar( ) printf (“* n” ); void print_message( ) printf (“_ _ _ _ _How_do_you_do!n”) ;运行结果:运行结果: * How do you do! * * C语言程序设计 第八章第八章 函数函数二、工程的方法二、工程的方法 例:某程序由四个文件组成,其中,一个文件包含主函数,两例:某程序由四个文件组成,其中,一个文件包含主函数,两个文件包含两个被调用函数。一个为工程文件,包含这个程序个文件包含两个被调用函数。一个为工程文件,包含这个程序的三个文件名。的三个文件名。 操作:操作:Alt+p Project name :T8-1-4.prj Alt +R 结果同上结果同上T8-1-1.c main( ) p1( ) ; p2( ) ; p1( ) ; T8-1-2.c p1( ) printf (“* n”); T8-1-3.c p2( ) printf (“ How do you do! n”); T8-1-4.prj T8-1-1T8-1-2T8-1-3 C语言程序设计 第八章第八章 函数函数三、文件包含的方法三、文件包含的方法 在主函数中使用文件包含预编译命令,将不在本文件在主函数中使用文件包含预编译命令,将不在本文件而在其它文件中的函数进行预编译处理把各文件中的函数而在其它文件中的函数进行预编译处理把各文件中的函数包含到本文件中来,然后一起进行编译、连接、运行。包含到本文件中来,然后一起进行编译、连接、运行。 T8-1-5.c #include “T8-1-2.c”#include “T8-1-3.c”main( ) p1( ); p2( ) ; p1( ) ; 运行结果同上运行结果同上几点说明:几点说明:(1)(1)一个源文件由一个或者多个函数组成。一个源文件由一个或者多个函数组成。(2)(2)一个一个C C程序由一个或者多个源文件组成。程序由一个或者多个源文件组成。(3)C(3)C程序的执行从程序的执行从main main 函数开始。函数开始。(4)(4)所有的函数都是平行的。所有的函数都是平行的。(5)(5)从用户的角度看,函数分库函数和自定义函数。从用户的角度看,函数分库函数和自定义函数。(6)(6)函数形式:函数形式:主调函数无数据传送给被调函数主调函数无数据传送给被调函数,可带或不带返回值。可带或不带返回值。主调函数与被调函数间有参数传递主调函数与被调函数间有参数传递,主调函数可将实参主调函数可将实参传送给被调函数的形参传送给被调函数的形参, 被调函数的数据可返回主调函数。被调函数的数据可返回主调函数。 C语言程序设计 第八章第八章 函数函数根据根据(1)(2)(3)可知,逻辑上一个可知,逻辑上一个C语言程序是由函数构语言程序是由函数构成的,成的,C语言程序从主函数开始执行,在主函数中调用其他语言程序从主函数开始执行,在主函数中调用其他函数,这些函数可能又调用别的函数,主函数执行完毕代函数,这些函数可能又调用别的函数,主函数执行完毕代表整个程序结束。而物理上一个程序由一个或者若干个文表整个程序结束。而物理上一个程序由一个或者若干个文件件(源文件源文件)构成,函数分别放置在这些文件中。构成,函数分别放置在这些文件中。8.2 函数定义的一般形式函数定义的一般形式无参函数的定义形式无参函数的定义形式v类型标识符:类型标识符:l用于指定函数带回的值的类型,不写时为用于指定函数带回的值的类型,不写时为int型。型。l不带回值时可以不写。不带回值时可以不写。 C语言程序设计 第八章第八章 函数函数类型标识符类型标识符 函数名函数名()() 说明部分说明部分 语句语句例例 无参函数无参函数 printstar( ) printf(“*n”); 或或 printstar(void ) printf(“*n”); 有参函数定义的一般形式有参函数定义的一般形式 C语言程序设计 第八章第八章 函数函数类型标识符类型标识符 函数名函数名(形式参数表列形式参数表列) 说明部分说明部分 语句语句现代风格现代风格: :例例 有参函数(现代风格)有参函数(现代风格) int max(int x,int y) int z; z=xy?x:y; return(z); 例例 有参函数(现代风格)有参函数(现代风格) int max(int x, y) int z; z=xy?x:y; return(z); 空函数空函数v为扩充功能预留,在主调函数中先占一个位置。为扩充功能预留,在主调函数中先占一个位置。 C语言程序设计 第八章第八章 函数函数类型标识符类型标识符 函数名函数名()() 例例 空函数空函数 dummy( ) 对形参的声明的传统方式对形参的声明的传统方式v即把对形参的声明放在函数定义的下一行即把对形参的声明放在函数定义的下一行类型标识符类型标识符 函数名(形参表)函数名(形参表)形参类型说明形参类型说明 说明部分说明部分 语句语句例例 有参函数(传统风格)有参函数(传统风格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); 8.3 函数参数和函数的值函数参数和函数的值形式参数和实际参数形式参数和实际参数v形式参数:定义函数时函数名后面括号中的变量名形式参数:定义函数时函数名后面括号中的变量名v实际参数:调用函数时函数名后面括号中的表达式实际参数:调用函数时函数名后面括号中的表达式 C语言程序设计 第八章第八章 函数函数例例8.2比较两个数并输出大者比较两个数并输出大者#include void main() int max(int x,int y); int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);max(int x, int y) int z; z=xy?x:y; return(z);形参形参实参实参c=max(a,b);(main 函数)函数)(max 函数)函数)max(int x, int y) int z; z=xy?x:y; return(z); 运行:运行:7,8 Max is 8v几点说明:几点说明:l实参可以是常量、变量或表达式。必须有确定的值。实参可以是常量、变量或表达式。必须有确定的值。当函数调用时,将实参的值传递给形参,若是数组名,当函数调用时,将实参的值传递给形参,若是数组名,则传送的是数组的首地址。则传送的是数组的首地址。 l形参必须指定类型形参必须指定类型l形参与实参形参与实参类型一致,个数相同,顺序相同。类型一致,个数相同,顺序相同。l若形参与实参类型不一致,自动按形参类型转换若形参与实参类型不一致,自动按形参类型转换函数调用转换函数调用转换l形参在函数被调用前不占内存形参在函数被调用前不占内存;函数调用时为形参分配函数调用时为形参分配内存;调用结束,内存释放内存;调用结束,内存释放l实参对形参的数据传送是值传送,也是单向传送,当实参对形参的数据传送是值传送,也是单向传送,当被调函数的形参发生变化时,并不改变主调函数实参被调函数的形参发生变化时,并不改变主调函数实参的值。的值。形、实参占据的是不同的存储单元形、实参占据的是不同的存储单元 C语言程序设计 第八章第八章 函数函数 C语言程序设计 第八章第八章 函数函数例:例:形、实参占据的是不同的存储单元形、实参占据的是不同的存储单元#include void main( ) int a=2,b=3; printf (“a=%d, b=%d n”,a, b); printf(“&a=%x,&b=%xn” ,&a,&b); add(a,b); printf(“a=%d,b=%dn”, a,b); printf(“&a=%x,&b=%xn”, &a,&b); add(int x,int y) x=x+8; y=y+12; printf(“x=%d,y=%d n”,x,y); printf(“&x=%x,&y=%xn”,&x,&y); 2+8=103+12=1523ffd2ffd4ffd6ffd8xayb运行结果:运行结果: a=2,b=3&a=ffd6,&b=ffd8 x=10,y=15 &x=ffd2,&y=ffd4a=2, b=3&a=ffd6,&b=ffd8函数的返回值函数的返回值v返回语句形式:返回语句形式: return(表达式表达式);或或 return 表达式表达式; v功能:使程序控制从被调用函数返回到调用函数中,功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数同时把返值带给调用函数v说明:说明:l函数的返回值,必须用函数的返回值,必须用 return 语句带回。语句带回。lreturn 语句只能把一个返值传递给调用函数。语句只能把一个返值传递给调用函数。l函数中可有多个函数中可有多个return语句,语句,执行哪一个由程序执行情况来定。执行哪一个由程序执行情况来定。 if(ab) return(a); else return(b); lreturn 后的值可以是一个表达式,如:后的值可以是一个表达式,如:return(x y ? x : y);l返回值的类型为定义的函数类型,不指定的按整型处理。返回值的类型为定义的函数类型,不指定的按整型处理。如:如: int max(int x, int y) float min(float a,float b) double abc(float d1,float d2) C语言程序设计 第八章第八章 函数函数l若若 return 语句中表达式类型与函数类型不一致,则转语句中表达式类型与函数类型不一致,则转换为函数类型。换为函数类型。l若无若无return语句,遇语句,遇时,自动返回调用函数。时,自动返回调用函数。可能返可能返回一个不确定或无用的值回一个不确定或无用的值 。l无返回值的函数,定义为无返回值的函数,定义为 void 类型。类型。 C语言程序设计 第八章第八章 函数函数 printstar() printf(*);main() int a; a=printstar(); printf(%d,a);例:例:无无return语句,语句,函数带回不确定值函数带回不确定值输出:输出:10void printstar() printf(*);main() int a; a=printstar(); printf(%d,a);编译错误!编译错误! C语言程序设计 第八章第八章 函数函数 void swap(int x,int y ) int temp; temp=x; x=y; y=temp; 例:无返回值函数例:无返回值函数例例8.3: 函数返回值类型转换函数返回值类型转换#include void main() int max(float x,float y); float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);输入:输入:1.5,2.5输出:输出:Max is 28.4 函数的调用函数的调用主调函数:主调函数:主动去调用其它函数主动去调用其它函数 被调函数:被其它函数所调用被调函数:被其它函数所调用函数调用的一般形式函数调用的一般形式函数名(实参表列)函数名(实参表列)v说明:说明:l实参表列:有确定值的数据或表达式实参表列:有确定值的数据或表达式l实参与形参实参与形参个数相等,类型一致,按顺序一一对应,个数相等,类型一致,按顺序一一对应,当有多个实参时,实参间用当有多个实参时,实参间用“ ,”分隔分隔l实参表求值顺序,因系统而定(实参表求值顺序,因系统而定(Turbo C 自右向左自右向左)l调用无参函数时,实参表列为空,但调用无参函数时,实参表列为空,但( )不能省不能省 C语言程序设计 第八章第八章 函数函数 C语言程序设计 第八章第八章 函数函数#include void main() int f(int a,int b); int i=2,p; p=f(i,+i); printf(%d,p);int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);例例8.4 参数求值顺序参数求值顺序按自右向左求值按自右向左求值函数调用等于函数调用等于f(3,3)运行结果:运行结果:0按自左向右求值按自左向右求值函数调用等于函数调用等于f(2,3)运行结果:运行结果:- 1为使程序有通用性:为使程序有通用性:Printf(“%d,%d”,i,i+); /*同样存在此情况同样存在此情况*/函数调用的方式函数调用的方式按函数在程序中出现的位置,有三种调用方式:按函数在程序中出现的位置,有三种调用方式:v函数语句:函数语句:以独立的语句去调用函数。以独立的语句去调用函数。 例例 printstar(); printf(“Hello,World!n”);v函数表达式:函数表达式: 函数返回一个确定值,以参加表达式的运算。函数返回一个确定值,以参加表达式的运算。例例 m=max(a,b)*2;v函数参数:函数参数:函数调用作为另一个函数的参数。函数调用作为另一个函数的参数。 例例 printf(“%d”,max(a,b); /*输出大数输出大数*/ m=max(a,max(b,c); /*三数比大小三数比大小*/ C语言程序设计 第八章第八章 函数函数对被调用函数的声明和函数原型对被调用函数的声明和函数原型v对被调用函数要求:对被调用函数要求:l必须是必须是已存在已存在的函数的函数l库函数库函数: #include l用户自定义函数:用户自定义函数:在主调函数中对被调函数作声明。在主调函数中对被调函数作声明。v函数声明函数声明l一般形式:一般形式:函数类型函数类型 函数名函数名(形参类型形参类型 形参名形参名,. ); 或或 函数类型函数类型 函数名函数名();l作用:告诉编译系统作用:告诉编译系统函数类型、参数个数及类型,以便检验函数类型、参数个数及类型,以便检验lC语言中函数声明称为语言中函数声明称为函数原型函数原型。l函数定义函数定义与与函数声明函数声明不同,声明只与函数定义的第一行相同。不同,声明只与函数定义的第一行相同。声明可以不写声明可以不写形参名形参名,只写,只写形参类型形参类型。l函数说明位置:函数说明位置:程序的数据说明部分(函数内或外)程序的数据说明部分(函数内或外) C语言程序设计 第八章第八章 函数函数 C语言程序设计 第八章第八章 函数函数#include void main() float add(float x,float y ); /*对被调用函数的声明对被调用函数的声明*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) /*函数首部函数首部*/ float z; /*函数体函数体 z=x+y; return(z); float add(float,float);例例8.5 对被调用的函数作声明对被调用的函数作声明输入:输入:3.6 ,6.5输出:输出:sum is 10.100000v说明:说明:l旧版本旧版本C中函数声明不采用函数原型,只声明中函数声明不采用函数原型,只声明函数名函数名和和函数类型函数类型。如:。如: float add( )l函数调用之前,如果未对函数作声明,则编译系统把函数调用之前,如果未对函数作声明,则编译系统把第一次遇到的函数形式作为函数声明,并默认为第一次遇到的函数形式作为函数声明,并默认为int型。型。即:函数类型是即:函数类型是int型型可以不作函数声明,可以不作函数声明,最好作声明最好作声明。l被调用函数的定义(程序)在主调函数之前,可以不被调用函数的定义(程序)在主调函数之前,可以不加函数声明。加函数声明。l在所有函数定义前,已在函数外部做了函数声明,则在所有函数定义前,已在函数外部做了函数声明,则在各主调函数中可以不加函数声明。在各主调函数中可以不加函数声明。 C语言程序设计 第八章第八章 函数函数#include float add(float x, float y) float z; z=x+y; return(z);main() float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);void main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);char letter(char,char);float f(float,float);int I(float,float);main()char letter(char c1,char c2)float f(float x,float y)Int I(float j,float k) C语言程序设计 第八章第八章 函数函数main()调调fun()结束结束fun()返回返回保存:保存:返回地址返回地址当前现场当前现场恢复:恢复:主调程序现场主调程序现场返回地址返回地址函数调用的执行过程函数调用的执行过程8.5 函数的嵌套调用函数的嵌套调用 C语言程序设计 第八章第八章 函数函数 不允许嵌套定义不允许嵌套定义,函数间的关系是平行的、独立的。,函数间的关系是平行的、独立的。 C中的函数:中的函数: 允许嵌套调用允许嵌套调用,即在调用某函数过程中又调用另一函数。,即在调用某函数过程中又调用另一函数。main( )调用函数调用函数a结束结束a函数函数b函数函数调用函数调用函数b C语言程序设计 第八章第八章 函数函数#include int fun1(int x,int y);void main(void) int a,b; scanf(“%d%d”,&a,&b); printf(“The result is:%dn”,fun1(a,b) );int fun1(int x,int y) int fun2(int m); return ( fun2(x)+fun2(y) );int fun2(int m) return (m*m);例例 输入两个整数,求平方和输入两个整数,求平方和输入:输入: 3 4输出:输出: The result is: 25 C语言程序设计 第八章第八章 函数函数#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d);例例 求三个数中最大数和最小数的差值求三个数中最大数和最小数的差值int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z);int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z);main( )调用函数调用函数dif输出输出结束结束dif函数函数max函数函数调用函数调用函数max调用函数调用函数minmin函数函数 C语言程序设计 第八章第八章 函数函数例例8.6 用弦截法求方程用弦截法求方程 的根的根08016523xxxyxf(x)0 x1x2xf(x1)f(x2)1. 取取x1,x2两点,求得两点,求得f(x1), f(x2) 。 异号:异号:x1,x2之间必有一根。之间必有一根。 同号:改变同号:改变x1, x2,直到,直到f(x1), f(x2)异号为止。异号为止。 )()()()(121221xfxfxfxxfxx2. 连连f(x1),f(x2)两点(弦)交两点(弦)交x轴于轴于x。 X点的坐标求法:点的坐标求法: 求求X点的点的x坐标坐标 从从x值得值得f(x)3. 若若f(x)与与f(x1)同号,同号, 则根必在(则根必在(x,x2)区间,此时将区间,此时将x1=x; 若若f(x)与与f(x2)同号,同号, 则根必在(则根必在(x1,x)区间,此时将区间,此时将x2=x;4. 重复步骤重复步骤2和和3 ,直到,直到| f(x) | 为止为止, 设设 10-6 , 则则 f(x)0用三个函数实现各部分的功能用三个函数实现各部分的功能: 函数函数f(x): 求求x的函数的函数:x3 - 5x2 +16x-80 函数函数xpoint(x1,x2): 求弦与求弦与x轴交点轴交点X的的x坐标坐标 函数函数root(x1, x2) : 求求(x1, x2)区间的实根区间的实根 C语言程序设计 第八章第八章 函数函数 求求弦与弦与x轴的交点轴的交点x输入输入x1,x2,求求f(x1),f(x2)直到直到f(x1)与与f(x2)异号异号y=f(x),y1=f(x1)y与与y1同号同号真真假假x1=xy1=yx2=x直到直到 |y| root=x 输出输出 rootroot函数函数main( )调用函数调用函数root输出根输出根 x结束结束root函数函数xpoint函数函数调用函数调用函数xpoint调用函数调用函数ff函数函数 C语言程序设计 第八章第八章 函数函数#include #include float f(float x) float y; y=(x-5.0)*x+16.0)*x-80.0; return(y); float xpoint(float x1, float x2) float y; y=(x1*f(x2)-x2*f(x1)/(f(x2)-f(x1); return(y);float root(float x1,float x2) float x, y, y1; y1=f(x1); do x=xpoint(x1, x2);y=f(x); if(y*y1 0) y1=y;x1=x; else x2=x; while(fabs(y) =0.0001); return(x); void main( ) float x1, x2, f1, f2, x; do printf(“input x1, x2: n”); scanf(“%f%f”,&x1,&x2); f1=f(x1); f2=f(x2); while(f1*f2 =0); x=root(x1, x2); printf(“A root of equation is %8.4f n”,x);运行情况:运行情况:Input x1,x2:2,6 A root of equation is 5.00008.6 函数的递归调用函数的递归调用递归:递归:在函数调用过程中,直接或间接的调用自身。在函数调用过程中,直接或间接的调用自身。递归调用方式递归调用方式v直接递归调用:直接递归调用:在函数体内又调用自身在函数体内又调用自身 C语言程序设计 第八章第八章 函数函数f( )调调fint f(int x) int y,z; z=f(y); . return(2*z);v间接递归调用:间接递归调用:当函数当函数1去调用另一函数去调用另一函数2时时,而而另一函数另一函数2反过来又调用函数反过来又调用函数1自身。自身。 C语言程序设计 第八章第八章 函数函数调调f2调调f1f1( )f2( )int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1(a); . return(3+c);v解决无终止递归调用的方法是:确定好结束递解决无终止递归调用的方法是:确定好结束递归的条件。归的条件。 条件成立,进行递归条件成立,进行递归 用用if语句控制语句控制 条件不成立,结束递归条件不成立,结束递归 C语言程序设计 第八章第八章 函数函数例例8.7 有有5个人,第个人,第5个人比第个人比第4个人大个人大2岁,第岁,第4个人比第个人比第3个人大个人大2岁,岁,第第2个人比第个人比第1个人大个人大2岁,第岁,第1个人个人10岁,问第岁,问第5个人多大?个人多大? age(5) age(4) age(3) age(2) age(1) =2+age(4) =2+age(3) =2+age(2) =2+age(1) =10=18 =16 =14 =12 10 n=1数学模型:数学模型:age(n)= age(n-1)+2 n1age(int n) int c; if(n=1) c=10; else c=2+age(n-1); return(c); #include void main( ) printf(“%d n”, age(5);运行结果:运行结果:18有些问题,可以用递推,也可以用递归的方法解决。有些问题,可以用递推,也可以用递归的方法解决。v递推递推:从一个已知的事实出发从一个已知的事实出发,按一定规律推出下按一定规律推出下一个事实一个事实,再从已知的新的事实再从已知的新的事实,推出下一个新的推出下一个新的事实事实. C语言程序设计 第八章第八章 函数函数例例 用递推法求用递推法求n! ,即从即从1开始开始, 乘乘2, 乘乘3.一直到一直到n #include void main( ) int i, s=1; for(i=1;i=5;i+) s=s* i; printf(“s=%d n”,s); 运行结果:运行结果:s=120v递归递归:在函数调用自身时在函数调用自身时,要给出结束递归的条件要给出结束递归的条件。l先回推再递推先回推再递推l如:如:n!,!, 5!=5 4! 4!=4 3! 3!=3 2! 2!=2 1! 1!=1 0!=1 C语言程序设计 第八章第八章 函数函数 1 (n=0,1) n!= n*(n-1)! (n1)#include void main() float fac(int n); int n; float y; printf(Input a integer number:); scanf(%d,&n); y=fac(n); printf(%d! =%15d,n,y);float fac(int n) float f; if(n0) printf(n0,data error!); else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f);运行:运行:input a integer number:1010! = 3628800例例8.8 用递归方法求用递归方法求n! C语言程序设计 第八章第八章 函数函数例例8.9 Hanoi(汉诺)塔问题(汉诺)塔问题 BCAv方法与步骤方法与步骤l将将A上上n-1个盘子借助个盘子借助C移到移到B 。l把把A上剩下一个盘子送到上剩下一个盘子送到Cl将将n-1个盘子从个盘子从B借助借助A移到移到C C语言程序设计 第八章第八章 函数函数BCAv简化实例:简化实例:将将A上上3个盘子移到个盘子移到C步骤:步骤:1. A上两个盘子借助上两个盘子借助C移到移到B 2. A上最后一个盘子移到上最后一个盘子移到C (可直接完成)(可直接完成) 3. B上两个盘子借助上两个盘子借助A移到移到C 第一步进一步分解:第一步进一步分解: 1.1 A上一个盘子从上一个盘子从AC 1.2 A上一个盘子从上一个盘子从AB 1.3 C上一个盘子从上一个盘子从CB 第三步进一步分解:第三步进一步分解: 3.1 B上一个盘子从上一个盘子从BA 3.2 B上一个盘子从上一个盘子从BC3.3 A上一个盘子从上一个盘子从ACv结论:结论:上面三个步骤包含两类操作上面三个步骤包含两类操作l步骤步骤1和和3都是将都是将n-1个盘子从一个针移到另一个针上个盘子从一个针移到另一个针上(n1时时),这是一个递归的过程;,这是一个递归的过程;方法一样,只是针的名方法一样,只是针的名称不同而已,为使问题一般化,将步骤称不同而已,为使问题一般化,将步骤1和和3表示为:将表示为:将one 针上的针上的n-1个盘子移到个盘子移到two针,借助针,借助 three针,只是对针,只是对应关系不同。应关系不同。第一步对应关系:第一步对应关系:one A two B three C 第三步对应关系:第三步对应关系:one B two C three A l将将1个盘子从一个针上移到另一针上。个盘子从一个针上移到另一针上。v因此,可以用两个函数分别实现上面两类操作,因此,可以用两个函数分别实现上面两类操作,用用hanoi函数实现第一类操作,用函数实现第一类操作,用move函数实现第函数实现第2类操作。类操作。lhanoi(n,one,two,three) 将将n个盘从个盘从 one three借助借助twolmove(x,y) 将将1个盘从个盘从x y座,座,x、y根据情况取代根据情况取代ABC座中的座中的1个。个。 C语言程序设计 第八章第八章 函数函数 C语言程序设计 第八章第八章 函数函数例例8.9 用递归方法解决用递归方法解决Hanoi(汉诺)塔问题的程序(汉诺)塔问题的程序 #include void main() void hanoi(int n,char one,char two,char three); int m; printf(Input the number of diskes:); scanf(%d,&m); printf(The step to moving %3d diskes:n,m); hanoi(m,A,B,C);void hanoi(int n,char one,char two,char three)void move(char x, char y); if(n=1) move(one,three); else hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); void move(char x, char y) printf(%c-%cn,x, y); 运行:运行: input number of diskes: 3 the step to moving 3 diskes: A C A B C B A C B A B C A C8.7 数组作为函数参数数组作为函数参数数组元素作函数实参数组元素作函数实参值传递值传递 C语言程序设计 第八章第八章 函数函数例例8.10 两个数组比较大小两个数组比较大小 432105a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2n=0m=0k=1n=0m=1k=1n=1m=1k=1n=1m=1k=2n=2m=1k=2 C语言程序设计 第八章第八章 函数函数#include void main() int large(int x,int y) int a10,b10,i,n=0,m=0,k=0; printf(Enter array a:n); for(i=0;i10;i+) scanf(%d,&ai); printf(n); printf(Enter array b:n); for(i=0;i10;i+) scanf(%d,&bi); printf(n); for(i=0;ibi%d timesn”,n); printf(“ai=bi%d timesn”,m); printf(“aik) printf(“array a is larger than array bn”); else if(ny) flag=1; else if(x bi 3 time ai = bi 1 time ai bi 1 time array a is large then array b数组名可作函数参数数组名可作函数参数实参和形参都应用数组名实参和形参都应用数组名 C语言程序设计 第八章第八章 函数函数例例8.11 求学生的平均成绩求学生的平均成绩 float average(float array10) int i; float aver,sum=array0; for( i=1; i10; i+ ) sum=sum+arrayi; aver=sum/10; return (aver);#include void main() float average(float array10); float score10, aver; int i; printf(Input 10 scores: n); for( i=0; i10; i+ ) scanf(%f, &scorei); printf(“n”); aver=average(score); printf(Average is: %5.2f, aver);.2109score562312.88array几点说明:几点说明: C语言程序设计 第八章第八章 函数函数v地址传递地址传递l调用函数时,对形参数组元素的操作,实际上也是对

    注意事项

    本文(第8章 函数-精品文档.ppt)为本站会员(安***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开