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