CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛

C++PrimerPlus习题及答案-第八章-永久免费的源码丞旭猿

习题选自:C++ Primer Plus(第六版)内容仅供参考,如有错误,欢迎指正 !

1.内联函数:与普通函数的区别在于,编译器在处理内联函数的语句的时候,不会将语句编译成函数调用的指令,而是将整个函数的代码插入调用语句处(普通函数在调用的时候需要创建时间、参数传入等操作,会造成时间和空间的额外空间)

优点:不会产生函数调用的开销,提高了效率,减少了一些不必要的开销。

缺点:导致主函数指令增多,可能会增加二进制可执行文件的大小

1. 复习题

1.哪种函数适合定义为内联函数?

只有一行代码的小型、非递归的函数适合作为内联函数。

2假设song()函数的原形如下:

void song(const char * name, int times);

a.如何修改原形,使times的默认值为1?

b.函数定义需要做哪些修改?

c.能否为name提供默认值”O,My Papa”?

a.void song(const char * name, int times = 1);

b.函数定义不需要修改,只有函数原型包含默认信息。

c.可以,void song(char * name ="O,My Papa", int times = 1);

3.编写iquote()的重载版本–显示其用双引号括起的参数,编写3个版本:一个用于int参数,一个用于double参数,另一个用于string参数。

//用于 int 参数voidiquote(intn){cout<<"\""<< n <<"\""<<endl;}//用于 double 参数voidiquote(couble n){cout<<"\""<< n <<"\""<<endl;}//用于 string 参数voidiquote(char* str){cout<<"\""<< str <<"\""<<endl;}

4.下面是一个结构模板:

structbox{charmaker[40];floatheight;floatwidth;floatlength;floatvolume;}

a.请编写一个函数,他将box结构体的引用作为形参,并显示每个成员的值。

b.请编写一个函数,他将box结构的引用作为行参,并将volume成员设置为其他3边的乘积。

a.

voidshowBox(constbox & b){cout<<"maker : "<< b.maker <<endl;cout<<"height : "<< b.height <<endl;cout<<"width : "<< b.width <<endl;cout<<"length : "<< b.length <<endl;cout<<"volume : "<< b.volume <<endl;}

b.

voidsetVolume(box & b){b.volume = b.height * b.width * b.length;}

5.为让函数fill()和show()使用引用参数,需要对程序清单7.15做哪些修改?

修改后的代码:

includeincludeincludeconstintSeasons =4;conststd::array<std::string, Seasons> Snames ={"Spring","Summer","Fall","Winter"};voidfill(std::array<double, Seasons> &pa);voidshow(conststd::array<double, Seasons> &da);intmain(){std::array<double, 4> expenses;fill(expenses);show(expenses);return0;}voidfill(std::array<double, Seasons> &pa){for(inti =0; i < Seasons; i++){std::cout<<"Enter "<< Snames[i] <<" expenses: ";std::cin>> pa[i];}}voidshow(conststd::array<double, Seasons> &da){doubletotal =0.0;std::cout<<"\nEXPENSES\n";for(inti =0; i < Seasons; i++){std::cout<< Snames[i] <<": $"<< da[i] <<\n;total += da[i];}std::cout<<"Total: $"<< total <<\n;}

6.指出下面每个目标是否可以使用默认参数或函数重载完成,或者这两种方法都无法完成,并提供合适的原型。

a. mass(density,volume)返回密度为density、体积为volume的物体的质量,而mass(density)返回密度为density、体积为1.0立法米的物体的质量。这些值的类型都为double。

b. repeat(10,”Im OK”)将指定的字符串显示10次,而repeat(“But youre kind of stupid”)将指定的字符串显示5次。

c. average(3,6)返回两个int参数的平均值(int类型),而average(3.0,6.0)返回两个double值的平均值(double类型)。

d. mangle(“Im glad to meet you”)根据是将值赋给char变量还是char*变量,分别返回字符1和指向字符串Im glad to meet you的指针。

a.

//既可以使用默认参数,又可以使用函数重载//1.默认参数doublemass(doubledensity,doublevolume =1.0);//2.函数重载doublemass(doubledensity,doublevolume);doublemass(doubledensity);

b.

//不能使用默认参数,因为使用默认值必须从右到左提供默认值//函数重载voidrepeat(inttimes,constchar* str);voidrepeat(constchar* str);

c.

//函数重载intaverage(inta,intb);doubleaverage(doublea,doubleb);

d.两种方法都不能完成,需分成两个不同的函数实现。

7.编写返回两个参数中较大值的函数模板。

代码实现:

template<classT>Tmax(Tt1,Tt2){returnt1 > t2 ? t1 : t2;}

8.给定复习题6的模板和复习题4的box结构,提供一个模板具体化,它接受两个box参数,并返回体积较大的一个。

代码实现:

template<>boxmax(box b1, box b2){returnb1.volume > b2.volume ? b1 : b2;}

9.在下述代码(假定这些代码是一个完整程序的一部分)中,v1、v2、v3、v4和v5分别是哪种类型?

