问答题[问题3]
类通常不会单独存在,因此当对系统建模时,不仅要识别出类,还必须对类之间的相互关系建模。在面向对象建模中,提供了4种关系:依赖(dependency)、概括(generaliza tion)、关联(association)和聚集(aggregation)。分别说明这4种关系的含义,并说明关联和聚集之间的主要区别。
问答题【说明】 学校中有若干系,每个系有若干班级和教研室,每个教研室有若干教员,其中有的教授和副教授各带有若干研究生;每个班有若干学生,每个学生选修若干课程,每门课可由若干学生选修。
问答题【说明】清点盒子。本程序当用户输入一个整数值时,一切正常;当输入其他数值时,程序就出错。现在已做了改进,请填空。
import java. text. NumberFormat;
Public class InventoryLoop
{
public static void main(String args[])
{
String numBoxesIn;
Int numBoxes;
Double boxPrice=3.25;
Boolean gotGoodInput=false;
NumberFormat currency=NumberFormat.{{U}} (1) {{/U}};
do
{
System.out. print(“How many boxes do we have?”);
numBoxesIn=DummiesIO.{{U}} (2) {{/U}};
try
{
numBoxes=Integer.parseInt({{U}} (3) {{/U}});
system. out. print("The value is");
system.out. println(currency, format (numBoxes*boxPrice));
gotGoodInput=true;
catch({{U}} (4) {{/U}})
{
System.out.println();
System.out. println(That's not a number.");
}
}while({{U}} (5) {{/U}});//输入不正确时
System. out.println("That's that.");
}
}
问答题[说明]
本程序的函数sum(int i int total, int sigma, int rear, int d[], int n)用来从已知数组d的前n个元素中找出所有部分元素序列之和等于total的元素序列,约定数组d的元素都是正整数,且都小于等于total。
函数sum使用递归方法找出全部解答。参数i表示递归函数当前考虑元素d[i],参数sigma是调用前已选取的部分序列的元素和,参数rear是后面还未考虑的那部分元素的元素和。
函数对元素d[i]有以下两种可能的选择方案。
(1)考虑元素d[i]被包含在新的部分元素序列中的可能性。如果在当前部分元素序列之后接上d[i],新序列的元素和不超过total,则函数将d[i]包含在当前部分元素序列中。如果新的部分元素序列的元素和等于total,新的部分元素序列就是一个解答,函数将其输出;否则,若继续考虑后面的元素还有可能找到解答时,函数就递归去考虑后面的元素,寻找解答。最后,函数应恢复原来部分元素序列中不包含d[i]的状态。
(2)考虑元素d[i]不被包含在新的部分元素序列中的可能性。如果继续向d[i]之后考虑还是有希望能得到和为total的部分元素序列时,函数将新序列(不包含d[i])也作为一种可能的选择,并递归去考虑后面的元素,寻找解答。
[C程序]
#include <stdio. h>
#define N 100
int a[N];
int flg[N];
sum (int i, int total, int sigma, int rear, int d[], int t)
{
int j;
/* 考虑元素d[i]被包含在新的部分元素序列中的可能性 */
if (sigma + d[i] <=total) { /*如果d[i]与当前序列的和不超过total*/
flg[i]=1;/* d[i]被考虑在部分元素序列中 */
if (______=total) { /* 输出解 */
for (j=0; flg[j] == 0; j++) printf ("%4d = %d", total,d[j]);
for (j++; j <=i; j++) {
if (flg[j]) printf ("+%d", d[j]);
}
printf("");
} else if(i <n-1 && rear+sigma >=total)
/* 并且继续考虑后面的元素有可能找到解答时 */
sum (i+1, total, ______, rear-d[i], d, n);
______;
/* 考虑元素d[i]不被包含在新的部分元素序列中的可能性*/
if (i <n-1 && rear-d[i]+tigma >=total)
sum(i+1, total, ______, rear-d[i], d, n);
}
}
main()
{
int i, j, n, total, s, d;
printf ("输入 total! /n"); scanf ("%d",
printf ("输入 n! /n"); scanf ("%d", &n);
for (s = i = 0; i < n;) {
printf ("输入第%d个元素 > 0 且 <= %d)/n", i+1, total);
scanf ("%d", &d);
if (d < 1 || d > total) {
printf ("出错, 清重新输入! /n");
continue;
}
s+=(a[i++]=d);
}
sum (0, total, 0, ______, a, n);
printf ("/n/n");
}
问答题【说明】已知某类库开发商提供了一套类库,类库中定义了Application类和Document类,它们之间的关系如下图所示。其中,Application类表示应用程序自身,而Document类则表示应用程序打开的文档。Application类负责打开一个已有的以外部形式存储的文档,如一个文件,一旦从该文件中读出信息后,它就由一个Document对象表示。当开发一个具体的应用程序时,开发者需要分别创建自己的Application和Document子类,例如上图中的类MyApplication和类MyDocument,并分别实现Application和Document类中的某些方法。已知Application类中的openDocument方法采用了模板方法(TemplateMethod)设计模式,该方法定义了打开文档的每一个主要步骤,如下所示:1.首先检查文档是否能够被打开,若不能打开,则给出出错信息并返回;2.创建文档对象;3.通过文档对象打开文档;4.通过文档对象读取文档信息;5.将文档对象加入到Application的文档对象集合中。【C++代码】#include<iostream>#include<vector>usingnamespacestd;classDocument{public: voidsave(){/*存储文档数据,此处代码省略*/) voidopen(stringdocName){/*打开文档,此处代码省略*/) voidclose(){/*关闭文档,此处代码省略*/) virtualvoidread(stringdocName)=0;};classAppplication{private: vector<{{U}}(1){{/U}}>docs;/*文档对象集合*/public: boolcanOpenDocument(stringdocName){ /*判断是否可以打开指定文档,返回真值时表示可以打开, 返回假值表示不可打开,此处代码省略*/ } voidaddDocument(Document*aDocument){ /*将文档对象添加到文档对象集合中*/ docs.push_back({{U}}(2){{/U}}); } virtualDocument*doCreateDocument()=0;/*创建一个文档对象*/ voidopenDocument(stringdocName){/*打开文档*/ if({{U}}(3){{/U}}){ cout<<“文档无法打开!”<<endl; return; } {{U}}(4){{/U}}adoc={{U}}(5){{/U}}; {{U}}(6){{/U}}; {{U}}(7){{/U}}; {{U}}(8){{/U}}; }};
问答题【说明】流程图描述了某宽带数据专线管理系统的部分处理流程。(1)凡申请宽带数据专线使用者,均需填写专线申请表。系统把申请表存储在专线申请登记文件中,等待分配专线号。(2)系统为申请者指定专线号,并根据通信距离(按地区计算)、通信计算初装费和月租费,然后发初装通知单送给用户,并产生施工单交有关部门施工。同时产生专线处理文件。专线号是专线的唯一标识。(3)施工结束后,系统更新用户文件,并产生专线计费文件,作为以后收费的依据。(4)一个用户可以租用多条专线,用户可用现金或银行托付两种方式支付租金,但一个用户只能使用一种付款方式。系统每月按用户(而不是专线)为单位计费出账。(5)流程图中各数据文件及有关单据所含的数据项如下。专线申请表及专线中请登记文件:申请号、用户名称、付款方式,开户银行代码、账号、主端名称、主端地址、对端地址、对端所在地区、通信速率、设备接口、申请日期。专线处理文件;申请号、专线号、用户名称、付款方式、开户银行代码、账号、初装费、月租费、完工日期。初装费收据:专线号、初装费、交费日期。施工单:施工单号、专线号、主端名称、主端地址、对端所在地区,通信速率、设备接口、完工期限。完工单:施工单号、专线号、完工日期。用户文件:用户编号、用户名称、付款方式、开户银行代码、账号。专线计费文件:专线号、用户编号、月租金、开通日期。【问题1】宽带数据专线价目文件由哪些数据项组成?【问题2】为了避免在用户尚未支付初装费时就去施工,有人提议将图中从处理2产生的施工单改成从处理3产生施工单。试问从处理3能否产生施工单?为什么?【问题3】当一个用户使用多条专线时,若允许该用户对其中的一些专线采用现金支付,对另一些专线采用银行托付方式,则在尽量减少数据冗余的前提下,应如何调整有关的数据文件。
问答题【说明】设单链表的结点类和链表类的定义如下,链表不带有表头结点。请填空:
#include<iostream.h>
#include<assert.h>
template<class T>class List;
template<class T>class ListNOde{
friend {{U}}(1) {{/U}};
private:
T data;
ListNode<T> *link;
public:
ListNode():link(NULL)()
ListNOde(const T& item,ListNOde<T>*next=NULL)
:data(item),link(next){}
};
template<class T>class List{
private:
ListNode<T>*first;
void createList(T A[],int n,int i,ListNOde<T>*&p);
void printList(ListNOde<T>*p);
public:
List();
~List();
friend ostream& operator<<(ostream& ost,List<T>&L);
friend istream& operator>>(istream& ist,List<T>&L);
};
template<class T>
istream& operator>>(istream& ist,List<T>&1){
int i,n; ist>>n;
T A[n];
for(i=0;i<n;i++){{U}} (2) {{/U}};
createList(A,n,0,first);
}
template<class T>
void List<T>::createList(TA[],int n,int i,ListNOde<T>*& p){
//私有函数:递归调用建立单链表
if(i==n)p=NULL;
else{
p=new ListNode<T>(A[i]);
assert(p !=NULL);
createList({{U}} (3) {{/U}});
}
}
template<class T>
ostream& operator<<(ostream& ost,List<T>& L){
{{U}}(4) {{/U}};
}
template<class T>
void List<T>::printList(ostream& ost,ListNode<T>*p){
if(p!=NULL){
ost<<p->data;
{{U}} (5) {{/U}};
}
}
问答题{{B}}试题1~试题4是必答题{{/B}}阅读以下某网上信用卡管理系统的需求描述,根据要求回答问题1、问题2和问题3。
[说明]
某银行准备开发一个网上信用卡管理系统(CCMS),该系统的基本功能如下。
①信用卡申请。非信用卡客户填写信用卡申请表,说明所要申请的信用卡类型及申请者的基本信息,提交CCMS登录。如果信用卡申请被银行接受,客户会收到银行的确认函,并告知用户信用卡的有效期及信贷限额;否则银行会发送一封拒绝函给该客户。
客户收到确认函后,需再次登录CCMS,用信用卡号和密码激活该信用卡。激活操作结束后,CCMS将激活通知发送给客户,告知客户其信用卡是否被成功地激活。
②月报表生成。在每个月第1天的零点,CCMS为每个信用卡客户创建一份月报表,对该客户上月的信用卡交易情况及交易额进行统计。信用卡客户可以登录CCMS查看月报表,也可以要求CCMS提供打印出的月报表。
③信用卡客户信息管理。信用卡客户的个人信息可以在CCMS中进行在线的管理。每个信用卡客户可以在线查询其个人信息。
④信用卡交易记录。信用卡客户使用信息卡进行的每一笔交易都会记录在CCMS中。
⑤交易信息查询。信用卡客户可以登录CCMS查询并核实其信用卡交易记录及交易额。
问答题【说明】 有如下关系数据库: S(SNO,SN,STATUS,CITY) P(PNO,PN,COLORS,WEIGHT) J(JNO,JN,CITY) SPJ(SNO,PNO,JNO,QTY) 其中,S为供应单位,P为零件,J为工程项目,SPJ为工程订购零件的订单,其语义为:某供应单位供应某种零件给某个工程,请用SQL完成下列操作。
问答题阅读下列程序说明和C程序,将应填入 (n) 处的字句写在答卷纸的对应栏内。 【程序说明】 该程序定义了两个子函数strsort和strmerge。它们分别实现了将一个字符串按字母顺序排序和将两个字符串合并排序,并删去相同字符。在主函数里,先输入两个字符串s1和s2,然后调用strsort函数对它们分别排序,然后调用strmerge函数将s1和s2合并,将合并后的字符串赋给字符串s3,最后输出字符串s3。 【程序】 #include <stdio.h> void strmerge(char *a,char *b,char *c) //将字符串a,b合并到字符串c char t,*w; W=c; while( (1) ) //找到字符串a,b当前字符中较小的字符 if(*a<*b) t=-*a, (2) else if(*a>*b) t=*b; (3) else //字符串a,b 当前字符相等 t=-*a; a-H-; b-H-; if( (4) ) //开始,可直接赋值 *w=t; else if(t!=*w) //如果a,b中较小的当前字符与c中当前字符不相等,才赋值 (5) if(*a!='/O') //如果字符串a还没有结束,则将a的剩余部分赋给c while(*a!='/0') if(*a!=*w) *(++w)=*a; a++; else (6) if(*b!=",'/0') //如果字符串b 还没有结束,则将 b 的剩余部分赋给 c while(*b !='/0') if(*b!=*w) *(++w)=*b; b++; else b++; (7) void strsort(char *s) //将字符串 s 中的字符排序 int i,j,n; char t,*w; w=s; for(n=O;*w!='/O';n++) //得到字符串长度 n w++; for(i=O;i<n-1;i++) //对字符串 s 进行排序,按字母先后顺序 forO=i+ 1 ;j<n;j++) if( (8) t=s[i]; s[i]=s[j]; (9) void mainO char s1 [100],s2[100],s3[100]; prinff("/nlPlease input the first string:"); scanfC("% s",s1 ); prinff("/nPlease input the second string:"); scanf("%s",s2); strsort(s1); //将字符串s1 排序 strson(s2); //将字符串 s2 排序 prinff("%s/n',s1); printfC % sW',s2); s3[0]='/O'; //字符串 s3 的第一个字符先置'/0'结束标志 (10) ; //将s1和s2合并,按照字母顺序排列, prinff("%s",s3);
问答题问题:5.1 【C++代码】
#include
using namespace std;
class Invoice{
public:
(1) {
cout<<"This is the content of the invoice!"<
问答题[说明]某汽车制造工厂有两条装配线。汽车装配过程如图4-16所示,即汽车底盘进入装配线,零件在多个工位装配,结束时汽车自动完成下线工作。(1)e0和e1表示底盘分别进入装配线0和装配线1所需要的时间。(2)每条装配线有n个工位,第一条装配线的工位为S0,0,S0,1,…,S0,n-1,第二条装配线的工位为S1,0,S1,1,…,S1,n-1。其中S0,k和S1,k(0≤k≤n-1)完成相同的任务,但所需时间可能不同。(3)ai,j表示在工位Si,j处的装配时间,其中i表示装配线(i=0或i=1),j表示工位号(0≤j≤n-1)。(4)ti,j表示从Si,j处装配完成后转移到另一条装配线下一个工位的时间。(5)x0和x1表示装配结束后,汽车分别从装配线0和装配线1下线所需要的时间。(6)在同一条装配线上,底盘从一个工位转移到其下一个工位的时间可以忽略不计。图4-17所示的流程图描述了求最短装配时间的算法,该算法的输入为:n:表示装配线上的工位数;e[i]:表示e1和e2,i取值为0或1;a[i][j]:表示ai,j,i的取值为0或1,j的取值范围为0~n-1;t[i][j]:表示ti,j,i的取值为0或1,j的取值范围为0~n-1;x[i]:表示x0和x1,i取值为0或1。算法的输出为:fi:最短的装配时间;li:获得最短装配时间的下线装配线号(0或者1)。算法中使用的f[i][j]表示从开始点到Si,j处的最短装配时间。
问答题[说明]分糖果问题是一个经典问题。问题描述如下:幼儿国有n(<20)个孩子围成一圈分糖果,老师先随机地发给每个孩子若干颗糖果,然后按以下规则调整:每个孩子同时将自己手中的糖果分一半给坐在他右边的小朋友;如共有8个孩子,则第1个将原来的一半分给第2个,第2个将原有的一半分给第3个……第8个将原来的一半分给第1个,这样的平分动作同时进行;若平分前,某个孩子手中的糖果是奇数颗,则必须从老师那里要一颗,使他的糖果变成偶数。小孩人数和每个小孩的初始数由键盘输入。经过多少次调整,使每个孩子手中的糖果一样多,调整结束时每个孩子有糖果多少颗,在调整过程中老师又新增发了多少颗糖果。[C程序]#include<stdlib.h>#include<stdio.h>boolallequall(intchild[],intn)//判断各小孩子手中的糖果是否相等for(inti=0;i<n-1;i++)if(child[i]!=child[i+1])returnfalse;//不相等返回假returntrue;//相等返回真constintMaxNum=20;//定义最大人数//主函数voidmain()intNum=0;int*child;int*child1;//构造两个相应大小的数组child代表小朋友现有的粮果数child1代表小朋友原来有的糖果数intTnum=0;inti=0;doprintf("Pelaseinputthenumberofthechildren:").,scanf("%d",if(Num>MaxNum)printf("ErrorNumber!!");while(Num>MaxNum);child=newint[Nmn];child1=newint[Num];for(i=0;i<Num;i++)//将数组赋值printf("InputNO.%dchild'scandynumbers:",i+1);scanf("%d",while((1))for(i=0;i<Num;i++)if((2))(3)Tnum++;for(i=0;i<Num;i++)child1[i]=child[i];//将child1赋值用来记忆原来小朋友的粮果数for(i=0;i<Nam;i++)(4)for(i=0;i<Num-1;i++)//用循环实现前一个小朋友粮果数加后一个小朋友粮果数的一半child[i]/=2;child[i]+=child1[i+1];child[Num-1]/=2;(5)printf("每个同学最后分到糖果数目是%d/n",child[1]);printf("老师分发出的糖果是%d/n",Tnum);图12-7是一种解决问题的流程图,请根据该流程图将对应C代码(n)处补充完整。
问答题【说明】下面是某租车信息管理系统的介绍:该车库中备有若干车辆,每辆车有车号、车牌、车名、价格等属性。车库不定期地购买并注册新车供用户借用,也可将报废的旧车注销以停止租用。车库可为众多用户提供服务。每个用户在借车之前需注册姓名、地址等内容。每个用户最多可同时借3辆车。每辆车借期7天:若有一辆车超期,则不可再借其他车。一辆车超期一天罚款250元。若一辆车超期3周不归还,则发布通告。若用户借的车丢失,在罚款处理之前不能借车,每辆报失的车罚款该车目前市价(包括折旧)的1.2倍。注册新用户不受限制;而注销用户之前,该用户必须归还所有借的车,或者报失并接受罚款。【状态图1】【状态图2】
问答题[说明] 假设设A和B均为顺序表,A'和B'分别为A和B中除去最大共同前缀后的子表(例如,A=(x,y,y,z,x,z),B=(x,y,y,z,y,x,x,z),则两者中最大的共同前缀为(x,y,y,z),在两表中除去最大共同前缀后的子表分别为A'=(x,z)和B'=(y,x,x,z)。若A'=B'=空表,则A=B;若A'=空表,而 B'!=空表,或者两者均不为空表,且A'的首先小于B'的首元,则A<B;否则A>B。 下面程序实现了比较A、B大小的算法。 [C程序] #include<stdio.h> #include<stdlib.h> typedef struct linknode int data; struct linknode *next; node: node *creatlist ( ) /*建立单链表*/ node*head, *r, *s; int x; head= (node *) malloc (sizeof (node)); /建立单链表的头结点head*/ r=head; printf ("输入系列整数,以O标志结束/n"); scanf ("%d", while (x!=O) /*x==O则退出while循环*/ s=(node*) malloc (sizeof (node)); s->data=x; r->next=s; s->next=NULL; r=s; scanf ("%d", r->next=NULL; s=head; (1) ; Free (s); return head;void subs ( ) node*p, *p1, *p2, *q, *heada, *headb; heada=creatlist ( ) ; headb=creatlist ( ) ; p=heada; p1=p; /*p1指向p所指结点的前一个结点,开始时均缀向头结点*/ while (p!=NULL ) q=headb; while (q!=NULL if ( (2) ) if (p==heada) (3) ; p1=heada; else if (p->next==NULL) p1->next=NULL; /*该结点为最后一结点,删除*/ else p1->next=p->next; p2=p->next; (4) ; free (p); (5) ; else /*p所指结点的元素不在B中,则直接下移p*/ p1=p; (6) ; p=heada; /*显示删除后的结果*/if (p==NULL) printf ("两集合机减的结果为空/n");else printf ("两集合相减的结果/n");while (p!=NULL) printf ("%d", p->data); p=p->next;void main ( ) subs ( ) ;
问答题[说明] 在学校中,存在以下关系:(a)一个系有若干学生,但一个学生只能在一个系;(b)一个学生可以选修多门课程,每门课程有若干学生选修;(c)每个学生所学的每门课程都有一个成绩。 该校在学生信息管理数据库设计了三个基本表,分别为表一、表二、表三。(a)表一:学生信息表STUDENT(STID,NAME,AGE,DEPTNO),其中,STID表示学号,NAME表示学生姓名,AGE表示年龄,DEPTNO表示系号。(b)表二:课程表COURSE(COID,NAME),其中,COID表示课程号,NAME表示课程名。(c)表三:成绩表SCORE(SCID,COID,GRADE),其中,SCID表示学号,COID表示课程号, GRADE表示成绩,成绩为空时表示这学期正在上的课程。
问答题阅读下列说明,回答问题1至问题3,将解答填入对应栏内。【说明】某地区举行篮球比赛,需要开发一个比赛信息管理系统来记录比赛的相关信息。【需求分析结果】1.登记参赛。球队的信息。记录球队的名称、代表地区、成立时间等信息。系统记录球队每个队员的姓名、年龄、身高、体重等信息。每个球队有一个教练负责管理球队,一个教练仅负责一个球队。系统记录教练的姓名、年龄等信息。2.安排球队的训练信息。比赛组织者为球队提供了若干块场地,供球队进行适应性训练。系统记录现有的场地信息,包括:场地名称、场地规模、位置等信息。系统可为每个球队安排不同的训练场地,如下表所示。系统记录训练场地安排的信息。球队名称场地名称训练时间解放军一号球场2008-06-09 14:00--18:00解放军一号球场2008-06-12 09:00--12:00解放军二号球场2008-06-11 14:00--1800山西一号球场2008-06-10 09:00--12:00 3.安排比赛。该赛事聘请专职裁判,每场比赛只安排一个裁判。系统记录裁判的姓名、年龄、级别等信息。系统按照一定的规则,首先分组,然后根据球队、场地和裁判情况,安排比赛(每场比赛的对阵双方分别称为甲队和乙队)。记录参赛球队名称、比赛时间、比分、比赛场地等信息,如下表所示。 A组:甲队—乙队场地名称比赛时间裁判比分解放军—北京一号球场2008-06-1715:00李大明天津—山西一号球场2008-06-1719:00胡学梅 B组:甲队—乙队场地名称比赛时间裁判比分上海—安徽二号球场2008-06-1715:00丁鸿平山东—辽宁二号球场2008-06-1719:00郭爱琪4.所有球员、教练和裁判可能出现重名情况。【概念模型设计】根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如下:1.实体联系图(图2-1)2.关系模式教练(教练编号,姓名,年龄)队员(队员编号,姓名,年龄,身高,体重,{{U}}(a){{/U}})球队(球队名称,代表地区,成立时间,{{U}}(b){{/U}})场地(场地名称,场地规模,位置)训练记录({{U}}(c){{/U}})裁判(裁判编号,姓名,年龄,级别)比赛记录({{U}}(d){{/U}})
问答题
阅读下列说明和数据流图,回答问题1至问题3。 [说明]
图书管理系统旨在用计算机对图书进行管理,包括图书的购入、借阅、归还以及注销。管理人员可以查询某位读者、某种图书的借阅情况,还可以对当前图书借阅情况进行一些统计,给出统计表格,以便掌握图书的流通情况。
系统要实现以下四方面的功能:购入新书、读者借书、读者还书以及图书注销。
(1)购入新书:需要为该书编制图书卡片,包括分类目录号、图书流水号(要保证每本书都有唯一的流水号,即使同类图书也是如此)、书名、作者、内容摘要、价格和购书日期等信息,写入图书目录文件中。
(2)读者借书:填写借书单,包括读者号、欲借图书分类目录号,系统首先检查该读者号是否有效,若无效,则拒绝借书,否则进一步检查该读者所借图书是否超过最大限制数,若已达到最大借阅数,则拒绝借书,否则读者可以借出该书,登记图书分类目录号、图书流水号、读者号和借阅日期等,写回到借书文件中去。
(3)读者还书:根据图书流水号,从借书文件中读出和该图书相关的借阅记录,表明还书日期,再写回借书文件中;如果图书逾期未还,则处以相应罚款。
(4)图书注销:将一些过时或无保留价值的图书注销,从图书文件中删除相关记录。
(5)流通查询:管理员可以对图书流通情况进行查询,包括某位读者、某种图书和全局图书,给出流通情况统计表。
以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图1-1是顶层数据流图,图1-2是第0层数据流图,图1-3是第1层数据流图。
[图1-1]
[图1-2] [图1-3]
[数据字典]
(1)数据流条目 图书管理要求=[入库单|借书单|还书单|注销单]
入库单=分类目录号+数量+书名+作者+内容摘要+价格+购书日期 借书单=读者号+{{U}}(d){{/U}}+借阅日期
还书单={{U}}(e){{/U}}+还书日期 (2)文件说明
文件名:目录文件 组成:{分类目录号+书名+作者+内容摘要+价格+入库日期+总数+库存数+{{U}}(f){{/U}}}
问答题阅读下列说明,根据要求回答问题1~问题3。
[说明]
某企事业单位资料室需要建立一个图书管理系统,初步的需求分析结果如下:
(1)资料室有图书管理员若干名,他们负责已购入图书的编目和借还工作,每名图书管理员的信息包括工号和姓名;
(2)读者可在阅览室读书,也可通过图书流通室借还图书,读者信息包括读者ID、姓名、电话和
E-mail,系统为不同读者生成不同的读者ID;
(3)每部书在系统中对应唯一的一条图书在版编目数据(CIP,以下简称书目),书目的基本信息包括ISBN号、书名、作者、出版商、出版年月,以及本资料室拥有该书的册数(以下简称册数),不同书目的ISBN号不相同;
(4)资料室对于同一书目的图书可拥有多册(本),图书信息包括图书ID、ISBN号、存放位置、当前状态,每一本书在系统中被赋予唯一的图书ID;
(5)一名读者最多只能借阅十本图书,且每本图书最多只能借两个月,读者借书时需由图书管理员登记读者ID、所借图书ID、借阅时间和应还时间,读者还书时图书管理员在对应的借书信息中记录归还时间;
(6)当某书目的可借出图书的数量为零时,读者可以对其进行预约登记,即记录读者ID、需要借阅的图书的ISBN号、预约时间。
某书目的信息如表7-13所示,与该书目对应的图书信息如表7-14所示。
{{B}}表7-13 数目信息{{/B}}
{{B}}书名{{/B}}
{{B}}作者{{/B}}
{{B}}出版商{{/B}}
{{B}}ISBN号{{/B}}
{{B}}出版年月{{/B}}
{{B}}册数{{/B}}
{{B}}经办人{{/B}}
《数据结构》
严蔚敏
吴伟民
清华大学出版社
ISBN7-302-02368-9
1997.4
4
01
{{B}}表7-14 图书信息{{/B}}
{{B}}图书ID{{/B}}
{{B}}ISBN号{{/B}}
{{B}}存放位置{{/B}}
{{B}}状态{{/B}}
{{B}}经办人{{/B}}
C832.1
ISBN7-302-02368-9
图书流通室
已借出
01
C832.2
ISBN7-302-02368-9
图书阅览室
不外借
01
C832.3
ISBN7-302-02368-9
图书流通室
未借出
01
C832.4
ISBN7-302-02368-9
图书流通室
已预约
01
系统的主要业务处理如下。
(1)入库管理:图书购进入库时,管理员查询本资料室的书目信息,若该书的书目尚未建立,则由管理员编写该书的书目信息并输入系统,然后编写并输入图书信息;否则,修改该书目的册数,然后编写并输入图书信息,对于进入流通室的书,其初始状态为“未借出”,而送入阅览室的书的状态始终为“不外借”。
(2)借书管理:读者借书时,若有,则由管理员为该读者办理借书手续,并记录该读者的借书信息,同时将借出图书的状态修改为“已借出”。
(3)预约管理:若图书流通室没有读者要借的书,则可为该读者建立预约登记,需要记录读者ID、书的ISBN号、预约时间和预约期限(最长为10天)。一旦其他读者归还这种书,就自动通知该预约读者。系统将自动清除超出预约期限的预约记录并修改相关信息。
(4)还书管理:读者还书时,则记录相应借还信息中的“归还时间”,对于超期归还者,系统自动计算罚金(具体的计算过程此处省略)。系统同时自动查询预约登记表,若存在其他读者预约该书的记录,则将该图书的状态修改为“已预约”,并将该图书ID写入相应的预约记录中(系统在清除超出预约期限的记录时解除该图书的“已预约”状态);否则,将该图书的状态修改为“未借出”。
(5)通知处理:对于已到期且未归还的图书,系统通过E-mail自动通知读者;若读者预约的书已到,系统则自动通过E-mail通知该读者来办理借书手续。
问答题
