C语言看不懂形参实参以及调用方法的必看

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

函数的调用与返回过程小结
1、函数调用的一般形式: 函数名(实参表) 如 p=fact(n); printf(“%d”,power(2,n));等 注意:实参与形参的类型、个数、顺序必须一致。 2、调用过程: 1)在调用函数时,首先将实参的值赋给形参;再将控制流 程转到被调函数; 2)然后执行被调函数。 3)当被调函数执 行到return语句,或执行到被调函数函数 体最后的一个大花括号时,控制流程返回到 主调函数的断点 处继续执行主调函数。如果被调函数有返回值,则控制流程 返回的同时将该返回值带回主调函数。
Fra Baidu bibliotek
4. 参数传递:实参与形参的结合 形参:定义函数时的参数为形参,此时的参数无具 体的值,仅仅表示参数的类型、个数、以及在函数 体内对其如何处理。 其作用是:该函数被调用时用来接收实参的值. 实参;调用函数时的参数为实参,它表示该函数要 处理的数据的信息,因此实参必须有确定的值。调 用时,将实参的值传给形参。 要求:调用函数时,实参与形参的类型、个数必须完 全一致。 分析例8.4程序的调用过程:明确实参与形参的作用。 (传值调用:单向传递)

#include "stdio.h" /*l8_1_4.c*/ main() { void add(),sub(),mul(),divide(),end(),list_menu(); int n; do{ list_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); }
空函数在程 序设计中常常用到的: 1)预留函数,便于以后扩充程序功能。 2)便于程序的模块化设计和调试:程序设计中往 往根据需要确定若干模块,分别由一些函数来实 现。一个大系统,需要编写很多用户函数,而这 些函数不可能 也没有必要同步完成,通常足从一 些基本模块开始,编写一个调试一个,对于没有 编写 的函数就需要用空函数代替。从而也有利于 集体创作。
/*(3)设fact()函数存放在文件f1.c中,则编写主调函数时需用 include 命令对被调函数声明*/ #include <f1.c> main() {int n; long p; scanf("%d",&n); p=fact(n); printf("\n %ld",p); } 结论:该程序的效果与(2)相同,由此可实现将多个文件 连接成一个程序。 同理,对库函数的调用都要在main函数前用include命令将函 数所在的头文件包含进来。
例8.2:设某程序中需多次用到打印表头(如下所示) 的功能,该功能用函数实现: void line( ) { printf("\n ********************"); printf("\n* score list *"); printf("\n ********************"); } 本例中,函数的类型: void,函数名为line,函数无参 数。 该函数无返回值,所以函数类型为void型。
8.2

