1《面向对象程序设计》课程作业及答案作业1:是非题1.头文件中一般存放着变量和常量的定义、函数的原型以及类的定义。1.错2.程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改所带来的编译工作量。4.对填空题下面是一个求数组元素之和的程序。主程序中定义并初始化了一个数组,然后计算该数组各元素的和,并输出结果。函数sum计算数组元素之和。填充程序中不完整的部分。________A__________intsum(int[],int);voidmain(){intia[5]={2,3,6,8,10};B;sumOfArray=sum(ia,5);coutSumofarray:sumOfArrayendl;}intsum(intarray[],intlen){intiSum=0;for(inti=0;C;D)E;returniSum;}答案:A#includeiostream.hBintsumOfArray;CilenDi++EiSum+=array[i];阅读理解题2写出下列程序的运行结果://file1.cppstaticinti=20;intx;staticintg(intp){returni+p;}voidf(intv){x=g(v);}//file2.cpp#includeiostream.hexternintx;voidf(int);voidmain(){inti=5;f(i);coutx;}回答以下问题:31.程序的运行结果是什么样的?2.为什么文件file2.cpp中要包含头文件iostream.h?3.在函数main()中是否可以直接调用函数g()?为什么?4.如果把文件file1.cpp中的两个函数定义的位置换一下,程序是否正确?为什么?5.文件file1.cpp和file2.cpp中的变量i的作用域分别是怎样的?在程序中直接标出两个变量各自的作用域。答案:1.程序的运行结果:25因为程序中需要利用cout对象进行输出,而cout是在C++标准I/O库iostream中定义的类ostream的一个对象。2在函数main()中不可以直接调用函数g(),因为g()是静态函数,只在它所在的文件内可见。3如果把文件file1.cpp中的两个函数定义的位置换一下,程序不正确,因为C++规定所有使用的变量和函数需要先声明,后使用。在函数f中用到了函数g,所以函数f不能出现在函数g的定义或声明之前。文件file1.cpp中的变量i的作用域从它的定义开始到文件结束。File2.cpp中的变量i的作用域从它的定义开始到main函数结束。编程题写一个函数,完成在链表末尾增加一个节点的操作。函数的原型为:Node*AddNode(Node*&head,intnewData);其中,链表节点的定义如下:structNode{intdata;//存放数据Node*next;//指向链表中的下一个节点};函数参数:函数的第一个参数head指向链表的第一个节点,如果链表为空,则head的值为NULL。第二个参数newData为要插入的新节点中存放的数据。4函数返回值:当成功地插入新的节点时,函数返回指向新节点的指针,否则,如果不能申请到内存空间,则返回NULL。Node*AddNode(Node*&head,intnewData){//在这里写出函数的实现}答案:Node*AddNode(Node*&head,intnewData){//申请新的节点空间Node*newNode=newNode;if(newNode==NULL)returnNULL;//填充新节点的内容newNode-data=newData;newNode-next=NULL;//插入到链表的结尾if(head==NULL)head=newNode;else{//寻找链表的最后一个节点Node*tail=head;while(tail-next!=NULL)tail=tail-next;//将新节点插入到最后tail-next=newNode;}returnnewNode;}作业2:是非题1.在不同作用域中的变量可以同名。对2.派生类的成员函数可以直接访问基类的所有成员。2.错填空题#includeiostream.h___________A_____________;5voidmain(){inta[6]={2,4,8,6,9,14};intx1=____B______;//调用f1函数求出a中前4各元素之和。intx2=f1(a,6);coutx1''x2endl;}intf1(inta[],intn){inti,s=0;for(i=0;in;i++)s+=a[i];returns;}答案:Aintf1(inta[],intn);Bf1(a,4)改错题1.下面的函数将浮点型指针参数para所指向的值赋给一个局部指针变量pFloat所指向的空间,然后输出*pFloat的值。#includeiostream.hvoidfunc(float*para){float*pFloat;6pFloat=para;coutpFloat;}错误为:______________________________________________________改正方法为:________________________________________________________________________________________________________________答案错误为:没有给指针申请空间,就直接赋值改正的方法为:先为pFloat申请空间,再赋值。2.下列程序片段对二维数组的每个元素赋值unsignedshortSomeArray[5][4];for(inti=1;i=5;i++)for(intj=1;j=4;j++)SomeArray[i][j]=i+j;错误为:______________________________________________________改正方法为:________________________________________________________________________________________________________________答案错误为:访问数组元素的下标不对改正的方法为:将两个for循环的循环初始值改为0,循环结束条件分别改为i5和j4。7编程题写一个函数,找出给定字符串中小写字母字符的个数。函数的原型为:intCalcAlpha(char*str);函数参数:str为所要处理的字符串;函数返回值:所给字符串中小写字母字符的个数intCalcAlpha(char*str){//在这里写上程序的实现}答案:intCalcAlpha(char*str){//判断字符指针是否为空if(str==NULL)return0;//记录小写字母字符个数的变量intnum=0;//依次检查各个字符,如果是小写字母,则总数加1for(inti=0;str[i]!=0x0;i++)if(str[i])='a'&&str[i]='z')num++;//返回数字字符个数returnnum;}作业3:是非题1.函数的参数和返回值类型可以是简单数据类型,也可以是指针、引用、数组和类。3.错82.如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这个函数自动继承基类中虚函数的特性。5.对填空题#includeiostream.h________A___________;intf2(int*a,intn){______B___________;for(i=1;in;i++)if(maxa[i])max=a[i];returnmax;}voidmain(){intb[MM]={3,12,6,20,9,7,34,50,25,66};_______C__________;//求出b[4]至b[8]之间的最大值并赋给x1_______D___________;//求出b[0]至b[5]之间的最大值并赋给x2coutx1''x2endl;}答案:AconstintMM=10;Binti,max=a[0];Cintx1=f2(b+4,5);9Dintx2=f2(b,6);阅读理解题二、valarray是C++的标准模板库中的一个类模板,类模板的每个实例类实现了某个具体的数据类型的数组,如valarrayint是一个整型的数组类。该类的使用和一般的数组非常类似,可以通过’[]’运算符来访问数组中的每个元素。C++的标准模板库中还有一个模板函数abs(),其函数原型为:templateclassTvalarrayTabs(constvalarrayT&x);该函数的作用是将作为参数的数组x的每个元素的值取绝对值,并返回得到的新的数组。如原来的数组为:4-1-30-34将这个数组作为参数传递给函数abs后,函数返回的数组就变成:413034要求:阅读下列程序,回答后面的问题。/********************************************************************/#includeiostream.h#includevalarray.h//该头文件中定义了模板类valarray和模板函数abs()#defineARRAY_SIZE10typedefvalarrayintINTVALARRAY;voidmain(){INTVALARRAYval_array(ARRAY_SIZE);//定义一长度为ARRAY_SIZE的数组对象10//赋初始值for(inti=0;iARRAY_SIZE;i++)val_array[i]=-i;coutSizeofval_array=val_array.size()\n;coutThevaluesofval_arraybeforecallingabs():\n;for(i=0;iARRAY_SIZE;i++)coutval_array[i];cout\n;INTVALARRAYabs_array=abs(val_array);coutTheresultofval_arrayaftercallingabs():\n;for(i=0;iARRAY_SIZE;i++)coutabs_array[i];cout\n;}/*********************************************************************/问题1:写出程序的输出结果问题2:关于程序中的语句:INTVALARRAYval_array(ARRAY_SIZE);下列说法哪些是正确的,哪些是错误的?在下表相应的位置写上“对”或“错”题号ABCDE对/错(A)该语句定义了一个对象val_array,这个对象是类valarrayint的实例11(B)该语句说明了一个函数原型,函数的名字为val_array,参数为ARRAY_SIZE,函数的返回值类型为INTVALARRAY(C)板类valarray一定有一个只带一个参数的构造函数(D)模板类valarray一定有一个只带两个参数的构造函数(E)ARRAY_SIZE将作为参数传递给val_array的构造函数,初始化val_array对象问题3:(本小题共12分)下面是模板函数abs()的实现。这个实现中有错误,指出错误并写出正确的实现。注意:函数头是正确的,不要改变,所有的错误出现在函数体中。templateclassTvalarrayTabs(constvalarrayT&x){for(inti=0;ix.size();i++)if(x[i]