《面向?qū)ο蟪绦蛟O計》課程作業(yè)及答案_第1頁
《面向?qū)ο蟪绦蛟O計》課程作業(yè)及答案_第2頁
《面向?qū)ο蟪绦蛟O計》課程作業(yè)及答案_第3頁
《面向?qū)ο蟪绦蛟O計》課程作業(yè)及答案_第4頁
《面向?qū)ο蟪绦蛟O計》課程作業(yè)及答案_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

《面向?qū)ο蟪绦蛟O計》課程作業(yè)及答案

作業(yè)1:

是非題

1.頭文件中一般存放著變量和常量的定義、函數(shù)的原型以及類的定義。1.錯

2.程序的編譯是以文件為單位的,因此將程序分到多個文件中可以減少每次對程序

修改所帶來的編譯工作量。4.對

填空題

下面是一個求數(shù)組元素之和的程序。主程序中定義并初始化了一個數(shù)組,然后計算該

數(shù)組各元素的和,并輸出結(jié)果。函數(shù)sum計算數(shù)組元素之和。填充程序中不完整的部分。

A

intsum(int[],int);

voidmain()

{

intia[5]={2,3,6,8,10};

B;

sumOfArray=sum(ia,5);

cout?〃Sumofarray:?sumOfArray?endl;

}

intsum(intarray[],intlen)

(

intiSum=0;

for(inti=0;C;D)

_E;

returniSum;

)

答案:

Attinclude<iostream.h>

BintsumOfArray;

Ci<len

Di++

EiSum+=array[i];

閱讀理解題

寫出下列程序的運行結(jié)果:

//filel.cpp

staticinti=20;

intx;

staticintg(intp)

(

returni+p;

)

voidf(intv)

(

X=g(v);

}

//file2.cpp

ftinclude<iostream.h>

externintx;

voidf(int);

voidmain()

(

inti=5;

f(i);

cout?X;

)

回答以下問題:

2

1.程序的運行結(jié)果是什么樣的?

2.為什么文件file2.cpp中要包含頭文件〈iostream.h>?

3.在函數(shù)main。中是否可以直接調(diào)用函數(shù)g()?為什么?

4.如果把文件filel.cpp中的兩個函數(shù)定義的位置換一下,程序是否正確?為什

么?

5.文件filel.cpp和file2.cpp中的變量i的作用域分別是怎樣的?在程序中直接

標出兩個變量各自的作用域。

答案:

1.程序的運行結(jié)果:25

因為程序中需要利用cout對象進行輸出,而cout是在C++標準I/O庫iostream中

定義的類ostream的一個對象。

2在函數(shù)main。中不可以直接調(diào)用函數(shù)g(),因為g()是靜態(tài)函數(shù),只在它所在的文

件內(nèi)可見。

3如果把文件filel.cpp中的兩個函數(shù)定義的位置換一下,程序不正確,因為C++規(guī)

定所有使用的變量和函數(shù)需要先聲明,后使用。在函數(shù)f中用到了函數(shù)g,所以函數(shù)

f不能出現(xiàn)在函數(shù)g的定義或聲明之前。

文件filel.cpp中的變量i的作用域從它的定義開始到文件結(jié)束。File2.cpp中的變

量i的作用域從它的定義開始到main函數(shù)結(jié)束。

編程題

寫一個函數(shù),完成在鏈表末尾增加一個節(jié)點的操作。函數(shù)的原型為:

Node*AddNode(Node*&head,intnewData);

其中,鏈表節(jié)點的定義如下:

structNode{

intdata;〃存放數(shù)據(jù)

Node*next;〃指向鏈表中的下一個節(jié)點

};

函數(shù)參數(shù):函數(shù)的第一個參數(shù)head指向鏈表的第一個節(jié)點,如果鏈表為空,則head的值為

NULLo第二個參數(shù)newData為要插入的新節(jié)點中存放的數(shù)據(jù)。

函數(shù)返回值:當成功地插入新的節(jié)點時,函數(shù)返回指向新節(jié)點的指針,否則,如果不能申請

到內(nèi)存空間,則返回NULL。

Node*AddNode(Node*&head,intnewData)

{

〃在這里寫出函數(shù)的實現(xiàn)

)

