ImageVerifierCode 换一换
格式:PPT , 页数:51 ,大小:533KB ,
文档编号:2493685      下载积分:28 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-2493685.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(三亚风情)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(C语言(函数)ppt课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

C语言(函数)ppt课件.ppt

1、函数 程序的模块化 函数 定义 原型 调用 参数传递 函数的嵌套调用 递归函数 程序设计举例C C语言程序设计语言程序设计简介 分而治之与程序的模块化 把一个规模较大的问题分解成若干个较小的相对独立的部分,对每一个部分使用一个较小的程序段,即程序模块(module)来处理。 从较小的程序段或组件来构建程序。 这些小片段或组件比原始程序更容易实现和管理。 这些小组件可以被重复使用。函数函数C语言的函数 在C语言中,函数(function)是构成程序的基本模块。 一个C程序由一个或多个函数组成,有且仅有一个主函数,即main()函数。 每个函数完成一个相对独立的且功能明确的任务。 由主函数调用其他

2、函数,其他函数也可以互相调用。 同一个函数可以被一个或多个函数调用任意多次。函数函数mainfun_afun_bfun_cfun_cfun_dfun_efun_ffun_dC语言的函数 C语言的函数有两大类: 标准库函数 提供了丰富的函数。 例如 数学计算:sqrt(),abs() 输入/输出:scanf(),printf() 自定义函数 程序员可以编写函数来完成特定的任务。 应该熟悉C系统中的标准函数库。 应该避免从零开始构建一切。函数函数为什么使用函数 函数使程序模块化。 程序采用模块化结构的好处: 分而治之 提高程序开发的效率。 使程序易于管理。 代码重用 使用现有的函数作为构件来创建程

3、序。 函数可以被重复使用。 抽象 隐藏了实现的细节。 例如 使用库函数(printf()),但并不知道它的具体实现(没有影响使用)。函数函数案例分析:一个简单的函数 编写和使用一个简单的函数(cw0801.c) 定义一个函数square,用来计算任意整数的平方。 然后,使用该函数计算从1到10所有整数的平方。函数函数#include int square(int);void main() int x; for (x=1; x=10; x+) printf(%d , square(x);int square(int y) return y*y;声明声明函数函数使用使用函数函数定义定义函数函数1

4、4 9 16 25 36 49 64 81 100函数的定义 定义函数的格式 () 函数名:一个有效的标识符。 函数类型:返回值的类型说明符。 如果不指定,即缺省,就是 int。 void :表示函数不返回任何值。 参数表:声明参数,多个参数用逗号分隔。 接收传递进来的数据。 必须为每个参数指定数据类型。 但 int 可以省略。函数函数函数头函数头函数体函数体函数的定义 定义函数的格式 () 函数体:包括声明语句和可执行语句。 在函数体内可以声明变量。 不能定义函数,即函数的定义不允许嵌套。 控制返回:结束执行,把程序的控制交还主调函数,也可以用return返回一个数值。return;retu

5、rn ;函数函数无返回无返回值值有返回有返回值值案例分析:函数的定义 函数的定义(cw0802.c) 定义函数找出三个数中的大数。函数函数#include int maximum(int, int, int);void main() int a, b, c; printf(“Input three integers: ); scanf(%d%d%d, &a, &b, &c); printf(Maximum is: %dn, maximum(a, b, c);int maximum(int x, int y, int z) int max = x; if (ymax) max = y; if (

6、zmax) max = z; return max;maximumintintintint函数原型函数原型接口接口(interface)函数原型 函数原型 (); 用来对函数进行声明。 编译器使用函数原型来检查函数调用的合法性。 注意:函数原型要与函数的定义一致。 例如int maximum(int a, int b, int c);int maximum(int, int, int);函数函数函数原型 函数原型在程序文件中的位置不同,作用范围不同。 在所有函数的外面 在函数内部函数函数main() void funcA() int funcB(int); int funcB(int) 函数原

7、型 如果程序中没有包含函数原型。 编译程序会使用该函数第一次出现的情形来形成自己的函数原型。 函数的定义 函数的调用 默认情况下,编译程序假定函数返回int型的结果,但不会对参数进行任何假定。 如果传递给函数的参数不正确,编译程序不会检查到这些错误。函数函数函数原型 函数原型强迫参数采用正确的数据类型。 举例printf(“%.3f”, sqrt(4) ); 函数原型使编译程序把整数值4转换为double型的值4.0 没有与函数原型中的参数类型完全对应的参数值会在调用函数之前被转换成合适的数据类型。 遵守C语言的提升规则。函数函数double sqrt(double);函数原型与头文件 头文件

