初級程序員2011下半年下午試題_第1頁
初級程序員2011下半年下午試題_第2頁
初級程序員2011下半年下午試題_第3頁
初級程序員2011下半年下午試題_第4頁
初級程序員2011下半年下午試題_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、初級程序員2011下半年下午試題試題一   閱讀以下說明和流程圖。   說明   以下流程圖用于檢查數(shù)組A1:n中的元素是否為自然數(shù)1n的一個排列(含有1n各數(shù))。若是,則輸出OK,否則輸出所缺的自然數(shù)及其個數(shù)m。   為檢查A1:n中是否含有k,只要判斷P(k)=(A(1)-k)*(A(2)-k)*(A(n-k)是否等于0即可。   流程圖   試題二1、    閱讀以下說明和C程序代碼。   說明   下面是一個

2、待修改的C程序,其應(yīng)該完成的功能是:對于輸入的一個整數(shù)num,計算其位數(shù)k,然后將其各位數(shù)字按逆序轉(zhuǎn)換為字符串保存并輸出。若num為負整數(shù),則輸出字符串應(yīng)有前綴“-”。例如,將該程序修改正確后,運行時若輸入“14251”,則輸出“15241”;若輸入“-6319870”,則輸出“-0789136”。   下面給出的C程序代碼中有五處錯誤,請指出錯誤代碼所在的行號并給出修改正確后的完整代碼行。C程序代碼行號代 碼01020304#include stdio.h#include stdlib.hint main()05060708091011121314151617181920

3、21222324252627282930long num=0,t=0;char *pstr,i=0,k=0;scanf("%1d", num); /*輸入一個整數(shù),存入num*/t=num; k=num!=0?0:1;while(t=0) /*計算位數(shù)*/t=t/10;k+;pstr=(char *)malloc(k+2)*sizeof(char);/十申請字符串的存儲空間*/if(pstr=0)return-1;i=0:if(num0)num=-num;pstr0='-'; i=1;for(;k0; k-) /*形成字符串*/pstri+=num%10;n

4、um=num/10;pstrk='0; /*設(shè)置字符串結(jié)尾*/printf("%sn", pstr);free(pstr);return 0:試題三閱讀以下說明和C代碼。   說明   某市在進行市長選舉,該市共分為M個選區(qū)(1M6,從1開始順序編號),共有N個競選者參選(1N5,從A開始順序編號)。經(jīng)投票后,所得選票數(shù)據(jù)如表3-1所示。表3-1選票數(shù)據(jù)選區(qū)競選者A競選者B競選者C競選者D1192482063721479031221318612121384114214083952671338229   現(xiàn)已

5、將選票數(shù)據(jù)存入文本文件data.txt,該文件內(nèi)容格式如下:共有M行,每行N+1個整數(shù),第一個整數(shù)為選區(qū)編號,隨后為N個競選者在該選區(qū)所得票數(shù)。   下面的程序先從文件中讀入選票數(shù)據(jù)存入二維數(shù)組data,然后完成下列功能:   a計算并顯示每個競選者獲得的選票數(shù)及占總選票數(shù)的百分比;   b如果任一競選者獲得的選票數(shù)超過總選票數(shù)的50%,則顯示該競選者獲勝;   c如果沒有競選者獲得總選票數(shù)的50%以上,則顯示兩位得票最高的競選者需再進行決選。   在下面的程序代碼中,競選者A的編號為1,競選者

6、B的編號為2,以此類推。   C代碼   #include stdioh   #include stdlibh   #define M  5           /*選區(qū)數(shù)*/   #define N  4           /*競選者人數(shù)*/   int  main (int  argc,char  argv) 

7、        FILE *fin;       int  dataM+1 N+1;                          /*data 0存放選區(qū)編號,data Mj存放j號競選者得票總數(shù)*/   int MAXP1,cd1;         /*MAXP1、cd1存放得票最多者的票數(shù)和競選者編

8、號*/   int  MAXP2, cd2;       /*MAXP2、cd2存放得票次多者的票數(shù)和競選者編號*/   int i,j,totalP;        /*totalP存放總票數(shù)*/   fin=fopen ("data.txt","r");   if  (!fin) return -1;   i=0;    j=0; 

9、 while(!feof(fin)         /*從文件讀入數(shù)據(jù)*/       fscanf( fin,"%d", &dataij);       (1) ;       if(jN)   j=0;  i+;      fclose( fin);   totalP=0;  MAXP1=0;  

10、MAXP2=0;  cd1=0; cd2=0;   for(j=1; jN+1; j+)          dataMj=  (2) ;                  /*設(shè)置競選者得票總數(shù)初始值*/           for(i=0; iM; i+)               &

11、#160;    /*計算j號競選者的得票總數(shù)*/               dataM j+=datai j;       if  (data M jMAXP1)                  (3) ;    cd2=cd1;              

12、60;MAXP1=dataM j;  cd1=j;        else         if (dataM j MAXP2) (MAXP2=dataM j;  cd2=j;         (4) ;                              /*計算總票數(shù)*

13、/      for(j=1;  jN+1;  j+)        printf( "Candidate-%c:  %ci    ",j+'A'-1,dataMj); printf(¨%.21fn", (double)data Mj/totalP);              printf(¨n");

14、       if(  (5) 0.5)                       /*判斷得票數(shù)最多者的得票率*/           printf( "Winner: Candidate-%cn¨,cd1+'A'-1);       else       

15、   printf ("Result: Candidate-%C  PK  Candidate-%cn¨,cd1+'A'-1, cd2+'A'-1);       system( "pause¨);       return 0;   試題三閱讀以下說明和C函數(shù)。   說明   約瑟夫問題是一個經(jīng)典的問題,其描述是:有n個人(編號為1n)圍成一圈

16、,從第1個人開始,按照順時針方向從1開始計數(shù)到m(即數(shù)到第m個人),讓其出圈,然后再從其順時針方向的下一個人開始,依次計數(shù)到m并讓其出圈,重復(fù)這個過程,直到所有人都出圈,試給出出圈者的順序。   以n-5,m-3為例,其出圈順序為3,1,5,2,4,過程如圖4-1所示。      下面的函數(shù)Joseph()在單向循環(huán)鏈表表示的基礎(chǔ)上模擬上述出圈過程。n為5時的單向循環(huán)鏈表結(jié)構(gòu)如圖4-2所示。      鏈表的結(jié)點類型定義如下:   typedef   struct

17、  Node           int no;       struct Node *next;   Node, *LinkList;   函數(shù)Joseph(LinkList tail,int n,int m)的處理思路如下:   (1)用k計數(shù),每次都從0開始,當計數(shù)到m-1時結(jié)束本次計數(shù);   (2)通過指針p查找出圈者所對應(yīng)的結(jié)點,當k的值等于m-1時,p應(yīng)指向出圈者對應(yīng)結(jié)點的前驅(qū)結(jié)點; 

18、  (3)通過刪除結(jié)點表示出圈處理;   (4)當m大于圈中剩余人數(shù)時,為了避免重復(fù)計數(shù),用模運算修改m的值;   (5)計數(shù)和刪除操作完成后再恢復(fù)m的原值。   C函數(shù)   void Joseph (LinkList tail,  int n,  int m)     /*單循環(huán)鏈表包含n個結(jié)點,tai1為鏈表的尾指針,m為計數(shù)值*/   LinkList p,  q;   int k,i,old_m=m

19、;   p=tai1;       for(i=n; i1; -i)    /*i表示圈中剩余人數(shù)*/           m=m%i;              /*避免重復(fù)計數(shù)*/   if(0=m)m=  (1) ;       k=0;          

20、60;while  (k  (2)                      (3) ;   k+;                      printf("%dn",  (4) );    /*輸出出圈者的編號*/   q=p-next;  &#

21、160;  (5) =q-next;                     /*刪除出圈者對應(yīng)的結(jié)點*/   free (q);           m=old_m;              printf(¨%dn",p-No);試題五閱讀以下說明、圖和C+代碼。   說明 

22、  已知某公司主要有兩大類耗電資產(chǎn)(Asset):計算機(ComputerAsset)和建筑物(Building Asset)。為了節(jié)約能源,通過控制各種電源,將可關(guān)閉的房燈、計算機顯示器等在夜間關(guān)閉。   為了實現(xiàn)上述需求,設(shè)計了如圖5-1所示的類圖,并用下面的C+代碼加以實現(xiàn)。      C抖代碼   #include typeinfo   #include iostream   using namespace std;   class As

23、set                   /*通用資產(chǎn),基類*/   public:   virtualAsset()   ;   class PowerSwitchable                     /*抽象基類,可在夜間關(guān)閉電源的物體接口*/   public:   virtual voi

24、d powerDown()=0;      /*powerDown()函數(shù)接口*/   virtual  void powerUp()=0;    /*powerUp函數(shù)接口*/      class ComputerAsset:public Asset        /*計算機資產(chǎn)*/   protected:    int deskNumber;   public:

25、0;      ComputerAsset (int deskNumber)    this-deskNumber=deskNumber;       ;   class ComputerCPU    (1)       /*計算機主機,永不關(guān)閉*/   public:       ComputerCPU (int deskNumber) :  ComputerAss

26、et (deskNumber)       ;   class ComputerMonitor    (2)      /*計算機顯示器*/   public:       ComputerMonitor (int   roomNumber): ComputerAs set(roomNumber),   PowerSwitchable()     ComputerMo

27、nitor()     void powerDown()    /*關(guān)電源,代碼略*/       void powerUp()      /*開電源,代碼略*/          /*BuildingAsset、BuildingLight.EmergencyLight和RoomLights代碼略*/   class BuildingManagement     pr

28、ivate:       Asset*  things 24;    int numltems;   public:       void goodNight()/*值班員定時“關(guān)閉”時調(diào)用,關(guān)閉可關(guān)閉的電源*/           for (int i=0; inumltems; i+)                

29、0;(3) ps=dynamlc_castPowerSwitchable* (things i);           if (ps !=0)               ps-powerDown();             /*goodMorning()與goodNight()類似,依次調(diào)用powerUp(),實現(xiàn)略*/   void  add

30、 (Asset*  thing)    /*為建筑添加資產(chǎn)*/       things  (4) =thing;             int main()        BuildingManagement* b1=  (5) BuildingManagement();       b1-add (new RoomLights (101);

31、       /101房間的控制燈       b1-add (new EmergencyLight (101);    /101房間的應(yīng)急燈       b1-add (new  ComputerCPU (10104);    /101房間4號桌上的計算機主機       b1-add (new ComputerMonitor (10104); /101房間4號桌上的計算機顯示器

32、60;      b1-goodNight(  );       delete b1;   試題六閱讀以下說明和Java代碼。   說明   已知某公司主要有兩大類耗電資產(chǎn)(Asset):計算機(ComputerAsset)和建筑物(Building Asset)。為了節(jié)約能源,通過控制各種電源,將可關(guān)閉的房燈、計算機顯示器等在夜間關(guān)閉。   為了實現(xiàn)上述需求,設(shè)計了如圖6-1所示的類圖,并用下面的Java代碼加以實現(xiàn)。  &

33、#160;   Java代碼   abstract class Asset          /*通用資產(chǎn),基類*/       interface PowerSwitchable    /*可在夜間關(guān)閉電源的物體實現(xiàn)該接口*/       public void powerDown();       public void powerUp();  

34、0;   abstract class BuildingAsset extends Asset      /*建筑物資產(chǎn)*/       protected int room;       public BuildingAsset (int room)    this .room=room;          abstract class BuildingLight extends Bu

35、ildingAsset         /燈的通用信息:flourescent/incandescent等,略       BuildingLight (int roomNumber)    super (roomNumber);        class EmergencyLight  (1) (    /*應(yīng)急燈,永不關(guān)閉*/       EmergencyLig

36、ht (int  roomNumber)            super (roomNumber);         class RoomLights    (2)        RoomLights (int roomNumber)    super( roomNumber);         public void powerDow

37、n()    /*關(guān)電源,代碼略*/         public void powerUp()    /*開電源,代碼略*/        /*ComputerAsset.ComputerCPU和ComputerMonitor代碼略*/   public class BuildingManagement         Asset things =new Asset24; 

38、     int numltems=0;       public void goodNight()  /*值班員定時”關(guān)閉”時調(diào)用,關(guān)閉可關(guān)閉的電源*/           for (int i=0; ithings.length; i+)               if  (thingsi  instanceof  (3) )  &

39、#160;                ( PowerSwitchable)things i).powerDown(  );          /*goodMorning()與goodNight()類似,依次調(diào)用powerUp(),其實現(xiàn)細節(jié)此處略*/   public void add(Asset thing)    /*為建筑添加資產(chǎn)*/        

40、0;  things  (4) =thing;              public  static  void main (String  args)            BuildingManagement b1=  (5) BuildingManagement();           b1.add (new RoomLight

41、s (101);             / 101房間的控制燈           b1.add (new EmergencyLight (101);         / 101房間的應(yīng)急燈           b1.add (new  ComputerCPU (10104);         / 101房間4號桌上的計算機主

42、機           b1.add (new  ComputerMonitor (10104);     / 101房間4號桌上的計算機顯示器           b1.goodNight();          答案:試題一1、 2、 3、P*(A(i)-k) 4、P=0 5、m+1解析 本題考查算法設(shè)計和描述的基本能力。   從流程圖看出,首先需要對m賦初值,然

43、后對k=1,2,n循環(huán),檢查數(shù)組A中是否含k。為此,在該循環(huán)中,需要嵌套內(nèi)循環(huán)來計算P(k)。然后判斷計算結(jié)果P的值是否等于0,來決定數(shù)組A中是否含k,并采取相應(yīng)的動作。   為了對i循環(huán)計算累乘的P(k),需要先在P中送初值1。因此(2)處應(yīng)填1,并在(3)處填寫P*(A(i-k)進行累乘。   內(nèi)循環(huán)結(jié)束后,(4)處應(yīng)判斷P=O是否成立。P=0表示數(shù)組A中含k,否則表示數(shù)組A中缺k。因此,(4)處應(yīng)填寫P=0。   如果數(shù)組A中缺k,則缺數(shù)計數(shù)m應(yīng)增1。因此,(5)處應(yīng)填m+1,而m的初值應(yīng)送0,從而(1)處應(yīng)填0。 

44、 k循環(huán)結(jié)束后,應(yīng)根據(jù)m的值決定輸出結(jié)果。m=0表示數(shù)組A中包含全部自然數(shù)1至n,即數(shù)組A的元素就是1n的一個排列;m不等于0表示數(shù)組A中短缺其中m個自然數(shù)。   本題的算法可應(yīng)用于判斷標準數(shù)獨的答案是否正確。例如,9階(9*9)標準數(shù)獨解答所得的結(jié)果應(yīng)在每行、每列、每個3*3宮內(nèi)都包含19,并不重復(fù),即都是19的一個排列。靠人工檢查稍有麻煩,尤其是16階標準數(shù)獨解答結(jié)果的人工檢查更令人煩惱,這個算法則提供了一種處理思路。試題二1、行號修改正確后的完整代碼行說 明7scanf("%ld", &num); 9while (t!=

45、0)或者while (t) 15if(!pstr)return -1;!pstr可替換為pstr=0或pstr=NULL23pstri+=num%10+'0''0'可由48、060、0x30、'060'、'x30'或其他相等值代替26pstri='0';或pstri+='0';'0'可由0代替   以上解答不分次序解析 本題考查C程序員查找錯誤和排除錯誤的基本能力。   程序中的錯誤主要分為語法錯誤和語義錯誤兩類。  

46、60;語法錯誤是指語言結(jié)構(gòu)上的錯誤,例如,是否引用了未定義的變量,表達式中缺少操作數(shù)等等。語義錯務(wù)是指語言結(jié)構(gòu)含義不正確或程序的運算邏輯有錯誤,這類錯誤可能在編譯階段發(fā)現(xiàn)(靜態(tài)語義),也可能推遲到運行階段才暴露。例如,表達式中運算符號不能處理所引用的運算對象,無窮循環(huán)等。   考生需要非常熟悉C語言的基本語法,從而通過走查源代碼來發(fā)現(xiàn)語法錯誤。查找語義錯誤則需要充分理解程序的邏輯,也就是整個程序的結(jié)構(gòu)和每條語句所起的作用。   前2行為預(yù)處理命令行,對于最常使用的include命令,考生應(yīng)該非常熟悉,以便檢查程序中對常用函數(shù)的調(diào)用是否正確。本程序中前兩行

47、無錯誤。   顯然,接下來的四行分別為mam函數(shù)的首部,函數(shù)體的開始符號“”、變量定義語句和空白行,這里也沒有錯誤。   第7行為格式化輸入函數(shù)scanf的調(diào)用語句,這是比較容易出錯的地方,常見的錯誤是格式控制串與輸入表列中的變量不匹配,或者是丟失變量前的取地址運算符號“&”,該行的錯誤即在這里。   第8行至第12行用于計算所輸入整數(shù)的位數(shù)并用k來計算(記錄),這幾行代碼應(yīng)作為一個整體來理解。程序中首先將num的值備份至t,并對k賦值,然后通過循環(huán)對t進行輾轉(zhuǎn)除以10的運算,使t每次都丟掉其個位數(shù),即t的位數(shù)逐漸減少(t每減

48、少1位,k就增加1),直到t的值為0時為止,此時k的值即為num的位數(shù)。第9行的循環(huán)條件錯誤導致了無窮循環(huán)(t等于0時也繼續(xù)循環(huán)),由于t的初值也可能是負數(shù),因此應(yīng)將其中的“t=0”改為“t!=0”。   第14行沒有錯誤。   第15行的錯誤很明顯,也很常見,即將“=”誤用為“=”,從而改變其所在語句的語義,其中的“pst=O”則將pstr的值重置為0,使pstr所記錄的字符串存儲空間首地址信息丟失,此后針對pstr的運算都會出錯。   第17行至第21行用于處理num為負數(shù)時輸出字符串應(yīng)包含前綴“一”的要求,這幾行沒有錯誤。

49、60;  第22行至第25行用于從num得到其逆置的數(shù)字字符串,其錯誤在第23行,屬于邏輯錯誤。num%10的運算結(jié)果為num的個位數(shù)字,而pstr中要存儲的是數(shù)字字符(即ASCII值),因此應(yīng)將num%10的運算結(jié)果加上字符0(或字符0的ASCII碼值48)。   第26行用于設(shè)置字符串結(jié)束標志,需要注意的是串結(jié)束標志的位置。由于num可能為負數(shù),因此將字符串結(jié)束標志字符設(shè)置在k下標處可能出錯,保險的做法是繼續(xù)用i作為下標,使得'0'正好跟在最后一個數(shù)字字符的后面。   第27行至第30行沒有錯誤。試題三1、j+,或+j,或其

50、等價表示 2、 3、MAXP2=MAXP1 4、totalP+=dataMj,或totalP+=totalP+ dataMj,或其等價表示 5、(double)MAXP1/totalP,或(float)MAXP1/totalP,或其等價表示其中,將(double)或(float)寫在totaIP之前亦可解析 本題考查C程序設(shè)計基本能力。   題目中涉及的知識點主要有數(shù)組、文件、循環(huán)和類型轉(zhuǎn)換,分析程序時首先要明確各個變量(或數(shù)組元素)所起的作用,并以語句組分析各段代碼的功能,從而完成空缺處的代碼填充。   根據(jù)題目描述,首先將文件中的數(shù)據(jù)讀入數(shù)組data

51、。顯然,i和j分別起行號、列號的作用。行號i應(yīng)在一行的數(shù)據(jù)都讀入后增加1,而列號j則每讀入一個數(shù)據(jù)就要增加1,因此空(1)處應(yīng)填寫“j+”或其等價形式的語句。   將數(shù)據(jù)讀入數(shù)組data后,以題中的數(shù)據(jù)為例,data數(shù)組的內(nèi)容可表示如下:data00=1data01=192data02=48data03=206data04=37data10=2data11=147data12=90data13=312data14=21data20=3data21=186data22=12data23=121data24=38data30=4data31=114data32=21data33

52、=408data34=39data40=5data41=267data42=13data43=382data44=29data50=?data51=?data52=?data53=?data54=?   由于dataMi存放i號競選者的得票總數(shù),data0存放的是選區(qū)編號,因此dataM0不用。   以上表為例,需要將data01、data11、.、dataM-11加起來存入dataM1,因此,空(2)處應(yīng)填入0,以設(shè)置dataM1、dataM 2、.dataMN的初始值。   空(3)所在的語句組用于找出得票數(shù)最多的競選者,此時,因

53、此之前的最多票數(shù)( MAXP1)將成為次多數(shù)(MAXP2),即空(3)處填入“MAXP2=MAXP1”。   空(4)處為計算總票數(shù)的語句,根據(jù)說明,應(yīng)填入“totalP+=dataMj”或其等價形式。   空(5)處為計算票數(shù)最多者得票率的表達式,根據(jù)說明是將MAXP1除以totalP,需要注意的是:MAXP1和totalP都是整數(shù)且MAXP1小于totalP,因此應(yīng)至少對其中的一個數(shù)值進行整數(shù)到實數(shù)的類型轉(zhuǎn)換,否則其結(jié)果為0,因此,空(5)處應(yīng)填入“(double)MAXP1/totalP”或其等價形式。試題三1、 2、m-1 3、p=p-next

54、4、p-next-No 5、p-next解析 本題考查C程序設(shè)計基本能力及指針的應(yīng)用。   題目中涉及的考點主要有鏈表運算和程序邏輯,分析程序時首先要明確各個變量所起的作用,并按照語句組分析各段代碼的功能,從而完成空缺處的代碼填充。   根據(jù)函數(shù)Joseph的處理思路,“m=m%i”可避免計數(shù)過程重復(fù)(通俗來說,就是計數(shù)時繞著圈地數(shù)),需要考慮的特殊情況是m可能取值為0,此時對應(yīng)的情況應(yīng)該是正好要數(shù)到目前所在位置的前一個人,由于鏈表指針的單向特點,還需逐個結(jié)點數(shù)過去才行,即當圈中還剩下i個人時,最多計數(shù)到i,因此空(1)處應(yīng)填入“i”。  &#

55、160;下面的語句組在單循環(huán)鏈表中掃描結(jié)點并完成計數(shù)。   由于計數(shù)器k從0開始計數(shù),因此,while語句的循環(huán)條件應(yīng)為“km-1”,因此,空(2)處應(yīng)填入“m-1”。由于在鏈表中通過指針p指向結(jié)點并進行遍歷,所以空(3)處應(yīng)填入“p=p-next”。   根據(jù)題目中函數(shù)Joseph的處理思路說明,當k的值等于m-1時,p指向出圈者對應(yīng)結(jié)點的前驅(qū)結(jié)點,因此,p-next所指向的結(jié)點是要被刪除的結(jié)點,其編號為p-next-No,因此空(4)處應(yīng)填入“p-next-No”。   刪除p所指結(jié)點的后繼結(jié)點的處理如下圖所示,即要刪除數(shù)據(jù)域為y

56、的結(jié)點,需要將p所指結(jié)點的指針域指向z結(jié)點,對應(yīng)的處理是:p-next=p-next-next,由于已經(jīng)使得q指向了y結(jié)點,從而有等同的處理:p-next=q-next因此空(5)處應(yīng)填入“p-next”。   試題五1、: public ComputerAsset 2、: public ComputerAsset, public PowerSwitchable 3、PowerSwitchable* 4、numltems+ 5、new解析 本題考查面向?qū)ο蟪绦蛟O(shè)計及其C+語言實現(xiàn)的能力,涉及類和抽象類、對象、函數(shù)和虛函數(shù)的定義和相關(guān)操作以及繼承關(guān)系。要求考生根據(jù)給出的案例、

57、類圖和執(zhí)行過程說明,認真閱讀理清程序思路,然后完成題目。   先考查針對案例的特定需求,構(gòu)建類圖整體結(jié)構(gòu)。本題中根據(jù)類圖定義了以下類:BuildingManagement、  Asset、  ComputerAsset、  BuildingAsset、  ComputerCPU、ComputerMoniter、BuildingLight、RoomLights、EmergencyLight和PowerSwitchable。其中,Asset為抽象類,表示通用資產(chǎn),作為所有資產(chǎn)類的基類;ComputerAsset表示計算機有關(guān)資產(chǎn)、Buil

58、dingAsset表示建筑物有關(guān)資產(chǎn),兩者作為Asset的子類,繼承了Asset類;ComputerCPU、ComputerMoniter分別表示計算機CPU和顯示器,繼承了ComputerAsset。BuildingLight是一種建筑物資產(chǎn),表示建筑物內(nèi)的照明設(shè)備,繼承了BuildingAsset,而照明設(shè)備有RoomLights和EmergencyLight,作為BuildingLight的子類。由于案例中兩大類耗電資產(chǎn)(Asset):計算機(ComputerAsset)和建筑物(Building Asset),可在夜間關(guān)閉的房燈(RoomLights)、計算機顯示器(ComputerM

59、oruter)屬于不同的資產(chǎn)類型,所以將可關(guān)閉的資產(chǎn)設(shè)計為抽象基類PowerSwitchable,規(guī)定可在夜間關(guān)閉電源的物體的開關(guān)電源接口,即包含兩個純虛擬(virtual)函數(shù)。因此,RoomLights和ComputerMoniter繼承了PowerSwitchable。   C+中有不同種類的繼承方式,本題目中,ComputerCPU是ComputerAsset的子類,并且在子類的構(gòu)造函數(shù)中,調(diào)用父類的構(gòu)造函數(shù),所以繼承的權(quán)限為public。其語法為:public后加父類名。ComputerMonitor是ComputerAsset的子類,而且均是可關(guān)閉的,具有開關(guān)電

60、源的相同接口,均繼承了PowerSwitchable,并且在子類的構(gòu)造函數(shù)中,調(diào)用父類的構(gòu)造函數(shù),所以繼承的權(quán)限均為public,多個父類的繼承語法是:public父類名1,public父類名2。   系統(tǒng)中有各類資產(chǎn),在BuildingManagement中使用Asset通用資產(chǎn)類型數(shù)組,用add函數(shù)依次為建筑添加資產(chǎn)。由于add函數(shù)中對數(shù)組添加元素只有一條語句,需要在下標中完成指明當前添加資產(chǎn)元素的下標,并將下標后移。在goodNight函數(shù)中對可關(guān)閉的資產(chǎn)進行控制,需要判定其是否可關(guān)閉,也就是資產(chǎn)是否為PowerSwitchable類的子類。通過動態(tài)類型轉(zhuǎn)換進行判定,

61、如果資產(chǎn)類型是PowerSwitchable的子類,則轉(zhuǎn)換后的類型調(diào)用相應(yīng)接口,并綁定到具體對象,執(zhí)行對象的關(guān)閉電源行為。   類BuildingManagement中沒有定義構(gòu)造函數(shù),編譯器會生成一個缺省的構(gòu)造函數(shù),采用new關(guān)鍵字進行對象創(chuàng)建。使用完成之后,通過delete進行釋放。   因此空(1)需要表現(xiàn)出公有繼承:public ComputerAsset;空(2)處添加繼承兩個父類,并且權(quán)限均為public,即:public ComputerAsset,public PowerSwitchable;空(3)處動態(tài)類型轉(zhuǎn)換為抽象類,即PowerSwitchable*;空(4)處完

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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

提交評論