C++第3章函数作业参考答案3-2观察下面程序的运行输出,与你设想的有何不同?仔细体会引用的用法。#includeiostreamusingnamespacestd;intmain(){intintOne;int&rSomeRef=intOne;intOne=5;coutintOne:\tintOneendl;coutrSomeRef:\trSomeRefendl;intintTwo=8;rSomeRef=intTwo;cout\nintOne:\tintOneendl;coutintTwo:\tintTwoendl;coutrSomeRef:\trSomeRefendl;return0;}•引用:是一种特殊类型的变量,可以认为是另一个变量的别名,即引用名与被引用的变量名所对应的是同一个储存单元,所以通过引用名对其储存单元所做的一切操作相当于作用于变量名所对应的储存单元。•注意:•声明一个引用的同时需用已知对象对其进行初始化;•引用被声明后,所指向对象不能更改。3-3比较值传递与引用传递的相同点与不同点。【解】相同点:•均是函数的参数传递,即函数被调用时形参与实参结合的过程。不同点:•值传递是指在调用函数时将实参复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实参。值传递本质上传的是实参表达式。•引用传递是指在调用函数时将实参的地址传递到函数中,这样在函数中对参数所进行的修改,将影响到实参。引用传递本质上传的是实参地址。3-4什么叫内联函数?它有哪些特点?【解】内联函数:在定义时用关键字inline修饰,它不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。特点:①编译前,有函数的结构,编译后,却不具备函数的性质;②编译时用函数体替换调用处的函数名,节省参数传递、控制转移等开销;③不能是递归调用的函数;④函数功能简单、规模小,不存在while和switch等复杂的结构且一般只有1~5条语句;⑤只能先定义后使用;3-5函数原型中的参数名与函数定义中的参数名以及函数调用中的参数名必须一致吗?【解】不必一致;对有形参函数:①函数原型中的形参表只要求包含完整的类型信息,即形参的类型与位置,对形参名不作要求,不必与函数定义一致,甚至可以省略;②函数定义中的形参表要考虑形参的类型、位置和形参名,形参名不能省略;③函数调用中的实参表只要求实参的类型和位置与函数的定义一致,对参数名不作要求,若函数是带默认形参的函数,函数调用时实参与形参个数还可以不相同。3-6调用被重载的函数时,通过什么来区分被调用的是哪个函数?【解】函数成功被调用,函数名要正确,更重要的是函数的形参表与调用中函数的实参表的参数类型与顺序要吻合(个数相同与否要看函数有没有默认形参)。重载函数的函数名相同,因此,区分重载函数的只能是函数的外部接口——形参表。所以,调用被重载函数时,是通过函数形参的类型与个数来确定被调函数。特别注意,不能通过返回值的类型和形参名来区分重载函数。3-7完成函数。参数为两个unsignedshortint型数,返回值为第一个参数除以第二个参数的结果,数据类型为shortint;如果第二个参数为0,则返回值为-1。在主程序中实现输入输出。【解】编写以下程序,实现上述功能:#includeiostreamusingnamespacestd;shortdivide(unsignedshorta,unsignedshortb){if(b==0)return-1;elsereturna/b;}//函数定义voidmain(){unsignedshorta,b;cout请输入两个整数a,b(0~65535):;cinab;couta/b=divide(a,b)endl(b=0时为-1)endl;}运行结果截图如下:下面观察以下两个运行结果截图:观察发现这两个结果并不是我们想要看到的,因此,以上程序有待改进。【解】改进以上程序:#includeiostreamusingnamespacestd;doubledivide(unsignedshorta,unsignedshortb){if(b==0)return-1;elsereturna/double(b);}//更改函数返回值类型,b强制转换为double类型voidmain(){unsignedshorta,b;cout请输入两个整数a,b(0~65535):;cinab;couta/b=divide(a,b)endl(b=0时为-1)endl;}验证改进效果截图如下:【解】编写以下程序,实现华氏温度与摄氏温度的转换:#includeiostreamusingnamespacestd;doubleFtoC(doubleF){doubleC;C=5/double(9)*(F-32);//注意分数运算returnC;}voidmain(){doubleT;cout请输入一个华氏温度T(℉):;cinT;coutT=T℉=FtoC(T)℃endl;}运行结果截图如下:25263-8•#includeiostream•usingnamespacestd;•voidmain()•{•doublef,c;•cout请输入华氏温度:;•cinf;•c=(f-32)*5/9;•cout对应的摄氏温度为:cendl;•}2729写成函数形式•#includeiostream•usingnamespacestd;•doublefaToCel(doublef)•{•return((f-32)*5/9);•}•voidmain()•{•floatf;•cout请输入华氏温度:endl;•cinf;•cout对应的摄氏温度为:faToCel(f)endl;•}3032•3_9编写函数判别一个数是否是质数,在主程序中实现输入输出。33•#includeiostream•usingnamespacestd;•boolprime(intnum)•{•boolflag;•flag=true;••for(inti=2;inum;i++)•if(num%i==0){flag=false;break;}•returnflag;•}34•voidmain()•{intnum;•cout输入一个大于1的整数endl;•cinnum;••if(prime(num)==true)•coutnum是质数endl;•else•coutnum不是质数endl;•}36提高了效率•#includeiostream•#includecmath•usingnamespacestd;•boolprime(intnum)•{•boolflag;•flag=true;•intk=sqrt(num);•for(inti=2;i=k;i++)•if(num%i==0){flag=false;break;}•returnflag;•}37•voidmain()•{intnum;•cout输入一个大于1的整数endl;•cinnum;••if(prime(num)==true)•coutnum是质数endl;•else•coutnum不是质数endl;•}383940413-10•最大公约数:如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。例如:•12的约数有:1,2,3,4,6,12;•18的约数有:1,2,3,6,9,18。12和18的公约数有:1,2,3,6.6是12和18的最大公约数423-10最小公倍数:两个或两个以上的数公有的倍数叫做这几个数的公倍数,其中最小的一个叫做这几个数的最小公倍数。例如:12的倍数有:12,24,36,48,60,72,84,…18的倍数有:18,36,54,72,90,…2和18的公倍数有:36,72,….其中36是12和18的最小公倍数。3-10编写函数求两个整数的最大公约数和最小公倍数。【解】编写以下程序,求两个正整数的最大公约数和最小公倍数:#includeiostreamusingnamespacestd;intGCD(inta,intb){inti,j;j=(ab?a:b);//把a,b两者中最小的值赋给jfor(i=j;i=1;i--)if(a%i==0&&b%i==0)returni;//能同时被a,b整除的i,即为最大公约数}//定义最大公约数函数intLCM(inta,intb){intc;c=a*b/GCD(a,b);//a,b的乘积等于最大公约数与最小公倍数的乘积returnc;}//定义最小公倍数函数voidmain(){inta,b;cout请输入两个正整数a,b:;cinab;couta“和”b“的最大公约数为GCD(a,b)endl;couta和b的最小公倍数为LCM(a,b)endl;}运行结果截图如下:3-11什么叫做嵌套调用?什么叫做递归?【解】函数允许嵌套调用,如果函数1调用了函数2,函数2在调用函数3,便形成了函数的嵌套调用。函数可以直接或间接地调用自身,成为递归调用。嵌套调用递归调用#includeiostreamusingnamespacestd;intSum(intn){if(n==1)return1;elsereturnn+Sum(n-1);//直接递归调用}voidmain(){intn;do{cout请输入一个整数n:;cinn;}while(n=0);//避免输入负数或0cout1+2+...+n=Sum(n)endl;}【解】编写以下程序,求前n个正整数之和:运行结果截图如下:#includeiostreamusingnamespacestd;intFib(intn){if(n==1||n==2)return1;elsereturnFib(n-1)+Fib(n-2);//直接递归调用}voidmain(){intn;do{cout请输入一个整数n:;cinn;}while(n=0);coutFibonacci(n)=Fib(n)endl;}【解】编写以下程序,求Fibonacci级数:运行结果截图如下:附加题请将划线处缺失的部分补充完整(你有几种填写方法?不允许修改程序其他地方)#includeiostreamusingnamespacestd;classCat{public:Cat(intinitAge){age=initAge;}~Cat(){};voidsetAge(intage){=age;}voidprint(){coutageendl;}private:intage;};intmain(){CatmyCat(1);myCat.setAge(4);myCat.print();return0;}【解】补充程序划线缺失部分:较好的方法:方法1:this-age=age;方法2:(*this).age=age;•//end2016