面向对象程序设计课程作业及答案.docx
《面向对象程序设计课程作业及答案.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计课程作业及答案.docx(23页珍藏版)》请在冰豆网上搜索。
![面向对象程序设计课程作业及答案.docx](https://file1.bdocx.com/fileroot1/2023-7/5/b28d77cf-186f-43ba-8aa8-f0776abc9948/b28d77cf-186f-43ba-8aa8-f0776abc99481.gif)
面向对象程序设计课程作业及答案
《面向对象程序设计》课程作业及答案
中央电大理工部计算机教研室
作业1:
是非题
1.头文件中一般存放着变量和常量的定义、函数的原型以及类的定义。
1.错
2.程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改
所带来的编译工作量。
4.对
填空题
下面是一个求数组元素之和的程序。
主程序中定义并初始化了一个数组,然后计算该数组各元素的和,并输出结果。
函数sum计算数组元素之和。
填充程序中不完整的部分。
A
intsum(int[],int);
voidmain()
{
intia[5]={2,3,6,8,10};
B;
sumOfArray=sum(ia,5);
cout<<"Sumofarray:
"<{
intiSum=0;
for(inti=0;C;D)
;
returniSum;
}
答案:
A#includeBintsumOfArray;
CiDi++
EiSum+=array[i];
阅读理解题
写出下列程序的运行结果:
//file1.cpp
staticinti=20;intx;
staticintg(intp)
{
returni+p;
}
voidf(intv)
x=g(v);
}
//file2.cpp
#include
externintx;
voidf(int);
voidmain()
{
inti=5;
f(i);
cout<}
回答以下问题:
1.程序的运行结果是什么样的?
2.为什么文件file2.cpp中要包含头文件?
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如果把文件filel.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为要插入的新节点中存放的数据。
函数返回值:
当成功地插入新的节点时,函数返回指向新节点的指针,否则,如果不能申请到内存空间,则返回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.错填空题
#include
A;
voidmain()
{
inta[6]={2,4,8,6,9,14};
intx1=B;//调用f1函数求出a中前4各元素之和。
intx2=f1(a,6);
cout<}
intf1(inta[],intn)
{
inti,s=0;
for(i=0;ireturns;
}
答案:
Aintf1(inta[],intn);
Bf1(a,4)
改错题
1.下面的函数将浮点型指针参数para所指向的值赋给一个局部指针变量pFloat所指向的空间,然后输出*pFloat的值。
#include
voidfunc(float*para)
{
float*pFloat;
pFloat=para;
cout<}
错误为:
改正方法为:
答案错误为:
没有给指针申请空间,就直接赋值改正的方法为:
先为pFloat申请空间,再赋值。
2.下列程序片段对二维数组的每个元素赋值unsignedshortSomeArray[5][4];
for(inti=1;i<=5;i++)
for(intj=1;j<=4;j++)
SomeArray[i][j]=i+j;
错误为:
改正方法为:
答案错误为:
访问数组元素的下标不对
改正的方法为:
将两个for循环的循环初始值改为0,循环结束条件分别改为i<5和j<4。
编程题
写一个函数,找出给定字符串中小写字母字符的个数。
函数的原型为:
intCalcAlpha(char*str);
函数参数:
str为所要处理的字符串;
函数返回值:
所给字符串中小写字母字符的个数intCalcAlpha(char*str){//在这里写上程序的实现
答案:
intCalcAlpha(char*str)
{
//判断字符指针是否为空
if(str==NULL)return0;
//记录小写字母字符个数的变量
intnum=0;
//依次检查各个字符,如果是小写字母,则总数加1
for(inti=0;str[i]!
=0x0;i++)if(str[i])>='a'&&str[i]<='z')num++;
//返回数字字符个数
returnnum;}
作业3:
是非题
1.函数的参数和返回值类型可以是简单数据类型,也可以是指针、引用、数组和类。
3.错
2.如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这个函数自动继承基类中虚函数的特性。
5.对填空题
#includeA;
intf2(int*a,intn)
{
B;for(i=1;ireturnmax;
}
voidmain()
{
intb[MM]={3,12,6,20,9,7,34,50,25,66};
C;//求出b[4]至b[8]之间的最大值并赋给x1D;//求出b[0]至b[5]之间的最大值并赋给x2cout<答案:
AconstintMM=10;
Binti,max=a[0];
Cintx1=f2(b+4,5);
Dintx2=f2(b,6);
阅读理解题
二、valarray是C++的标准模板库中的一个类模板,类模板的每个实例类实现了某个具
体的数据类型的数组,如valarray是一个整型的数组类。
该类的使用和一般的数组非常类似,可以通过'[]'运算符来访问数组中的每个元素。
C++的标准模板库中还有一个模板函数abs(),其函数原型为:
template
valarrayabs(constvalarray&x);
该函数的作用是将作为参数的数组x的每个元素的值取绝对值,并返回得到的新的数组。
如原来的数组为:
4-1-30-34将这个数组作为参数传递给函数abs后,函数返回的数组就变成:
413034要求:
阅读下列程序,回答后面的问题。
'****************************************************************
#include
#include
II该头文件中定义了模板类valarray和模板函数abs()
#defineARRAY_SIZE
typedefvalarray
10
INTVALARRAY;
voidmain(){
INTVALARRAYval_array(ARRAY_SIZE);
II定义一长度为ARRAY_SIZE勺数组对象
//赋初始值
for(inti=0;icout<<"Sizeofval_array="<cout<<"Thevaluesofval_arraybeforecallingabs():
\n";for(i=0;icout<cout<<"\n";
INTVALARRAYabs_array=abs(val_array);
cout<<"Theresultofval_arrayaftercallingabs():
\n";for(i=0;icout<cout<<"\n";
}
/*********************************************************************/
问题1:
写出程序的输出结果
问题2:
关于程序中的语句:
INTVALARRAYval_array(ARRAY_SIZE);
下列说法哪些是正确的,哪些是错误的?
在下表相应的位置写上“对”或“错”
题号
A
B
C
D
E
对/错
(A)该语句定义了一个对象val_array,这个对象是类valarray的实例
(B)该语句说明了一个函数原型,函数的名字为val_array,参数为ARRAY_SIZE函数的返回值类型为INTVALARRAY
(C)板类valarray一定有一个只带一个参数的构造函数
(D)模板类valarray一定有一个只带两个参数的构造函数
(E)ARRAY_SIZE各作为参数传递给val_array的构造函数,初始化val_array对象问题3:
(本小题共12分)下面是模板函数abs()的实现。
这个实现中有错误,指出错误
并写出正确的实现。
注意:
函数头是正确的,不要改变,所有的错误出现在函数体中。
template
valarrayabs(constvalarray&x)
{
for(inti=0;ireturnx;
}
这个函数实现中有以下错误:
(1)
(2)
(3)
正确的函数实现应为:
template
valarrayabs(constvalarray&x)
{
}
问题4:
(本小题3分)从上面的程序中,你可以推断出,valarray模板类中至少重载了
哪个或哪些C++的运算符?
答:
重载了运算符
答案:
问题1程序的输出结果为:
Sizeofval_array=10
Thevaluesofval_arraybeforecallingabs():
0-1-2-3-4-5-6-7-8-9
Theresultofval_arrayaftercallingabs():
0123456789
问题2.
题号
A
B
C
D
E
对/错
对
错
对
错
对
问题3•答案:
该函数实现有以下错误:
(1)函数的参数x为const参数,不能在函数体中被改变
(2)在函数中应该创建一个临时对象,这个对象的内容由参数x的内容运算而来
(3)函数返回的应是临时对象,而不是参数
正确的函数实现为:
templatevalarrayabs(constvalarray&x)
{
INTVALARRAYret_array(x);//利用拷贝构造函数构造临时对象
for(inti=0;i{
if(ret_array[i]<0)
ret_array[i]*=-1;//取绝对值
}
returnret_array;//返回临时对象
}
或者
template
valarrayabs1(constvalarray&x)
{
INTVALARRAYret_array(x.size());//构造一个与x长度相同的对象
for(inti=0;i{
if(x[i]<0)
ret_array[i]=x[i]*(-1);//取绝对值
else
ret_array[i]=x[i];
}
returnret_array;//返回临时对象
}
编程题
如字符串
0x0或'\0
2.(本每小题15分)写一个函数,找出给定字符串中具有最大ASCII码的字符“world”中字符’w具有最大的ASCII码。
函数的原型为:
charMaxCharacter(char*str);
函数参数:
str指向所要处理的字符串;
函数返回值:
如果str不空,则返回具有最大ASCII码的字符,否则返回空字符
charMaxCharacter(char*str)
{
}
答案:
程序可以有多种写法,下面是其中的四种第一种:
charMaxCharacter(char*str)
{
if(str==NULL)
return0x0;
charmaxChar=0x0;
for(inti=0;str[i]!
=0x0;i++)
{
if(str[i]>maxChar)maxChar=str[i];
}
returnmaxChar;
}第二种:
charMaxCharacter(char*str)
{
if(str==NULL)
return0x0;
charmaxChar=0x0;
for(inti=0;i{
if(str[i]>maxChar)maxChar=str[i];
}
returnmaxChar;
}第三种:
charMaxCharacter(char*str)
{
if(str==NULL||str[0]==0x0)return0x0;
charmaxChar=str[0];for(inti=1;str[i]!
=0x0;i++){if(str[i]>maxChar)maxChar=str[i];
}
returnmaxChar;
}
第四种:
charMaxCharacter(char*str)
{
if(str==NULL||str[0]==0x0)return0x0;
charmaxChar=str[0];
inti=1;
while(str[i]!
=0x0)
{
if(str[i]>maxChar)maxChar=str[i];
i++;
}
returnmaxChar;
}
作业4:
是非题
1.函数重载既要求两函数参数对应的类型不同又要求参数个数不同。
错
2.在基类中被说明为虚函数的类的成员函数必须在每个派生类中说明为虚函数,才能具有多态的特征。
错填空题
#include
classAA{
private:
inta;
intb;
public:
AA(intaa,intbb=10)
{
A;//将aa的值赋给a
B;//将bb的值赋给b
}
C;
D;
};
intAA:
:
f1(){
returna+b;
}
intAA:
:
f2(){
returna*b;
}
voidmain()
{
AAx(2,3),y(8);
cout<}
答案:
Aa=aa;
Bb=bb;
Cintf1();
Dintf2();
阅读理解题
三、下面的文件queue.h是一个队列类模板Queue的完整实现。
在这个文件中首先定义了一个队列元素类模板Queueitem,然后在这个类的基础上定义了队列类模板Queue。
在Queue中使用链表存放队列的各个元素,front指针指向链表的第一个节点元素,back指针指向链表的最后一个节点元素,成员函数add()将一个新节点元素加入到队列结尾,remove()从队列开头删除一个节点元素。
为方便起见,程序中加上了行号。
阅读程序,根据程序后面的问题作出相应解答。
/*
/
/
templateclassQueue;
定义模板类QueueItem************/
]*****************
template
classQueueItem
{
public:
QueueItem(constType&elem):
item(elem){}QueueItem(){}
private:
Typeitem;
QueueItem*nextItem;
friendclassQueue;
templateclassQueue{public:
Queue():
front(NULL),(A){}
~Queue();
Typeremove();voidadd(constType&);boolis_empty()const{return(B);}
private:
QueueItem*front;QueueItem*back;
};
//模板类Queue的函数成员remove()的实现
//从队列头取出一个节点,并返回该节点的值template
TypeQueue:
:
remove()
{
QueueItem*pFront;//指向头节点的临时指针TyperetVal;//返回值
(C);
retVal=front->item;front=front->nextItem;deletepFront;
returnretVal;
}
//模板类Queue的函数成员add()的实现
template
voidQueue:
:
add(constType&newItem)
{
QueueItem*pNew=newQueueItem;pNew->item=newItem;
(D);
if(front==NULL)front=back=pNew;
else
{back->nextItem=pNew;(E);
}}
template
Queue:
:
~Queue()
QueueItem*p=front,*q;while(p!
=NULL){q=p->nextItem;deletep;p=q;
}}
问题1:
(每个填空3分,共15分)程序中有几处填空,将它们完成。
(A)
(B)
(C)
(D)
(E)
问题2:
(本小题3分)题中程序第1,2行为什么要说明一下类模板Queue?
如果没有这两行语句,程序还正确吗?
问题3:
(本小题4分)程序第22,23行各有一个const,它们各自表示什么含义:
问题4:
(本小题3分)程序中模板类Queue的析构函数主要做了什么事情?
为什么要这么做?
问题5:
(本小题5分,每答对一个给1分)下面的程序使用了
queue.h文件中定义的类
模板,说明程序中哪些定义队列对象的语句是不正确的,
#include“queue.h”voidmain(){
Queueq1;
哪些是正确的。
//
1
Queueq2;
//