问答题

阅读下列说明和Java代码,应填入(n)处。<br>【说明】<br>某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如表10-7所示:<br>为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如图10-12所示:<br>其中,Duck为抽象类,描述了抽象的鸭子,而类RubberDuck、MallardDuck、 CottonDuck 和 RedHeadDuck分别描述具体的鸭子种类,方法fly()、quack()和display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;接口FlyBehavior与 QuackBehavior分别用于表示抽象的飞行行为与发声行为;类FlyNoWay与FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、Squeak与QuackNoWay分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。<br>【Java代码】<br>(1) FlyBehavior{<br>public void fly();<br>};<br>(2) QuackBehavior{<br>public void quack();<br>};<br>class FlyWithWings implements FlyBehavior{<br>public void fly(){System.out.println(“使用翅膀飞行!”);}<br>};<br>class FlyNoWay implements FlyBehavior{<br>public void fly(){System.out.println(“不能飞行!”);}<br>};<br>class Quack implements QuackBehavior{<br>public void quack(){System.out.println(“发出\‘嘎嘎\’声!”); }<br>};<br>class Squeak implements QuackBehavior{<br>public void quack(){System.out.println(“发出空气与橡皮摩擦声 !”);<br>}<br>};<br>class QuackNoWay implements QuackBehavior{<br>public void quack(){System.out.println(“不能发声!”);}<br>};<br>abstract class Duck{<br>protected FlyBehavior (3);<br>protected QuackBehavior (4);<br>public void fly(){ (5); }<br>public void quack() { (6);};<br>public (7) void display();<br>};<br>class RubberDuck extends Duck{<br>public RubberDuck(){<br>flyBehavior=new (8);<br>quackBehavior=new (9);<br>}<br>public void display(){/*此处省略显示橡皮鸭的代码*/ }<br>};<br>//其他代码省略


问答题

