第八章 函数
高等数学第八章多元函数积分学
D
证:f (x, y)d
y
D
d
f1(x) f2(y)dxdy
c
D
bd
dx ac
f1(x)
f2(y)dy
0a
bx
b
d
d
b
a[f1(x) c f2(y)d]ydxc f2(y)dy af1(x)d.x
.
比如, 1dx3xyed y1xd x 3eyd.y
y
xydxdy
1
dx
1x2
xydy
D
00
11x(1x2)dx1(x2x4)11. 1
02
22 4 0 8
D
本 题 若 先 对 x 积 分 , 解 法 类 似 . O x 1
x
.
例4
改变积分
01dx
1
0
x
f
( x,
y )dy 的次序.
解 积分区域为 y
0x1, D:
1
0y1x.
0x1y, D:
f (x, y)d
b
d
a dxc f(x,y)dy
D
d
b
c dya f(x,y)dx
(2)如果被积函数 f (x, y) = f1(x)·f2(y),且积分区域是矩
形区域,则
f(x,y)da bf1(x)dxcdf2(y)d.y
D
.
设D:a x b, c y d. f (x, y) = f1(x)·f2(y)可积,
y
4
2
yx
D2 D1
D D 1D 2.
D1 :
2 x4, 2 y x.
离散数学-第八章函数
例8.5 对于以下各题给定的A,B和f,判断是否构成函 数f:A→B。如果是,说明 f:A→B是否为单射,满 射,双射的,并根据要求进行计算。 (1) A={1,2,3,4,5}, B={6,7,8,9,10}, f={<1,8>,<3,9>,<4,10>,<2,6>,<5,9>} 能构成函数f:A→B,但f:A→B既不是单射也不是 满射的。 (2) A,B同(1),f={<1,7>,<2,6>,<4,5>,<1,9>,<5,10>}
令f:A→B,使得f()=f0,f({1})=f1,f({2})=f2,f({3})=f3, f({1,2})=f4,f({1,3})=f5,f({2,3})=f6,f({1,2,3})=f7
(2) A=[0,1],B=[1/4,1/2]
令f:[0,1]→[1/4,1/2],f(x)=(x+1)/4. (3) A=Z,B=N 将Z中元素以下列顺序排列并与N中元素对应:
例8.1 设 F1={<x1,y1>,<x2,y2>,<x3,y2>} F2={<x1,y1>,<x1,y2>} 判断它们是否为函数。 解:F1是函数,F2不是函数。
因为对应于x1存在y1和y2满足x1F2y1和x1F2y2, 与函数定义矛盾。
F 是函数(映射) 对于x1,x2∈A, 如果x1=x2 ,一定有f(x1)=f(x2)。即, 如果对于x1,x2∈A有f(x1) ≠f(x2),则一定有x1≠x2
函数是集合,可以用集合相等来定义函数的相等
定义8.2 设F,G为函数,则 F=G F G∧G F 由以上定义可知,如果两个函数F和G相等,一 定满足下面两个条件: 1.domF=domG 2. x∈domF=domG都有F(x)=G(x)
《C程序设计》(第三版)第8章 函数(嵌套及递归调用)
递归算法必须有结束递归条件,否则会产生死机现象! 递归算法必须有结束递归条件,否则会产生死机现象!
11
2.递归函数的执行过程
【例】编一递归函数求n!。 编一递归函数求 。
思路:以求 的阶乘为例 的阶乘为例: 思路:以求4的阶乘为例 4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。 , , , , 。 递归结束条件: 递归结束条件:当n=1或n=0时,n!=1。 或 时 。 递归公式: 递归公式:
2
(4)函数fun的功能是计算x2-2x+6,主函数中将调用fun函数计算: (4)函数 函数fun的功能是计算 2x+6,主函数中将调用fun函数计算 的功能是计算x 函数计算: y1=(x+8)2-2(x+8)+6 y2=sin2x-2sinx+6 请填空。 请填空。 #include<math.h> fun(double x) double ; main() { double x,y1,y2; scanf(“%lf”,&x); x+8 y1=fun( ); sin(x) ); y2=fun( printf(“y1=%lf,y2=%lf\ printf(“y1=%lf,y2=%lf\n”,y1,y2); } double fun(double x) { return (x*x-2*x+6); } (x*x3
第八章-狄拉克函数
若 f (x)为任意连续函数,如果
性质来定义。
数学物理方法
性质 2.(对称性): (x x0 ) (x0 x) 函数是偶函数
证明:设 f (x)为定义在( )的连续函数,则
x0 x
f (x) (x0 x)dx f (x0 ) ( )(d )
数学物理方法
二、 函数的性质
性质 1:若 f (x)是定义在区间(,)的任一连续函数,则
f (x) (x x0)dx f (x0)
—将 (x x0 )乘上 f (x)进行积分,其值为将 f (x)的 x换为 x0或
者说: 函数具有挑选性(把 f (x)在 x x0的值挑选出来)
(x x0)
0
(x x0 ) (x x0 )
(x x0 )dx 1
(5) (6)
数学物理方法
(x x0)
0
(x (x
x0 ) x0 )
(5)
(x x0 )dx 1(6)
根据(5)式,在 x x0时, (x x0 ) 0,所以(6)式左边
——根限形式
证明:(1)当 x 0时,令v xu,且有lim sin v 1 v0 v
sin2 (ux)
lim
v0
x2u
lim u [lim sin(xu)]2
u x0 xu
lim u
u
(2)当 x 为不等于 0 的常数时:
lim
u
sin2 (ux)
数学物理方法
说明:
1. 函数并不是通常意义下的函数,而是广义函数:
函数的定义与性质
8.2 函数的复合与反函数
推论2:设f:A→B, g:B→C, 则fg:A→C, 且 x∈A都有fg(x)=g(f(x))
证明:由性质1,fg是函数,由性质2易证 dom(fg)=A, ran(fg)C 由性质3,fg(x)=g(f(x))
28
8.2 函数的复合与反函数
定理:设函数f:A→B, g:B→C 则:
fff={<1,1>,<2,2>,<3,3>} 2
=IA
3
g 1
1
22
33
f 1
1
22
33
26
8.2 函数的复合与反函数
例:A上的三个函数 f(a)=3-a, g(a)=2a+1, h(a)=a/3
我们有:
❖(fg)(a)=g(f(a))=g(3-a) =2(3-a)+1=7-2a
❖(gf)(a)=f(g(a))=f(2a+1)=2-2a ❖h(g(f(a)))=h(7-2a)=(7-2a)/3
b2
c
2
f(d)=1
c2
d1
d
3
8
8.1 函数的定义与性质
皮亚诺后继函数
❖f: N→N, f(n)=n+1
投影函数
❖X和Y是非空集合,f: X×Y→X, f(x,y)=x
9
8.1 函数的定义与性质
A到B的函数集合BA (B上A)
❖ BA ={f | f: A → B}
例:设A={1, 2, 3}, B={a,b},求BA 解:BA={f0,f1,…,f7}
32
8.2 函数的复合与反函数
给定函数F,F-1不一定是函数 例:A={a,b,c},B={1,2,3}
第八章 多元函数微分学
第八章 多元函数微分学一 基本概念极限:当点以任何方式趋于点00(,)x y 时,函数值(,)f x y 无限接近常数A ,则称A 是函数(,)f x y 在点00(,)x y 的极限,记作:00(,)(,)lim (,)x y x y f x y A →=。
连续:如果0000(,)(,)lim(,)(,)x y x y f x y f x y →=,则称函数(.)f x y 在点00(,)x y 上连续。
偏导数:设(,)z f x y =,函数在点00(,)x y 关于变量x 的偏导数为000000(,)0(,)(,)limx y x f x x y f x y zxx ∆→+∆-∂=∂∆。
记作00(,)x y f x∂∂,或00(,)x f x y ' 类似的,定义函数(,)z f x y =在点00(,)x y 关于变量y 的偏导数为000000(,)0(,)(,)lim x y y f x y y f x y z y y ∆→+∆-∂=∂∆。
记作00(,)x y f y∂∂,或00(,)y f x y ' 偏导数的几何意义:00(,)x f x y '是曲面(,)f x y 与平面0y y =交线上的点000(,,)x y z 的切线关于x 轴的斜率。
类似解释00(,)y f x y '几何意义。
可微;如果函数(,)f x y 在点00(,)x y 是可微的,如果0000(,)(,)()z f x x y y f x y A x B y o ρ∆=+∆+∆-=∆+∆+其中ρ=,A B 是与,x y ∆∆无关的常数。
全微分:函数(,)f x y 的全微分:x y dz f dx f dy ''=+函数(,)f x y 在点00(,)x y 的全微分:00(,)0000(,)(,)x y x y dz f x y dx f x y dy ''=+二 基本结论1.连续、偏导存在和可微三者关系 (1)可微⇒偏导存在,连续; (2)偏导存在和连续没有必然关系 (3)偏导存在+偏导函数连续⇒可微。
第8章 可计算函数
f ( g1 ( y),, gn ( y))也是初等函数。
( x) 是初等函数,那么
xu
g (u ) = f ( x) ,
g (u ) = f ( x) 也是初等函数。
x u
(5) 只有有限次使用上述条款确定的函数是初等函数。
离散数学 第8章 可计算函数 8.2 初等函数
x1x x2
8.2.1 初等函数集
sg( x ) =
0 当x > 0 1 当x = 0
sg( x ) = 1 * x
右边是常数函数、投影函数合成于二元差函数。
离散数学 第8章 可计算函数
8.2 初等函数
x1x x2
8.2.1 初等函数集
EF4. 符号函数 sg(x) =
1 当x>0 0 当x=0
sg( x ) = 1 * - sg( x )
x u
称
为迭乘操作。
x u
离散数学 第8章 可计算函数
8.2 初等函数
x1x x2
8.2.1 初等函数集
定义8.2 归纳定义初等函数集:
(1) 本原函数是初等函数。 (2) 二元差函数是初等函数:
x
y=
0 x- y
当x ≤ y 当 y < x , 这里的- 是通常的算术减
(3) 如果f ( x1 , , xn ) 与g1 ( y) , , gn ( y) 都是初等函数,那么它们 的合成 (4) 如果f
1 1 m m m 1
离散数学 第8章 可计算函数
8.2 初等函数
8.2.2 初等谓词
定理8.4 下列判定函数 con(x,y,s,t)是初等函数:
s 当x y con( x , y , s , t ) t 当x y
C语言程序设计 第3版 第8章 函数
s=a+b;
return s;
}
main()
//主函数
{
int s;
s=sum();
printf("s=%d\n",s);
}
运行结果
2 3↙ s=5
C语言程序设计
2.函数的定义
无返回值无参数 无返回值有参数
有返回值无参数 有返回值有参数
一般形式:
类型标识符 函数名(形式参数表列) {
函数体; return 表达式; }
调用方式
函数调用的一般形式:
函数名(实际参数表) 实际参数表中的参数可以是常数、变量或表达式,各实参之间用逗号分隔。
调用方式:
(1)函数表达式:函数作为表达式中的一项出现在表达式中,这种方式要求函数有返回值。 例如:s=sum(x,y);把sum的返回值赋予变量s。
(2)函数语句:函数调用的一般形式加上分号即构成函数语句,这种方式不要求函数有返回值。 例如:sum(x,y);以函数语句的方式调用函数。
void sum(int a,int b) //自定义函数
{
int s;
s=a+b;
ห้องสมุดไป่ตู้
printf("s=%d\n",s);
} main()
//主函数
{
int x=2,y=3;
sum(x,y);
}
运行结果
s=5
C语言程序设计
2.函数的定义
无返回值无参数 无返回值有参数
有返回值无参数 有返回值有参数
一般形式:
类型标识符 函数名( ) {
函数体; return 表达式; }
注意说明:
(1)函数的类型实际上是函数返回值的类型。
第八章第8节多元函数的极值
三、条件极值
极值问题 无条件极值: 自变量 只有限制定义域内
条件极值 : 自变量 除了限制定义域内, 还有其它条件限制 例如, 在条件 ( x, y) 0 下, 求函数 z f ( x , y ) 的极值 条件极值的求法: 方法1 代入法. 从条件 ( x, y) 0 中解出 y y( x )
故极值点 必须满足
dy dx
dz dx
f x ( x , y ) f y ( x , y ) f x ( x, y) f y ( x, y)
dy dx
0 0
x ( x, y)
, y ( x, y)
x ( x, y)
y ( x, y)
记
f y ( x, y)
即
3
定理2 (充分条件)若函数 在点 的某邻域内 具有二阶连续偏导数, 且
f x ( x0 , y0 )
f y ( x0 , y0 )
令
A f xx ( x0 , y0 )
B f xy ( x0 , y0 ) C f yy ( x0 , y0 )
具有极值 则:1)当 AC B 0时,
( x, y) 0
这是极值点 必须满足的条件。
求函数 z f ( x , y ) 在条件 ( x , y ) 0 下的极值. 引入辅助函数 L f ( x , y ) ( x , y ) Lx f x ( x , y ) x ( x , y ) 0 则极值点满足: Ly f y ( x , y ) y ( x , y ) 0
2
不是极值;
5
6 x 6,
在点(3,0) 处
6 y 6,
微积分第八章
利用函数全增量的概念,连续定义可用另一种形式表述.
三、 二元函数的连续性
函数z=f(x,y)在点(x0,y0)的某邻域内有定义, 当自变量x,y分别由x0变到x0+Δx,y0变到y0+Δy时, 函数z=f(x,y)有增量
f(x0+Δx,y0+Δy)-f(x0,y0) 称其为函数z=f(x,y)在点(x0,y0)的全增量,记 为Δz,即
P0(x0,y0)处连续.
如果函数z=f(x,y)在区域D内各点都连续,则称函数
z=f(x,y)在区域D内连续.
三、 二元函数的连续性
对于闭区域上的连续函数z=f(x,y),则要求
函数z=f(x,y)在区域D内和边界上都连续.当点
P0(x0,y0)
D
中的P→P0是指P在区域D内所取的路线趋近于点
P0(x0,y0),极限中满足0<(x-x0)2+(y-y0)2<δ
图 8-7
一、多元函数的概念
定义域D就是曲面在xOy面上的投影区域. 例如,函数z=a2-x2-y2(a>0)的图形是球心在原点、 半径为a的上半球面(见图8-8).
图 8-8
二、 二元函数的极限
与一元函数情况类似,对于二元函数z=f(x,y),我们 需要考察当自变量x,y无限趋近于常数x0,y0时,即当点 P(x,y)无限逼近于点P0(x0,y0)时,对应的函数值的变化趋 势,这就是二元函数的极限问题.
高等数学第八章课件.ppt
T x(t0), y(t0), z(t0)
法平面:过M点且与切线垂直的平面.
x(t0 )(x x0 ) y(t0 )( y y0 ) z(t0 )(z z0 ) 0
限,记为
lim f( x, y) A,
( x, y x0 , y0 )
或 f(x,y) A,( x, y)( x0, y0 )
例 考察函数
g( x,
y)
xy
x2 y2
,
x2 y2 0 ,
0 , x2 y2 0
当 ( x, y ) ( 0 , 0 ) 时的极限
解 当 ( x, y ) 沿 y 轴趋向于原点,即当 y 0 而
若函数 u u(x, y), v v(x, y) 在点(x, y) 处有偏导 数,则 z f (u) 在对应点(u, v) 处有连续偏导数, 则复合函数 z f [u(x, y), v(x, y)] 在点(x, y) 处也存 在偏导数,并且
两种特殊情况:
(二) 隐函数的求导法则
设方程 F (x , y) = 0 确定了函数 y = y(x),两端 对 x 求导,得
f(x0,y0)=C
第二节 偏导数
一、偏导数的概念及几何意义 二、高阶偏导数 三、复合函数与隐函数的求导法则
一、偏导数的概念及几何意义
(一) 偏导数的概念
定义 设函数
在点
的某邻域内极限
存在,则称此极限为函数 的偏导数,记为
注意:
同样可定义对 y 的偏导数为
若函数 z f ( x, y)在域 D 内每一点 ( x, y)处对 x
大数据的Python基础课件第8章 函数设计与应用
#关键参数
14
8.2.4 可变长度参数
>>> def demo(a, b, c, *p): print(a, b, c) print(p)
>>> demo(1, 2, 3, 4, 5, 6) 123 (4, 5, 6) >>> demo(1, 2, 3, 4, 5, 6, 7, 8) 123 (4, 5, 6, 7, 8)
15
8.2.4 可变长度参数
>>> def demo(**p): for item in p.items(): print(item)
>>> demo(x=1, y=2, z=3) ('y', 2) ('x', 1) ('z', 3)
16
8.3 变量作用域
>>> def demo(): global x x=3 y =4 print(x, y)
20
8.4 lambda表达式
>>> from functools import reduce >>> reduce(lambda x,y:x*y, data[0]) #第一行所有数字相乘 0 >>> reduce(lambda x,y:x*y, data[1]) #第二行所有数字相乘 171018396981432000 >>> list(map(lambda row:row[0], data)) #获取每行第一个元素 [72, 28, 32, 22, 90] >>> list(map(lambda row:row[data.index(row)], data))
高等数学第八章 多元函数微分法及其应用
其中是曲面在M的法向量
n {Fx ( x0 , y0 , z0 ), Fy ( x0 , y0 , z0 ), Fz ( x0 , y0 , z0 )}
2、曲面方程:z=f(x,y)
它在点M( x0 , y0 , z0 )的切平面方程
z z0 f x ( x0 , y0 )( x x0 ) f y ( x0 , y0 )( y y0 )
第五节 隐函数的求导公式
存在定理1:设函数F(x,y)在点 P( x0 , y0 ) 的某一邻
域内具有连续的偏导数,且F ( x0 , y0 ) 0, Fy ( x0 , y0 ) 0,
则方程F(x,y)=0在点( x0 , y0 ) 的某一邻域内恒能确定
一个单值连续且具有连续导数的函数y=f(x),它满足
性质:(介值定理)在有界闭区域D上的多元连续函 数,若在D上取得两个不同的函数值,则它在D 上取得介于这两个值之间的任何值至少一次。
一切多元初等函数在其定义区域内是连续的。
第二节 偏导数
一、偏导数的定义及其计算法
定义 :设函数z=f(x,y)在点(x0, y0 )的某一邻域内有定
义有存,增在当量,则yf固(称x定0此在极xy限,0而y0为x) 在函xf数(0处xz0=,有yf(0增x),,量如y)果在x 时点lxi,m(0x相f0,(y应x00)处地x对函x,x数y的0 )
,
y
|x x0 , z y y y0
|x x0 y y0
或f y ( x0 ,
y0 )
类似导数,函数z=f(x,y)对自变量x的偏导函数为
z x
,
f x
,
z
x或f
x
(
x,
大学数学微积分第八章 多元函数微分学多元函数的概念、极限与连续性知识点总结
第八章 多元函数微分学§8.1 多元函数的概念、极限与连续性一、多元函数的概念1.二元函数的定义及其几何意义设D 是平面上的一个点集,如果对每个点P(x,y)∈D ,按照某一对应规则f ,变量z 都有一个值与之对应,则称z 是变量x ,y 的二元函数,记以z=f (x ,y ),D 称为定义域。
二元函数z=f (x ,y )的图形为空间一块曲面,它在xy 平面上的投影域就是定义域D 。
例如 22221,:1z x y D x y =--+≤ 二元函数的图形为以原点为球心,半径为1的上半球面,其定义域D 就是xy 平面上以原点为圆心,半径为1的闭圆。
2.三元函数与n 元函数:(,,),(,,)u f x y z x y z =∈Ω空间一个点集,称为三元函数12(,,,)n u f x x x n =称为元函数。
它们的几何意义不再讨论,在偏导数和全微分中会用到三元函数。
条件极值中,可能会遇到超过三个自变量的多元函数。
二、二元函数的极限:设00(,)(,)f x y x y 在点的邻域内有定义,如果对任意00,εδ>>存在只要2200()(),(,)x x y y f x y A δε-+-<-<就有则,0000(,)()lim (,)lim (,)x x x y x y y y f x y A f x y A →→→==或称当00(,)(,)(,)x y x y f x y 趋于时的极限存在,极限值为A 。
否则,称为极限不存在。
值得注意:00(,)(,)x y x y 这里趋于是在平面范围内,可以按任何方式沿任意曲线趋于00(,)x y ,所以二元函数的极限比一元函数的极限复杂,但只要求知道基本概念和简单的讨论极限存在性和计算极限值不象一元函数求极限要求掌握各种方法和技巧。
三、二元函数的连续性1.二元函数连续的概念若000000lim (,)(,)(,)(,)x x y y f x y f x y f x y x y →→=则称在点处连续 若(,)f x y D 在区域内每一点皆连续,则称(,)f x y 在D 内连续。
第八章 函数1函数概述
第八章函数8、1 函数概述1、C语言的函数:C语言的函数是子程序的总称,包括函数和过程。
(有返回值、无返回值,教材中称为:有返回值函数,无返回值函数)。
C语言函数可以分为库函数、用户自定义函数。
库函数由系统提供,程序员只需要使用(调用),用户自定义函数需要程序员自己编制。
2、C语言的程序由函数组成,函数是C语言程序的基本单位。
前面章节介绍的所有程序都是由一个主函数main组成的。
程序的所有操作都在主函数中完成。
事实上,C语言程序可以包含一个main函数,也可以包含一个main函数和若干个其它函数。
C语言程序的结构如图所示。
在每个程序中,主函数main是必须的,它是所有程序的执行起点,main函数只调用其它函数,不能为其它函数调用。
如果不考虑函数的功能和逻辑,其它函数没有主从关系,可以相互调用。
所有函数都可以调用库函数。
程序的总体功能通过函数的调用来实现。
3、使用函数的意义(补充)有些同学提出,我只用一个main函数就可以编程,为什么这么复杂,还要将程序分解到函数,还要掌握这么多概念,太麻烦了?我们说对于小程序可以这样做,但是对于一个有一定规模的程序这样做就不合适了。
使用函数的几个原因:(1)使用函数可以控制任务的规模一般应用程序都具有较大的规模。
例如:一个齿轮误差分析软件系统的源程序行数要数千行。
一个传动链计算机辅助设计系统的源程序行数5万多行。
使用函数可以将程序划分为若干功能相对独立的模块,这些模块还可以再划分为更小的模块,直到各个模块达到程序员所能够控制的规模。
然后程序员再进行各个模块的编制。
因为各个模块功能相对独立,步骤有限,所以流程容易控制,程序容易编制,修改。
一般一个模块的规模控制在源程序60行以内(但是也不必教条化)。
(2)使用函数可以控制变量的作用范围变量在整个模块范围内全局有效,如果将一个程序全部写在main()函数内,大家可以想象,变量可以在main函数内任何位置不加控制地被修改。
c语言第八章 函数
教学进程
8.2
函数的调用
【练习题 】
用函数实现求两个实数的和。
#include <stdio.h> void main() /*主调函数*/ { float add(float x, float y); /*函数声明*/ float a,b,c; printf("Please enter a and b:"); scanf("%f,%f",&a,&b); c=add(a,b); 因函数声明与函数首 printf("sum is %f\n",c); 部一致,故把函数声 } 明称为函数原型。 float add(float x,float y) /*被调函数首部*/ { float z; z=x+y; 用函数原型来声明函数,能减少 return(z); 编写程序时可能出现的错误。 }
教学进程
8.2.3 函数的调用
定义函数时,函数名后括号中的变量称为形式参数,即形参。 定义函数时,函数名后括号中的变量称为形式参数,即形参。 在主函数中调用函数时,函数名后括号中的表达式称为实际 参数,简称实参。
【例 】 输入两个整数,要求用一个函数求出其中的大者,并 在主函数中输出此数。
教学进程
a
b
c
d
e
f
教学进程
运行结果: 【例】 函数调用的简单例子。
**************** How do you do! ****************
/*主调函数*/ /*主调函数* #include <stdio.h> void main() { void printstar(); printstar(); void print_message(); print_message(); printstar(); print_message(); printstar(); }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
符合标准的C语言编译器必须提供这些函数 函数的行为也要符合ANSI/ISO C的定义
自定义函数
–自己定义的函数
包装后,也可成为函数库,供别人使用
2013-7-30
7/78
函数的定义(Function Definition)
返回值 类型 函数名标识符, 说明运算规则 参数表相当于 运算的操作数
main() { ① … … a(); ⑦
2013-7-30
}
a 函数 ③ { ② b(); … ⑥ ⑤ return; }
b函数 {
… …
④
return; }
17/78
用函数解决问题
打印阶乘表的程序……
函数把较大的任务分解成若干个较小的任务, 并提炼出公用任务
程序员可以在其他函数的基础上构造程序,而 不需要从头做起 设计得当的函数可以把具体操作细节对程序中 不需要知道它们的那些部分隐藏掉,从而使整 个程序结构清楚 分而治之、信息隐藏
18/78
2013-7-30
8.2函数封装与防御性程序设计
函数封装(Encapsulation)使得外界对函数的影 响仅限于入口参数,而函数对外界的影响仅限于一 个返回值
【例8.2】
传入负数实参 会怎样?
Why?
2013-7-30 19/78
防御性程序设计(Defensive Programming)
【例8.1a】 计算整数n的阶乘n! /* 函数功能: 用迭代法计算n!
函数入口参数: 整型变量n表示阶乘 的阶数 函数返回值: 返回n!的值 */ long Fact(int n) { int i; long result = 1; for (i=2; i<=n; i++) { result *= i; } return result; }
函数内部可以定义 int Max(int x,int y) /* 函数定义 */ 只能自己使用的变 { 量,称内部变量 int z; 返回值作为函数 if (x>y) z=x; 调用表达式的值 else z=y;
return z; }
函数的分类
标准库函数
– ANSI/ISO C定义的标准库函数
第八章 函数
江西科技师范学院
曾夏玲
zengxialing@
学习内容
函数定义、函数调用、函数原型、函数返回值
– 难点:函数的参数传递与返回值
“自顶向下、逐步求精”的模块化程序设计方 全局变量、自动变量、静态变量、寄存器变量
– 难点:变量的作用域与存储类型
2013-7-30
2/78
等工作 –一个模块一个模块地完成,最后再将它们集成
开发人员各司其职 –按模块分配任务,职责明确 –并行开发,缩短开发时间 什么时候需要模块化? –某一功能,如果重复实现3遍以上,即应考虑模块化
,将它写成通用函数,并向小组成员发布
23/78
2013-7-30
模块化的优点——复用
–构建新的软件系统可以不必每次从零做起,直接使用
猜多个数 10次猜不对就猜下一个数 直到用户选择结束为止
printf("counter = %d\n", counter); printf("Do you want to continue(Y/N or y/n)?"); scanf(" %c", &reply); }while ((reply == 'Y') || (reply == 'y')); 2013-7-30 printf("counter = %d \n", counter);
printf("%d\n", max(a,b));
无返回值时 函数名(实参表列); – 函数调用表达式,如display(a,b);
13/78
2013-7-30
函数的参数传递
实参和形参必须匹配 –数目一致,类型一一对应
【例8.1】
2013-7-30 14/78
#include <stdio.h> main() { int m; long ret; printf("Input m:"); scanf ("%d",&m); ret=fact(m); printf("%d!=%d",m,ret); }
函数的复用
【例8.1b】计算并输出 1! + 2! + 3! + … + m!
/* 函数功能: 用迭代法计算n! 函数入口参数: 整型变量n表示阶乘的 阶数 函数返回值: 返回n!的值 */
#include <stdio.h> main() { int i,m; long sum; printf(”Input m:”); scanf (”%d”,&m); sum=0; for(i=1;i<=m;i++) /*补充程序*/ sum=sum+fact(i); printf(”1!+2!+……+%d!=%d”,m,sum); }
读多少行的程序能让你不头疼?
假如系统提供的函数printf()由10行代码替 换,那么你编过的程序会成什么样子? – 实际上一个printf()有上千行代码
如果所有代码都在main()中,怎么团队合作? 如果代码都在一个文件中,怎么团队合作?
2013-7-30
4/78
问题的提出
《三国演义》中有这样一段描写:
–其中的思想,在程序设计里也适用
5/78
# include <stdio.h> int Max(int x,int y); /*函数的声明*/ void main() { int a,b,c; scanf(”%d%d”,&a,&b); c=Max(a,b); /*函数的调用*/ printf(”max=%d\n”,c); } /* 函数功能: 求最大数 形参表,函 函数入口参数: 整型x,存储第一个运算数 整型y,存储第二个运算数 数入口 返回值类型 函数名说明 函数返回值: 最大数 函数的功能 */
27/78
开始
生成数字
猜数字 结束
自底向上
自顶向下的模块化程序设计
开始 生成数字 猜数字 Y
是否继续? N 结束
开始
输入数字 Y 猜得对吗? N 提示大小 次数<10? N 结束 Y
2013-7-30
33/78
函数设计的基本原则 Nhomakorabea信息隐藏
入口参数有效性检查 敏感操作前的检查
调用成功与否的检查
已有的经过反复验证的软构件,组装或加以合理修改后 成为新的系统,提高软件生产率和程序质量
在其他函数的基础上构造程序
–拿来拿去主义,指尽可能复用其他人现成的模块
不是人类懒惰的表现,而是智慧的表现
–一般要靠日积月累才能建立可以被复用的软件库
前期投入多,缺乏近期效益,大部分公司都注重近期效益,是
12/78
2013-7-30
函数调用(call)
单向值传递
调用函数时,必须提供所有的参数,提供的参数 个数、类型、顺序与定义时相同 有返回值时 返回值 = 函数名(实参表列); – 放到一个数值表达式中如c = max(a,b); – 作为另一个函数调用的参数,如
c = max(max(a,b),c);
【例8.2】 计算整数n的阶乘n! 如何使函数具有遇到不正确使用或非法数据输入时 避免出错的能力,增强程序的健壮性? –在函数的入口处,检查输入参数的合法性
2013-7-30
20/78
防御性程序设计(Defensive Programming)
【例8.2】计算整数n的阶乘n! 如何使函数具有遇到不正确使用或非法数据输入时 避免出错的能力,增强程序的健壮性? –在函数的入口处,检查输入参数的合法性
局部变量( Local Variable )
在语句块内定义的变量
–形参也是局部变量 特点 –生存期是该语句块,进入语句块时获得内存,
仅能由语句块内语句访问,退出语句块时释放 内存,不再有效 –定义时不会自动初始化,除非程序员指定初值 –并列语句块各自定义的同名变量互不干扰
程序设计的艺术
程序设计有两大最高级的艺术 – 算法设计艺术 – 结构设计艺术
函数(function)是结构设计的最基本单位
“一个程序应该是轻灵自由的,它的子过程就 象串在一根线上的珍珠。” – Geoffrey James(杰弗雷· 詹姆士)的《编程之道》
3/78
2013-7-30
问题的提出
2013-7-30
21/78
防御性程序设计(Defensive Programming)
【例8.2】计算整数n的阶乘n!
主函数如何修改?
–增加对函数返回值的检验
2013-7-30
22/78
8.3模块化程序设计
模块各司其职 –每个模块只负责一件事情,它可以更专心 –便于进行单个模块的设计、开发、调试、测试和维护
为了生存,所以软件复用对公司来说不是最高优先级
2013-7-30 24/78
逐步求精(Stepwise Refinement)
– 由不断的自底向上修正所补充的自顶向下
(Top-down)的程序设计方法
2013-7-30
25/78
【例8.3】用函数完成猜数游戏
猜多个数 10次猜不对就猜下一个数 直到用户选择结束为止