第六讲函数本讲主要内容函数的定义与声明标准库函数强制类型转换函数的定义与声明函数定义的一般形式:functiondefinition返回值数据类型函数名(数据类型形参1,数据类型形参2,…,数据类型形参n){变量声明,如有变量;其他语句;return(表达式);}形参可缺省,缺省时为无参函数。也可用void表明形参缺省。可为void,表明无返回数据,此时函数体不应包含return语句。缺省时,表明返回值为int。函数头函数体return表达式;传递函数的返回值函数的定义与声明--函数的定义floatadd(floatnum1,floatnum2){floatsum;sum=num1+num2;returnsum;}函数的定义与声明--函数的定义includemath.hdoublePi(void){return2*asin(1.0);}函数的定义与声明--函数的定义includestdio.hvoiddisplayChars(chars,unsignedintqty){unsignedinti;printf(“\n”);for(i=0,iqty,++i)printf(“%c”,s);printf(“\n”);}函数原形的一般形式:functionprototype1.返回值数据类型函数名(数据类型参数1,数据类型参数2,…,数据类型参数n);2.返回值数据类型函数名(数据类型,数据类型,…,数据类型);函数原形中的参数列表必需与函数定义中的形参列表保持一致:个数、顺序及各参数数据类型。常用函数的定义与声明--函数的声明函数的定义与声明--函数的声明floatadd(floatnum1,floatnum2){floatsum;sum=num1+num2;returnsum;}floatadd(floatnum1,floatnum2);函数原形:函数的定义与声明--函数的调用函数必需先定义或声明后方可使用。#includestdio.hfloatfindMax(float,float);intmain(){floatfirstnum,secnum,maxnum;printf(Enteranumber:);scanf(%f,&firstnum);printf(\nGreat!Pleaseenterasecondnumber:);scanf(%f,&secnum);maxnum=findMax(firstnum,secnum);printf(\nThemaximumofthetwonumbersenteredis%f.\n,maxnum);return0;}函数原形函数调用主调函数被调函数实参列表/*thefollowingisthefunctionfindMax*/floatfindMax(floatx,floaty)/*functionheader*/{/*startoffunctionbody*/floatmaxnum;/*variabledeclaration*/if(x=y)/*findthemaximumnumber*/maxnum=x;elsemaxnum=y;return(maxnum);/*returnthevalue*/}函数的定义与声明--函数的调用函数定义返回值形参列表函数的定义与声明--函数的调用Storingvaluesintoparameters函数的传值调用:实参向形参进行单向的数值传递。函数的定义与声明--函数的调用函数调用的执行:/*thefollowingisthefunctionfindMax*/floatfindMax(floatx,floaty){floatmaxnum;if(x=y)maxnum=x;elsemaxnum=y;return(maxnum);}#includestdio.hfloatfindMax(float,float);intmain(){floatfirstnum,secnum,maxnum;printf(Enteranumber:);scanf(%f,&firstnum);printf(\nGreat!Pleaseenterasecondnumber:);scanf(%f,&secnum);maxnum=findMax(firstnum,secnum);printf(\nThemaximumofthetwonumbersenteredis%f.\n,maxnum);return0;}函数的定义与声明--函数的调用函数的定义与声明--函数的调用按照函数在程序中出现的位置来分;作为表达式出现在任何允许表达式出现的地方,参与运算。如:a=sqrt(b);作为一条独立的语句完成特定的操作。如:gets(string1);作为函数的参数被其他函数调用。如:h=sqrt(abs(theta));函数调用的三种方式:函数的传址调用includestdio.hvoiddisplayChars(chars,unsignedintqty){unsignedinti;printf(“\n”);for(i=0,iqty,++i)printf(“%c”,s);printf(“\n”);}传值调用函数的传址调用#includestdio.hvoidsortnum(double*,double*);intmain(){doublefirstnum,secnum;printf(Entertwonumbers:);scanf(%lf%lf,&firstnum,&secnum);sortnum(&firstnum,&secnum);printf(Thesmallernumberis%6.2f,firstnum);printf(\nThelargernumberis%6.2f\n,secnum);return0;}voidsortnum(double*nm1Addr,double*nm2Addr){doubletemp;if(*nm1Addr*nm2Addr){temp=*nm1Addr;/*savefirstnum'svalue*/*nm1Addr=*nm2Addr;*nm2Addr=temp;/*changesecnum'svalue*/}return;}函数的传址调用Storingaddressesinparameters函数的传址调用Indirectlystoringfirstnum’svalue函数的传址调用Indirectlychangingfirstnum’svalue函数的传址调用Indirectlychangingsecnum’svalue#include预处理说明#define符号常量名表达式函数原形intmain(){变量定义语句;其他语句;return0;}函数定义C程序语句的排列:回顾#include预处理说明#define符号常量名表达式函数原形intmain(){变量定义语句;其他语句;return0;}函数定义C程序语句的排列:回顾函数定义的一般形式:functiondefinition返回值数据类型函数名(数据类型形参1,数据类型形参2,…,数据类型形参n){变量声明,如有变量;其他语句;return(表达式);}void回顾函数原形的一般形式:functionprototype1.返回值数据类型函数名(数据类型参数1,数据类型参数2,…,数据类型参数n);2.返回值数据类型函数名(数据类型,数据类型,…,数据类型);函数原形中的参数列表必需与函数定义中的形参列表保持一致:个数、顺序及各参数数据类型。回顾按照函数在程序中出现的位置来分;作为表达式出现在任何允许表达式出现的地方,参与运算。如:a=sqrt(b);作为一条独立的语句完成特定的操作。如:gets(string1);作为函数的参数被其他函数调用。如:h=sqrt(abs(theta));函数调用的三种方式:编程的基本知识—编程任一模块所完成的功能在C语言中,使用函数来实现模块化。编程的基本知识—编程•向printf()传递信息•printf()是一种标准输出函数,由C编译系统的系统函数库提供。编程的基本知识—编程在C语言程序中,函数main()标志着程序的开始点与结束点。回顾强制类型转换运算符:单目、2、右向左(类型)表达式floatx=5.8,y=10.31.(int)x+y2.(int)(x+y)变量的作用域变量的生命期函数的传址调用变量的作用域变量的作用域:在变量占用存储空间的时间内是否能够被引用,即变量作用的有效范围。1.局部变量/内部变量2.全局变量/外部变量变量的作用域局部变量在一个函数内部定义的变量(内部变量),它只在此函数范围内有效,在此函数以外不能被使用。局部变量的有效范围:从定义变量的位置开始直到该函数结束。形参也是局部变量。在一个函数内部,可以在复合语句中定义变量,这些变量只在该复合语句中有效。这种复合语句称为“分程序”或“程序块”。不同函数中使用同名变量?变量的作用域设置全局变量的作用是增加函数间数据联系的渠道。全局变量在函数外部定义的变量(外部变量)。全局变量的有效范围:从定义变量的位置开始直到本源文件结束。函数执行时若需要使用一个变量值,将首先查找局部变量区;找不到时,再到全局变量区查找。变量的作用域#includestdio.hintfirstnum;voidvalfun();intmain(){intsecnum;firstnum=10;secnum=20;printf(\nFrommain():firstnum=%d,firstnum);printf(\nFrommain():secnum=%d\n,secnum);valfun();printf(\nFrommain()again:firstnum=%d,firstnum);printf(\nFrommain()again:secnum=%d\n,secnum);return0;}voidvalfun(){intsecnum;secnum=30;printf(\nFromvalfun():firstnum=%d,firstnum);printf(\nFromvalfun():secnum=%d\n,secnum);firstnum=40;return;}变量的作用域Thethreestorageareascreatedbytheprogram变量的作用域#includestdio.hintfirstnum=10;voiddisplay();intmain(){intfirstnum=20;display();printf(\nFrommain():firstnum=%d\n,firstnum);return0;}voiddisplay(){printf(\nFromdisplay():firstnum=%d\n,firstnum);}变量的作用域在程序设计中,应尽量避免使用全局变量。全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。使函数的可靠性和通用性降低。使用全局变量过多,会降低程序的清晰性。变量的生命期变量的生命期:变量占用存储空间的时限,由变量的存储类型决定。C语言中,变量的存储类型符有四种:1.auto2.static3.extern4.registerC语言规定:存贮类型符放在变量定义的最前面。例:staticinta,b;变量的生命期缺省时为auto。例:autointa,b;局部变量的存储类型只允许有三种:1.auto2.static3.registerinta,b;1.auto自动局部变量的生命期:在变量定义时获取存储空间(alive);函数返回后,释放存储空间(die)。变量的生命期#includestdio.hvoidtestauto();/*functionprototype*/intmain(){intcount;/*createth