9、[程序4]
START
PRUGBC LD GR0,DATA
LEA GR1,0
LEA GR3,48
LOOP1 CPL GR0,WDT,GR1
JP2 LOOP2
ST GR3,BTASC,GR1
LEA GR1,1,GR1
LEA GR2,-4,GR1
JN2 LOOP1
(1)
LOOP2 LEA GR2,48
LOOP3 CPL GR0,WDT,GR1
JMI NEXT
(2)
LEA GR2,1,GR2
JMP LOOP3
NEXT (3)
LEA GR1,1,GR1
LEA GR2,-4,GR1
JNZ LOOP2
LAST (4) ;處理個(gè)位數(shù)
(5)
EXIT
C48 DC 48
WDT DC 10000
DC 1000
DC 100
DC 10
BTASC DS 5
DATA DC #FA59H
END
試題一
閱讀下列說明和數(shù)據(jù)流圖,回答問題1至問題4,將解答填入答題紙的對(duì)應(yīng)欄內(nèi)。
[說明]
某基于微處理器的住宅安全系統(tǒng),使用傳感器(如紅外探頭、攝像頭等)來檢測(cè)各種意外情況,如非法進(jìn)入、火警、水災(zāi)等。
房主可以在安裝該系統(tǒng)時(shí)配置安全監(jiān)控設(shè)備(如傳感器、顯示器、報(bào)警器等),也可以在系統(tǒng)運(yùn)行時(shí)修改配置,通過錄像機(jī)和電視機(jī)監(jiān)控與系統(tǒng)連接的所有傳感器,并通過控制面板上的鍵盤與系統(tǒng)進(jìn)行信息交互。在安裝過程中,系統(tǒng)給每個(gè)傳感器賦予一個(gè)編號(hào)(即 id)和類型,并設(shè)置房主密碼以啟動(dòng)和關(guān)閉系統(tǒng),設(shè)置傳感器事件發(fā)生時(shí)應(yīng)自動(dòng)撥出電話號(hào)碼。當(dāng)系統(tǒng)檢測(cè)到一個(gè)傳感器事件時(shí),就激活警報(bào),撥出預(yù)置的電話號(hào)碼,并報(bào)告關(guān)于位置和檢測(cè)到事件的性質(zhì)等信息。
[數(shù)據(jù)流圖4-1]
[問題1]
數(shù)據(jù)流圖4-1(住宅安全系統(tǒng)頂層圖)中的A和B分別是什么?
[數(shù)據(jù)流圖4-2]
[問題2]
數(shù)據(jù)流圖4-2(住宅安全系統(tǒng)第0層DFD圖)中的數(shù)據(jù)存儲(chǔ)“配置信息”會(huì)影響圖中的哪些加工?
[問題3]
將數(shù)據(jù)流圖4-3(加工4的細(xì)化圖)中的數(shù)據(jù)流補(bǔ)充完整,并指明加工名稱、數(shù)據(jù)流的方向(輸入/輸出)和數(shù)據(jù)流名稱。
[問題4]
試說明邏輯數(shù)據(jù)流圖(logicaldata flow diagram)和物理數(shù)據(jù)流圖(physicaldata flow diagram)之間的主要差別。
閱讀下列說明和算法,回答問題1和問題2,將解答填入答題紙的對(duì)應(yīng)欄內(nèi)。
[說明]
算法2-1是用來檢查文本文件中的圓括號(hào)是否匹配。若文件中存在圓括號(hào)沒有對(duì)應(yīng)的左括號(hào)或者右括號(hào),則給出相應(yīng)的提示信息,如下所示:
文件 提示信息
(1+2)
abc) 缺少對(duì)應(yīng)左括號(hào):第2行,第4列
((def)8x)) 缺少對(duì)應(yīng)左括號(hào):第3行,第10列
(((h)
ij)(k
(1ml) 缺少對(duì)應(yīng)右括號(hào):第5行,第4列;第4行,第1列
在算法2-1中,stack為一整數(shù)棧。算法中各函數(shù)的說明如表4-1所示。
[算法2-1]
將棧stack置空,置EOF為False
ch←nextch();
while(not EOF.
k←kind(ch);
if(k== (1) )
push( (2) );push( (3) );
elself(k== (4) )
if(not empty())
pop(),pop(),
else
顯示錯(cuò)誤信息(缺少對(duì)應(yīng)左括號(hào)或右括號(hào));
顯示行號(hào)row;顯示列號(hào)col;
endif
endif
ch←nextch();
endwhile
if(not empty())
顯示錯(cuò)誤信息(缺少對(duì)應(yīng)左括號(hào)或右括號(hào));
while(not empty())
row←pop();col←pop();
顯示行號(hào)row;顯示列號(hào)col
cndwhile
endif
為了識(shí)別更多種類的括號(hào),對(duì)算法2-1加以改進(jìn)后得到算法2-2。算法2-2能夠識(shí)別圓括號(hào),方括號(hào)和花括號(hào)(不同類型的括號(hào)不能互相匹配)。改進(jìn)后,函數(shù)kinnd(char ch)的參數(shù)及其對(duì)應(yīng)的返回值如表4-2所示。
表4-2 函數(shù)的參數(shù)及其返回值
[算法2-2]
將棧stack置空,置EOF為False
ch←nextch();
while(not EOF.
k←kind(ch);
if(k>0)
if( 判斷條件1 )
push( (5) );push( (6) );push( (7) );
elseif( 判斷條件2 and 判斷條件3 )
pop();pop();pop();
else
顯示錯(cuò)誤信息(缺少對(duì)應(yīng)左括號(hào)或右括號(hào));
顯示行號(hào)row;顯示列號(hào)col;
endif
endif
ch←nexteh();
endwhile
if(not empty())
顯示錯(cuò)誤信息(缺少對(duì)應(yīng)左括號(hào)或右括號(hào));
while(not empty())
pop();row←pop();col←pop();
顯示行號(hào)row;顯示列號(hào)col;
endwhile
endif
[問題1]
試將[算法2-1)和[算法2-2]中(1)~(7)處補(bǔ)充完整。
[問題2]
從下面的選項(xiàng)中選擇相應(yīng)的判斷邏輯填補(bǔ)[算法2-2]中的“判斷條件1”至“判斷條件 3”。注意,若“判斷條件2”的邏輯判斷結(jié)果為假,就無需對(duì)“判斷條件3”進(jìn)行判斷。
(a)字符是括號(hào)(b)字符是左括號(hào)(c)字符是右括號(hào)(d)棧空(e)棧不空
(f)棧頂元素表示的是與當(dāng)前字符匹配的左括號(hào)
(g)棧頂元素表示的是與當(dāng)前字符匹配的右括號(hào)
試題三
閱讀下列說明以及圖4-4和圖4-5,回答問題1、問題2和問題3,將解答填入答題紙的對(duì)應(yīng)欄內(nèi)。
[說明]
某電話公司決定開發(fā)一個(gè)管理所有客戶信息的交互式網(wǎng)絡(luò)系統(tǒng)。系統(tǒng)的功能如下。
1.瀏覽客戶信息:任何使用因特網(wǎng)的用戶都可以瀏覽電話公司所有的客戶信息(包括姓名、住址、電話號(hào)碼等)。
2.登錄:電話公司授予每個(gè)客戶一個(gè)賬號(hào)。擁有授權(quán)賬號(hào)的客戶,可以使用系統(tǒng)提供的頁面設(shè)置個(gè)人密碼,并使用該賬號(hào)和密碼向系統(tǒng)注冊(cè)。
3.修改個(gè)人信息:客戶向系統(tǒng)注冊(cè)后,可以發(fā)送電子郵件或者使用系統(tǒng)提供的頁面,對(duì)個(gè)人信息進(jìn)行修改。
4.刪除客戶信息:只有公司的管理人員才能刪除不再接受公司服務(wù)的客戶的信息。系統(tǒng)采用面向?qū)ο蠓椒ㄟM(jìn)行開發(fā),在開發(fā)過程中確定的類如表4-3所示。
表4-3 開發(fā)過程中確定的類
[問題1]
在需求分析階段,采用UML的用例圖(use case diagram)描述系統(tǒng)功能需求,如圖4-4所示。指出圖中的A,B,C和D分別是哪個(gè)用例?
[問題2]
在UML中,重復(fù)度(multiplicity)定義了某個(gè)類的一個(gè)實(shí)例可以與另一個(gè)類的多個(gè)實(shí)例相關(guān)聯(lián)。通常把它寫成一個(gè)表示取值范圍的表達(dá)式或者一個(gè)具體的值。例如,圖4-5中的類InternetClient和CustomerList,InternetClient端的“0...*”表示:1個(gè) CustomerList的實(shí)例可以與0個(gè)或多個(gè)InternetClient的實(shí)例相關(guān)聯(lián);CustomerList端的“1”表示:1個(gè)InternetClient的實(shí)例只能與1個(gè)CustomerList的實(shí)例相關(guān)。
指出圖4-5中(1)~(4)處的重復(fù)度分別為多少?
[問題3]
類通常不會(huì)單獨(dú)存在,因此當(dāng)對(duì)系統(tǒng)建模時(shí),不僅要識(shí)別出類,還必須對(duì)類之間的相互關(guān)系建模。在面向?qū)ο蠼V?,提供?種關(guān)系:依賴(dependency)、概括(generaliza tion)、關(guān)聯(lián)(association)和聚集(aggregation)。分別說明這4種關(guān)系的含義,并說明關(guān)聯(lián)和聚集之間的主要區(qū)別。
10、[函數(shù)5]
int DeleteNode(Bitree *r,int e){
Bitree p=* r,pp,s,c;
while( (1) ){/ * 從樹根結(jié)點(diǎn)出發(fā)查找鍵值為e的結(jié)點(diǎn) * /
pp=p;
if(e<p->data) p=p->Lchild;
else p=p->Rchild
}
if(! p)return-1;/ * 查找失敗 * /
if(p->Lchild && p->Rchild){/ * 處理情況③ * /
s= (2) ;pp=p;
while( (3) ){pp=s;s=s->Rchild;}
p->dara=s->data;P=s;
}
/ * 處理情況①、② * /
if( (4) )c=p->Lchild;
else c=p->Rchild
if(p==*r) *r=c;
else if( (5) )pp->Lchild=c;
else pp->Rchild=c;
free(p);
return 0;
}
試題六
11、[程序6]
#include<ioStream.h>
template<class T>class Array;
template<class T>class ArrayBody{
friend (1) ;
T* tpBody;
int iRows,iCurrentRow;
ArrayBOdy(int iRsz,int iCsz){
tpBody= (2) ;
iRows=iRsz,iColumns=iCsz;iCurrentRow=-1;
}
public:
T& operator[](int j) {
bool row_error,column_error;
row_error=column_error=false;
try{
if(iCurrentRow<0||iCurrentRow≥iRows)
row_error=;
if(j<0|| j≥iColumns
column_error=;
if(row_error==true || column_error==true)
(3) ;
}
eatch(char) {
if(row error==true)
cerr<<“行下標(biāo)越界[“<<iCurrentRow<<”]”;
if(column error==true)
cerr<<“列下標(biāo)越界[“<<j<<”]”;
cout<<“\n”;
}
return tpBody[iCurrentRow * iColumns+j];
}
~ArrayBody(){delere[]tpBody;}
};
template<class T>class Array {
ArrayBody<T> tBody;
public:
ArrayBody<T> & operator[](int i){
(4) ;
return tBody;
};
void main()
{
Array<int> a1(10,20);
Array<double> a2(3,5);
int b1;
double b2;
b1=a1[-5][10]; / * 有越界提示:行下標(biāo)越界[-5] * /
b1=a1[10][15]; / * 有越界提示:行下標(biāo)越界[10] * /
b1=a1[1][4]; / * 沒有越界提示 * /
b2=a2[2][6]; / * 有越界提示:列下標(biāo)越界[6] * /
b2=a2[10][20]; / * 有越界提示:行下標(biāo)越界[10]列下標(biāo)越界[20] * /
b2=a2[1][4]; / * 沒有越界提示 * /
}