[语言类考试复习资料大全]中级软件设计师下午试题分类模拟5_第1页
[语言类考试复习资料大全]中级软件设计师下午试题分类模拟5_第2页
[语言类考试复习资料大全]中级软件设计师下午试题分类模拟5_第3页
[语言类考试复习资料大全]中级软件设计师下午试题分类模拟5_第4页
[语言类考试复习资料大全]中级软件设计师下午试题分类模拟5_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、书山有路勤为径,学海无涯苦作舟。祝愿天下莘莘学子:学业有成,金榜题名!语言类考试复习资料大全中级软件设计师下午试题分类模拟5中级软件设计师下午试题分类模拟5试题一问题:1. 现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接(Bridge)设计模式进行设计所得类图如图所示。 采用该设计模式的原因在于:系统解析BMP、

2、GIF与/PEG文件的代码仅与文件格式相关,而在屏幕上显示像素矩阵的代码则仅与操作系统相关。 C+代码 class Matrix /各种格式的文件最终都被转化为像素矩阵 /此处代码省略 ; class ImageImp public; virtual void doPaint(Matrix m)=0; /显示像素矩阵m ; class WinImp:public ImageImp public; void doPaint(Matrix m)/*调用Windows系统的绘制函数绘制像素矩阵*/) ; class LinuxImp:public ImageImp public; void doPa

3、int(Matrix m)/*调用Linux系统的绘制函数绘制像素矩阵*/ ) ; class Image public: void setImp(ImageImp*imp) =imp; virtual void parseFile(string fileName)=0; protected: *imp; ; class BMP:public Image public: void parseFile(string fileName) /此处解析BMP文件并获得一个像素矩阵对象m ;/显示像素矩阵m ; class GIF:public Image /此处代码省略 ; class JPEG:pu

4、blic Image /此处代码省略 ; void main() /在windows操作系统上查看demo.bmp图像文件 Image*imagel= ; ImageImp*imageImpl= ; ; image1-parseFile(demo.bmp); 现假设该系统需要支持10种格式的图像文件和5种操作系统,不考虑类Matrix,若采用桥接设计模式则至少需要设计 个类。 答案:(1)this-imp (2)ImageImp (3)imp-doPaint(m) (4)new BMP() (5)new WinImap() (6)image1-setImp(ImageImp1) (7)17解析

5、 本题考查基本面向对象设计模式的运用能力。 由文字描述和UML结构图可知BMP、GIF与JPEG是Image的子类,分别负责读取不同格式的文件。ImageImp的主要任务是将像素矩阵显示在屏幕上,它的两个子类WinImp、LinuxImp分别实现Windows系统和Linux系统上的图像显示代码。空(1)处主要设置在哪个平台上进行实现,由于该类的成员变量也是imp,与参数相同,因此应填this-imp。同理,该成员变量的类型和参数的类型应保持相同,故空(2)处应填ImageImp。空(3)处需要根据imp成员变量存储的实现对象来显示图像,应填imp-doPaint(m)。在空(4)处需要生成一

6、个BMP对象,故应填new BMP(),在空(5)处需要生成一个WinImp对象,故应填new WinImp(),空(6)处应填image1-setImp(ImageImp1),采用Bridge(桥接模式)能够将文件分析代码和图像显示代码分解在不同的类层结构中,如果不考虑Matrix等类,那么最后需要设计的类包括2个父类,分别为文件格式子类和操作系统平台类,故系统需要支持10种格式的图像文件和5种操作系统至少需要17个类。 试题二问题:1. 某大型商场内安装了多个简易的纸巾售卖机,自动出售2元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态图如图1所示。 图1 纸巾售卖机状态图 采用状态(

7、State)模式来实现该纸巾售卖机,得到如图2所示的类图。其中类State为抽象类,定义了投币、退币、出纸巾等方法接口。类SoldState、SoldOutState、NoQuarterState和HasQuarterState分别对应图1中纸巾售卖机的4种状态:售出纸巾、纸巾售完、没有投币、有2元钱。 图2 用类图 C+代码 #includeiostream using namespace std; /以下为类的定义部分 class TissueMachine; /类的提前引用 class Srate public: virtual void insertQuarter()=0; /投币 v

