问答题[说明] 很多时候,希望某些类只有一个或有限的几个实例,典型解决方案是所谓单身(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)
填空题
阅读下列说明和C程序,将应填入{{U}} (n) {{/U}}处的字句写在对应栏中。 [说明]
借助一个栈结构,可实现二叉树的非递归遍历算法。InOrderTraverse数实现中序非递归遍历,遍历
过程如下:
若不是空树,根节点入栈,进入左子树;若已经是空树,则栈顶元素出栈,访问该元素(根节点),进入该节点的右子树,继续直到遍历完成。
函数中使用的预定义符号如下: typedef struct BiTNode{
int data; struct BiTNode *iChiid,*rChiid;
} BiTNode,*BiTree; typedef struct SNode{/*链栈的节点类型*/
BiTree elem; struct SNode *next;
}SNode; [函数] int InOrderTraverse(BiTree
root) { BiTree P; SNode
*q,*stop=NULL;/*不带头节点的单链表作为栈的存储结构*/ P=root;
while(p !=NULL || stop !=NULL){ if({{U}} (1)
{{/U}}){ /*不是空树*/ q=(SNode*)malloc(sizeof q);
if(q==NULL)return-1; /*根节点指针入栈*/
{{U}} (2) {{/U}}; q->elem=P;
stop=q; P={{U}} (3) {{/U}};
/*进入根的左子树*/ }else{ q=stop;
{{U}} (4) {{/U}}; /*栈顶元素出栈*/
printf("%d|,q->elem->data); /*防问根节点*/ P={{U}}
(5) {{/U}}; /*进入根的右子树*/ free(q);
/*释放原栈顶元素*/ }/*if*/ }/*while*/
return 0; }/*InOrderTraverse*/
填空题[说明] 编写程序,把从键盘上输入的一批整数(以-1作为终止输入的标志)保存到文本文件“a: xxk1. dat”中。
{{U}} (1) {{/U}}
# include <fstream. h >
# include < stdlib. h >
void main ( ) {
{{U}} (2) {{/U}}
if ( ! four) {
cerr < <“文件没有找开!” < <end1;
exit (1);
}
int x;
cin > >x;
while({{U}} (3) {{/U}}){
{{U}} (4) {{/U}}
cin> >x;
}
{{U}}(5) {{/U}}
}
填空题阅读以下说明和c++代码,将应填入 (n) 处的字句写在答题纸对应栏内。 [说明] 很多时候,希望某些类只有一个或有限的几个实例,典型解决方案是所谓单身(Singleton)模式。但在多线程情况下,Singleton模式有可能出现问题,需要进行同步检查。如果对“检查Singleton对象是否已经创建”进行同步,则存在严重的瓶颈,所有的线程都必须等待检查对象是否存在。解决方式是一种称为Double-Checked-Locking模式,其意图是将非必须的锁定优化掉,同步检查最多只发生一次,因此不会成为瓶颈。以下是c++语言实现,能够正确编译通过。 [C++代码] class USTax (1) : USTax();//构造函数 public: static USTax* getInstance(); private: static USTax*instance; ; (2) =NULL; USTax*USTax::get Instance() if(instance==NULL) //进行某种同步 cout if( (3) ) cout instance= (4) ; cout else cout else cout return (5) ;
填空题设基本表:Student(SNo,SName,Sex,Age,Year,Major),Course(CNo,Cname,Period,Credit),Grade(SNo,CNo,Grade)通过如下SQL语句建立,请在SQL语句空缺处填入正确的内容。 CREATE TABLE Student(SNO CHAR(6)NOT NULL, SName CHAR(20), Sex CHAR(1), Age INTEGER, Year CHAR(4), Major CHAR(20), (1) ); CREATE TABLE Course(CNo CHAR(6)NOT NULL, CName CHAR(20), Period INTEGER, Credit INTEGER, (2) ); CREATE TABLE Grade(SNo CHAR(6)NOT NULL, CNo CHAR(6)NOT NULL, Grade REAL, (3) , (4) , (5) );
填空题[问题3] 能否产生“正确”结果但不可串行化的调度?
填空题[说明] 编写一工资调整程序。若基本工资大于等于800元,工资增加20%,若小于800元大于 600元,则工资增加15%,若小于600元则工资增加10%。要求在文本框Text1 中增加某职工的基本工资,单击“计算”按钮,在标签框Label1中输出增加后的工资。
Private Sub Command1_ Click( )
Dim x As Integer, y As Single
{{U}} (1) {{/U}}
Select Case x
Case Is > = 800
y=x*1.2
Case Is > = 600
y=x, 1.5
{{U}}(2) {{/U}}
y=x*1.1
{{U}}(3) {{/U}}
Label1. Caption = y
{{U}} (4) {{/U}}
Private Sub Command2_ Click()
Unload Me
End Sub
填空题[说明] 利用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%7
weekno=(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({{U}} (1) {{/U}})
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:
{
{{U}} (2) {{/U}}
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) )
{{U}} (3) {{/U}};
else
m2 =28;
int month [12]: {31 ,m2,31,30,31,30,31,31,30,31,30,31 };
{{U}} (4) {{/U}}
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)
{
{{U}} (5) {{/U}}
cout < < end1;
}
}
}
}
填空题[说明]某学校的教学系统描述如下:学生信息包括:学号(SNo)、姓名(Sname)、性别(Sex)、年龄(Age)、入学年份(Year)、主修专业(Major),其中学号是入学时唯一编定的。课程信息包括:课程号(CNo)、课程名称(CName)、学时(Period)、学分(Credit),其中课程号是唯一编定的。一个学生可选多门课,每个学生选每门课有一个成绩。图是经分析得到的E-R图。