1、Chap 5 函数,5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数,本章要点,怎样定义函数?如何调用函数?如何声明函数? 什么是函数的参数?在函数调用时,参数是如何传递的? 在使用函数的过程中,要注意哪些问题?怎样确定函数的参数? 如何使用局部变量和全局变量? 什么是静态变量?,5.1 计算圆柱体积,5.1.1 程序解析 5.1.2 函数的定义 5.1.3 函数的调用,5.1.1 程序解析计算圆柱体积,例5-1 输入圆柱体的高和半径,求圆柱体积,volume=*r2*h。要求定义和调用函数cylinder (r, h )计算圆柱体的体积。,例5-1源程序,/* 计算圆柱体积
2、 */ #include int main( void ) double height, radius, volume; double cylinder (double r, double h); /* 函数声明*/printf (“Enter radius and height: “); scanf (“%lf%lf“, ,例5-1源程序,/* 定义求圆柱体积的函数 */ double cylinder (double r, double h) double result;result =3.1415926 * r * r * h; /* 计算体积 */return result; /* 返
3、回结果 */ ,Enter radius and height: 3.0 10 Volume = 282.743,5.1.2 函数的定义,函数是指完成一个特定工作的独立程序模块。 库函数:由C语言系统提供定义 如scanf()、printf()等函数 自定义函数:需要用户自己定义 如计算圆柱体体积函数cylinder() main()也是一个函数,C程序由一个main()或多个函数构成。 程序中一旦调用了某个函数,该函数就会完成一些特定的工作,然后返回到调用它的地方。 函数经过运算,得到一个明确的运算结果,并需要回送该结果。例如,函数cylinder()返回圆柱的体积。 函数完成一系列操作步骤
4、,不需要回送任何运算结果。,1返回运算结果的函数定义,函数类型 函数名(形参表) /* 函数首部 */ /* 函数体 */函数实现过程return 表达式; ,把函数运算的结果回送给主函数,只能返回一个值,函数返回值的类型,没有分号,double cylinder (double r, double h) double result;result = 3.1415926 * r * r * h; return result; ,形参,类型1 参数1 ,类型2 参数2 ,类型n 参数n 参数之间用逗号分隔,每个参数前面的类型都必须分别写明,函数类型 函数名(形参表)函数实现过程return 表达
5、式; ,不能写成 double r, h,double cylinder (double r, double h) double result;result =3.1415926 * r * r * h; return result; ,double cylinder (double r, double h) /* 函数首部 */ /* 函数体,写在一对大括号内 */double result;result =3.1415926 * r * r * h; /* 计算圆柱体积 */return result; /* 返回运算结果*/ ,分析函数的定义,函数类型,函数名,形参表,与函数类型一致,2
6、不返回运算结果的函数定义,void 函数名(参数表) /* 函数首部 */ /* 函数体 */函数实现过程return; /* 可以省略return */ ,这类函数通常用于屏幕输出等,表示不返回结果,不能省略 否则 函数类型被默认定义为int,例5-2 输出5之内的数字金字塔。,/* 输出数字金字塔 */ #include int main (void) void pyramid (int n); /* 函数声明 */pyramid(5); /* 调用函数,输出数字金字塔 */return 0; void pyramid (int n) /* 函数定义 */ int i, j;for (i
7、= 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 23 3 34 4 4 4 5 5 5 5 5,5.1.3 函数的调用,定义一个函数后,就可以在程序中调用这个函数。调用标准库函数时,在程序的最前面用#include命令包含相应的头文件。 调用自定义函数时,程序中必须有与调用函数相对应的函数定义
8、。,1函数调用的形式和过程,使用返回值: volume = cylinder (radius, height ); printf(“%f n” , cylinder (radius, height ); 完成操作: pyramid(5);,常用于void类型函数的调用,常用于返回结果的函数的调用,常量、变量、表达式,函数名(实参表),函数调用的过程,计算机在执行程序时,从主函数main开始执行,如果遇到某个函数调用,主函数被暂停执行,转而执行相应的函数,该函数执行完后,将返回主函数,然后再从原先暂停的位置继续执行。函数遇return或最后的大括号,返回主函数,分析函数调用的过程,#includ
9、e int main( void ) double height, radius, volume; double cylinder (double r, double h);printf (“Enter radius and height: “); scanf (“%lf%lf“, ,调用函数,实参形参,执行函数中的语句,返回调用它的地方,2参数传递,函数定义时的参数被称为形式参数(简称形参) double cylinder (double r, double h); 函数调用时的参数被称为实际参数(简称实参) volume = cylinder (radius, height);实参形参 在
10、参数传递过程中,实参把值复制给形参。 形参和实参一一对应:数量一致,类型一致,顺序一致 形参:变量,用于接受实参传递过来的值 实参:常量、变量或表达式,单向传递,3函数结果返回,函数返回的两种情况 完成确定的运算,有一个运算结果返回给主调函数。 完成指定工作,没有确定的运算结果需返回给主调函数(函数类型void)。 函数结果返回的形式: return 表达式; return (表达式);,【例5-3】定义判断奇偶数的函数even (n),定义一个判断奇偶数的函数even (n),当n为偶数时返回1,否则返回0。/* 判断奇偶数的函数 */ int even (int n) /* 函数首部 */
11、 if(n%2 = 0) /* 判别奇偶数 */return 1; /* 偶数返回1 */else return 0; /* 奇数返回0 */ ,如何调用该函数?,4函数原型声明,函数类型 函数名(参数表); double cylinder (double r, double h); void pyramid (int n); 函数必须先定义后调用,将主调函数放在被调函数的后面,就像变量先定义后使用一样。 如果自定义函数在主调函数的后面,就需要在函数调用前,加上函数原型声明。 函数声明:说明函数的类型和参数的情况,以保证程序编译时能判断对该函数的调用是否正确。,只写函数定义中的第1行(函数首部
12、),并以分号结束。,5.2 使用函数编写程序,例5-4 输入精度e,使用格里高利公式求的近似值,精确到最后一项的绝对值小于e。要求定义和调用函数 funpi(e) 求的近似值。,例5-4 源程序,/* 用格里高利公式计算的近似值,精度为e */ #include #include int main (void) double e, pi;double funpi (double e); printf (“Enter e:“);scanf (“%lf“, ,double funpi (double e) int denominator, flag; double item, sum;flag =
13、 1; denominator = 1;item = 1.0; sum = 0; while (fabs (item) = e) item = flag * 1.0 / denominator;sum = sum + item;flag = -flag; denominator = denominator + 2; return sum * 4; ,Enter e: 0.0001 pi = 3.1418,课堂练习,编写函数求100以内的全部素数,每行输出10个。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。要求定义和调用函数prime (m)判断m是否为素数,当m为素数时返回1,否
14、则返回0。,参考程序,#include #include int main(void) int count, m; int prime (int m);count = 0;for(m = 2; m = 100; m+) if ( prime(m) != 0 ) printf(“%6d“, m ); count+; if (count %10 = 0) printf (“n“);printf (“n“); ,int prime (int m) int i, n;if ( m = 1 ) return 0; n = sqrt (m);for( i = 2; i = n; i+) if (m % i
15、 = 0) return 0; return 1; ,5.3 变量与函数,局部变量和全局变量,局部变量 在函数内定义的变量(包括形参) 作用范围:本函数内部 定义在复合语句内的变量 作用范围:复合语句内部 全局变量 在函数以外定义的变量,不从属于任一函数。 作用范围:从定义处到源文件结束(包括各函数),例5-6 在复合语句中定义局部变量。,#include int main (void) int a;a = 1; /* 复合语句开始 */int b = 2;b = a + b; a = a + b; /* 复合语句结束 */printf (“%d “ , a );return 0; ,b:小范
16、围内的临时变量,4,例5-7 全局变量定义,#include “stdio.h“ int x; /* 定义全局变量x */ int f( ) int x = 4; /* x为局部变量 */return x; int main(void) int a = 1; x = a; /* 对全局变量 x 赋值 */a = f( ); /* a的值为4 */int b = 2; b = a + b; /* b的值为4 */x = x + b; /* 全局变量运算 */printf(“%d %d“ , a, x);return 0; ,4, 7,若局部变量与全局变量同名,局部变量优先,变量作用范围示例,in
17、t x=1; void main( ) int a=2;int b=3;f( ); int t=4 ; void f( ) int x=5, b=6;. int a=7;,x=? a=? b=?,b=?,x=5 b=6 t=4 a没定义,x=? b=? t=? a=?,本章作业,作业5-1 输入x,定义函数计算下列分段函数f(x)的值。,作业5-2 读入一个整数,统计并输出该数中数字“2”的个数。要求定义并调用函数countdigit(long number,char digit),它的功能是统计长整数number中数字digit的个数。例如countdigit(10090,0)的返回值是3。作业5-3 定义一函数is(int number) 判断number是否为素数,