c语言课件函数_第1页
c语言课件函数_第2页
c语言课件函数_第3页
c语言课件函数_第4页
c语言课件函数_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、c语言课件函数 第第 5 5 讲讲 1. 目的、要求目的、要求 掌握函数的定义(无参、有参、空函数); 掌握函数的参数(形参、实参)和函数的值; 掌握函数的调用和嵌套调用; 掌握函数的递归调用。 2. 重点、难点重点、难点 形参、实参及其“值传递”; 函数调用的3种方式; 函数的递归调用。 c语言课件函数 第第 8 章章 函函 数数 8.1 概概 述述 C程序由一个主函数(main)和若干个函数构成。 主函数可调用其它函数,其它函数也可相互调用。 同一个函数可以被一个或多个函数调用任意多次。 主函数 abc edi ge fakh main() a(); b(); c(); a() d();

2、e(); b() f(); a(); k(); c() h(); i(); h() g(); f() e(); c语言课件函数 main() printstar(); print_message(); printstar(); printstar() printf(*n); print_message() printf(How do you do!n) ; main() printf(*n); printf(How do you do!n) ; printf(*n); c语言课件函数 main() int a,b,max1,c,d,max2,e,f,max3; a=3;b=4; if (ab)

3、 max1=a; else max1=b; printf(nttmax1=%d,max1); c=5;d=6; if (cd) max2=c; else max2=d; printf(nttmax2=%d,max2); e=7;f=8; if (ef) max3=e; else max3=f; printf(nttmax3=%d,max3); c语言课件函数 main() int a,b,max1,c,d,max2,e,f,max3; a=3;b=4; max1 = cmpmax(a , b) ; printf(nttmax1=%d,max1); c=5;d=6; max2 = cmpmax(

4、c , d) ; printf(nttmax2=%d,max2); e=7;f=8; max3 = cmpmax(e , f) ; printf(nttmax3=%d,max3); int cmpmax(int x, int y) int z ; z = x y ? x : y ; return(z ); c语言课件函数 m1=cmpmax( a , b ); cmpmax(int x , int y ) int z; z=xy?x:y; return (z); 在Main中调用该函数 定义cmpmax函数 c语言课件函数 说说 明明 1. 任何一个源程序文件都是由一个或多个函数组成。 2.

5、C程序的执行从main函数开始并在main函数最后结束。 3. 函数不能嵌套定义。除main函数外,函数可以相互调用。 4. 从用户角度,函数可分为标准函数(库函数)和用户自 定义函数。 5. 从函数的形式看,函数可分为无参函数和有参函数。 c语言课件函数 8.2 函数的调用函数的调用 8.2.1 函数调用的一般形式函数调用的一般形式 函数名(实参表列)函数名(实参表列) 1)若调用无参函数,可省略实参表列,但保留括号。 2)实参表列中的实参应用逗号隔开。 3)实参与形参的个数、类型应一一对应 函数调用函数调用 3要素:要素: 函数名函数名 参数(个数、顺序、含义、类型)参数(个数、顺序、含义

6、、类型) 返回值类型返回值类型 c语言课件函数 main( ) int i=2,p; p=f( i , +i ); printf(%dn,p); int f(int a, int b) int c; if (ab) c=1; else if (a= =b) c=0; else c = -1; return(c); 4)实参表的求值顺序依系统而定,Turbo C按自右而左自右而左的顺序 求值。例如: c语言课件函数 8.2.2 函数调用的方式函数调用的方式 1. 函数语句。把函数作为一个语句,不要求返回值, 只要求函数完成一定的操作。 printstar( ); 2. 函数表达式。函数出现在一个