答案:

Node*AddNode(Node*&head,intnewData)

{

〃申請新的節(jié)點空間

Node*newNode=newNode;

if(newNode==NULL)

returnNULL;

〃填充新節(jié)點的內(nèi)容

newNode->data二newData;

newNode->next=NULL;

〃插入到鏈表的結(jié)尾

if(head==NULL)

head二newNode;

else

(

〃尋找鏈表的最后一個節(jié)點

Node*tail=head;

while(tail->next!=NULL)

tail=tail->next;

〃將新節(jié)點插入到最后

tail->next=newNode;

)

returnnewNode;

}

作業(yè)2:

是非題

i.在不同作用域中的變量可以同名。對

2.派生類的成員函數(shù)可以直接訪問基類的所有成員。2.錯

填空題

#include<iostream.h>

A;

4

voidmain()

inta[6]={2,4,8,6,9,14);

intxl=B;〃調(diào)用fl函數(shù)求出a中前4各元素之和。

intx2=f1(a,6);

cout<<xl?,,<<x2?endl;

)

intfl(inta[],intn)

{

inti,s=0;

for(i=0;i<n;i++)s+=a[i];

returns;

)

答案:

Aintfl(inta[],intn);

Bfl(a,4)

改錯題

1.下面的函數(shù)將浮點型指針參數(shù)para所指向的值賦給一個局部指針變量pFloat所

指向的空間,然后輸出*pFloat的值。

ftinclude<iostream.h>

voidfunc(float*para)

float*pFloat;

pFloat=para;

cout<<pF1oat;

}

錯誤為:________________________________________________________

改正方法為:____________________________________________________

答案

錯誤為:沒有給指針申請空間,就直接賦值

改正的方法為:先為pFloat申請空間,再賦值。

2.下列程序片段對二維數(shù)組的每個元素賦值

unsignedshortSomeArray[5][4];

for(inti=1;i<=5;i++)

for(intj=1;j<=4;j++)

SomeArray[i][j]=i+j;

錯誤為:________________________________________________________

改正方法為:____________________________________________________

答案

錯誤為:訪問數(shù)組元素的下標不對

改正的方法為:

將兩個for循環(huán)的循環(huán)初始值改為0,循環(huán)結(jié)束條件分別改為i〈5和

j<4=

6

編程題

寫一個函數(shù),找出給定字符串中小寫字母字符的個數(shù)。函數(shù)的原型為:

intCalcAlpha(char*str);

函數(shù)參數(shù):str為所要處理的字符串;

函數(shù)返回值:所給字符串中小寫字母字符的個數(shù)

intCalcAlpha(char*str)

{〃在這里寫上程序的實現(xiàn)

)

答案:

intCalcAlpha(char*str)

{

〃判斷字符指針是否為空

if(str=NULL)return0;

〃記錄小寫字母字符個數(shù)的變量

intnum=0;

〃依次檢查各個字符,如果是小寫字母,則總數(shù)加1

for(inti=0;str[i]!=0x0;i++)

if(str[i])>=,aJ&&str[i]<=,z)

num++;

〃返回數(shù)字字符個數(shù)

returnnum;

}

作業(yè)3:

是非題

1.函數(shù)的參數(shù)和返回值類型可以是簡單數(shù)據(jù)類型,也可以是指針、引用、數(shù)組和

類。3.錯

2.如果派生類的成員函數(shù)的原型與基類中被定義為虛函數(shù)的成員函數(shù)原型相同,那

么,這個函數(shù)自動繼承基類中虛函數(shù)的特性。5.對

填空題

#include<iostream.h>

A;

intf2(int*a,intn)

(

B;

for(i=l;i<n;i++)

if(max<a[i])max=a[i];

returnmax;

}

voidmain()

(

intb[MM]={3,12,6,20,9,7,34,50,25,66);

C;//求出b[4]至b[8]之間的最大值并賦給xl

D;〃求出b[0]至b[5]之間的最大值并賦給x2

cout?xl<<,><<x2?endl;

}

答案:

AconstintMM=10;

Binti,max=a[0];

Cintxl=f2(b+4,5);

8

Dintx2=f2(b,6);