intg(intx);....floatm =5.5f;float&rm = m;decltype(m)v1 = m;decltype(rm)v2 = m;decltype((m)) v3 = m;decltype(g(100))v4;decltype(2.0*m)v5;
decltype(m)v1 = m;//类型为floatdecltype(rm)v2 = m;//类型为float &decltype((m)) v3 = m;//类型为float &decltype(g(100))v4;//类型为intdecltype(2.0*m)v5;//类型为double

编程练习

1. 编写通常接受一个参数(字符串的地址),并打印该字符串的函数。然而,如果提供了第二个参数(int类型),且该参数不为0,则该函数打印字符串的次数将为该函数被调用的次数(注意,字符串的打印次数不等于第二个参数的值,而等于函数被调用的次数)。是的,这是一个非常可笑的函数,但它让您能够使用本章介绍的一些技术。在一个简单的程序中使用该函数,以演示该函数是如何工作的。

代码实现:

includeusingnamespacestd;intmyShowStr(char* str,intprintTimes);intmain(){charmystr[50] ="Hello,world!";myShowStr(mystr,5);return0;}intmyShowStr(char* str,intprintTimes){if(printTimes >1){cout<< str <<endl;printTimes--;myShowStr(str, printTimes);}else{cout<< str <<endl;}returnprintTimes;}

2. CandyBar结构包含3个成员,第一个成员存储candy bar的品牌名称;第二个成员存储candy bar的重量(可能有小数);第三个成员存储candy bar的热量(整数)。请编写一个程序,它使用一个这样的函数,即将CandyBar的引用、char指针、double和int作为参数,并用最后3个值设置相应的结构成员。最后3个参数的默认值分别为Millennium Munch、2.85和350。另外,该程序还包含一个以CandyBar的引用为参数,并显示结构内容的函数。请尽可能使用const。

代码实现:

includeusingnamespacestd;defineDEFAULT_BRAND  (char*)"Millennium Munch"structCandyBar{char* brand;doubleweight;intheat;};voidsetCandyBar(CandyBar& candyBar,char* brand = DEFAULT_BRAND,doubleweight =2.85,intheat =350);voiddisplay(constCandyBar& candyBar);intmain(){CandyBar cb,cb1;setCandyBar(cb1);setCandyBar(cb, (char*)"MJJ",3.55,120);display(cb);display(cb1);return0;}voidsetCandyBar(CandyBar& candyBar,char*brand,doubleweight,intheat){candyBar.brand = brand;candyBar.weight = weight;candyBar.heat = heat;}voiddisplay(constCandyBar& candyBar){cout<<"BRAND : "<< candyBar.brand <<endl;cout<<"WEIGHT : "<< candyBar.weight <<endl;cout<<"HEAT : "<< candyBar.heat <<endl;}

3. 编写一个函数,它接受一个指向string对象的引用作为参数,并将该string对象的内容转化成大写,为此可以使用表6.4描述的函数toupper()。然后编写一个程序,它通过使用一个循环让您能够用不同的输入来测试这个函数,该程序的运行如下:

Enter a string (q to quit):go awayGO AWAYEnter a string (q to quit):good grief!GOOD GRIEF!Enter a string (q to quit):qBye.

代码实现:

includeincludeusingnamespacestd;voidConversion(string& str);intmain(){stringstr;cout<<"Enter a string(q to quit): ";while(getline(cin,str) && str !="q"){Conversion(str);cout<< str <<endl;cout<<"Next string(q to quit): ";}cout<<"Bye."<<endl;return0;}voidConversion(string& str){intsize = str.size();for(inti =0; i < size; i++){str[i] =toupper(str[i]);}}

4.下面是一个程序框架:

includeincludeusingnamespacestd;structstringy{char* str;intct;};intmain(){stringy beany;chartesting[] ="Reality isnt what it used to be.";set(beany, testing);show(beany);show(beany,2);testing[0] =D;testing[1] =u;show(testing);show(testing,3);show("Done!");return0;}

请提供其中描述的函数和原型,从而完成该程序。注意,应有两个show()函数,每个都使用默认参数。请尽可能使用const参数。set()使用new分配足够的空间来存储指定的字符串。这里使用的技术与设计和实现类时使用的相似。(可能还必须修改头文件的名称,删除using编译指令,这取决于所用的编译器)。

代码实现:

includeincludeusingnamespacestd;structstringy{char* str;intct;};voidset(stringy& stry,constchar* test);voidshow(conststringy& stry,intshowTimes =1);voidshow(constchar* ch,intshowTimes =1);intmain(){stringy beany;chartesting[] ="Reality isnt what it used to be.";set(beany, testing);show(beany);show(beany,2);testing[0] =D;testing[1] =u;show(testing);show(testing,3);show("Done!");return0;}voidset(stringy& stry,constchar* test){stry.ct =strlen(test);stry.str =newchar[stry.ct];strcpy(stry.str, test);}voidshow(conststringy& stry,intshowTimes){for(inti =0; i < showTimes; i++){cout<< stry.str <<endl;}}voidshow(constchar* ch,intshowTimes){for(inti =0; i < showTimes; i++){cout<< ch <<endl;}}

