问答题现要求实现一个能够自动生成求职简历的程序,简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同,并尽量减少程序中的重复代码。现采用原型模式(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。[说明]图书管理系统旨在用计算机对图书进行管理,包括图书的购入、借阅、归还以及注销。管理人员可以查询某位读者、某种图书的借阅情况,还可以对当前图书借阅情况进行一些统计,给出统计表格,以便掌握图书的流通情况。系统要实现以下四方面的功能:购入新书、读者借书、读者还书以及图书注销。(1)购入新书:需要为该书编制图书卡片,包括分类目录号、图书流水号(要保证每本书都有唯一的流水号,即使同类图书也是如此)、书名、作者、内容摘要、价格和购书日期等信息,写入图书目录文件中。(2)读者借书:填写借书单,包括读者号、欲借图书分类目录号,系统首先检查该读者号是否有效,若无效,则拒绝借书,否则进一步检查该读者所借图书是否超过最大限制数,若已达到最大借阅数,则拒绝借书,否则读者可以借出该书,登记图书分类目录号、图书流水号、读者号和借阅日期等,写回到借书文件中去。(3)读者还书:根据图书流水号,从借书文件中读出和该图书相关的借阅记录,表明还书日期,再写回借书文件中;如果图书逾期未还,则处以相应罚款。(4)图书注销:将一些过时或无保留价值的图书注销,从图书文件中删除相关记录。(5)流通查询:管理员可以对图书流通情况进行查询,包括某位读者、某种图书和全局图书,给出流通情况统计表。以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图1-1是顶层数据流图,图1-2是第0层数据流图,图1-3是第1层数据流图。[图1-1][图1-2][图1-3][数据字典](1)数据流条目图书管理要求=[入库单|借书单|还书单|注销单]入库单=分类目录号+数量+书名+作者+内容摘要+价格+购书日期借书单=读者号+(d)+借阅日期还书单=(e)+还书日期(2)文件说明文件名:目录文件组成:分类目录号+书名+作者+内容摘要+价格+入库日期+总数+库存数+(f)
[说明]建立一个供应商零件数据库,数据库要满足如下要求:(1)供应商代码不能为空,且是值唯一的,供应商的名也是唯一的。(2)零件号不能为空,且值是唯一的,零件号不能为空。(3)一个供应商可以供应多个零件,而一个零件可以由多个供应商供应。图是该系统的E-R图。
填空题 如下的SQL语句是用于查询“每个学生的选修课程数、总成绩、平均成绩”的不完整语句,请在空缺处填入正确的内容。
SELECT Student.SNo,{{U}} (1)
{{/U}},SUM(Grade),AVG(Grade) FROM
Student,Grade WHERE Student.SNo=Grade.SNo,
GROUP BY{{U}} (2) {{/U}};
填空题[问题2] 张三到图书馆借阅一本书,两个月后,他把这本逾期的书返还给图书馆。画出这个场景的时序图。
填空题[说明] 利用c++的各种控制语句编写一个万年历程序,要求:显示任何年份的日历,日历以月份顺序排列,每月以星期顺序排列,类似于一般挂历上的格式。本程序包含如下两个函数:Leap ()用于判定指定的年份是闰年,Week ()用于计算year年份的1月1日是星期几,其判定规则为:(1) 如果year 年份为1994年,则为星期六。(2) 如果year 年份大于1994年,则星期值weekno 按下列公式计算:differ=(year-1994)*(365%6)+(year-1993)/4-(year-2001)/100+(year-2001)/400 date=6+differ%7weekno=(date6)? date-7:date(3) 如果year 年份小于1994年,则星期值weekno 按下列公式计算:differ=(1994-year)*(365%7)+(1996-year)/4-(2001-year)/100+(2000-year)/400 weekno=6-dder%7 # include "iostream. h" # include "iomanip. h" int leap(int n) if( (1) ) return 0 else return 1; int week( int year ) int a1, differ, date, weekno; if (year = = 1994) a1 =0; else if (year > 1994) a1=1; else a1= -1; switch(a1) case 0: return 6; break; case 1: (2) date = 6 + differ% 7; weekno = ( date > 6) ? date - 7 date; return weekno; break; case - 1: differ = ( 1994 - year) * (365%7) + (1996 - year)/4 - (2001 - year)/100 + (2000 - year)/400; weekno =6-differ%7; return weekno; break; void main( ) int i,year,m2,n,j; cout < < “Please input 某年数:”; cin> >year; if ( ! leap(year) ) (3) ; else m2 =28; int month [12]: 31 ,m2,31,30,31,30,31,31,30,31,30,31 ; (4) for ( i=0; i<12; i+ + ) cout< < < <end1< <setw(4*n) < <"; for(j=1 ;j< =month [i] ;j+ +) cout< <setw(4) < <j; n+ +; if(n> =7) (5) cout < < end1;
填空题[问题3] 如果将上述应用的数据库设计为如下三个关系模式: R1 (A#,A1,A2,A3) R2 (B#,B1,B2) R3 (A#,B#,D1) 那么关系模式R2是否一定满足第3范式?为什么?
填空题
阅读以下说明和C++代码, [说明]
现要编写一个画矩形的程序,目前有两个画图程序:DP1和DP2,DP1用函数draw_a_line(x1,y1,x2,y2)画一条直线,DP2则用drawline(x1,x2,y1,y2)画一条直线。当实例化矩形时,确定使用DP1还是DP2。为了适应变化,包括“不同类型的形状”和“不同类型的画图程序”,将抽象部分与实现部分分离,使它们可以独立地变化。这里,“抽象部分”对应“形状”,“实现部分”对应“画图”,与一般的接口(抽象方法)与具体实现不同。这种应用称为Bridge(桥接)模式。图6-1显示了各个类间的关系。
[图6-1]
这样,系统始终只处理3个对象:Shape对象、Drawingg对象、DP1或DP2对象。以下是C++语言实现,能够正确编译通过。
[C++代码] class DP1{ public:
static void draw_a_line(double x1,double y1,double x2,double y2){
//省略具体实现 } };
class DP2{ public: static void
drawline(double x1,double x2,double y1,double y2){ //省略具体实现
} }; class Drawing{
public: {{U}} (1) {{/U}}void
drawLine(double x1,double y1,double x2,double y2)=0; };
class V1Drawing:public Drawing{ public:
void drawLine(double x1,double y1,double x2,double y2){
DP1::draw_a_line(x1,y1,x2,y2); }
}; class V2Drawing:public Drawing{
public: void drawLine(double x1,double y1,double
x2,double y2){ {{U}} (2) {{/U}} }
}; class Shape{ privatc:
{{U}} (3) {{/U}}dp; public:
Shape(Drawing*dp); virtual void draw()=0;
void drawLine(double x1,double y1,double x2,double y2);
}; Shape::Shape(Drawing*dp) {
_dp=dp; } void Shape::drawLine(double
x1,double y1,double x2,double y2) { //画一条直线
{{U}} (4) {{/U}}; }
class Rectangle:public Shape{ privatc:
double_x1,_y1,_x2,_y2; public:
Rectangle(Drawing *dp,double x1,double y1, double
x2,double y2); void draw(); };
Rectangle::Rectangle(Drawing*dp,double x1,double y1,double x2,double y2)
:{{U}} (5) {{/U}} {
_x1=x1;_y1=yl;_x2=x2;_y2=y2; } void
Rectangle::draw() { //省略具体实现
}
填空题[说明] 编写一个字符界面的Java Application 程序,接受用户输入的10个整数,并输出这10个整数的最大值和最小值。
import java. io. * ;
public class abc
{
public static void main(String args [ ] )
{ int i, n = 10 , max = 0 , min = 0 , temp = 0;
try {
BufferedReader br = new BufferedReader(
new InputStreamReader( System. in) );
{{U}}(1) {{/U}});
} catch ( IOException e ) { } ;
for(i = 2 ;i <= n; i ++ ) {
try {
BufferedReader br = new BufferedReader(
new InputStreamReader (System. in) );
temp = Integer. parselnt(br. readLine( ) );
if ( temp > max ){{U}} (2) {{/U}}
if (temp < min){{U}} (3) {{/U}}
} catch ( IOExeeption e ) { } ;
System. out. println( "max =" + max + "/nmin =" + min);
}
}
填空题[问题1] 若这三个事务允许并行执行,则请列举出有多少可能的正确结果。
填空题[说明] 假设二叉树采用链式存储方式存储,编写一个后序遍历二叉树的非递归方式。 Void postorder (btree * B) btree * stack [m0] , *p; int tag [m0], top =0; p=b; do while (p! =NULL) top+ +; (1) tag [top] =0; p =p- >left; if (top >0) (2) if (tag[top3 = =1) (3) print ("%d", p- >data); if(top>0) (4) tag [top] = 1; while (p! = NULL && top ! =0)