閱讀理解題

二、valarray是C++的標準模板庫中的一個類模板,類模板的每個實例類實現(xiàn)了某

個具體的數(shù)據(jù)類型的數(shù)組,如valarray<int>是一個整型的數(shù)組類。該類的使用和一般的

數(shù)組非常類似,可以通過,[了運算符來訪問數(shù)組中的每個元素。

C++的標準模板庫中還有一個模板函數(shù)abs(),其函數(shù)原型為:

template<classT>

valarray<T>abs(constvalarray<T>&x);

該函數(shù)的作用是將作為參數(shù)的數(shù)組x的每個元素的值取絕對值,并返回得到的新的數(shù)組。

如原來的數(shù)組為:

4-1-30-34

將這個數(shù)組作為參數(shù)傳遞給函數(shù)abs后,函數(shù)返回的數(shù)組就變成:

413034

要求:閱讀下列程序,回答后面的問題。

ftinclude<iostream.h>

ttinclude<valarray.h>〃該頭文件中定義了模板類valarray和模板函數(shù)abs()

ftdefineARRAY_SIZE10

typedefvalarray<int>INTVALARRAY;

voidmain()

(

INTVALARRAYval_array(ARRAY_SIZE);

〃定義一長度為ARRAY_SIZE的數(shù)組對象

〃賦初始值

for(inti=0;i<ARRAY_SIZE;i++)

val_array[i]=-i;

cout?”Sizeofvalarray=〃<<val_array.size()?〃\n〃;

cout?”Thevaluesofvalarraybeforecallingabs():\n〃;

for(i=0;i<ARRAY_SIZE;i++)

cout<<val_array[i]?〃;

cout<<〃\n〃;

INTVALARRAYabs_array=abs(val_array);

cout?”Theresultofvalarrayaftercallingabs():\n〃;

for(i=0;i<ARRAY_SIZE;i++)

cout?abs_array[i]<<〃;

cout?〃\n〃;

)

問題1:寫出程序的輸出結(jié)果

問題2:關于程序中的語句:

INTVALARRAYval_array(ARRAY_SIZE);

下列說法哪些是正確的,哪些是錯誤的?在下表相應的位置寫上“對”或“錯”

題號ABCDE

對/錯

(A)該語句定義了一個對象val_array,這個對象是類valarray〈int>的實例

10

(B)該語句說明了一個函數(shù)原型,函數(shù)的名字為val_array,參數(shù)為ARRAY_SIZE,

函數(shù)的返回值類型為INTVALARRAY

(C)板類valarray一定有一個只帶一個參數(shù)的構(gòu)造函數(shù)

(D)模板類valarray一定有一個只帶兩個參數(shù)的構(gòu)造函數(shù)

(E)ARRAY_SIZE將作為參數(shù)傳遞給val_array的構(gòu)造函數(shù),初始化val_array對象

問題3:(本小題共12分)下面是模板函數(shù)abs()的實現(xiàn)。這個實現(xiàn)中有錯誤,指出

錯誤并寫出正確的實現(xiàn)。注意:函數(shù)頭是正確的,不要改變,所有的錯誤出現(xiàn)在函數(shù)體

中。

template<classT>

valarray<T>abs(constvalarray<T>&x)

(

for(inti=0;i<x.size();i++)if(x[i]<0)x[i]*=-l;

returnx;

這個函數(shù)實現(xiàn)中有以下錯誤:

(1)

(2)

正確的函數(shù)實現(xiàn)應為:

template<classT>

valarray<T>abs(constvalarray<T>&x)

問題4:(本小題3分)從上面的程序中,你可以推斷出,valarray模板類中至少重

載了哪個或哪些C++的運算符?

答:重載了運算符

答案:

問題1:程序的輸出結(jié)果為:

Sizeofvalarray=10

Thevaluesofvalarraybeforecallingabs():

0-1-2-3-4-5-6-7-8-9

Theresultofval_arrayaftercallingabs():

0123456789

問題2.

題號ABcDE

對/錯對錯對錯對

問題3.答案:該函數(shù)實現(xiàn)有以下錯誤:

(1)函數(shù)的參數(shù)x為const參數(shù),不能在函數(shù)體中被改變

(2)在函數(shù)中應該創(chuàng)建一個臨時對象,這個對象的內(nèi)容由參數(shù)x的內(nèi)容運算而來

(3)函數(shù)返回的應是臨時對象,而不是參數(shù)

正確的函數(shù)實現(xiàn)為:

template<classT>

valarray<T>abs(constvalarray<T>&x)

(

INTVALARRAYret_array(x);〃利用拷貝構(gòu)造函數(shù)構(gòu)造臨時對象

for(inti=0;i<x.size();i++)

if(ret_array[i]<0)

12

ret_array[i]*=-1;〃取絕對值

returnret_array;〃返回臨時對象

)

或者

template<classT>

valarray<T>absl(constvalarray<T>&x)

(

INTVALARRAYret_array(x.sizeO);〃構(gòu)造一個與x長度相同的對象

for(inti=0;i<x.sizeO;i++)

{

if(x[i]<0)

ret_array[i]=x[i]*(T);〃取絕對值

else

ret_array[i]=x[i];

}

returnret_array;〃返回臨時對象

}

問題4.答案:重載了取數(shù)組下標的運算符

編程題

2.(本每小題15分)寫一個函數(shù),找出給定字符串中具有最大ASCII碼的字符。如字符串

“world"中字符'w'具有最大的ASCII碼。函數(shù)的原型為:

charMaxCharacter(char*str);

函數(shù)參數(shù):str指向所要處理的字符串;

函數(shù)返回值:如果str不空,則返回具有最大ASCII碼的字符,否則返回空字符0x0或、0,。

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<strlen(str);i++)

(

if(str[i]>maxChar)

maxChar=str[i];

)

returnmaxChar;

)