5.编写模板函数max5(),它将一个包含5个T类型元素的数组作为参数,并返回数组中最大的元素(由于长度固定,因此可以在循环中使用硬编码,而不必通过参数来传递)。在一个程序使用该函数,将T替换为一个包含5个int值的数组和一个包含5个double值的数组,以测试该函数。

代码实现:

includeusingnamespacestd;template<typenameT>Tmax5(T *t);intmain(){intarr1[5] = {5,3,5,9,6};doublearr2[5] = {5.2,3.1,6.8,10.8,7.1};cout<<"arr1 max num : "<< max5(arr1) <<endl;cout<<"arr2 max num : "<< max5(arr2) <<endl;return0;}template<typenameT>Tmax5(T* t){T maxValue = t[0];for(inti =1; i <5; i++){if(maxValue < t[i]){maxValue = t[i];}}returnmaxValue;}

6.编写模板函数maxn(),他将由一个T类型元素组成的数组和一个表示数组元素数目的整数作为参数,并返回数组中最大的元素。在程序对它进行测试,该程序使用一个包含6个int元素的数组和一个包含4个都不了元素的数组来调用该函数。程序还包含一个具体化,他将char指针数组和数组中的指针数量作为参数,并返回最长的字符串的地址。如果有多个这样的字符串,则返回其中第一个字符串的地址。使用由5个字符串指针组成的数组来测试该具体化。

代码实现:

includeincludeusingnamespacestd;template<typenameT>Tmaxn(T* t,intn);template<>char*maxn(char* pch[],intn);intmain(){intarr1[6] = {5,3,5,9,6,11};doublearr2[4] = {5.2,3.1,2.8,4.8};charconst* arr3[5] = {"abcde","abcdef","abc","ab","abcdefg"};cout<<"arr1 max num : "<< maxn(arr1,6) <<endl;cout<<"arr2 max num : "<< maxn(arr2,4) <<endl;cout<<"arr3 max len : "<< maxn(arr3,5) <<endl;return0;}template<typenameT>Tmaxn(T* t,intn){T maxValue = t[0];for(inti =1; i < n; i++){if(maxValue < t[i]){maxValue = t[i];}}returnmaxValue;}template<>char*maxn(char* pch[],intn){automaxLen =strlen(pch[0]);intindex =0;for(inti =1; i < n; i++){if(maxLen <strlen(pch[i])){maxLen =strlen(pch[i]);index = i;}}returnpch[index];}

7.修改程序清单8.14,使其使用两个名为SumArray()的模板函数来返回数组元素的总和,而不是显示数组的内容。程序应显示thing的总和以及所有debt的总和。

/******************程序清单8.14******************/// tempover.cpp --- template overloadingincludetemplate<typenameT>// template AvoidShowArray(T arr[],intn);template<typenameT>// template BvoidShowArray(T * arr[],intn);structdebts{charname[50];doubleamount;};intmain(){usingnamespacestd;intthings[6] = {13,31,103,301,310,130};structdebtsmr_E[3] ={{"Ima Wolfe",2400.0},{"Ura Foxe",1300.0},{"Iby Stout",1800.0}};double* pd[3];// set pointers to the amount members of the structures in mr_Efor(inti =0; i <3; i++)pd[i] = &mr_E[i].amount;cout<<"Listing Mr. Es counts of things:\n";// things is an array of intShowArray(things,6);// uses template Acout<<"Listing Mr. Es debts:\n";// pd is an array of pointers to doubleShowArray(pd,3);// uses template B (more specialized)// cin.get();return0;}template<typenameT>voidShowArray(T arr[],intn){usingnamespacestd;cout<<"template A\n";for(inti =0; i < n; i++)cout<< arr[i] <<;cout<<endl;}template<typenameT>voidShowArray(T * arr[],intn){usingnamespacestd;cout<<"template B\n";for(inti =0; i < n; i++)cout<< *arr[i] <<;cout<<endl;}

代码实现:

includetemplate<typenameT>TSumArray(T arr[],intn);template<typenameT>TSumArray(T * arr[],intn);structdebts{charname[50];doubleamount;};intmain(){usingnamespacestd;intthings[6] = {13,31,103,301,310,130};structdebtsmr_E[3] ={{"Ima Wolfe",2400.0},{"Ura Foxe",1300.0},{"Iby Stout",1800.0}};double* pd[3];for(inti =0; i <3; i++)pd[i] = &mr_E[i].amount;cout<<"sum of things : "<< SumArray(things,6) <<endl;cout<<"sum of debts :"<< SumArray(pd,3) <<endl;;return0;}template<typenameT>TSumArray(T arr[],intn){T sum =0;for(inti =0; i < n; i++){sum = sum + arr[i];}returnsum;}template<typenameT>TSumArray(T * arr[],intn){T sum =0;for(inti =0; i < n; i++){sum = sum + *arr[i];}returnsum;}
举报/反馈

声明:本文部分素材转载自互联网,如有侵权立即删除 。

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
相关推荐
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容