LectC06chap05函数变量存储类别生命周期作用范围.ppt_第1页
LectC06chap05函数变量存储类别生命周期作用范围.ppt_第2页
LectC06chap05函数变量存储类别生命周期作用范围.ppt_第3页
LectC06chap05函数变量存储类别生命周期作用范围.ppt_第4页
LectC06chap05函数变量存储类别生命周期作用范围.ppt_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

Chap 5 函数 5.1 计算圆柱体积 5.2 数字金字塔 5.3 复数运算 本章要点 n函数的作用?如何确定函数功能? n怎样定义函数?如何调用函数?定义函数与声 明函数有何区别? n什么是函数的参数?怎样确定函数的参数? n在函数调用时,参数是如何传递数据的? n变量与函数有什么关系?如何使用局部变量和 全局变量? n什么是静态变量? 5.1 计算圆柱体积 n5.1.1 程序解析 n5.1.2 函数的定义 n5.1.3 函数的调用 n5.1.4 函数程序设计 5.1.1 程序解析计算圆柱体积 例5-1 输入圆柱体的高和半径,求圆柱体积 ,volume=*r2*h。 要求定义和调用函数cylinder (r, h )计算圆 柱体的体积。 例5-1源程序 /* 计算圆柱体积 */ #include int main( void ) double height, radius, volume; double cylinder (double r, double h); /* 函数声明*/ printf (“Enter radius and height: “); scanf (“%lf%lf“, /* 调用函数,返回值赋给volume */ volume = cylinder (radius, height ); printf (“Volume = %.3fn“, volume); return 0; 例5-1源程序 /* 定义求圆柱体积的函数 */ double cylinder (double r, double h) double result; result =3.1415926 * r * r * h; /* 计算体积 */ return result; /* 返回结果 */ Enter radius and height: 3.0 10 Volume = 282.743 例5-1源程序 #include int main( void ) double height, radius, volume; double cylinder (double r, double h); /* 函数声明*/ printf (“Enter radius and height: “); scanf (“%lf%lf“, volume = cylinder (radius, height ); printf (“Volume = %.3fn“, volume); return 0; double cylinder (double r, double h) double result; result =3.1415926 * r * r * h; return result; Enter radius and height: 3.0 10 Volume = 282.743 问题: 函数是如何运行的? 5.1.2 函数的定义 n函数是指完成一个特定工作的独立程序模块。 库函数:由C语言系统提供定义 如scanf()、printf()等函数 自定义函数:需要用户自己定义 如计算圆柱体体积函数cylinder() nmain()也是一个函数,C程序由一个main()或多个 函数构成。 n程序中一旦调用了某个函数,该函数就会完成特定 的计算,然后返回到调用它的地方。 函数经过运算,得到一个明确的运算结果,并需要回送该 结果。例如,函数cylinder()返回圆柱的体积。 5.1.2 函数定义 函数类型 函数名(形参表)/* 函数首部 */ /* 函数体 */ 函数实现过程 return 表达式; 把函数运算的结果回送给主函数 只能返回一个值 函数返回值的类型 没有分号 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; /* 返回运算结果*/ 分析函数的定义 函数类型 函数名形参表 与函数类型一致 形参 类型1 参数1 ,类型2 参数2 ,类型n 参数n 参数之间用逗号分隔,每个参数前面的类型都必须分别写明 函数类型 函数名(形参表) 函数实现过程 return 表达式; 不能写成 double r, h double cylinder (double r, double h) double result; result =3.1415926 * r * r * h; return result; 5.1.3 函数的调用 n定义一个函数后,就可以通过程序来调用这 个函数。 n调用标准库函数时,在程序的最前面用 #include命令包含相应的头文件。 n调用自定义函数时,程序中必须有与调用函 数相对应的函数定义。 1函数调用的形式 n函数调用的一般形式为: 函数名(实际参数表) n对于实现计算功能的函数,函数调用通常出 现在两种情况: 赋值语句 volume = cylinder(radius, height ); 输出函数的实参 printf(“%f”, cylinder(radius, height ) ); 2. 函数调用的过程 n计算机在执行程序时,从主函数main开始 执行,如果遇到某个函数调用,主函数被 暂停执行,转而执行相应的函数,该函数 执行完后,将返回主函数,然后再从原先 暂停的位置继续执行。 n函数遇return返回主函数 分析函数调用的过程 #include int main( void ) double height, radius, volume; double cylinder (double r, double h); printf (“Enter radius and height: “); scanf (“%lf%lf“, volume = cylinder (radius, height ); printf (“Volume = %.3fn“, volume); return 0; double cylinder (double r, double h) double result; result =3.1415926 * r * r * h; return result; 调用函数 实参形参 执行函数中的语句 返回调用它的地方 3参数传递 n函数定义时的参数被称为形式参数(简称形参) double cylinder (double r, double h); n函数调用时的参数被称为实际参数(简称实参) volume = cylinder (radius, height); n参数传递:实参形参 在参数传递过程中,实参把值复制给形参。 形参和实参一一对应:数量一致,类型一致,顺序一致 形参:变量,用于接受实参传递过来的值 实参:常量、变量或表达式 单向传递 4函数结果返回 n完成确定的运算,将运算结果返回给主调函 数。 n函数结果返回的形式: return 表达式; return (表达式); 【例5-2】定义判断奇偶数的函数even (n) 定义一个判断奇偶数的函数even (n),当n为偶数时返回1,否 则返回0。 /* 判断奇偶数的函数 */ int even ( int n )/* 函数首部 */ if( n%2 = 0 ) /* 判别奇偶数 */ return 1;/* 偶数返回1 */ else return 0;/* 奇数返回0 */ 如何调用该函数? #include int main( void ) int x,sum=0 ; 。 if (even(x)=1) sum=sum+x ; printf(“%d”, sum); return 0; 5函数原型声明 函数类型 函数名(参数表); double cylinder (double r, double h); void pyramid (int n); n函数必须先定义后调用,将主调函数放在被调函 数的后面,就像变量先定义后使用一样。 n如果自定义函数在主调函数的后面,就需要在函 数调用前,加上函数原型声明。 n函数声明:说明函数的类型和参数的情况,以保 证程序编译时能判断对该函数的调用是否正确。 只写函数定义中的第1行(函数首部),并以分号结束。 5.1.3 函数调用 小结: 在执行函数调用时,实参把值计算出来,拷贝 给相应位置的形参;函数执行完后,通过 return( ),可返回一个结果值。 实参与形参 有多个实参时 形参的改变 个数相同、类型一致 后面的先计算 不影响实参 变量的值 只能返回一个结果, 类型与函数定义时一致 要调用函数, 必须先要声明! 5.1.4 函数程序设计 例5-3 输入精度e,使用格里高利公式求的 近似值,精确到最后一项的绝对值小于e。 要求定义和调用函数 funpi(e) 求的近似 值。 什么做 参数? 例5-4 源程序 /* 用格里高利公式计算的近 似值,精度为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; double funpi (double e) int denominator, flag; double item, sum; flag = 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 例5-4 判断素数的函数 例5-5 求100以内的全部素数,每行输出10个。素 数就是只能被1和自身整除的正整数,1不是素数 ,2是素数。 要求定义和调用函数prime (m)判断m是否为 素数,当m为素数时返回1,否则返回0。 n算法描述:对2100之间的每个数进行判断,若 是素数,则输出该数。 for(m = 2; m #include int main( void ) int count, m; int prime (int m); count = 0; for( m = 2; m int main (void) void pyramid (int n);/* 函数声明 */ pyramid(5);/* 调用函数,输出数字金字塔 */ return 0; void pyramid (int n) /* 函数定义 */ int i, j; for (i = 1; i float result_real, result_imag; /* 全局变量,用于存放函数结果 */ int main(void) float imag1, imag2, real1, real2; /* 两个复数的实、虚部变量 */ /* 函数声明 */ void complex_prod(float real1, float imag1, float real2, float imag2); void complex_add(float real1, float imag1, float real2, float imag2); printf(“Enter 1st complex number(real and imaginary): “); scanf(“%f%f“, /* 输入第一个复数 */ printf(“Enter 2nd complex number(real and imaginary): “); scanf(“%f%f”, /* 输入第二个复数 */ complex_add(real1, imag1, real2, imag2); /* 求复数之和 */ printf(“addition of complex is %f+%fin“, result_real, result_imag); complex_prod(real1, imag1, real2, imag2); /* 求复数之积 */ printf(“product of complex is %f+%fin“, result_real, result_imag); return 0; 运行结果 Enter 1st complex number(real and imaginary):1 1 Enter 2nd complex number(real and imaginary):-2 3 addition of complex is -1.000000+4.000000i product of complex is -5.000000+1.000000i void complex_add(float real1, float imag1, float real2, float imag2) result_real = real1 + real2; result_imag = imag1 + imag2; void complex_prod(float real1, float imag1, float real2, float imag2) result_real = real1*real2 - imag1*imag2; result_imag = real1*imag2 + real2*imag1; 5.3.2 局部变量和全局变量 n局部变量 在函数内定义的变量(包括形参) 作用范围:本函数内部 定义在复合语句内的变量 作用范围:复合语句内部 n全局变量 在函数以外定义的变量,不从属于任一函数。 作用范围:从定义处到源文件结束(包括各函数) 例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:小范围内的临时变量 输出: 4 改成b会如何? 例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 变量作用范围示例 int 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=? n【例5-8】 用函数实现财务现金记账。先输入操作类型(1 收入,2支出,0结束),再输入操作金额,计算 现金剩余额,经多次操作直到输入操作为0结 束。要求定义并调用函数,其中现金收入与现 金支出分别用不同函数实现。 n分析: 设变量cash保存现金余额值,由于它被主函数 、现金收入与现金支出函数共用,任意使用场 合其意义与数值都是明确和唯一的,因此令其 为全局变量。 #include float cash;/* 定义全局变量,保存现金余额 */ int main(void) int choice; float value; void income(float number), expend(float number);/* 函数声明 */ cash = 0;/* 初始金额=0 */ printf(“Enter operate choice(0-end, 1-income, 2-expend):“); scanf(“%d“, /* 输入操作类型 */ while (choice != 0)/* 若输入类型为0,循环结束 */ if (choice = 1 | choice = 2) printf(“Enter cash value:“); /* 输入操作现金额 */ scanf(“%f“, if (choice = 1) income(value); /* 函数调用,计算现金收入 */ else expend(value); /* 函数调用,计算现金支出 */ printf(“current cash:%.2fn“, cash); printf(“Enter operate choice(0-end, 1-income, 2-expend):“); scanf(“%d“, /* 继续输入操作类型 */ return 0; /* 定义计算现金收入函数 */ void income(float number) cash = cash + number;/* 改变全局变量cash */ /* 定义计算现金支出函数 */ void expend(float number) cash = cash - number;/* 改变全局变量cash */ Enter operate choice(0-end, 1-income, 2-expend):1 Enter cash value:1000 current cash:1000.000000 Enter operate choice(0-end, 1-income, 2-expend):2 Enter cash value:456 current cash:544.000000 Enter operate choice(0-end, 1-income, 2-expend):0 5.3.2 局部变量和全局变量 n讨论 全局变量比局部变量自由度大,更方便 ? n引起注意 对于规模较大的程序,过多使用全局变量会带来 副作用,导致各函数间出现相互干扰。如果整个 程序是由多人合作开发,各人都按自己的想法使 用全局变量,相互的干扰可能会更严重。 因此在变量使用中,应尽量使用局部变量,从某 个角度看使用似乎受到了限制,但从另一个角度 看,它避免了不同函数间的相互干扰,提高了程 序质量。 n变量生命周期 变量从定义开始分配存储单元,到运行结束存储单元被回收 的整个过程。 n自动变量(auto): 普通的局部变量 int x, y; auto int x, y; char c1; auto char c1; 函数调用时,定义变量,分配存储单元。 函数调用结束

温馨提示

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

评论

0/150

提交评论