1第六章函数西南交通大学软件学院计算机基础教研室戴克俭制作C++编程导论26.1函数概述函数是C++程序构成的基本模块。每个函数完成一个特定的任务,具有相对独立的功能,是执行一项具体任务的代码块。C++语言中程序由主函数、内置函数(或称库函数)以及用户自定义函数(常称子函数)构成的。一个C++程序通常由一个主函数和若干个函数构成,C++程序的执行从主函数开始,调用其他函数后流程返回到主函数,在主函数中结束整个程序的运行3C++语言程序中函数之间的调用关系:主函数可以调用任何子函数。子函数可以调用任何子函数。当子函数调用它本身时,称为递归调用。子函数不能调用主函数。每个函数既相互独立又可相互联系,一个函数并不从属于另一个函数,函数不能嵌套定义,即不能在一个函数中再定义另一个函数。6.1函数概述4★从用户使用的角度看,函数可分为两种:1、内置函数(或称库(系统)函数)内置系统函数是其任务预先定义了的函数,即该函数完成任务的代码预先写好且出现在使用该函数的程序外部。内置系统函数的函数定义是包含在称为库的文件中,它是语言编译器附带的并且存于计算机的硬盘上。编译器附带许多库文件,每一个包含一组专用函数的函数定义。使用内置系统函数的原因:许多重要的功能都可以利用C++系统提供的内置系统函数来实现,使编程简单、快捷。6.1函数概述52、用户自定义函数用户自定义函数:是那些任务由程序员决定并且定义在使用该函数的程序中。每一个C++程序中至少包含一个自定义函数main(),大多数程序都包含许多自定义函数。★从函数调用后有无返回值,函数可分为两种:1、有返回值型函数完成指定任务后返回一个值给调用该函数的语句2、void函数不返回一个值给调用该函数的语句。6.1函数概述6★从函数的形式看,函数可分为:1、有参函数在调用函数时,在主调函数和被调用函数之间有数据传递,即主调函数可以将数据传给被调用函数使用,被调用函数中的数据也可以带回来供主调函数使用。2、无参函数在调用无参函数时,主调函数并不将数据传送给被调用函数。6.1函数概述76.2内置系统函数C++软件包提供了大量的、功能丰富的、预先编制好的内置系统函数,用户不用定义也不用声明就可直接调用,使用内置系统函数时应注意:⑴明确调用的内置系统函数的功能及正确调用后的返回值;⑵使用该内置系统函数时要包含相应的头文件;⑶正确的调用格式。调用格式函数名(实参列表)例如:如何使用内置系统函数,求16的平方根的值?包含头文件:#includecmath调用格式:sqrt(16)8[例6-1]输入一个角度,求出其sin的值。源程序清单如下:#includeiostream#includecmath//将头文件包含在程序中usingnamespacestd;voidmain(){doublex,s;constdoublePI=3.141595;/*定义符号常量PI*/coutinputnumber:\n;cinx;6.2内置系统函数9s=x*PI/180;/*引用符号常量PI参与运算将角度转化为弧度*/s=sin(s);/*调用数学函数*/coutsin(x)=sendl;}6.2内置系统函数10大多数程序需要多次读字符和字符串进行操作,C++系统提供了许多关于字符/字符串处理的内置系统函数,这些函数使字符/字符串操作更容易,书上第87页列出了常用的字符/字符串处理的内置系统函数。[例6-2]Internet中的有些信息可以通过“rot13”的简单算法进行加密,每个字母在字母表中移动13位,即a对应与n,x对应于k,等等。编写一个用“rot13”加密输入字符串的程序(假定输入的都是26个英文字母)。6.2内置系统函数11思路分析:输入原字符串用string数据类型表示,在字符串的有效范围内,取出每个字符,加13进行加密,当加上13后如果超出了字母范围后应该在减去26。算法描述:定义变量,赋初值输出字符串求出字符串的长度:n=s1.size()for(i=0;in;i++)toupper(s1[i]+13)‘Z’YNs1[i]=s1[i]+13-26s1[i]=s1[i]+13输出加密后的字符串s16.2内置系统函数12检查算法:检查表中应包含IPO图中的每个输入项,处理项和输出项针对实例建立检查表:使用二组样本数据来检查:编码实现算法6.2内置系统函数13源程序清单:#includeiostream#includestringusingnamespacestd;voidmain(){strings1=“”;intn=0;cout“Inputasentence:endl;cins1;6.2内置系统函数14n=s1.size();for(inti=0;in;i++)if(toupper(s1[i]+13)‘Z’)s1[i]=s1[i]+13-26;elses1[i]=s1[i]+13;couts1endl;}6.2内置系统函数156.2.3随机数产生器在实际应用中,许多程序都需要使用随机数,大多数编程语言具有产生随机数的内置函数,该函数称为随机数产生器。在C++中该随机数产生器是函数rand()。在C++中随机数产生器是一个有返回值的函数。随机数产生器返回的数值范围取决于它所在的语言。在C++中,函数rand()返回一个大于等于0并且小于等于RAND_MAX的正整数,RAND_MAX是在C++的cstdlib库文件中定义的常数,RAND_MAX的值随系统不同变化,但其值总是至少为32767。16在使用随机数产生器是rand()函数时,如果没有初始化随机数产生器,则每次程序执行的时候将产生同样的一系列数字(称为伪随机数),要产生真正的随机数必须在使用随机数产生器的程序中初始化该随机数产生器。在C++中,使用内置函数srand()来初始化随机数产生器,srand()是一个void型函数。C++中函数srand()的语法为:srand(seed);。其中seed是一个数字,它代表函数rand()的起始点。6.2.3随机数产生器17函数rand()和srand()是定义在C++的cstdlib库文件中,要使用这些函数,程序中必须包含命令:#includecstdlib当在C++程序中产生随机数时,大多数程序员使用内置函数time()作为函数srand()中seed的值。time()是一个有返回值型的函数,它根据计算机系统的时钟返回自1970年1月1日午夜开始已经消耗的秒数。time()函数定义在ctime.h库文件中。使用time()作为srand()随机种子的语法是:srand(time(NULL));6.2.3随机数产生器18NULL是定义在cstdlib和ctime库文件中的一个常数注意C++中:0rand()的值RAND_MAX且为正整数。如果要产生一个特殊范围内的整数,可以使用公式:下限+rand()%(上限-下限+1)在该公式中,下限是范围中最小的数,上限则是范围内最大的数。下图给出了这一公式的语法和两个使用该公式产生随机整数的C++语句。6.2.3随机数产生器196.2.3随机数产生器20[例6-3]设计一个辅助小学生练习算术运算的测试系统。要求:为小学生出10以内的加减算术题,每次10道题,每题10分,共100分。用随机函数产生两个10以内的算数,并用随机函数来产生加号或减号。每道题有三次回答的机会,若都没有答对,则计算机给出答案。每次做完题后给出得分。6.2.3随机数产生器21显示算式b-a=breakright=0,count=0,times=0,answer=0forcount=1to10step1a=rand()%11,b=rand()%11,op=rand()%2fortimes=1to3step1op==0?TF显示算式a+b=ab?要求输入答案answer=a+bTFanswer=b-aanswer=a-bTFTFbreakbreaktimes3TF显示正确答案right++显示成绩显示算式a-b=要求输入答案要求输入答案显示算式b-a=TF22程序清单如下:6.2.3随机数产生器//算术运算测试系统#includeiostream#includecstdlib#includectimeusingnamespacestd;voidmain(){inta=0,b=0,answer=0,op=0,temp;intright=0,times=0,count=0;srand(time(NULL));236.2.3随机数产生器for(count=1;count=10;count++){a=rand()%11;b=rand()%11;op=rand()%2;for(times=1;times=3;times++){if(op==0){cout请给出正确答案:endl;couta+b=;cinanswer;if(answer==a+b){right++;times=0;break;}}else24{if(ab){temp=a;a=b;b=temp;}cout请给出正确答案:endl;couta-b=;cinanswer;if(answer==a-b){right++;times=0;break;}}//endif}//endfor6.2.3随机数产生器256.2.3随机数产生器if(times3){cout正确答案是:;if(op==0)couta+bendl;elsecouta-bendl;}//endif}//endforcout你的得分是:right*10endl;}//endmainfunction266.3用户自定义函数6.3.1用户自定义函数的概述自定义函数分为两类:有返回值型函数(完成指定任务后返回一个值给调用该函数的语句)。void函数(不返回一个值给调用该函数的语句)。自定义函数和变量一样,必须先定义,后使用(所谓定义函数,就是编写完成函数功能的程序块)。276.3.2用户自定义函数的定义1、有返回值型函数的定义有返回值型函数是在完成它的指定任务以后返回一个值给调用它的函数,函数的返回值是通过函数中的return语句获得的,所以有返回值型函数的最后一条语句一定是“return表达式;”语句。如果函数返回值数据类型与return表达式的值不一致,则以函数返回值数据类型为准,即函数返回值数据类型决定返回值的类型。286.3.2用户自定义函数的定义返回值数据类型函数名(形参列表){一个或多个以分号结尾的语句;return表达式;}函数体包含一些该函数必须遵循的、用来执行指定任务的指令语句。以{开始,以}结束。一般由定义语句和执行语句组成函数头函数定义的第一行,函数头指定该函返回值的数据类型,函数名和一个可选的形参列表调用该函数后所得到的值的类型给函数命名(必须满足C++标识符的规定)是被初始化的内部变量,寿命和可见性仅限于函数内部,若无参数,写void29[例6-4]定义一个求整数立方的有返回值自定义函数。6.3.2用户自定义函数的定义intcalcCube(intnum){returnnum*num*num;}302、void函数的定义void函数是在完成了指定任务后不返回值给调用它的函数。在程序设计中,void函数可以用来仅仅显示一些信息,例如,在报表中每一页顶部显示的标题,可直接调用该函数,而不必在多次重复输入定义void函数的方法:void函数名(形参列表){一个或多个以分号结尾的语句;}6.3.2用户自定义函数的定义31[例6-5]定义实现输出一段下划线的void自定义函数。6.3.2用户自定义函数的定义voiddisplayLine(){cout------------------endl;}有返回值型函数的语法与void函数的语法有两点不同:①void函数