阅读下列函数说明和C++代码,回答问题<br>[说明]<br>对多个元素的聚合进行遍历访问时,需要依次推移元素,例如对数组通过递增下标的方式,数组下标功能抽象化、一般化的结果就称为迭代器(Iterator)。模式以下程序模拟将书籍(Book)放到书架(BookShelf)上并依次输出书名。这样就要涉及到遍历整个书架的过程。使用迭代器Iterator实现。图5-1显示了各个类间的关系。以下是C++语言实现,能够正确编译通过。<br>[图5-1]<br>[C++代码]<br>template (1) ><br>class Iterator{<br>public:<br>virtual bool hasNext() = 0;<br>(2) Object* next() = 0;<br>};<br>class Book{<br>//省略具体方法和属性<br>};<br>class BookShelf{<br>private:<br>vector books;<br>public:<br>BookShelf(){<br>}<br>Book* getBookAt(int index){<br>return &booksindex;<br>}<br>int getLength(){<br>return books. size();<br>}<br>};<br>template<br>class BookshelfIterator : public (3) {<br>private:<br>BookShelf * bookShelf;<br>int index;<br>public:<br>BookshelfIterator(BookShelf *bookShelf){<br>this->bookShelf = bookShelf;<br>index = 0;<br>}<br>bool hasNext(){//判断是否还有下一个元素<br>if(index < bookShelf->getLength()){<br>return true;<br>}else{<br>return false;<br>}<br>}<br>Objeot* next(){//取得下一个元素<br>return bookShelf->getBookAt(index++);<br>}<br>};<br>int main()<br>{<br>BookShelf bookShelf;<br>//将书籍上架,省略代码<br>Book *book;<br>Iterator *it = new BookShelfIterator((4) );<br>while((5) ){//遍历书架,输出书名<br>book=(Book*)it->next();<br>/*访问元素*/<br>}<br>return 0;<br>}


问答题

阅读下列函数说明、图和C代码,回答问题<br>[说明]<br>假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为:<br>m=a[k]×10k-2+a[k-1]×10k-3+…+a[3]×10+a[2]<br>其中a[1]保存该长整数的位数,a[0]保存该长整数的符号:0表示正数、1表示负数。<br>运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减情况。注意,不考虑溢出情况,即数组足够大。<br>[函数]<br>int cmp(int *LA, int *LB);<br>/*比较长整数LA与LB的绝对值大小*/<br>/*若LA绝对值较大返回正值,LA较小返回负值,相等则返回0*/<br>int ADD (int *LA, int *LB, int *LC)<br>/*计算长整数LA与LB的和,结果存储于LC中*/<br>/*注意:正数与负数的和相当于正数与负数绝对值的差*/<br>/*数据有误返回0,正常返回1*/<br>{<br>if(LA == NULL || LB == NULL || LC == NULL)return 0;<br>int *pA, *pB, i, N, carry, flag;<br>flag = LA[0] + LB[0];<br>switch(flag){ /*根据参与运算的两个数的符号进行不同的操作*/<br>case 0:<br>case 2:<br>Lc[0] = LA[0];/*LA与LB同号,结果符号与LA(LB)相同*/<br>pA = LA;<br>pB = LB;<br>(1) ;<br>break;<br>case 1: /*LA与LB异号*/<br>/*比较两者的绝对值大小,结果符号与较大者相同*/<br>flag = (2) ;<br>if(flag > 0){ /*LA较大*/<br>LC[0] = LA[0];<br>pA = LA;<br>pB = LB;<br>}<br>else if(flag < 0)(/*LB较大*/<br>LC[0] = LB[0];<br>pA = LB;<br>pB = LA;<br>}<br>else{/*LA与LB相等*/<br>LC[0] = 0;<br>LC[1] = 0;<br>return 1;<br>}<br>flag = -1;<br>break;<br>default:<br>return 0;<br>break;<br>}/*switch*/<br>/*绝对值相加减*/<br>/*注意对于减法pA指向较大数,pB指向较小数,不可能出现不够减情况*/<br>(3) ;<br>N = LA[1] > LB[1] ? LA[1] : LB[1];<br>for(i = 0; i < N; i++){<br>if(i >= pA[1]){/*LA计算完毕*/<br>carry += flag * pB[i+2];<br>}<br>else if(i >= pB[1]){/*LB计算完毕*/<br>carry += pA[i+2];<br>}<br>else{<br>carry += pA[i+2] + flag * pB[i+2];<br>}<br>LC[i+2] = carry % 10;<br>carry /= 10;<br>if((4) ){/*需要借位,针对减法*/<br>LC[i+2] += 10;<br>carry--;<br>}<br>}/*for*/<br>if((5) ){/*最高进位,针对加法*/<br>LC[i+2] = carry;<br>i++;<br>}<br>if(LC[i+1] == 0) i--; /*若最高位为零,针对减法*/<br>LC[1] = i;<br>return 1;<br>};/*ADD*/


问答题

阅读下列函数说明和C代码,回答下面问题。<br>[说明]<br>冒泡排序算法的基本思想是:对于无序序列(假设扫描方向为从前向后,进行升序排列),两两比较相邻数据,若反序则交换,直到没有反序为止。一般情况下,整个冒泡排序需要进行众(1≤k≤n)趟冒泡操作,冒泡排序的结束条件是在某一趟排序过程中没有进行数据交换。若数据初态为正序时,只需1趟扫描,而数据初态为反序时,需进行n-1趟扫描。在冒泡排序中,一趟扫描有可能无数据交换,也有可能有一次或多次数据交换,在传统的冒泡排序算法及近年的一些改进的算法中[2,3],只记录一趟扫描有无数据交换的信息,对数据交换发生的位置信息则不予处理。为了充分利用这一信息,可以在一趟全局扫描中,对每一反序数据对进行局部冒泡排序处理,称之为局部冒泡排序。<br>局部冒泡排序的基本思想是:对于N个待排序数据组成的序列,在一趟从前向后扫描待排数据序列时,两两比较相邻数据,若反序则对后一个数据作一趟前向的局部冒泡排序,即用冒泡的排序方法把反序对的后一个数据向前排到适合的位置。扫描第—对数据对,若反序,对第2个数据向前冒泡,使前两个数据成为,有序序列;扫描第二对数据对,若反序,对第3个数据向前冒泡,使得前3个数据变成有序序列;……;扫描第i对数据对时,其前i个数据已成有序序列,若第i对数据对反序,则对第i+1个数据向前冒泡,使前i+1个数据成有序序列;……;依次类推,直至处理完第n-1对数据对。当扫描完第n-1对数据对后,N个待排序数据已成了有序序列,此时排序算法结束。该算法只对待排序列作局部的冒泡处理,局部冒泡算法的<br>名称由此得来。<br>以下为C语言设计的实现局部冒泡排序策略的算法,根据说明及算法代码回答问题1和问题2。<br>[变量说明]<br>define N=100 //排序的数据量<br>typedef struct{ //排序结点<br>int key;<br>info datatype;<br>......<br>}node;<br>node SortData[N]; //待排序的数据组<br>node类型为待排序的记录(或称结点)。数组SortData[]为待排序记录的全体称为一个文件。key是作为排序依据的字段,称为排序码。datatype是与具体问题有关的数据类型。下面是用C语言实现的排序函数,参数R[]为待排序数组,n是待排序数组的维数,Finish为完成标志。<br>[算法代码]<br>void Part-BubbleSort (node R[], int n)<br>{<br>int=0 ; //定义向前局部冒泡排序的循环变量<br>//暂时结点,存放交换数据<br>node tempnode;<br>for (int i=0;i<n-1;i++) ;<br>if (R[i].key>R[i+1].key)<br>{<br>(1)<br>while ((2) )<br>{<br>tempnode=R[j] ;<br>(3)<br>R[j-1]=tempnode ;<br>Finish=false ;<br>(4)<br>} // end while<br>} // end if<br>} // end for<br>} // end function<br>阅读下列函数说明和C代码,将应填入(n)处的字句写在的对应栏内。


火星搜题