試題七
閱讀下列說(shuō)明、圖以及Java程序。
[說(shuō)明]
某訂單管理系統(tǒng)的部分UML類(lèi)圖如下圖所示。
上圖中,Product表示產(chǎn)品,ProductList表示所銷(xiāo)售產(chǎn)品的列表,Order表示產(chǎn)品訂單,Orderltem表示產(chǎn)品訂單中的一個(gè)條目,OrderList表示訂單列表,SalesSystem提供訂單管理系統(tǒng)的操作接口。各個(gè)類(lèi)的部分屬性和方法說(shuō)明如下表所示。
可以使用類(lèi)java.util.ArrayList<E>米實(shí)現(xiàn)對(duì)象的聚集關(guān)系,如上圖中OrderList與 Order之間的聚集關(guān)系。
for-each循環(huán)提供了一種遍歷對(duì)象集合的簡(jiǎn)單方法。在for-each循環(huán)中,可以指定需要遍歷的對(duì)象集合以及用來(lái)接收集合中每個(gè)元素的變量,其語(yǔ)法如下:
for(用來(lái)接收集合中元素的變量:需要遍歷的對(duì)象集合)
如果要使用for-each循環(huán)來(lái)遍歷對(duì)象集合,那么包含該對(duì)象集合的類(lèi)必須實(shí)現(xiàn)接口 java.util.Iterable<T>。
Java程序7-1和Java程序7-2分別給出了類(lèi)OrderList和方法statistic的Java代碼
[Java程序7-1]
import java.util.*;
public class OrderList (1) {
private ArrayList<Order> orders;
public OrderList0 {
this.orders = new ArrayList<Order>();
}
public void addOrder(Order orde0
this.orders.add(order);
}
public Iterator<Order> iterator() {
return (2) ;
}
public iht getNumberOfOrders0 {
return this.orders.size();
}
}
[Java程序7-21]
import java.u61.*;
public class SalesSystem {
private ProductList catalog;
private OrderList sales;
private static PrintWriter stdOut = new PrintWriter(System.out, true);
public void statistic() {
for (Product product: (3) ) {
iht number = 0;
for (Order order: (4) ) {
for ( (5) : order) {
if (produet.equals(item.getProduct()))
number += item. getQuantity();
}
}
stdOut.println(product .getCode() +" "
+ product.getDescription() +" "
+ number +" "+ number * product.getPrice());
}
}
//其余的方法末列出
}
試題四
閱讀以下說(shuō)明,回答問(wèn)題1、問(wèn)題2和問(wèn)題3。
[說(shuō)明]
某單位正在使用一套C/S模式的應(yīng)用軟件系統(tǒng),現(xiàn)在需要升級(jí)為B/S應(yīng)用模式,但需要保持業(yè)務(wù)的連續(xù)性。開(kāi)發(fā)人員提出用Web Service作為中間層的接口進(jìn)行開(kāi)發(fā)。
[問(wèn)題1]
請(qǐng)用120字以?xún)?nèi)文字,從業(yè)務(wù)的繼承性、升級(jí)成本(時(shí)間、工作量)和擴(kuò)展性三個(gè)方面簡(jiǎn)要說(shuō)明開(kāi)發(fā)人員所提方案的優(yōu)點(diǎn)。
[問(wèn)題2]
Web Service的三個(gè)基本技術(shù)是WSDL、SOAP、UDDI,它們都是以XML為基礎(chǔ)定義的。請(qǐng)用120字以?xún)?nèi)文字,簡(jiǎn)要說(shuō)明WSDL、SOAP和UDDI的作用。
[問(wèn)題3]
服務(wù)注冊(cè)中心、服務(wù)提供者和服務(wù)請(qǐng)求者之間的交互和操作構(gòu)成了Web Service的體系結(jié)構(gòu),如下圖所示。請(qǐng)用180字以?xún)?nèi)文字,說(shuō)明這三者的主要功能及其交互過(guò)程。
試題五
閱讀下列說(shuō)明、圖和C代碼。
[說(shuō)明5-1]
B樹(shù)是一種多叉平衡查找樹(shù)。一棵m階的B樹(shù),或?yàn)榭諛?shù),或?yàn)闈M(mǎn)足下列特性的m叉樹(shù):
①樹(shù)中每個(gè)結(jié)點(diǎn)最多有m棵子樹(shù);
②若根結(jié)點(diǎn)不是葉子結(jié)點(diǎn),則它至少有兩棵子樹(shù);
⑧除根之外的所有非葉子結(jié)點(diǎn)至少有[m/2]棵子樹(shù);
④所有的非葉子結(jié)點(diǎn)中包含下列數(shù)據(jù)信息:
(n,A0,K1,A1,K2,A2, …,Kn,An)其中:Ki(i=1,2,…,n)為關(guān)鍵字,且Ki<Ki+1(i=1,2,…,n-1);Ai(i=0,1,…,n)為指向子樹(shù)根結(jié)點(diǎn)的指針,且指針Ai-1,所指子樹(shù)中所有結(jié)點(diǎn)的關(guān)鍵字均小于Ki,Ai+1,所指子樹(shù)中所有結(jié)點(diǎn)的關(guān)鍵字均大于Ki,n為結(jié)點(diǎn)中關(guān)鍵字的數(shù)目。
⑤所有的葉子結(jié)點(diǎn)都出現(xiàn)在同一層次上,并且不帶信息(可以看作是外部結(jié)點(diǎn)或查找失敗的結(jié)點(diǎn),實(shí)際上這些結(jié)點(diǎn)不存在,指向這些結(jié)點(diǎn)的指針為空)。
例如,一棵4階B樹(shù)如下圖所示(結(jié)點(diǎn)中關(guān)鍵字的數(shù)目省略)。
B樹(shù)的階M、bool類(lèi)型、關(guān)鍵字類(lèi)型及B樹(shù)結(jié)點(diǎn)的定義如下:
#define M 4 /*B樹(shù)的階*/
typedef enum {FALSE=0,TRUE=1}bool;
typedef int ElemKeyType;
typedef struct BTreeNode {
int numkeys; /*結(jié)點(diǎn)中關(guān)鍵字的數(shù)日*/
struct BTreeNode*parent; /*指向父結(jié)點(diǎn)的指針,樹(shù)根的父結(jié)點(diǎn)指針為空*/
struct BTreeNode *A[M]; /*指向子樹(shù)結(jié)點(diǎn)的指針數(shù)組*/
ElemKeyType K[M]; /*存儲(chǔ)關(guān)鍵字的數(shù)組,K[0]閑置不用*/
}BTreeNode;
函數(shù)SearchBtree(BTreeNode*root,ElemKcyTypeakey,BTreeNode:*pb)的功能是:在給定的一棵M階B樹(shù)中查找關(guān)鍵字akey所在結(jié)點(diǎn),若找到則返回TRUE,否則返回 FALSE。其中,root是指向該M階B樹(shù)根結(jié)點(diǎn)的指針,參數(shù)ptr返回akey所在結(jié)點(diǎn)的指針,若akey不在該B樹(shù)中,則ptr返回查找失敗時(shí)空指針?biāo)诮Y(jié)點(diǎn)的指針。例如,在上圖所示的4階B樹(shù)中查找關(guān)鍵字25時(shí),ptr返回指向結(jié)點(diǎn)e的指針。
注;在結(jié)點(diǎn)中查找關(guān)鍵字akey時(shí)采用二分法。
[函數(shù)5-1]
bool SearchBtree(BTreeNode* root, ElemKeyType akey, BTreeNode **ptr)
{
int lw, hi, mid;
BTreeNode*p = root;
*ptr = NULL;
while ( p ) {
1w = 1; hi= (1) ;
while (1w <= hi) {
mid = (1w + hi)/2;
if (p -> K[mid] == akey) {
*ptr = p;
return TRUE;
}
else
if ( (2) )
hi=mid - 1;
else
1w = mid + 1;
}
*ptr = p;
p = (3) ;
}
return FALSE;
}
[說(shuō)明5-2]
在M階B樹(shù)中插入一個(gè)關(guān)鍵字時(shí),首先在最接近外部結(jié)點(diǎn)的某個(gè)非葉子結(jié)點(diǎn)中增加一個(gè)關(guān)鍵字,若該結(jié)點(diǎn)中關(guān)鍵字的個(gè)數(shù)不超過(guò)M-1,則完成插入;否則,要進(jìn)行結(jié)點(diǎn)的“分裂”處理。所謂“分裂”,就是把結(jié)點(diǎn)中處于中間位置上的關(guān)鍵字取出來(lái)并插入其父結(jié)點(diǎn)中,然后以該關(guān)鍵字為分界線(xiàn),把原結(jié)點(diǎn)分成兩個(gè)結(jié)點(diǎn)?!胺至选边^(guò)程可能會(huì)一直持續(xù)到樹(shù)根,若樹(shù)根結(jié)點(diǎn)也需要分裂,則整棵樹(shù)的高度增加1。
例如,在上圖所示的B樹(shù)中插入關(guān)鍵字25時(shí),需將其插入結(jié)點(diǎn)e中。由于e中已經(jīng)有3個(gè)關(guān)鍵字,因此將關(guān)鍵字24插入結(jié)點(diǎn)e的父結(jié)點(diǎn)b,并以24為分界線(xiàn)將結(jié)點(diǎn)e分裂為e1和e2兩個(gè)結(jié)點(diǎn),結(jié)果如下圖所示。
函數(shù)Isgrowing(BTreeNode*root,ElemKeyTypeakey)的功能是:判斷在給定的M階B樹(shù)中插入關(guān)鍵字akey后,該B樹(shù)的高度是否增加,若增加則返回TRUE,否則返回FALSE。其中,root是指向該M階B樹(shù)根結(jié)點(diǎn)的指針。
在函數(shù)Isgrwing中,首先調(diào)用函數(shù)SearchBtree(即函數(shù)5-1)查找關(guān)鍵字akey是否在給定的M階B樹(shù)中,若在,則返回FALSE(表明無(wú)需插入關(guān)鍵字akey,樹(shù)的高度不會(huì)增加);否則,通過(guò)判斷結(jié)點(diǎn)中關(guān)鍵字的數(shù)目考查插入關(guān)鍵字akey后該B樹(shù)的高度是否增加。
[函數(shù)5-2]
bool Isgrowing(BTreeNode* root, ElernKeyType akey)
{ BTreeNode *t, *f;
if( !SearchBtree( (4) ) ) {
t=f;
while ( (5) ) {
t=t -> parent;
}
if( !t )
return TRUE;
}
return FALSE;
}
試題六
閱讀下列說(shuō)明、圖和c++代碼。
[說(shuō)明]
某訂單管理系統(tǒng)的部分UML類(lèi)圖如下圖所示。
上圖中,Product表示產(chǎn)品,ProductList表示產(chǎn)品目錄,Order表示產(chǎn)品訂單,OrderItem表示產(chǎn)品訂單中的一個(gè)條目,OrderList表示訂單列表,SalesSystem提供訂單管理系統(tǒng)的操作接口。
請(qǐng)完善類(lèi)Order的成員函數(shù)getOrderedAmount()和類(lèi)SalesSystem的stafistic()方法,各個(gè)類(lèi)的屬性及部分方法定義參見(jiàn)下面的C++代碼。
[C++代碼]
class Product { //產(chǎn)品
private:
string pid; //產(chǎn)品識(shí)別碼
string description; //產(chǎn)品描述
double price; ///產(chǎn)品單價(jià)
public:
void setProductPrice(double price); //設(shè)置產(chǎn)品單價(jià)
string getProduetld(); //獲取產(chǎn)品識(shí)別碼
string getProduetDescriprion 0; //獲取產(chǎn)品描述
double getProductPrice0; //獲得產(chǎn)品單價(jià)
//其他成員省略
};
class ProductList { //產(chǎn)品列表類(lèi)
private:
vector <Product> products;
public:
ProductList();
Product getProductBylndex(int i); //獲得產(chǎn)品列表中的第i件產(chǎn)品
void addProduct(Product t); //在產(chǎn)品列表中加入一件產(chǎn)品
Product * getProductByID(string pid); //獲得識(shí)別碼為pid的產(chǎn)品指針
unsigned iht getProductAmount(); //獲得產(chǎn)品列表中的產(chǎn)品婁量
};
class OrderItem { //訂單條目類(lèi)
private:
Product *productPtr; //指向被訂購(gòu)產(chǎn)品的指針
int quantity; //訂購(gòu)數(shù)量
public:
OrderItem (Product *,iht);
Product * getProductptr O; //獲得指向被訂購(gòu)產(chǎn)品的指針
int getQuantity (); //獲取被訂剛強(qiáng)產(chǎn)品數(shù)量
};
class Order { //訂單類(lèi)
private:
unsigned int orderid; //訂單識(shí)別號(hào)
vector<Orderltem> items; //訂單內(nèi)容(訂單項(xiàng))
public:
Order(unsigned int orderid); //獲得識(shí)別碼為fid的產(chǎn)品在當(dāng)前訂單中被訂購(gòu)的數(shù)量
int getOrderedAmount(string fid);
void additem(Product *productPtr,unsigned int n); //在訂單中增加一個(gè)訂單項(xiàng)
};
class OrderList { //訂單列表類(lèi)
private:
vector<Order> orders;
public:
OrderList();
//Begin()返回指向訂單列表第一個(gè)元素的迭代器(指針)
virtual vector<Order>::iterator OrderList::Begin();
//End()返回指向訂單列表最后一個(gè)元素之后的迭代器(指向一個(gè)不存在的元素)
virtual vector<Order>::iterator orderList::End();
void addOrder(Order t); //在訂單列表中加入一份訂單
//其他成員省略
};
class SalesSystem{
private:
ProductList catalog; //產(chǎn)品目錄
OrderList sales; //訂單列表
public:
SalesSystem();
void statistic(); //統(tǒng)計(jì)所有產(chǎn)品的訂購(gòu)情況
//其他成員省略
};
//在訂單中查找識(shí)別碼為tid的產(chǎn)品的訂購(gòu)數(shù)量,若該產(chǎn)品沒(méi)有被訂購(gòu),則返回0
int Order::getOrderedAmount(string tid)
{ for (int k=0; k < items.size(); k++) {
if( (1) ==tid)
return (2) ;
}
return 0;
}
//方法statistic()依次統(tǒng)計(jì)產(chǎn)品目錄中每個(gè)產(chǎn)品的訂購(gòu)總量,并打印輸出
//每個(gè)產(chǎn)品的識(shí)別碼、描述、訂購(gòu)總量和訂購(gòu)金額
void SalesSystem::statistic()
{ unsigned int k, t, ordered_qty = 0;
vector<Order>::iterator it; Product p;
cout<<''產(chǎn)品識(shí)別碼\t描述\t\t訂購(gòu)數(shù)量\t金額''<<endl;
for (k = 0; k < catalog.gctProductAmount(); k++){//遍歷產(chǎn)品列表
p = (3) ; //從產(chǎn)品列表取得一件產(chǎn)品信息存入變量p
ordered_qty = 0;
//通過(guò)迭代器變量it遍歷訂單列表中的每一份訂單
for (it = sales. Begin(); (4) : it++) {
//根據(jù)產(chǎn)品識(shí)別碼獲得產(chǎn)品p在當(dāng)前訂單中被訂購(gòu)的數(shù)量
t = (5) (p.getProductld());
ordered_qty +=t;
}
cout << p.getProducfld() << "\t\t"<< p.gntProductDescription() << "\t\t";
cout <<o(jì)rdered_qty << "\t\t" << p.getProductPrice() * ordered_qty << endl;
}
}