1、1第5讲 函数 函数的定义及调用2主要内容函数函数无参无返回值函数无参无返回值函数有参无返回值函数有参无返回值函数有参有返回值函数有参有返回值函数函数间数据传递函数间数据传递整数类型整数类型整数变量的定义整数变量的定义整数的运算整数的运算整数的输入和输出整数的输入和输出整数在函数间传递整数在函数间传递P84P95第4章函数用户自定义函数4.2.1 函数定义函数定义 函数是指完成一个特定工作的独立程序模块。函数是指完成一个特定工作的独立程序模块。库函数:由库函数:由C语言系统提供定义。如语言系统提供定义。如scanf()等函数等函数自定义函数:用户根据需要定义。如自定义函数:用户根据需要定义。如
2、cylinder()函数函数main()是一个主函数,是一个主函数,C程序由一个程序由一个main()或多个函数构成或多个函数构成程程序序中中一一旦旦调调用用了了某某个个函函数数,该该函函数数就就会会完完成成特特定定功功能能,然然后后返返回回到到调调用用它它的的地地方方。除除主主函函数数外外一一般般函函数数都不能单独运行。都不能单独运行。函函数数经经过过运运算算,得得到到一一个个明明确确结结果果,并并需需要要回回送送该该结结果果有返回值函数有返回值函数。例,函数。例,函数cylinder()返回圆柱的体积。返回圆柱的体积。函函数数完完成成一一系系列列操操作作步步骤骤,不不需需要要回回送送任任何
3、何运运算算结结果果无无返回值函数返回值函数:1.无参无参无返回值函数无返回值函数2.有有参参无返回值函数无返回值函数P25一般有参一般有参用户自定义函数用户自定义函数函数定义:编制独立功能的程序函数定义:编制独立功能的程序函数声明函数声明:主调函数调用前声明:主调函数调用前声明函数调用函数调用:主调函数调用被调用函数:主调函数调用被调用函数函数执行函数执行:运行被调用函数:运行被调用函数注:注:不能独立运行不能独立运行45写自己的函数用户自定义函数写自己的函数用户自定义函数 void triangle(void)printf(*n);printf(*n);printf(*n);无返回值函数无返
4、回值函数void函数的作用仅仅是执行函数的作用仅仅是执行一系列的指令一系列的指令打印 1.无参无参无返回值无返回值函数定义函数定义 P87一般形式一般形式void 函数名函数名(void)函数体函数体6void 函数名函数名()函数体函数体void triangle(void)printf(*n);printf(*n);printf(*n);void triangle()printf(*n);printf(*n);printf(*n);或或P4无参无返回值的函数的声明无参无返回值的函数的声明 P87一般形式:一般形式:void 函数名函数名(void);void triangle(void);
5、主调函数主调函数告诉编译系统用户自定义函数的存在告诉编译系统用户自定义函数的存在编译系统在检查被调函数时要知道调用信息包括:编译系统在检查被调函数时要知道调用信息包括:函数名,参数,返回类型。函数名,参数,返回类型。仅仅声明了仅仅声明了“函数名函数名”7P4无参无返回值的函数的调用无参无返回值的函数的调用一般形式:函数名一般形式:函数名();上例:上例:triangle();写一个主函数,调用写一个主函数,调用“triangle”函数,打印函数,打印图形。图形。#include void main(void)void triangle();/*函数声明函数声明*/triangle();void
6、 triangle()printf(*n);printf(*n);printf(*n);8P4/*a program to output a triangle*/#include void triangle(void);main()printf(About to print a trianglen);triangle();printf(That was it!n);void triangle(void)printf(*n);printf(*n);printf(*n);9例:例:SAMPLE01_04.C函数声明(主函数前)函数声明(主函数前)p84(2)函数调用函数调用函数定义函数定义调用自定
7、义函数,调用自定义函数,()中可不包括任何内中可不包括任何内容,但容,但()一定要写。一定要写。可放在可放在main函数之前,也可放在函数之前,也可放在main函数的后面。但不能放在函数的后面。但不能放在main函数的函函数的函数体中,函数和函数之间地位是平等的,数体中,函数和函数之间地位是平等的,没有嵌套关系。只有嵌套调用。没有嵌套关系。只有嵌套调用。告诉编译器,存在这样一个用告诉编译器,存在这样一个用户自定义的函数,及它的调用户自定义的函数,及它的调用方法:名称、参数、返回值。方法:名称、参数、返回值。主主调调函函数数被被调调函函数数预处理预处理10执行流程执行流程程序的执行顺序程序的执行
8、顺序从从main函数开始执行,函数开始执行,执行完执行完main函数即结函数即结束执行。束执行。遇到调用函数,转向执遇到调用函数,转向执行被调函数,执行完被行被调函数,执行完被调函数后,返回调用函调函数后,返回调用函数的调用处,继续向下数的调用处,继续向下执行。执行。程序的书写顺序程序的书写顺序与执行顺序有关顺与执行顺序有关顺序执行。序执行。分支或循环会改变顺序分支或循环会改变顺序函数的书写顺序函数的书写顺序与执行顺序无关与执行顺序无关函数定义若写在函数调函数定义若写在函数调用之前,用之前,函数声明函数声明可省可省略,但不主张。略,但不主张。#include void main(void)vo
9、id triangle();triangle();void triangle()printf(*n);printf(*n);printf(*n);#include void triangle()printf(*n);printf(*n);printf(*n);void main(void)triangle();11完成画简图(完成画简图(女孩女孩)的程序)的程序打印图形打印图形女孩女孩房子房子男孩男孩12SAMPLE01_03.C完成画完成画基本组件基本组件的函数的函数画一个圆画一个圆画一个横线画一个横线画一个平行线画一个平行线画一个交叉线画一个交叉线完成画完成画三角形三角形的函数的函数画一个
10、交叉线画一个交叉线画一个横线画一个横线在在main函数中调用子函数中调用子函数完成画小函数完成画小女孩女孩画一个圆画一个圆画三角形画三角形画一个交叉画一个交叉线13完成画基本组件的函数完成画基本组件的函数/*Draw a circle*/void draw_circle(void)printf(*n);printf(*n);printf(*n);Draw 绘画绘画 Circle 圆圆/*Draw intersecting lines*/void draw_intersect(void)/*Use 2 s to print 1*/printf(/n);printf(/n);printf(/n);
11、intersecting lines相交线相交线 14完成画基本组件的函数完成画基本组件的函数/*Draws a base line*/void draw_base(void)printf(-n);base line基(横)线基(横)线/*Draw a parallel*/void draw_parallel(void)printf(|n);printf(|n);Parallel 平行线平行线 15完成画三角形的函数完成画三角形的函数/*Draws a triangle*/void draw_triangle(void)draw_intersect();/*画相交线*/draw_base();
12、/*画横线*/画小女孩画小女孩#include /*function prototypes*/void draw_circle(void);/圆void draw_intersect(void);/相交线 void draw_base(void);/横线 void draw_triangle(void);/三角形int main(void)/*Draw a circle*/draw_circle();/*Draw a triangle*/draw_triangle();/*Draw intersecting lines*/draw_intersect();return 0;Function 函
13、数函数 Prototype 原型原型 17执行示例执行示例main(画女孩)画圆画三角形画交叉线画交叉线画横线18思考思考 main函数中三条语句函数中三条语句功能还不明显,可增功能还不明显,可增加一个函数加一个函数draw_girl 画小女孩画小女孩请修改程序请修改程序画女孩画圆画三角形画交叉线画交叉线画横线main19画小女孩函数画小女孩函数/*Draws a girl */void draw_girl(void)/*Draw a circle.*/draw_circle();/*Draw a triangle.*/draw_triangle();/*Draw intersecting l
14、ines.*/draw_intersect();20完成画小女孩程序完成画小女孩程序#include/*function prototypes*/void draw_circle(void);void draw_intersect(void);void draw_base(void);void draw_triangle(void);void draw_girl(void);int main(void)draw_girl();return 0;21改错题 ERROR1_6.Cvoid main()printstar;sayHello(void);printstar;void printStar
15、(void)printf(“*”);void sayHello(void)printf(“hello world!”);P2#include void main()void printStar(void);void sayHello(void);printStar();sayHello();printStar();void printStar(void)printf(*);void sayHello(void)printf(hello world!);2.有参无返回值函数定义P87void 函数名(形参表)/*函数首部*/函数实现过程 /*函数体*/return;/*可以省略return*/注
16、:这类函数通常用于屏幕输出等注:这类函数通常用于屏幕输出等表示不返回结果表示不返回结果不能省略不能省略否则,函数类型被默认定义为否则,函数类型被默认定义为int参数参数参数的作用参数的作用实现值的传递实现值的传递主调函数向被调函数传递值主调函数向被调函数传递值实际参数实际参数(实参),被调函数处理所需要的数据。(实参),被调函数处理所需要的数据。函数调用函数调用被调函数向主调函数传递值被调函数向主调函数传递值形式参数形式参数(形参),被调函数向主调函数传递被调函(形参),被调函数向主调函数传递被调函数运行结果的数据。数运行结果的数据。函数定义函数定义3.有参有返回值函数定义 程序解析计算圆柱体
17、积【例】输入圆柱体的高h和半径r,求圆柱体积,volume=*r2*h。要求定义并调用函数cylinder(r,h)计算圆柱体的体积。cylinder圆柱体 volume体积 /*计算圆柱体积*/1.#include 2.int main(void)3.4.double height,radius,volume;5.double cylinder(double r,double h);/*函数声明*/6./*函数类型 函数名 类型 名称 类型 名称*/7./*实参表 */8.printf(Enter radius and height:);9.scanf(%lf%lf,&radius,&hei
18、ght);10./*调用函数,返回值赋给volume*/11.volume=cylinder(radius,height);12.printf(Volume=%.3fn,volume);13.return 0;14.【例】源程序CYLINDER函数/*函数定义:求圆柱体积*/double cylinder(double r,double h)/*函数类型 函数名 类型 名称 类型 名称*/*形参表 */double result;result=3.1415926*r*r*h;/*计算体积*/return result;/*返回结果*/Enter radius and height:3.0 10
19、Volume=282.743注:主函数完成输入输出注:主函数完成输入输出1返回运算结果的函数定义函数类型 函数名(形参表)/*函数首部*/函数实现过程 /*函数体*/return 表达式;将函数运算的结果回送给主调函数将函数运算的结果回送给主调函数注:注:只能返回一个值只能返回一个值函数返回值的类型函数返回值的类型注:没有分号注:没有分号double cylinder(double r,double h)double result;result=3.1415926*r*r*h;return result;函数定义形参类型1 参数1,类型2 参数2,类型n 参数n参数之间用逗号分隔,每个参数前面
20、的类型都必须分别声明函数类型函数类型 函数名(函数名(形参表形参表)函数实现过程函数实现过程 return 表达式;表达式;不能写成不能写成 double r,hdouble cylinder(double r,double h)double result;result=3.1415926*r*r*h;return result;P2课堂练习:定义判断奇偶数的函数课堂练习:定义判断奇偶数的函数EVEN(N)int even(int n)/*函数首部*/if(n%2=0)/*判别奇偶数*/return 1;/*偶数返回1*/elsereturn 0;/*奇数返回0*/分析:分析:功能:判断奇偶数
21、功能:判断奇偶数形式参数:整数形式参数:整数n返回值:当返回值:当n为偶数时返回为偶数时返回1,否则返回,否则返回0。函数类型函数类型 函数名函数名(参数表参数表););void triangle(void);void pyramid(int n);double cylinder(double r,double h);函数必须先定义后调用。函数必须先定义后调用。如果自定义函数在主调函数的后面,就需要在函数调用前,如果自定义函数在主调函数的后面,就需要在函数调用前,加上加上函数原型声明函数原型声明。函数声明:说明函数的类型和参数的情况,以保证程序编函数声明:说明函数的类型和参数的情况,以保证程序
22、编译时能判断对该函数的调用是否正确。书写位置:译时能判断对该函数的调用是否正确。书写位置:写在写在“mainmain”里,函数体开始位置。里,函数体开始位置。写在写在“mainmain”前。前。在主调函数前在主调函数前函数(原型)声明注:只写函数定义中的第注:只写函数定义中的第1 1行(函数首部),并以分号结束。行(函数首部),并以分号结束。无参无返回值函数声明有参无返回值函数声明有参有返回值函数调用P89函数定义后,可以在其它函数中调用该函数;或自函数定义后,可以在其它函数中调用该函数;或自己调用自己嵌套调用。己调用自己嵌套调用。调用调用C标准库函数时,在程序的最前面用标准库函数时,在程序的
23、最前面用#include命令包含相应的头文件。如:命令包含相应的头文件。如:#include 调用自定义函数时,程序中必须有与调用函数相对调用自定义函数时,程序中必须有与调用函数相对应的应的函数声明函数声明。double cylinder(double r,double h);volume=cylinder(radius,height);函数调用1.函数调用的形式和过程函数调用的形式和过程使用(带)返回值:使用(带)返回值:volume=cylinder(radius,height);printf(“%f n”,cylinder(radius,height);完成操作(无返回值):完成操作(无
24、返回值):pyramid(5);/有参有参triangle();/无参无参常用于常用于voidvoid类型函数的调用类型函数的调用常用于有返回结果的函数的调用常用于有返回结果的函数的调用常量、变量、表达式常量、变量、表达式函数名函数名(实参表实参表)函数调用的过程计计算算机机在在执执行行程程序序时时,从从主主函函数数main开开始始执执行行,如如果果遇遇到到某某个个函函数数调调用用,暂暂停停执执行行主主函函数数,转转而而执执行行相相应应的的被被调调函函数数,该该函函数数执执行行完完后后,将将返返回回主主函函数数,然然后后再再从从原原先暂停的位置继续执行。先暂停的位置继续执行。函函数数遇遇ret
25、urn或或最最后后的的大大括括号,返回主函数。号,返回主函数。示意图#include int main(void)double height,radius,volume;double cylinder(double r,double h);printf(Enter radius and height:);scanf(%lf%lf,&radius,&height);volume=cylinder(radius,height);printf(Volume=%.3fn,volume);return 0;double cylinder(double r,double h)double result;r
26、esult=3.1415926*r*r*h;return result;调用调用函数函数实参实参形参形参执行函数中的语句执行函数中的语句返回调用它的地方返回调用它的地方函数函数声明声明;结束结束函数函数定义空格结束定义空格结束分析函数调用的过程2.参数传递P91函数函数定义定义时的参数时的参数形式参数形式参数(简称(简称形参形参)double cylinder(double r,double h);函数函数调用调用时的参数时的参数实际参数实际参数(简称(简称实参实参)volume=cylinder(radius,height);为为形参形参分配存储单元分配存储单元实参实参形参形参的的单向传递,
27、单向传递,实参实参把值复制给把值复制给形参形参实参实参:常量、变量或表达式:常量、变量或表达式形参形参:变量,用于接受实参传递过来的值:变量,用于接受实参传递过来的值形参形参和和实参实参一一对应:数量、类型和顺序均一致一一对应:数量、类型和顺序均一致调用结束后调用结束后释放释放形参形参存储单元;保留存储单元;保留实参实参存储单元(值)存储单元(值)3.返回函数运行结果P94函数返回的两种情况函数返回的两种情况完成确定运算,并返回该运算结果返回给主调函数。完成确定运算,并返回该运算结果返回给主调函数。完完成成指指定定工工作作,没没有有确确定定的的运运算算结结果果需需返返回回给给主主调调函函数数(
28、函数类型(函数类型void)。)。函数返回结果的一般形式:函数返回结果的一般形式:return 表达式;表达式;如,如,return result;return (表达式表达式);如,;如,return(3.1415926*r*r*h);先求先求“表达式表达式”值,再返回值,再返回“表达式值表达式值”return语句语句结束函数运行结束函数运行带着运行结果返回主调函数带着运行结果返回主调函数double cylinder(double r,double h)return 3.1415926*r*r*h;double cylinder(double r,double)double result;
29、result=3.1415926*r*r*h;return result;课堂练习:课堂练习:1、请定义能够判断一整数奇偶性的函数、请定义能够判断一整数奇偶性的函数EVEN(N)。2、用户从键盘输入一个整数,主函数通过调用、用户从键盘输入一个整数,主函数通过调用EVEN(N)函数判断该数的奇偶性,并将判断结果打印输出。函数判断该数的奇偶性,并将判断结果打印输出。1.#include 2.int even(int n)/*函数首部函数首部*/3.if(n%2=0)/*判别奇偶数判别奇偶数*/4.return 1;/*偶数返回偶数返回1*/5.elsereturn 0;/*奇数返回奇数返回0*/6.7.8.void main()9.int num,result;10.printf(n请输入一个整数:请输入一个整数:);11.scanf(%d,&num);12.result=even(num);13.if(result=1)14.printf(该数为偶数。该数为偶数。);15.else printf(该数为奇数。该数为奇数。);16.