函数、函数与运算符重载.ppt_第1页
函数、函数与运算符重载.ppt_第2页
函数、函数与运算符重载.ppt_第3页
函数、函数与运算符重载.ppt_第4页
函数、函数与运算符重载.ppt_第5页
已阅读5页,还剩252页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高级语言程序设计C+,张海威南开大学信息技术科学学院,第5章函数与重载,函数的说明与使用,1,函数的嵌套与递归,2,函数与运算符重载,3,函数与C+程序结构,4,2,Databasevoidmain(void)floatp,q,xr;coutP;coutq;coutTheEquationis:;coutx3+px+q=0eps);B=croot;xr=A+B;coutendlTherealrootoftheequationiseps);B=croot;,函数的使用和说明,函数的引入程序中功能相同,结构相似的代码段可以用函数进行描述程序的功能相对独立,用来解决某个问题具有明显的入口和出口入口:参数出口:返回值,Databaseconstfloateps=1e-6;croot=x;doroot=croot;croot=(2*root+x/(root*root)/3;while(fabs(crootroot)eps);returncroot;,函数的使用和说明,函数的作用实现程序功能的模块化实现程序结构的简化实现程序代码的重用函数的应用场景包含多处功能相同的代码处理数据的类型、处理过程相同或相似代码段具有代表性或特殊含义,DatabasevoidprintString();/函数原型intmain()printString();/调用函数printStringreturn0;voidpirntString()/函数定义cout“Hello!”endl;return;/函数返回,函数的说明与使用,函数的使用步骤先说明,后调用程序中必须包含函数的说明及定义函数的说明方式函数原型函数定义可以出现在程序的任何合适的地方函数定义函数定义必须出现在调用函数之前,Database函数定义的一般形式()通常用来实现某种特定的功能不需要进行数据的传递处理的数据通常与主调函数无关,Databasei10;i+)cout“*”;coutendl;,函数的说明与使用,有参函数(带有参数的用户自定义函数)进行调用时,必须提供所需个数的且具有相匹配数据类型的实际参数函数原型的一般形式();定义的一般形式()通过调用处提供的不同实参值来计算出其对应的函数值、或实现某种与传递过来的那些不同值有关的某种功能。,Databaseik;i+)cout“*”;couta;coutf(a)=f(a)a;coutf(a)=f(a)endl;/算出f(a)并输出return0;,Databasereturn句括号内表达式的值,即为整个函数的返回值。return句也可使用另一格式,即可以不括起表达式:return(x*x+x+1)/2-5.5;/OK!,Database不可给函数名f赋值。return(f);返回值类型应该是double,而非指针类型(函数名相当于一个指针)。f(x)=(x*x+x+1)/2-5.5;赋值号左端非变量(也即f(x)非左值)。,函数的说明与使用,函数的参数C+语言的函数分为无参函数和有参函数函数的参数无参数一个参数多个参数函数参数表的写法一般写法省略参数名(无名参数)参数赋初值,Databaseintf(inta,intb,int)returna*a+b;两个不同的函数同名,但由于第二个函数包含一无名参数,使得在调用时能够被区分,f(x,y)是第一个函数的调用,f(x,y,0)是第二个函数的调用,Databasevoidfunc(inta=11,intb=22,intc=33)/为参数a、b、c设置了默认值11、22与33couta=a,b=b,c=cendl;,函数的说明与使用,Database/调用时缺省了3个实参,将使用/定义处给定的那3个相对应的参数默认值func(55);/调用时缺省了后2个实参,将使用/定义处给定的那后2个对应参数默认值func(77,99);/调用时缺省了最后1个实参,将使用/定义处给定的那最后1个参数默认值func(8,88,888);/调用时没缺省任一个实参,/系统将不使用定义处给定的任一个参数默认值return0;,函数的说明与使用,运行结果:a=11,b=22,c=33a=55,b=22,c=33a=77,b=99,c=33a=8,b=88,c=888,Database/OK!voidfunc(inta=1,intb,intc=3);/ERROR!voidfunc(inta=1,intb=2,intc);/ERROR!对第一个函数说明,采用如下的调用语句:func(1,22,333);/OK!调用时给出所有实参func();/ERROR!参数a没有默认值func(10,20);/OK!参数c默认为3func(5,9);/ERROR!调用处也只能缺省后面的连续若干个实参,函数的说明与使用,函数调用过程中参数的传递一般传递过程(赋值传递)发生函数调用,转到函数体执行根据函数的形参,分配内存空间将实参赋值给形参,即为形参分配的存储空间赋值,此时实参在函数体内失效,形参有效函数执行完毕,返回到主调函数,形参所占的空间自动回收,形参失效,DatabaseintsearchArray(int10,int);函数定义intsearchArray(inta,intb)/写为a10也可以returnab;,Databaseinta20;一维数组以及多维数组的第一维大小,形参、实参可以不对应实参为a10,形参可以定义为x6,Databasevoidstrcat(chars,charct)inti=0,j=0;while(si!=0)i+;while(ctj!=0)si+=ctj+;si=0;,函数的说明与使用,函数的参数【例5.5】主函数部分,Databasecharb20=是东南大学学生;strcat(a,b);/实参为数组名coutaendl;/打印字符数组areturn0;,函数的说明与使用,函数的参数【例5.6】多维数组做函数参数举例:设计函数,实现矩阵的转置和矩阵乘法,并在主函数中验证用二维数组存储矩阵由于数组作为参数,传递的是数组的首地址,因此,在函数中对作为形参的数组进行的操作,能够直接反映到实参数组中,Databasevoidinverse(int36,int63);/转置矩阵voidmulti(int63,int34,int64);/矩阵乘法voidoutput(int64);/矩阵输出intmain()intmiddle63,result64;intmatrix136=8,10,12,23,1,3,5,7,9,2,4,6,34,45,56,2,4,6;intmatrix234=3,2,1,0,-1,-2,9,8,7,6,5,4;inverse(matrix1,middle);/实参为数组名multi(middle,matrix2,result);output(result);return0;,函数的说明与使用,【例5.6】转置和乘法函数定义,Databasefor(i=0;i3;i+)for(j=0;j6;j+)middleji=matrix1ij;return;voidmulti(intmiddle63,intmatrix234,intresult64)inti,j,k;/矩阵乘法for(i=0;i6;i+)for(j=0;j4;j+)resultij=0;for(k=0;k3;k+)resultij+=middleik*matrix2kj;return;,函数的说明与使用,【例5.6】矩阵输出函数定义,Databaseinti,j;for(i=0;i6;i+)for(j=0;j4;j+)coutsetw(4)resultij;coutab;cout“a=“a“b=“bendl;swap(a,b);cout“a=“a“b=“bendl;return0;,Database/它所用的两个参数均为赋值参数voidswap(int/它所用的第一个参数为赋值参数,另一个为引用参数,Databasevoidswap(int/函数原型/前两个为引用参数,可“双向传值”/后两个为赋值参数,Databasecout“-Inmain,beforcallingf1-endl;couti,j,k,n=ijknendlendl;swap(i,j,k,n);/注意,调用后实参变量i、j的值进行了改变/而k与n的值并不改变cout-Inmain,aftercallingf1-endl;couti,j,k,n=ijknab;coutmax(a,b)=max(a,b)selections;/输入整数selectionscoutelements;/输入整数elementsdoubleanswer=elements;intele=elements;,Databasecout“A(”elements“,”selections“)=”answerendl;/输出排列数A(ele,sel)之结果/组合数C的求法:answer/=factorial(selections);coutC(elements,selections)=answerendl;/输出组合数C(ele,sel)之结果return0;,Databaseii;j-)if(ajaj-1)swap(aj,aj-1);,Databaseconstintn=100;intmain()intbn;srand(unsigned)time(NULL);for(inti=0;in;i+)bi=rand();,Databasefor(i=0;in;i+)coutsetw(5)bi;if(i%10=0)coutendl;return0;/*设计函数,分别按产生顺序和排序后的顺序输出随机数,输出宽度为5,每输出10个数换行*/,Databaseif(n=1)person_age=10;elseperson_age=age(n-1)+2;returnperson_age;,Databaseintmain()cout“第5个人的年龄为:”age(5)“岁”;couti;/输入整数if(n=1)cout“Theresult:”endl;elseinv(n-1);couti“;/输出整数,每次递归调用返/回之后都要执行,Databaseintmain()cout“Input10integers:”endl;inv(10);coutendl;return0;,Databasereturn;/递归出口coutn%10;conve(n/10);/递归,Databaseelsedocoutt;coutendl;conv(t);return0;,Database(2)每个柱上总保持较大的圆盘在下,较小者在上。编制程序,实现将任意n个圆盘从A柱借助于B柱移到C柱,并显示出全部移动过程,Database,Databasehanoi(n,A,B,C);return0;,Databasevoidswap(int,Databasesrand(unsigned)time(NULL);cout随机数:endl;for(inti=0;in;i+)bi=rand()%100;coutsetw(5)bi;if(i+1)%10=0)coutendl;quickSort(b,0,n-1);,Databasefor(i=0;in;i+)coutsetw(5)bi;if(i+1)%10=0)cout1)quickSort(a,k+1,j);,Databasefloatabs(floatf)if(f0)f=-f;returnf;doubleabs(doubled)if(d0)return-d;returnd;三个函数都是求绝对值,采用同一个函数名,更符合人们的习惯,Database/整型voidprint(point);/类point的对象intsum(int,int);intsum(int,int,int);intget(intn,floata);intget(intn,floata,intn);,Databaseintadd(int,float);/错误采用引用参数不能区分函数voidprint(double);voidprint(double);/错误有些派生基本类型的参数虽然可以区分同名函数,但在使用中必须注意包含可缺省参数时,可能造成二义性,Databasei=60;i+)/显示60个“*”cout*;coutendl;return;,Databasei=k;i+)/显示出k行cout“*endl;return;/该return语句可以缺省,Databasei=k;i+)/显示出k行for(intj=1;j=n;j+)/循环n次显示n个“*”cout*endl;coutn;printStar1();/调用无参函数/以输入的k为实参调用printStar2(k);/以输入的k与n为实参去调用printStar3printStar(k,n);return0;,Databasecout=,等例外的是:限定符.,:,条件运算符?:,取长度运算符sizeof,Database函数名相当于:operatoroperator是关键字返回值类型表示使用重载运算符进行运算得到结果的数据类型例如,重载运算符-,表示字符串类型的减法,其运算符重载函数函数原型为:stringoperator-(string,string);,Database重载运算符(双目),*(双目),(单目)来表示bool类型的或、与、非运算,DatabaseenumboolFALSE,TRUE;intmain()boolb1=FALSE,b2=TRUE;cout“b1+b2=”(b1+b2)endl;cout“b1*b2=”(b1*b2)endl;cout“,Databasestr2=“abcde”;/str2str1的结果为”de”,Databasewhile(Si+j!=0,Databasestringpre,post;if(c=-1)returnoperationerror!;elsefor(inti=0;ib;strings=a-b;couts=sendl;return0;,Database/设置容器,保存随机数vector:iteratorIter1;/设置迭代器srand(unsigned)time(NULL);for(inti=0;i=10;i+)v1.push_back(rand()%100);/产生随机数并保存/开始输出随机数cout“Originalvectorv1=(”;for(Iter1=v1.begin();Iter1!=v1.end();Iter1+)cout*Iter1;cout“)”endl;/随机数输出完毕,Database/由小到大排序/输出排序结果cout();/输出排序结果coutResorted(greater)vectorv1=(;for(Iter1=v1.begin();Iter1!=v1.end();Iter1+)cout*Iter1;cout)下层系统处理方式为:被调函数中对形参值的改变不影响主调函数处的任一变量的值系统为形参分配存储空间,调用入口处将实参表达式的值赋给该表示形参的局部变量,Database/局部自动变量astaticints=1;/局部静态变量s,完成初始化coutInf1-pos1:a(auto)=as(static)=sendl;a+=2;s+=2;coutInf1-pos2:a(auto)=as(static)=snn;voidmain()inti;for(i=1;i=3;i+)f1();,Databasecharch=A;voidfunc1();/函数原型voidfunc2();/函数原型,具体定义在另一个文件中voidmain()func1();func2();coutInfile1_main:x,ch=x,chendl;voidfunc1()coutInfile1_func1:x,ch=x,chendl;,Databaseexterncharch;voidfunc2()coutInfile2_func2:x,ch=x,chendl;x=22;ch=B;程序执行后的显示结果如下:Infile1_func1:x,ch=11,AInfile2_func2:x,ch=11,AInfile1_main:x,ch=22,B,Database/整型变量i,具有函数级作用域charch=1;coutinmain-i,ch=i,chendl;inti=20;/另一整型变量i,外层块级作用域charch=2;c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论