8、 每个标准库函数都有对应的头文件。 包含了标准库中所有函数的函数原型, 以及那些函数所需的数据类型和常量的定义。 使用#include命令把头文件包含到程序文件中:#include 例如,#include 程序员可以创建自己的头文件 使用.h扩展名。 使用下面的命令格式包含头文件:#include “文件名”例如,#include “abc.h”函数函数函数调用 函数调用 使用函数,也称为调用函数。函数函数main() int a, b, c; scanf(%d%d, &a, &b); c = max(a, b); printf(the larger is %d, c);126int max(

9、int a, int b) int c; c=a=b?a:b; return c;3451、2、主调函数暂停,保存现场主调函数暂停,保存现场。3、把实参的值拷贝给形参,把实参的值拷贝给形参,控制权控制权交给函数交给函数 max max 。4、5、被调函数执行结束,被调函数执行结束,把函数值返把函数值返回给主调函数回给主调函数,同时把控制权还给主,同时把控制权还给主调函数调函数。6、恢复现场,主调函数继续执行。恢复现场,主调函数继续执行。参数传递 函数间的数据传递方式: 参数 返回值函数函数int max(int a, int b) return c;main() c=max(a, b);max

10、()abcmain()参数传递参数传递返回值传递返回值传递调用调用实参和形参 实参和形参函数函数int max(int a, int b) int c=a=b?a:b; return c;main() int a, b, c; scanf(“%d%d”, &a, &b); c=max(a, b);形式参数形式参数简称简称“形参形参”。在。在函数定义时函数定义时表示可以接受传递过来的值。表示可以接受传递过来的值。实际参数实际参数简称简称“实参实参”。在。在函数调用时函数调用时给出。给出。形参 形参函数函数int max(int a, int b) int c=a=b?a:b; return c;

11、main() int a, b, c; scanf(“%d%d”, &a, &b); c=max(a, b);v只有在函数被调用、启动后,只有在函数被调用、启动后,才临时为其分配存储单元,并才临时为其分配存储单元,并接受主调函数传来的数据。接受主调函数传来的数据。v在函数调用结束后,形参所在函数调用结束后,形参所占存储单元被释放。占存储单元被释放。实参 实参函数函数int max(int a, int b) int c=a=b?a:b; return c;main() int a, b, c; scanf(“%d%d”, &a, &b); c=max(a, b);v实参是函数调用时主调函数实参

12、是函数调用时主调函数传送给被调函数的形式参数的传送给被调函数的形式参数的实际值。实际值。v实参可以是常量、变量和表实参可以是常量、变量和表达式。达式。v实参必须有确定的值。实参必须有确定的值。参数传递 参数传递的顺序。函数函数int max(int a, int b) int c=a=b?a:b; return c;main() int x=6, y; y=max(x, x+); printf(“%d”, y);v当实参表列中有多个实参时,当实参表列中有多个实参时,对实参的求值顺序并不确定。对实参的求值顺序并不确定。vVC和和BC是按从右往左的顺是按从右往左的顺序求值。序求值。b=x+;a=x

13、;7在参数传在参数传递时递时参数传递 参数传递的影响。函数函数int max(int a, int b) int c=a=b?a:b; a+; b+; return c;main() int a=6, b=5, c; c=max(a, b); printf(“%d,%d,%d”,a,b,c);v实参与形参不共用存储单元。实参与形参不共用存储单元。v参数传递时,把实参的值复制一份参数传递时,把实参的值复制一份给形参。给形参。v形参值的变化不影响实参的值。形参值的变化不影响实参的值。v所以,形参和实参可以同名。所以,形参和实参可以同名。6,5,6max6a5b6a5bmain值传递和引用传递 函数

14、间参数的传递有两种类型: 值传递 主调函数把实参的值的副本传递给被调函数的形参。 在被调函数内改变形参的值不会改变主调函数中实参的值。 如果函数不需要修改参数的值,就采用这种调用方式。 引用传递 主调把实参“自身”传递给被调函数的形参。 在被调函数内改变形参的值将改变主调函数中实参的值。 用于可信的函数。 在C语言中,所有参数传递都采用值传递。函数函数参数传递 实参和形参的类型应该相同或赋值兼容。函数函数int max(int a, int b) int c=a=b?a:b; return c;main() int x=6, y=5, z; z=max(x, y); printf(“%d”,

15、z);如果如果x, y是整型,则结果正是整型,则结果正确;确;如果如果x, y是字符型,则自动是字符型,则自动进行类型转换,结果正确;进行类型转换,结果正确;如果如果x, y是短整型,则自动是短整型,则自动进行类型转换,结果正确;进行类型转换,结果正确;如果如果x或或y是实数,则自动是实数,则自动进行类型转换,有数据丢失,进行类型转换,有数据丢失,结果可能不正确。结果可能不正确。b=y;a=x;在参数传递时在参数传递时函数的返回值 函数返回值的类型应该与函数的类型一致。 如果不一致,采用函数的类型,对返回值进行类型转换。函数函数int max(float a, float b) float c