8、irtual void ejectQuarter()=0; /退币 virtual void turnCrank()=0; /按“出纸巾”按钮 virtual void dispense()=0; /出纸巾 ; /*类SoldOutState、NoQuarterState、HasQuarterState、SoldState的定义省略, 每个类中均 定义了私有数据成员TissueMachine*tissueMachine;*/ Class TissueMachine private: *soldOutState,*noQuarterState,*hasQuarterState,*soldStat

9、e,*State; int count; /纸巾数 public: TissueMachine(int numbers); void SetState(State* state); State* getHasQuarterState(); State* getNoQuarterState(); State* getSoldState(); State* getSoldoutState(); int getCount(); /其余代码省略 ; /以下为类的实现部分 void NoQuarterState:insertQuarter() tissueMachine-setState( ); voi

10、d HasQuarterstate:ejectQuarter() tissueMachine-setState( ); void SoldState:dispense() if(tissueMachine-getCount()0) tissueMachine-setState( ); else tissueMachine-setState( ); /其余代码省略 答案:(1)State (2)tissueMachine-getHasQuarterState() (3)tissueMachine-getNoQuarterState() (4)tissueMachine-getNoQuarterS

11、tate() (5)tissueMachine-getSoldOutState()解析 本题考查基本面向对象设计模式的运用能力。 状态设计模式主要是能够使一个对象的内在状态改变时允许改变其行为,使这个对象看起来像是改变了其类。由类图可知类State是类SoldState、SoldOutState、NoQuarterState和HasQuarterState分的父类,它抽象了这4个类的共有属性和行为。在使用中,无论是这4个类中哪个类的对象,都可被当作State对象来使用。 根据题目的描述,可以知道一个纸巾售卖机它由4种状态,分别是售出纸巾、纸巾售完、没有投币、有2元钱。 在本题中,根据程序不难知

12、道第(1)空是要定义5个对象指针,而这些对象指针都应该属于State类型,因此第一空答案为State。 第(2)在类NoQuarterState(没有投币)的insertQuarter函数中,而这个函数是投币函数,在该函数中,使用了tissueMachine类的setState方法,该方法是设置纸巾售卖机的当前状态,根据题目给出的纸巾售卖机状态图,可以知道,从没有投币状态,经过投币后,应该转换到有2元钱状态。setState方法的参数是一个State的对象,因此第(2)空应该是一个有2元钱对象,这里可以新创建一个该对象,也可以通过tissueMachine类的getHasQuarterStat

13、e方法来获得这样一个对象,所以第(2)空答案应该是tissueMachine-getHasQuarterState()或new HasQuarterState。 第(3)在类HasQuarterState(有2元钱)的ejectQuarter函数中,而这个函数是退币函数,在该函数中,也使用了tissueMachine类的setState方法,该方法是设置纸巾售卖机的当前状态,根据题目给出的纸巾售卖机状态图,可以知道,从有2元钱状态,经过退币后,应该转换到没有投币状态。而setState方法的参数是一个State的对象,因此第(3)空应该是一个没有投币对象,而这里我们可以新创建一个该对象,也可以

14、通过tissueMachine类的getNoQuarterState方法来获得这样一个对象,所以第(3)空答案应该是“tissueMachine-getNoQuarterState()”或“new NoQuarterState”。 同样的道理,可以知道第(4)空的答案是tissueMachine-getNoQuarterState()或new NoQuarterState。第(5)空的答案是tissueMachine-getSoldOutState()或new SoldOutState。 试题三问题:1. 某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算

