C语言程序基础教程.pptx
《C语言程序基础教程.pptx》由会员分享,可在线阅读,更多相关《C语言程序基础教程.pptx(294页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C语言程序基础教程语言程序基础教程(第(第8-13章)章)第8章 函数 C语言程序设计 第八章 函数概述函数定义的一般形式函数参数和函数的值函数的调用函数的嵌套调用函数的递归调用数组作为函数参数局部变量和全局变量变量的存储类别内部函数和外部函数运行一个多文件的程序本章学习目标:C语言程序设计 第八章 函数认识到函数是一种简化程序结构的重要手段;理解函数调用和函数调用过程中的参数传递;理解函数原型(声明)和怎样写函数原型;能够用前几章的知识实现简单的函数;能够用return语句实现函数的返回值;能够理解函数调用过程中形式参数和实际参数的关系,理解数组名作为函数参数时代表的意义;能够理解函数的嵌套
2、调用和递归调用机制。8.1 概述函数的概念 C语言程序设计 第八章 函数一个大的程序一般应分为若干个程序模块,每个模块实现一个特定的功能,这些模块称为子程序,在C语言中子程序用函数实现。mainabca1abb1b2不能被调用所有函数都是平行的,不能嵌套定义分为:库函数和自定义函数 C语言程序设计 第八章 函数一、常规方法:各函数包含在一个文件中例T8-1.c#includevoidmain()voidprintstar();voidprint_message();printstar();print_message();printstar();voidprintstar()printf(“*n
3、”);voidprint_message()printf(“_How_do_you_do!n”);运行结果:*Howdoyoudo!*C语言程序设计 第八章 函数二、工程的方法 例:某程序由四个文件组成,其中,一个文件包含主函数,两个文件包含两个被调用函数。一个为工程文件,包含这个程序的三个文件名。操作:Alt+pProjectname:T8-1-4.prjAlt+R结果同上T8-1-1.cmain()p1();p2();p1();T8-1-2.cp1()printf(“*n”);T8-1-3.cp2()printf(“Howdoyoudo!n”);T8-1-4.prjT8-1-1T8-1-2
4、T8-1-3 C语言程序设计 第八章 函数三、文件包含的方法 在主函数中使用文件包含预编译命令,将不在本文件而在其它文件中的函数进行预编译处理把各文件中的函数包含到本文件中来,然后一起进行编译、连接、运行。T8-1-5.c#include“T8-1-2.c”#include“T8-1-3.c”main()p1();p2();p1();运行结果同上几点说明:(1)一个源文件由一个或者多个函数组成。(2)一个C程序由一个或者多个源文件组成。(3)C程序的执行从main 函数开始。(4)所有的子函数都是平行的。(5)从用户的角度看,函数分库函数和自定义函数。(6)函数形式:无参函数:主调函数无数据传
5、送给被调函数,可带或不带返回值。有参函数:主调函数与被调函数间有参数传递,主调函数可将实参传送给被调函数的形参,被调函数的数据可返回主调函数。C语言程序设计 第八章 函数根据(1)(2)(3)可知,逻辑上一个C语言程序是由函数构成的,C语言程序从主函数开始执行,在主函数中调用其他函数,这些函数可能又调用别的函数,主函数执行完毕代表整个程序结束。主函数只能调用不能被调用。物理上一个程序由一个或者若干个文件(源文件)构成,函数分别放置在这些文件中。8.2 函数定义的一般形式无参函数的定义形式v类型标识符:l用于指定函数带回的值的类型,不写时为int型。l不带回值时可以不写。C语言程序设计 第八章
6、函数类型标识符 函数名()说明部分 语句例 无参函数 printstar()printf(“*n”);或 printstar(void)printf(“*n”);合法标识符合法标识符函数体函数体有参函数定义的一般形式 C语言程序设计 第八章 函数类型标识符 函数名(形式参数表列)说明部分 语句现代风格:函数返回值类型函数返回值类型隐含为隐含为intint型型函数体函数体例 有参函数(现代风格)intmax(intx,inty)intz;z=xy?x:y;return(z);例 有参函数(现代风格)intmax(intx,y)intz;z=xy?x:y;return(z);空函数v为扩充功能预留
7、,在主调函数中先占一个位置。C语言程序设计 第八章 函数类型标识符 函数名()例 空函数 dummy()函数体为空函数体为空对形参的声明的传统方式v即把对形参的声明放在函数定义的下一行类型标识符 函数名(形参表)形参类型说明说明部分 语句例 有参函数(传统风格)intmax(x,y)intx,y;intz;z=xy?x:y;return(z);8.3 函数参数和函数的值形式参数和实际参数v形式参数:定义函数时函数名后面括号中的变量名v实际参数:调用函数时函数名后面括号中的表达式 C语言程序设计 第八章 函数例8.2比较两个数并输出大者#includevoidmain()intmax(intx,
8、inty);inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Maxis%d,c);max(intx,inty)intz;z=xy?x:y;return(z);形参实参c=max(a,b);(main函数)(max函数)max(intx,inty)intz;z=xy?x:y;return(z);运行:7,8Maxis8v几点说明:l实参可以是常量、变量或表达式。必须有确定的值。当函数调用时,将实参的值传递给形参,若是数组名,则传送的是数组首地址。l形参必须指定类型,只能是简单变量或数组,不能是常量或表达式l形参与实参类型一致,个数相同顺序相同。l若形参
9、与实参类型不一致,自动按形参类型转换函数调用转换l形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放l实参对形参的数据传送是值传送,也是单向传送,当被调函数的形参发生变化时,并不改变主调函数实参的值。形、实参占据的是不同的存储单元 C语言程序设计 第八章 函数 C语言程序设计 第八章 函数例:形、实参占据的是不同的存储单元#includevoidmain()inta=2,b=3;printf(“a=%d,b=%dn”,a,b);printf(“&a=%x,&b=%xn”,&a,&b);add(a,b);printf(“a=%d,b=%dn”,a,b);printf(“&a
10、=%x,&b=%xn”,&a,&b);add(intx,inty)x=x+8;y=y+12;printf(“x=%d,y=%dn”,x,y);printf(“&x=%x,&y=%xn”,&x,&y);2+8=103+12=1523ffd2ffd4ffd6ffd8xayb运行结果:a=2,b=3&a=ffd6,&b=ffd8x=10,y=15&x=ffd2,&y=ffd4a=2,b=3&a=ffd6,&b=ffd8函数的返回值v返回语句形式:return(表达式);或 return表达式;v功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数 C语言程序设计 第八章 函数说明:函
11、数的返回值,必须用 return语句带回。return语句只能把一个返值传递给调用函数。函数中可有多个return语句,执行哪一个由程序执行情况来定。if(ab)return(a);elsereturn(b);return后的值可以是一个表达式,如:return(xy?x:y);返回值的类型为定义的函数类型,不指定的按整型处理。如:intmax(intx,inty)floatmin(floata,floatb)doubleabc(floatd1,floatd2)l若 return语句中表达式类型与函数类型不一致,则转换为函数类型。l若无return语句,遇时,自动返回调用函数。可能返回一个不确
12、定或无用的值。l无返回值的函数,定义为 void类型。C语言程序设计 第八章 函数printstar()printf(*);main()inta;a=printstar();printf(%d,a);例:无return语句,函数带回不确定值输出:10voidprintstar()printf(*);main()inta;a=printstar();printf(%d,a);编译错误!C语言程序设计 第八章 函数voidswap(intx,inty)inttemp;temp=x;x=y;y=temp;例:无返回值函数例8.3:函数返回值类型转换#includevoidmain()intmax(f
13、loatx,floaty);floata,b;intc;scanf(%f,%f,&a,&b);c=max(a,b);printf(Maxis%dn,c);max(floatx,floaty)floatz;z=xy?x:y;return(z);输入:1.5,2.5输出:Maxis28.4 函数的调用主调函数:主动去调用其它函数 被调函数:被其它函数所调用函数调用的一般形式函数名(实参表列)v说明:l实参表列:有确定值的数据或表达式l实参与形参个数相等,类型一致,按顺序一一对应,当有多个实参时,实参间用“,”分隔l实参表求值顺序,因系统而定(TurboC自右向左)l调用无参函数时,实参表列为空,但
14、()不能省 C语言程序设计 第八章 函数 C语言程序设计 第八章 函数#includevoidmain()intf(inta,intb);inti=2,p;p=f(i,+i);printf(%d,p);intf(inta,intb)intc;if(ab)c=1;elseif(a=b)c=0;elsec=-1;return(c);例8.4参数求值顺序按自右向左求值函数调用等于f(3,3)运行结果:0按自左向右求值函数调用等于f(2,3)运行结果:-1为使程序有通用性:需自右向左求值时,需自右向左求值时,改为:改为:j=+i;j=+i;p=f(j,j);p=f(j,j);需自左向右求值时,需自左向
15、右求值时,改为:改为:j=i;j=i;k=+i;k=+i;p=f(j,k);p=f(j,k);Printf(“%d,%d”,i,i+);/*同样存在此情况*/函数调用的方式按函数在程序中出现的位置,有三种调用方式:v函数语句:以独立的语句去调用函数。不要求有返回值,仅完成一定的操作。例 printstar();printf(“Hello,World!n”);v函数表达式:函数返回一个确定值,以参加表达式的运算。不可用于void例 m=max(a,b)*2;v函数参数:函数调用作为另一个函数的参数。例 printf(“%d”,max(a,b);/*输出大数*/m=max(a,max(b,c);/
16、*三数比大小*/C语言程序设计 第八章 函数对被调用函数的声明和函数原型v对被调用函数要求:l必须是已存在的函数l库函数:#includel用户自定义函数:如果被调函数定义在主调函数之后,那么在主调函数中对被调函数作声明。C语言程序设计 第八章 函数函数声明一般形式:函数类型 函数名(形参类型 形参名,.);或 函数类型 函数名();作用:告诉编译系统函数类型、参数个数及类型,以便检验C语言中函数声明称为函数原型。函数定义与函数声明不同,声明只与函数定义的第一行相同。声明可以不写形参名,只写形参类型。函数说明位置:程序的数据说明部分(函数内或外)C语言程序设计 第八章 函数#includevo
17、idmain()floatadd(floatx,floaty);/*对被调用函数的声明*/floata,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%f,c);floatadd(floatx,floaty)/*函数首部*/floatz;/*函数体 z=x+y;return(z);floatadd(float,float);例8.5对被调用的函数作声明输入:3.6,6.5输出:sumis10.100000v说明:l旧版本C中函数声明不采用函数原型,只声明函数名和函数类型。如:floatadd()l函数调用之前,如果未对函数作声明,则编译系统把第一次
18、遇到的函数形式作为函数声明,并默认为int型。即:函数类型是int型可以不作函数声明,最好作声明。l被调用函数的定义(程序)在主调函数之前,可以不加函数声明。l在所有函数定义前,已在函数外部做了函数声明,则在各主调函数中可以不加函数声明。C语言程序设计 第八章 函数#includefloatadd(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);被调函数出现在主调函被调函数出现在主调函数数之前,不必函数说明之前,不必函数说明voidmain
19、()floata,b;intc;scanf(%f,%f,&a,&b);c=max(a,b);printf(Maxis%dn,c);max(floatx,floaty)floatz;z=xy?x:y;return(z);intint型函数可不作函数说明型函数可不作函数说明charletter(char,char);floatf(float,float);intI(float,float);main()charletter(charc1,charc2)floatf(floatx,floaty)IntI(floatj,floatk)在函数外面做函数说明在函数外面做函数说明 C语言程序设计 第八章 函
20、数main()调fun()结束fun()返回保存:返回地址当前现场恢复:主调程序现场返回地址函数调用的执行过程8.5 函数的嵌套调用 C语言程序设计 第八章 函数不允许嵌套定义,函数间的关系是平行的、独立的。C中的函数:允许嵌套调用,即在调用某函数过程中又调用另一函数。main()调用函数a结束a函数b函数调用函数b C语言程序设计 第八章 函数#includeintfun1(intx,inty);voidmain(void)inta,b;scanf(“%d%d”,&a,&b);printf(“Theresultis:%dn”,fun1(a,b);intfun1(intx,inty)intfu
21、n2(intm);return(fun2(x)+fun2(y);intfun2(intm)return(m*m);例 输入两个整数,求平方和输入:34输出:Theresultis:25 C语言程序设计 第八章 函数#includeintdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain()inta,b,c,d;scanf(%d%d%d,&a,&b,&c);d=dif(a,b,c);printf(Max-Min=%dn,d);例 求三个数中最大数和最小数的差值intdif(intx,inty,int
22、z)returnmax(x,y,z)-min(x,y,z);intmax(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);intmin(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);main()调用函数dif输出结束dif函数max函数调用函数max调用函数minmin函数skip C语言程序设计 第八章 函数例8.6用弦截法求方程 的根yxf(x)0 x1x2xf(x1)f(x2)1.取x1,x2两点,求得f(x1),f(x2)。异号:x1,x2之间必有一根。同号:改变x1,x2,直到f(x1),f(x2)异号
23、为止。2.连f(x1),f(x2)两点(弦)交x轴于x。X点的坐标求法:求X点的x坐标 从x值得f(x)3.若f(x)与f(x1)同号,则根必在(x,x2)区间,此时将x1=x;若f(x)与f(x2)同号,则根必在(x1,x)区间,此时将x2=x;4.重复步骤2和3,直到|f(x)|为止,设10-6,则 f(x)0用三个函数实现各部分的功能:函数f(x):求x的函数:x3-5x2+16x-80函数xpoint(x1,x2):求弦与x轴交点X的x坐标 函数root(x1,x2):求(x1,x2)区间的实根 C语言程序设计 第八章 函数求弦与x轴的交点x输入x1,x2,求f(x1),f(x2)直到
24、f(x1)与f(x2)异号y=f(x),y1=f(x1)y与y1同号真假x1=xy1=yx2=x直到|y|root=x输出 rootroot函数main()调用函数root输出根 x结束root函数xpoint函数调用函数xpoint调用函数ff函数 C语言程序设计 第八章 函数#include#includefloatf(floatx)floaty;y=(x-5.0)*x+16.0)*x-80.0;return(y);floatxpoint(floatx1,floatx2)floaty;y=(x1*f(x2)-x2*f(x1)/(f(x2)-f(x1);return(y);floatroot
25、(floatx1,floatx2)floatx,y,y1;y1=f(x1);dox=xpoint(x1,x2);y=f(x);if(y*y10)y1=y;x1=x;elsex2=x;while(fabs(y)=0.0001);return(x);voidmain()floatx1,x2,f1,f2,x;doprintf(“inputx1,x2:n”);scanf(“%f%f”,&x1,&x2);f1=f(x1);f2=f(x2);while(f1*f2=0);x=root(x1,x2);printf(“Arootofequationis%8.4fn”,x);运行情况:Inputx1,x2:2,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 程序 基础教程
限制150内