第6章函数Word文件下载.docx
- 文档编号:21570829
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:21
- 大小:64.99KB
第6章函数Word文件下载.docx
《第6章函数Word文件下载.docx》由会员分享,可在线阅读,更多相关《第6章函数Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
i<
=n;
i++)s=s+i;
return(s);
}
main()
{longf=0;
/*主调函数中变量名不得与其内的被调函数同名,故不能定义变量名hz*/
f=hz(100);
printf("
%ld"
f);
例2:
voidpp()
{printf("
\n****"
);
\n####"
\n@@@@"
return;
main()
{clrscr();
pp();
}
例3:
intadd(x,y)intadd(intx,inty)
intx,y;
{return(x+y);
{printf(“%d”,add(add(1,2),3));
例4:
编一个函数s(n),求解n!
。
#include"
longs(n)
intn;
{longf=1;
i++)f=f*i;
return(f);
该例中的函数头可以写为longs(intn),函数体中的返回语句可改为returnf;
{longf;
f=s(8);
printf(“\n%ld”,f);
2.函数的一般调用★
函数调用语句的格式按函数是否有返回值分为两种,具体格式如下:
(1)无值函数调用格式如下(按单独的函数语句调用):
函数名(实际参数表);
注:
有返回值的函数也可以用这种形式调用,此时,返回值将丢失。
(2)有值函数调用格式通常有三种方式:
方式一:
变量=函数名(实际参数表);
如:
a=s(4);
b=s(4)+5;
等等。
方式二:
以函数参数形式调用;
printf(“%ld,%ld”,s(4),s(4)+5);
方式三:
在一般的表达式中调用。
if(s(4)>
10)printf(“%ld”,s(4));
若被调函数在主调函数之后,则应对被调函数作使用声明(int型被调函数除外):
格式:
函数值类型被调函数名(形参类型说明);
括号内的形参名可省略。
位置:
主调函数中或程序的首部。
例如:
longs(intn)
{longf=1;
{intx=4;
s(x));
{longs(intn);
s(4));
longs(intn);
二、函数调用时数据传递
函数间传递数据有四种方式:
值传递方式、地址传递方式、返回值方式、全局变量传递方式。
前两种方式是利用函数的参数来传递数据的。
1.值传递方式★
值传递方式是在形式参数和实际参数之间传递数据的一种方式。
用值传递方式时:
形式参数:
一定是简单变量;
实际参数:
可以是常量、已有值的变量或表达式。
值传递方式的特点:
参数值的单向传递(实参值形参)。
形参的改变不影响实参的值。
例1:
floatmax(intx,inty);
{floata=1.5,b=2.5;
floatc;
c=max(a,b);
printf(“Maxis%f\n”,c);
floatmax(floatx,floaty)
{returnx>
y?
x:
y;
结果:
Maxis2.500000
例2:
s(2+6));
40320
例3:
voidswap(intx,inty)
{intt;
t=x;
x=y;
y=t;
{inta=7,b=8;
swap(a,b);
\n%d,%d"
a,b);
}
7,8
因为形式参数是简单变量,所以是“值传递”,数据只能单向由实参传到形参,形参值的变化不影响实参。
voidsw(intx)
{x=x+1000;
printf(“\n%d”,x);
{inta=7;
sw(a);
\n%d"
a);
1007
7
2.地址传递方式★※
地址传递方式也是在形式参数和实际参数之间传递数据的一种方式。
采用地址传递方式时:
只能是指针变量或数组名;
地址
地址传递方式的特点
参数值的双向传递
(&
实参变量形参指针变量,*形参指针变量实参变量)。
&
ax*x(a)
by*y(b)
写出程序的运行结果:
voidswap(int*x,int*y)/*交换指针p1、p2所指向的变量的值*/
{intt;
t=*x;
*x=*y;
*y=t;
}
{inta,b;
a=7,b=8;
swap(&
a,&
b);
printf("
\n%d,%d\n"
运行结果:
8,7
&
ax
*xa
输入十个整数,升序排列后输出。
voidin(intb[],intn)
{inti;
\npleaseinput%dnumber:
\n"
n);
for(i=0;
n;
i++)scanf("
%d"
&
b[i]);
voidout(intb[],intn)
\nresult:
i++)printf("
%d"
b[i]);
voidmpsort(int*b,intn)
{inti,j,t;
=n-1;
i++)
for(j=0;
j<
=n-1-i;
j++)
if(b[j]>
b[j+1])
{t=b[j];
b[j]=b[j+1];
b[j+1]=t;
#defineN10
{inta[N];
in(a,N);
mpsort(a,N);
out(a,N);
}
如果形参是数组将不为其重新分配内存单元,它将与实参数组共处存储空间,所以定义形参数组时无需定义长度。
3.利用return(表达式)传递数据(被调函数主调函数传递1个值)
【例】分析程序的功能:
intss(intx)
{intf,i;
for(f=1,i=2;
=x/2;
i++)
if(x%i==0){f=0;
break;
};
if(x==1)f=0;
{intx;
\ninputanumber:
"
scanf(“%d”,&
x);
if(ss(x)==1)printf("
\nYes"
elseprintf("
\nNo"
功能:
输入一个整数,若为素数则输出yes,否则输出No.
4.利用全局外部变量传递数据(多个值)★
全局外部变量:
在函数之外定义的变量,它的作用域覆盖了定义点到程序末尾之间的所有函数。
例
inth,c,j;
voidpp(intx,inty)
{h=x+y;
c=x-y;
j=x*y;
{inta=3,b=4;
pp(a,b);
printf(“\n%d,%d,%d”,h,c,j);
voidpp(x,y,a,b,c)
intx,y,*a,*b,*c;
{*a=x+y;
*b=x-y;
*c=x*y;
{inta=3,b=4,h,c,j;
pp(a,b,&
h,&
c,&
j);
三、函数的嵌套调用和递归调用
1.函数的嵌套调用★※
函数的嵌套调用:
函数1调用函数2,函数2又调用函数3。
(函数可以嵌套调用但不允许嵌套定义)
编写一个程序求解下列函数值。
w(a,b)=s(a)/s(b)
s(n)=p
(1)+p
(2)+p(3)+…+p(n)
p(i)=1+2+3+…+i
要求编写w(a,b)、s(n)、p(i)函数。
a,b由主函数输入。
intp(inti)
{intf,k;
for(f=0,k=1;
k<
=i;
k++)f+=k;
return(f);
ints(intn)
{ints,i;
for(s=0,i=1;
i++)s+=p(i);
return(s);
floatw(inta,intb)
{return(1.0*s(a)/s(b));
{inta,b;
\npleaseinputa,b:
scanf("
%d,%d"
a,&
\nw(%d,%d)=%f"
a,b,w(a,b));
}w(2,3)=0.400000
上述程序中,主函数调用w(),w()调用了s(),s()又调用了p()。
所以称为嵌套调用。
2.递归调用★※
(1)递归函数的特点:
函数自身的调用,也称函数的自我调用。
引例:
编一个计算n!
(n>
1)的递归调用函数s(n)。
并在主函数中求解s(4)。
分析:
递归法
5!
=4!
X5
4!
=3!
X4
3!
=2!
X3
2!
=1!
X2
1!
=1
分析得f(n)=n!
的求解
1(n=1,0)
f(n)=
f(n-1)×
n(n>
1)
其中f(n-1)未求出
实际上,递归程序分两个阶段执行——
①调用:
欲求n!
→先求(n-1)!
→(n-2)!
→…→1!
若1!
已知,调用结束。
②回代:
知道1!
→2!
→3!
→…→n!
longf(intn)
{if(n==1||n==0)return
(1);
elsereturn(f(n-1)*n);
{intn;
f(4));
分析:
main:
f(4)
f(4)=f(3)*4
f(3)=f
(2)*3
f
(2)=f
(1)*2
f
(1)=1
输出结果为:
24
递归调用函数时n次调用将会有n次返回。
{if(n==1)return
(1);
elsereturn(s(n-1)+n*n);
{printf(“\n%d”,s(4));
s(4)
s(4)=s(3)+4*4
s(3)=s
(2)+3*3
s
(2)=s
(1)+2*2
s
(1)=1
(2)递归函数的设计方法:
数据类型说明符函数名(形式参数表)
形式参数说明序列;
{if(递归结束条件)return(表达式);
elsereturn(递归公式);
八只猴子在一块吃桃,第八只猴子吃的桃是第七只猴子的2倍多1个,第七只猴子吃的桃是第六只猴子的2倍多1个,第六只猴子吃的桃是第五只猴子的2倍多1个,…第1只猴子吃的桃是2个,编写递归函数s(n)求解第n只猴吃桃的数目。
在主函数中求出第四只猴子吃桃的数目s(4)。
分析:
{if(n==1)return
(2);
elsereturn(2*s(n-1)+1);
s(4)=2s(3)+1
s(3)=2s
(2)+1
s
(2)=2s
(1)+1
s
(1)=2输出结果为:
23
写出程序的运行结果。
voidw(intn)
{if(n==1)return;
w(n-1);
\n%d"
{
w(4);
main()w(4)w(3)w
(2)w
(1)
n=4n=3n=2n=1
w(4)w(3)w
(2)w
(1)
432
结束返回返回返回返回
所以输出结果为:
2
3
4
作业:
{if(n==1)return
(1);
elsereturn(3*s(n-1)+2);
s(4)=3s(3)+2
s(3)=3s
(2)+2
s
(2)=3s
(1)+2
s
(1)=1
53
四、指针型函数※
指针型函数:
该函数的返回值是指针类型的,调用该类函数时,接受返回值的变量应是指针变量。
例:
编一个函数,求整型数组的前n个整数中最大元素的地址并返回该地址,整型数组和n作为函数的参数。
int*max(inta[],intn)
{inti;
intm,k;
m=a[0];
k=0;
for(i=1;
if(m<
a[i])m=a[i],k=i;
return(&
a[k]);
{inta[]={1,3,5,65,78,234,32};
int*p;
p=max(a,7);
*p);
五、常用系统函数的使用
math.h
sqrt(x)对x求算术平方根sqrt(16)4.0
abs(x)对短整型x求绝对值abs(-9)9
labs(x)对长整型x求绝对值labs(-999L)999L
fabs(x)对实型x求绝对值fabs(-9)9.0
atoi(字符串)将字符串中的数字字符转换成整数arraytoint
atoi(“123.45”)123atoi(“7a8b”)7atoi(“a7b8”)0
atof(字符串)将字符串中的数字字符转换成实数
atof(“123.45”)123.45atof(“7a8b”)7.0atof(“a7b8”)0.0
pow(x,y)x的y次方pow(x,1.0/3)pow(x,100)
sin(x)cos(x)
stdio.h
getchar()putchar(c)gets(s)puts(s)exit(0)
string.h
strlen(s)strcpy(s,串)strcmp(串1,串2)
strcat(s,串)strlwr(s)strupr(s)
ctype.h仅对单字符测试或处理
islower(c)isupper(c)isspace(c)isdigit(c)
isdigit(c)c>
=’0’&
c<
=’9’
islower(c)c>
=’a’&
c<
=’z’
tolower(c)toupper(c)
tolower(c);
if(c>
=’A’&
=’Z’)c=c+32;
wyj.c
s(n)f(n)ss(x)mpsort(a,n)xzsort(a,n)gys(m,n)
六、局部变量与全局变量
1、局部变量——函数内部或复合语句内定义的变量
auto(默认)每次函数调用开始时分配,调用结束时值自动消失
局部变量register如不赋初值,取不确定值(register比auto快)
static每次函数调用结束后,其值仍保留,多次调用时仅在第一次为其分配单元,每后一次调用使用的初值均为前一次调用结束时的终值。
所有register型、auto型均为局部变量。
局部变量只能在本函数或本复合语句内发挥作用。
求程序运行结果
{inta=2,i;
for(i=0;
3;
%4d"
f(a));
f(inta)
{intb=0;
staticintc=3;
b++;
c++;
returna+b+c;
if(a)abc
0720→13→4
1820→14→5
2920→15→6
【结果】789
{intp;
p=func(4,1);
%d,"
p);
func(inta,intb)
{staticintm=0,i=2;
i+=m+1;
m=i+a+b;
returnm;
func(4,1)abmi
8410→82→3
17418→173→12
【结果】8,17
请写出程序的输出结果:
{
\n%d,%d"
func(4,1),func(4,1));
func(inta,intb)
结果为:
17,8
函数的参数计算顺序为:
自右至左。
2、全局变量——在函数之外定义的变量
extern(默认)
全局变量
static
作用范围:
从定义变量位置开始直到本源文件结束
如果需要将全局变量的作用范围扩展至整个源文件——
方法1:
全部在源文件开头处定义
方法2:
在源文件开头处,用extern说明
externintx,y;
/*如果没有此语句,编译就会出错*/
x=%d,y=%d\n"
x,y);
intx=100,y=200;
【注意】
1、
全局变量与局部变量同名时,在局部变量作用范围内,全局变量不起作用。
2、主调函数内的变量名不能与其内的被调函数同名。
例4:
求程序运行结果
inta=3,b=5;
max(inta,intb)
{intc;
c=a>
b?
a:
b;
returnc;
main()
{inta=8;
%d\n"
max(a,b));
8
例5:
voidnum()
{inta=15,b=10;
x+=a-b;
y+=a+b;
{inta=7,b=5;
x=a+b;
y=a-b;
num();
%d,%d\n"
17,27
例6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 函数