15、费用。咖啡店所供应的咖啡及配料的种类和价格如表所示。 咖啡及配料的种类和价格表 咖 啡 价格/杯 配 料 价格/份 蒸馏咖啡(Espresso) 25 摩卡(Mocha) 10 深度烘焙咖啡(DarkRoast) 20 奶泡(Whip) 8 现采用装饰器(Decorator)模式来实现计算费用的功能,得到如图所示的类图。 用类图 C+代码 #includeiostream #includestring using namespace std; const int ESPRESSO_PRICE=25; const int DRAKROAST_PRICE=20; const int MOCHA_P

16、RICE=10; const int WHIP_PRICE=8; class Beverage /饮料 :string description; public: ()return description; ; ; class CondimentDecorator:public Beverage /配料 protected: ; ; class Espresso:public Beverage /蒸馏咖啡 public: Espresso()description=Espresso; int cost()return ESPRESSO_PRICE;) ; class DarkRoast:publ

17、ic Beverage /深度烘焙咖啡 public: DarkRoast()(description=DardRoast; int cost()return DRAKROAST_PRICE; ; class Mocha:public CondimentDecorator /摩卡 public: Mocha(Beverage*beverage)this-beverage=beverage;) string getDescription()return beverage-getDescription()+,Mocha;) int cost()return MOCHA_PRiCE+beverage

