第八章 函数.docx

上传人:b****1 文档编号:725349 上传时间:2023-04-29 格式:DOCX 页数:24 大小:68.35KB
下载 相关 举报
第八章 函数.docx_第1页
第1页 / 共24页
第八章 函数.docx_第2页
第2页 / 共24页
第八章 函数.docx_第3页
第3页 / 共24页
第八章 函数.docx_第4页
第4页 / 共24页
第八章 函数.docx_第5页
第5页 / 共24页
第八章 函数.docx_第6页
第6页 / 共24页
第八章 函数.docx_第7页
第7页 / 共24页
第八章 函数.docx_第8页
第8页 / 共24页
第八章 函数.docx_第9页
第9页 / 共24页
第八章 函数.docx_第10页
第10页 / 共24页
第八章 函数.docx_第11页
第11页 / 共24页
第八章 函数.docx_第12页
第12页 / 共24页
第八章 函数.docx_第13页
第13页 / 共24页
第八章 函数.docx_第14页
第14页 / 共24页
第八章 函数.docx_第15页
第15页 / 共24页
第八章 函数.docx_第16页
第16页 / 共24页
第八章 函数.docx_第17页
第17页 / 共24页
第八章 函数.docx_第18页
第18页 / 共24页
第八章 函数.docx_第19页
第19页 / 共24页
第八章 函数.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

第八章 函数.docx

《第八章 函数.docx》由会员分享,可在线阅读,更多相关《第八章 函数.docx(24页珍藏版)》请在冰点文库上搜索。

第八章 函数.docx

第八章函数

函数程序设计

(一)

内容

说明

主要内容

 

重点

 

难点

 

举例

说明

 

1.函数的概念、定义格式

2.函数的调用方法

3.函数的形式参数、实际参数和函数的返回值

 

结合例子讲解函数的分类

 

重点也是难点

 

1.函数的定义格式

2.函数的调用方法

3.函数的返回值

1.函数的定义格式

2.函数的调用方法

一、问题的引入

在程序设计中,常将一些常用的功能模块编写成函数,放在函数库中供公共选用,以减少重复编写程序段的工作量。

一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能。

所有高级语言中都有子程序这个概念,用子程序实现模块的功能。

在C语言中,子程序的作用是由函数完成的。

一个C程序可由一个主函数和若干个函数构成,由主函数调用其它函数,其它函数也可以相互调用。

同一个函数可以被一个或多个函数调用任意多次。

二、函数的概念

定义:

函数是一个可反复使用的程序段,从其它的程序段中均可通过调用语句来执行这段程序。

三、函数的分类

1.从用户使用的角度分

(1)系统函数:

即库函数,由系统提供,用户可直接使用。

(2)用户自定义函数:

为满足特定需要用户自己定义的函数。

2.从函数的形式分

(1)有参函数:

被调用时需接受主调函数传递来的数据。

(2)无参函数:

被调用时不需要主调函数传递数据。

四、函数的定义

(1)有参函数的定义格式:

存储类型说明符数据类型说明符函数名(形式参数表)

形式参数说明序列;

{数据定义语句序列;

执行语句序列;

}

(2)无参函数的定义格式:

存储类型说明符数据类型说明符函数名()

{数据定义语句序列;

执行语句序列;

}

说明:

1存储类型说明符

可以是extern或static两种。

extern定义的函数叫做外部函数,可被其它编译单位中的函数调用;static定义的函数称内部函数,只能被本编译单位中的函数调用。

该项可省略,默认为外部函数。

2数据类型说明符

规定本函数返回值的数据类型。

可是前面介绍的各种基本数据类型,也可是指针型或“void”型,表示本函数无返回值。

3函数名:

是一个标识符,在同一编译单位中函数不能重名。

4形式参数表

每个形式参数可是一个变量名、数组名、指针变量名、指针数组名等。

5形式参数说明序列

若干条形式参数的说明语句,数据类型相同的形式参数可用一条说明语句说明。

语句格式为:

数据类型形式参数1,…;

6数据定义语句序列

由本函数中使用的变量、数组、指针变量等的定义语句组成。

7执行语句序列

由本函数中完成函数功能的程序段组成。

如果本函数有返回

