软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷46
-
(5)
-
(4)
-
(2)
-
(3)
-
(5)
-
阅读以下说明和C代码,将应填入(n)处的字句写在对应栏内。
[说明]
函数combine(a,b,c)是计算两个整数的组合数。由于计算结果可能超出10ng整型的可表示范围,故采用数组方式存储,例如:k位长整数m用数组c[]存储结构如下:m=c[k]×10k-1+c[k-1]×10k-2+…+c[2]×10+c[1],利用c[0]存储长整数m的位数,即c[0]=k。数组的每个元素只存储长整数m的一位数字,长整数运算时,产生的中间结果的某位数字可能会大于9,这是就应该调用format将其归整,使数组中的每个元素始终只存储长整数的一位数字。
整数a和b(a>b)的组合数为:
,其中u1=a,u2]=a-1,…,ub=a-b+1,d1=1,d2=2,…,db=b。为了计算上述分式,先从u1,u2,…,ub中去掉d1×d2×…×db的因子,得到新的u1,u2,…,ub,然后再将它们相乘。
[函数]
#define NAXN 100
int gcd(int a,int b)//求两个整数a和b的最大公因子
{
if(a<b){
intC=a;a=b;b=c;
}
for(inti=b;i>=2;i--){
if( (1) )return i;
}
return 1;
void format(int *a)//将长整数数组归整
{
int i;
for(i=1;i<a[0]||a[i]>=10;i++){
if(i>=a[0]) (2);
a[i+1]+=a[i]/10;
a[i]=a[i]%10;
}
if(i>a[0]) (3);
}
void combine(int a,int b,int *C)
{
int i,J,k,x;
int d[MAXN],u[MAXN];
k=0;
for(i=a;i>=a-b+1;i--)u[++k]=i;
u[0]=b;
for(i=1;i<=b;i++)d[i]=i;
for(i=1;i<=u[0];i++){//从u中各元素去掉d中整数的因子
for(j=1;j<=b;j++){
x=gcd(u[i],d[j]);//计算最大公约数
u[i]/=X;
d[j]/=x;
}
(4);C[1]=1;//长整数c初始化
for(i=1;i<=u[0];i++)(//将u中各整数相乘,存于长整数c中
if(u[i]!=1){
for(j=1;j<=c[0];j++){
C[j]=(5);
}
format(C);//将长整数c归整
}
}
}
(1)
-
(4)
-
(3)
-
(2)
-
阅读以下说明和Jrdva代码,将应填入(n)处的字句写在对应栏内。
[说明]
在销售系统中常常需要打印销售票据,有时需要在一般的票据基础上打印脚注。这样就需要动态地添加一些额外的职责。如下展示了Decorator(修饰)模式。SalesOrder对象使用一个SalesTicket对象打印销售票据。图6-1显示了各个类间的关系。以下是Java语言实现,能够正确编译通过。
[图6-1]
[Java代码]
//Component.java文件
public (1) class Component {
abstract publ ic void prtTicket();
}
//salesTicket.java文件
public class SalesTicket extends Component{
public void prtTicket(){
//Sales ticket printing code here
System.out.printin("SalesTicket");
}
}
//Decorator.java文件
publ ic abstract class Decorator extends Component{
public void prtTicket(){
if(myComp!=null)myComp.prtTicket();
}
private (2) myComp;
public Decorator(Component myC){
myComp=myC;
}
}
//Footer.java文件
public class Footer extends Decorator {
public Footer(Component myC){
(3);
}
public void prtTicket(){
(4);
prtFooter();
}
publ ic void prtFooter(){
//place printing footer code here
System.out.println("Footer");
}
}
//salesorder.java文件
public class SalesOrder{
void prtTicket(){
Component myST;
myST=new Footer( (5) );
//Print Ticket with footers as needed
myST.prtTicket();
}
}
(1)
-
(5)
-
(4)
-
(2)
-
(3)
-
阅读下列函数说明和C++代码,将应填入(n)处的字句写在对应栏内。
[说明]
在销售系统中常常需要打印销售票据,有时需要在一般的票据基础上打印脚注。这样就需要动态地添加一些额外的职责。如下展示了Decorator(修饰)模式。SalesOrder对象使用一个SalesTicket对象打印销售票据,先打印销售票据内容,然后再打印脚注。图5-1显示了各个类间的关系。以下是C++语言实现,能够正确编译通过。
[图5-1]
[C++代码]
class Component{
public:
(1) void prtTicket()=0;
};
class SalesTicket:public Component{
public:
void prtTicket(){
cout<<"Sales Ticket!"<<endl;
}
};
class Decorator:public Component{
public:
virtual void prtTicket();
Decorator(Component *myC);
private:
(2) myComp;
};
Decorator::Decorator(Component *myC)
{
myComp=myC;
}
void Decorator::prtTicket()
{
myComp->prtTicket();
}
class Footer:public Decorator{
public:
Footer(Component *myC);
void prtTicket();
void prtFooter();
};
Footer::Footer(Component *myC): (3) {}
void Footer::prtFooter()
{
cout<<"Footer"<<endl;
}
void Footer::prtTicket()
{
(4) ;
prtFooter();
}
class SalesOrder{
public:
void prtTicket();
};
void SalesOrder::prtTicket()
{
Component *myST;
myST=new Footer( (5) );
myST->prtTicket();
}
(1)
-
若系统中有同类资源16个,有4个进程共享该资源。已知P1、P2、P3、P4所需总资源分别是8、5、9、6。各进程请求资源次序为(序号,进程,申请量):(1,P1,6)、(2,P2,4)、(3,P3,5)、(4,P4,1)、(5,P1,1)、(6,P2,1)。若用银行家算法为它们分配资源,分析每一步请求以后,各个进程还需的资源数以及系统所剩资源数,并指出系统是否安全。注,当某序号的申请导致系统不安全时,跳过该请求(拒绝该请求)继续往下判断,相当于将该进程阻塞。
-
阅读下列说明和图,回答问题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)就是安全序列。如果存在这样一个安全序列,则系统是安全的;如果系统不存在这样一个安全序列,则系统是不安全的。
简述产生死锁的四个必要条件。
-
设系统中有三种类型的资源(A,B,C)和五个进程(PO,P1,P2,P3,P4),某时刻的资源分配状态如图4-1所示。给出该时刻存在的一个安全序列。
[图4-1]
-
(2)
-
阅读下列说明和图,回答问题1至问题2,将解答填入对应栏内。
[说明]
银行的自动柜员机(ATM)的功能描述如下:
(1)金融卡与信用卡识别:包含伪卡识别以及密码验证;
(2)主菜单项:这是一台ATM最主要的人机界面,提供各项功能给客户,具体有:提款、转帐、更改密码以及存款;
(3)结束操作:客户执行完“菜单项”的功能后,可以选择“打印单据”或“不打印单据”,选好后就结束此次交易。
注意,ATM除了能处理本行的银行卡外,其他银行的银行卡也应该能处理,通过“金融中心”与其他银行主机进行数据交换。另外,为了方便,ATM还提供快捷提款,并提供代交费功能(代交费是以转帐的方式处理的)。
该系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示。
图3-1是该系统的用例图,根据题意,用题中所述术语指出图3-1中参与者A、B分别是什么,用例C、D分别是什么。
[图3-1]
-
ATM机有如下状态:空闲、银行卡验证、业务选择等待、取款金额输入、密码修改、出钞、单据打印。ATM机一般处于空闲状态,当有客户插入银行卡,则进行银行卡验证,若银行卡无效则结束服务,否则进入业务选择等待。业务有取款、修改密码等,也可以选择退出结束服务,ATM返回空闲状态。选择取款业务后,等待取款金额输入,确认后判断余额是否足够,若余额不足,则给出提示信息,并进入业务选择等待;若余额充足,则出钞,若客户需要打印单据则进入单据打印状态,否则返回业务选择等待。选择任意一个业务后,可以取消返回业务选择等待。图3-2描述了ATM状态的转变情况。
[图3-2]
请指出判定A、转换B及状态C分别是什么。
-
如下的SQL语句是用于查询“每个学生的选修课程数、总成绩、平均成绩”的不完整语句,请在空缺处填入正确的内容。
SELECT Student.SNo, (1),SUM(Grade),AVG(Grade)
FROM Student,Grade
WHERE Student.SNo=Grade.SNo,
GROUP BY (2);
(1)
-
(4)
-
若另有表Teach(CName,TName)存储教师任课情况,Tname表示教师名。用SQL创建一个含有学号、姓名、课程名、成绩、任课教师名的“主修专业为计算机CS”的学生成绩视图,并要求进行修改、插入操作时保证该视图只有计算机系的学生。请在SQL语句空缺处填入正确的内容。
CREATE VIEW SG (1)
SELECT Student.SNo,SName,Grade,Course.CName,TName
FROM Student,Grade,Teach,
WHERE (2)
AND (3)
AND Major='cs',
(4);
(1)
-
(2)
-
(3)
-
(5)
-
(4)
-
(3)
-
阅读下列说明和E-R图,回答问题1至问题3,将解答填入对应栏内。
[说明]
某学校的教学系统描述如下:
学生信息包括:学号(SNo)、姓名(Sname)、性别(Sex)、年龄(Age)、入学年份(Year)、主修专业(Major),其中学号是入学时唯一编定的。
课程信息包括:课程号(CNo)、课程名称(CName)、学时(Period)、学分(Credit),其中课程号是唯一编定的。
一个学生可选多门课,每个学生选每门课有一个成绩。图2-1是经分析得到的E-R图。
[图2-1]
设基本表: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) );
(1)
-
(2)
-
根据题意,指出图1-3(B)中缺失的数据流的名称,并指出该数据流的起点和终点。
-
根据题意,指出图1-3(A)中缺失的数据流的名称,并指出该数据流的起点和终点。
-
阅读下列说明和数据流图,回答问题1至问题3,将解答填入对应栏内。
[说明]
某供销系统接受顾客的订货单,当库存中某配件的数量小于订购量或库存量低于一定数量时,向供应商发出采货单;当某配件的库存量大于或等于订购量时,或者收到供应商的送货单时并更新了库存后,向顾客发出提货单。该系统还可随时向总经理提供销售和库存情况表。
以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图1-1是顶层数据流图,图1-2是第0层数据流图,图1-3是第1层数据流图,其中(A)是加工1的子图,(B)是加工2的子图。
[图1-1]
[图1-2]
[图1-3]
[数据字典]
(1)数据流条目
订货单=配件号+配件名+规格+数量+顾客名+地址
提货单=订货单+金额
采货单=配件号+配件名+规格+数量+供应商名+地址
送货单=配件号+配件名+规格+数量+金额
(2)文件说明
文件名:配件库存
组成:{配件号+配件名+规格+数量+允许的最低库存量}
根据题意,图1-2中哪个文件可不必画出。