第三種:

charMaxCharacter(char*str)

{

if(str==NULL||str[0]==0x0)

return0x0;

charmaxChar二str[0];

for(inti=l;str[i]!=0x0;i++)

{

if(str[i]>maxChar)

maxChar=str[i];

)

returnmaxChar;

}

第四種:

charMaxCharacter(char*str)

14

if(str==NULL||str[O]==0x0)

return0x0;

charmaxChar=str[0];

inti=l;

while(str[i]!=0x0)

(

if(str[i]>maxChar)

maxChar=str[i];

i++;

returnmaxChar;

作業(yè)4:

是非題

1.函數(shù)重載既要求兩函數(shù)參數(shù)對應的類型不同又要求參數(shù)個數(shù)不同。錯

2.在基類中被說明為虛函數(shù)的類的成員函數(shù)必須在每個派生類中說明為虛函數(shù),才

能具有多態(tài)的特征。錯

填空題

#include<iostream.h>

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<<x.fl()<<<><<y.f2()?endl;

}

答案:

Aa=aa;

Bb=bb;

Cintfl();

Dintf2();

閱讀理解題

三、下面的文件queue,h是一個隊列類模板Queue的完整實現(xiàn)。在這個文件中首先定

義了一個隊列元素類模板Queueitem,然后在這個類的基礎上定義了隊列類模板Queue。

在Queue中使用鏈表存放隊列的各個元素,front指針指向鏈表的第一個節(jié)點元素,back

16

指針指向鏈表的最后一個節(jié)點元素,成員函數(shù)add()將一個新節(jié)點元素加入到隊列結(jié)尾,

remove。從隊列開頭刪除一個節(jié)點元素。為方便起見,程序中加上了行號。閱讀程序,根

據(jù)程序后面的問題作出相應解答。

/*********************文件queue,h***********************/

template<classType>

classQueue;

/*****************定義模板類Queueltem************/

template<classType>

classQueueitem

{

public:

Queueitem(constType&elem):item(elem){}

Queueitem(){}

private:

Typeitem;

Queueitem*nextitem;

friendclassQueue<Type>;

);

/*****************定義模板類Queue************/

template<classType>

classQueue(

public:

Queue():front(NULL),(A){}

"Queue();

Typeremove();

voidadd(constType&);

boolis_empty()const{return____(B);}

private:

QueueItem<Type>*front;

QueueItem<Type>*back;

);

〃模板類Queue的函數(shù)成員remove()的實現(xiàn)

