[数学]第六章 函数
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.函数被调用前,形参不占用内存;调 用结束后,形参所占用的内存将释 放。
3.实参可以是常量、变量或表达式。但 必须有确切的值。
4.实参与形参类型要匹配(顺序、类型、 个数)。否则编译时报错。如类型 不匹配,则按照赋值规则进行强制 转换。
2.实参对形参的数据传递是“值传递”, 即单向传递。它仅由参数的对应位 置确定,与名字无关。
2020/11/14
C程序设计
3.不需要返回值的函数
1)如果函数中没有使用 return语句,函数返回的 是一个不确定的数值
2020/11/14
结果:a=100 b=750
C程序设计
2)如果一个函数不需要返回值(只是表示一个过程 或完成一个操作),可以用void做类型说明
如:void p1( ) \*只是完成输出字符串, 不需要返回一个具体的值*\
1、可以把要解决的问题转化为一个新问题,而新 问题的解法与原问题相同,只是处理的对象有规 律的递增或递减。
z=x+y; return(z); }
/*函数首部,定义部分*/ /*函数体*/
2020/11/14
C程序设计
说明: 在主函数中对被调函数作类型说明,意在告诉
编译系统,本函数中将要用到的某函数的函数名, 函数类型,形参类型、个数和顺序通知编译系统, 以便让编译系统作出相应的处理。 注意:
在编程时尽量将子函数放在前面,主函数放在 最后,避免因原形未作声明而出错。
if(a>b) c=1;
p=f(i,++i);
else if(a==b) c=0; pp=rfi(ni,tjf)(;“%d”,p);}
else c=-1;
printf(“%d”,p);}
return(c);}
结果:0-1
2020/11/14
C程序设计
二、函数调用方式
1、函数表达式
一般形式为:
(3) C程序的执行从main( )函数
开始,调用其他函数后流程回
a
到main( )函数。main( )函数是 系统定义的。
(4) 所有函数都是平行的,函数 间可以互相调用,但不能调用 d e
main( )函数。 (5) 函数在使用过程中,包括函
数的定义、函数的声明和函数
的调用3个步骤。
2020/11/14
hC 程 序 设 计
main
b f gh
e
c hi
g
5
函数分类
从函数定义的角度看 1. 库函数 2. 用户定义函数
从函数值的类型看,可分为 1. 有返回值函数 2. 无返回值函数
从函数形式看,可分为: 1. 无参数函数:如getchar( ) 2. 有参数函数:如printf( )
2020/11/14
1. 被调用函数必须存在,且遵循“先定义后使用” 的原则(即在调用子函数这个调用点之前,它必 须已被定义)。
2. 如果被调用函数的定义在主调函数之后,并且不 是整型或字符型,要先进行函数“原型声明”。
2020/11/14
C程序设计
原型声明的形式为:
类型说明 函数名(参数类型,参数类型…);
注意:没有函数体。
2020/11/14
C程序设计
(int x,int y)
2020/11/14
C程序设计
二、函数的返回值
1.返回函数值的方法
1)一个函数如有返回值,必须 使用return语句,将得到的 值返回到主调函数。
2)一个函数可以有若干个 return语句,但不论执行到 哪个return语句,都将结束 函数的调用返回主调函数。
for(i=2;i<=k;i++)
scanf(“%d%d”,&m,&n);
t=t*i;
c=fac(n)/(fac(m)*fac(n-m));
return t; }
printf(“%.0f\n”,c);
2020/11/14
}
执行:5 8
结果:56
C程序设计
§6.6 函数的递归调用
递归:一个对象部分地由它自己组成或按它自己定义。 递归调用:一个函数在其函数体内调用它自身。这种函
数称为递归函数。 在递归调用中,主调函数又是被调函数
2020/11/14
C程序设计
§6.6 函数的递归调用
【例6-11】用递归法计算n!。
n!=1
(n=0,1)
n×(n-1)! (n>1 )
2020/11/14
2
1
C程序设计
§6.6 函数的递归调用
int func(int n)
/* 定义递归函数 */
式的值,并将其返回主调函数。
2020/11/14
C程序设计
2020/11/14
C程序设计
float square(x);
float
float
当实参与形参类型不一致时, 结果出错。所以在调用之前对 被调用函数类型进行声明。
或死循环
2020/11/14
C程序设计
四、对被调用函数的声明和函数原型
在程序中调用函数需满足以下条件:
3)return语句中的括号可省略;
return语句后面的值可以是
一个表达式。
2020/11/14
C程序设计
2.函数值的类型
1)函数值的类型一般应与函数的类型一致。 2)如不一致,则需要进行类型转换,只有数值型
数据可以进行类型转换。以函数类型为准,即函 数类型决定返回值的类型。 3)省略了类型说明的函数是int型的。
float a(float);
/*对函数a做声明*/
main()
{ float x=-1.2,y;
y=a(x);
printf(“x=%f, a(x)=%f\n”,x,y);
}
float a(float x)
{ return(x>0? x; -x);
}
结果:x=-1.2, a(x)=1.2
2020/11/14
C程序设计
§6.5 函数的嵌套调用
函数是相互平行的,不可嵌套定义,但可嵌套调用。 在一个函数体中又调用了其他函数。 嵌套调用形式如下:
主函数 甲函数 乙函数 丙函数
调用甲 调用乙 调用丙
return return return()
看书:P100 例 6.7 思考:用函数编程的好处
简化主程序复杂度,突出模块化的 高效率。
{ int z;
if (x>y) z=x; else z=y;
return(z);
}
2020/11/14
C程序设计
1.无参函数的定义形式
类型说明符 函数名() {函数体}
2.有参函数的定义形式
类型说明符 函数名(形式参数说明) {函数体}
3.空函数的定义形式
类型说明 函数名([形式参数表列]) { } \*空语句*\
c=2*max(a,b);
c=max(a,b); 说明: 1)这种方式用于调用有返回值的函数。函数的返
回值将参加表达式的运算。 2)不能用于void型函数
2020/11/14
C程序设计
2、函数调用语句 格式:
函数名(实参表); 如:p1( ) 说明:这种方式常用于调用无返回值的函数。
2020/11/14
这个程序,假如换一个方程求解,只需改变f(函数)
即可。通用性提高。
2020/11/14
C程序设计
例:编写求
cmn
n! m!(nm)!
分析:1. 重复三次求阶程运算
2. 编写一个求阶程函数,每次调用使用不
同的参数。 float fac(int k); {float t=1;int i;
void main() {float c; int m,n;
2020/11/14
C程序设计
§6.1 函数概述
一个较大的程序一般应分为若干个子程序,每一个子
程序用来实现一个特定的功能。 所有高级语言中都有子程
序来实现模块的功能。
在C语言中,子程序的功能是由函数来实现的.
2020/11/14
C程序设计
说明:
(1) 一个源程序文件由一个或多 个函数组成。
(2) 一个C语言程序由一个或多 个源程序文件组成。
C程序设计
3. 函数参数
一般形式为: m=max(a,max(b,c)); printf(“%d”,max(b,c); 说明: 此种调用方式是把函数作为函数的参数。
2020/11/14
C程序设计
三、函数调用的执行过程
1. 按顺序计算实参中各表达式的值。 2. 按照位置,将实参的值一一对应地传送给形参。 3. 执行被调用函数。 4. 当遇到return(表达式)语句时,计算出表达
main()
{
int n,t;
printf("input a number(n>1):");
scanf("%d",&n);
t=func(n);
input a number(n>1):4↙
4!=24
printf("%d!=%d\n",n,t);
}
2020/11/14
C程序设计
采用递归方法解决问题,必须符合以下三个条件:
换。
2020/11/14
C程序设计
注意:
不同系统中,实参的计算顺序不同,为避免由 此而引起的混乱,一般应在调用函数前计算出实 参值。Turbo c中就是从右至左求值的。
例:读程序,写结果
int f(int a,int b) { int c;
minatiin=(2) ,j,p; {j=i+n+t ii;=2,p;
main() { float add(float x,float y); /*对被调用函数的声明*/
float a,b,c; scanf(“%f,%f”,&a,&b); c=add(a,b);
printf(“sum is %f”,c); } float add(float x,float y) { float z;
实参:调用函数时,函数名后面园括号中的
参数(变量、常量、表达式)
例:在数学中定义一个函数
等价于:
f(x)=x2-1
用实参给形参 赋值。
y=f(2)
y=f(2)= 22-1=3
形参
2020/11/14
实参 C程序设计
Int x,int y
2020/11/14
C程序设计
1.定义函数时,必须说明形参的类型。 形参只能是变量或数组。
3)如一函数为void类型,就不允许再引用它的返回 值。 a=p1( ) ×
2020/11/14
C程序设计
§6.4 函数的调用
一、函数调用的一般形式 函数名(实参表列) max(a,b)
说明: 1. 如调用无参函数,实参表列可忽略,但括号不能省。 2. 实参的个数和形参一般相等。 3. 实参和形参的类型应一一对应,必要时使用类型转
2020/11/14
C程序设计
C语言中又规定Fra Baidu bibliotek以下几种情况时可以省去主调函数 中对被调函数的函数说明。
(1) 如果被调函数的返回值是整型或字符型时,可以不对被 调函数进行说明,而直接调用。 例:6.4
(2) 当被调函数的函数定义出现在主调函数之前时,在主调 函数中也可以不对被调函数再进行说明而直接调用。例 :6.2
C程序设计
§6.2 函数定义的一般形式
类型说明符 { 函数体
函数名([形式参数说明]) main() { int a,b,c; scanf(“%d,%d”,&a,&b);
}
c=max(a,b);
printf(“max=%d”,c);
形式参数说明方法: 类型说明符 变量名
} int max( int x,int y)
第六章 函数
2020/11/14
《C程序设计》
C程序设计
思考
1.我的程序有上百行,如何调试最方便? 2.我想设计一个程序完成下面的计算:
m!n!p!,其中m,n,p都为正整数, 如何设计程序最高效,最简洁?
2020/11/14
C程序设计
§6.1 函数概述 §6.2 函数定义的一般形式 §6.3 函数参数和函数返回值 §6.4 函数的调用 §6.5 函数的嵌套调用 §6.7 局部变量和全局变量 §6.8 变量的存储类别 §6.9 内部函数和外部函数
{
int s;
if(n<0) printf(“n<0,input error!”);
if(n= =1 || n= =0) s=1;
else s=n*func(n-1);
return(s); }
2020/11/14
C程序设计
/* 如果n<0,打印出错 信息 */
/* 递归调用 */
§6.6 函数的递归调用
(3) 如果在所有函数定义之前,在函数之外预先说明了各个 函数的类型,则在以后的各主调函数中,可不再对被调 函数进行说明。 P99
(4) 对库函数的调用不需要再进行说明,但必须把该函数的 头文件用include命令包含在源文件最前面
2020/11/14
C程序设计
(求绝对值的函数)
例:读程序,写结果
2020/11/14
C程序设计
函数体注意事项
2020/11/14
C程序设计
§6.3函数参数和函数返回值
结论:各函数间的信息的往来是由参数传递和
2020/11/14返回语句实现C 的程 。序 设 计
10
一、形式参数和实际参数
函数参数:用于函数间数据的传递
形参:定义函数时,函数名后面园括号中的
参数(变量、数组)
3.实参可以是常量、变量或表达式。但 必须有确切的值。
4.实参与形参类型要匹配(顺序、类型、 个数)。否则编译时报错。如类型 不匹配,则按照赋值规则进行强制 转换。
2.实参对形参的数据传递是“值传递”, 即单向传递。它仅由参数的对应位 置确定,与名字无关。
2020/11/14
C程序设计
3.不需要返回值的函数
1)如果函数中没有使用 return语句,函数返回的 是一个不确定的数值
2020/11/14
结果:a=100 b=750
C程序设计
2)如果一个函数不需要返回值(只是表示一个过程 或完成一个操作),可以用void做类型说明
如:void p1( ) \*只是完成输出字符串, 不需要返回一个具体的值*\
1、可以把要解决的问题转化为一个新问题,而新 问题的解法与原问题相同,只是处理的对象有规 律的递增或递减。
z=x+y; return(z); }
/*函数首部,定义部分*/ /*函数体*/
2020/11/14
C程序设计
说明: 在主函数中对被调函数作类型说明,意在告诉
编译系统,本函数中将要用到的某函数的函数名, 函数类型,形参类型、个数和顺序通知编译系统, 以便让编译系统作出相应的处理。 注意:
在编程时尽量将子函数放在前面,主函数放在 最后,避免因原形未作声明而出错。
if(a>b) c=1;
p=f(i,++i);
else if(a==b) c=0; pp=rfi(ni,tjf)(;“%d”,p);}
else c=-1;
printf(“%d”,p);}
return(c);}
结果:0-1
2020/11/14
C程序设计
二、函数调用方式
1、函数表达式
一般形式为:
(3) C程序的执行从main( )函数
开始,调用其他函数后流程回
a
到main( )函数。main( )函数是 系统定义的。
(4) 所有函数都是平行的,函数 间可以互相调用,但不能调用 d e
main( )函数。 (5) 函数在使用过程中,包括函
数的定义、函数的声明和函数
的调用3个步骤。
2020/11/14
hC 程 序 设 计
main
b f gh
e
c hi
g
5
函数分类
从函数定义的角度看 1. 库函数 2. 用户定义函数
从函数值的类型看,可分为 1. 有返回值函数 2. 无返回值函数
从函数形式看,可分为: 1. 无参数函数:如getchar( ) 2. 有参数函数:如printf( )
2020/11/14
1. 被调用函数必须存在,且遵循“先定义后使用” 的原则(即在调用子函数这个调用点之前,它必 须已被定义)。
2. 如果被调用函数的定义在主调函数之后,并且不 是整型或字符型,要先进行函数“原型声明”。
2020/11/14
C程序设计
原型声明的形式为:
类型说明 函数名(参数类型,参数类型…);
注意:没有函数体。
2020/11/14
C程序设计
(int x,int y)
2020/11/14
C程序设计
二、函数的返回值
1.返回函数值的方法
1)一个函数如有返回值,必须 使用return语句,将得到的 值返回到主调函数。
2)一个函数可以有若干个 return语句,但不论执行到 哪个return语句,都将结束 函数的调用返回主调函数。
for(i=2;i<=k;i++)
scanf(“%d%d”,&m,&n);
t=t*i;
c=fac(n)/(fac(m)*fac(n-m));
return t; }
printf(“%.0f\n”,c);
2020/11/14
}
执行:5 8
结果:56
C程序设计
§6.6 函数的递归调用
递归:一个对象部分地由它自己组成或按它自己定义。 递归调用:一个函数在其函数体内调用它自身。这种函
数称为递归函数。 在递归调用中,主调函数又是被调函数
2020/11/14
C程序设计
§6.6 函数的递归调用
【例6-11】用递归法计算n!。
n!=1
(n=0,1)
n×(n-1)! (n>1 )
2020/11/14
2
1
C程序设计
§6.6 函数的递归调用
int func(int n)
/* 定义递归函数 */
式的值,并将其返回主调函数。
2020/11/14
C程序设计
2020/11/14
C程序设计
float square(x);
float
float
当实参与形参类型不一致时, 结果出错。所以在调用之前对 被调用函数类型进行声明。
或死循环
2020/11/14
C程序设计
四、对被调用函数的声明和函数原型
在程序中调用函数需满足以下条件:
3)return语句中的括号可省略;
return语句后面的值可以是
一个表达式。
2020/11/14
C程序设计
2.函数值的类型
1)函数值的类型一般应与函数的类型一致。 2)如不一致,则需要进行类型转换,只有数值型
数据可以进行类型转换。以函数类型为准,即函 数类型决定返回值的类型。 3)省略了类型说明的函数是int型的。
float a(float);
/*对函数a做声明*/
main()
{ float x=-1.2,y;
y=a(x);
printf(“x=%f, a(x)=%f\n”,x,y);
}
float a(float x)
{ return(x>0? x; -x);
}
结果:x=-1.2, a(x)=1.2
2020/11/14
C程序设计
§6.5 函数的嵌套调用
函数是相互平行的,不可嵌套定义,但可嵌套调用。 在一个函数体中又调用了其他函数。 嵌套调用形式如下:
主函数 甲函数 乙函数 丙函数
调用甲 调用乙 调用丙
return return return()
看书:P100 例 6.7 思考:用函数编程的好处
简化主程序复杂度,突出模块化的 高效率。
{ int z;
if (x>y) z=x; else z=y;
return(z);
}
2020/11/14
C程序设计
1.无参函数的定义形式
类型说明符 函数名() {函数体}
2.有参函数的定义形式
类型说明符 函数名(形式参数说明) {函数体}
3.空函数的定义形式
类型说明 函数名([形式参数表列]) { } \*空语句*\
c=2*max(a,b);
c=max(a,b); 说明: 1)这种方式用于调用有返回值的函数。函数的返
回值将参加表达式的运算。 2)不能用于void型函数
2020/11/14
C程序设计
2、函数调用语句 格式:
函数名(实参表); 如:p1( ) 说明:这种方式常用于调用无返回值的函数。
2020/11/14
这个程序,假如换一个方程求解,只需改变f(函数)
即可。通用性提高。
2020/11/14
C程序设计
例:编写求
cmn
n! m!(nm)!
分析:1. 重复三次求阶程运算
2. 编写一个求阶程函数,每次调用使用不
同的参数。 float fac(int k); {float t=1;int i;
void main() {float c; int m,n;
2020/11/14
C程序设计
§6.1 函数概述
一个较大的程序一般应分为若干个子程序,每一个子
程序用来实现一个特定的功能。 所有高级语言中都有子程
序来实现模块的功能。
在C语言中,子程序的功能是由函数来实现的.
2020/11/14
C程序设计
说明:
(1) 一个源程序文件由一个或多 个函数组成。
(2) 一个C语言程序由一个或多 个源程序文件组成。
C程序设计
3. 函数参数
一般形式为: m=max(a,max(b,c)); printf(“%d”,max(b,c); 说明: 此种调用方式是把函数作为函数的参数。
2020/11/14
C程序设计
三、函数调用的执行过程
1. 按顺序计算实参中各表达式的值。 2. 按照位置,将实参的值一一对应地传送给形参。 3. 执行被调用函数。 4. 当遇到return(表达式)语句时,计算出表达
main()
{
int n,t;
printf("input a number(n>1):");
scanf("%d",&n);
t=func(n);
input a number(n>1):4↙
4!=24
printf("%d!=%d\n",n,t);
}
2020/11/14
C程序设计
采用递归方法解决问题,必须符合以下三个条件:
换。
2020/11/14
C程序设计
注意:
不同系统中,实参的计算顺序不同,为避免由 此而引起的混乱,一般应在调用函数前计算出实 参值。Turbo c中就是从右至左求值的。
例:读程序,写结果
int f(int a,int b) { int c;
minatiin=(2) ,j,p; {j=i+n+t ii;=2,p;
main() { float add(float x,float y); /*对被调用函数的声明*/
float a,b,c; scanf(“%f,%f”,&a,&b); c=add(a,b);
printf(“sum is %f”,c); } float add(float x,float y) { float z;
实参:调用函数时,函数名后面园括号中的
参数(变量、常量、表达式)
例:在数学中定义一个函数
等价于:
f(x)=x2-1
用实参给形参 赋值。
y=f(2)
y=f(2)= 22-1=3
形参
2020/11/14
实参 C程序设计
Int x,int y
2020/11/14
C程序设计
1.定义函数时,必须说明形参的类型。 形参只能是变量或数组。
3)如一函数为void类型,就不允许再引用它的返回 值。 a=p1( ) ×
2020/11/14
C程序设计
§6.4 函数的调用
一、函数调用的一般形式 函数名(实参表列) max(a,b)
说明: 1. 如调用无参函数,实参表列可忽略,但括号不能省。 2. 实参的个数和形参一般相等。 3. 实参和形参的类型应一一对应,必要时使用类型转
2020/11/14
C程序设计
C语言中又规定Fra Baidu bibliotek以下几种情况时可以省去主调函数 中对被调函数的函数说明。
(1) 如果被调函数的返回值是整型或字符型时,可以不对被 调函数进行说明,而直接调用。 例:6.4
(2) 当被调函数的函数定义出现在主调函数之前时,在主调 函数中也可以不对被调函数再进行说明而直接调用。例 :6.2
C程序设计
§6.2 函数定义的一般形式
类型说明符 { 函数体
函数名([形式参数说明]) main() { int a,b,c; scanf(“%d,%d”,&a,&b);
}
c=max(a,b);
printf(“max=%d”,c);
形式参数说明方法: 类型说明符 变量名
} int max( int x,int y)
第六章 函数
2020/11/14
《C程序设计》
C程序设计
思考
1.我的程序有上百行,如何调试最方便? 2.我想设计一个程序完成下面的计算:
m!n!p!,其中m,n,p都为正整数, 如何设计程序最高效,最简洁?
2020/11/14
C程序设计
§6.1 函数概述 §6.2 函数定义的一般形式 §6.3 函数参数和函数返回值 §6.4 函数的调用 §6.5 函数的嵌套调用 §6.7 局部变量和全局变量 §6.8 变量的存储类别 §6.9 内部函数和外部函数
{
int s;
if(n<0) printf(“n<0,input error!”);
if(n= =1 || n= =0) s=1;
else s=n*func(n-1);
return(s); }
2020/11/14
C程序设计
/* 如果n<0,打印出错 信息 */
/* 递归调用 */
§6.6 函数的递归调用
(3) 如果在所有函数定义之前,在函数之外预先说明了各个 函数的类型,则在以后的各主调函数中,可不再对被调 函数进行说明。 P99
(4) 对库函数的调用不需要再进行说明,但必须把该函数的 头文件用include命令包含在源文件最前面
2020/11/14
C程序设计
(求绝对值的函数)
例:读程序,写结果
2020/11/14
C程序设计
函数体注意事项
2020/11/14
C程序设计
§6.3函数参数和函数返回值
结论:各函数间的信息的往来是由参数传递和
2020/11/14返回语句实现C 的程 。序 设 计
10
一、形式参数和实际参数
函数参数:用于函数间数据的传递
形参:定义函数时,函数名后面园括号中的
参数(变量、数组)