c语言程序设计基础-5函数

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
据类型2 形式 参数2,…);
▪ 函数类型是该函数返回值的数据类型。如果是无值型则 表示函数没有返回值。
▪ 函数名为C语言的合法标识符。 ▪ 括号中的内容为该函数的形式参数说明。可以只有数据
类型而没有形式参数, 也可以两者都有。
20
#include <stdio.h>
main( )
{
void calc(float x,float y,char opr);
▪ ⑴当被调函数的函数定义出现在主调函数之前时。 ▪ ⑵如果已在所有函数定义之前,在函数外预先说明了各
个函数的类型。 ▪ ⑶对库函数的调用不需要再作说明,但必须把该函数的
头文件用include命令包含在源文件前面。 ▪ ⑷在Turbo C环境下,如果被调函数的返回值是整型或
字符型时,可以不对被调函数作说明。在VC环境下,即 便被调函数的返回值是整型或字符型,当被调函数的函 数定义出现在主调函数之后时,一定要先声明函数,再 使用。
#include <stdio.h>
int dif(int x, int y)
{
int z;
z = x > y ? x-y : y-x;
return( z );
}
main( )
//主函数
{
int a,b,c;
//声明部分,定义变量
printf("Please input two integers:\n"); //调用printf函数
scanf("%d,%d",&a,&b); //调用scanf函数
c=max1(a,b);
//调用max1函数
printf("max=%d\n", c);
//调用printf函数
} int max1(int x, int y)
//定义max1函数
{ int z;
if(x>y) z=x; else z=y;
第5章 函数
第5章 函数
本章内容
5.1 函数基础知识 5.2 函数原型与函数调用 5.3 函数的嵌套调用 5.4 函数的递归调用
2
第5章 函数
本章内容
5.5 调用与被调用函数间的数据传递 5.6 变量的作用域 5.7 变量的存储类别
3
5.1 函数基础知识
本节内容
5.1.1 函数的概念 5.1.2 函数的分类 5.1.3 函数的定义
❖ 函数,就是一个能够完成一定功能的执行代码段。 ❖C语言程序的所有功能都是通过函数之间的调用来
实现的。使用函数有以下优点:
▪ ①程序结构清晰,可读性好。 ▪ ②减少重复编码的工作量。 ▪ ③可多人共同编制一个大程序,缩短程序设计周期,提
高程序设计和调试的效率。
❖可以将一些重复使用的功能或操作定义成一个函 数,在其他函数中如果需要可以直接调用这个函 数,而省掉了很多重复性的工作。并且使程序结 构看起来更加简单清晰。
12
5.1.3 函数的定义
❖5.1.3.1 函数定义的形式 ❖ 函数定义也就是确定该函数应完成什么功能以及
如何实现这一功能。函数分为无参函数和有参函 数。 ❖ ⑴无参函数定义的一般格式如下所示: ❖类型标识符 函数名 ( ) ❖{ ❖ 声明部分 ❖ 语句部分 ❖}
13
5.1.3 函数的定义
❖ 说明:
▪ ②无返回值函数。此类函数用于完成某项特定的处理任 务,执行完成后不向调用者返回函数值。这类函数类似 于其它语言的过程。由于函数无须返回值,用户在定义 此类函数时可指定它的返回值为“空类型”,空类型的 说明符为“void”。
10
5.1.2 函数的分类
#include <stdio.h>
//包含预处理命令
max2(a,b);
//调用max2函数,无返回值
}
void max2(int x, int y) //定义max2函数
{ int z;
if(x>y) z=x; else z=y;
printf("max=%d\n", z); }
11
5.1.2 函数的分类
❖ ⑶从主调函数和被调函数之间数据传送的角度分类
在程序需要扩充功能的时候,用一个编好的函数 取代它。这类函数称为空函数,其定义形式为: ❖类型标识符 函数名( ) ❖{ ❖} ❖ 函数体没有任何语句,调用此函数也不能完成任 何实际操作,空函数的功能是使程序结构清晰, 需要时可以用其它函数代替。
17
5.2 函数原型与函数调用
本节内容
5.2.1 函数的原型 5.2.2 函数的参数 5.2.3 函数的调用 5.2.4 函数的返回值
数表列) ❖{ ❖ 声明部分 ❖ 语句部分 ❖}
▪ 函数名后括号中的内容是对形式参数的说明,明确指出 该函数所带形式参数的个数及各参数的类型。形式参数 表列可以为空,即定义的函数为无参函数,也可以有多 个形参,当有多个形参时,各参数之间用逗号隔开。但 无论有没有形参,函数名后的括号都不能丢掉。
15
5.1.3 函数的定义
//对被调函数calc的说明
float a,b; char opr;
printf("Input expression:");
scanf("%f%c%f",&a,&opr,&b);
calc(a,b,opr);
}
void calc(float x,float y,char opr)
//函数Βιβλιοθήκη Baidualc的定义
▪ 实参的值是在主调函数中给定的,在调用过程中将实参 的值传递给相应的形参,从而实现主调函数向被调函数 的数据传送。实参出现在主调函数中,进入被调函数后, 实参变量也不能使用。
23
5.2.2 函数的参数
❖ 形参和实参具有以下特点:
scanf("%d,%d",&a,&b); //调用scanf函数
c=dif(a,b); //调用dif函数有参,有返回值并赋给变量c
printf("dif=%d\n", c);
//调用printf函数
}
16
5.1.3 函数的定义
❖5.1.3.2 空函数 ❖ 这种函数什么也不做,只是用来占用一个位置,
❖main 函数是主函数,它可以调用其它函数,而不 允许被其它函数调用。因此,C语言程序的执行 总是从main函数开始, 完成对其它函数的调用后 再返回到main函数,最后由main函数结束整个程 序。一个C语言源程序必须有且只有一个主函数 main。
8
5.1.2 函数的分类
❖ ⑴从函数定义的角度分类
{ switch(opr) {
case '+':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x+y);return;
case '-':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x-y);return;
case '*':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x*y);return;
22
5.2.2 函数的参数
❖ 函数的参数可分为形参和实参两种。 ❖ 在定义函数时函数名后括号内的变量表列称为形
式参数表列,简称为形参。
▪ 只有在函数被调用时,该函数的形参才在内存中开辟空 间,一旦调用结束,所占用的存储空间也就随之释放。 因此,形参变量只在整个函数体内都可以使用。
❖ 调用函数时函数名后括号内的变量表列称为实在 参数表列,简称为实参。
18
5.2.1 函数的原型
❖ 编译程序在处理函数调用时,首先要获得执行被 调函数的接口信息,确认函数调用语句的正确性, 然后进入被调函数执行。因此对被调函数有以下 要求:
▪ ①被调函数必须是已经存在的用户自定义函数或者库函 数。
▪ ②如果调用的是库函数,在程序的开头必须用#include <*.h>或#include“*.h”将库函数所在头文件包含进来。 头文件以字母h为后缀,其中包含了库函数的原型说明。
▪ ③如果使用的是自定义函数,在主调函数中应对被调函 数作原型说明。通常函数原型说明放在主调函数的开始 位置或整个程序的开始。
19
5.2.1 函数的原型
❖ 在C语言程序中有两种方式可以说明函数原型。 ❖①函数类型 函数名(数据类型1,数据类型
2,… ); ❖②函数类型 函数名(数据类型1 形式参数1, 数
4
5.1 函数基础知识
C程序
源程序文件1
...
源程序文件n
函数1 ... 函数n
函数1
... 函数m
❖ 由图可以看出一个C语言程序可以包含若干个源文 件,而每个源文件又是由若干个函数构成的,因 此,也可以说函数是C语言源程序的基本模块, 程序的功能是通过对函数模块的调用来实现的。
5
5.1.1 函数的概念
▪ ①无参函数。函数定义、函数说明及函数调用中均不带参 数。主调函数和被调函数之间不进行参数传送。 此类函 数通常用来完成一组指定的功能,可以返回或不返回函数 值。如例5-2中helloworld函数,函数名后的小括号内没 有参数,即为无参函数。
▪ ②有参函数。也称为带参函数。在函数定义及函数说明时 用到的参数,称为形式参数(简称为形参)。在函数调用 时也必须给出参数,称为实际参数(简称为实参)。进行 函数调用时,主调函数将把实参的值传送给形参,供被调 函数使用。如例5-1中的max1或max2函数都有两个整型的 参数x和y。
▪ ①类型标识符和函数名合称为函数头,其中类型标识符 用于确定函数类型即该函数的返回值类型,例如整型、 实型、字符型等。省略类型标识符时默认为int类型。 函数名唯一标识函数的名称,通过函数名可实现函数的 调用。C语言中函数名必须是合法的标识符,即满足标 识符的命名规则。在很多情况下都不要求无参函数有返 回值,此时函数类型符可以写为void。
return(z ); }
7
5.1.1 函数的概念
❖ 在C语言中,所有的函数定义,包括主函数main 在内,都是平行的。也就是说,在一个函数的函 数体内不能再定义另一个函数,即不能嵌套定义。
❖但是函数之间允许相互调用,也允许嵌套调用。 习惯上把调用者称为主调函数。函数还可以自己 调用自己,称为递归调用。
▪ ①库函数。库函数由C系统提供,用户无须定义,也不 必在程序中作类型说明,只需在程序前包含该函数原型 的头文件,即可在程序中直接调用。在本书第二章对库 函数作了详细说明,在C程序中大量应用了库函数。例 如,printf 、scanf 、getchar 、putchar、gets、 puts、strcat等函数。
▪ ②由左、右大括号括起来的部分称为函数体。其中声明 部分对函数内部用到的变量以及变量的类型进行说明, 并说明该函数中所调用的函数类型。语句部分,规定函 数中要执行的语句,由C语言的基本语句组成,是函数 的核心部分。
14
5.1.3 函数的定义
❖ ⑵有参函数定义的一般格式如下所示: ❖类型标识符 函数名 (形式参数类型说明 形式参
6
5.1.1 函数的概念
#include <stdio.h> main( )
//包含预处理命令 //主函数
{
int max1(int x, int y);
//max1函数声明
int a,b,c;
//声明部分,定义变量
printf("Please input two integers:\n"); //调用printf函数
main( )
//主函数
{
void max2(int x, int y); //max2函数声明
int a,b;
//声明部分,定义变量
printf("Please input two integers:\n"); //调用printf函数
scanf("%d,%d",&a,&b); //调用scanf函数
▪ ②用户自定义函数。用户自定义函数是用户根据需要编 写的函数。用户自定义函数不仅要在程序中定义函数本 身,而且在主调函数模块中还必须对该被调函数进行类 型说明,然后才能使用。
9
5.1.2 函数的分类
❖ ⑵根据函数调用是否有返回值分类
▪ ①有返回值函数。此类函数被调用执行完后将向调用者 返回一个执行结果,称为函数返回值。如数学函数即属 于此类函数。 由用户定义的这种要返回函数值的函数, 必须在函数定义和函数说明中明确返回值的类型,如例 5-1中的max1函数,执行完后将向它的调用者(main函 数)返回z的值,并赋给变量c。
case '/':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x/y);return;
default :printf("Operator error! \n"); } }
21
5.2.1 函数的原型
❖ 实际在C语言中,如果有以下几种情况时可以在主 调函数中省去对被调函数的说明:
相关文档
最新文档