[说明]建立一个供应商零件数据库,数据库要满足如下要求:(1)供应商代码不能为空,且是值唯一的,供应商的名也是唯一的。(2)零件号不能为空,且值是唯一的,零件号不能为空。(3)一个供应商可以供应多个零件,而一个零件可以由多个供应商供应。图是该系统的E-R图。
[说明]当一元多项式中有许多系数为零时,可用一个单链表来存储,每个节点存储一个非零项的指数和对应系数。为了便于进行运算,用带头节点的单链表存储,头节点中存储多项式中的非零项数,且各节点按指数递减顺序存储。例如:多项式8x5-2x2+7的存储结构为:函数中使用的预定义符号如下:#defineEPSI1e-6structNode/*多项式中的一项*/doublec;/*系数*/inte;/*指数*/structNode*next;;typedefstruct/*多项式头节点*/intn;/*多项式不为零的项数*/structNode*head;POLY;[函数]voidDel(POLY*C,structNode*p)/*若p是空指针则删除头节点,否则删除p节点的后继*/structNode*t;/*C是空指针或C没有节点*/if(C==NULL||C->head==NULL)return;if((1))(/*删除头节点*/t=C->head;C->head=t->next;return;/*if*/t=p->next;p->next=t->next;;/*Del*/voidInsert(POLY*C,struetNode*pC)/*将pC节点按指数降序插入到多项式C中*//*若C中存在pC对应的指数项,则将系数相加;若其结果为零,则删除该节点*/structNode*t,*tp;/*pC为空指针或其系数近似为零*/if(pC==NULL||fabs(pC->c)if(C->head==NULL)/*若C为空,作为头节点插入*/C->head=pC;pC->next=NULL;C->n++;return;/*if*//*若pC的指数比头节点的还大,插入到头节点之前*/if(pC->e>C->head-)e)(2);C->head=pC;C->n++;return;/*if*/(3);t=C->head;while(t!=NULL)if(t->e>pC->e)tp=t;t=t->next;elseif(t->e==pC->e)/*C中已经存在该幂次项*/t->c+=pC->c;/*系数相加*/if(fabs(t->c)(4);/*删除对应节点*/C->n--;(5);elset=NULL;/*C中已经不存在该幂次项*//*while*/if(t==NULL)/*适当位置插入*/pC->next=tp->next;tp->next=pC;C->n++;/*if*/;/*Insert*/
[说明]图1是某医院组织的结构图。该医院分为多个病区,每个病区有一个唯一的编号,一个病区包括多个病房,多名医生;每位医生有一个唯一的编号,负责管辖其主治病人的所有病房;病人住院后给以一个唯一的编号,根据“患何病科”住在相应病区的某个病房里,有且仅有一位医生担任主治医生,除主治医生外其他医生不对其负责。现假定病区名称有“内科”和“外科”,“内科”病区又细分为多个病区,以编号区分,名称都为“内科”;“外科”病区亦然。图2是经分析得到的E-R图。图1图2
[说明]有个关于运动会的管理系统,在该系统中,委员会为每一个参赛的运动员赋以一个唯一的编号“运动员号”,同时记录姓名、性别、年龄和队名,姓名和队名必须填写。一个运动员属于且只属于一个队,一个运动员可以参赛多个项目。运动员参加比赛取得一个成绩,相应有一个积分:第一名积分6分,第二名积分4分,第三名积分2分,其他的没有积分。一个队的总积分是该队的所有队员的积分之和。下图是该系统的E-R图。图中的实体和属性同时给出了中英文两种名字,回答问题时只需写出英文名即可。
[说明]某商业银行已有一套基于客户机/服务器(C/S)模式的储蓄系统X和一套建账软件Y。建账软件Y主要用于将储蓄所手工处理的原始数据转换为系统X所需的数据格式。该建账软件具有以下功能。(1)分户账录入:手工办理业务时建立的每个分户账数据均由初录员和复录员分别录入,以确保数据的正确性。(2)初录/复录比对:将初录员和复录员录入的数据进行一一比较,并标记两套数据是否一致。(3)数据确认:当上述两套数据完全一致后,将其中任一套作为最终进入系统X的原始数据。(4)汇总核对和打印:对经过确认的数据进行汇总,并和会计账目中的相关数据进行核对,以确保数据的整体正确性,并打印输出经过确认的数据,为以后核查可能的错误提供依据。该建账软件需要打印的分户账清单样式如表3-8所示。表3-8分户账清单样式表储蓄所账号开户日户名其他分户账数据储蓄所A64361357200820109992008-08-15小郭……………储蓄所A合计共XXXX户,总余额YYYYYYY.YY元储蓄所B84361357200820098882008-08-25小谢…………储蓄所B合计共XXXX户,总余额YYYYYYY.YY元……储蓄所N……………………储蓄所N合计共XXXX户,总余额YYYYYYY.YY元(5)数据转换:将经过确认的数据转换为储蓄系统X需要的中间格式数据。(6)数据清除:为加快初录和复录的处理速度,在数据确认之后,可以有选择地清除初录员和复录员录入的数据。该软件的数据流图如图3-17~图3-19所示,图中部分数据流数据文件的格式如下。初录分户账=储蓄所号+账号+户名+开户日+开户金额+当前余额+性质复录分户账=储蓄所号+账号+户名+开户日+开户金额+当前余额+性质会计账目=储蓄所号+总户数+总余额操作结果=初录操作结果+比对操作结果+复录操作结果1.[问题1]不考虑数据确认处理(加工2),请指出图3-17~图3-19数据流图中可能存在的错误。
【说明】图书管理系统旨在用计算机对图书进行管理,包括图书的购入、借阅、归还及注销。管理人员可以查询某位读者、某种图书的借阅情况,还可以对当前图书借阅情况进行一些统计,给出统计表格,以便掌握图书的流通情况。系统要实现以下4方面的功能:购入新书、读者借书、读者还书及图书注销。(1)购入新书:需要为该书编制图书卡片,包括分类目录号、图书流水号(要保证每本书都有唯一的流水号,即使同类图书也是如此)、书名、作者、内容摘要、价格和购书日期等信息,写入图书目录文件中。(2)读者借书:填写借书单,包括读者号、欲借图书分类目录号,系统首先检查该读者号是否有效,若无效,则拒绝借书,否则进一步检查该读者所借图书是否超过最大限制数,若已达到最大借阅数,则拒绝借书,否则读者可以借出该书,登记图书分类目录号、图书流水号、读者号和借阅日期等,写回到借书文件中去。(3)读者还书:根据图书流水号,从借书文件中读出和该图书相关的借阅记录,表明还书日期,再写回借书文件中;如果图书逾期未还,则处以相应罚款。(4)图书注销:将一些过时或无保留价值的图书注销,从图书文件中删除相关记录。(5)流通查询:管理员可以对图书流通情况进行查询,包括某位读者、某种图书和全部图书,给出流通情况统计表。以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。如图9-1所示是顶层数据流图,如图9-2所示是第0层数据流图,如图9-3所示是第1层数据流图。【数据字典】(1)数据流条目图书管理要求=[入库单|借书单|还书单|注销单]入库单=分类目录号+数量+书名+作者+内容摘要+价格+购书日期借书单=读者号+(d)+借阅日期还书单=(e)+还书日期(2)文件说明文件名:目录文件组成:分类目录号+书名+作者+内容摘要+价格+入库日期+总数+库存数+(f)
阅读下列说明和图,回答问题1到问题3,将解答填入对应栏内。 [说明] 操作系统中,死锁(Deadlock)是指多个进程在运行的过程中因争夺资源而造成的一种僵局。当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 面对死锁问题有两个解决方案:预防死锁和避免死锁。 预防死锁是一种较简单和直观的事先预防方法。该方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或多个,以此来预防死锁的发生。预防死锁由于较易实现,已被广泛应用,但由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量的降低。 避免死锁同样是属于事先预防的策略,但它无须事先采取各种限制措施去破坏产生死锁的四个必要条件,而是在资源分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。 银行家算法(Banker's algorithm)是Dijkstra于1965年提出的一个经典的避免死锁的算法。形象地描述银行发放贷款不能使有限可用资金匮乏而导致整个银行无法运转的思路,也就是说每次请求贷款,银行要考虑他能否凭着贷款完成项目,并还清贷款使银行运转正常。令Request(i)是进程P(i)请求向量,如果Request(i)[j]=k则进程P(i)希望请韵类资源k个。具体算法步骤如下: (1)如果Request(i)>Need(i)则出错(请求量超过申报的最大量),否则转到(2); (2)如果Request(i)>Available则P(i)等待,否则转(3); (3)系统对P(i)所请求的资源实施试探分配,并更改数据结构中的数值; (4)Available=Available-Request(i); A1location(i) =Allocation(i) +Request(i); Need(i)=Need(i)-Request(i); (5)执行安全性算法,如果是安全的,则承认试分配,否则废除试分配,让进程P(i)继续等待。 所谓系统是安全的,是指系统中的所有进程能够按照某一种次序分配资源,并且依次运行完成,这种进程序列P1,P2,…,Pn)就是安全序列。如果存在这样一个安全序列,则系统是安全的;如果系统不存在这样一个安全序列,则系统是不安全的。
[说明]某商业银行已有一套基于客户机/服务器(C/S)模式的储蓄系统X和一套建账软件Y。建账软件Y主要用于将储蓄所手工处理的原始数据转换为系统X所需的数据格式。该建账软件具有以下功能。(1)分户账录入:手工办理业务时建立的每个分户账数据均由初录员和复录员分别录入,以确保数据的正确性。(2)初录/复录比对:将初录员和复录员录入的数据进行一一比较,并标记两套数据是否一致。(3)数据确认:当上述两套数据完全一致后,将其中任一套作为最终进入系统X的原始数据。(4)汇总核对和打印:对经过确认的数据进行汇总,并和会计账目中的相关数据进行核对,以确保数据的整体正确性,并打印输出经过确认的数据,为以后核查可能的错误提供依据。该建账软件需要打印的分户账清单样式如表3-8所示。表3-8分户账清单样式表储蓄所账号开户日户名其他分户账数据储蓄所A64361357200820109992008-08-15小郭……………储蓄所A合计共XXXX户,总余额YYYYYYY.YY元储蓄所B84361357200820098882008-08-25小谢…………储蓄所B合计共XXXX户,总余额YYYYYYY.YY元……储蓄所N……………………储蓄所N合计共XXXX户,总余额YYYYYYY.YY元(5)数据转换:将经过确认的数据转换为储蓄系统X需要的中间格式数据。(6)数据清除:为加快初录和复录的处理速度,在数据确认之后,可以有选择地清除初录员和复录员录入的数据。该软件的数据流图如图3-17~图3-19所示,图中部分数据流数据文件的格式如下。初录分户账=储蓄所号+账号+户名+开户日+开户金额+当前余额+性质复录分户账=储蓄所号+账号+户名+开户日+开户金额+当前余额+性质会计账目=储蓄所号+总户数+总余额操作结果=初录操作结果+比对操作结果+复录操作结果
填空题 如下的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) );
