C语言第8章函数.pptx
《C语言第8章函数.pptx》由会员分享,可在线阅读,更多相关《C语言第8章函数.pptx(61页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、主要内容:主要内容:1 1、函数的定义、函数的定义2 2、函数的调用(包括嵌套调用和递归调用)、函数的调用(包括嵌套调用和递归调用)4 4、局部变量和全局变量、局部变量和全局变量5 5、变量的存储类别、变量的存储类别 重点重点:1)1)如何定义函数(即如何编写函数)如何定义函数(即如何编写函数)2)2)如何调用函数(包括库函数和自定义函如何调用函数(包括库函数和自定义函数)数)第1页/共61页函数的引入函数:函数是完成某些特定功能的代码块。使用函数的优点:1)实现模块化设计:将一个大任务分解成一个个的小任务,然后每个任务分别用函数实现。2)实现“编写一次,多次调用”,避免在不同的程序中重复编写
2、相同的函数。3)便于程序调试和维护,因为每个函数之间是相互独立的。函数的分类:库函数和用户自定义函数第2页/共61页8.1 函数的定义例8.1编写函数max:求两个整数x和y中的较大数。int max(int x,int y)/*函数头*/int z=x;/*函数体*/if(xb?a:b);或 int max(a,b)int a,b;/*形参的类型在函数体前、函数名后说明*/return(ab?a:b);前者为标准格式,后者为传统格式,通常用前者。第6页/共61页4.函数体:即函数功能的具体实现。它包括两部分:说明部分和执行部分,其中说明部分包括函数中所用的局部变量等的说明、函数中要调用的函数
3、的说明。注意:函数不能嵌套定义,即函数内不能再定义函数,这样可以保证函数间是相互独立的,以实现模块化程序设计。5.5.空函数:函数类型 函数名()()调用此函数时,什么也不做。只是表明这里要 调用一个函数,而现在这个函数的功能还没实现。第7页/共61页空函数在程 序设计中常常用到的:1 1)预留函数,便于以后扩充程序功能。2 2)便于程序的模块化设计和调试:程序设计中往往根据需要确定若干模块,分别由一些函数来实现。一个大系统,需要编写很多用户函数,而这些函数不可能 也没有必要同步完成,通常足从一些基本模块开始,编写一个调试一个,对于没有编写 的函数就需要用空函数代替。从而也有利于集体创作。第8
4、页/共61页空函数举例例8.3 编写小学生算术练习系统的主程序:显示主菜单,用户选择,根据选择执行加、减、乘、除、退出5项功能之一。重复上述步骤,直至选择退出。其中主程序调用的函数有:显示主菜单函数list_menu(),加、减、乘、除、退出函数分别是add(),sub(),mul(),divide(),end().以上函数除list_menu()外此时均为空函数。程序:l8_1_4.c第9页/共61页#include stdio.h /*l8_1_4.c*/main()void add(),sub(),mul(),divide(),end(),list_menu();int n;do lis
5、t_menu();scanf(%d,&n);getchar();switch(n)case 1:add();break;case 2:sub();break;case 3:mul();break;case 4:divide();break;case 5:end();break;default:printf(n enter error,please again.);while(n!=5);第10页/共61页void list_menu()printf(n*the exercise system for primitive students*);printf(n*1.add *);printf(n
6、*2.sub *);printf(n*3.mul *);printf(n*4.divide*);printf(n*5.end *n);void add()void sub()void mul()void divide()void end()第11页/共61页问题:如何定义一个函数第一步:分析函数需要的参数,包括参数的的个数以及每个参数的类型,第二步:分析函数返回值的类型,若无返回值,则为 void。函数的返回值可看作是函数执行完后需输出的一个数据。第三步:编写函数体说明:参数和返回值是函数之间的接口,即函数之间通过参数和返回值进行通信。参数包括执行该函数时需要的数据信息,以及返回数据的有关信息
7、。第12页/共61页例如:1)求n!:要处理的数据是n,因此必须有一个参数n,类型为 int。返回值为long 型。即 long fact(int n)2)打印表头:不需输入任何数据即可执行该函数,因此无参数。执行该函数无返回值,因此函数类型为 void。即 void line()3)求两个整数m和n的最小公倍数,执行该功能时必须有两个整型参数,返回值为整型。程序:l8_1_5.c int min_multiple(int m,int n)(见下页)4)求一批整型数据(n个)中的最大值。实现该功能的函数的参数有两个:该批数据的首地址及数据的个数。返回值为一个整型数。int max(int da
8、ta,int n)第13页/共61页 /*例3:计算两个整数的最小公倍数 l8_1_5.c*/main()int m,n,min;int min_multiple(int,int);/*函数声明*/printf(n input m,n:);scanf(%d%d,&m,&n);min=min_multiple(m,n);/*函数调用*/printf(n bei shu:%d,min);int min_multiple(int x,int y)/*函数定义*/int i;i=1;while(x*i%y!=0)i+;return(x*i);第14页/共61页8.2 函数的调用重点:1、对被调函数的声
9、明2、如何调用一个函数3、主调函数和被调函数之间如何进行数据传递 例8.5 调用函数fact()求n!(n由用户输入)。分三种情况:(1)函数fact()与主函数在同一文件中,且main()在fact()前面。(2)函数fact()与主函数在同一文件中,且main在fact之后。(3)函数fact与main不再同一程序文件中。第15页/共61页main()/*(1)main()在fact()前面*/int n;long p;long fact(int);/*函数声明*/scanf(%d,&n);p=fact(n);/*函数调用*/printf(n%ld,p);long fact(int m)/
10、*函数定义*/int i;long s=1;for(i=1;i=m;i+)s*=i;return(s);/*函数返回*/结论:被调函数在后,需在主调函数中先声明后调用。第16页/共61页/*(2)主调函数在被调函数之后*/long fact(int m)/*函数定义*/int i;long s=1;for(i=1;i=m;i+)s*=i;return(s);main()int n;long p;/*不需函数声明*/scanf(%d,&n);p=fact(n);/*函数调用*/printf(n%ld,p);结论:被调函数先于主调函数被编译,因此在编译主调函数时已知被调函数的类型等信息。故不需函数
11、声明。第17页/共61页/*(3)设fact()函数存放在文件f1.c中,则编写主调函数时需用include 命令对被调函数声明*/#include main()int n;long p;scanf(%d,&n);p=fact(n);printf(n%ld,p);结论:该程序的效果与(2)相同,由此可实现将多个文件连接成一个程序。同理,对库函数的调用都要在main函数前用include命令将函数所在的头文件包含进来。第18页/共61页函数声明小结:被调函数必须是已存在的函数,通过“函数声明”告知编译系统关于被调函数的有关信息。函数声明的形式:函数类型 函数名(参数表);(注意与函数定义的区别)
12、1、若被调函数是库函数或用户已编写的函数(与主调函数不在同一文件中),则使用前需在程序的开头用include命令将被调函数的信息包含进来。2、若主调函数与被调函数在同一文件内,且主调函数在前,则必须在主调函数的说明部分或主调函数的前面对被调函数进行说明。3、以下情况下可以省略对被调函数的说明。a)函数类型为整型 b)被调函数在主调函数之前定义通常,将所有函数的说明集中在程序开头;或将所有函数的信息写入一个文件,编程时用include 命令将其包含进来即可。第19页/共61页函数的调用与返回过程小结1、函数调用的一般形式:函数名(实参表)如 p=fact(n);printf(“%d”,power
13、(2,n);等注意:实参与形参的类型、个数、顺序必须一致。2、调用过程:1)在调用函数时,首先将实参的值赋给形参;再将控制流程转到被调函数;2 2)然后执行被调函数。3 3)当被调函数执 行到returnreturn语句,或执行到被调函数函数体最后的一个大花括号时,控制流程返回到 主调函数的断点处继续执行主调函数。如果被调函数有返回值,则控制流程返回的同时将该返回值带回主调函数。第20页/共61页3、函数的返回函数返回的实现:1)函数体中通过执行return语句返回,其格式有3种:return(expression);或 return expression;或return;2)若函数体中无re
14、turn语句,当执行到函数末尾时自动返回到调用函数。注意:1)函数的返回值最多只有一个,可通过return 语句返回主调函数。2)当有多个值需要返回主调函数时,用return语句无法实现,只能通过传地址调用实现。如对数组元素排序等。第21页/共61页4.参数传递:实参与形参的结合形参:定义函数时的参数为形参,此时的参数无具体的值,仅仅表示参数的类型、个数、以及在函数体内对其如何处理。其作用是:该函数被调用时用来接收实参的值.实参;调用函数时的参数为实参,它表示该函数要处理的数据的信息,因此实参必须有确定的值。调用时,将实参的值传给形参。要求:调用函数时,实参与形参的类型、个数必须完全一致。分析
15、例8.4程序的调用过程:明确实参与形参的作用。(传值调用:单向传递)第22页/共61页例8.4以下程序企图通过调用swap函数,交换主函数中变量x和y中的数据。请观察程序的输出结果。void swap(int a,int b)int t;printf(2)a=%d b=%dn,a,b);t=a;a=b;b=t;printf(3)a=%d b=%dn,a,b);main()int x=10,y=20;printf(1)x=%d y=%dn,x,y);swap(x,y);printf(4)x=%d y=%dn,x,y);第23页/共61页程序运行结果如下:(1)x=10 y=20(2)a=10 b
16、=20(3)a=20 b=10(4)x=10 y=20 结论:参数的传递是单向的,即只能由实参传给形参,在被调函数中对形参的改变的不影响实参的值。第24页/共61页例8.12 编写函数实现:用选择法对n个整数排序。编写主函数实现数据的输入输出。分析:主程序的算法:S1:输入一批数据(个数为N),存入一维数组aa。S2:调用函数sort(),对一维数组中的数据按从小到大的顺序排序。S3:输出数组aa中的各元素。函数sort()的编写:首先,确定函数的类型:void;参数:一维数组的首地址,数据的个数,共2个;然后编写函数体,实现排序。重点:分析参数的传递,比较传值与传地址的区别,各有何用处?(图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 函数
限制150内