您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 制造加工工艺 > C++练习题及解答--练习题
练习题(一)一、编程题。根据程序要求,写出函数的完整定义。1.写一个函数,找出给定字符串中大写字母字符(即’A’-‘Z’这26个字母)的个数(如字符串”ChinaComputerWrold”中大写字母字符的个数为3个)。函数的原型:intCalcCapital(char*str);函数参数:str为所要处理的字符串;函数返回值:所给字符串中数字字符的个数2.写一个函数,用递归函数完成以下运算:sum(n)=1–1/2+1/3–1/4+…-(1/n)*(-1)n(其中n0)函数原型:floatsum(intn);函数参数:n为正整数。函数返回值:相应于给定的n,右边表达式运算结果。提示:你可以使用递归表达式:sum(n)=sum(n-1)-(1/n)*(-1)n3.给定新数值,在一个按节点所存放数值从大到小排序的链表中,找适当位置插一个新节点,仍保持有序的链表,写一个函数,完成此操作。函数的原型:Node*InsNode(Node*head,intnewValue);其中,链表节点的定义如下:structNodee{intValue;//存放数值Node*next;//指向链表中的下一个节点};函数参数:函数的第一个参数head指向链表头一节点的指针,如果链表为空,则head的值为NULL。第二个参数newValue为所给定的插入新节点的新数值。函数返回值:当成功地插入新的节点时,函数返回指向新链表头一节点的指针,否则,若不能申请到内存空间,则返回NULL。4.写一个函数,找出给定数组中具有最小值的元素。函数的原型:charMinCode(charcharAry[]);函数参数:charAry所要处理的字符数组名;函数返回值:返回具有最小ASCII码的字符。二、理解问答题:下面的文件stack.h是一个堆栈类模板Stack的完整实现。在这个文件中,首先定义了一个堆栈元素类模板StackItem,然后,在这个类的基础上定义了堆栈类模板Stack。在Stack中使用链表存放堆栈的各个元素,top指针指向链表的第一个节点元素,bottom指针指向链表的最后一个节点元素,成员函数push()将一个新节点元素加入(压进)到堆栈顶部,pop()从堆栈顶部删除(弹出)一个节点元素。为方便起见,程序中加上了行号。阅读程序,根据程序后面的问题作出相应解答。1./*-----------------------------------------------------------------------------*/2./*********************文件stack.h************************/3./*-----------------------------------------------------------------------------*/4.template5.classStack;6./*****************定义模板类StackItem******************/7.template8.classStackItem9.{10.public:11.StackItem(constType&elem):item(elem){}12.~StackItem(){}13.private:14.Typeitem;15.StackItem*nextItem;16.friendclassStack;17.};18./*****************定义模板类Stack*********************/19.template20.classStack21.{22.public:23.Stack():top(NULL),____(A)_____{}24.~Stack();25.Typepop();26.voidpush(constType&);27.boolis_empty()const{return____(B)______;}28.private:29.StackItem*top;30.StackItem*bottom;31.};32.//模板类Stack的函数成员pop()的实现。33.//从堆栈顶弹出一个节点,并返回该节点的值34.template35.TypeStack::pop()36.{37.StackItem*ptop;//指向顶部节点的临时指针38.TyperetVal;//返回值39.______(C)________;40.retVal=top-item;41.top=top-nextItem;42.deleteptop;43.returnretVal;44.}45.//模板类Stack的函数成员push()的实现46.template47.voidStack::push(constType&newItem)48.{49.StackItem*pNew=newStackItem(newItem);50.______(D)___________;51.if(bottom==NULL)bottom=top=pNew;52.else_____(E)_________;53.}54.//模板类Stack的析构函数~Stack()的实现55.template56.Stack::~Stack()57.{58.StackItem*p=top,*q;59.while(p!=NULL){60.q=p-nextItem;61.deletep;62.p=q;63.}64.}问题1:程序中有几处填空,将它们完成。(A)_________________________________________________(B)_________________________________________________(C)_________________________________________________(D)_________________________________________________(E)_________________________________________________问题2:程序第4,5行有什么作用?如果没有这两行语句,程序还正确吗?问题3:程序中多处出现const,请分别说明它们各自表示什么含义。问题4:程序中模板类Stack的析构函数主要做了什么事情?为什么要这么做?问题5:下面的程序使用了stack.h文件中定义的类模板,请说明下列程序中定义堆栈对象的语句(1-5)是否正确。#include“stack.h”voidmain(){Stackq1;//1Stackq2;//2Stackq3(10);//3Stackq4[10];//4Stack*q5=newStack;//5//....deleteq5;}答:语句号12345对/错一,编程题答案1.程序为:intCalcCapital(char*str){if(str==NULL)return0;//判断字符指针是否为空intnum_of_Capital=0;//记录大写字母字符个数的变量,初值为0for(inti=0;str[i]!=0x0;i++)if(str[i]='A'&&str[i]='Z')num_of_Capital++;//若是大写字母,则总数加1returnnum_of_Capital;//返回大写字母字符数}2.程序为:floatsum(intn){if(n==1)return1;elsereturnsum(n-1)-(1.0/n)*(-1)n;}3.程序为:Node*insNode(Node*head,intnewValue){Node*newNode=newNode;//申请新的节点空间if(newNode==NULL)returnNULL;//newNode-data=newValue;//填充新节点的内容newNode-next=NULL;Node*pre,*cur;Pre=head;if(head==NULL)head=newNode;//插入到空链表的表头elseif(newValue=head-Value){newNode-next=head;head=newNode;//插入到链表的表头}else{//在链表寻找插入点Node*cur,*pre=head;while(pre-next!=NULL){cur=pre-next;if(newValue=cur-Value)break;elsepre=cur;}if(pre-next!=NULL)newNode-next=cur;//若非末尾,则有下一节点pre-next=newNode;//将新节点插入}}returnhead;}4.程序可以有多种写法,下面是其中一种charMinCode(charcharAry[],intlen=10){charmixCode=0x0;for(inti=0;i{if(charAry[i]mixCode)mixCode=str[i];}returnmixCode;}二、理解问答题:问题1,答:(A)bottom(NULL)(B)top==NULL;(C)ptop=top;(D)pNew-nextItem=top;(E)top=pNew;问题2,答:不正确。因为类StackItem模板类的定义中用到了模板类Stack,Stack还没有定义,所以,必须先声明Stack是一个模板类,否则,编译程序就不知道标识符Stack代表什么样的含义,无法进行编译。问题3,答:第11、26和47行的const修饰的都是函数的参数,表示在这个函数体中不能改它所修饰的参数的值。第27行的const修饰的是模板类Stack的成员函数is_empty(),它表示在函数is_empty()的函数体中不能改变任何数据成员的值。问题4,答:析构函数中主要是释放存放的各个节点所占涌空间。因为Stack对象在其生存期间可能加入了很多节点,从堆中申请了一些内存空间。这些空间应随着对象的消亡而释放掉,所以,需要在析构函数中释放这些空间。问题5,答:语句号12345对/错错对错错对一,[理解问答题]请回答下面有模板的定义问题:1.下列模板的定义是否合法的?若为非法的,请简单扼要说明理由。(1)非法的,两次声明不一样(2)合法的(3)非法的,两个类型参数的名字不能相同(4)非法的,参数U没有类型说明(5)合法的2.关于类List的如下定义中有若干错误,请指出其所在行号并改正(但不求补充实现成员函数)。1templateclassListItem;23templateclassList4{5public:6List():front(NULL),end(NULL){}//有错7List(constList&);//有错8~List();9voidinsert(ListItem*ptr,elemTypevalue);//有错10intremove(elemTypevalue);//有错11intsize(){returnsize;}12private:13ListItem*front;//有错14ListItem*end;//有错,以上错均已改正15};二,[理解问答题]问题1.答:程序的输出结果为:Sizeofval_array=10Thevaluesofval_arraybeforecallinginv():0123456789Theresultofval_arrayaftercallinginv():0-1-2-3-4-5-6-7-8-9问题2.答:题号ABCDE对/错对错对错对问题3.答:该函数实现有以下错误:(1)函数的参数x为const参数,不能在函数体中被改变(2)在函数中应该创建一个临时对象,这个对象的内容由参数x的内容运算而来(3)函数返回的应是临时对象,而不是参数正确的函数实现为:templateval_aryinv(constv
本文标题:C++练习题及解答--练习题
链接地址:https://www.777doc.com/doc-1812003 .html