学习目标:
了解模块化程序设计的思想
掌握函数的定义、调用及原型说明的基本方法
重点:
函数的定义方法
函数的调用方法
难点:
函数参数传递与返回值
形参、实参的使用
引言:
一个较大的程序:可由若干程序模块组成,每一模块用来实现一个特定的功能。
——用子程序可实现该模块功能。
——在C语言中:子程序称为:子函数
在C程序中:可由一个主函数和若干个函数构成。
分为标准库函数和用户自定义函数
函数的作用:减少重复编写程序段的工作量。
标准库函数: 由C语言预先编写的一系列常用函数(系统提供)
Turbo C 的标准库——包含400多个常用函数
用户自定义函数:
一般自定义函数和自定义函数库(用户先已编好的)
一、函数的定义
1.函数定义的语法格式
格式: 类型定义符 函数名(形式参数表列)
{ 函数体 }
说明:1)类型定义符:函数返回值的数据类型
a) int , char , float , double 默认int
b) 函数无数据返回,使用 void 作类型定义符
2)函数名:函数的名称(用户取的:合法的标识符)
3)形式参数表列:函数调用时传递信息的通道
有两种表示方法: a)(参数说明 形式参数)
b) (形式参数)
参数说明
例: float add( float x , float y ) float add( x , y )
{ x=x+y; { float x , y ;
return (x) ; x=x+y ;
} return (x);
}
a) b)
2.函数的返回值
l 一般通过函数中的return语句获得。
l 如果不需要返回值,可以不要return语句。
为了明确表示“不带回值”,应该使用“void”定义“无类型”
例: main ( ) /*(打印平方表)*/
{ void prin
( int x ) ;
int i ;
for
( i=1 ; i<=10 ; i++) prin ( i ) ;
}
void prin ( x )
{
int x ;
printf(“%d\t%d\n”,x,x*x);
}
二、函数的调用
在一个主调函数调用一个子函数时,须把主调函数的参数传递给子函数,称该参数为“实际参数”。
实参可以是常量、变量、表达式 ,形参只能是变量
实参应和形参类型相同或相容
1.函数调用的语法格式
格式: 函数名(实参表列)
调用的过程:
1)通过函数名,找到定义的函数
2)将实际参数传递给被调函数的形式参数
实际参数与形式参数一一对应,既一一传递数据
例: main ( )
{ int i=2, p;
p=f(i, ++i) ; // f为f(3, 3) 许多C版本是按自右而左的顺序求值
printf ( “%d” , p );
}
int f(int a , b)
{ int c;
if (a>b) c=1;
else if (a= =b) c=0;
else c= -1;
return( c );
} 运行结果:0
注意:(1)应避免这种情况的产生,可写为:
①自左而右顺序 ②自右而左顺序
j=i; j=++i;
k=++i; p=f(j, j);
p=f(j, k);
(2)在printf(“ %d, %d ”,i, i++); 中同样存在
当:i=3; 结果为: 4,3
2.函数调用的几种方式
函数语句 把函数调用作为一个语句,即单独一个语句行。
不要求函数带回值,只要求函数完成一定操作。
即:printstar( );
函数表达式 函数出现在一个表达式中,要求函数带回一个确定的值以参加表达式的运算。
即:c=2*max( a, b );
函数参数 函数调用作为一个函数的实参;
即:m=max( a, max( b, c) );
三、函数的原型说明
作用:在函数使用前对函数的特征进行说明的语句。(用户自定义函数)
l 对已定义的函数的返回值进行类型说明。
l 告诉系统在本函数中将要用到的函数是什么类型。
l C语言规定:以下几种情况可以不使用函数说明
a)函数的值(函数的返回值)是整型或字符型(系统自动按整说明)
b)如果函数定义在调用函数之前,可以不必加以说明
在函数说明和函数定义中,要注意:
a)类型定义、函数名要相同
b)形式参数标识符可以不相同,在函数说明中还可以省略
例:main ( )
{
double abc ( int x , float y ) ; /*函数说明*/
/*double abc ( int , float ) ; */ /*也正确*/
/*double abc ( int a , float b) ; */ /*正确*/
---
}
double abc ( int a , float b ) /*函数定义 a,b与x,y不同*/
{
函数体
}