〃從隊列頭取出一個節(jié)點,并返回該節(jié)點的值

template<classType>

TypeQueue<Type>::remove()

{

QueueItem<Type>*pFront;〃指向頭節(jié)點的臨時指針

TyperetVal;//返回值

(C);

retVal=front->item;

front=front->nextltem;

deletepFront;

18

returnretVal;

//模板類Queue的函數(shù)成員add()的實現(xiàn)

template<classType>

voidQueue<Type>::add(constType&newltem)

{

QueueItem<Type>*pNew=newQueueItem<Type>;

pNew->item=newltem;

(D);

if(front==NULL)

front=back=pNew;

else

(

back->nextltem=pNew;

(E);

)

)

template<classType>

Queue<Type>::~Queue()

{

QueueItem<Type>*p=front,*q;

while(p!=NULL)

q=p->nextltem;

deletep;

P二q;

}

}

問題1:(每個填空3分,共15分)程序中有幾處填空,將它們完成。

(A)

(B)

(C)

(D)

(E)

問題2:(本小題3分)題中程序第1,2行為什么要說明一下類模板Queue?如果沒

有這兩行語句,程序還正確嗎?

問題3:(本小題4分)程序第22,23行各有一個const,它們各自表示什么含義:

問題4:(本小題3分)程序中模板類Queue的析構(gòu)函數(shù)主要做了什么事情?為什么

要這么做?

問題5:(本小題5分,每答對一個給1分)下面的程序使用了queue,h文件中定義

的類模板,說明程序中哪些定義隊列對象的語句是不正確的,哪些是正確的。

ttinclude“queue,h”

voidmain()

(

Queueql;//1

Queue<int>q2;//2

20

Queue<int>q3(100);//3

Queue<int>q4[100];//4

Queue<int>*q5=newQueue<int>;//5

deleteq5;

語句號12345

對/錯

答案:

問題L答案為:

(A)back(NULL)

(B)front==NULL或back==NULL

(C)pFront=front

(D)pNew->nextItem=NULL

(E)back=pNew

問題2:

答:不正確。因為在類Queueltem模板類的定義中用到了模板類Queue,而此時

Queue還沒有定義,所以要先聲明一下,告訴編譯程序Queue是一個模板類,它將在程序

的其他地方定義。如果沒有這個說明,編譯程序就不知道標識符Queue代表什么樣的含義

To

問題3:

答:第22行的const修飾的是函數(shù)的參數(shù),表示在這個函數(shù)體中不能改它所修飾的

參數(shù)所對應的實際參數(shù)的值。

第23行的const修飾的是模板類Queue的成員函數(shù)is_empty(),它表示在函數(shù)

is_empty()的函數(shù)體中不能改變?nèi)魏螖?shù)據(jù)成員的值。

問題4:

答:析構(gòu)函數(shù)中主要是釋放鏈表中存放的各個節(jié)點的空間。因為Queue對象在其生存

期間可能加入了很多節(jié)點,從堆中申請了一些內(nèi)存空間,這些空間應該隨著對象的消亡而

釋放掉,所以需要在析構(gòu)函數(shù)中來釋放這些空間。

問題5:

語句號12345

錯對/錯錯對對

編程題

三、定義一個日期類加抬,該類對象存放一個日期,可以提供的操作有:

intGetYear();〃取年份

intGetMonth();〃取月份

intGetDay();〃取日子值

voidSetDate(intyear,intmonth,intday);〃設置日期值

下面是測試你所定義的日期類的程序:

ttinclude<iostream.h>

ttinclude"date,h”

voidmainO

(

Datedl(1999,1,14);〃用所給日期定義一個日期變量

Dated2;〃定義一個具有缺省值的日期,缺省值為1980年1月1日

Dated3(dl);〃用已有日期x構(gòu)造一個新對象

d2.SetDate(1999,3,13);

cout<<〃Date:〃;

cout<<dl.GetYear()<<5.J<<dl.GetMonth()<<'.'dl.GetDay()?endl;

cout?〃Date:〃;

cout?d2.GetYear()?5.,?d2.GetMonth()?'.'d2.GetDay()?endl;

cout<<〃Date:〃;

cout<<d3.GetYear()?

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論