18、-cost(); ; class whip:public condimentDecorator /奶泡 publio: Whip (Beverage*beverage) this-beverage=beverage;) string getDescription() return beverage-getDescription()+,Whip; int cost()(return WHIP_PRiCE+beverage-cost(); ; int main() Beverage*beverage=new DarkRoast(); beverage=new Mocha( ); beverage=

19、new Whip( ); coutbeverage-getDescription ()¥beverage-cost()end1; return 0; 编译运行上述程序,其输出结果为: DarkRoast,Mocha,Whip¥38 答案:(1)protected (2)virtual string getDescription (3)virtual int cost()=0 (4)Beverage*beverage (5)beverage (6)beverage解析 本题考查了C+语言的应用能力和装饰设计模式的应用。 第(1)空很明显,是要说明属性description在类Beverage中的

20、类型,应该是私有的、受保护的或公有的,从后面的程序可以看出,子类中继承使用了该属性,因此这里只能定义为受保护的,因此第(1)空的答案为protected。 第(2)空处也很明显,是要给出一个函数的定义,并且该函数的函数体是“return description;”,从子类奶泡和摩卡中不难发现这个函数应该是getDescription,因此本空的答案为virtual string getDescription。 第(3)空需要结合后面各子类才能发现,在Beverage中还应该定义一个函数cost,而这个函数在Beverage中并没有实现,因此要定义为纯虚函数,所以第(3)空的答案为virtual

21、 int cost()=0。 第(4)空在类CondimentDecorator中,且是该类唯一的一条语句,而它的子类分别是奶泡和摩卡,在奶泡和摩卡这两个类中,都用到了Beverage*beverage,而在使用之前并没有说明,因此这就可以说明,Beverage*beverage是在父类CondimentDecorator中定义的,子类直接继承使用,因此第(4)空的答案为Beverage*beverage。 第(5)和第(6)空在主函数当中,其中第(5)空是要创建一个Mocha对象,应该调用的是类Mocha的构造函数。从类Mocha中,可以看出,其构造函数Mocha的参数是一个Beverage

22、类型的对象指针,而在主函数中,开始就定义了一个Beverage类型的对象指针beverage,因此这里只需填写beverage即可。同理第(6)空的答案也是beverage。 试题四问题:1. 已知某类库开发商提供了一套类库,类库中定义了Application类和Document类,它们之间的关系如图所示。其中,Application类表示应用程序自身,而Document类则表示应用程序打开的文档。Application类负责打开一个已有的以外部形式存储的文档,如一个文件,一旦从该文件中读出信息后,它就由一个Document对象表示了。 当开发一个具体的应用程序时,开发者需要分别创建自己的Ap

23、plication和Document子类。例如,图中的类MyApplication和类MyDocument,并分别实现Application和Document类中的某些方法。 已知Application类中的openDocument方法采用了模板方法(Template Method)设计模式,该方法定义了打开文档的每一个主要步骤如下: 首先检查文档是否能够被打开,若不能打开,则给出出错信息并返回。 创建文档对象。 通过文档对象打开文档。 通过文档对象读取文档信息。 将文档对象加入到Application的文档对象集合中。 Java代码 abstract class Document publi

24、c void save() /*存储文档数据,此处代码省略*/ public void open(String docName) /*打开文档,此处代码省略*/ public void close() /*关闭文档,此处代码省略*/ public abstract void read(String docName); ; abstract class Appplication private Vector docs;/*文档对象集合*/ public boolean canOpenDocument(String docName) /*判断是否可以打开指定文档,返回真值时表示可以打开,返回假值表

25、示不可打开,此处代码省略*/ public void addDocument(Document aDocument) /*将文档对象添加到文档对象集合中*/ docs.add( ); public abstract Document doCreateDocument(); /*创建一个文档对象*/ public void openDocument(String docName) /*打开文档*/ if( ) System.out.println(文档无法打开!); return; adoc= ; ; ; ; ; 答案:(1)Document (2)aDocument (3)!canOpenDo

26、cument(docName) (4)Document (5)doCreateDocument() (6)adoc.open(docName) (7)adoc.read(docName)解析 本题考查了Java语言的应用能力和模板方法设计模式。空(1)考查了Java库中Vector模板类的使用,由于Vector模板类可以存储任意类型,在定义时需要指定其存储类型,根据后面的代码,能够加入到该文档集合对象的类型为文档类型,因此空(1)处的类型应该为Document。空(2)处将文档对象加入文档集合对象中。从空(3)开始的代码属于图中Application类的OpenDocument方法,该方法是模

27、板方法,因此,需根据题目给出的步骤一一对应填空。空(3)处判断能否打开文档,需要调用父类自己的方法canOpenDocument。空(4)与空(5)所在的语句需要创建文档对象,调用doCreateDocument方法,接着通过文档对象打开和读取文档,最后通过addDocument方法将该文档对象加入到文档对象集合中。所有这些方法都是在父类或文档对象中进行定义,不涉及到具体的子类。而子类负责要实现这些模板方法中需要调用的方法以便运行时被调用。 试题五问题:1. 某大型商场内安装了多个简易的纸巾售卖机,自动出售2元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态图如图1所示。 图1 纸巾售卖机

28、状态图 采用状态(State)模式来实现该纸巾售卖机,得到如图2所示的类图。其中,类State为抽象类,定义了投币、退币、出纸巾等方法接口。类SoldState、SoldOutState、NoQuarterState和HasQuarterState分别对应图1中纸巾售卖机的4种状态:售出纸巾、纸巾售完、没有投币、有2元钱。 图2 用类图 Java代码 import java.util.*; interface State public void insertQuarter(); /投币 public void ejectQuarter(); /退币 public void turnCrank(

29、); /按下“出纸巾”按钮 public void dispense(); /出纸巾 class TissueMachine soldOutState, noQuarterstate,hasQuarterstate,soldState,state; state=soldOutState; int count=0; /纸巾数 public TissueMachine(int numbers) /*实现代码省略*/ public State getHasQuarterState() (return hasQuarterState;) public State getNoQuarterState()

30、 return noQuarterState;) public State getSoldState() return soldState;) public State getSoldOutState() return soldOutState; public int getCount() return count; /其余代码省略 class NoQuarterState implements State TissueMachine tissueMachine; public void insertQuarter() tissueMachine.setState( ); /构造方法以及其余代

31、码省略 class HasQuarterState implements State TiSsueMachine tiSsueMachine; public void ejectQuarter() tissueMachine.setState( ); /构造方法以及其余代码省略 class SoldState implements State TissueMachine tissueMachine; public void dispense() if(tissueMachine.getCount()0) tissueMachine.setState( ); else tissueMachine

