大学C语言程序设计第二版(电子工业)第6章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理第6章函数与编译预处理6.1函数概述6.2函数的定义和说明6.3函数的调用6.4函数的参数6.6变量的存储类型6.7内部函数和外部函数6.8编译预处理命令6.5函数的嵌套调用与递归调用大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理6.1函数概述★函数是封装了一定功能的模块★C语言是函数驱动式语言(一个源程序文件由一个或多个函数组成)#include“stdio.h”voidmain()//函数头{inta=8;printf(“a=%d”,a);}//函数体大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理★一个C源程序必须有且只能有一个主函数main()。C程序总是从main()函数开始执行,最后结束于main()函数,其他函数是通过main()直接或间接调用完成其功能的。#includestdio.hintadd(intx,inty){ints;s=x+y;returns;}main(){inta=1,b=2,c;c=add(a,b);printf(%d\n,c);}kj61一、函数定义二、函数声明三、函数调用#includestdio.hmain(){inta=1,b=2,c;intadd(intx,inty);c=add(a,b);printf(%d\n,c);}intadd(intx,inty){ints;s=x+y;returns;}大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理函数概述(1)一个C程序由一个或多个源(程序)文件组成——可分别编写、编译和调试。(2)一个源文件由一个或多个函数组成,可为多个C程序公用。(3)C语言是以源文件为单位而不以函数为单位进行编译的。(4)在C语言中,所有函数(包括主函数main())都是平行的。一个函数的定义,可以放在程序中的任意位置,主函数main()之前或之后。但在一个函数的函数体内,只能调用其他函数,不能再定义另一个函数,即不能嵌套定义。大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理(5)主函数名main是系统定义的,是运行时首先被调用的函数,它可以调用其他函数,但不能被其他函数调用;其他函数间可以互相调用,也允许嵌套调用。(6)从函数定义的角度看,函数可分为库函数和用户定义函数两种。①库函数:由C系统提供,用户无须定义,也不必在程序中进行类型说明,只需在程序前写出包含有该函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到的printf()、scanf()、getchar()、putchar()、gets()、puts()等函数均在头文件stdio.h中,sqrt(),fabs(),pow()等函数均在头文件math.h中。②用户定义函数:由用户按需要编写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,而且还必须在主调函数模块中对该被调函数进行类型说明,然后才能使用。(7)从主调函数和被调函数之间数据传送角度看,函数又可分为无参函数和有参函数两种。(8)C语言的函数兼有其他语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理6.2.1函数定义C语言函数定义格式如下:[函数返回值的类型名]函数名([类型名形式参数1,类型名形式参数2,…])/*函数头*/{[说明部分;]/*函数体*/[语句部分;]}其中[]内为可选项。注意:函数名、一对圆括号和花括号不能省!6.2函数的定义和说明大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理1.无参函数无参函数的一般形式函数返回值的类型名函数名(void){[说明语句部分;][可执行语句部分;]}例:构造一个输出一行”*”的函数:voidprintstar(void){printf(“******************\n”);}kj62大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理2.有参函数例:编写函数交换2个数;kj63voidswap(inta,intb){inttemp;temp=a;a=b;b=temp;}不能写成:voidswap(inta,b){inttemp;temp=a;a=b;b=temp;}函数返回值类型函数名参数类型说明及参数列表大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理6.2.2函数的返回值函数分为有返回值函数和无返回值函数。return语句的格式:return(表达式);或return表达式;或return;功能:1、把return后面“表达式”的值带给调用函数;2、把控制转向调用函数;格式return;只有功能2大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理例:编写函数,返回2个整数的最大公约数。(辗转相除法)kj64intf(intx,inty){intr,t;if(xy){t=x;x=y;y=t;}while((r=x%y)!=0){x=y;y=r;}returny;}大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理注意:(1)声明为void型的函数中不能包括带值的return语句;主函数体内一般不用return语句。(2)当函数没有return语句时,以结束函数的大括号}作为返回点。但这时并不表明函数没有返回值,这时的返回值是系统给的不确定值。(3)在同一函数内,可根据需要在多处出现return语句,但函数第一次遇到return时就立即停止执行,并返回到主调函数;(4)return语句中返回值表达式的类型应该和函数类型一致。如果不一致,则以函数类型为准,由系统自动进行转换。如果缺省函数类型,则系统一律按int类型处理。intf(chars1,chars2){if(s1==s2)return1;return0;}kj65大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理例:计算两数之和#includestdio.hdoubleadd(doublex,doubley){doubles;s=x+y;returns;}main(){doublea,b,c;a=10.5;b=20.3;c=add(a,b);printf(%lf,add(a,b));add(a,b);}Kj66运行结果为:30.8改成:intadd(doublex,doubley)?大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理6.2.3函数说明1.函数说明的形式函数说明也称为函数声明,使用函数说明语句能够让C编译程序了解函数返回值类型被调用函数说明一般格式如下:函数类型函数名(数据类型[参数名1][,数据类型[参数名2]…]);函数说明语句其实就是函数定义中的函数首部加上分号,这些内容称为函数原型。如:doublemax(doublex,doubley);voidswap(inta,intb);大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理例:计算两数之和#includestdio.hmain(){doublea,b,c;a=10.5;b=20.3;c=add(a,b);printf(%lf,add(a,b));add(a,b);}doubleadd(doublex,doubley){doubles;s=x+y;returns;}kj67doubleadd(doublex,doubley);doubleadd(doublex,doubley);大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理注意:有三种情况不需说明:a、函数返回值为整型或字符型;b、被调用函数定义出现在主调函数之前;c、已在所有的函数定义之前(即文件的开头)说明了函数类型。大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理6.3函数的调用1、调用形式:函数名(实参表列);实参与形参个数相等,类型一致。调用函数时两者按顺序一一对应传递数据。大学C/C++语言程序设计第6章函数与编译预处理main(){inta=1,b,f(int,int);b=f(a,++a);printf(%d,b);}intf(intx,inty){intz;if(xy)z=1;elseif(x==y)z=0;elsez=-1;return(z);}例:参数求值顺序main(){inta=1,b,f(int,int);b=f(a,a++);printf(%d,b);}intf(intx,inty){intz;if(xy)z=1;elseif(x==y)z=0;elsez=-1;return(z);}运行结果:0运行结果:1大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理2、调用方式:按函数在程序中出现的位置来分有三种方式。①函数语句。只完成一个操作,并不要求函数带回值。如:printstar();scanf(“%d”,&a);②函数表达式。出现在表达式中,函数值参与表达式运算。如:c=2*max(a,b);y=x+power(x,3);③函数参数。函数调用作为一个函数的实参。如:m=max(a,max(b,c));printf(“%8.2f\n”,power(x,3));大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理课堂练习:下面程序的输出结果是()。#includestdio.hfunc(inta,intb){intc;c=a+b;returnc;}main(){intx=6,y=7,z=8,r;r=func((x--,y+=2,x+y),z);printf(%d\n,r);}A.11B.20C.21D.22大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理课堂练习:若有以下函数调用语句:fun(a+b,(x,y),fun(n+k,d,(a,b)));fun函数参数的个数是A)3B)4C)5D)6大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理6.4函数的参数–形参与实参•形式参数:定义函数时函数名后面括号中的变量名。•实际参数:调用函数时函数名后面括号中的表达式。大学C/C++语言程序设计第6章函数与编译预处理大学C/C++语言程序设计第6章函数与编译预处理例:编写程序实现从两整数中求较大数。#includestdio.hfloatmax(floatx,floaty);/*函数说明*/main(){floata,b;floatc;scanf(%f,%f,&a,&b);c=max(a,b);/*调用函数语句,a,b为实参*/printf(a=%f,b=%f\nmax=%f\n,a,b,c);}floatmax(floatx,floaty)/*函数定义,x,y为形参*/{floatz;z=xy?x:y;printf(“x=%f,y=%f\nz=%f\n”,x,y,z);return(z);}xy形参ab实参大学C/C++语言程序设计第6章函数与编译预处理•说明:–实参必须有确定的值,形参必须指定类型–形参与实参类型一致,个数相同–若形参与实参类型不一致

1 / 90
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功