軟件水平考試(中級)軟件設(shè)計師下午(應(yīng)用技術(shù))試題模擬試卷4(共159題)_第1頁
軟件水平考試(中級)軟件設(shè)計師下午(應(yīng)用技術(shù))試題模擬試卷4(共159題)_第2頁
軟件水平考試(中級)軟件設(shè)計師下午(應(yīng)用技術(shù))試題模擬試卷4(共159題)_第3頁
軟件水平考試(中級)軟件設(shè)計師下午(應(yīng)用技術(shù))試題模擬試卷4(共159題)_第4頁
軟件水平考試(中級)軟件設(shè)計師下午(應(yīng)用技術(shù))試題模擬試卷4(共159題)_第5頁
已閱讀5頁,還剩93頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

軟件水平考試(中級)軟件設(shè)計師下午(應(yīng)用技術(shù))試題模擬試卷4(共9套)(共159題)軟件水平考試(中級)軟件設(shè)計師下午(應(yīng)用技術(shù))試題模擬試卷第1套一、必答題(本題共10題,每題1.0分,共10分。)閱讀以下說明和流程圖(如圖1所示),回答問題1至問題4。【說明】本流程圖是將中綴表示的算術(shù)表達(dá)式轉(zhuǎn)換成后綴表示。如中綴表達(dá)式(A-(B*C+D)*E)/(F+G))的后綴表示為ABC*D+E*-FG+/為了方便,假定變量名為單個英文字母,運(yùn)算符只有+、-、*、/(均為雙目運(yùn)算符,左結(jié)合),并假定所提供的算術(shù)表達(dá)是非空且語法是正確的。另外,中綴表示形式中無空格符,但整個算術(shù)表達(dá)式以空格符結(jié)束。流程圖中使用的符號的意義如下:數(shù)組IN[]存儲中綴表達(dá)式;數(shù)組POLISH[]存儲其后綴表達(dá)式;數(shù)組S[]是一個后進(jìn)先出棧;函數(shù)PRIOR(CHAR)返回符號CHAR的優(yōu)先級,各符號的優(yōu)先級見表2:1、填充流程圖中①的判斷條件。標(biāo)準(zhǔn)答案:PRIOR(IN[i]):PRIOR(S[p])知識點(diǎn)解析:暫無解析2、寫出子程序A的功能,并順序?qū)懗鰧?shí)現(xiàn)該功能的操作標(biāo)準(zhǔn)答案:功能:將當(dāng)前符號IN[i]入棧操作:p+1->pIN[i]->S[p]知識點(diǎn)解析:暫無解析3、寫出子程序B的功能,并順序?qū)懗鰧?shí)現(xiàn)該功能的操作。標(biāo)準(zhǔn)答案:功能:出棧操作:k+1->kS[p]->POLISH[k]p-1->p知識點(diǎn)解析:暫無解析4、中綴表達(dá)式(A+B-C*D)*(E-F)/G經(jīng)該流程圖處理后的輸出是什么?[*]標(biāo)準(zhǔn)答案:AB+CD*-EF-*G/知識點(diǎn)解析:本題考查棧的使用和中序表達(dá)式與后綴表達(dá)式的互換。閱讀下列程序和控制流圖,將應(yīng)填入(n)的字句?!境绦颉肯旅媸且欢吻笞畲笾档某绦颍渲衐atalist是數(shù)據(jù)表,n是datalist的長度。intGetMax(intn,intdatalist[]){intk=0;for(intj=1;j<n;j++)if(datalist[j]>datalist[k])k=j;returnk;}5、該程序的控制流圖中A~E分別是什么?標(biāo)準(zhǔn)答案:(1)j<n(2)returnk;(3)datalist[j]>datalist[k](4)k=j;(5)j++;知識點(diǎn)解析:暫無解析6、計算控制流圖的McCabe環(huán)路復(fù)雜性。標(biāo)準(zhǔn)答案:McCabe環(huán)路復(fù)雜性為3。知識點(diǎn)解析:暫無解析7、用基本路徑覆蓋法給出測試路徑。標(biāo)準(zhǔn)答案:測試路徑:Pathl:①→③Path2:①→②→④→⑥→…Path3:①→②→⑤→⑥→…知識點(diǎn)解析:暫無解析8、為各測試路徑設(shè)計測試用例。標(biāo)準(zhǔn)答案:測試用例:Pathl:取n=1,datalist[0]=1,預(yù)期結(jié)果:k=0Path2:?。簄=2,datalist[0]=1,datalist[1=0,預(yù)期結(jié)果:k=0Path3:取n=2,datalist[0]=0,datalist[1]=1,預(yù)期結(jié)果:k=1知識點(diǎn)解析:本題考查對軟件測試概念和過程的理解,結(jié)合具體實(shí)例運(yùn)用各種測試技術(shù),學(xué)會測試用例設(shè)計、軟件測試與程序調(diào)試的方法。軟件測試是為了發(fā)現(xiàn)錯誤而執(zhí)行程序的過程,其目的在于以最少的時間和人力系統(tǒng)地找出軟件中潛在的各種錯誤和缺陷。根據(jù)2004新大綱和最近兩次軟件設(shè)計師考試的真題,不難發(fā)現(xiàn)各類系統(tǒng)分析理論的實(shí)例化考核比例逐漸升溫,只要讀者平時對這部分知識的實(shí)例多分析、多思考,這部分分?jǐn)?shù)其實(shí)不難拿到。9、閱讀下列程序說明和C代碼,將應(yīng)填入(n)處。請補(bǔ)充函數(shù)fun(),該函數(shù)的功能是:只保留字符串中的大寫字母,刪除其他字符,結(jié)果仍保存在原來的字符串中,由全局變量m對刪除后字符串的長度進(jìn)行保存。注意:部分源程序給出如下。請勿改動主函數(shù)main和其他函數(shù)中的任何內(nèi)容,僅在函數(shù)fun()的橫線上填入所編寫的若干表達(dá)式或語句。試題程序:#include<stdio.h>#include<conio.h>intm;voidfun(char*s){inti=0,j=0;char*p=s;while(*(p+i)){if(*(p+i)>=’A’&&*(p+i)<=’Z’){(1);}(2);}s[j]=’\0’;(3);}main(){charstr[80];clrscr();printf("\nEnterastring:");gets(str);printf("\n\nThestringis:\%s\n",str);fun(str);printf("\n\nThestringofchangingis:\%s\n",str);printf("\n\nThelengthofchangedstrtngis:\%d\n",m);}標(biāo)準(zhǔn)答案:(1)s[j++]=*(p+i)(2)i++(3)m=j知識點(diǎn)解析:填空1:將大寫字母存于原字符串中,數(shù)組下標(biāo)j自加1,為下一次存放做準(zhǔn)備。填空2:為了判斷字符串中的下一個字符是否為大寫字母,變量i自加1。填空3:最后將大寫字母的個數(shù),即刪除后字符串的長度賦給全局變量m。10、閱讀下列程序說明和C++代碼,將應(yīng)填入(n)處。【說明】“背包問題”的基本描述是:有一個背包,能盛放的物品總重量為S,設(shè)有N件物品,其重量分別為w1;w2,……,wn,希望從N件物品中選擇若干件物品,所選物品的重量之和恰能放入該背包,即所選物品的重量之和等于S。如下程序均能求得“背包問題”的一組解,其中程序4.1是“背包問題”的遞歸解法,而程序4.2是“背包問題”的非遞歸解法?!境绦?.1】#include<stdio.h>#defineN7#defineS15intw[N+1]={0,1,4,3,4,5,2,7};intknap(ints,intn){if(s==0)return1;if(s<0||(s>0&&n<1))return0;if((1)))|printf("%4d",w[n]);return1;}return(2);}main(){if(knap(S,N))printf("OK!\n");elseprintf("NO!\n");}【程序4.2】#include<stdio.h>#defineN7#defineS15typedefstruct{ints;intn:intjob;}KNAPTP;intw[N+1]={0,1,4,3,4,5,2,7};intknap(ints,intn);main(){if(knap(S,N))printf("OK!\n");elseprintf("NO!\n");}intknap(ints,intn){KNAPTPstack[100],x;inttop,k,rep;x.s=s;x.n=n;x.job=0;top=|;Stack[top]=x;k=0;while((3)){x=Stack[top];rep=1;while(!k&&rep){if(x.s==0)k=1;/*已求得一組解*/elseif(x.s<0||x.n<=0)rep=0;else{x.s=(4);x.job=1;(5)=x;}}if(!k){rep=1;while(top>=1&&rep){x=stack[top--];if(x.job==1){x.s+=W[x.n+1];x.job=2;Stack[++top]=x;(6);}}}}if(k){/*輸出一組解*/while(top>=1){x=staCk[top--];if(x.job==1)printf("%d\t",w[x.n+1]);}}returnk;}標(biāo)準(zhǔn)答案:(1)knap(s-w[n],n-1)(2)knap(s,n-1)(3)top>=1&&!k或top>0&&k==0(4)x.s-w[x.n--](5)stack[++top](6)rep=0知識點(diǎn)解析:試題提供了兩種解決問題的方法,程序5.1是用遞歸的方法來解決背包問題,程序5.2使用非遞歸的方法來解決背包問題。每次選擇一個物品放入背包,那么剩余的物品和背包剩余的重量,又構(gòu)成一個“背包問題”。程序從數(shù)組下標(biāo)最大的物品開始考查,因此(1)處應(yīng)該填“knap(s-w[n],n-1)”,即將數(shù)組中第N個物品放入背包,如果它能夠放入到背包中,則該物品是構(gòu)成解的元素之一;否則,將該物品從背包中取出,該物品不構(gòu)成解的元素,在以后的考查中,它可以被排除,因此(2)處應(yīng)該填“knap(s,n-1)”。在改程序中用棧來保存已經(jīng)考查過的物品,結(jié)構(gòu)KNAPTP表示經(jīng)過考查的物品,s表示考查過該物品后背包所能夠盛放的物品的重量;n表示該物品在數(shù)組W中的下標(biāo);job表示物品當(dāng)前的狀態(tài):當(dāng)job等于1,表示物品n可以放入背包;job等于2表示物品n不能被放入到背包,那么在以后的選取中將不再考慮該物品。初始時job等于0,表示背包中沒有任何放入任何物品。K為有解的標(biāo)志。Rep為一個標(biāo)志變量,rep等于0,表示結(jié)束當(dāng)前的動作;rep等于1表示繼續(xù)進(jìn)行當(dāng)前的動作。當(dāng)棧頂物品不能放入背包時,將rep設(shè)置為0,表示下一步不從數(shù)組w中取物品。其初值為1。開始時,將數(shù)組中下標(biāo)最大的物品放入棧中,然后開始考查該物品。該物品滿足放入背包的條件,第(4)(5)空將完成將物品放入背包的操作,因此(4)空填“x.s-w[x.n--]”,修改背包的可容納物品的重量;(5)處填"stack[++top]",將下一個要考查的物品放入棧中。若該物品不滿足放入背包的條件,則將該物品從背包中取出,因此將rep置為0,結(jié)束循環(huán)while(!k&&rep)。將物品從背包中取出,即釋放該物品在背包中所占的重量,并標(biāo)記為不能放入到背包(job=2),再將其放入到棧中;然后繼續(xù)考查數(shù)組w中的下一個物品,因此需要結(jié)束循環(huán)while(top>=1&&rep),將rep置為0,所以第(6)處應(yīng)該填“rep=0”。在第三處要求給出循環(huán)結(jié)束的條件,即可以繼續(xù)選取物品的條件,在此處填“top>=1&&!k”。二、選答題(本題共3題,每題1.0分,共3分。)11、閱讀以下說明和C++代碼,將應(yīng)填入(n)處的字句寫在對應(yīng)欄內(nèi)。[說明]下面代碼實(shí)現(xiàn)classC對classA和B的protected成員和public成員的調(diào)用。仔細(xì)閱讀[代碼5-1]、[代碼5-2],在(n)處寫出正確的運(yùn)行結(jié)果。[代碼5-1]#include<iostream.h>classA{private:inta1;protected:inta2;public:A(intv1,intv2,intv3):a1(v1),a2(v2),a3(v3){}inta3};classB:pubiicA{private:intb1;protected:intb2;public:B(intv1,intv2,intv3,intv4,intv5,intv6):A(v1,v2,v3),b1(v4),b2(v5),b3(v6){}intb3;};classC:publicB{private:intc1;protected:intc2;public:intc3;C(intv1,intv2,intv3,intv4,intv5,intv6,intv7,intv8,intv9):B(v1,v2,v3,v4,v5,v6),c1(v7),c2(v8),c3v9voiddisp(){cout<<"a2inclassC="<<a2<<endl;cout<<"a3inclassC="<<a3<<eudl;cout<<"b2inclassC="<<b2<<endl;tout<<"b3inclassC="<<b3<<endl;}};[代碼5-2]voidmain(){Cdemo(10,20,30,40,50,60,70,80,90);cout<<"對象demo.a3="<<demo.a3<cout<<"對象demo.b3="<<demo.b3<cout<<"對象demo.c3="<<demo.c3<demo.disp();}[運(yùn)行結(jié)果]對象demo.a3=(1)對象demo.b3=(2)對象demo.c3=(3)a2inclassC=(4)a3inclassC=(5)b2inclassC=(6)b2inclassC=(7)標(biāo)準(zhǔn)答案:(1)30(2)60(3)90(4)20(5)30(6)50(7)60知識點(diǎn)解析:本題代碼定義了classC、classA和classB。其印classB繼承了classA,classC又繼承了classB,classC對classA和B的protected成員和public成員的調(diào)用。明白了這個關(guān)系就不難解題了。12、閱讀以下說明和JAVA2代碼,將應(yīng)填入(n)處的字句寫在對應(yīng)欄內(nèi)。[說明]以下程序?qū)崿F(xiàn)了在applet里移動圖形文件,仔細(xì)閱讀代碼和相關(guān)注釋,將程序補(bǔ)充完整。[代碼6-1]importjava.awt.*;importjava.awt.event.*;importjava.applet.Applet;publicclassAppCIUextendsAppletimplementsMouseMotionListener,MouseListener{ImageIMGonClick=over(this)title=放大;//聲明Image類類型的變量IMGonClick=over(this)title=放大intx=70,y=60,posX=70,posY=60,dx,dy;publicvoidinit(){IMGonClick=over(this)title=放大=getImage(getCodeBase(),"mouse.gif");//載入影像addMouseListener(this);addMouseMotionListener(this);}publicvoidmousePressed(MouseEvente){dx=e.getX()-posX;//取得按下之點(diǎn)與基準(zhǔn)點(diǎn)X方向的距離dy=e.getY()-posY;//取得按下之點(diǎn)與基準(zhǔn)點(diǎn)Y方向的距離}publicvoidmouseDragged(MouseEvente){(1)(2)if(dx>0&&dx<120&&dy>0&&dy<60)//如果指針落在圖形上方{Graphicsg=getGraphics();(3)}}publicvoidpaint(Graphicsg){(4)(5)(6)}publicvoidmouseMoved(MouseEvente){};publicvoidmouseReleased(MouseEvente){};publicvoidmouseEntered(MouseEvente){};publicvoidmouseExited(MouseEvente){};publicvoidmouseClicked(MouseEvente){};}標(biāo)準(zhǔn)答案:(1)x=e.getX()-dx;(2)y=e.getY()-dy;(3)update(g);(4)g.drawImage(IMGonClick=over(this)title=放大x,y,120,60,this);(5)posX=x;(6)posY=y;注:其中(1)和(2)可互換。(5)和(6)可互換。知識點(diǎn)解析:本題程序?qū)崿F(xiàn)了在applet里移動圖形文件。對于(1)為取得拖曳時基準(zhǔn)點(diǎn)的X坐標(biāo)[x=e.getX()-dx];(2)取得拖曳時基準(zhǔn)點(diǎn)的Y坐標(biāo)[y=e.getY()-dy];(3)清空畫面為背景顏色,再調(diào)用paint()[update(g)];(4)將IMGonClick=over(this)title=放大畫在applet上[g.drawImage(IMGonClick=over(this)title=放大,x,y,120,60,this);];(5)更新基準(zhǔn)點(diǎn)的X坐標(biāo)[posX=x;];(6)更新基準(zhǔn)點(diǎn)的Y坐標(biāo)[posY=y;]。13、閱讀以下說明和VisualBasic代碼,將應(yīng)填入(n)處的字名寫在對應(yīng)欄內(nèi)。[說明]以下代碼實(shí)現(xiàn)了當(dāng)用戶推出界面時,判斷TextEdit中的文字是否發(fā)生改變,彈出對話框判斷,讓用戶選擇選擇是否保存文件或取消退出界面操作。閱讀下面代碼,補(bǔ)充完整。[代碼7-1]BeginVB.FormForml//...窗體描述(略)BeginVB.TextBoxTextEditHeight=1830Left=180TabIndex=0Text="TextEdit"Top=360Width=3885End//...窗體描述(略)End[代碼7-2]DimtxtchangeAsBooleanDimmyvalAsStringPrivateSubFormLoad()TextEdit.Text="CIU,中國軟考聯(lián)盟!txtchange=FalseEndSub[代碼7-3]PrivateSubTextEdit_Change()StaticnotchangeAsBoolean(1)(2)EndSubPrivateSubForm_Unload(CancelAsInteger)DimmyvalAsStringIf(3)Thenmyval=MsgBox("保存文件的更改嗎?",vbYesNoCancel,"提示信息")If(4)ThenMsgBox"保存成功"EndEndIfIf(5)ThenEndIf(6)ThenCancel=1EndIfEndSub標(biāo)準(zhǔn)答案:(1)txtchange=notchange(2)notchange=True(3)txtchange=True(4)myval=vbYes(5)myval=vbNo(6)myval=vbCancel知識點(diǎn)解析:本題代碼實(shí)現(xiàn)了當(dāng)用戶退出界面時,判斷TextEdit中的文字是否發(fā)生改變,彈出對話框判斷,讓用戶選擇是否保存文件或取消退出界面操作。(1)、(2)完成了狀態(tài)初始化。(3)文字發(fā)生了改動,txtchange=True,向用戶發(fā)出提示信息,彈出對話框。(4)、(5)、(6)根據(jù)對話框的返回值做出相應(yīng)的反應(yīng)。軟件水平考試(中級)軟件設(shè)計師下午(應(yīng)用技術(shù))試題模擬試卷第2套一、必答題(本題共4題,每題1.0分,共4分。)1、閱讀下列說明和數(shù)據(jù)流圖,回答問題。【說明】某網(wǎng)絡(luò)故障診斷系統(tǒng)使用故障代理(agent、SNMPTrap等)來檢測各種意外情況,如大幅丟包、路由沖突、廣播風(fēng)暴等。網(wǎng)絡(luò)管理員可以在安裝該系統(tǒng)時配置安全監(jiān)控程序(如故障代理程序、實(shí)時診斷程序、報警器等),也可以在系統(tǒng)運(yùn)行時修改配置,通過網(wǎng)絡(luò)狀態(tài)采集器和故障特征數(shù)據(jù)庫,并通過控制面板上的鍵盤與系統(tǒng)進(jìn)行信息交互。在安裝過程中,系統(tǒng)給每個故障代理賦予一個編號(即ID)和類型,并設(shè)置管理員密碼以啟動和關(guān)閉系統(tǒng),設(shè)置故障代理事件發(fā)生時應(yīng)自動撥出的電話號碼。當(dāng)系統(tǒng)檢測到一個故障代理事件時,就激活警報,撥出預(yù)置的電話號碼,并報告位置和檢測到的事件的性質(zhì)等信息。該網(wǎng)絡(luò)故障診斷系統(tǒng)的頂層圖如圖13-16所示,0層圖如圖13-17所示,加工4的子圖如圖13-18所示?!締栴}1】將頂層圖中的(1)和(2)空填充完整?!締栴}2】0層圖中的數(shù)據(jù)文件“配置信息”是多余的嗎?若是,請說明理由;若不是,請指出它會影響。層圖中的哪些(哪個)加工(除加工“1系統(tǒng)配置”之外)?【問題3】指出圖13-18所示的加工4的子圖中遺漏的數(shù)據(jù)流。注意:書寫格式為“缺少從××到××的數(shù)據(jù)流××”或“××缺少輸入(出)數(shù)據(jù)流××”。若未按格式書寫,將被扣分。標(biāo)準(zhǔn)答案:[問題1](1)報警器(2)控制面板[問題2]數(shù)據(jù)文件“配置信息”是必需的。會影響加工“3密碼處理”和加工“4監(jiān)控代理”。[問題3]“4.5產(chǎn)生報警信號”缺少輸出數(shù)據(jù)流“報警類型”?!?.4讀代理”缺少輸入數(shù)據(jù)流“代理狀態(tài)”?!?.1顯示格式”缺少輸出數(shù)據(jù)流“代理數(shù)據(jù)”。知識點(diǎn)解析:問題1比較簡單。題目說明中提到“網(wǎng)絡(luò)管理員可以在安裝該系統(tǒng)時配置安全監(jiān)控程序(如故障代理程序、實(shí)時診斷程序、報警器等)”,其中提到的“報警器”在頂層圖中并未出現(xiàn),又因為有數(shù)據(jù)流“報警類型”流向(1)所表示的實(shí)體,所以,第(1)空應(yīng)填“報警器”。題目說明中提到“…并通過控制面板上的鍵盤與系統(tǒng)進(jìn)行信息交互”,又從(2)所代表的實(shí)體輸出數(shù)據(jù)流“用戶密碼”、輸入數(shù)據(jù)流“顯示信息”易知,(2)表示實(shí)體“控制面板”。做這種題的關(guān)鍵就是抓住題目說明中提供的信息。問題2稍有難度。題目給出的0層圖顯然是不完整的,因為在加工“4監(jiān)控代理”的子圖中出現(xiàn)了文件“配置信息”,而0層圖中加工“4監(jiān)控代理”跟文件“配置信息”沒有任何聯(lián)系,這顯然表明0層圖遺漏了數(shù)據(jù)流。可見,至少有“1系統(tǒng)配置”和“4監(jiān)控代理”兩個加工用到文件“配置信息”,所以它不可能是某個加工的局部文件,因此它是必需的。在0層圖中,加工“3密碼處理”用于檢驗密碼,要驗證用戶密碼就得將用戶輸入的密碼跟保存在某文件中的管理員密碼進(jìn)行對比驗證。注意到,用戶配置請求經(jīng)過“1系統(tǒng)配置”加工之后寫入到文件“配置信息”,可見,用戶的相關(guān)信息也保存到了該文件中,該文件記錄了配置請求及相應(yīng)的請求人。所以“3密碼處理”一定要用到“配置信息”文件。在驗證密碼時,若密碼正確,則將管理員信息、驗證成功的信息發(fā)送給加工“5顯示信息和狀態(tài)”以顯示相關(guān)信息;若密碼錯誤,則將驗證失敗的信息發(fā)送給加工“5顯示信息和狀態(tài)”提示密碼錯誤,并要求重新輸入。問題3是考察數(shù)據(jù)流圖的相關(guān)注意事項。關(guān)于數(shù)據(jù)流圖,必須注意如下幾條原則:(1)數(shù)據(jù)流圖上的所有符號只限于加工、數(shù)據(jù)流、數(shù)據(jù)存儲和外部實(shí)體這四種基本元素的符號,不得出現(xiàn)其它符號。(2)頂層圖必須包括前述四種基本元素,缺一不可,而且外部實(shí)體之間不能有數(shù)據(jù)流(根據(jù)上述外部實(shí)體的定義可知)。頂層圖中只能有一個加工(即被開發(fā)系統(tǒng)),不能有其它加工。(3)每個加工都必須至少有一個輸入數(shù)據(jù)流和一個輸出數(shù)據(jù)流。一個加工的輸出數(shù)據(jù)流不能與其輸入數(shù)據(jù)流同名,即便它們的組成相同。而且一個加工的輸出數(shù)據(jù)流中的數(shù)據(jù)必須能從輸入數(shù)據(jù)流中直接獲得或從該加工能產(chǎn)生的數(shù)據(jù)中獲得。(4)父圖和子圖必須保持平衡。(5)圖中每個元素必須有名字,但加工和數(shù)據(jù)存儲之間的數(shù)據(jù)流可有名也可無名。(6)數(shù)據(jù)流圖中不能夾帶控制流,因為數(shù)據(jù)流圖是實(shí)際業(yè)務(wù)流程的客觀反映,只說明系統(tǒng)“做什么”而不表明系統(tǒng)應(yīng)“如何做”,因此不是系統(tǒng)的執(zhí)行序列或程序流程圖。(7)在自頂向下的分解過程中,若一個數(shù)據(jù)存儲首次出現(xiàn)時只與一個加工有關(guān),那么這個數(shù)據(jù)存儲應(yīng)作為該加工的內(nèi)部文件(局部文件)而不必畫出。(8)在整套數(shù)據(jù)流圖中,每個數(shù)據(jù)存儲必須既有讀的數(shù)據(jù)流又有寫的數(shù)據(jù)流,但在某一張子圖中,可以只有寫數(shù)據(jù)流或者讀數(shù)據(jù)流。在整套數(shù)據(jù)流圖中,每條數(shù)據(jù)流必須既有出發(fā)地又有目的地。(9)任何一條數(shù)據(jù)流必須與加工相關(guān),不允許數(shù)據(jù)流兩端連接的都不是加工,即要求其至少有一端是加工。解答問題3的關(guān)鍵就是父圖、子圖數(shù)據(jù)平衡原則。子圖是其父圖中某一部分內(nèi)部的細(xì)節(jié)圖。它們的輸入、輸出數(shù)據(jù)流應(yīng)該保持一致。在上一級圖中有幾個數(shù)據(jù)流,它的子圖也一定有同樣的數(shù)據(jù)流,而且它們的方向也是一致的。在0層圖中,加工“4監(jiān)控代理”有1條輸入數(shù)據(jù)流“代理狀態(tài)”和3條輸出數(shù)據(jù)流“電話撥號”、“代理數(shù)據(jù)”和“報警類型”,而在加工4的細(xì)化圖中,只有輸出數(shù)據(jù)流“電話撥號”,因此可以肯定缺少了“代理狀態(tài)”、“報警類型”、“代理數(shù)據(jù)”這3條數(shù)據(jù)流。加工4的結(jié)構(gòu)非常清晰,只需把這3條數(shù)據(jù)流對號入座即可——“報警類型”應(yīng)是“4.5產(chǎn)生報警信號”的輸出數(shù)據(jù)流;“代理狀態(tài)”應(yīng)是“4.1讀代理”的輸入數(shù)據(jù)流;“代理數(shù)據(jù)”應(yīng)該是經(jīng)“4.4顯示格式”的輸出數(shù)據(jù)流。2、閱讀下列說明和相關(guān)的類圖,回答問題?!菊f明】在一棟m層樓的大廈里,用電梯內(nèi)和每個樓層的按鈕來控制n部電梯的運(yùn)作。當(dāng)按下電梯內(nèi)按鈕請求電梯在指定樓層停下時,按鈕指示燈亮,當(dāng)電梯到達(dá)指定樓層時,指示燈熄滅。除了大廈的最底層和最高層之外,每層樓都有兩個按鈕分別指示電梯上行和下行,當(dāng)這兩個按鈕之一被按下時相應(yīng)的指示燈亮,當(dāng)電梯到達(dá)此樓層時燈熄滅,電梯向要求的方向移動。當(dāng)電梯無升降運(yùn)動時,關(guān)門并停止在當(dāng)前樓層。軟件設(shè)計師火云龍采用面向?qū)ο蠓治龅姆椒?,?jīng)過三次逐步求精設(shè)計之后,得到如圖13-19所示的類圖?!締栴}1】按鈕類有一個重要的屬性,請將該屬性填入圖13-19中的(a)處?!締栴}2】識別關(guān)聯(lián)的多重性是面向?qū)ο蠼V匾囊徊?,請根?jù)題目說明填空(1)~(6)?!締栴}3】軟件設(shè)計師火云龍在初步設(shè)計類時,將門(的狀態(tài))作為電梯的屬性,后經(jīng)思考,將電梯門設(shè)計成一個獨(dú)立的類,這么做的好處是什么?軟件設(shè)計師火云龍在初步設(shè)計類時,并沒有設(shè)計“請求”類,后來又加入了該類,這么做的原因是什么?標(biāo)準(zhǔn)答案:[問題1](a)指示燈[問題2](1)mn(2)mn(3)2m-2(4)2m-2(5)n(6)n[問題3]一旦將電梯門作為一個獨(dú)立的類,則打開或關(guān)閉電梯門的唯一辦法就是向“電梯門”類對象發(fā)送消息。如果電梯門類封裝得好,就能保證不會在錯誤的時間關(guān)閉或打開電梯門,從而有效杜絕嚴(yán)重意外事故的發(fā)生。出于安全考慮,在未經(jīng)授權(quán)時不能隨意修改“請求”,因此將“請求”設(shè)計成獨(dú)立的類,如果“請求”類封裝得好就能有效保證電梯安全運(yùn)行。知識點(diǎn)解析:從圖13-19可知,電梯按鈕類和樓層按鈕類都是按鈕類的子類,電梯按鈕和樓層按鈕的共同點(diǎn)就是用指示燈跟乘客進(jìn)行交互,所以,按鈕類必定有個重要的屬性“指示燈”。識別關(guān)聯(lián)的多重性是面向?qū)ο蠼V匾囊徊健n}目的說明中提到“在一棟m層樓的大廈里,用電梯內(nèi)和每個樓層的按鈕來控制n部電梯的運(yùn)作”、“除了大廈的最底層和最高層之外,每層樓都有兩個按鈕分別指示電梯上行和下行”,所以這棟大廈中一共有mn個電梯按鈕,共有2m-2個樓層按鈕,電梯控制器類控制著所有的電梯按鈕、樓層按鈕和電梯,所以第(1)~(6)空應(yīng)分別填:mn、mn、2m-2、2m-2、n、n。注意,不可以用*號代替,*號表示多個,具體多少是未知,而題目已經(jīng)給定具體數(shù)目,所以應(yīng)該用m、n來表示。識別類是面向?qū)ο蠓治龅牡谝徊?,常用的方法是名詞分析法。題目的說明其實(shí)就是電梯系統(tǒng)的需求說明,出現(xiàn)了如下主要名詞:大廈、電梯、樓層、按鈕、運(yùn)動、指示燈、請求、最底層、最高層、方向和門。這些名詞所代表的事物可作為類的初步候選者。其中,大廈、最底層、最高層和樓層處于問題范疇之外,因此不必考慮。運(yùn)動、方向、指示燈和門可作為其它類的屬性,例如,指示燈(的狀態(tài))可作為按鈕類的屬性,方向和門(的狀態(tài))可作為電梯類的屬性。經(jīng)過上述初步篩選只剩下兩個基本的候選類,即電梯類和按鈕類。在題目的說明中實(shí)際指定了兩種按鈕,因此,應(yīng)該為按鈕類定義兩個子類,即電梯按鈕和樓層按鈕。綜合上述分析結(jié)果,可得出系統(tǒng)的類圖,如圖13-50所示。這個模型是非常初步的模型,需要進(jìn)一步充實(shí)、精化和完善。分析上述模型會發(fā)現(xiàn)它存在比較明顯的不足:在實(shí)際的電梯系統(tǒng)中,按鈕并不直接與電梯通信;為了決定分派哪一部電梯去響應(yīng)一個特定的請求,必須有某種類型的電梯控制器。然而在題目說明中并未提到控制器,因此它未被列入候選類中。由此可見,名詞分析法只為尋找候選類提供了初步線索,不能指望依靠這種方法找出全部候選類。系統(tǒng)分析員必須根據(jù)領(lǐng)域知識、常識和經(jīng)驗做進(jìn)一步分析,才能找出問題域中所有的類。補(bǔ)充了電梯控制器類之后,其類圖如圖13-51所示。這個模型也并非十分完善。電梯類的主要功能應(yīng)是執(zhí)行電梯控制器發(fā)出的移動或等待命令,如果將門(的狀態(tài))作為電梯的一個屬性,則電梯還要執(zhí)行關(guān)門或開門的命令,這樣電梯類的功能就不單一了。于是將電梯門劃分出來成為一個獨(dú)立的類,一旦將其作為一個獨(dú)立的類,則打開或關(guān)閉電梯門的唯一辦法就是向“電梯門”類對象發(fā)送消息。如果電梯門類封裝得好,就能保證不會在錯誤的時間關(guān)閉或打開電梯門,從而有效杜絕嚴(yán)重意外事故的發(fā)生。同樣,出于安全考慮,在未經(jīng)授權(quán)時不能修改“請求”,因此將“請求”設(shè)計成獨(dú)立的類。經(jīng)過再次完善之后的類圖如圖13-19所示。3、閱讀以下說明和E-R圖,回答問題。【說明】某高校要設(shè)計一個教學(xué)管理數(shù)據(jù)庫系統(tǒng)。通過調(diào)查,設(shè)計者了解到學(xué)生每學(xué)期按照事先安排的課程計劃開始學(xué)習(xí)。每門課程由一名教師講授;一個教師可以講授多門課程;每名學(xué)生可以選修多門課程;學(xué)期結(jié)束后通過考試,教師登記每門課程、每名學(xué)生的成績,并得到確認(rèn)后存檔。數(shù)據(jù)庫工程師風(fēng)清揚(yáng)設(shè)計了如圖13-20所示的E-R圖。【問題1】把該E-R圖中的實(shí)體和聯(lián)系轉(zhuǎn)化為相應(yīng)的關(guān)系模式,并指出其主碼、候選碼以及外碼(若無外碼也須指出)。【問題2】現(xiàn)要查詢出所有的沒有學(xué)生選修的課程的全部信息,請寫出相應(yīng)的SQL語句。注意,要查詢出符合條件的課程的全部信息?!締栴}3】現(xiàn)要查詢出所有選修了教師號為’001’的老師所授課程的學(xué)生的學(xué)號與姓名,請寫出相應(yīng)的SQL語句。標(biāo)準(zhǔn)答案:[問題1]方案1:教師(教師號,姓名,性別,職稱,系別)主碼:教師號;候選碼:教師號;無外碼學(xué)生(學(xué)號,姓名,性別,班級)主碼:學(xué)號;候選碼:學(xué)號;無外碼課程(課程號,名稱,學(xué)時,學(xué)分,教師號)主碼:課程號;候選碼:課程號;外碼:教師號選修(學(xué)號,課程號,成績)主碼:(學(xué)號,課程號);候選碼:(學(xué)號,課程號);外碼:學(xué)號,課程號方案2:教師(教師號,姓名,性別,職稱,系別)主碼:教師號;候選碼:教師號;無外碼學(xué)生(學(xué)號,姓名,性別,班級)主碼:學(xué)號;候選碼:學(xué)號;無外碼課程(課程號,名稱,學(xué)時,學(xué)分)主碼:課程號;候選碼:課程號;無外碼講授(課程號,教師號)主碼:課程號;候選碼:課程號;外碼:教師號選修(學(xué)號,課程號,成績)主碼:(學(xué)號,課程號);候選碼:(學(xué)號,課程號);外碼:學(xué)號,課程號[問題2]SELECT*FROMCWHERENOTEXISTS(SELECTCnoFROMSCWHERESC.Cno=C.Cno)或SELECT*FROMCWHERECnoNOTIN(SELECTCnoFROMSCWHERESC.Cno=C.Cno)注:C、S、SC、Cno、Sno、Tno分別表示課程表、學(xué)生表、選修表、課程號、學(xué)號、教師號。亦可直接用漢字表示。其中的*可以用C的全部屬性來表示。[問題3]SELECTSno,SnameFROMS,C,SCWHERES.Sno=SC.SnoANDC.Cno=SC.CnoANDC.Tno=’001’或SELECTSno,SnameFROMSWHEREsnoIN(SELECTsnoFROMSCWHEREcnoIN(SELECTenoFROMCWHEREtno=’001’))注:C、S、SC、Cno、Sno、Sname、Tno分別表示課程表、學(xué)生表、選修表、課程號、學(xué)號、學(xué)生姓名、教師號。亦可直接用漢字表示。知識點(diǎn)解析:能推導(dǎo)出全部屬性而且沒有多余屬性的屬性組稱為候選碼。若候選碼多于一個,則選定其中的一個為主碼。在數(shù)據(jù)庫設(shè)計中,對于一般的關(guān)系模式用“編號”作為主碼,如在學(xué)生關(guān)系模式中用學(xué)號作為其主碼。關(guān)系模型的邏輯結(jié)構(gòu)是一組關(guān)系模式的集合。E-R圖是由實(shí)體、實(shí)體的屬性和實(shí)體之間的聯(lián)系三個要素組成的。將E-R圖中的實(shí)體、實(shí)體之間的聯(lián)系轉(zhuǎn)換為關(guān)系模式,一般遵循如下原則:一個實(shí)體型轉(zhuǎn)換為一個關(guān)系模式。實(shí)體的屬性就是關(guān)系的屬性,實(shí)體的碼就是關(guān)系的碼。對于實(shí)體的聯(lián)系,有以下幾種不同的情況:(1)一個1:1聯(lián)系可以轉(zhuǎn)換為一個獨(dú)立的關(guān)系模式,也可以與任意一端對應(yīng)的關(guān)系模式合并。如果轉(zhuǎn)換為一個獨(dú)立的關(guān)系模式,則與該聯(lián)系相連的各實(shí)體的碼以及聯(lián)系本身的屬性均轉(zhuǎn)換為關(guān)系的屬性,每個實(shí)體的碼均是該關(guān)系的候選碼。如果與某一端實(shí)體對.應(yīng)的關(guān)系模式合并,則需要在該關(guān)系模式的屬性中加入另一個關(guān)系模式的碼和聯(lián)系本身的屬性。(2)一個1:n聯(lián)系可以轉(zhuǎn)換為一個獨(dú)立的關(guān)系模式,也可以與n端對應(yīng)的關(guān)系模式合并。如果轉(zhuǎn)換為一個獨(dú)立的關(guān)系模式,則與該聯(lián)系相連的各實(shí)體的碼以及聯(lián)系體本身的屬性均轉(zhuǎn)換為關(guān)系的屬性,而關(guān)系的碼為n端實(shí)體的碼。(3)一個m:n聯(lián)系轉(zhuǎn)換為一個關(guān)系模式。與該聯(lián)系相連的各實(shí)體的碼以及聯(lián)系本身的屬性均轉(zhuǎn)換為關(guān)系的屬性,而關(guān)系的碼為各實(shí)體碼的組合。(4)三個或三個以上實(shí)體間的以上多元聯(lián)系可以轉(zhuǎn)換為一個關(guān)系模式。與該多元聯(lián)系相連的各實(shí)體的碼以及聯(lián)系本身的屬性均轉(zhuǎn)換為關(guān)系的屬性。而關(guān)系的碼為各實(shí)體碼的組合。由于教師和課程之間是1對多的關(guān)系,因此可以把講授聯(lián)系合并到課程中去。而學(xué)生與課程是多對多的關(guān)系,所以要把選修聯(lián)系獨(dú)立作為一個關(guān)系表。關(guān)系模式R中的屬性或?qū)傩越MX并非R的碼,但X是另一個關(guān)系模式的碼,則稱X是R的外部碼,也稱外碼。例如,有關(guān)系模式:S(學(xué)號,姓名,年齡,系號)、D(系號,系名,宿舍號),那么“學(xué)號”是S的主鍵,“系號”是S的外碼。該題中,選修關(guān)系模式的主碼是學(xué)號和課程號的組合,而其中的學(xué)號是學(xué)生表的主碼,卻不是選修表中的主碼,所以學(xué)號是外碼。課程號是課程表的主碼,卻不是選修表中的主碼,所以課程表也是外碼。問題2比較簡單,在SC中可以找到選修的全部課程,要想查詢沒有學(xué)生選修的課程,只要用謂詞NOTEXISTS或NOTIN進(jìn)行判斷即可。因此,實(shí)現(xiàn)該查詢的SQL語句可寫成:SELECT*FROMCWHERENOTEXISTS(SELECTCnoFROMSCWHERESC.Cno=C.Cno)或SELECT*FROMCWHERECnoNOTIN(SELECTCnoFROMSCWHERESC.Cno=C.Cno)其中C、S、SC、Cno、Sno、Tno分別表示課程表、學(xué)生表、選修表、課程號、學(xué)號、教師號。前一條SQL語句中的兩個SELECT語句的關(guān)系類似于雙層循環(huán),第1個SELECT是外層循環(huán),此SELECT每掃描一條記錄,內(nèi)層的SELECTCnoFROMSCWHERESC.Cno=C.Cno執(zhí)行一次,例如,現(xiàn)在的外層SELECT掃描到的記錄的Cno=’001’,則內(nèi)層的語句為:SELECTCnoFROMSCWHERESC.Cno=’001’,這樣實(shí)際是在SC中查找有沒有關(guān)于’001’號課程的選課記錄,如果沒有,則NOTEXISTS(…)成立,輸出記錄。問題3中的查詢涉及到學(xué)生、教師、選修三個表中的屬性,顯然要進(jìn)行連接查詢:SELECTSno,SnameFROMS,C,SCWHERES.Sno=SC.SnoANDC.CmoSC.CnoANDC.Tno=’001’這里是把三個表用WHERE關(guān)聯(lián)起來進(jìn)行查詢?;?qū)懗扇龑忧短椎男问剑篠ELECTSno,ShameFROMSWHEREsnoIN(SELECTsnoFROMSCWHEREenoIN(SELECTcnoFROMCWHEREtno=,001,))首先最內(nèi)層的(SELECTcnoFROMCWHEREtno=’001’)找出’001’號教師所授課程的課程號,再在SC中根據(jù)課程號找出選了這些課程的學(xué)生學(xué)號,最后根據(jù)學(xué)號在S中查找出學(xué)生的學(xué)號和姓名。4、閱讀以下說明,回答問題1、問題2和問題3?!菊f明】某單位正在使用一套C/S模式的應(yīng)用軟件系統(tǒng),現(xiàn)在需要升級為B/S應(yīng)用模式,但需要保持業(yè)務(wù)的連續(xù)性。開發(fā)人員提出用WebService作為中間層的接口進(jìn)行開發(fā)?!締栴}1】請用120字以內(nèi)文字,從業(yè)務(wù)的繼承性、升級成本(時間、工作量)和擴(kuò)展性三個方面簡要說明開發(fā)人員所提方案的優(yōu)點(diǎn)?!締栴}2】WebService的三個基本技術(shù)是WSDL、SOAP、UDDI,它們都是以XML為基礎(chǔ)定義的。請用120字以內(nèi)文字,簡要說明WSDL、SOAP和UDDI的作用?!締栴}3】服務(wù)注冊中心、服務(wù)提供者和服務(wù)請求者之間的交互和操作構(gòu)成了WebService的體系結(jié)構(gòu),如圖13-21所示。請用180字以內(nèi)文字,說明這三者的主要功能及其交互過程。標(biāo)準(zhǔn)答案:[問題1]由于WebService具有支持軟件和數(shù)據(jù)重用、集成方便、支持對別人的服務(wù)拿來就用等特性,升級開發(fā)人員不必重新設(shè)計業(yè)務(wù)流程,只需將WebService作為中間層的接口進(jìn)行開發(fā)即可,從而較好地保持了業(yè)務(wù)的連續(xù)性,也大大減少了工作量并減低了升級成本,也不必修改原來的Web服務(wù)及中間層,易于擴(kuò)展且擴(kuò)展空間也較大。[問題2]SOAP提供了標(biāo)準(zhǔn)的RPC方法來調(diào)用WebService協(xié)議,定義了服務(wù)請求者和服務(wù)提供者之間的消息傳輸規(guī)范。WSDL為服務(wù)提供者提供了用XML格式描述WebService的標(biāo)準(zhǔn)格式。UDDI提供了一種機(jī)制讓W(xué)eb服務(wù)提供商發(fā)布他們的產(chǎn)品,并最終讓他們的客戶能定位他們所提供的Web服務(wù)。[問題3]服務(wù)提供者使用WSDL來定義抽象的服務(wù)描述,然后把具體的服務(wù)發(fā)布到服務(wù)注冊中心;服務(wù)請求者使用查找(Find)操作從服務(wù)注冊中心檢索服務(wù)描述,然后使用服務(wù)描述與服務(wù)提供者進(jìn)行綁定(Bind),并調(diào)用WebService實(shí)現(xiàn)訪問。服務(wù)注冊中心是連接服務(wù)提供者和服務(wù)請求者的橋梁與紐帶。知識點(diǎn)解析:WebService是一套標(biāo)準(zhǔn),它定義了應(yīng)用程序如何在Web上實(shí)現(xiàn)互操作性,支持用不同的語言(如VB、Java等)在不同的平臺上(如Windows、UNIX、Linux等)編寫WebService,而后通過WebService的標(biāo)準(zhǔn)對外發(fā)布服務(wù),其他用戶或應(yīng)用也通過WebService的標(biāo)準(zhǔn)來對這些服務(wù)進(jìn)行查詢和后續(xù)的訪問調(diào)用。WebService由SOAP(簡單對象訪問協(xié)議)、WSDL(服務(wù)描述語言)、UDDI(服務(wù)注冊檢索訪問標(biāo)準(zhǔn))三個協(xié)議有力地支持和實(shí)現(xiàn):(1)SOAP:簡單對象訪問協(xié)議(SimpleObjectAccessProtocol,SOAP)提供了標(biāo)準(zhǔn)的RPC方法來調(diào)用WebService協(xié)議,定義了服務(wù)請求者和服務(wù)提供者之間的消息傳輸規(guī)范。SOAP用XML來格式化消息,用HTTP來承載消息,它有很大的可擴(kuò)展性和平臺語言無關(guān)性,在各種平臺上很容易實(shí)現(xiàn)。(2)WSDL:服務(wù)描述語言(WebServiceDescriptionLanguage,WSDL)為服務(wù)提供者提供了用XMI。格式描述WebServices的標(biāo)準(zhǔn)格式,以表達(dá)一個WebService能提供什么功能,它的位置在哪里,如何調(diào)用它等。(3)UDDI:服務(wù)注冊檢索訪問標(biāo)準(zhǔn)(UniversalDiscovery,Description,Integration,UDDl)提供了一種機(jī)制讓W(xué)eb服務(wù)提供商發(fā)布他們的產(chǎn)品,并最終讓他們的客戶能定位他們所提供的Web服務(wù)。其核心組件是UDDI商業(yè)注冊,它利用WSDL語言來描述企業(yè)及其提供的Web服務(wù)。WebService通過服務(wù)的建立、描述、發(fā)布、查找、調(diào)用等步驟來實(shí)現(xiàn)不同平臺間服務(wù)的分布調(diào)用,具體描述如下:(1)Web服務(wù)的建立(Build):可用不同的語言在不同的平臺上開發(fā)Web服務(wù)。(2)Web服務(wù)的描述(Description):Web服務(wù)開發(fā)出來后,用WSDL的標(biāo)準(zhǔn)來服務(wù)請求和響應(yīng)的參數(shù)格式及其他協(xié)議相關(guān)的描述。(3)Web服務(wù)的發(fā)布(Publish):為了使服務(wù)可訪問,服務(wù)提供者需要首先將服務(wù)進(jìn)行一定的描述并發(fā)布到注冊服務(wù)器上。(4)Web服務(wù)的查找(Find):服務(wù)請求方根據(jù)注冊服務(wù)器提供的規(guī)范接口發(fā)出查詢請求,以獲取綁定服務(wù)所需的相關(guān)信息。(5)Web服務(wù)的調(diào)用(Bind):服務(wù)請求方通過分析從注冊服務(wù)器中得到的服務(wù)綁定信息,包括服務(wù)的訪問路徑、服務(wù)調(diào)用的參數(shù)、返回結(jié)果、傳輸協(xié)議、安全要求等,對自己的系統(tǒng)進(jìn)行相應(yīng)配置,進(jìn)而遠(yuǎn)程調(diào)用服務(wù)提供者所提供的服務(wù)。圖13-52描述了服務(wù)請求者、服務(wù)提供者、服務(wù)注冊中心這三者的交互過程。WebService的主要目標(biāo)是跨平臺,創(chuàng)建可互操作的分布式應(yīng)用程序。為了達(dá)到這一目標(biāo),WebService完全基于XML、XSD等獨(dú)立于平臺、獨(dú)立于軟件供應(yīng)商的標(biāo)準(zhǔn),主要適用于企業(yè)內(nèi)部不同應(yīng)用的集成和數(shù)據(jù)交互、B2B集成、代碼和數(shù)據(jù)重用,以及通過Web進(jìn)行客戶端和服務(wù)器的通信的場合。WebService允許用戶在重用代碼的同時,重用代碼后面的數(shù)據(jù)。使用WebService時,用戶不用再像以前那樣,要先從第三方購買、安裝軟件組件,再從應(yīng)用程序中調(diào)用這些組件,而只需要直接調(diào)用遠(yuǎn)端的WebService就可以了。舉個例子,如果想在應(yīng)用程序中確認(rèn)用戶輸入的郵件地址,那么只需把這個地址直接發(fā)送給相應(yīng)的WebService,這個WebService就會查閱街道地址、城市、省區(qū)和郵政編碼等信息,確認(rèn)這個地址的確在相應(yīng)的郵政編碼區(qū)域。WebService的提供商可以按時間或使用次數(shù)對這項服務(wù)進(jìn)行收費(fèi)。這樣的服務(wù)要通過組件重用來實(shí)現(xiàn)是不現(xiàn)實(shí)的,因為那樣的話,必須下載并安裝好包含街道地址、城市、省區(qū)和郵政編碼等信息的數(shù)據(jù)庫,而且這個數(shù)據(jù)庫還是不能實(shí)時更新的。另一種軟件重用的情況是,把好幾個應(yīng)用程序的功能集成起來。例如,想要建立一個局域網(wǎng)上的門戶站點(diǎn)應(yīng)用,讓用戶既可以查看股市行情,又可以管理他們的日程安排,還可以在線購買電影票?,F(xiàn)在Web上有很多應(yīng)用程序供應(yīng)商,都在其應(yīng)用中實(shí)現(xiàn)了上面的這些功能。一旦他們把這些功能都通過WebService發(fā)布出來,就可以非常輕易地把所有這些功能都集成到門戶站點(diǎn)中,為用戶提供一個統(tǒng)一的、友好的界面??梢?,因為WebService具有上述特性,所以使用它會較好地保持業(yè)務(wù)的連續(xù)性,也正因為WebService具有軟件重用、支持對別人的服務(wù)拿來就用等特性,使得升級的工作量比單獨(dú)開發(fā)要少得多、成本也低得多,不但易于擴(kuò)展而且擴(kuò)展空間也比較大。二、選答題(本題共3題,每題1.0分,共3分。)5、閱讀以下說明和C++代碼(代碼13-1),將應(yīng)填入(n)處的字句寫在對應(yīng)欄內(nèi)?!菊f明】軟件設(shè)計師東方飛龍利用UML設(shè)計了一個迷你小型復(fù)數(shù)類,其類圖如圖13-11所示?!敬a13-l】/*___________________________________*//*********文件MiniComplex.h*********//*___________________________________*/#include<iostream>usingnamespacestd;classMiniComplex{(1)://重載流插入和提取運(yùn)算符(2)ostream&operator<<(ostream&osObject,constMiniComplex&complex){osObject<<"("<<complex.realPart<<"+"<<complex.imagPart<<"I"<<")";returnosObject;}friend(3)operator>>(istream&isObject,MiniComplex&complex){charch;isObject>>complex.realPart>>ch>>complex.imagPart>>ch;returnisObject;}MiniComplex(doublereal=0,doubleimag=0);//構(gòu)造函數(shù)MiniComplexoperator+(constMiniComplex&otherComplex)const!//重載運(yùn)算符+MiniComplexoperator--(constMiniComplex&otherComplex)const!//重載運(yùn)算符-MiniComplexoperator*(constMiniComplex&othmComplex)const;//重載運(yùn)算符*MiniComplexoperator/(constMiniComplex&otherComplex)const;//重載運(yùn)算符/booloperator==(constMiniComplex&otherComplex)const;//重載運(yùn)算符==private:doublerealPart;//存儲實(shí)部變量doubleimagPart;//存儲虛部變量};/*_______________________________________________________*//*********文件MiniComplex.cpp**********//*_______________________________________________________*/#include"MiniComplex.h"boolMiniComplex::operator==(constMiniComplex&otherComplex)const{(1);}MiniComplex::MiniComplex(doublereal,doubleimag){realPart=real;imagPart=imag!}MiniComplexMiniComplex::operator+(constMiniComplex&otherComplex)const{MiniComplextemp;temp.realPart=realPart+otherComplex.realPart;temp.imagPart=imagPart+otherComplex.imagPart;returntemp;}MiniComplexMiniComplex::operator--(constMiniComplex&otherComplex)const{MiniComplextemp;temp.realPart=realPart-otherComplex.realPart;temp.imagPart=imagPart-otherCompler.imagPart;returntemp;}MiniComplexMiniComplex::operator*(constMiniComplex&otherComplex)const{MiniComplextemp;temp.realPart=(realPart*otherComplex.realPart)-(imag-Part*otherComplex.imag-Part);tempimagPart=(realPart*otherComplex.imagPart)+(imag-Part*otherComplex.realPart);returntemp,}MiniComplexMiniComplex::operator/(constMiniComplex&otherComplex)eonst{MiniComplextemp;floattt;tt=1/(otherComplex.realPart*otherComplex.realPart+otherComplex.imagPart*otherComplex.imagPart);temp.realPart=((realPart*otherComplex.realPart)+(imagPart*otherComplex.imagPart))*tt;temp.imagPart=((imagPart*otherComplex.realPart)-(realPart*otherComplex.imagPart))*tt;returntemp;}/*__________________________________________________*//********主函數(shù)所在文件main.cpp********//*_________________________________________________*/#include<iostream>#include"(5)"usingnamespacestd;intmain(void){MiniComplexnum1(23,34),num2;cin>>num2;cout<<"InitialValueofNuml="<<num1<<"\nInitialValueofNum2="<<num2<<end1;cout<<num1<<"+"<<num2<<"="<<num1+num2<<end1;//使用重載的加號運(yùn)算符cout<<num1<<"-"<<num2<<"="<<num1-num2<<end1;//使用重載的減號運(yùn)算符cout<<num1<<"*"<<num2<<"-"<<num1*num2<<end1;//使用重載的乘號運(yùn)算符cout<<num1<<"/"<<num2<<"="<<num1/num2<<end1;//使用重載的除號運(yùn)算符return0;}標(biāo)準(zhǔn)答案:(1)public(2)friend(3)istream&.(4)return(realPart==otherComplex.realPart&&imagPart==otherComplex.imagPart)(5)MiniComplex.h知識點(diǎn)解析:根據(jù)UML的類圖可知,該迷你小型復(fù)數(shù)類有兩個屬性realPart、imagPart,分別表示復(fù)數(shù)的實(shí)部和虛部。它還重載了輸出流和輸入流運(yùn)算符,而且重載了加、減、乘、除以及等于這5種運(yùn)算符。以方法“+operator+(otherComplex:constMiniComplex&):MiniComplex”為例來說明其表述的方式:最前面的“+”號表示該方法是公有的(若是“-”號則表示是私有的,若是“#”則表示是保護(hù)的);otherComplex是該方法的參數(shù),constMiniComplex&是該參數(shù)的類型;最后的MiniComplex表示該方法的返回類型。通過上述分析可知,(1)空顯然填public,因為各方法及構(gòu)造函數(shù)均是公有的。在operator<<的定義體內(nèi),發(fā)現(xiàn)使用了參數(shù)complex的屬性realPart和imagPart,并對比operator>>可知,operator<<是MiniComplex的友元函數(shù),因此第(2)空顯然應(yīng)填friend。(3)空顯然是要填operator>>的返回類型,根據(jù)UML類圖可知填istream&。兩個復(fù)數(shù)的實(shí)部和虛部均相等時兩復(fù)數(shù)相等,因此,第(4)空填“return(realPart==otherComplex.realPart&&imagPart==otherComplex.imagPart);”,注意,不能丟分號。在使用一個類時,我們只要在文件中包含它的頭文件即可,于是第(5)空填MiniComplex.h。運(yùn)行上述程序,輸入復(fù)數(shù)56+35i,可得運(yùn)行結(jié)果如下:56+35iInitialValueofNum1=<23+34i>InitialValueofNum2=<56+35i><23+34i>+<56+35i>=<79+69i><23+34i>-<56+35i>=<-33+-1i><23+34i>*<56+35i>=<98+2709i><23+34i>/<56+35i>=<0.568218+0.252006i>注意,各文件必須放在同一個工程之內(nèi),而且operator<<和operator>>的友元聲明關(guān)鍵字:friend不能缺少,否則不能運(yùn)行。6、閱讀以下說明和Java代碼,將應(yīng)填入(n)處的字句寫在對應(yīng)欄內(nèi)。【說明】某繪圖系統(tǒng)存在point、line、square三種圖元,它們具有Shape接口,圖元的類圖關(guān)系如圖13-12所示?,F(xiàn)要將circle圖元加入此繪圖系統(tǒng)以實(shí)現(xiàn)功能擴(kuò)充。已知某第三方庫已經(jīng)提供了XCircle類,且完全滿足系統(tǒng)新增的Circle圖元所需的功能,但XCircle不是由Shape派生而來的,它提供的接口不能被系統(tǒng)直接使用。代碼13-2既使用了XCircle又遵循了Shape規(guī)定的接口,既避免了從頭開發(fā)一個新的Circle類,又可以不修改繪圖系統(tǒng)中已經(jīng)定義的接口。代碼13-3根據(jù)用戶指定的參數(shù)生成特定的圖元實(shí)例,并對之進(jìn)行顯示操作。繪圖系統(tǒng)定義的接口與XCircle提供的顯示接口及其功能如表13-5所示?!敬a13-2】classCircle(1){private(2)pxc;publicCircle(){pxc=new(3);}publicvoiddisplay(){pxc.(4);}}【代碼13-3】publicclassFactory{public(5)getShapeInstance(inttyoe){//生成特定類實(shí)例switch(type){case0:returnnewpoint();case1:returnnewRectangle();case2:returnnewline();case3:returnnewCircle();default:returnnull}}};publicclassApp{publicstaticviodmain(Stringargv[]){if(argv.length!=1){system.out.println("errorparameters!");Return;}inttype=(newInteger(argv[0])).intValue();Factoryfactory=newFactory();shapes;s=factory.(6);if(s==null){system.out.println("Errorgetinstance!");Return;}s.display();return;}}標(biāo)準(zhǔn)答案:(1)implementsShape(2)XCircle(3)XCircle()(4)displayIt()(5)Shape(6)getShapeInstance(type)知識點(diǎn)解析:本題是一個Java程序設(shè)計題,它考查的知識點(diǎn)是面向?qū)ο笾薪涌诜矫娴闹R。接口實(shí)際上是一個特殊的類,這個類中的成員函數(shù)只有聲明部分,沒有實(shí)現(xiàn)部分。這很類似于一個框架,即框架里沒有任何實(shí)在的東西。在接口的實(shí)現(xiàn)類中才把具體要實(shí)現(xiàn)的東西寫出來。在看程序之前,先要看清楚題目的要求。題目要求寫一個Circle類,要求這個類具有Shape接口的特性,而且不想讓考生自己動手重新寫一個circle類,因為系統(tǒng)中已經(jīng)有了一個XCircle類,這個類能滿足系統(tǒng)的要求。當(dāng)我們知道題目的要求后,就可以進(jìn)行分析了。要使Circle具有Shape的特性,則它必須是Shape的實(shí)現(xiàn)類,所以第(1)空應(yīng)填:implementsShape!。但是我們?nèi)绾卫肵Circle類呢?其實(shí)代碼13-2中零星的一些語句給了我們很大的提示,從這些語句我們可以得知程序聲明了一個私有成員,并在構(gòu)造函數(shù)中給它分配了存儲空間,即new...。且在display()方法中調(diào)用了這一成員的什么方法。分析到這里,問題已經(jīng)很清楚了,我們可以在Circle類中生成一個.XCircle類的實(shí)例,然后在Circle類的顯示圖元方法中,調(diào)用XCirele類實(shí)例的顯示圖元方法,達(dá)到題目的要求,所以(2)應(yīng)填:XCircle,(3)應(yīng)填:XCirele(),(4)應(yīng)填:displayIt()。接下來看代碼13-3。這里考察的是接口的應(yīng)用。我們?nèi)绻私庖粭l原則,問題就好辦了。如果有接口A,A中聲明了一個方法run()。它有三個實(shí)現(xiàn)類:AA、AB和AC。現(xiàn)在這三個類分別有一個實(shí)例為:AA1、AB1和AC1?,F(xiàn)在有:AA1。則:A1=AA1,A1=AB1,A1=AC1,A1.run()這些寫法都是合法的,而且如果有A1=AA1,則A1.run()調(diào)用的是AA1的方法run()。接著我們看代碼13-3的(5)空。這一空是定義了方法getShapeInstance的返回值類型,因為返回值是四種類型的實(shí)例,但這些實(shí)例的類都實(shí)現(xiàn)了接口Shape,所以此空應(yīng)填:Shape。(6)空調(diào)用getShapeInstance()從而生成一個給定類型的實(shí)例,調(diào)用格式為:getShapelnstance(type)。7、閱讀以下說明和C代碼(代碼13-4),將應(yīng)填入(n)處的字句寫在對應(yīng)欄內(nèi)。【說明】在一公文處理系統(tǒng)中,開發(fā)者定義了一個公文結(jié)構(gòu)OfficeDoc,其中定義了公文應(yīng)該具有的屬性。當(dāng)公文的內(nèi)容或狀態(tài)發(fā)生變化時,與之相關(guān)聯(lián)的DocExplorer結(jié)構(gòu)的值都需要發(fā)生改變。一個OfficeDoc結(jié)構(gòu)能夠關(guān)聯(lián)一組DocExplorer結(jié)構(gòu)。當(dāng)OfficeDoc結(jié)構(gòu)的內(nèi)容或狀態(tài)發(fā)生變化時,所有與之相關(guān)聯(lián)的DocExplorer結(jié)構(gòu)都將被更新,這種應(yīng)用被稱為觀察者模式。以下代碼采用C語言實(shí)現(xiàn),能夠正確編譯通過。【代碼13-4】#include<stdio.h>#defineOBS_MAXNUM20/*一個OfficeDoc變量最多能夠關(guān)聯(lián)的DocExplorer變量的個數(shù)*/typedefvoid((1))(strucOffieeDoc*,structDoeExplorer*)I;structDocExplorer{funcupdate;/*DocExplorer結(jié)構(gòu)采用的更新函數(shù)*//*其它的結(jié)構(gòu)字段省略*/};struetOffieeDoc{(2)myObs[OBS_MAXNUM];/*存儲所有與OfficeDoc相關(guān)聯(lián)的DocExplorer結(jié)構(gòu)指針*/intindex;/*與OffieeDoc結(jié)構(gòu)變量相關(guān)聯(lián)的DoeExplorer結(jié)構(gòu)變量的個數(shù)*/};voidattaeh(structOfficeDoc*doc,structDocExplorer*ob){/*關(guān)聯(lián)Observer結(jié)構(gòu)ob與OffieeDoe結(jié)構(gòu)doe*/intloop=0;if(doc->index>=OBS_MAXNUM||ob==NULL)return;for(loop=0,loop<doc->index;loop++)if(doc->myObs[loop]==ob)return;doc->myObs[doe->index]=ob;doc->index++;}voiddetaeh(structOfficeDoc*doc,structDocExplorer*ob){/*解除doc結(jié)構(gòu)與ob結(jié)構(gòu)間的關(guān)聯(lián)*/intloop;if(ob==NULL)return;for(loop=0;loop<doc->index;loop++){if(doe->myObs[loop]==ob){if(loop<=doc->index-2)doc->myObs[loop]=doc->myObs[(3)];doc->myObs[doc->index-1]=NULL;doc->index——;breack;}}}voidupdatel(structOfficeDoe*doe,structDoeExplorer*ob){/*更新ob結(jié)構(gòu)的值,更新代碼省略*/}voidupdate2(structOffieeDoc*doc,struetDocExplorer*ob){/*更新ob結(jié)構(gòu)的值,更新代碼省略*/}voidnotifyObs(structOfficeDoc*doc){/*當(dāng)doc結(jié)構(gòu)的值發(fā)生變化時,通知與之關(guān)聯(lián)的所有DocExplorer結(jié)構(gòu)變量*/intloop;for(loop=0;loop<doc->index;loop++){(doc->myObs[loop])->update((4));}}voidmain(){structOfficeDocdoc;/*定義一了OfficeDoe變量*/structDocExplorerexplorer1,explorer2;/*定義兩個DocExplorer變量*//*初始化與OfficeDoc變量相關(guān)的DocExplorer變量個數(shù)為0*/doc.index=0;explorer1.update=update1;/*設(shè)置explorer1變量的更新函數(shù)*/explorer2.update=update2;/*設(shè)置explorer2變量的更新函數(shù)*/attach(&doc,&explorer1);/*關(guān)聯(lián)explorer1與doc對象*/attach(&doc,&explorer2);/*關(guān)聯(lián)explorer2與doc對象*//*其它代碼省略*/(5);/*通知與OfficeDoe相關(guān)的所有DoeExploer變量*/return;}標(biāo)準(zhǔn)答案:(1)*func(2)structDocExplorer*(3)doc->index-1,或等價形式(4)doc,doc->myObs[loop],或等價形式(5)notifyObs(&doc)知識點(diǎn)解析:在結(jié)構(gòu)體DocExplorer的定義中,func是一種類型,語句“funcupdate;”定義了類型為func的變量update,又根據(jù)(1)空所在行的其它信息,可知typedef是在聲明指向函數(shù)的指針類型,該函數(shù)的參數(shù)列表為(strucOfficeDoc*,structDocExplorer*),返回值類型為void,因此第(1)空填:*func。這是用tpyedet。聲明指向函數(shù)的指針類型的格式。根據(jù)第(2)空下一行的注釋可知,該語句是將DocExplorer結(jié)構(gòu)體指針存儲在OfficeDoc中,所以可知第(2)空是定義一個DocExplorer指針數(shù)組變量,因此,第(2)空填:structDocExplorer*。根據(jù)函數(shù)detach里面的語句“doc->myObs[doc->index-1]=NULL;doe->index——;”可知,其功能是使關(guān)聯(lián)個數(shù)減1。并將數(shù)組。myObs的最后一個關(guān)聯(lián)結(jié)構(gòu)體的指針置空。如果要解除關(guān)聯(lián)的是數(shù)組的最后一個元素doc->myObs[doc->—index-1],那么可直接將其置空;但如果要解除關(guān)聯(lián)的結(jié)構(gòu)體不是最后一個呢?顯然,語句:if(loop<=doc->—index-2)doc->—myObs[loop]

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論