7、表达式中,要求带 回一个确定的值参加运算。 c=2*max(a,b); 3. 函数参数。函数调用的返回值作为另一次调用的 实参。如: m=max(a,max(b,c); c语言课件函数 8.2.3 对被调用函数的说明对被调用函数的说明 1. 被调用的函数必须存在(库函数或自定义函数) 2. 使用库函数必须用#include命令打开“头文件” 3. 用户自定义函数要求主调函数与被调函数在同一文 件中。此时,当函数的返回值类型不是整型并且被调 函数在主调函数之后定义时,一定要在主调函数中对 被调函数事先进行声明声明,称为“函数原型函数原型”。 c语言课件函数 main() float add();

8、 /*对被调用函数的声明函数的声明*/ float a,b,c; scanf(%f,%f, c=add(a,b); printf(sum is %fn,c); float add(float x, float y) /*定义add函数*/ float z; z=x+y; return(z); c语言课件函数 8.3 函数定义的一般形式函数定义的一般形式 1. 无参函数的定义形式无参函数的定义形式 类型标识符 函数名() 说明部分 语句 2. 有参函数的定义形式有参函数的定义形式 类型标识符 函数名(形式参数表列) 说明部分 语句 3. “空函数空函数”的定义形式的定义形式 类型标识符 函数名(

9、) c语言课件函数 函数类型函数类型 函数名函数名(形参表形参表) /* 函数首部函数首部 */ 变量定义部分;变量定义部分; /* 函数体函数体 */ 函数实现过程;函数实现过程; return 表达式;表达式; 把函数运算的结果回送给主函数把函数运算的结果回送给主函数 只能返回一个值只能返回一个值 函数返回值的类型函数返回值的类型 没有分号没有分号 函数定义模型函数定义模型 类型类型1 参数参数1 ,类型,类型2 参数参数2 ,类型,类型n 参数参数n 参数之间用逗号分隔,每个参数前面的类型都必须分别写明参数之间用逗号分隔,每个参数前面的类型都必须分别写明 c语言课件函数 8.4 函数参数

10、和函数值函数参数和函数值 8.4.1 形式参数和实际参数 形形 参参:在定义函数时函数名后括弧中的变量名称。 实实 参参:在调用函数时函数名后括弧中的表达式。 用于主调函数和被调函数之间的数据传递。 m1=cmpmax( a , b ); cmpmax(int x , int y ) int z; z=xy?x:y; return (z); 在Main中调用该函数 定义cmpmax函数 形形 参参 实实 参参 c语言课件函数 关于形参与实参的说明关于形参与实参的说明 1)只有在发生函数调用时才为形参分配内存单元。调用结束后, 形参单元被立即释放。 2)实参可以是常量、变量或表达式,但必须有确定

11、的值。调用 时将实参的值传给形参。但形参为数组名时,传递的是数组的首 地址而不是变量的值。 3)必须在定义的函数中指定形参的类型。 4)实参与形参的类型应一致(整型与字符型可互换) 5)实参与形参的数据传递是 单向传递单向传递 或称“值传递值传递”,不能 由形参传回值给实参。内存中实参单元和形参单元是不同的单元, 因此形参值的变化不会影响实参的值。 在参数传递过程中,实参把值复制给形参。在参数传递过程中,实参把值复制给形参。 形参和实参一一对应:数量一致,类型一致,顺序一致形参和实参一一对应:数量一致,类型一致,顺序一致 实参:常量、变量或表达式实参:常量、变量或表达式 形参:变量,用于接受实

12、参传递过来的值形参:变量,用于接受实参传递过来的值 单向单向 值传值传 实参实参 形参形参 c语言课件函数 8.4.2 函数的返回值函数的返回值 函数的返回值:函数的返回值:通过函数调用,由被调函数返回给 主调函数的一个确定的值。 1)函数的返回值由被调函数中的return语句获得。其 中:return后的括弧可以省略,如return z; return后可以是一个表达式,如return (xy?x:y) 2)函数的类型应当在定义函数时指定。如 int max(a,b) 如定义函数未指定类型,则系统默认为整型。 3)函数值的类型与return语句中表达式的值不一致时, 以函数类型为准。(初学者

13、编程时最好将其定义成编程时最好将其定义成 一致以免出错一致以免出错) c语言课件函数 main() float a,b; float c; scanf(%f,%f, c=max(a,b); printf(Max is %f n,c); (int) max(float x, float y) float z; z = xy ? X : y ; return(z); c语言课件函数 4)若被调函数中没有return语句,则函数带回的是 一个不确定的值,没有实际意义。 5)为了明确表示“不带回值”,可用“void”定义 函数为“无类型”(或称“空类型”)。如 void printstar() voi

