问答题[说明]请完成流程图以描述在数据A(1)至A(10)中求最大数和次大数的程序的算法。并将此改成PAD图。该算法的流程图如下图:
问答题[问题3](2分)
对于某些需求量非常大的小木屋或营地,说明中功能4的赔偿金计算规则,不足以弥补取消预定所带来的损失。如果要根据预定的时段以及所预定场地的需求量,设计不同层次的赔偿金计算规则,需要对图3-2进行怎样的修改? (请用文字说明)
问答题【说明】某供销系统接受顾客的订货单,当库存中某配件的数量小于订购量或库存量低于一定数量时,向供应商发出采货单;当某配件的库存量大于或等于订购量时,或者收到供应商的送货单时并更新了库存后,向顾客发出提货单。该系统还可随时向总经理提供销售和库存情况表。以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图9-8是顶层数据流图,图9-9所示是第0层数据流图,图9-10是第1层数据流图,其中(A)是加工1的子图,(B)是加工2的子图。【数据字典】(1)数据流条目订货单=配件号+配件名+规格+数量+顾客名+地址提货单=订货单+金额采货单=配件号+配件名+规格+数量+供应商名+地址送货单=配件号+配件名+规格+数量+金额(2)文件说明文件名:配件库存组成:配件号+配件名+规格+数量+允许的最低库存量1.【问题1】根据题意,图9-9中哪个文件可不必画出。
问答题【问题3】
写出OrderDetail中的关键项。
问答题阅读下列说明和数据流图,回答问题1至问题3,将解答填入对应栏内。[说明]某供销系统接受顾客的订货单,当库存中某配件的数量小于订购量或库存量低于一定数量时,向供应商发出采货单;当某配件的库存量大于或等于订购量时,或者收到供应商的送货单时并更新了库存后,向顾客发出提货单。该系统还可随时向总经理提供销售和库存情况表。以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图1-1是顶层数据流图,图1-2是第0层数据流图,图1-3是第1层数据流图,其中(A)是加工1的子图,(B)是加工2的子图。[图1-1][图1-2][图1-3][数据字典](1)数据流条目订货单=配件号+配件名+规格+数量+顾客名+地址提货单=订货单+金额采货单=配件号+配件名+规格+数量+供应商名+地址送货单=配件号+配件名+规格+数量+金额(2)文件说明文件名:配件库存组成:{配件号+配件名+规格+数量+允许的最低库存量}
问答题【说明】有时我们希望给某个对象而不是整个类添加一些功能。例如,一个图形用户界面工具箱允许你对任意一个用户界面组件添加一些特性,例如边框,或是一些行为,例如窗口滚动。使用继承机制是添加功能的一种有效途径,从其他类继承过来的边框特性可以被多个子类的实例所使用。但这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的方式和时机。一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象添加边框。我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。它将客户请求转发给该组件,并且可能在转发前后执行一些额外的动作(例如画二个边框)。透明性使得你可以递归地嵌套多个装饰,从而可以添加任意多的功能。装饰对象结构模式的意图就是动态地给一个对象添加一些额外的职责。就增加功能来说,该模式相比生成子类更为灵活。其示意类图如图13-22所示。程序代码13-5是该模式的一个示例,说明了如何实现用户接口装饰,函数的实现全部省略。程序中定义了VisualComponent的一个子类Decorator,我们将生成Decorator的子类以获取不同的装饰。VisualComponent类是一个描述可视对象的抽象类,它描述了绘制和事件处理的接口。Decorator的子类定义了特殊的装饰功能,BorderDecorator子类给可视组件添加一个边框,ScrollDecorator给可视组件添加滚动功能。【程序代码13-5】{{U}}(1){{/U}};classWindow{public:roidSetContents(VisualComponent*contents);};//VisualComponent类是一个描述可视对象的抽象类classVisllalComponent{public:VisualComponent(){};{{U}}(2){{/U}}voidDraw(){};VirtualvoidResize(){};};classDecorator:publicVisualComponent{public:Decorator(){//…};Decorator(VisualComponent*vcom){//…};virtualvoldDraw();virtualvoldResize();private:/*Decorator装饰由VisualComponent的指针实现,其在Decorator的构造函数中初始化*/VisualComponent{{U}}(3){{/U}};};voldDecorator::Draw(){{{U}}(4){{/U}};//缺省实现}voidDecorator::Resize(){component->Resize();//缺省实现}//BorderDecorator子类为它所包含的组件添加一个边框classBorderDecorator:publicDecorator{public:BorderDecorator(VisualComponent*vcom,intborderWidth){//…};VirtualVoidDraw();private:voidDrawBorder(int);private:intborderWidth;};voidBorderDecorator::Draw(){Decorator::Draw();DrawBorder(_width);}VoidBorderDecorator::DrawBorder(intWidth){//…)VoidWindow::SetConterlts(VlsualComponent*contents){//…}//SerollDecorat给可视组件添加滚动功能classScroliDecoratOr:publicDecorator{public:ScrollDecorator(VlsualComponent*vcom){//…};//…);classTextView:publicVisualComponent{//…};voidmain(void){//创建一个正文视图以及放入这个正文视图的窗口Window*window=newWindow;TcxtView*textView=newTextView;//TextView是一个VisualComponent,它可以放入窗口中window->SetContents(textView);//得到一个有边界的和可以滚动的TextView,边界宽为1window->SetContents({{U}}(5){{/U}});}
问答题
阅读下列程序和控制流图,将应填入{{U}} (n)
{{/U}}的字句写在答题纸的对应栏内。 【程序】
下面是一段求最大值的程序,其中datalist是数据表,n是datalist的长度+ int
GetMax (int n, int datalist[]) { int
k=0; for (int j=1;j<n;j++)
if (datalist[j] > datalist[k])
k=j;
retum k; 【控制流图】
问答题[说明]背包问题就是有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,而且选中物品的价值之和为最大。背包问题是一个典型的NP完全难题。对该问题求解方法的研究无论是在理论上,还是在实践中都具有一定的意义。如管理中的资源分配、投资决策、装载问题等均可建模为背包问题。常用的背包问题求解方法很多,但本题中采用了一种新的算法来求解背包问题。该算法思想为:首先要对物品进行价重比排序,然后按价重比从大到小依次装进包裹。这种方法并不能找到最佳的方案,因为有某些特殊情况存在,但只要把包中重量最大的物品取出,继续装入,直到达到limitweight,这时的物品就是limitweight的最大价值。这种算法不需要逐个进行试探,所以在数据非常大时,执行效率主要由排序的时间复杂度决定。该算法的流程图为图11-4。仔细阅读程序说明和C程序流程图及源码,回答问题1和问题2。[流程图11-4][程序说明]structThing:物品结构typedefstructBag:背包结构类型input():将物品按序号依次存入数组函数inbag():物品按物价比入包函数init():初始化函数sort():对物品按价格重量比排序函数outbag():取出包中weiht最大的物品函数print():最佳方案输出函数[C程序]#defineN255structThingdoubleweight;doublevalue;doubledens;thing[N];typedefstmctBagThingthing[N];doubleweighttmp;doublesumvalue;bag,best;inbag()dobag.thing[i]=thing[i](1)(2)i++;while((3))init()for(inti=0;i<N;i++)input(thing[i].weight,thing[i].value)thing[i].dens=thing[i].value/thing[i].weight;;main()init();sort();inbag();dobest=bag;//把包中物品放入暂存数组outbag();//取出包中weight最大的物品(4)while((5))print(best);//输出temp因为是最佳方案1.[问题1]根据程序说明及流程图、部分C源码,充分理解算法思想,填入(n)处。
问答题阅读下列说明和数据流图,回答问题1~问题3。【说明】某考务处理系统主要功能是考生管理和成绩管理:1.对考生送来的报名表进行检查。2.对合格的报名表编好准考证号码后将准考证送给考生,将汇总后的考生名单送给阅卷站。3.对阅卷站送来的成绩表进行检查,并根据考试中心指定的合格标准审定合格者。4.填写考生通知单(内容包含该考生的准考证号、姓名、各课程成绩及最终合格/不合格标志),送给考生。5.根据考生信息及考试成绩,按地区、年龄、文化程度和职业进行成绩分类统计及试题难度分析,产生统计分析表。考务处理系统的顶层图如图1所示,第0层图如图2所示,加工2子图如图3所示。【数据流图】
问答题【说明】已知某企业欲开发一家用电器遥控系统,即用户使用一个遥控器即可控制某些家用电器的开与关。遥控器如左下所示。该遥控器共有4个按钮,编号分别是0至3,按钮0和2能够遥控打开电器1和电器2,按钮1和3则能遥控关闭电器1和电器2。由于遥控系统需要支持形式多样的电器,因此,该系统的设计要求具有较高的扩展性。现假设需要控制客厅电视和卧室电灯,对该遥控系统进行设计所得类图如右下所示。右上图中,类RomoteController的方法onPressButton(intbutton)表示当遥控器按键按下时调用的方法,参数为按键的编号;Command接口中on和off方法分别用于控制电器的开与关;Light中turnLight(intdegree)方法用于调整电灯灯光的强弱,参数degree值为0时表示关灯,值为100时表示开灯并且将灯光亮度调整到最大;TV中setChannel(intchannel)方法表示设置电视播放的频道,参数channel值为0时表示关闭电视,为1时表示开机并将频道切换为第1频道。【C++代码】classLight{//电灯类public:voidtrunLight(intdegree){//调整灯光亮度,0表示关灯,100表示亮度最大);};classTV{//电视机类public:voldsetChannel(intchannel]{//调整电视频道,0表示关机,1表示开机并切换到1频道};};classCommand{//抽象命令类public:virtualvoidon()=0;virtualvoidoff()=0;};classRemoteController{//遥控器类protected:Command*commands[4];//遥控器有4个按钮,按照编号分别对应4个Command对象public:voidonPressButton(intbutton){//按钮被按下时执行命令对象中的命令if(button%2==0)commands[button]->on();elsecommands[button]->off();}voidsetCommand(intbutton,Command*command){{{U}}(1){{/U}}=command;//设置每个按钮对应的命令对象}};classLightCommand:publicCommand{//电灯命令类protected:Light*light;//指向要控制的电灯对象public:voidOn(){light->trunLight(100););voidoff()[light->{{U}}(2){{/U}};);LightCommand(Light*light){this->light=light;);};classTVCommand:publicCommand{//电视机命令类protected:TV*tv;//指向要控制的电视机对象public:voidon(){tv->{{U}}(3){{/U}};};voidoff(){tv->setChannel(0););TVCommand(TV*tv){this->tv=tv;);};voidmain(){Lightlight;TVtv;//创建电灯和电视对象LightCommandlightCommand(&light);TVCommandtVCommand(&tv);RemoteControllerremoteController;remoteController.setCommand(0,{{U}}(4){{/U}});//设置按钮0的命令对象…//此处省略设置按钮1、按钮2和按钮3的命令对象代码}本题中,应用命令模式能够有效让类{{U}}(5){{/U}}和类{{U}}(6){{/U}}、类{{U}}(7){{/U}}之间的耦合性降至最小。
问答题
阅读下列说明和数据流图,回答问题1至问题3,将解答填入对应栏内。 [说明]
下面给出的是某房产管理系统的一套分层数据流图。其功能描述如下:
(1)系统随时根据住房送来的入住单更新住户基本信息文件;
(2)每月初系统根据物业管理委员会提供的月附加费(例如清洁费、保安费、大楼管理费等)表和房租调整表,计算每家住户的月租费(包括月附加费),向住户发出交费通知单。住户交费时,系统输入交费凭证,核对后输出收据给住户;
(3)系统定期向物业管理委员会提供住房分配表和交费清况表;
(4)住户因分户或换房,在更新住户基本信息文件的同时,系统应立即对这些住户做月租费计算,以了结分户或换房前的房租。
以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图1-1是项层数据流图,图1-2是第0层数据流图,图1-3是第1层数据流图,其中A是加工1的细化图,B是加工2的细化图。假定题中提供的顶层图是正确的,请回答下列问题。
[图1-1] [图1-2]
[图1-3]
问答题【问题2】
在状态迁移图中,a,b,c分别表示什么事件?请用转换图中给出的事件名解答。
问答题【程序说明】 对于一个公司的雇员来说,无非有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, (1) ),bouns(theBouns) float getBouns()constreturn bouns; float pay(float hoursWorked)const return (2) 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() constreturnname; //取雇员薪水等级 float getPayRate()constreturn payRate; //计算雇员薪水 virtual float pay(float hoursWorked)const return (3) ; 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()constreturn salaried; //计算薪水 virtual float pay(float (4) )const; protected: bool Salaried; ; float Manager::pay(float hoursWorked)const if(salaried) //固定付薪方式 return payRate; else //按小时付薪 return (5) ; //主管人员类 class Supervisor: (6) public: //构造函数 Supervisor(String theName,float thePayRate,float theBouns): Manager(theName,thePayRate,true),bouns(theBouns) //取奖金数额 float getBouns()constreturn bouns; //计算薪水 virtual float pay(float hoursWorked)const retum payRate+bouns; (7) float bouns; #include "employee.h" #include"jostream.h" void main() (8) * 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:"<< (9) <<endl; cout<<"Pay:"<< (10) <<endl; //设每月工作80小时
问答题[说明]移动电话是传统固定式电话的延伸,通过无线电网络可以与千里之外的朋友沟通而不受电话线的束缚。现在的移动电话功能更全面,除了作为电话使用外,还可以发送短信,可以管理电话簿,可以下载铃声、图案。手机由键盘、显示屏以及移动通信设备组成,移动通信设备负责发送和接收信号,与基站进行连线。打电话的流程如下:(1)用户拨电话号码,每按下一个数字键显示屏上显示相应数字;(2)按OK键进行连线,显示屏上显示“连线中…”,请连接基站,基站通过移动电话网络连接到对方手机,若有误则返回相关信息;(3)接通后,显示屏显示“连线成功”;(4)打电话结束后,按Cancel送出断线信号,通知移动电话基站断线,基站切断连接,显示屏显示“断线成功”。该系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图1是该系统的用例图,图2是该系统的类图,图3描述了打电话(包括断开)的序列图。图1图2图3
问答题【说明】下面是一个用C编写的快速排序算法。为了避免最坏情况,取基准记录pivot时,采用从left、right和mid=[(left+right)/2]中取中间值,并交换到right位置的办法。数组a存放待排序的一组记录,数据类型为T,left和right是待排序子区间的最左端点和最右端点。
void quicksort (int a[], int left, int right) {
int temp;
if (left<right) {
hat pivot = median3 (a, left, right); //三者取中子程序
int i = left, j = right-1;
for(;;){
while (i <j
while (i <j
if(i<j){
temp = a[i]; a[j] = a[i]; a[i] = temp;
i++; j--;
}
else break;
}
if (a[i] > pivot)
{temp = a[i]; a[i] = a[right]; a[right] = temp;}
quicksort({{U}} (1) {{/U}}); //递归排序左子区间
quieksort(a,i+1 ,right); //递归排序右子区间
}
}
void median3 (int a[], int left, int right)
{ int mid={{U}} (2) {{/U}};
int k = left;
if(a[mid] < a[k])k = mid;
if(a[high] < a[k]) k = high; //选最小记录
int temp = a[k]; a[k] = a[left]; a[left] = temp; //最小者交换到 left
if(a[mid] < a[right])
{temp=a[mid]; a[mid]=a[right]; a[right]=temp;}
}
消去第二个递归调用 quicksort (a,i+1,right)。 采用循环的办法:
void quicksort (int a[], int left, int right) {
int temp; int i,j;
{{U}}(3) {{/U}}{
int pivot = median3(a, left, right); //三者取中子程序
i = left; j = righi-1;
for (;; ){
while (i<j
while (i<j
if(i <j) {
temp = a[i]; a[j]; = a[i]; a[i]=temp;
i++; j--;
}
else break;
}
if(a[i]>pivot){{{U}} (4) {{/U}};a[i]=pivot;}
quicksoft ({{U}} (5) {{/U}}); //递归排序左子区间
left = i+1;
}
}
问答题[说明]某图书管理系统的主要功能是图书管理和信息查询。对于初次借书的读者,系统自动生成读者号,并与读者基本信息(姓名、单位和地址等)一起写入读者文件。该系统的图书管理功能主要分为购入新书、读者借书、读者还书及图书注销4个方面。(1)购入新书时需要为该书编制入库单。入库单内容包括图书分类目录号、书名、作者、价格、数量和购书日期,将这些信息写入图书目录文件并修改文件中的库存总量(表示到目前为止,购入此种图书的数量)。(2)读者借书时需填写借书单。借书单内容包括读者号和所借图书分类目录号。系统首先检查该读者号是否有效,若无效,则拒绝借书;若有效,则进一步检查该读者已借图书是否超过最大限制数(假设每位读者能同时借阅的书不超过10本),若已达到最大限制数,则拒绝借书;否则允许借书,同时将图书分类目录号、读者号和借阅日期等信息写入借书文件中。(3)读者还书时需填写还书单。系统根据读者号和图书分类目录号,从借书文件中读出与该图书相关的借阅记录,标明还书日期,再写回到借书文件中,若图书逾期,则处以相应的罚款。(4)注销图书时,需填写注销单并修改图书目录文件中的库存总量。系统的信息查询功能主要包括读者信息查询和图书信息查询。其中,读者信息查询可得到读者的基本信息及读者借阅图书的情况;图书信息查询可得到图书基本信息和图书的借出情况。该图书管理系统的顶层数据流图,如图2-21所示;该图书管理系统的第0层DFD图,如图2-22所示;其中加工2的细化图,如图2-23所示。
问答题阅读以下某工厂人事信息管理系统数据库的设计说明,根据要求回答问题1~问题4。
[说明]
某工厂有多个部门,每个部门有多位职工,每位职工属于并且仅属于一个部门,每个部门有一位负责人,每个办公室有一部电话。每位职工的月工资大致是:800≤月工资≤4500元。
软件开发公司A为该工厂开发的信息管理数据库的部分关系模式如下所示。
职工(职工号,姓名,年龄,月工资,部门号,电话,办公室)
部门(部门号,部门名,负责人代码,任职时间) 其中“职工”和“部门”的关系示例分别见表5-17和表5-18。
{{B}}表5-17“职工”关系示例表{{/B}}
{{B}}职工号{{/B}}
{{B}}姓名{{/B}}
{{B}}年龄{{/B}}
{{B}}月工资{{/B}}
{{B}}部门号{{/B}}
{{B}}电话{{/B}}
{{B}}办公室{{/B}}
1001
郑俊华
26
1000
1
8001234
主楼201
1002
王平
27
1100
1
8001234
主楼201
2001
王晓华
38
1300
2
8001235
1号楼302
2002
李力
24
800
2
8001236
1号楼303
3001
黎运军
42
1300
3
8001237
主楼202
4001
李源
24
800
3
8001245
2号楼102
4002
李兴民
36
1200
4
8001246
2号楼103
5001
赵欣
25
0
Null
…
…
…
…
…
…
…
…
…
{{B}}表5-18“部门”关系示例表{{/B}}
{{B}}部门号{{/B}}
{{B}}部门名{{/B}}
{{B}}负责人代码{{/B}}
{{B}}任职时间{{/B}}
1
人事处
1002
2004-8-3
2
机关
2001
2004-8-3
3
销售科
4
生产科
4002
2003-6-1
5
车间
问答题[说明]
现需在某城市中选择一个社区建一个大型超市,使该城市的其他社区到该超市的距离总和最小。用图模型表示该城市的地图,其中顶点表示社区,边表示社区间的路线,边上的权重表示该路线的长度。
现设计一个算法来找到该大型超市的最佳位置,即在给定图中选择一个顶点,使该顶点到其他各顶点的最短路径之和最小。算法首先需要求出每个顶点到其他任一顶点的最短路径,即需要计算任意两个顶点之间的最短路径;然后对每个顶点,计算其他各顶点到该顶点的最短路径之和;最后,选择最短路径之和最小的顶点作为建大型超市的最佳位置。
问答题[说明]学生信息管理系统旨在用微型计算机对全校的学生事务进行管理,其内容包括新生管理、成绩管理、重修管理、毕业资格审定以及随机查询和打印报表等。教务人员在进入系统时,系统通过注册登录来提供用户的访问权限,系统会检查用户的合法性,如不合法,系统拒绝用户进入,如是合法用户,则根据命令要求类型处理。本系统主要有新生管理、成绩管理、重修处理、资格审定四大功能,分别进行不同的管理。新生管理首先按照各专业录入新生信息,录入时若录入的信息不完整,则给出提示信息,要求用户录入完整信息;若新生库中已经存在该生信息了,则给出提示信息,保证不重复录入新生信息。在录入阶段,会显示新生库中的记录,可以进行浏览、删除、修改等操作,以便用户录入正确无误的新生信息。录入完毕后,打印编好学号和分好班次的新生名单并将新生记录写入学生信息库。成绩管理使用一般方法和特殊方法对学生成绩进行管理。分别按照这两种方法进行成绩的录入和计算。成绩处理完毕后,合并到学生成绩库,可以对学生成绩总库进行浏览、修改、删除、插入、查找等操作,同时提供成绩查询功能,可按照学号、姓名、课程号、课程名称、专业班级查询学生成绩,最后打印各种形式的学生成绩单。重修处理首先对学生重修总体情况进行浏览,可以查询未交费学生重修情况、某个学生重修情况等,打印各种形式的重修单和重修证。另外进行重修交费登记,输入某个重修学生学号,则显示该生相关信息(姓名、专业等)、重修课程信息、重修总学分、应交金额等,交费登记后,写入重修表和交费表。资格审定主要对毕业生的毕业资格进行审定,计算毕业生的已修学分,审定后填写资格库,显示审定结果,打印毕业生资格表和毕业证书等。学生信息管理系统顶层图如图10-1所示;学生信息管理系统的第0层DFD图如图10-2所示,其中,加工3的细化图如图10-3所示,加工4的细化图如图10-4所示。[数据流图10-1][数据流图10-2][数据流图10-3][数据流图10-4]
问答题阅读下列说明和数据流图,回答问题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.根据题意,指出数据流图中缺失的数据流(a)的名称,并指出该数据流的起点。