C语言89学习教程.pptx
《C语言89学习教程.pptx》由会员分享,可在线阅读,更多相关《C语言89学习教程.pptx(92页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第八章 函数intsquare(int);floatsqrt1(int);main()intk;for(k=1;k=10;k+)printf(”%d的平方%d:”,k,square(k);printf(”%d的平方根%f:”,k,sqrt1(k);intsquare(inty)returny*y;floatsqrt1(inty)returnsqrt(y);第1页/共92页2第八章 函数说明一个源程序文件由一个或多个函数组成,一个源程序文件是一个编译单位。一个C程序由一个或多个源程序文件组成C程序的执行从main函数开始,调用其他函数后返回到main函数所有函数都是平行的,不能嵌套,但可以互相
2、调用(不能调用main函数)函数分标准函数和用户自定义函数第2页/共92页3库函数简介系统自带的标标准库函数根据不同的功能作用放在不同的头文件中。使用时只需在程序的开头加上一条语句:#include根据使用的函数来确定根据使用的函数来确定第3页/共92页4如:如:stdio.hstdio.h用于标准输入用于标准输入/输出输出math.hmath.h用于数学计算用于数学计算ctype.hctype.h用于字符处理用于字符处理string.hstring.h用于字串处理用于字串处理time.htime.h用于时间用于时间/日期的处理日期的处理dir.hdir.h用于控制目录和路径用于控制目录和路径
3、graphics.hgraphics.h用于图形操作用于图形操作dos.hdos.hbios.hbios.h用于接口处理用于接口处理 第4页/共92页5函数调用的执行过程函数的声明与使用main()调fun()结束fun()返回保存:返回地址当前现场恢复:主调程序现场返回地址第5页/共92页6第八章 函数函数定义形式无参函数类型标识符函数名()声明部分语句例如p143,printstar()和print_message()函数有参函数类型标识符函数名(形式参数表列)声明部分语句第6页/共92页7第八章 函数有参函数举例intmul(intx,inty)intz;z=x*y;return(z);
4、形参说明的传统方式intmul(x,y)intx,y;intz;z=x*y;return(z);第7页/共92页8第八章 函数空函数类型标识符函数名(形式参数表列)例如:dummy()第8页/共92页9函数参数和函数值形式参数和实际参数(简称形参和实参)在定义函数中指定的形参,在未出现函数调用时,它们不占内存中的存储单元。只有在发生函数调用时,形参才被分配内存单元。在调用结束后,形参所占的内存单元被释放。实参可以是常量、变量或表达式,在调用时实参要有确定的值。例:a=5;b=7;mul(10,a+b);实参与形参的类型应相同或赋值兼容当实参变量为简单类型时,实参变量对形参变量的数据传递是“值传
5、递”,其特点是形参值的变化不会改变实参值的变化。第9页/共92页10第八章 函数main()inta,b;a=5;b=8;swap(a,b);printf(“a=%d,b=%dn”,a,b);swap(intx,inty)intt;t=x;x=y;y=t;考虑:a与b的值是多少?第10页/共92页11第八章 函数函数的返回值三种类型:单纯计算,专门对一系列参数作运算,并将结果返回。像sqtr(x)、sin(x)、pow(y,x)等。返回操作信息,并返回一个表明操作是否成功的简单值。无明确的返回值,此函数是一个单纯的过程,产生的结果不会令人感兴趣。像printf()函数返回所写入的字符个数。如果
6、想要从被调函数中得到明确的值,则函数中一定包含return语句。第11页/共92页12第八章 函数一个函数中可以有一个以上的return语句,只要遇到return语句就返回到主调函数中。如果一个函数明确表示没有返回值,可用void定义函数类型为无类型,例:voidprintstar()voidprint_message()注:如果函数已用void声明,则在主调函数中不能出现下面的用法:a=printstar();b=print_message();第12页/共92页13第八章 函数函数的调用函数语句printstar();只要求函数完成一个操作过程函数表达式m=100+mul(a,b);要求此
7、函数有返回值函数参数m=max(a,mul(b,c);或printf(”%d”,max(a,b);第13页/共92页14第八章 函数被调函数的声明使用库函数时,应在程序头部用#include命令将调用有关库函数所需的信息包含到文本中来使用用户自定义函数使用在前,定义在后,则在主调函数中要声明被调函数第14页/共92页15第八章 函数main()floatadd(float,float);floata,b,c;scanf(”%f,%f”,&a,&b);c=add(a,b);printf(”sumis%f”,c);floatadd(floatx,floaty)floatz;z=x+y;return
8、(z);第15页/共92页16floatadd(floatx,floaty)floatz;z=x+y;return(z);main()floata,b,c;scanf(”%f,%f”,&a,&b);c=add(a,b);printf(”sumis%f”,c);定义在前,使用在后,则在主调函数中不必声明被调函数第16页/共92页17在所有函数定义之前,在函数的外部做了声明,则在各主调函数中不必再声明要调用的函数floatadd(floatx,floaty);main()floata,b,c;scanf(”%f,%f”,&a,&b);c=add(a,b);printf(”sumis%f”,c);f
9、loatadd(floatx,floaty)floatz;z=x+y;return(z);第17页/共92页18第八章 函数函数的嵌套调用函数定义是相互平行的、独立的,不能嵌套定义,但函数之间可以相互调用,下面是错的f1(intx,inty)intz;if(xy).f2(floatu,floatv)intk,j;.第18页/共92页19第八章 函数下面使用是正确的f1(intx,inty)intw,u,v;if(xy).w=f2(u,v);f2(ints,intt).第19页/共92页20第八章 函数函数的递归调用定义:在调用一个函数的过程中又出现直接或间接地调用该函数本身。调用方式直接调用间
10、接调用第20页/共92页21第八章 函数间接调用F1(intx,inty)F2(inta,intb)intu,v;intr,s;.F2(u,v);F1(r,s);.出现的机会很少,编程时防止出现死循环调用第21页/共92页22第八章 函数直接调用F1(intx,inty)intu,v;.F1(u,v);.出现的机会多出现的机会多第22页/共92页23递归的特点递归的特点一个问题能够成为递归必须具备的条件是:后一部分与原始问题类似后一部分是原始问题的简化第23页/共92页24编程时一般将直接递归调用认为递归调用。函数递归调用编程时也有一定的次数,否则会变成死循环调用。一般情况下递归调用须能写出如
11、下函数形式:An=0or1(A,B为常数)f(n)=Bf(n-1)n0orn1注:Bf(n-1)表示与f(n)有某种特定关系,非数学函数中的定义式。第24页/共92页25它写成程序后包含两个过程:回推和递推回推:从函数自变量n=N不定值推到函数自变量n=1时的确定值递推:从函数自变量n=1时的确定值依次推到函数自变量n=N时的函数值例:P160例8.8第25页/共92页265 5!的执行过程!的执行过程:设设:输入输入 5 5 (n n=5)=5)第第1 1次调用:次调用:y=fac(5)y=fac(5)返回:返回:y=5fac(4)y=5fac(4)第第2 2次调用:次调用:y=5*4fac
12、(3)y=5*4fac(3)第第3 3次调用:次调用:y=5*4*3fac(2)y=5*4*3fac(2)第第4 4次调用:次调用:y=5*4*3*2fac(1)y=5*4*3*2fac(1)第第5 5次调用:次调用:y=5*4*3*2*1*fac(0)y=5*4*3*2*1*fac(0)第26页/共92页27例:用递归法将一个整数n拆成一位一位的输出。如输入483,拆成3位4、8、3,按位输出4、8、3,位数任意。nn=10第27页/共92页28#include“stdio.hvoid convert(long n)long i;if(n10)printf(“%ld“,n);return;e
13、lse printf(“%ld“,n%10);i=n/10;convert(i);返返回回convert(438)convert(438)打印打印8 8convert(43)convert(43)打印打印3 3convert(4)convert(4)打印打印4 4返返回回在在convert(i)convert(i)后加一条语句:后加一条语句:printf(printf(“n#n#”);观察打印几观察打印几次次“#”第28页/共92页29 main()long x;scanf(“%ld”,&x);convert(x);输入:1234 输出:4321 考虑:如何打印出 1234 的顺序?第29页/
14、共92页30void convert(long n)long i;if(n0)fun(k-1);printf(“%d”,k);0 1 2 3 4 5第32页/共92页33设计函数int ArrayMin(int d,int n);其中d为数组,n为数组元素个数,ArrayMin返回d中最小元素。dn-1 当n=1 f(d,n)=dn-11 第33页/共92页34#include stdio.h int ArrayMin(int d,int n)if(n=1)return dn-1;else if(dn-1 02.求杨辉三角形中第n行(n0)的第k个系数(0kn)。1k=0ork=nC(n,k)
15、=C(n-1,k-1)+C(n-1,k)0kn3.编写程序实现十进制转换为S进制(2S9)。第35页/共92页36第八章 函数数组作为函数参数数组元素作函数参数与用简单变量作实参一样,是单项传递,即“值传递”举例第36页/共92页37第八章 函数main()int mul(int,int);int a=2,2,2,2,b=4,4,4,4,c4,k;for(k=0;k 4;k+)ck=mul(ak,bk);for(k=0;k 4;k+)printf(“%d,%d,%d n”,ak,bk,ck);int mul(int x,int y)x=x+2;y=y+2;return(x*y);第37页/共9
16、2页38第八章 函数数组名作函数参数在主调函数和被调函数中都要定义数组实参数组和形参数组类型须一致实参数组和形参数组大小可一致或不一致形参数组可不指定大小传递方式是地址传递,即把实参数组的起始地址串地传递给形参数组,实参数组与形参数组共同占用同一段内存单元(p166图8.14)形参数组中各元素值的变化将引起实参数组中各元素值同时变化举例第38页/共92页39 main()int mul(int,int,int,int);int a=2,2,2,2,b=4,4,4,4,c4,k;mul(a,b,c,4);for(k=0;k4;k+)printf(“%d,%d,%d n”,ak,bk,ck);in
17、t mul(int x,int y,int z,int n)int j;for(j=0;j n;j+)x j=x j+2;y j=y j+2;c j=x j*y j;第39页/共92页40第八章 函数值传递时最多只能返回一个值,而地址传递隐含地可返回多个值多维数组名作函数参数与前面数组名作参数一样,但在被调函数中对数组的定义可指定每一维的大小,也可省略第一维的大小说明。例如:intarray320;或intarray20;但不能写成:intarray;或intarray3;第40页/共92页41例:有以下数组定义和f函数调用语句,则在f函数的说明中,对形参数组array的错误定义方式为_int
18、a34;f(a);A)f(intarray6)B)f(intarray3)C)f(intarray4)D)f(intarray25)B例:假设有子串“ould”,任意输入一个句子,并在句子中寻找给出的匹配子串,若找到,打印整个句子,找不到,继续输入句子直到输入一个空句子。第41页/共92页42举例:模拟投骰子n次,观察1到6的每个数值出现的次数#includestdio.h#includestdlib.hvoidp_rand(intn,intA)inti,x;for(i=1;i=n;i+)x=1+rand()%6;Ax+;第42页/共92页43main()voidp_rand(int,intA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 89 学习 教程
限制150内