函数的调用
重点: 1、对被调函数的声明 2、如何调用一个函数 3、主调函数和被调函数之间如何进行数据传递 例8.5 调用函数fact( )求n!(n由用户输入)。 分三种情况: (1)函数fact()与主函数在同一文件中,且main( )在fact()前面。 (2)函数fact()与主函数在同一文件中,且main在fact之后。 (3)函数fact与main不再同一程序文件中。
/*例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); }
/* (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); } 结论:被调函数先于主调函数被编译,因此在编译主调函数 时已知被调函数的类型等信息。故不需函数声明。
4.函数体:即函数功能的具体实现。 它包括两部分: 说明部分和执行部分,其中说明部分 包括函数中所用的局部变量等的说明、函数中要调用 的函数的说明。 注意: 函数不能嵌套定义,即函数内不能再定义函数,这样可 以保证函数间是相互独立的,以实现模块化程序设计。 5.空函数: 函数类型 函数名( ) { } 调用此函数时,什么也不做。只是表明这里要 调用一 个函数,而现在这个函数的功能还没实现。
void list_menu() {printf("\n **the exercise system for primitive students***"); printf("\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() { }
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) /*函数定义*/ { int i; long s=1; for(i=1;i<=m;i++) s*=i; return(s); /*函数返回*/ } 结论:被调函数在后,需在主调函数中先声明后调用。
函数声明小结:
被调函数必须是已存在的函数,通过“函数声明”告知编 译系统关于被调函数的有关信息。 函数声明的形式:函数类型 函数名(参数表); (注意与函数定义的区别) 1、若被调函数是库函数或用户已编写的函数(与主调函数不 在同一文件中),则使用前需在程序的开头用include命令 将被调函数的信息包含进来。 2、若主调函数与被调函数在同一文件内,且主调函数在前, 则必须在主调函数的说明部分或主调函数的前面对被调函 数进行说明。 3、以下情况下可以省略对被调函数的说明。 a)函数类型为整型 b)被调函数在主调函数之前定义 通常,将所有函数的说明集中在程序开头;或将所有函数的 信息写入一个文件,编程时用include 命令将其包含进来即 可。
3. 形式参数:形参是函数被调用时用于接收实参值的变量。 根据实际需要可有可无。没有形参时,圆括号也不可省;多个参 数之间应用逗号分隔。参数包括参数名和参数类型。 形参的类型说明可有如下两种格式: int max(int a,int b) /*形参的类型在形参表中直接说明*/ { return (a>b?a:b);} 或 int max(a,b) int a,b; /*形参的类型在函数体前、函数名后说明*/ { return(a>b?a:b); } 前者为标准格式,后者为传统格式,通常用前者。
问题:如何定义一个函数 第一步:分析函数需要的参数,包括参数的的个数 以及每个参数的类型, 第二步: 分析函数返回值的类型,若无返回值, 则为 void。 函数的返回值可看作是函数执行完后需输出的一个 数据。 第三步:编写函数体 说明: 参数和返回值是函数之间的接口,即函数之间通过 参数和返回值进行通信。参数包括执行该函数时 需要的数据信息,以及返回数据的有关信息。
第8章 函数
主要内容:
1、函数的定义 2、函数的调用(包括嵌套调用和递归调用) 4、局部变量和全局变量 5、变量的存储类别 重点: 1)如何定义函数(即如何编写函数)
2)如何调用函数(包括库函数和自定义函 数)
函数的引入
函数:函数是完成某些特定功能的代码块。 使用函数的优点: 1)实现模块化设计:将一个大任务分解成一个个的 小任务,然后每个任务分别用函数实现。 2)实现“编写一次,多次调用”,避免在不同的程 序中重复编写相同的函数。 3)便于程序调试和维护,因为每个函数之间是相互 独立的。 函数的分类:库函数和用户自定义函数

例如: 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 data[ ], int n) { }

3、函数的返回

函数返回的实现: 1)函数体中通过执行return语句返回,其格式有3种: return( expression); 或 return expression ; 或 return; 2)若函数体中无return语句,当执行到函数末尾时自 动返回到调用函数。 注意: 1)函数的返回值最多只有一个,可通过return 语句返回 主调函数。 2)当有多个值需要返回主调函数时,用return语句无法 实现,只能通过传地址调用实现。如对数组元素排 序等。

函数定义的一般形式如下: 函数类型 函数名(类型名 形式参数1,类型名 形式参 数2,…) { 说明部分 语句部分 } 1.函数名:是该函数的唯一标识符,一般函数的命名 最好做到“见名知义”。 2.函数类型:函数的返回值的类型。 当函数无返回值时,规定其类型为: void。 当函数返回值为 int 时,函数类型可以省略。

8.1 函数的定义
例8. 1编写函数max:求两个整数x和y中的较大数。 int max (int x, int y) /*函数头*/ { int z=x; /*函数体{……}*/ if (x<y) z=y; return z; } main() { int a, b, d; printf("input a and b:"); scanf{"%d %d", &a, &b}; d=max(a, b); /*函数调用*/ printf("max is:%d", d); }
空函数举例 例8.3 编写小学生算术练习系统的主程序: 显 示主菜单,用户选择,根据选择执行加、减、 乘、除、退出5项功能之一。 重复上述步骤,直至选择退出。 其中主程序调用的函数有:显示主菜单函数 list_menu(),加、减、乘、除、退出函数分别是 add(), sub(), mul(),divide(), end(). 以上函数除 list_menu()外此时均为空函数。 程序:l8_1_4.c
相关文档
最新文档