14、d print-message() 为减少出错,凡不带回值的函数,都应定义为void。 c语言课件函数 例8.5 调用函数计算圆柱体积 输入圆柱体的高和半径,求圆柱体积, volume=*r2*h。 要求定义和调用函数cylinder (r, h )计算圆柱体 的体积。 c语言课件函数 源程序源程序 /* 计算圆柱体积计算圆柱体积 */ #include int main( void ) double height, radius, volume; double cylinder (double r, double h); /* 函数声明函数声明*/ printf (Enter radius

15、and height: ); scanf (%lf%lf, /* 调用函数,返回值赋给调用函数,返回值赋给volume */ volume = cylinder (radius, height ); printf (Volume = %.3fn, volume); return 0; c语言课件函数 double cylinder (double r, double h) /* 函数首部函数首部 */ /* 函数体,写在一对大括号内函数体,写在一对大括号内 */ double result; result =3.1415926 * r * r * h; /* 计算圆柱体积计算圆柱体积 */ r

16、eturn result; /* 返回运算结果返回运算结果*/ 分析函数的定义分析函数的定义 函数类型函数类型 函数名函数名形参表形参表 与函数类型一致与函数类型一致 c语言课件函数 例例8.6 输出输出5之内的数字金字塔。之内的数字金字塔。 /* 输出数字金字塔输出数字金字塔 */ #include int main (void) void pyramid (int n);/* 函数声明函数声明 */ pyramid(5);/* 调用函数,输出数字金字塔调用函数,输出数字金字塔 */ return 0; void pyramid (int n) /* 函数定义函数定义 */ int i, j

17、; for (i = 1; i = n; i+) /* 需要输出的行数需要输出的行数 */ for (j = 1; j = n-i; j+) /* 输出每行左边的空格输出每行左边的空格 */ printf( ); for (j = 1; j = i; j+) /* 输出每行的数字输出每行的数字 */ printf( %d , i); /* 每个数字的前后各有一个空格每个数字的前后各有一个空格 */ putchar (n); 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 c语言课件函数 例例8.7 输入精度输入精度e,使用格里高利公式求,使用格里高利公式求的的 近似值,精确到最后一

18、项的绝对值小于近似值,精确到最后一项的绝对值小于e。 要求定义和调用函数要求定义和调用函数 funpi(e) 求求的近似值。的近似值。 7 1 5 1 3 1 1 4 c语言课件函数 /* 用格里高利公式计算用格里高利公式计算的近似值,精度为的近似值,精度为e */ #include #include int main (void) double e, pi; double funpi (double e); printf (Enter e:); scanf (%lf, pi = funpi (e); printf (pi = %fn, pi); return 0; c语言课件函数 doubl

19、e funpi (double e) int denominator, flag; double item, sum; flag = 1; denominator = 1; item = 1; sum = 0; while (fabs (item) = e) item = flag * 1.0 / denominator; sum = sum + item; flag = -flag; denominator = denominator + 2; return sum * 4; c语言课件函数 例例8.8 判断素数的函数判断素数的函数 求求100以内的全部素数,每行输出以内的全部素数,每行输出

20、10个。素数个。素数 就是只能被就是只能被1和自身整除的正整数,和自身整除的正整数,1不是素数,不是素数,2 是素数。是素数。 要求定义和调用函数要求定义和调用函数prime (m)判断判断m是否为是否为 素数,当素数,当m为素数时返回为素数时返回1,否则返回,否则返回0。 算法描述:对算法描述:对2100之间的每个数进行判断,若之间的每个数进行判断,若 是素数,则输出该数。是素数,则输出该数。 for(m = 2; m = 100; m+) if (m是素数是素数) printf(%d , m); IsPrime(m) != 0 c语言课件函数 #include #include main(

21、 ) int count = 0, m; int prime (int m); for(m = 2; m = 100; m+) if (IsPrime(m) != 0 ) printf(%6d, m ); count+; if (count %10 = 0) printf (n); printf (n); int IsPrime (int m) int i, n; if ( m = 1 ) return 0; n = sqrt (m); for( i = 2; i = n; i+) if (m % i = 0) return 0; return 1; c语言课件函数 8.5 函数的嵌套调用函数

