问答题【说明】
C++语言本身不提供对数组下标越界的判断。为了解决这一问题,在程序6中定义了相应的类模板,使得对厂任意类型的二维数组,可以在访问数组元素的同时,对行下标和列下标进行越界判断,并给出相应的提示信息。
#include<iostream.h>
template <class T> class Array;
template <class T> class ArrayBody {
friend {{U}} (1) {{/U}}
T* tpBody;
int iRows, iColumns, iCurrentRow;
ArrayBody (int iRsz, int iCsz) {
tpBody = {{U}}(2) {{/U}}
iRows = iRsz; iColumns =iCsz; iCurrentRow =-1;
}
public:
T
row_error=column_error=false;
try{
if (iCurrentRow < 0 || iCurrentRow >=iRows)
row_error=true;
if (j < 0 || j >=iColumns)
column_error=true;
if ( row_error==true || column_error == true)
{{U}} (3) {{/U}}
}
catch (char) {
if (row_error==true)
cerr << "行下标越界[" << iCurrentRow << "] ";
if (column_error== true )
cerr << "列下标越界[" <<j << "]";
cout << "/n";
}
return tpBody[iCurrentRow * iColumns +j];
};
~ArrayBody ( ) { delete[] tpBody; }
};
template <class T> class Array {
ArrayBody<T> tBody;
public:
ArrayBody<T>
}
Array (int iRsz, int iCsz) : {{U}}(5) {{/U}}{}
};
void main()
{ Array<int>a1(10,20);
Array<double>a2(3,5);
int b1;
double b2;
b1=a1[-5][10]; //有越界提示:行下标越界[-5]
b1=a1[10][15]; //有越界提示:行下标越界[10]
b1=a1[1][4]; //没有越界提示
b2=a2[2][6]; //有越界提示:列下标越界[6]
b2=s2[10][20]; //有越界提示:行下标越界[10]列下标越界[20]
b2=a2[1][4]; //没有越界提示
}
问答题阅读下列说明和图,回答问题1至问题4,将解答填入对应栏内。【说明】在线会议审稿系统(OnlineReviewingSystem,ORS)主要处理会议前期的投稿和审稿事务,其功能描述如下:1.用户在初始使用系统时,必须在系统中注册(register)成为作者或审稿人。2.作者登录(login)后提交稿件和浏览稿件审阅结果。提交稿件必须在规定提交时间范围内,其过程为先输入标题和摘要、选择稿件所属主题类型、选择稿件所在位置(存储位置)。上述几步若未完成,则重复;若完成,则上传稿件至数据库中,系统发送通知。3.审稿人登录后可设置兴趣领域、审阅稿件给出意见以及罗列录用和(或)拒绝的稿件。4.会议委员会主席是一个特殊审稿人,可以浏览提交的稿件、给审稿人分配稿件、罗列录用和(或)拒绝的稿件以及关闭审稿过程。其中,关闭审稿过程须包括罗列录用和(或)拒绝的稿件。系统采用面向对象方法开发,使用UMi进行建模。在建模用例图时,常用的方式是先识别参与者,然后确定参与者如何使用系统来确定用例,每个用例可以构造一个活动图。参与者名称、用例和活动名称分别参见以下各表。参与者列表名称说明名称说明User用户Author作者Reviewer审稿人PCChair委员会主席 用例名称列表名称说明名称说明login登录系统register注册submitpaper提交稿件browsereviewresults浏览稿件审阅结果closereviewingprocss关闭审稿过程assignpapertoreviewer分配稿件给审稿人setpreferences设定兴趣领域enterreview审阅稿件给出意见list accepted/rejectedpapers罗列录用或/和拒绝的稿件browse submittedpapers浏览提交的稿件活动名称列表名称说明名称说明selectpaperlocation选择稿件位置uploadpaper上传稿件selectsubjectgroup选择主题类型sendnotification发送通知entertitleandabstract输入标题和摘要 系统的部分用例图和提交稿件的活动图分别见下图。
问答题阅读下列说明以及图3-1和图3-2,回答问题1、问题2和问题3。
[说明] 下面是某公司开发的电梯管理系统,系统功能如下:
1.响应用户召唤指令。当用户需要电梯时可以通过按楼层面板召唤。
2.进入电梯后,乘客可以通过电梯面板选择目的楼层。
3.当电梯到达调度楼层后,判断是否响应停止运行,开启电梯门,完成调度。
4.当电梯到达非调度楼层时,不作响应,继续运行。
5.乘客在电梯中能够知道电梯的运动状态,如运动方向、电梯运行到的楼层等。 6.电梯超载报警。
系统采用面向对象方法进行开发。在开发过程中某设计室设计的电梯管理系统用例如表9-4所示。电梯管理系统用例图如图9-4所示。
{{B}}表9-4
系统用例说明{{/B}}
用例名称
描述
电梯召唤
当用户需要使用电梯时,通过按楼层面板通知电梯管理系统
目的地请求
进入电梯后,乘客可以通过电梯面板选择目的楼层
电梯到达调度楼层
当电梯到达调度楼层后,判断是否响应,如果响应则停止运行,开户电梯门,完成调度,否则继续运行
电梯到达非调度楼层
当电梯到达非调度楼层时,不作响应,继续运行
电梯就绪
电梯不处于忙状态,但符合运行要求,随时可以召唤
电梯超载
电梯所载重量超过额定载荷,给出报警信号,停止运行
电梯不超载
电梯所载重量没有超过额定载荷,可以正常运行
根据说明,回答下面问题:
问答题[问题2]
识别关联的多重度是面向对象建模过程中的一个重要步骤。根据说明中给出的描述,完成图中的(1)~(6)。
问答题阅读以下说明和数据流图,回答问题1~3问题。
[说明]
干部信息管理系统(CMIS)是用于对干部信息进行管理的特定系统。利用该系统,干部科可以对本单位干部信息进行管理,根据不同命令对信息进行增、删、改、内部调动,打印人事表格,进行统计、检索。干部科输入的系统命令需要合法性检查才能被接受、处理。系统命令可以是检索命令、统计命令、打印命令、维护命令中的任何一种。干部科的输入的干部信息数据包括输入信息、检索项、统计项、打印项、维护项等条目。一个完整的输入信息应包括干部的档号、干部的姓名、干部的性别、干部的年龄、干部的级别、干部的职称、干部的政治面貌等内容。系统进行检索处理时可以根据干部的档号、姓名或年龄进行简单检索,也可以根据“档号+姓名”或者“性别+年龄”进行组合检索。系统进行统计处理时,可以根据干部的性别、年龄或职称进行简单统计,也可以根据“年龄+职称”或“性别+职称”进行综合统计。通过系统授权,用户可以对系统进行维护。当用户需要对系统进行维护时,输入维护命令,得到合法性确认后,可以对系统数据库信息进行修改维护。维护命令包括:增加命令,根据输入信息增加干部信息;修改命令,根据修改项修改干部信息;检索命令,根据检索项检索干部信息。系统可以输出统计信息、人事表格、检索信息以供干部科用户使用。
干部信息管理系统的顶层图如图9-1所示;干部信息管理系统的第0层DFD图如图9-2所示,其中,加工3的细化图如图9-3所示。
问答题[说明]一般的树结构常采用孩子—兄弟表示法表示,即用二叉链表做树的存储结构,链表中节点的两个链域分别指向该节点的第一个孩子节点和下一个兄弟节点。例如,如图1-15(a)所示树的孩子—兄弟表示如图1-15(b)所示。函数LevelTraverse()的功能是对给定树进行层序遍历。例如,对如图1-15所示的树进行层序遍历时,节点的访问次序为DBAEFPC。对树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如表1-11所示。Bool、Status类型定义如下:树的二叉链表节点定义如下:表1-11实现队列基本操作的函数原型表函数原型说明voidInitQueue(Queue*Q)初始化队列BoolIsEmpty(QueueQ)判断队列是否为空,若是则返回true,否则返回falsevoidEnQueue(Queue*Q,TreeNodep)元素入队列voidDeQueue(Queue*Q,TreeNode*p)元素出队列[C函数程序]
问答题[说明]一般的树型结构常采用孩子-兄弟表示法表示,即用二叉链表作树的存储结构,链表中节点的两个链域分别指向该节点的第一个孩子节点和下一个兄弟节点。例如,下图(a)中所示的树的孩子-兄弟表示如下图(b)中所示。函数LeVelTraVerse()的功能是对给定树进行层序遍历。例如,对图中所示的树进行层序遍历时,节点的访问次序为DBAEFPC。对树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如下表所示。实现队列基本操作的函数原型函数原型说明voidInitQueue(Queue*Q)初始化队列boolIsEmpty(QueueQ)判断队列是否为空,若是则返回TRUE,否则返回FALSEvoidEnQueue(Queue*Q,TreeNodep)元素入队列voidDeQueue(Oueue*Q,TreeNode*p)元素出队列Bool、Status类型定义如下:typedefenum{FALSE=0,TRUE=1}Bool;typedefenum{OVERFLOW=-2,UNDERFLOW=-1,ERROR=0,OK=1}Status;树的二叉链表节点定义如下:typedefstructNode{chardata;structNode*firstchild,*nextbrother;}Node,*TreeNode;函数LevelTraverse的代码如下:StatUSLevelTraverse(TreeNoderoot){/*层序遍历树,树采用孩子-兄弟表示法,root是树根节点的指针*/QueuetempQ;TreeNodeptr,brotherptr;if(!root)returnERROR;InitQueue(______;brotherptr=root→nextbrother;while(brotherptr){EnQueue(______;}/*end-while*/while______{______;printf("%c\t",ptr→data);if(______)continue;______;brotherptr=ptr→firstchild→nextbrother;while(brotherptr){EnQueue(______;}/*end-while*/}/*end-while*/returnOK;}/*LevelTraverse*/
问答题阅读以下说明和图,回答问题1和问题2,将答案写在答卷的对应栏内。
【说明】
银行客户需要从ATM取100元,他向ATM的读卡机插卡,读卡机读取卡号,然后ATM屏幕初始化,ATM提示输入PIN(密码),客户输入PIN(123456),ATM打开他的账户,密码有效,因此ATM提示选择事务,客户选择取钱,ATM提示输入金额,客户输入100元,
ATM验证账户上有足够的钱,就从账上减去100元,ATM吐出100元,并退出客户的卡。
问答题[问题1]
数据流图8-5缺少了一条数据流,请给出此数据流的起点和终点,并采用说明中的词汇给出此数据流名。
问答题选出正确的关系代数表达式。
问答题{{B}}阅读下列说明及图13-8和图13-9,回答问题,将解答填入对应栏内。{{/B}}
【说明】 某电话公司决定开发一个管理所有客户信息的交互式网络系统。系统功能如下。
(1)浏览客户信息:任何使用Internet的网络用户都可以浏览电话公司所有的客户信息(包括姓名、住址、电话号码等)。
(2)登录:电话公司授予每个客户一个帐号。拥有授权帐号的客户,可以使用系统提供的页面设置个人密码,并使用该帐号和密码向系统注册。
(3)修改个人信息:客户向系统注册后,可以发送电子邮件或者使用系统提供的页面,对个人信息进行修改。(4)删除客户信息:只有公司的管理人员才能删除不再接受公司服务的客户的信息。系统采用面向对象方法进行开发,在开发过程中认定出的类见表13-3。
{{B}}表13-3开发过程中认定的类{{/B}}
编号
类名
描述
1
InternetClient
网络用户
2
CustomerList
客户信息表,记录公司所有客户的信息
3
Customer
客户信息,记录单个客户的信息
4
CompantCustomer
公司客户
5
InternalClient
公司的管理人员
问答题【程序说明】
对于一个公司的雇员来说,无非有3种:普通雇员、管理人员和主管。这些雇员有共同的数据:名字、每小时的工资,也有一些共同的操作:数据成员初始化、读雇员的数据成员及计算雇员的工资。但是,他们也有不同。例如.管理人员除有这些共同的特征外,有可能付固定薪水,主管除有管理人员的共同特征外,还有其他物质奖励等。3种雇员中,管理人员可以看作普通雇员的一种,而主管又可以看作管理人员的一种。我们很容易想到使用类继承来实现这个问题:普通雇员作为基类,管理人员类从普通雇员类中派生,而主管人员类又从管理人员类中派生。
下面的程序1完成上述各个类的定义,并建立了3个雇员(一个普通雇员、一个管理人员和一个主管)的档案,并打印出各自的工资表。将“程序1”中的成员函数定义为内联函数,pay成员函数定义为虚函数,重新完成上述要求。
【程序1】
//普通雇员类
class Employee
{
public:
Employee(char*theName,float thePayRate);
char * getName()const;
float getPayRate()const;
float pay(float hoursWorked)const:
protected:
char*name; //雇员名称
float payRate; //薪水等级
};
Employee::Employee(char * theName,float thePayRate)
{
name=theName;
payRate=thePayRate;
}
char*Employee::getName()const
{
return name;
}
float Employee::getPayRate()const
}
return payRate;
}
float Employee::pay(float hoursWorked)const
{
return hoursWorked * payRate;
}
//管理人员类
Class Manager:public Employee
{
public:
//isSalaried付薪方式:true付薪固定工资,false按小时付薪
Manager(char * theName,float thePayRate,bool isSalaried);
bool getSalaried()const;
float pay(float hoursWorked)const;
protected:
bool Salaried;
};
Manager::Manager(Char*theName,float thePayRate,bool isSalaried)
:Employee(theName,thePayRate)
{
salaried=isSalaried;
}
bool Manager::getSalaried() const
{
return Salaried;
}
float Manager::pay(float hoursWorked)const
{
if(salaried)
return payRate;
/*else*/
return Employee::pay(hoursWorked);
}
//主管人员类
class Supervisor:public Employee
{
public:
Supervisor(Char*theName,float thePayRate,float theBouns):
Employee(theName,thePayRate,{{U}} (1) {{/U}}),bouns(theBouns){}
float getBouns()const{return bouns;}
float pay(float hoursWorked)const
return{{U}} (2) {{/U}}
}
protected:
float bouns;
}
#include" iostream.h"
void main()
{
Employee e("Jack",50.00);
Manager m("Tom",8000.00, true);
Supervior s("Tanya",8000.00,8000.00);
cout<<"Name:" <<e.getName()<<endl;
cout<<"Pay:"<<e.pay(80)<<endl; //设每月工作80小时
tout<<"Nabe:" <<m.getName()<<end,;
cout<<"Pay:" <<m.pay(40)<<endl;
cout<<"Nabe:" <<s.getName()<<endl;
cout<<"Pay:"<<s.pay(40)<<endl; //参数40在这里不起作用
}
【程序2】
#include "employee.h"
//普通雇员类
class Employee
{
public:
//构造函数
Employee(String theName,float thePayRate):
name(theNabe),payRate(thePayRate){}
//取雇员姓名
String getNabe() const{returnname;}
//取雇员薪水等级
float getPayRate()const{return payRate;}
//计算雇员薪水
virtual float pay(float hoursWorked)const {return{{U}} (3) {{/U}};}
protected:
String name; //雇员名称
float payRate; //薪水等级
};
//管理人员类
//继承普通雇员类
class Manager:public Employee
{
public:
//构造函数
//isSalaried标识管理人员类的付薪方式
//true按阶段付薪(固定工资)
//false按小时付薪
Manager(String theName,float thePayRate,bool isSalaned):
Employee(theName,thePayRate),Salaried(isSalarled){}
//取付薪方式
bool getSalarled()const{return salaried;}
//计算薪水
virtual float pay(float{{U}} (4) {{/U}})const;
protected:
bool Salaried;
};
float Manager::pay(float hoursWorked)const
{
if(salaried) //固定付薪方式
return payRate;
else //按小时付薪
return{{U}} (5) {{/U}};}
//主管人员类
class Supervisor:{{U}} (6) {{/U}}
{
public:
//构造函数
Supervisor(String theName,float thePayRate,float theBouns):
Manager(theName,thePayRate,true),bouns(theBouns){}
//取奖金数额
float getBouns()const{return bouns;}
//计算薪水
virtual float pay(float hoursWorked)const
{
retum payRate+bouns;
}
{{U}} (7) {{/U}}
float bouns;
}
#include "employee.h"
#include"jostream.h" void main()
{
{{U}} (8) {{/U}}* ep[3];
ep[0]=new Employee("Jack","50.00");
ep[1]=Flew Manager("Tom","8000.00",true);
ep[2]=new Superwor("Tanya","8000.00","8000.00");
for(int i=0;i<3;i++){
cout<<"Name:"<<{{U}} (9) {{/U}}<<endl;
cout<<"Pay:"<<{{U}} (10) {{/U}}<<endl; //设每月工作80小时
}
}
问答题[问题2]为了记录每种图书或唱碟租借的历史记录,引入类CirculationHistory,类中存储的信息是图1-1中所表示的内容。请采用UML表示法将下列四个类间的关系表示出来。
问答题阅读以下算法说明和问题模型图,根据要求回答问题1、问题2。[说明]某大学城图书馆需要在无线阅览厅的某些位置上放置无线接入点AP(AccessPoin)。假设每个无线AP覆盖范围的半径是6米,因此必须使得每台笔记本电脑上的无线网卡到某个无线AP的直线距离不超过6米。为了简化问题,假设所有无线网卡在同一直线上,并且无线AP沿该直线放置。该问题可以建模为如图1-13所示,其中直线表示无线网卡所在的直线,实心正方形表示无线网卡。现采用贪心策略实现用尽可能少的无线AP覆盖所有的无线网卡。实现贪心算法的流程如图1-14所示。其中,①d[i](1≤i≤N)表示第i张无线网卡到通道A端的距离,N表示无线网卡的总数,无线网卡的编号按照无线网卡到通道A端的距离从小到大进行编号:②s[k]表示第k(k≥1)个无线AP到通道A端的距离。算法结束后k的值为无线AP的总数。
问答题阅读下列说明,回答问题1~问题4。【说明】某超市的销售业务由一个销售业务管理系统进行管理,该系统每完成一次交易都需要提供顾客发票,其格式见表6所示。对于这样一个销售业务管理系统,分别给出了以下两种关系数据库的设计(下划线表示主关键字)设计一:顾客Customer(顾客代码{{U}}Cno{{/U}},姓名name,住址address,联系电话phone)收银员Salesman(收银员代码{{U}}Sno{{/U}},身份证号idno,姓名name,住址address,联系电话phone)商品Merchandise(商品代码{{U}}Mno{{/U}},商品名称Mname,价格price)发票Invoice(发票号码{{U}}Ino{{/U}},交易日期Idate,顾客代码Cno,收银员代码Sno,商品代码{{U}}Mno{{/U}},单价unitpfice,数量amount)设计二:顾客Customer(顾客代码{{U}}Cno{{/U}},姓名name,住址address,联系电话phone)收银员Salesman(收银员代码Sno,身份证号idno,姓名name,住址address,联系电话phone)商品Memhandise(商品代码{{U}}Mno{{/U}},商品名称Mname,价格price)发票Ivoice(发票号码{{U}}Ino{{/U}},交易日期Idate,顾客代码Cno,收银员代码Sno)发票明细Invoicedetail(发票号码{{U}}Ino{{/U}},商品代码{{U}}Mno{{/U}},单价unitprice,数量amount)
问答题【程序5说明】
著名的四色定理指出任何平面区域图均可用四种颜色着色,使相邻区域着不同的颜色。本程序对给定的区域图找出所有可能的不超过四种颜色的着色方案。
程序中用1~4表示四种颜色。要着色的N个区域用0~N-1编号,区域相邻关系用 adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域j相邻;矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i所着颜色。
【程序5】
#include<stdio.h>
#define N 10
void output(int color[])/*输出一种着色方案*/
{ int i;
for(i=0;i<N;i++)
printf("%4d",color[i]);
printf("/n");
}
int back (int * ip,int color[])/*回溯*/
{ int c=4;
while(c==4){
if(*ip<=0)return 0;
--(*ip);
c= {{U}}(1) {{/U}};
color[*ip]=-1;
}
return c;
}
/*检查区域i,对c种颜色的可用性*/
int colorOk(int i,int c,int [][N],int color[]}
{ int j;
for(j=0;j<i;j++)
if({{U}} (2) {{/U}})
return 0;
return 1;
}
/*为区域i选一种可着的颜色*/
int select (int i,int c,int adj[][N],int color[])
{ int k;
for(k=c;k<=4;k++)
if(colorOK({{U}} (3) {{/U}}))
return k;
return 0;
}
int coloring(int adj[][N])/*寻找各种着色方案*/
{ int color[N],i,c,cnt;
for(i=0;i<N;i++)color[i] =-1;
i=c=0;cnt=0;
while(1){
if((c={{U}} (4) {{/U}})==0){
c=back(&i,color);
if(c==0)return cnt;
}else{{{U}} (5) {{/U}};i++;
if(i==N){
output(color);
++cnt;
c=back(&i,color);
}else c=0;
}
}
}
void main()
{ int adj[N][N]=
{{0,1,0,1,1,1,1,1,1,1},
{1,0,1,1,0,1,1,1,1,0},
{0,1,0,1,0,1,1,0,1,1},
{1,1,1,0,1,1,0,0,1,1},
{1,0,0,1,0,1,0,0,0,0},
{1,1,1,1,1,0,1,0,0,1},
{1,1,1,0,0,1,0,0,1,0},
{1,1,0,0,0,0,0,0,1,1},
{1,1,1,1,0,0,1,1,0,1},
{1,0,1,1,0,1,0,1,1,0}
};
printf("共有%d组解./n",coloring(adj));
}
问答题【说明】本程序实现功能:读入两个整数,第1个数除以第2个数,声明当除数为零时抛出异常类DivideByZeroException。
public class DivideByZeroException{{U}} (1) {{/U}}{
public DivideByZeroException ( ) {
super("Attcmpted to divide by zero");
}
}
import java.io. *;
public class Example {
private static int quotient(int numerator, in)/”}t denominator) throws
DivideByZeroException {
if (denominator==0)
throw{{U}} (2) {{/U}};
return(numerator / denominator);
}
public static void main(String args[]) {
int number1=0, number2=0, result0;
try{
System.out.print1n("Enter the first number:");
number1 = Integer. valueOf(Keyboard.getString()).intValue();
System.out.print1n("Enter the second number:");
number2 = Integer. Va1ueOf(Keyboard.getString()).intValue();
result = quotient(number1,number2);
}
catch (NumberFormatException e) {
System.out.print1n("Invalid integer entered!");
System. exit(-1);
}
catch ({{U}} (3) {{/U}}) {
System.out.print1n(e.to String());
System.exit(-1);
}
Systcm.out.pfint1n(number1 + "/" + number2 + "=" + result);
}
}
其中, Keyboard类的声明为:
import java.io.*;
public class Keyboard{
static BufferedReader inputStream ={{U}} (4) {{/U}}
(new InputStreamReader(System.in));
public static int getInteger() {
try(
return (Intoger.valueOf(inputStream.readLine().trim()).intValue());
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
public static String getString() {
try{
return (inputStream.readLine());
} catch ({{U}} (5) {{/U}})
{ return "0";}
}
}
问答题[说明]在某些系统中,存在非常复杂的对象,可以采用循序渐进的方式,进行组合将小对象组合成复杂的对象。以下实例展示了Builder(生成器)模式。该实例用来建立“文件”,文件内容包括:一个标题、一串字符以及一些有项目符号的项目。Builder类规定组成文件的方法,Director类利用这个方法产生一份具体的文件。图7-1显示了各个类间的关系。[图7-1]以下是C语言实现,能够正确编译通过。[C代码]typedefvoid((1))(char*title);typedefvoid(*fun2)(charitems[][10],intN);typedefchar*(*fun3)();charbuffer[500];structBuilder//构造器fun1makeTitle;(2)makeString;fun2makeItems;fun3getResult;;structDirectorstructBuilderbuilder;;char*construct((3)director)//构造文件charitems[2][10]="早安","午安";director->builder.makeTitle("Greeting");director->builder.makeString("从早上到白天结束");director->builder.makeItems(items,2);director->builder.makeString("到了晚上");strcpy(items[0],"晚安");strcpy(items[1],"好梦");director->builder.makeItems(items,2);returndirector->builder.getResult();voidTXTmakeTitle(char*title)strcat(buffer,"『");Strcat(buffer,title);strcat(buffer,"』/n/n");voidTXTmakeString(char*str)strcat(buffer,"■");Strcat(buffer,str);strcat(buffer,"/n/n");voidTXTmakeItems(charitems[][10],intN)//将items加入文件中for(inti=0,istrcat(buffer,"·");strcat(buffer,(4));strcat(buffer,"/n");strcat(buffer,"/n");char*TXTgetResult()returnbuffer;voidmain()Directordirector;(5)='/0';//清空缓冲区,使目前缓冲区中的内容不影响新生成的文件director.builder.makeTitle=TXTmakeTitle;director.builder.makeString=TXTmakeTitle;director.builder.makeItems=TXTmakeItems;director.builder.getResult=TXTgetResult;char*result=construct(printf("%s/n",result);
问答题{{B}}阅读下列说明和数据流图,回答问题1至问题3。将解答填入对应栏内。{{/B}}【说明】某图书馆管理系统的主要功能是图书管理和信息查询。对于初次借书的读者,系统自动生成读者号,并与读者基本信息(姓名、单位、地址等)一起写入读者文件。系统的图书管理功能分为四个方面:购入新书、读者借书、读者还书以及图书注销。(1)购入新书时需要为该书编制入库单。入库单内容包括图书分类目录号、书名、作者、价格、数量和购书日期,将这些信息写入图书目录文件并修改文件中的库存总量(表示到目前为止,购入此种图书的数量)。(2)读者借书时需填写借书单。借书单内容包括读者号和所借图书分类目录号。系统首先检查该读者号是否有效,若无效,则拒绝借书;若有效,则进一步检查该读者已借图书是否超过最大限制数(假设每位读者能同时借阅的书不超过5本)。若已达到最大限制数,则拒绝借书;否则允许借书,同时将图书分类目录号、读者号和借阅日期等信息写入借书文件中。(3)读者还书时需填写还书单。系统根据读者号和图书分类目录号,从借书文件中读出与该图书相关的借阅记录,标明还书日期,再写回到借书文件中。若图书逾期,则处以相应的罚款。(4)注销图书时,需填写注销单并修改图书目录文件中的库存总量。系统的信息查询功能主要包括读者信息查询和图书信息查询。其中读者信息查询可得到读者的基本信息以及读者借阅图书的情况;图书信息查询可得到图书基本信息和图书的借出情况。图书管理系统的顶层图如图13-5所示;图书管理系统的第0层DFD图如图13-6所示,其中加工2的细化图如图13-7所示。
问答题阅读下列说明、流程图和算法,将应填入(n)处的字句写在答题纸的对应栏内。【说明】下面的流程图1—5用N-S盒图形式描述了数组A中的元素被划分的过程。其划分方法是:以数组中的第一个元素作为基准数,将小于基准数的元素向低下标端移动,而大于基准数的元素向高下标端移动。当划分结束时,基准数定位于A[i],并且数组中下标小于i的元素的值均小于基准数,下标大于i的元素的值均大于基准数。设数组A的下界为low,上界为high,数组中的元素互不相同。例如,对数组(4,2,8,3,6),以4为基准数的划分过程如下:【流程图】【算法说明】将上述划分的思想进一步用于被划分出的数组的两部分,就可以对整个数组实现递增排序。设函数血p(intA[],intlow,inthigh)实现了上述流程图的划分过程并返回基准数在数组A中的下标。递归函数voidsort(intA[],ihtL;intH)的功能是实现数组A中元素的递增排序。【算法】voidsort(intA[],int1,intH)if(L<H)k=p(A,L,R)://p()返回基准数在数组A中的下标sort((4));//小于基准数的元素排序sort((5));//大于基准数的元素排序