16、=a=b?a:b; return c;main() float x=6.5, y=5.6, z; z = 2*max(x, y); printf(“%f”, z);c 的类型?的类型?返回值的类型?返回值的类型?max(x,y) 的类型?的类型?2*max(x,y) 的类型?的类型?函数的嵌套调用 嵌套调用 在调用一个函数的过程中又调用另一个函数函数函数主函数主函数调用函数调用函数 1函数函数 1调用函数调用函数 2函数函数 2123456789案例分析:函数的嵌套调用 计算圆环的面积 分析 圆环的面积 = 外圆的面积 内圆的面积 可以定义两个函数 circleArea 计算圆的面积 ring

17、Area 计算圆环的面积函数函数r1r2circleAreadoubledoubleringAreadoubledoubledoubledouble circleArea(double r);double ringArea(double r1, double r2);案例分析:函数的嵌套调用 计算圆环的面积 源代码(cw0804.c)函数函数#include #define PI 3.14double circleArea(double r);double ringArea(double r1, double r2);void main() double r1, r2, s; printf(t

18、Input r1, r2: ); scanf(%lf%lf, &r1, &r2); s = ringArea(r1, r2); printf(ntThe area is:%.2lfn, s);案例分析:函数的嵌套调用 计算圆环的面积 源代码(续)函数函数double circleArea(double r) return PI*r*r;double ringArea(double r1, double r2) if (r1=r2) return circleArea(r2)-circleArea(r1); else return circleArea(r1)-circleArea(r2);In

19、put r1, r2: 1 2The area is: 9.42程序设计举例:掷骰子 掷骰子 问题 每个玩家掷两个骰子。每个骰子都有6个面。这些面中包含了1点、2点、3点、4点、5点和6点。当骰子静止下来之后,计算两个朝上的面中的点数和(本次投掷的结果)。 如果第一次投掷的结果是7 或11,那么这个玩家就获胜。 如果第一次投掷的结果是2、3或12,那么这个玩家就输了(即庄家获胜)。 如果第一次投掷的结果是4、5、6、8、9或10,那么这个结果就是该玩家的“点数”。 为了获胜,玩家必须继续掷骰子,直到“掷出了点数”。在掷出点数之前,如果玩家掷出了7,那么玩家就输了。函数函数程序设计举例:掷骰子

20、掷骰子 初始设计 定义一个函数 rollDice,用来模拟掷一次骰子 产生两个随机数(1.6),返回它们的和(点数)函数函数掷第一次掷第一次胜胜输输掷一次掷一次胜胜输输?程序设计举例:掷骰子 掷骰子 细化设计 定义一个变量保存游戏进展的状态 gamestatus 0:继续 1:胜利(游戏结束) 2:失败(游戏结束)函数函数否否rollDice结束结束?rollDice结束结束?否否是是是是赢或输赢或输程序设计举例:掷骰子 掷骰子 实现(cw0807.c)函数函数#include #include #include int rollDice(void);void main() int gameS

