函数调用函数原型

上传人:n**** 文档编号:93398047 上传时间:2019-07-21 格式:PPT 页数:63 大小:806.50KB
返回 下载 相关 举报
函数调用函数原型_第1页
第1页 / 共63页
函数调用函数原型_第2页
第2页 / 共63页
函数调用函数原型_第3页
第3页 / 共63页
函数调用函数原型_第4页
第4页 / 共63页
函数调用函数原型_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《函数调用函数原型》由会员分享,可在线阅读,更多相关《函数调用函数原型(63页珍藏版)》请在金锄头文库上搜索。

1、第5章 函数-1,C语言程序设计,内容提要,函数定义、函数调用、函数原型、函数返回值 难点:函数的参数传递与返回值 程序调试 代码风格 变量的作用域与存储类型 模块化程序设计 Skill: 用函数编程求解问题的能力 程序排错与调试的能力,数学中的函数,自变量,因变量,函数名,说明自变量与因变量的映射关系,程序设计中的函数,程序设计中的函数不局限于计算 计算类,如打印阶乘表的程序 判断推理类,如排序、查找,请问,读多少行的程序能让你不头疼? 假如系统提供的函数printf()由10行代码替换,那么你编过的程序会成什么样子? 实际上一个printf()有上千行代码 main()中能放多少行代码?

2、如果所有代码都在main()中,怎么团队合作? 如果代码都在一个文件中,怎么团队合作?,程序设计的艺术,“事无巨细”,“事必躬亲” 管理学的观点是极其排斥这种做法的,认为工作必须分工,各司其职 其中的思想,在程序设计里也适用 分而治之(Divide and Conquer,Wirth, 1971) 函数把较大的任务分解成若干个较小的任务,并提炼出公用任务,程序设计的艺术,信息隐藏(Information Hiding, Parnas, 1972) 设计得当的函数可以把具体操作细节对程序中不需要知道它们的那些部分隐藏掉,从而使整个程序结构清楚 使用函数时,不用知道这个函数内部是如何运作的,只按照

3、我们的需要和它的参数形式调用它即可,函数是C语言中模块化编程的最小单位 可以把每个函数看作一个模块 如把编程比做制造一台机器,函数就好比其零部件 可将这些“零部件”单独设计、调试、测试好,用时拿出来装配,再总体调试。 这些“零部件”可以是自己设计制造/别人设计制造/现成的标准产品,函数(function)和模块(module),函数(function)和模块(module),若干相关的函数可以合并成一个“模块” 一个源程序文件由一个或多个函数组成 一个C程序由一个或多个源程序文件组成,C程序结构,函数的分类,函数生来都是平等的,互相独立的,没有高低贵贱和从属之分 main()稍微特殊一点点 C

4、程序的执行从main函数开始 调用其他函数后流程回到main函数 在main函数中结束整个程序运行,函数的分类,库函数 ANSI/ISO C定义的标准库函数 符合标准的C语言编译器必须提供这些函数 函数的行为也要符合ANSI/ISO C的定义 第三方库函数 由其它厂商自行开发的C语言函数库 不在标准范围内,能扩充C语言的功能(图形、网络、数据库等) 自定义函数 自己编写的函数 包装后,也可成为函数库,供别人使用,函数定义(definition),类型 函数名(类型 参数1, 类型 参数2, ) 函数体; return 表达式; ,返回值类型,函数名标识符 说明运算规则,参数表 相当于运算的操作

5、数,返回值是运算的结果,函数出口,函数定义(definition),类型 函数名(类型 参数1, 类型 参数2, ) 函数体; return 表达式; ,参数表里的变量(叫形式参数,parameter)也是内部变量,例5.1a 计算两个整数的平均数,/* 函数功能: 计算平均数 函数入口参数: 整型x,存储第一个运算数 整型y,存储第二个运算数 函数返回值: 平均数 */ int Average(int x, int y) int result; result = (x + y) / 2; return result; ,返回值类型,函数名说明函数的功能,返回值作为函数调用表达式的值,形参表,

