《第9章函数梁培训课件》由会员分享,可在线阅读,更多相关《第9章函数梁培训课件(65页珍藏版)》请在金锄头文库上搜索。
1、第9章 函数,2,教学目标,描述 C 语言中的函数 掌握 C 语言中常见的内置函数 理解函数原型和函数的返回值 熟练掌握自定义函数的定义和调用 理解变量的作用域 理解变量的存储类型 理解两种参数传递的方式:传值、引用 熟悉带参函数的调用 熟练使用数组作为函数参数 作业 书p210的1、2、6实验p107的2、3,3,程序设计的艺术,三国演义中有这样一段描写: 懿问曰:“孔明寝食及事之烦简若何?”使者曰:“丞相夙兴夜寐,罚二十以上皆亲览焉。所啖之食,日不过数升。”懿顾谓诸将曰:“孔明食少事烦,其能久乎?” 此话音落不久,诸葛亮果然病故于五丈原。 “事无巨细”,“事必躬亲” 管理学的观点是极其排斥
2、这种做法的,认为工作必须分工,各司其职 其中的思想,在程序设计里也适用,4,int main(void) : x=x*x*x; y=y*y*y; z=z*z*z; ans1=x+y+z; a=a*a*a; b=b*b*b; c=c*c*c; ans2=a+b+c; : ,为什么使用函数,重复多次的同一计算类型,int main(void) : ans1=cube(x,y,z); ans2=cube(a,b,c); : ,int cube(int a,int b,int c) int ans; ans=(a*a*a)+(b*b*b)+(c*c*c); return ans; ,函数,主程序,an
3、s,函数可以把相对独立的某个功能抽象出来,使之成为程序中的一个独立实体。可以在同一个程序或其他程序中多次重复使用,6,函数机制的优点,使程序变得更简短而清晰 有利于程序维护 可以提高程序开发的效率 提高了代码的重用性,7,C语言中的函数,说明: 一个源程序文件由一个或多个函数组成。 一个C程序由一个或多个源程序文件组成。 C程序的执行从main函数开始,调用其他函数后流程回到main函数,在main函数中结束整个程序运行。 所有函数都是平行的,即函数定义时是互相独立的,一个函数并不从属于另一个函数。,8,函数类型,内置函数: 由语言系统提供; 用户无须定义,也不必在程序中作类型说明; 只需在程
4、序前包含有该函数定义的头文件;,自定义函数: 用户在程序中根据需要而编写的函数;,9,常用内置函数,10,问题描述: 求自然数110的平方根和立方。,内置函数sqrt 和pow 示例,2,6,64,#include #include int main(void) int x=1; double squareroot,power; while(x = 10) squareroot=sqrt(x); power=pow(x,3); printf( %d的平方根:%3.2ft%d的立方:%5.0f n, x,squareroot,x,power); x+; return 0; ,1的平方根: 1.0
5、0 1的立方: 1 2的平方根: 1.41 2的立方: 8 3的平方根: 1.73 3的立方: 27 4的平方根: 2.00 4的立方: 64 5的平方根: 2.24 5的立方: 125 6的平方根: 2.45 6的立方: 216 7的平方根: 2.65 7的立方: 343 8的平方根: 2.83 8的立方: 512 9的平方根: 3.00 9的立方: 729 10的平方根: 3.16 10的立方: 1000 Press any key to continue,11,toupper和tolower示例,2,6,64,#include #include int main(void) char m
6、sg1,msg2,to_upper,to_lower; printf(请输入一个小写字母:); msg1=getchar(); to_upper=toupper(msg1); printf(转换为大写:%cn,to_upper); printf(请输入一个大写字母:); fflush(stdin); msg2=getchar(); to_lower=tolower(msg2); printf(转换为小写:%cn,to_lower); return 0; ,请输入一个小写字母:d 转换为大写:D 请输入一个大写字母:E 转换为小写:e Press any key to continue,12,内
7、置函数rand示例,2,6,64,#include #include /#include int main(void) int i; printf(产生 10 个 0 到 99 之间的随机数序列:nn); / srand(unsigned)time(NULL); 取1970年1月1日到现在的秒数为随机种子 for(i=0; i10; i+) printf(%d , rand() % 100); printf(n); return 0; ,产生 10 个 0 到 99 之间的随机数序列: 44 73 26 58 37 94 27 42 28 90 Press any key to continu
8、e,13,函数定义,如果没有参数,则应该用void注明 如果不需要返回值,则应该用void定义返回值类型 返回值类型与return语句配合 当函数执行到return语句时,就中止函数的执行,返回到调用它的地方 函数内部可以定义只能自己使用的变量,称内部变量。 参数表里的变量也是内部变量,14,函数命名规则,Linux/Unix平台 习惯用function_name Windows风格函数名命名 用大写字母开头、大小写混排的单词组合而成 FunctionName 变量名形式 “名词”或者“形容词+名词” 如变量名oldValue与newValue等 函数名形式 “动词”或者“动词+名词”(动宾词
9、组) 如函数名GetMax()等,15,对函数接口加以注释说明,/* 函数功能:实现功能 函数参数:参数1,表示 参数2,表示 函数返回值: */ 返回值类型 函数名(参数表) 函数体return 表达式; ,16,计算两个整数的平均数,/* 函数功能: 计算平均数 函数入口参数: 整型x,存储第一个运算数 整型y,存储第二个运算数 函数返回值: 平均数 */ int Average(int x, int y) int result; result = (x + y) / 2; return result; ,17,计算两个数的最大值,/* 函数功能: 计算最大值 函数入口参数: 实型x,存储
10、第一个运算数 实型y,存储第二个运算数 函数返回值: 最大数 */ double max(double x, double y) double m; m=xy?x:y; return m; ,该函数名为max,它有两个double类型的参数,返回值为double类型。在函数体内有三条语句实现了求两个数中较大的数,并将它返回。,18,计算打折函数,void displayDiscount() float price, discount_amt; printf(请输入价格); scanf(%f, ,该函数名为displayDiscount,无参数,使用void说明无返回值,函数体内的语句用于根据产
11、品的价格求折扣后的价格。,19,函数参数,形参( 形式参数 ): 在定义函数时,定义函数名后面括号中的变量名 实参( 实际参数 ): 在主调函数中调用一个函数,调用函数名后面括号中的参数(或表达式),20,函数调用,通过在程序中使用函数名称,可以执行函数中包含的语句,这称为调用函数 单向值传递 调用函数时,必须提供所有的参数 printf和scanf是采用变长变量表定义的函数,所以变量的个数不固定。 提供的参数个数、类型、顺序应与定义时相同,21,函数调用,int main() int a = 12; int b = 24; int ave; ave = Average(a, b); prin
12、tf(Average of %d and %d is %d.n, a, b, ave); return 0; ,22,函数调用,有返回值时 放到一个数值表达式中 如 c = max(a,b); 作为另一个函数调用的参数 如 c = max(max(a,b),c); printf(%dn, max(a,b); 无返回值时 函数调用表达式 如 display(a,b);,23,函数原型,调用一个函数之前,先要对其返回值类型、函数名和参数进行声明(declare) 有助于编译器进行类型检查 函数原型说明在形式上与函数头部类似,最后加一个分号。原型说明中参数表里的参数名可以不写(只写参数类型)。 声明
13、时不要省略参数以及返回值的类型,#include float count (int, int); int main(void) . . . . . . float count(int x,int y) . . . ,24,#include /* 函数功能: 计算平均数 函数入口参数: 整型x,存储第一个运算数 整型y,存储第二个运算数 函数返回值: 平均数 */ int Average(int x, int y) int result; result = (x + y) / 2; return result; int main() int a = 12; int b = 24; int ave
14、 = Average(a, b); printf(Average of %d and %d is %d.n, a, b, ave); return 0; ,函数原型,25,#include int Average(int x, int y); /*声明Average()函数*/ int main() int a = 12; int b = 24; int ave = Average(a, b); printf(Average of %d and %d is %d.n, a, b, ave); return 0; /* 函数功能: 计算平均数 函数入口参数: 整型x,存储第一个运算数 整型y,存
15、储第二个运算数 函数返回值: 平均数 */ int Average(int x, int y) int result; result = (x + y) / 2; return result; ,函数原型,26,函数之间允许相互调用,也允许嵌套调用 函数还可以自己调用自己,称为递归调用,#include int main(void) : set_discount(); displayDiscount(); : : ,float set_discount() : : float displayDiscount() : : ,函数调用,27,void reverse() : : ,#include int main(void) : palindrome(); : : ,void palindrome() : reverse(); : ,函数嵌套调用,从一个函数调用另一个函数称为函数的嵌套调用,28,函数嵌套调用,main函数 调用函数 A; ,函数 A 调用函数 B; ,函数 B ,调用,调用,返回,返回,29,函数递归调用,函数直接或间接的调用自身叫函数的递归调用,说明 C编译系统对递归函数的自调用次数