22、的嵌套调用 main函数函数 a 函数函数 b 函数函数 调用调用a函数函数 调用调用b函数函数 结结 束束 1)2)3)4) 5) 6) 7) 8) 9) 在一个函数中再调用其它函数的情况称为函在一个函数中再调用其它函数的情况称为函 数的嵌套调用。数的嵌套调用。 如果函数如果函数A调用函数调用函数B,函数,函数B再调用函数再调用函数C, 一个调用一个地嵌套下去,构成了函数的一个调用一个地嵌套下去,构成了函数的 嵌套调用。嵌套调用。 c语言课件函数 main( ) 函数函数1函数函数2 函数函数m 函数函数 1_1 函数函数 1_2 函数函数 m_1 函数函数 m_n 程序结构程序结构 c语言

23、课件函数 使用结构化程序设计方法解决复杂的问题使用结构化程序设计方法解决复杂的问题 把大问题分解成若干小问题把大问题分解成若干小问题,小问题再,小问题再 进一步分解成若干更小的问题进一步分解成若干更小的问题 写程序时,用写程序时,用main()解决整个问题,它调解决整个问题,它调 用解决小问题的函数用解决小问题的函数 这些函数又进一步调用解决更小问题的函这些函数又进一步调用解决更小问题的函 数,从而形成函数的嵌套调用数,从而形成函数的嵌套调用 c语言课件函数 函数的顺序调用函数的顺序调用 int main(void) y = fact(3); z = mypow(3.5, 2); double

24、 fact(int n) double mypow(double x, in n) main factmypow main fact mypow c语言课件函数 函数的嵌套调用函数的嵌套调用 int main(void) cal (sel); void cal (int sel) vol_ball() double vol_ball( ) main cal vol_ball main cal vol_ball c语言课件函数 例例8.9 设计一个常用圆形体体积计算器,采用命设计一个常用圆形体体积计算器,采用命 令方式输入令方式输入1、2、3,分别选择计算球体、圆柱,分别选择计算球体、圆柱 体、

25、圆锥体的体积,并输入计算所需相应参数。体、圆锥体的体积,并输入计算所需相应参数。 分析:分析: 输入输入1、2、3选择计算选择计算3种体积,其他输入结束计算种体积,其他输入结束计算 设计一个控制函数设计一个控制函数cal(),经它辨别圆形体的类型再,经它辨别圆形体的类型再 调用计算球体、圆柱体、圆锥体体积的函数调用计算球体、圆柱体、圆锥体体积的函数 设计单独的函数计算不同圆形体的体积设计单独的函数计算不同圆形体的体积 程序解析程序解析-计算常用圆形体体积计算常用圆形体体积 c语言课件函数 3层结构,层结构,5个函数个函数 降低程序的构思、编写、调试的复杂度降低程序的构思、编写、调试的复杂度 可

26、读性好可读性好 程序结构程序结构 main( ) cal ( ) vol_ball ( )vol_cylind ( )vol_cone ( ) c语言课件函数 源程序源程序 #define PI 3.141592654 int main(void) void cal ( int sel ); int sel; while( 1 ) printf( 1-计算球体体积计算球体体积n); printf( 2-计算圆柱体积计算圆柱体积n); printf( 3-计算圆锥体积计算圆锥体积n); printf( 其他其他-退出程序运行退出程序运行n); printf(“请输入计算命令:请输入计算命令:”)