32、.setState( ); 答案:(1)State (2)tissueMachine.getHasQuarterState() (3)tissueMachine.getNoQuarterState() (4)tissueMachine.getNoQuarterState() (5)tissueMachine.getSoldOutState()解析 本题考查基本面向对象设计模式的运用能力。 状态设计模式主要是能够使一个对象的内在状态改变时允许改变其行为,使这个对象看起来像是改变了其类。由类图可知类State是类SoldState、SoldOutState、NoQuarterState和HasQu

33、arterState分的父类,它抽象了这4个类的共有属性和行为。在使用中,无论是这4个类中哪个类的对象,都可被当作State对象来使用。 根据题目的描述,可以知道一个纸巾售卖机它由4种状态,分别是售出纸巾、纸巾售完、没有投币、有2元钱。 在本题中,根据程序不难知道第(1)空是要定义5个对象的引用,而这些变量都应该属于State类型,因此第一空答案为State。 第(2)在类NoQuarterState(没有投币)的insertQuarter()函数中,而这个函数是投币函数,在该函数中,使用了tissueMachine类的setState方法,该方法是设置纸巾售卖机的当前状态,根据题目给出的纸巾

34、售卖机状态图,可以知道,从没有投币状态,经过投币后,应该转换到有2元钱状态。setState方法的参数是一个State的对象,因此第(2)空应该是一个有2元钱对象,这里可以新创建一个该对象,也可以通过tissueMachine类的getHasQuarterState方法来获得这样一个对象,所以第(2)空答案应该是tissueMachine.getHasQuarterState()或new HasQuarterState。 第(3)在类HasQuarterState(有2元钱)的ejectQuarter函数中,而这个函数是退币函数,在该函数中,也使用了tissueMachine类的setStat

35、e方法,该方法是设置纸巾售卖机的当前状态,根据题目给出的纸巾售卖机状态图。可以知道,从有2元钱状态,经过退币后,应该转换到没有投币状态。setState方法的参数是一个State的对象,因此第(3)空应该是一个没有投币对象,这里可以新创建一个该对象,也可以通过tissueMachine类的getNoQuarterState方法来获得这样一个对象,所以第(3)空答案应该是tissueMachine.getNoQuarterState()或new NoQuarterState。 同样的道理,可以知道第(4)空的答案是tissueMachine.getNoQuarterState()或newNoQu

36、arterState。第(5)空的答案是tissueMachine.getSoldOutState()或new SoldOutState。 试题六问题:1. 某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表所示。 咖啡及配料的种类和价格表 咖啡 价格/杯 配料 价格/份 蒸馏咖啡(Espresso) 25 摩卡(Mocha) 10 深度烘焙咖啡(DarkRoast) 20 奶泡(Whip) 8 现采用装饰器(Decorator)模式来实现计算费用的功能,得到如图所示的类图。 用类图 Java代码 import

37、 java.util.*; class Beverage /饮料 String description=Unknown Beverage; public ()return description;) public ; abstract class CondimentDecorator extends Beverage /配料 ; class Espresso extends Beverage; /蒸馏咖啡 private final int ESPRESSO_PRICE=25; public Espress0() description=Espresso; public int cost()(

38、return ESPRESSO_PRICE; class DarkRoast extends Beverage /深度烘焙咖啡 private finalint DARKROAST PRICE=20; public DarkRoast0 description=DarkRoast; public int cost() return DARKROAST PRICE; class Mocha extends CondimentDecorator /摩卡 private final int MOCHA PRICE=10; public Mocha(Beverage beverage) this.beverage=beverage; public String getDescription() return beverage.getDescription0+,Mocha; public int cost()( return MOCHA_PRICE+beverage.cost(); class Whip extends condimentDecorator /奶泡 private finalint WHIP P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论