6、函数入口,函数内部可以定义只能自己使用的变量,称内部变量,函数定义(Function definition),void 函数名(void) 函数体; return ; ,函数没有运算结果,无返回值,用void定义返回值类型,用void定义参数,表示没有参数,return语句后不需要任何表达式,函数调用(Function call),函数名(表达式1, 表达式2, ); 调用函数时,提供的表达式叫实际参数(argument) 有返回值时 放到一个数值表达式中 c = max(a,b); 作为另一个函数调用的参数 c = max(max(a,b),c); printf(“%dn“, max(a,b

7、); 无返回值时 函数调用表达式 display(a,b);,函数的每次执行都会建立一个全新的独立的环境 在“栈”中为函数的每个变量(包括形式参数)分配内存 把实参值复制给形参 开始执行函数内的第一条语句,main() int a=12, b=24,ave; ave = Average(a,b); ,int Average(int x, int y) int result; result = (x + y) / 2; return result; ,函数调用的过程,12,24,函数内的代码在这个独立的环境内工作 当函数执行到return语句或时函数退出 程序从当次调用函数的地方继续执行 函数可

8、有多个return,但最好只有一个且是最后一行,main() int a=12, b=24,ave; ave = Average(a,b); ,int Average(int x, int y) int result; result = (x + y) / 2; return result; ,函数调用的过程,12,24,18,函数退出时 求出返回值,存入一个可被调用者访问的地方 收回分配给所有变量(包括形式参数)的内存 程序控制权交给调用者,调用者拿到返回值,将其作为函数调用表达式的结果,main() int a=12, b=24,ave; ave = Average(a,b); ,int

9、Average(int x, int y) int result; result = (x + y) / 2; return result; ,函数调用的过程,18,函数参数传递,从实参到形参是单向值传递 形参值的改变不会影响对应的实参 实参和形参必须匹配 数目一致 类型一一对应(会发生自动类型转换),函数的嵌套调用,嵌套调用 在调用一个函数的过程中,又调用另一个函数 C语言规定函数不能嵌套定义,但可以嵌套调用 函数是相互平行的,main() a(); ,a 函数 b(); return; ,b函数 return; ,递归(Recursion),函数直接或间接调用自己为递归 unsigned

10、long func(unsigned int n) if (n = 0) return 1; else return n * func(n-1); ,用递归的方法求n!,n! =n*(n-1)! (n-1)! =(n-1)*(n-2)! (n-2)! (n-3)! 4! : 3! =3*2! : 2! =2*1! : 1! =1*0! 0! =1,回推过程,递推过程,每个递归函数必须至少有一个基线条件 一般情况必须最终能简化为基线条件,递归层数太多易 导致栈空间溢出 后果很严重,程序被异常中止,递归与迭代,迭代即循环方法来编写的阶乘函数 unsigned long factorial(unsi

11、gned int n) unsigned long fact = 1 ; unsigned int i ; for (i = 1; i = n ; i+) fact *= i ; return fact ; 递归程序遵循了数学中对阶乘的定义 因此递归方法编写程序具有更清晰、可读性更好的优点,递归与迭代,优点: 从编程角度来看,比较直观、精炼,逻辑清楚 符合人的思维习惯,逼近数学公式的表示 尤其适合非数值计算领域 hanoi塔,骑士游历、八皇后问题(回溯法) 缺点: 增加了函数调用的开销,每次调用都需要进行参数传递、现场保护等 从程序运行效率来看,大量重复计算,时空效率低 应尽量用迭代形式替代递

12、归形式,函数原型(Function prototype),在调用一个函数之前 要先对其返回值类型、函数名和参数进行声明(declaration) 函数声明,也称函数原型 有助于编译器进行类型检查 不对函数进行声明是非常危险的,例5.1b 使用了Average函数的main(),#include int Average(int x, int y); main() int a = 12; int b = 24; int ave; ave = Average(a, b); printf(“Average of %d and %d is %d.n“, a, b, ave); ,函数声明(函数原型),声

13、明时不要省略形参和返回值的类型,函数调用,#include /* 函数功能: 计算平均数 函数入口参数: 整型x,存储第一个运算数 整型y,存储第二个运算数 函数返回值: 平均数 */ int Average(int x, int y) int result; result = (x + y) / 2; return result; main() int a = 12; int b = 24; int ave = Average(a, b); printf(“Average of %d and %d is %d.n“, a, b, ave); ,例5.1,函数定义也有声明函数的效果 当返回值为

14、整型或者函数定义在函数调用前面时,可以省略原型,函数定义与函数声明的区别,函数定义 指函数功能的确立 包括指定函数名、函数类型、形参及其类型、函数体等 是完整独立的单位 函数声明 是对函数名、函数返回值类型、形参类型的说明 不包括函数体 是一条语句,以分号结束,只起一个声明作用,循序渐进式编程 实验4:小学生加法考试题,通过输入两个加数给学生出一道加法运算题,输入答案正确: right 错误: Not correct! Try again!,循序渐进式编程 实验4:小学生加法考试题,void Print(int flag) if (flag) printf(“Right!n“); else p

15、rintf(“Not correct!n“); ,实验4:小学生加法考试题,/* 函数功能: 计算两整型数之和,如果与用户输入的答案相同,则返回1,否则返回0 函数参数: 整型变量a和b,分别代表被加数和加数 函数返回值:当a加b的结果与用户输入的答案相同时,返回1,否则返回0 */ int AddTest(int a, int b) int answer; printf(“%d+%d=“, a, b); scanf(“%d“, ,main() int a, b, answer; printf(“Input a,b:“); scanf(“%d,%d“, ,do while (answer = 0);,实验4:小学生加法考试题,main() answer = AddTest(a, b); Print(answer, chance); ,chance = 0; do chance+; while (answer = 0 ,实验4:小学生加法考试题,srand(time(NULL); error = 0; score = 0; for (i=0; i10; i+) a = rand()%10 + 1; b = rand()%10

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号