21、tatus, sum, myPoint; srand(time(NULL); sum = rollDice();掷第一次掷第一次程序设计举例:掷骰子 掷骰子 实现函数函数 switch(sum) case 7: case 11: gameStatus = 1; break; case 2: case 3: case 12: gameStatus = 2; break; default: gameStatus = 0; myPoint = sum; printf(Point is %dn, myPoint); break; 掷第一次之后的掷第一次之后的结果结果程序设计举例:掷骰子 掷骰子 实现函

22、数函数 while (gameStatus = 0) sum = rollDice(); if (sum = myPoint) gameStatus = 1; else if (sum = 7) gameStatus = 2; if (gameStatus = 1) printf(You wins!); else printf(You loses!);继续游戏继续游戏胜负判断胜负判断程序设计举例:掷骰子 掷骰子 实现函数函数int rollDice() int dice1, dice2, sum; dice1 = rand()%6 + 1; /第一个骰子的点数第一个骰子的点数 dice2 =

23、rand()%6 + 1; /第二个骰子的点数第二个骰子的点数 sum = dice1 + dice2; printf(You rolled %d + %d = %dn, dice1, dice2, sum); return sum;递归函数 递归函数 直接或间接调用自己的函数。函数函数函数函数 1调用调用函数函数 1函数函数 1调用函数调用函数 2函数函数 2调用调用函数函数 1案例分析:递归函数 用递归方法计算n!。 分析 5! = 5 * 4 * 3 * 2 * 1 5! = 5 * 4! 4! = 4 * 3!. 递归公式函数函数n ! =1 (n=0或或1)n*(n-1)! (n1)

24、基本情形基本情形简化问题简化问题s=1;n=1;while (n=20) s = n * s;迭迭代代n! = n * (n-1)! 案例分析:递归函数 举例:用递归方法计算n!。 源代码(cw0805.c)函数函数#include long fac(int n) long f; if (n=0|n=1) f=1; else f=n*fac(n-1); printf(t%d!=%ldn, n, f); return f;void main( ) printf(nt5!=%ldn, fac(5);1!=12!=23!=64!=245!=1205!=120递归递归调用调用案例分析:递归函数 举例:

25、用递归方法计算n!。 分析函数函数5!5*4!4*3!3*2!2*1!11205*244*63*22*11递归调用递归调用从递归调用返回值从递归调用返回值用递归方案解决问题小结 用递归(函数)方案解决问题 递归函数只知道如何去解最简单的情形(基本情形) 简单的返回一个值 把复杂的问题分成两部分: 函数知道如何去做的部分 函数不知道如何去做的部分 这一部分与原问题相似,且更简单 函数可以调用自己的新形式来解决这个更小的问题(递归调用) 最终遇到基本情形 函数识别出基本情形,将结果返回给前一个情形 一系列的结果按顺序返回 直到把最终结果返回给原始的调用者(可能是main()函数)函数函数案例分析:

26、递归方案 使用递归方法计算斐波拉契数列。0 1 1 2 3 5 8 分析 从第三个数开始,每个数是前两个数的和。 第一、二个数是确定的。 递归公式fib(n) = fib(n-1) + fib(n-2)fib(1) = 0fib(2) = 1函数函数递归与迭代 递归与迭代的比较 循环 迭代:明确使用了循环结构 递归:重复调用递归函数 终止条件 迭代:循环条件不满足 递归:遇到基本情形 都有可能出现无限循环 如何选择 迭代:性能好 递归:可读性好函数函数程序设计举例:汉诺塔问题 汉诺塔问题 问题 假设有三个分别命名为X,Y和Z的塔座,在塔座X上插有n个直径大小各不相同、依从小到大编号为1,2,n

27、的圆盘。现要求将X轴上的n个圆盘移到塔座Z上,并按同样的顺序叠放。 移动时必须遵循以下规则: 每次只能移动一个圆盘; 圆盘可以插在X,Y和Z中的任一塔座上; 任何时候都不能将一个较大的圆盘压在较小的圆盘之上。函数函数XYZ程序设计举例:汉诺塔问题 汉诺塔问题 分析 n=1时 将圆盘1从塔座X移到塔座Z。函数函数XYZXYZ基本情形基本情形程序设计举例:汉诺塔问题 汉诺塔问题 分析 n1时函数函数1. 利用塔座利用塔座Z为辅助塔座,将压在为辅助塔座,将压在圆盘圆盘n之上的之上的n-1个盘从塔座个盘从塔座X移到移到塔座塔座Y;(与原问题类似)与原问题类似)2. 将圆盘将圆盘n从塔座从塔座X移到塔座

28、移到塔座Z;3. 利用塔座利用塔座X为辅助塔座,将塔座为辅助塔座,将塔座Y上的上的n-1个圆盘移动到塔座个圆盘移动到塔座Z。(与原问题类似)与原问题类似)XYZXYZXYZXYZ123程序设计举例:汉诺塔问题 汉诺塔问题 设计 move 函数:移动一个盘 把盘 n 从 s 塔移到 d 塔 hanoi 函数:移动n个盘的汉诺塔问题 把 n 个盘从 x 塔移到 z 塔,y 塔作为辅助塔函数函数void move(int n, char s, char d);void hanoi(int n, char x, char y, char z);程序设计举例:汉诺塔问题 汉诺塔问题 实现(cw0806.

29、c)函数函数#include void move(int n, char s, char d);void hanoi(int n, char x, char y, char z);void main() int n; printf(t Input the number of disks:); scanf(%d, &n); hanoi(n, X, Y, Z);程序设计举例:汉诺塔问题 汉诺塔问题 实现函数函数void hanoi(int n, char x, char y, char z) if (n=1) move(n, x, z); else hanoi(n-1, x, z, y);move(n, x, z);hanoi(n-1, y, x, z); void move(int n, char s, char d) printf(t%dt%c-%cn, n, s, d);小结 函数可以作为大型程序的组成模块。 每个函数应该实现某个明确的功能。 使用参数可以向函数传递数据,通过return让函数返回一个数据。 使用函数原型声明函数,以便编译器检查函数调用时所传递的参数个数及类型是否正确。 函数可以调用自身,这种调用方式称为递归。有些问题使用递归解决方案,但是递归会在内存使用和时间花费方面效率低下。函数函数

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|