C语言程序设计:5 函数_第1页
C语言程序设计:5 函数_第2页
C语言程序设计:5 函数_第3页
C语言程序设计:5 函数_第4页
C语言程序设计:5 函数_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、第第5章章 函函 数数主要内容主要内容计算圆柱体积计算圆柱体积数字金字塔数字金字塔复数运算复数运算 本章要点本章要点为什么要用函数为什么要用函数怎样定义怎样定义函数函数、怎样、怎样调用调用函数函数定义函数与声明函数有何定义函数与声明函数有何区别区别函数的参数如何确定、参数如何传递函数的参数如何确定、参数如何传递简单变量作为函数的参数时的参数传递简单变量作为函数的参数时的参数传递变量的作用范围变量的作用范围- -全局与局部变量全局与局部变量静态变量的特点静态变量的特点例例5-1:输入高和半径,计算圆柱体体积:输入高和半径,计算圆柱体体积n要求:要求:调用调用cylinder ()函数函数计算圆柱

2、体的体积。计算圆柱体的体积。#include void main( ) double h, r, v; double cylinder (double r, double h); /函数声明函数声明 scanf (%lf%lf, &r , &h );v = cylinder (r , h );printf (体积体积 = %.3fn, v);double cylinder (double r, double h ) double volume;volume = 3.1415926 * r * r * h; return volume; /* 返回结果返回结果 */double

3、cylinder (double r, double h ) double volume;result = 3.1415926 * r * r * h; /* 计算体积计算体积 */return volume; /* 返回结果返回结果 */n自定义函数自定义函数n函数定义函数定义n形式参数说明形式参数说明类型类型 函数名函数名( ( 形式参数说明形式参数说明 ) ) 函数体函数体 类型类型 变量变量1 ,1 ,类型类型 变量变量22注意:注意:不能不能写为写为:double cylinder(double r, h )类型若缺省,类型若缺省,默认为默认为int型型n说明说明q若函数类型若函数类