值,在本序列中应有一条返回语句“return(表达式);”,其中表达式的值就是本函数的返回值。

若本函数无返回值,则返回语句

应为“return;”,也可省略返回语句。

返回语句的位置在函数体的执行语句序列中是任意的,返回语句的表达式前后的括号可省略。

返回语句的功能:

结束本函数的运行,返回到主调函数的调用语句后继续执行。

【例1】编写一个函数,求3个整型参数的最大值并返回这个最大值。

程序清单:

intmax(intx1,intx2,intx3)

{intmax;

if(x1>x2)max=x1;

elsemax=x2;

if(max

return(max);}

五、函数的调用

主调函数通过传递一定的信息来使用被调函数的功能。

1.无返回值的函数调用格式

函数名(实际参数表);

此格式作为语句形式调用,最后有“;”。

2.有返回值的函数调用格式

函数名(实际参数表)

3.函数的调用过程

(1)为所有的形参分配内存,计算各个实际参数表达式的值,依次赋予对应的形式参数。

(若是“无参函数”,上述工作不执行)

(2)进入函数体,执行函数中的语句,实现函数的功能,当执行到“返回语句”时,计算返回值,释放本函数体中的变量等(静态型变量不释放),收回分配给形参的内存,返回主调函数。

(3)继续执行主调函数中的后继语句。

4.函数调用时对被调函数的说明方法

(1)调用系统函数时,除少数系统函数(如scanf、printf等)外,都要求在程序的开始用包含命令“#include“头文件.h”将定义系统函数的库文件包含在本程序中。

(2)如果被调函数和主调函数在一个编译单位中,在书写顺序上被调函数在主调函数之前出现;或者被调函数虽然在主调函数之后出现,而被调函数的数据类型是整型或字符型,可不对被调函数加以说明;除上述2种情况为,都要对被调函数加以说明。

说明的位置一般在主调函数的函数体开头的数据说明语句部分。

格式:

数据类型被调函数名();

(3)如果被调的用户函数和主调函数不在同一个编译单位中,则在定义函数的编译单位中用下列方式将函数定义成外部函数:

extern数据类型函数名(形式参数表)

同时在主调函数的函数体中,或所在编译单位的开头将要调用的函数说明成“外部函数“。

格式:

extern数据类型被调函数名();

【例2】求四个整数(x,y,z,w)之间差值的最大值。

四个整数由键盘输入。

intmax(intx1,intx2,intx3)

{intmax;

if(x1>x2)max=x1;elsemax=x2;

if(max

return(max);}

main()

{intx,y,z,w,m;

scanf(“%d,%d,%d,%d”,&x,&y,&z,&w);

m=max(x-y,y-z,z-w);/*调用求3个整数中最大数的函数*/

printf(“max=%d\n”,m);}

 

可再给出一个编写函数的题目,供学生进行课堂练习。

再给出一个形参是数组的例子讲解

 

被调函数出现在主调函数之前,不必说明。

【例3】编一个程序,将整型数组中最大数与第一个数交换。

整型数组在主函数中由键盘输入。

main()

{voidf();inta[10],i;

for(i=0;i<10;i++)scanf(“%d”,&a[i]);

f(a);

for(i=0;i<10;i++)printf(“%d”,a[i]);}

voidf(intb[])

{intmax,max_i,i;max=b[0],max_i=0;

for(i=1;i<10;i++)

if(max

max=b[0],b[0]=b[max_i],b[max_i];

return;}

六、小结

函数定义、调用方法;return语句;

七、作业

 

重点强调函数使用中应注意的问题

 

教师自留

函数程序设计

(二)

内容

说明

主要内容

 

重点

 

难点

 

1.函数调用中的数据传递方法

2.局部变量、全局变量的定义和使用方法

3.函数的嵌套调用

 

函数使用中的难点

 

通过第一讲的【例2】分析值传递过程

 

通过第一讲的【例3】分析地址传递过程

 

1.函数调用中的数据传递方法

2.函数的嵌套调用

1.函数调用中的数据传递方法

2.函数的嵌套调用

一、函数调用中的数据传递方法

函数间传递数据有四种方式:

值传递方式;地址传递方式;返回值传递方式;全局变量传递。

前2种利用函数的参数来传递数据,后2种不是利用函数参数传递数据。

1.值传递方式

①是在形式参数和实际参数之间传递数据

②所传递的是参数值

调用函数时,将实际参数的值求出赋予对应的形式参数。

在函数体中对形参的处理与实参无关。

当函数体执行完毕,形参的值可能发生变化,但返回后,形参的值不带回到对应的实参中。

③特点:

参数值的单向传递

④形参一般是变量;实参可是变量或表达式。

2.地址传递方式

1是在形式参数和实际参数之间传递数据

②所传递的是地址

调用函数时,将实际参数的地址赋予对应的形式参数作为其地址。

由于形参和实参的地址相同(占用相同的内存),所以调用时,可看成将实参的值传递给形参;返回时,可看成将形参的值回带给对应的实参。

③特点:

参数值的双向传递

④形参是数组名或指针变量;实参是变量的地址、数组名或指针变量

3.值传递和地址传递方式的区别

值传递:

传递的是数值

地址传递:

传递的是地址。

二、变量的作用域、局部变量和全局变量

1.变量的作用域规则

变量只能在它的作用范围内使用。

变量的作用域与定义变量的位置有关。

2.局部变量:

在一个函数内部(或复合语句内部)定义的变量是内部变量,它只在本函数范围内有效。

①函数不能使用其他函数中定义的变量

②不同函数中可使用相同名字的变量,它们代表不同的对象,互

不干扰

③形式参数也是局部变量

在一个函数内部,在复合语句中定义的变量只在本复合语句中有效。

(2)全局变量:

在函数之外定义的变量称外部变量,外部变量是

全局变量(全程变量)。

它的有效范围为从定义变量的位置开始到本源文件结束。

三、函数的嵌套调用

在调用一个函数的过程中,又调用另一个函数。

 

例:

分析下列程序完成的功能

floatp(longi)

{longk,j;

注意嵌套调用的方法

for(k=j=1;j<=i;j++)

k=k*j;/*计算k=i!

*/

return((float)(k));

}

floats(longn)

{floatsum=0.0;

longk;

for(k=1;k<=n;k++)

sum+=p(k);/*计算sum=p

(1)+p

(2)+…+p(n)*/

return(sum);

}

floatf(longx,y)

{floatf1;

f1=s(x)/s(y);/*嵌套调用函数p()*/

return(f1);

}

main()

{longx1,y1;

scanf(“%ld,%ld”,&x1,&y1);

printf(“f(x,y)=%f\n”,f(x1,y1));}

结果:

f(x,y)=s(x)/s(y),s(n)=p

(1)+p

(2)+…+p(n),p(i)=i!

此程序中,函数f()通过函数s()调用了p()、主函数通过函数f()调用函数s()都称为两层嵌套调用;主函数调用通过函数f()、s()调用函数p()称为三层嵌套调用。

C语言规定:

不限制嵌套调用的层数,嵌套调用的层数仅受计算机内存的限制。

 

作业:

 

 

四、小结

全局变量、局部变量;函数的嵌套调用;数值传递与地址传递。

五、思考与练习

1、写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。

2、写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。

3、写一个函数,输入以行字符,将此字符串中最长的单词输出。

教师自留

 

函数程序设计(三)

内容

说明

主要内容

重点

难点

 

概念

1.函数的递归调用

2.系统函数

1.函数的递归调用

2.系统函数

函数的递归调用

一、函数的递归调用

1.定义:

在调用一个函数的过程中又出现直接或间接地调用该函数本身。

如图所示:

 

2.递归过程必须解决两个问题

(1)递归计算的公式

(2)递归结束的条件

3.递归过程的算法描述:

if(递归结束条件)return递归结束条件下的返回值);

elsereturn(递归计算公式);

4.递归调用函数的调用方法和一般函数的调用方法完全相同

【例1】编写一个计算n!

(n>1)的递归调用函数

函数清单如下:

main()

{longfact(intn);

intn;

printf(“\nPleaseentern:

”);

scanf(“%d”,&n);

printf(“\nn!

=%ld”,fact(n));

}

longfact(intn);

{if(n<1)

{printf(“inputerror!

\n”);

return(-1);

}

elseif(n==1)return

(1);

elsereturn(n*fact(n-1));

}

输入4

程序执行过程:

分2个阶段

递归过程:

将原始问题不断转化为规模小了一级的问题,从未知向已知推进,最终达到递归的结束条件;

回溯过程:

从已知条件出发,沿递归的逆过程逐一求值返回,直至递归初始处,完成递归调用(如下图)。

 

 

二、常用的系统函数

1.数学函数:

主要有14个,均包括在”math.h”中。

(1)求整型绝对值函数

【函数头】intabs(intx)

【返回值】参数x(整型)的绝对值(|x|)。

(2)求长整型绝对值函数

【函数头】Longlabs(longx)

【返回值】参数x(长整型)的绝对值(|x|)。

(3)求实型绝对值函数

【函数头】doublefabs(doublex)

【返回值】参数x(实型)的绝对值(|x|)。

(4)求小于或等于x的最大整数函数

【函数头】doublefloor(doublex)

【返回值】小于或等于x的最大整数

(5)求大于或等于x的最小整数函数

【函数头】doubleceil(doublex)

【返回值】大于或等于x的最小整数

(6)求正平方根函数

【函数头】doublesqrt(doublex)

【返回值】参数x的正平方根。

(7)求常用对数函数log10

(8)求自然对数函数log

(9)求指数函数exp

(10)求10的x次方函数pow10

(11)求x的y次方函数pow

(12)求正弦函数sin

(13)求余弦函数cos

(14)求正切函数tan

2.字符处理函数

主要有4个,均包括在头函数“ctype.h”中。

(1)判断是否是英文字母函数isalpha

(2)判断是否是英文小写字母函数islower

(3)判断是否是英文大写字母函数isupper

(4)判断是否是数字字符函数isdigit

3.类型转换函数

主要有5个,包括在不同的头函数中。

(1)将大写字母转换为小写字母函数tolower

(2)将小写字母转换为大写字母函数toupper

(3)将字符转换成ASCII代码值函数toascii

上述3个函数包括在头函数“ctype.h”中。

(4)将字符串转换成浮点数函数atof

(5)将字符串转换成整数函数atoi

上述2个函数包括在头函数“math.h”中。

4.字符串处理函数

主要有8个,前2个包括在头函数“stdio.h”中。

后6个均包括在头函数“string.h”中。

(1)字符串输出函数puts

(2)字符串输入函数gets

(3)测试字符串长度函数strlen

(4)字符串大写字母该小写字母函数strlwr

(5)字符穿小写字母改大写字母函数strupr

(6)字符串复制函数strcpy

(7)字符串比较函数strcmp

(8)字符串连接函数strcat

【例2】输入一个字符串存入数组a,将其复制到数组b,然后将数组b中的所有小写字母改为大写字母,再将a中字符串连接到b。

比较并输出a、b中字符串的大小,统计并输出a、b中字符串的长度,最后输出a、b中的字符串。

#include“stdio.h”

#include“string.h”

main()

{chara[40],b[80];

gets(a);strcpy(b,a);strupr(b);strcat(b,a);

if(strcmp(a,b)<0)printf(“a

elseif(strcmp(a,b)>0)printf(“a>b\n”);

elseprintf(“a=b\n”);

printf(“lengthofa(%s)=%d\n”,a,strlen(a));

printf(“lengthofb(%s)=%d\n”,b,strlen(b));

puts(a);puts(b);

}

 

三、小结

教师自留

递归定义、调用方法、执行过程、递归的算法。

字符、字符串处理函数

四、思考与练习

1、写几个函数:

a、输入10个职工的姓名和职工号b、按职工号有小到大顺序排序,姓名顺序也随之调整c、要求输入一个职工号,用折半查找的方法找出该职工的姓名,从主函数输入要查询的职工号,输出该职工的姓名。

2、写一个函数,输入一个十六进制数,输出相应的十进制数。

3、给出年月日,计算该日是该年的第几天。

4、用递归法将一个整数n转换成字符串。

例如输入483,应输出字符串“483”,n的位数不确定,可以是任意位数的整数。

重点讲解字符处理函数

floor(-10.5)为–11.0

labs(-10L)

abs(-10)

abs(-327

68)

根据情况可再举一个例子

难点是回溯过程

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2