27、; scanf(%d, if (sel 3) break; /* 输入非输入非13,循环结束,循环结束 */ else cal (sel );/* 输入输入13,调用,调用cal() */ return 0; c语言课件函数 /* 常用圆形体体积计算器的主控函数常用圆形体体积计算器的主控函数 */ void cal ( int sel ) double vol_ball(void ); double vol_cylind(void ); double vol_cone(void ); switch (sel) case 1: printf(球体积为:球体积为:%.2fn, vol_ball(

28、); break; case 2: printf(圆柱体积为:圆柱体积为:%.2fn, vol_cylind( ) ); break; case 3: printf(圆锥体积为:圆锥体积为:%.2fn, vol_cone( ) ); break; /* 计算球体体积计算球体体积 V=4/3*PI*r*r*r */ double vol_ball( ) double r ; printf(请输入球的半径:请输入球的半径:); scanf(%lf, return(4.0/3.0*PI*r*r*r); /* 计算圆柱体积计算圆柱体积 V=PI*r*r*h */ double vol_cylind(

29、) double r , h ; printf(请输入圆柱的底圆半径和高:请输入圆柱的底圆半径和高:); scanf(%lf%lf, return(PI*r*r*h); /* 计算圆锥体积计算圆锥体积 V=h/3*PI*r*r */ double vol_cone( ) double r , h ; printf(请输入圆锥的底圆半径和高:请输入圆锥的底圆半径和高:); scanf(%lf%lf, return(PI*r*r*h/3.0); c语言课件函数 程序分析程序分析 int main(void) cal (sel); void cal (int sel) vol_ball(); vol

30、_cylind(); vol_cone(); double vol_ball( ) double vol_cylind( ) double vol_cone( ) main( ) cal ( ) vol_ball ( )vol_cylind ( )vol_cone ( ) c语言课件函数 注意:注意: C语句可以嵌套调用函数,但不语句可以嵌套调用函数,但不 能嵌套定义函数。能嵌套定义函数。 c语言课件函数 8.6 函数的递归调用函数的递归调用 定义:在调用一个函数的过程中又出现直接或间定义:在调用一个函数的过程中又出现直接或间 接地调用该函数本身。这是接地调用该函数本身。这是C语言的特点之一。

31、语言的特点之一。 int f(x) int x; int y,z; z=f(y); return (2*z); int f1(x) int x; int y,z; z=f2(y); return (2*z); int f2(x) int t; int a,c; c=f1(a); return (3+c); 直接调用直接调用间接调用间接调用 c语言课件函数 f函数函数 调用调用f函数函数 调用调用f1函数函数 f1函数函数 f2函数函数 调用调用f2函数函数 以上函数调用过程如下图,显然,是一个以上函数调用过程如下图,显然,是一个 无终止的递归调用。因而没有实际意义。无终止的递归调用。因而没有实

32、际意义。 为了终止递归调用,通常用为了终止递归调用,通常用if语句来进行语句来进行 控制,当条件满足时执行递归调用,否则就终控制,当条件满足时执行递归调用,否则就终 止。止。 c语言课件函数 用递归法求阶乘用递归法求阶乘n! 1 (n=0 or n=1) n!= n*(n-1)!)! (n1) 递推法递推法 公式:公式:n!=1*2*3*.*n for (result = 1, i = 1; i = n; i+) result = result * i; 递归法递归法 递归定义:递归定义: 假设函数假设函数 fact(n)的功能是求的功能是求n的阶乘的阶乘 c语言课件函数 #include d

33、ouble fact(int n); main(void) int n; scanf (%d, printf (%f, fact (n) ); 主函数主函数 c语言课件函数 递归函数递归函数 double fact(int n) double result; if (n=1 | n = 0) result = 1; else result = n * fact(n-1); return result; 1 (n=0 or n=1) n!= n *(n-1)!)! (n1) 递归出口递归出口 递归式递归式 c语言课件函数 main() fact(3) fact(2) fact(1) . . . . printf(fact(3) f=3*fact(2) f=2*fact(1) f=1 return(f) return(f) return(f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论