4、型不为不为void,则须用,则须用return返回结果返回结果(一个值一个值)q若若return(表达式表达式)中结果与函数类型不同,则系统自动中结果与函数类型不同,则系统自动将结果将结果按函数类型按函数类型进行转换。进行转换。n函数调用函数调用q函数名函数名(实参列表实参列表)n说明说明q实参应具有确定的值,可为实参应具有确定的值,可为常量常量、变量变量或或表达式表达式。q实参实参个数个数、类型类型和和顺序顺序须与函数的形参说明保持。须与函数的形参说明保持。问题:计算圆柱体积问题:计算圆柱体积 printf( (max=%d,max(a,b); ; c=max(a, b)*10; m=max

5、( a, max( b, c);.#include double cylinder (double r, double h) double volume; result=3.14*r*r*h; return volume;void main( ) double r, h, v; printf(r,h:); scanf(%lf,%lf,&r, &h); v = cylinder (r, h); printf(体积=%.3lfn, v); rhv函数调用的内部机制函数调用的内部机制n实例演示:实例演示:rhvolume12126.286.28 n给被调用函数的给被调用函数的形参变量

6、形参变量和函数中定义的局部变量和函数中定义的局部变量分配内存空间分配内存空间;n将将实参值实参值按照对应的顺序关系按照对应的顺序关系赋给形参变量赋给形参变量;n被调用函数开始执行;被调用函数开始执行;n被调用函数被调用函数返回运算结果返回运算结果;n被调用函数的被调用函数的形参变量形参变量和其中定义的和其中定义的局部变量局部变量所占所占内存内存空间被释放空间被释放(回收回收)。函数调用的内部机制函数调用的内部机制n函数函数调用的执行轨迹调用的执行轨迹q沿函数调用方向深入执行,调用结束后沿函数调用方向深入执行,调用结束后“原路原路”返回。返回。q例如:例如:void main( ) A( );

7、void A( ) B( ); 函数调用的内部机制函数调用的内部机制void B( ) 结束结束例题:使用素数判断函数求从例题:使用素数判断函数求从100开始的前开始的前100个素数。个素数。#include stdio.h#include math.hint isprime(int n) /判断整数判断整数n是否为素数?是否为素数? int i,flag=1; /是则返回是则返回1,否则返回否则返回0 if(n2) ; else for(i=2; ; i+)if( n%i=0) flag=0; break; ; void main() int n=100,count=0; while(cou

8、nt100) if( isprime(n) /若若n为素数为素数 count+;printf(第第%d个素数:个素数:%dn,count,n); n+; flag=0i=sqrt(n)return flagn函数原型声明的作用函数原型声明的作用qC语言要求函数:语言要求函数:先定义、后使用先定义、后使用;q通知编译器被调用函数的基本信息,以便编译器能通知编译器被调用函数的基本信息,以便编译器能进行进行函数调用的合法性检查函数调用的合法性检查。被调用函数的原型声明被调用函数的原型声明n函数函数原型声明原型声明的一般形式的一般形式q类型名类型名 函数名函数名(形式参数列表形式参数列表) ;n函数原

9、型声明的位置函数原型声明的位置q函数被调用之前。函数被调用之前。如:如:int IsPrime(int x); 第第5章章 函函 数数主要内容主要内容计算圆柱体积计算圆柱体积数字金字塔数字金字塔复数运算复数运算 例例5-5:数字金字塔:数字金字塔n输出如图所示的数字金字塔输出如图所示的数字金字塔。n要求:设计要求:设计pyramid (int n) : 显示显示n行行 数字金字塔数字金字塔n程序程序#include int main( ) int n; void pyramid (int n ); /函数声明函数声明 printf(请输入金字塔的行数请输入金字塔的行数(1-9):); scan

10、f (%d, &n );pyramid( n ); /调用调用pyramid()函数函数return 0; 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 n分析分析q每次只能显示每次只能显示1行,要显示行,要显示n行,故使行,故使用循环用循环(i=1; i=n; i+)来实现,来实现,i 表示表示行号。行号。q第第 i 行的内容由行的内容由空格空格和和数字数字符号组成,符号组成,其中空格其中空格: 个,字符:个,字符: 个。个。q由于每次只能显示一个字符(空格或由于每次只能显示一个字符(空格或数字),所以数字),所以空格空格和和数字数字的显示也需的显示也需要分别使用循环来

11、实现。要分别使用循环来实现。q每行结束时需要显示一个每行结束时需要显示一个 。问题:数字金字塔问题:数字金字塔 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 n - ii换行符换行符void pyramid( int n) n程序程序(续续)int i, j; for( i=1 ;i=n ; i+ ) /显示显示n行行 问题:数字金字塔问题:数字金字塔for( j=1; j= n-i; j+) /显示空格显示空格 printf( );for( j=1; j= i; j+) /显示数字显示数字 printf(%d , );printf(n); /行尾显示换行行尾显示换行i不返回值的

12、函数不需要不返回值的函数不需要return语句。语句。函数与模块化程序设计函数与模块化程序设计n对于复杂系统的设计,人们常自顶向下将一个大的对于复杂系统的设计,人们常自顶向下将一个大的程序按功能分割成多个较小的程序按功能分割成多个较小的功能模块功能模块,每个功能每个功能模块又包含模块又包含1 1到多个函数到多个函数。mainabcfghdei模块模块1 1模块模块3 3模块模块2 2n模块化设计时须遵循模块独立性原则模块化设计时须遵循模块独立性原则q模块之间通过参数传递信息,模块内模块之间通过参数传递信息,模块内慎用全局变量慎用全局变量。q每个模块只有每个模块只有一个入口一个入口和和一个出口一

13、个出口。第第5章章 函函 数数主要内容主要内容计算圆柱体积计算圆柱体积数字金字塔数字金字塔复数运算复数运算 问题:复数运算问题:复数运算n要求:要求:分别输入分别输入2个复数的实部与虚部,用函数个复数的实部与虚部,用函数 实现计算实现计算2个复数之和与之积。个复数之和与之积。n分析分析q若若2个复数分别为:个复数分别为:c1=x1+y1i i , c2=x2+y2i i,q则有:则有:c1+c2 = (x1+x2) + (y1+y2)i ic1*c2 = (x1*x2-y1*y2) + (x1*y2+x2*y1)i i #include float result_r, result_i ; /

14、全局变量,用于保存函数结果全局变量,用于保存函数结果void complex_add( float r1, float i1, float r2, float i2);void complex_prod( float r1, float i1, float r2, float i2);void main( ) float real1, imag1, real2, imag2; /局部变量局部变量 printf(输入复数输入复数1:); scanf(%f,%f, &real1, &imag1 ); printf(输入复数输入复数2:); scanf(%f,%f, &rea

15、l2, &imag2 ); complex_add(real1, imag1, real2, imag2); /复数加法复数加法 printf(和值和值=%f+%f i,result_r, result_i); complex_prod(real1, imag1, real2, imag2);/复数乘法复数乘法 printf(乘积乘积=%f+%f i,result_r, result_i);n程序:程序:问题:复数运算问题:复数运算void complex_add( float r1, float i1, float r2, float i2) result_r = r1 + r2;

16、result_i = i1 + i2;void complex_prod( float r1, float i1, float r2, float i2) result_r = r1 * r2 i1 * i2; result_i = r1 + i2 + r2 * i1;n程序程序(续续)问题:复数运算问题:复数运算n函数函数只能返回一个值只能返回一个值,若函数结果不止一个,则可,若函数结果不止一个,则可使用使用全局变量全局变量保存其结果,从而能在保存其结果,从而能在被调用函数之被调用函数之外外通过全局变量获得之前的运算结果。通过全局变量获得之前的运算结果。局部变量与全局变量局部变量与全局变量n

17、局部变量局部变量q函数函数内部内部定义的变量(包括函数定义的变量(包括函数形式参数形式参数)。)。q局部变量的有效使用范围只限于其所在的局部变量的有效使用范围只限于其所在的函数内函数内。q一个函数一个函数不能直接访问不能直接访问另一函数内的局部变量,只能另一函数内的局部变量,只能通过函数调用时的通过函数调用时的参数传递参数传递实现函数之间数据的实现函数之间数据的单向单向交流交流( 主调用函数主调用函数-被调用函数被调用函数 )。q使用局部变量可避免各函数之间变量的相互干扰,即:使用局部变量可避免各函数之间变量的相互干扰,即:不同函数内的同名局部变量不同函数内的同名局部变量分别代表不同的对象。分

18、别代表不同的对象。qC语言允许在复合语句内定义仅在该语言允许在复合语句内定义仅在该复合语句内有效复合语句内有效的局部变量。的局部变量。n全局变量全局变量q定义于函数外定义于函数外而不属于任何函数的变量。而不属于任何函数的变量。q全局全局变量变量的有效范围:的有效范围:定义的位置开始定义的位置开始一直到其所在一直到其所在的的文件结束处文件结束处。q函数内的函数内的局部变量局部变量可以与函数外定义的可以与函数外定义的全局变量同名全局变量同名,但它们分别代表不同的对象,但它们分别代表不同的对象,函数内只有局部变量有函数内只有局部变量有效效。q全局变量一般用于表示全局变量一般用于表示多个函数可共享多个

19、函数可共享的某一数据对的某一数据对象,程序设计中要避免滥用全局变量。象,程序设计中要避免滥用全局变量。局部变量与全局变量局部变量与全局变量n功能:先输入操作类型功能:先输入操作类型(1收入,收入,2支出,支出,0结束结束),再,再输入操作金额,计算现金剩余额,经多次操作直到输入操作金额,计算现金剩余额,经多次操作直到输入操作为输入操作为0结束。结束。n要求:定义并调用函数,其中现金收入与现金支出要求:定义并调用函数,其中现金收入与现金支出分别用分别用不同函数实现不同函数实现。n分析:分析:q设变量设变量cash保存现金余额值。保存现金余额值。q由于由于cash被主函数、现金收入与现金支出函数被

20、主函数、现金收入与现金支出函数共用共用,且其在不同函数中代表着同一个数据对象,因此令其且其在不同函数中代表着同一个数据对象,因此令其为为全局变量全局变量。 例题:用函数实现财务记账例题:用函数实现财务记账n程序程序例题:用函数实现财务记账例题:用函数实现财务记账#include float cash; /定义全局变量,保存现金余额定义全局变量,保存现金余额void income(float num) /收入记账函数收入记账函数 cash = cash + num; /改变全局变量改变全局变量cash void expend(float num) /现金支出函数现金支出函数 cash = cas

21、h - num; / 改变全局变量改变全局变量cashvoid main(void) int choice; float value; cash = 0; /初始金额初始金额=0 printf(0-end, 1-income, 2-expend:); scanf(%d, &choice); / 输入操作类型输入操作类型n程序程序(续续)例例5-8:用函数实现财务记账:用函数实现财务记账while (choice != 0) if (choice = 1 | choice = 2) printf(value:); /输入操作现金额输入操作现金额 scanf(%f, &value)

22、; if (choice = 1) income(value); /调用函数收入记账调用函数收入记账 else expend(value); /调用函数支出记账调用函数支出记账 printf(current cash:%.2fn, cash); printf(0-end, 1-income, 2-expend:); scanf(%d, &choice); 变量的生命周期和静态局部变量变量的生命周期和静态局部变量n变量的生命周期变量的生命周期q变量从定义开始分配存储单元,到运行结束存储单元变量从定义开始分配存储单元,到运行结束存储单元被回收的整个过程。被回收的整个过程。n说明说明q函数函数只有在被调用时,其只有在被调用时,其局部变量局部变量(含形参含形参)才被分配才被分配存储单元,调用结束时释放存储单元,调用结束时释放(收回收回)存储单元。存储单元。qmain()函数函数中的中的局部变量局部变量从从main()函数开始执行时分函数开始执行时分配存储单元,直到配存储单元,直到main()函函数执行结束才释放。数执行结束才释放。q全局变量全局变量与具体与具体函数无关函数无关,它们在,它们在程序执行时程序执行时就分配就分配存储单元,直到整个程序执行结束才释

温馨提示

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

评论

0/150

提交评论