问答题阅读下列说明和图,回答问题1至问题4,将解答填入对应栏内。【说明】某汽车停车场欲建立一个信息系统,已经调查到的需求如下:1.在停车场的入口和出口分别安装一个自动栏杆、一台停车卡打印机、一台读卡器和一个车辆通过传感器,示意图如下:2.当汽车到达入口时,驾驶员按下停车卡打印机的按钮获取停车卡。当驾驶员拿走停车卡后,系统命令栏杆自动抬起;汽车通过入口后,入口处的传感器通知系统发出命令,栏杆自动放下。3.在停车场内分布着若干个付款机器。驾驶员将在入口处获取的停车卡插入付款机器,并缴纳停车费。付清停车费之后,将获得一张出场卡,用于离开停车场。4.当汽车到达出口时,驾驶员将出场卡插入出口处的读卡器。如果这张卡是有效的,系统命令栏杆自动抬起;汽车通过出口后,出口传感器通知系统发出命令,栏杆自动放下。若这张卡是无效的,系统不发出栏杆抬起命令而发出告警信号。5.系统自动记录停车场内空闲的停车位的数量。若停车场当前没有车位,系统将在入口处显示“车位已满”信息。这时,停车卡打印机将不再出卡,只允许场内汽车出场。根据上述描述,采用面向对象方法对其进行分析与设计,得到了如下表所示的类/用例/状态列表、下图(a)所示的用例图、图(b)所示的初始类图以及图(c)所示的描述入口自动栏杆行为的UML状态图。{{B}}类/用例/状态列表{{/B}}
问答题【说明】
以下C++程序的功能是计算三角形、矩形和正方形的面积并输出。程序由4个类组成:类 Triangle、Rectangle和Square分别表示三角形、矩形和正方形:抽象类Figure提供了一个纯虚函数getAxea(),作为计算上述3种图形面积的通用接口。
【C++代码】
#include<iostream>
#include<cmath>
using namespace std;
class Figure{
public:
virtual double getArea()=0;//纯虚函数
};
class Rectangle :{{U}} (1) {{/U}}{
protected:
double height;
double width;
public:
Rectangle(){}
Rectangle(double height, double width){
this->height=height;
this->width=width;
}
double getArea(){
return{{U}} (2) {{/U}};
}
};
class Square:{{U}} (3) {{/U}}{
public:
Square(double width){
{{U}} (4) {{/U}};
}
};
class Triangle:{{U}} (5) {{/U}}{
private:
double la,lb,lc;
public:
Triangle(double la,double lb,double lc){
this->la=la;this->1b=1b;this->lc=lc;
}
double getArea(){
double s=(la+lb+lc)/2.0;
return sqrt(s*(s-la)*(s-lb)*(s-lc));
}
int main()
{
Figure *figures[3]={new Triangle(2,3,3),new Rectangle(5,8), new Square(5)};
for(int i=0;i<3;i++){
cout<<"figures["<<i<<"]area="<<(figures[i])->getArea()<<endl;
}
return 0;
}
问答题【说明】装饰者模式动态地给一个对象添加一些额外的职责,就扩展功能而言,该模式比生成子类方式更加灵活。装饰模式的提出有助于解决滥用继承的问题。例如,一个名叫星巴兹(Starbuzz)的咖啡连锁店提供多种多样的咖啡,最朴素的设计就是采用继承,即设计一个饮料抽象基类Beverage,让不同种类的咖啡HouseBlend、Decaf、Espresso、DarkRoast继承Beverage类,如图13-23所示。Beverage类的cost()方法是抽象方法,每个子类的cost()方法实现即返回具体咖啡种类的价钱,Beverage类的description实例变量由每个子类设置,用来描述该类饮料,Beverage类的getDescription()方法用来返回此描述。客户在点咖啡时还可以要求添加各种各样的调料(Condiment),加入的调料不同所收取的费用也是不同的,让各种加了调料的不同咖啡都继承基类Beverage,当咖啡种类和调料种类很多时,组合种类的数量就会急剧增长,就会发生“类数量爆炸”现象,如图13-24所示。显然,采用这种设计方式会使得代码的维护变得十分困难,可以采用装饰者模式来解决这个问题。软件设计师蝴蝶飞根据装饰者模式的思想设计了如图13-25所示的类图。在图13-25中,将各种调料Milk、Mocha、Soy、Whip作为装饰者来装饰House-Blend、Decal、Espresso、DarkRoast等各种咖啡。下面的Java程序(代码13-6)对应其具体实现。【代码13-6】importjava.io.*;abstractclassBeverage{Stringdescription="UnknownBeverage";publicStringgetDescription(){returndescription;}public{{U}}(1){{/U}}doublecost();}abstractclassCondimentDecorator{{U}}(2){{/U}}Beverage{publicabstractStrmggetDescription();}classDecafextendsBeverage{publicDecaf(){description="DecafCoffee";}publicdoublecost(){return1.05;}}classEspressoextendsBeverage{publicEspresso(){description="Espresso";}publicdoublecost(){return1.99;}}classHouseBlendextendsBeverage{publicHouseBlend(){description="HouseBlendCoffee";}publicdoublecost(){return.89;}}classDarkRoastextendsBeverage{publicDarkRoast(){description="DarkRoastCoffee";}publicdoublecost(){return.99;}}classMochaextendsCondtmentDecorator{Beverage{{U}}(3){{/U}};publicMocha(Beveragebeverage){this.beverage=beverage;}publicStringgetDescription(){returnbeverage.getDescription()+",Mocha";}publicdoublecost(){return.20+beverage.cost();}}ClassSoyextendsCondimentDecorator{Beveragebeverage;publicSoy(Beveragebeverage){this.beverage=beverage;}publicStrillggetDescription(){returnbeverage.getDescription()+",Soy";}publicdoublecost(){return.15+beverage.cost();}}classWhipextendsCondimentDecorator{BeveragebeverageipublicWhip(Beveragebeverage){this.beverage=beverage;}publicStringgetDescrlption(){returnbeverage.getDescription()+",Whip";}publicdoublecost(){return.10+beverage.cost();}}classMilkextendsCondlmentDecorator{Beverligebeverage;publicMilk(Beveragebeverage){this.beverage=beverage;}publicStringgetDescription(){returnbeverage.getDescription()+",Milk";}publicdoublecost(){return.10+beverage.cost();}}publicclassStarbuzzCoffee{publicstaticvoidmain(Sttingargs[]){//订一杯Espresso咖啡,不需要任何调料,打印出它的描述和价钱Beveragebeverage=newEspresso();System.out.println(beverage.getDescription()+"$"+beverage.cost());//订一杯加了两份Macha调料、一份Whip调料的DarkRoast咖啡//并打印出它的描述和价钱Beveragebeverage2=newDarkRoast();beverage2=newMocha(beverage2):beverage2=new{{U}}(4){{/U}}(beverage2);beverage2=newWhip(beverage2);System.out.println(beverage2.getDescription()+"$"+beverage2.cost());//订一杯加了一份Soy调料、一份Mocha调料、一份Whip调料//的HouseBlend咖啡,并打印出它的描述和价钱Beveragebeverage3=newHouseBlend();beverage3=newSoy(beverage3);beverage3=newMocha(beverage3);beverage3=newWhip(beverage3);System.out.println(beverage3.getDescription()+"$"+beverage3.cost());}}【问题1】根据题目叙述,请将上述Java程序代码13-6中的(1)~(4)空填充完整。【问题2】请写出上述程序的输出结果。
问答题现要求实现一个能够自动生成求职简历的程序,简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同,并尽量减少程序中的重复代码。现采用原型模式(Prototype)来实现上述要求,得到如图所示的类图。[Java代码]ClassWorkExperience______Cloneable//工作简历PrivateStringworkDate;PrivateStringcompany;PublicObjectClone()______;obj.workDate=this.workDate;Obj.company-this.company;Returnobj;ClassResume______Cloneable//简历PrivateStringname;PrivateStringsex;PrivateStringage;PrivateWorkExperiencework;PublicResume(Stringname)This.name=name;work=newWorkExperience();PrivateResume(WorkExperiencework)This.woek=______;PublicvoidSetPersonallnfo(Stringsex,Stringage)/*代码略*/PublicvoidSetWorkExperience(StringworkDate,Stringcompany)/*代码省略*/PublicObjectClone()Resumeobj=______;//其余代码省略Returnobj;ClassWorkResumePublicstaticvoidmain(String[]args)Resumea=newResume("张三");a.SetPersonallnfo("男","29");a.SetWorkExperience("1998~2000","XXX公司");Resumeb=______;b.SetWorkExperience("2001~2006","YYY公司");
问答题[说明]一个新的音像商店准备向比较广泛的人群出租录像带和光碟。该商店的管理决定在计算机系统的支持下来运作。音像商店在货架上存放着题材广泛的当前流行的电影库。由于同一个电影片名可能有于不同的导演而有不同的版本,因此电影用电影代码区分,而不用电影片名;同一个版本有多份拷贝,因此音像制品用一个唯一的编号标识。某个特定的电影可以存放在录像带或光碟上,录像带和光碟的租金不同。录像带要么是Beta格式要么是VHS格式;光碟为DVD格式,容量比较大,一张光碟可以存储同一电影片名的不同版本。每个电影都有特定的租用期(用天表示),并带有在租用期内的租金。音像商店必须能够立即回答关于某个电影的库存和有多少供租用的带子或光碟。音像商店的店员负责定购音像、联系客户、音像上架,并对客户的询问给出答复。该系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图1-1是该系统的用例图,图1-2是该系统的类图的一部分。[图1-1][图1-2]
问答题[说明]有一种游戏,其规则如下:有一个3×3的方格,每个方格中只可画“+”符号或“-”符号,表示该方格的值。图1(a)定义了各方格的位置,下表为每个方格位置定义了与其相关联的位置集,各方格的初值如图1(b)所示。游戏开始后,每次可选一个值为“+”的方格位置,然后根据表中将该位置所对应的每个相关联的位置上的符号重画成与其不同的符号,即将“+”重画成“-”,将“-”重画成“+”。重画操作可用所选的位置编号来描述。例如,在如图1(b)所示的情况下,选择位置4时,重画结果如图1(c)所示。经过连续的若干次这样的操作后,当3×3方格呈现出如图1(d)所示的图形时,表示获胜;当呈现出如图1(e)所示的图形时,表示失败。图2所示的流程图旨在输出从初始状态出发直至获胜的重画操作(即所选的位置编号)序列。图中假定数组A[0..8]存放3×3方格的值,数组c[0..8][1..5]存放表中所示的各方格位置的相关联的位置集、数组d[0..8]存放各方格位置的相关联的位置个数,数组元素S[1]~S[k]存放各次重画操作所对应的位置编号,变量N存放3×3方格中当前的“+”符号的个数。方格位置及其相关位置集对照表方格位置相关位置001341012212453036413457525863467767884578
问答题【程序5说明】
设M叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根结点的值部分(设为一个字符)和用“()”括起来的各子树的列表(如有子树的话),各子列表间用“,”分隔。例如下面的三叉树可用列表a(b(c,d),e,f(g,h,i))表示。
本程序输入列表,生成一棵M叉树,并由M叉树输出列表。假定输入无错误。
【程序5】
#include<Stdio.h>
#include<Stdlib.h>
#define M 3
typedef struct node{char val;
struct node,subTree[M];
}NODE;
char buf[255],*Str=buf;
NODE * d=NULL
NODE*makeTree()/*由列表生成M叉树*/
{int k;NODE*s;
s={{U}} (1) {{/U}};
s->val= *Str++;
for(k=0;k<M;k++)s->subTree[k]=NULL;
if(* str='('){
k=0;
do{str++;
s->sub Tree[k]={{U}} (2) {{/U}};
if(*Str==')'){Str++;break;}
k=k+1;
}while({{U}} (3) {{/U}});
}
return s;
}
void walkTree(NODE*t)/*由M又树输出列表*/
{int i;
if(t!=NULL){
{{U}} (4) {{/U}}
if(t->subTree[0]==NULL)return;
putchar('(');
for(i=0;i<M;i++){
{{U}}(5) {{/U}};
if(i!=M-1&&t->subTree[i+1]!=NULL)
putchar(',');
}
putchar(')');
}
}
void main()
{printf("Enter exp:");
scanf("%s",str);
d=makeTree();
walkTree(d);putchar('/n");
}
问答题阅读下列说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。 [说明]
设某一机器由n个部件组成,每一个部件都可以从m个不同的供应商处购得。供应商j供应的部件i具有重量Wij和价格Cij。设计一个算法,求解总价格不超过上限cc的最小重量的机器组成。
采用回溯法来求解该问题:
首先定义解空间。解空间由长度为n的向量组成,其中每个分量取值来自集合{1,2,…,m},将解空间用树形结构表示。
接着从根结点开始,以深度优先的方式搜索整个解空间。从根结点开始,根结点成为活结点,同时也成为当前的扩展结点。向纵深方向考虑第一个部件从第一个供应商处购买,得到一个新结点。判断当前的机器价格(C11)是否超过上限(cc),重量(W11)是否比当前已知的解(最小重量)大,若是,应回溯至最近的一个活结点;若否,则该新结点成为活结点,同时也成为当前的扩展结点,根结点不再是扩展结点。继续向纵深方向考虑第二个部件从第一个供应商处购买,得到一个新结点。同样判断当前的机器价格(C11+C21)是否超过上限(cc),重量(W11+W21)是否比当前已知的解(最小重量)大。若是,应回溯至最近的一个活结点;若否,则该新结点成为活结点,同时也成为当前的扩展结点,原来的结点不再是扩展结点。以这种方式递归地在解空间中搜索,直到找到所要求的解或者解空间中已无活结点为止。
[C代码] 下面是该算法的C语言实现。 {{U}}
{{/U}}变量说明。 n:机器的部件数。 m:供应商数。
cc:价格上限。 w[][]:二维数组,w[i][j]表示第j个供应商供应的第i个部件的重量。
c[][]:二维数组,c[i][j]表示第j个供应商供应的第i个部件的价格。
best1W:满足价格上限约束条件的最小机器重量。 bestC:最小重量机器的价格。
bestX[]:最优解,一维数组,bestX|[i]表示第i个部件来自哪个供应商。
cw:搜索过程中机器的重量。 cp:搜索过程中机器的价格。
x[]:搜索过程中产生的解,x[i]表示第i个部件来自哪个供应商。 i:当前考虑的部件,从0~n-1。
j:循环变量。 {{U}} {{/U}}函数backtrack。
int n=3; int m=3; int cc=4;
int w[3][3]={{1,2,3},{3,2,1},{2,2,2}}; int
c[3][3]={{1,2,3},{3,2,1},{2,2,2}}; int bestW=8;
int bestC=0; int bestX[3]={0,0,0); int
cw=0; int cp=0; int x[3]={0,0,0};
int backtrack(int i){ int j=0; int
found=0; if(i>n-1){/*得到问题解*/
bestW=cw; bestC=cp;
for(j=0;j<n;j++){ {{U}} {{U}} {{/U}}
{{/U}}; } return 1; }
if(cp<=cc){/*有解*/ found=1; }
for(j=0;{{U}} {{U}} {{/U}} {{/U}};j++){
/*第i个部件从第j个供应商购买*/ {{U}} {{U}} {{/U}}
{{/U}}; cw=cw+w[i][j];
cp=cp+c[i][i][j]; if(cp<=cc&&{{U}} {{U}}
{{/U}} {{/U}}{/*深度搜索,扩展当前结点*/
if(backtrack(i+1)){found=1;} }
/*回溯*/ cw=cw-w[i][j]; {{U}} {{U}}
{{/U}} {{/U}}; } return
found; }
问答题[说明] 以下C++代码使用虚函数实现了同一基类shape派生出来的Class rectangle、Class triangle、Class circle实现了计算矩形、圆形面积的计算。仔细阅读以下代码,将 (n) 处语句补充完整。 [代码5-1]#include<iostream.h> #define PI 3.14159 class shape //基类 protected: (1) ; public: (2) ; (3) ; ; [代码5-2] class rectangle: public shape public: rectangle (int x2,int y2,int r2): (4) ; double area ( ) return x*y; ; ; class circle: public shape public: circle (int x3,int y3,int r3): (5) ; double area ( ) return r*r*PI; ; ; [代码5-3] void main ( ) rectangle r (10,20,0); circle c (0,0,30); shape (6) ; cout<<"长方形面积="<<s1->area ( ) <<endl; cout<<"圆形面积="<<s2->area ( ) <<endl; [运行结果] 长方形面积=200 圆形面积=2827.43
问答题【函数1说明】 函数compare(SqList A, SqList B)的功能是:设A=(al,…,am)和B=(b1,…,bn)均为顺序表,“比较”,两个顺序表A和B的大小。设A’ 和B’ 分别为A和B中除去最大共同前缀后的子表(例如,A=(y,x,x,z,x,z),B=(y,x,x,2,y,x,x,z),则两者中最大的共同前缀为 (y,x,x,z),在两表中除去最大共同前缀后的子表分别为A'=(x,z)和B'=(y,x,x,z))。若 A'=B'=空表,则A=B;若A'=空表,而B'≠空表,或者两者均不为空表,且A'的首元小于 B'首元,则A<B:否则A>B。 提示:算法的基本思想为:若相等,则j+1,之后继续比较后继元素;否则即可得出比较结果。显然,j的初值应为0,循环的条件是j不超出其中任何一个表的范围。若在循环内不能得出比较结果,则循环结束时有3种可能出现的情况需要区分。 【函数1】 int compare ( SqListA, SqList B) //若A<B,则返回-1;若A=B,则返回0:若A>B,则返回1 j =0; while(i< (1) else (2) ; if(A. length == B. length) return(0); else if(A. length<B. length)return(-1); else return(1)//compare //函数1的时间复杂度是 (3) 。 【函数2说明】 函数exchanse_L(SLnk&L,int m)的功能是:用尽可能少的辅助空间将单链表中前m个结点和后n个结点的互换。即将单链表(a1、a2…,am,b1,b2,…,bn)改变成(b1,b2,…,bn,a1, a2,…,am,)。【函数2】void exchange_L(SLink k=1; while( k < m++k; if( (6) //以指针ha记a1结点的位置 L -> next = p -> next; //将B1结点链接在头结点之后 p -> next = NULL; //设am的后继为空 q= (7) ; //令q指向b1结点 while(q->next)q = (8) ; //查找bn结点 q->>next= (9) ; //将a1结点链接到bn结点之后 //函数2的时间复杂度是 (10) 。
问答题快速排序是一种典型的分治算法。采用快速排序对数组A[p..r]排序的三个步骤如下:
分解:选择一个枢轴(pivot)元素划分数组。将数组A[p..r]划分为两个子数组(可能为空)A[p..q-1]和A[q+1..r],使得A[q]大于等于A[p..q-1]中的每个元素,小于A[q+1..r]中的每个元素。q的值在划分过程中计算。
递归求解:通过递归的调用快速排序,对子数组A[p..q-1]和A[q+1..r]分别排序。
合并:快速排序在原地排序,故不需合并操作。
问答题[说明] 很多时候,希望某些类只有一个或有限的几个实例,典型解决方案是所谓单身(Singleton)模式。但在多线程情况下,singleton模式有可能出现问题,需要进行同步检查。如果对“检查Singleton对象是否已经创建”进行同步,则存在严重的瓶颈,所有的线程都必须待检查对象是否存在。解决方式是一种称为Double-Checked-Locking模式,其意图是将非必须的锁定优化掉,同步检查最多只发生一次,因此不会成为瓶颈。以下是Java语言实现,能够正确编译通过。 [Java代码] public class USTax private static USTax instance = null; ______ USTax() private ______ static void doSync() if(instance == null) System.out.println ("实例不存在,创建实例..."); instance = ______; System.out.print ln ("实例创建成功"); else System.out.println ("实例已被创建了"); public static USTax getInstance() if(instance == null) System.out.println ("实例暂时不存在"); ______; / /同步控制 else System.out.println ("实例已经存在"); return ______; .
问答题【说明】栈(Stack)结构是计算机语言实现中的一种重要数据结构。对于任意栈,进行插入和删除操作的一端称为栈顶(StockTop),而另一端称为栈底(StockBottom)。栈的基本操作包括:创建栈(NewStack)、判断栈是否为空(IsEmpty)、判断栈是否已满(IsFull)、获取栈顶数据(Top)、压栈/入栈(Push)、弹栈/出栈(Pop)。当设计栈的存储结构时,可以采取多种方式。其中,采用链式存储结构实现的栈中各数据项不必连续存储(如下图所示)。以下C代码采用链式存储结构实现一个整数栈操作。【C代码】typedefstructListintdata;//栈数据structList*next;//上次入栈的数据地址List;typedefstructStackList*pTop;//当前栈顶指针Stack;Stack*NewStack()return(Stack*)calloc(1/sizeof(Stack));intIsEmpty(Stack*S)//判断栈S是否为空栈if((1))return1;return0;intTop(Stack*s)//获取栈顶数据。若栈为空,则返回机器可表示的最小整数if(IsEmpty(S))returnINT_MIN;return(2);voidPush(Stack*S,inttheData)//将数据theData压栈List*newNode;newNode=(List*)calloc(1/sizeof(List));newNode->data=theData;newNode->next=S->pTop;S->pTop=(3);voidPop(Stack*S)//弹栈List*lastTop;if(IsEmpty(S))return;lastTop=S->pTop;S->pTop=(4);free(lastTop);#defineMD(a)a<<2intmain()inti;Stack*myStack;myStack=NewStack();Push(myStack,MD(1));Push(myStack,MD(2));Pop(myStack);Push(myStack,MD(3)+1);while(!IsEmpty(myStack))printf("%d",Top(myStack));Pop(myStack);return0;以上程序运行时的输出结果为:(5)
问答题[问题1]根据以上说明设计的实体联系图如下图所示,请指出读者与图书、书目与读者、书目与图书之间的联系类型。
问答题[说明]在一些财务软件中,经常需要将阿拉伯数字的账目转化为汉语习惯中的金额计数方法,例如:“3.45”转化为“叁元四角五分”;“3.4”转化为“叁元四角”;“3.40”转化为“叁元四角零分”;“3.456”转化为“叁元四角五分”;“345.00”转化为“叁百四十五元零角零分”;“345”转化为“叁百四十五元”;以下VisualBasic代码实现了小写金额转换为大写金额。界面如图10-9所示。结合实际例子说明,仔细阅读下面代码,将(n)代码补充完整。[代码7-1]BeginVB.FormForm1Caption="小写金额转换为大写金额"//...窗体描述(略)BeginVB.CommandButtonCommand1Caption="退出"//...窗体描述(略)EndBeginVB.TextBoxText2//...窗体描述(略)EndBeginVB.TextBoxText1Enabled=0'False//…窗体描述(略)EndBeginVB.Labe1Labe12Caption="转换为大写金额"//...窗体描述(略)EndBeginVB.Labe1Labe11Caphon="请输入数字"//...窗体描述(略)EndEnd[代码7-2]PrivateFunctionsetdata(numAsInteger)AsString'数字转换SelectCaSenumCase0setdata="零"Case1Setdata="壹"Case2Setdata="贰"Case3Setdata="叁"Case4Setdata="肆"Case5Setdata="伍"Case6Setdata="陆"Case7Setdata="柒"Case8Setdata="捌"Case9Setdata="玖"EndSelectEndFunctionPrivateFunctionchang(aaaAsInteger)AsString'位数转换SelectCaSeaaaCase1chang=""Case2chang="十"Case3chang="百"Case4chang="千"Case5chang="万"Case6chang="十"Case7chang="百"Case8chang="千"Case9chang="亿"Case10chang="十"EndSelectEndFunction[代码7-3]PrivateSubText2_Change()'小写转大写DimiAsIntegerDimjAsIntegerDimmyintAsIntegerDimmyint1AsIntegerDimmydoubAsDoubleDimmystrAsStringDimmystr1AsStringDimmystr2AsStringDimmystr3AsStringDimmystr4AsStringDimmoneyAsLongDimmoney1AsIntegerDimmoney2AsLongmystr=Text2.Textmyint=InStr(mystr,".")Ifmyint=0Thenmystr=Text2.TextElsemystr3=Right(Text2.Text,Len(Text2.Text)-myint)Ifmystr3<>""Then'转换小数位mystr4=Left(mystr3,1)mystr3=Right(mystr3,Len(mystr3)-1)Ifmystr4<>"0"Then(1)EndIfIfmystr3<>""Thenmystr4=Left(mystr3,1)(2)EndIfEndIfmystr=Left(Text2.Text,myint-1)EndIfj=Len(mystr)Fori=1ToLen(mystr,i)money2=Left(mystr,i)money1=Right(money2,1)Ifmoney1=0ThenIfj=5Then(3)Else(4)EndIfElse(5)EndIfj=j-1NextiText1.Text=mystr1&"元"&mystr2'显示大写Endsub
问答题有下列关于运动会管理系统的ER图,如图10所示。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体之间的关系。假定已通过下列SQL语言建立了基本表。CREATETABLEATHLETEANAMECHAR(20),ASEXCHAR(1),ATEAMCHAR(20));CREATETABLE|TEM(INOCHAR(6)NOTNULL,INAMECHAR(20),ITIMECHAR(12),IPLACECHAR(20);CREATETABLEGAMES(ANOCHAR(6)NOTNULL,INOCHAR(6)NOTNULL,SCORRECHAR(10));为了答题的方便,图中的实体和属性同时给出了中英文两种文字,回答问题时只需写出英文名即可。【E-R图】【问题】填充下列SQL程序1~4中的(1)~(7),使它们分别完成相应的功能:程序1:统计参加比赛时男运动员人数。SELECT{{U}}(1){{/U}}FROMATHLETEWHEREASEX='M';程序2:查100872号运动员参加的所有项目及其比赛时间和地点。SELECTITEM,INO,INAME,ITIME,IPLACEFROMGAMES,ITEMWHERE{{U}}(2){{/U}};AND{{U}}(3){{/U}};程序3:查参加100035项目的所有运动员名单。SELECTANO,ANAME,ATEAMFROMATHLETEWHERE{{U}}(4){{/U}};(SELECT{{U}}(4)(5){{/U}}FROMGAMESWHEREGAMESANO=ATHLETE.ANOANDINO='100035');程序4:建立运动员成绩视图。{{U}}(6){{/U}}ATHLETE-SCOREASSELECTATHLETE,ANO,ANAME,ATEAM,INAME,SCOREFORM{{U}}(7){{/U}}WHEREATHLETE.ANO=GAMES.ANOANDGAMES.INO=ITEM.INO;
问答题【说明】 源程序中定义了Circle类与Money类,Circle类可对半径为r的圆进行周长与面积的计算,而Money类用于计算一圆形游泳池的造价。游泳池四周有原形过道,过道外围上栅栏,过道宽度为3米,根据键入的游泳池半径,每米栅栏价格及每平方米过道价格,即可计算出游泳池的造价。请按要求完成下列操作,将程序补充完整。 ①定义符号常量PI(值为3.14159f)与WIDTH(值为3.00f),分别用于表示圆周率与过道的固定宽度。 ②定义Circle类默认构造函数,把私有成员radius初始化为参数r的值。 ③完成Money类默认构造函数的定义,把私有成员FencePrice(每米栅栏的价格)、ConcretePrice(每平方米过道的价格)初始化为参数f,c的值。 ④完成Money类成员函数float Money::TotalMoney(float fencelen,float conarea)的定义,根据参数fencelen(栅栏的长度)和conarea(过道的面积),返回栅栏与过道的总造价。 注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。 源程序文件test4.cpp清单如下: #include<iostream.h> (1) class Circle private: float radius; public: (2) float Circumference()return 2 * P| * radius; float Area()return P|*radius * radius; ; class Money private: float FencePrice; float ConcretePrice; public: Money(float f,float c); float Tota|Money(float fencelen, float conarea); ; Money::Money(float f,float c) (3) float Money::Tota|Money(float fencelen, float conarea) (4) void main( ) float radius, fence, concrete; cout. setf(ios:: fixed); cout. setf(ios:: showpoint); cout. precision (2); cout << "Enter the radius of the pool:"; cin > > radius; cout << "Enter the FencePrice:"; cin > > fence; cout << "Enter the ConcretePrice: "; cin > > concrete; Circle Pool(radius); Circle PoolRim(radius + WIDTH); Money mon( fence, concrete); float totalmoney = mon. TotalMoney( PoolRim. Circumference( ), ( PoolRim. Area ( ) - Pool. Area ( ) ) ); cout << "The total money is RMB" << totalmoney << end|;
问答题试题七(共15分) 阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接(Bridge)设计模式进行设计所得类图如图7-1所示。 采用该设计模式的原因在于:系统解析BMP、GIF与JPEG文件的代码仅与文件格式相关,而在屏幕上显示像素矩阵的代码则仅与操作系统相关。 【Java代码】 classMatrix{//各种格式的文件最终都被转化为像素矩阵 //此处代码省略 }; abstractclassImageImp{ publicabstractvoiddoPaint(Matrixm);//显示像素矩阵m }; classWinImpextendsImageImp{ publicvoiddoPaint(Matrixm){/*调用windows系统的绘制函数绘制像素矩阵*/} }; classLinuxImpextendsImageImp{ publicvoiddoPaint(Matrixm){/*调用Linux系统的绘制函数绘制像素矩阵*/} }; abstractclassImage{ publicvoidsetImp(ImageImpimp){ ________=imp;} publicabstractvoidparseFile(StringfileName); protected________imp; }; classBMPextendsImage{ publicvoidparseFile(StringfileName){ //此处解析BMP文件并获得一个像素矩阵对象m ________;//显示像素矩阵m } }; classGIFextendsImage{ //此处代码省略 }; classJPEGextendsImage{ //此处代码省略 }; publicclassjavaMain{ publicstaticvoidmain(String[]args){ //在windows操作系统上查看demo.bmp图像文件 Imageimage1=________; ImageImpimageImp1=________; ________; image1.parseFile("demo.bmp"); } } 现假设该系统需要支持10种格式的图像文件和5种操作系统,不考虑类Matrix和类javaMain,若采用桥接设计模式则至少需要设计________个类。
问答题【说明】在一公文处理系统中,开发者定义了一个公文结构OfficeDoc,其中定义了公文应该具有的属性。当公文的内容或状态发生变化时,与之相关联的DocExplorer结构的值都需要发生改变。一个OfficeDoc结构能够关联一组DocExplorer结构。当OfficeDoc结构的内容或状态发生变化时,所有与之相关联的DocExplorer结构都将被更新,这种应用被称为观察者模式。以下代码采用C语言实现,能够正确编译通过。【代码13-4】#include<stdio.h>#defineOBS_MAXNUM20/*一个OfficeDoc变量最多能够关联的DocExplorer变量的个数*/typedefvoid((1))(strucOffieeDoc*,structDoeExplorer*)I;structDocExplorerfuncupdate;/*DocExplorer结构采用的更新函数*//*其它的结构字段省略*/;struetOffieeDoc(2)myObs[OBS_MAXNUM;/*存储所有与OfficeDoc相关联的DocExplorer结构指针*/intindex;/*与OffieeDoc结构变量相关联的DoeExplorer结构变量的个数*/;voidattaeh(structOfficeDoc*doc,structDocExplorer*ob)/*关联Observer结构ob与OffieeDoe结构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结构与ob结构间的关联*/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结构的值,更新代码省略*/voidupdate2(structOffieeDoc*doc,struetDocExplorer*ob)/*更新ob结构的值,更新代码省略*/voidnotifyObs(structOfficeDoc*doc)/*当doc结构的值发生变化时,通知与之关联的所有DocExplorer结构变量*/intloop;for(loop=0;loop<doc->index;loop++)(doc->myObs[loop)->update((4));voidmain()structOfficeDocdoc;/*定义一了OfficeDoe变量*/structDocExplorerexplorer1,explorer2;/*定义两个DocExplorer变量*//*初始化与OfficeDoc变量相关的DocExplorer变量个数为0*/doc.index=0;explorer1.update=update1;/*设置explorer1变量的更新函数*/explorer2.update=update2;/*设置explorer2变量的更新函数*/attach(/*关联explorer1与doc对象*/attach(/*关联explorer2与doc对象*//*其它代码省略*/(5);/*通知与OfficeDoe相关的所有DoeExploer变量*/return;
问答题[说明] ①定义私有数据成员code、english分别用于表示考生的编号、英语成绩,它们都是int型的数据。 ②完成成员函数void Student::inputinformation()的定义,该函数用于用户输入一个考生对象的信息,输入格式如下: 输入编号: 英语成绩: 计算机成绩: ③利用已实现的类Student的成员函数,完成函数void firstname(Student *A[],int uum)的定义,该函数根据考生信息A[],输出num个考生中总分最高者的编号及其相应的总分,在此不考虑总分相同的情况。 源程序文件test1.cpp清单如下: #include < iostream. h > class Student (1) int computer; int total; public void getinformation( ); void computesum( ); int getcode( ); int gettotalscore( ); ~Student( ); ; void Student: :getinformation( ) (2) cout <<"英语成绩:"; cin> >english; cout <<"计算机成绩:"; cin > > computer; void Student:: computesum ( ) total = english + computer; cout <<"编号" << code <<"总分:" <<total << endl; int Student::getcode( ) return code; int Student:: gettotalscore ( ) return total; void firstname(Student * A[] ,int num) (3) tempsum = ( * A[0] ). gettotalscore( ); for( int i=1; i <num; i++) if ( ( ( * A[i] ). gettotalscore( ) ) > tempsum) tempcode = ( * A[i] ). getcode( ); tempsum = ( * A[i] ). gettotalscore( ); cout <<"总分最高者--" << tempcode <<":" << tempsum <<endl; void main( ) Student * A[3]; int i,n =3 for(i=0;i<n;i ++) A[i] = new Student; A[i] -> getinformation( ) for(i=0;i<n;i ++) A[i] -> computesum( ) firstname ( A,3 );
