问答题【说明】
“背包问题”的基本描述是:有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1,w2,…,wn。希望从N件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于S。
如下程序均能求得“背包问题”的一组解,其中程序1是“背包问题”的递归解法,而程序2是“背包问题”的非递归解法。
【程序1】
#include<stdio.h>
#define N 7
#define S 15
int w[N+1]={0,1,4,3,4,5,2,7};
int knap(int s, int n)
{
if(s==0) return 1;
if(s<0 || (s>0
if({{U}} (1) {{/U}}){/*考虑物品n被选择的情况*/
printf("%4d",w[n]);
return 1;
}
return {{U}}(2) {{/U}};/*考虑不选择物品n的情况*/
}
main()
{
if(knap(S,N))printf("OK!/n");
else printf("N0!/n");
}
【程序2】
#include<stdio.h>
#define N 7
#define S 15
typedef struct{
int s;
int n;
int job;
}KNAPTP;
int w[N+1]={0,1,4,3,4,5,2,7};
int knap(int s, int n);
main()
{
if(knap(S,N)) printf("0K!/n");
else printf("N0!/n");
}
int knap(int s, int n)
{
KNAPTP stack[100],x;
int top, k, rep;
x.s=s;x.n=n;
x.job=0;
top=1; stack[top]=x;
k=0;
while({{U}} (3) {{/U}}){
x=stack[top];
rep=1;
while(!k /*已求得一组解*/
else if(x.s<0 || x.n<=0) rep=0;
else{
x.s={{U}} (4) {{/U}};
x.job=1;
{{U}} (5) {{/U}}=x;
}
}/*while*/
if(!k){
rep=1;
while(top>=1
if(x.job==1){
x.s +=w[x.n+1];
x.job=2;
stack[++top]=x;
{{U}}(6) {{/U}};
}/*if*/
}/*while*/
}/*if*/
/*while*/
if(k){ /*输出一组解*/
while(top>=1){
x=stack[top--];
if(x.job==1)printf("%4d/t",w[x.n+1]);
}
}
return k;
}
问答题【程序说明】
下列文法可用来描述化学分子式的书写规则(例如,A12(C03)、Cu(OH)2):
λ→β|βλ
β→δ|δn
δ→ξ|ξθλ
其中,λ是一个分子式;δ或是一个元素,或是一个带括号的(子)分子式,元素或是一个大写字母(记为ξ),或是一个大写字母和一个小写字母(记为ξθ);β或是一个δ,或是在δ之后接上一个整数n,δn表示β有n个δ的元素或(子)分子式。一个完整的分子式由若干个β组成。
当然一个正确的分子式除符合上述文法规则外,还应满足分子式本身的语义要求。下面的程序输入分子式,按上述文法分析分子式,并计算出该分子式的分子量。例如,元素H的原子量是1,元素O的原子量是16。输入分子式H2O,程序计算出它的分子量为重18(1×2+16)。程序中各元素的名及它的原子量从文件atom.dat中读入。
【程序】
#include <stdio.h>
#include <string.h>
#define MAXN 300
#define CMLEN 30
struct elem{
char name[3];/*元素名*/
double v; /*原子量*/
}nTbl[MAXN];
char cmStr[CMLEN], *pos;
int c;
FILE *fp;
double factor();
double atom() /*处理文法符号δ*/
{
char w[3]; int i; double num;
while((c = *pos++)=="|| c=='/t'); /* 略过空白字符 */
if(c=='/n') return 0.0;
if(c>='A' c=*pos++;
if(c>='a'
else pos--;
w[++i]='/0';
for(i=0; nTbl[i].v>0.0; i++)
if(strcmp(w, nTbl[i].name)==0) return nTbl[i].v;
printf("/n 元素表中没有所输入的元素: /t%s/n",w);
return -1.0;
}
else if(c=='('){
if((num ={{U}} (1) {{/U}}<0.0)return -1.0; /* 包括可能为空的情况 */
if(*pos++ !=')'){
printf(" 分子式中括号不匹配!/n");
return -1.0;
}
return num;
}
printf("分子式中存在非法字符: /t%c/n",c);
return -1.0;
}
double mAtom() /* 处理文法符号β*/
{
double num; int n=1;
if((num = {{U}}(2) {{/U}})<0.0) return -1.0;
c = *pos++;
if(c>='0'
while(c>='0'
c=*pos++;
}
}
pos--;
return num *n;
}
double factor() /* 处理文法符号λ */
{
double num=0.0, d;
if((num=mAtom())<0.0) return -1.0;
while(*pos>='A'
}
return num;
}
void main()
{
char fname[]="atom.dat"; /*元素名及其原子量文件*/
int i; double num;
if((fp=fopen(fname, "r"))==NULL){/* 以读方式打开正文文件*/
printf("Can not open %s file./n", fname);
return;/* 程序非正常结束 */
}
i=0;
while(i<MAXN
fclose(fp);
nTbl[i].v=-1.0;
while(I){ /* 输入分子式和计算分子量循环,直至输入空行结束*/
printf ("/n 输入分子式!(空行结束)/n");
gets(cmStr);
pos=cmStr;
if(cmStr[0]=='/0')break;
if((num=factor())>0.0)
if (*pos != '/0')printf("分子式不完整!/n");
else printf(" 分子式的分子量为 %f/n", num);
}
}
问答题阅读以下说明和图,根据要求回答问题。[说明]某大学欲开发一个基于Web的课程注册系统,该系统的主要功能如下:1.验证输入信息(1)检查学生信息:检查学生输入的所有注册所需信息。如果信息不合法,返回学生信息不合法提示;如果合法,输出合法学生信息。(2)检查学位考试结果:检查学生提供的学位考试结果。如果不合法,返回学位考试结果不合法提示;如果合法,检查该学生注册资格。(3)检查学生注册资格:根据合法学生信息和合法学位考试结果,检查该学生对欲选课程的注册资格。如果无资格,返回无注册资格提示;如果有注册资格,则输出注册学生信息(包含选课学生标识)和欲注册课程信息。2.处理注册申请(1)存储注册信息:将注册学生信息记录在学生库。(2)存储所注册课程:将选课学生标识与欲注册课程进行关联,然后存入课程库。(3)发送注册通知:从学生库中读取注册学生信息,从课程库中读取所注册课程信息,给学生发送接受提示;给教务人员发送所注册课程信息和已注册学生信息。现采用结构化方法对课程注册系统进行分析与设计,获得如图1所示的0层数据流图和图2所示的1层数据流图。图1某课程注册系统0层数据流图图2某课程注册系统1层数据流图
问答题阅读下列说明和C代码,回答下面问题。[说明]计算一个整数数组a的最长递增子序列长度,对其方法描述如下。假设数组a的长度为n,用数组b的元素b[i]记录以a[i](0≤i<n)为结尾元素的最长递增子序列的长度为max(0≤i<n){b[i]},其中b[i]满足最优子结构,可递归定义为:[C代码]下面是算法的C语言实现。(1)常量和变量说明●a:长度为n的整数数组,求其最长递增子序列。●b:长度为n的数组,b[i]记录以a[i](0≤i<n)为结尾元素的最长递增子序列的长度,其中0≤i<n。●len:最长递增子序列的长度。●ij:循环变量。●temp:临时变量。(2)C程序#jnclude<stdio.h>mtmaxL(int*b,mtn){mtI,temp=0;for(i=0;i<n;i++){(b[i]>temp)temp=b[i]}returntemp;intmain(){intn,a[100],b[100],i,j,len;Scanf("%d",for(i=0;i<n;i++){scanf("%d",}______:for(i=1;i<n;i++){for(j=0,len=0;______;j++){if(______}______;}Printf("len:%d\n",maxL(b,n));Printf("\n");}
问答题阅读下列说明和C++代码,将应填入空白处的字句写在答题纸的对应栏内。[说明]某公司的组织结构图如图1所示,现采用组合(Composition)模式来构造该公司的组织结构,得到如图2所示的类图。图1某公司的组织结构图图2类图其中Company为抽象类,定义了在组织结构图上添加(Add)和删除(Delete)分公司/办事处或者部门的方法接口。类ConcreteCompany表示具体的分公司或者办事处,分公司或办事处下可以设置不同的部门。类HRDepartment和FinanceDepartment分别表示人力资源部和财务部。[C++代码]#include<iostream>#include<list>#include<string>usingnamespacestd;classCompany{//抽象类protected:stringname;public:Company(stringname){______=name;}______;//增加子公司、办事处或部门______;//删除子公司、办事处或部门};classConcreteCompany:publicCompany{private:list<______>children;//存储子公司、办事处或部门public:ConcreteCompany(stringname):Company(name){}voidAdd(Company*c){______.pushback(c);}voidDelete(Company*c){______.remove(c);}};classHRDepartment:publicCompany{public:HRDepartment(stringname):Company(name){}//其余代码省略};classFinanceDepartment:publicCompany{public:FinanceDepartment(stringname):Company(name){}//其余代码省略};voidmain(){ConcreteCompany*root=newComcreteCompany("北京总公司");root->Add(newHRDepartment("总公司人力资源部"));root->Add(newFinanceDepartment("总公司财务部"));ConcreteCompany*comp=newConcreteCompany("上海分公司");comp->Add(newHRDepartment("上海分公司人力资源部"));comp->Add(newFinanceDepartment("上海分公司财务部"));______;ConcreteCompany*comp1=newConcreteCompany("南京办事处");comp1->Add(newHRDepartment("南京办事处人力资源部"));comp1->Add(newFinanceDepartment("南京办事处财务部"));______;//其余代码省略}
问答题阅读下列说明和图,回答下面问题。[说明]某公司欲开发招聘系统以提高招聘效率,其主要功能如下。(1)接受申请验证应聘者所提供的自身信息是否完整,是否说明了应聘职位,受理验证合格的申请,给应聘者发送致谢信息。(2)评估应聘者根据部门经理设置的职位要求,审查已经受理的申请;对未被录用的应聘者进行谢绝处理,将未被录用的应聘者信息存入未录用的应聘者表,并给其发送谢绝决策;对录用的应聘者进行职位安排评价,将评价结果存入评价结果表,并给其发送录用决策,发送录用职位和录用者信息给工资系统。现采用结构化方法对招聘系统进行分析与设计,获得如图1所示的顶层数据流图、如图2所示的0层数据流图和如图3所示的1层数据流图。图1顶层数据流图图20层数据流图图31层数据流图
问答题阅读以下说明和图,回答问题。[说明]某营销企业拟开发一个销售管理系统,其主要功能描述如下。(1)接受客户订单,检查库存货物是否满足订单要求。如果满足,进行供货处理:即修改库存记录文件,给库房开具备货单并且保留客户订单至订单记录文件;否则进行缺货处理:将缺货订录单入缺货记录文件。(2)根据缺货记录文件进行缺货统计,将缺货通知单发给采购部门。(3)根据采购部门提供的进货通知单进行进货处理:即修改库存记录文件,并从缺货记录文件中取出缺货订单进行供货处理。(4)根据保留的客户订单进行销售统计,打印统计报表给经理。现采用结构化方法对销售管理系统进行分析与设计,获得如图4.12所示的顶层数据流图和图4.13所示的0层数据流图。1.使用说明中的词语,给出图4.12的外部实体E1~E4的名称。
问答题阅读下列说明,回答问题1至问题3。 [说明] 快速排序是一种典型的分治算法。采用快速排序对数组A[P..r]排序的3个步骤如下。 (1)分解:选择一个枢轴(pivot)元素划分数组。将数组A[p..r]划分为两个子数组(可能为空)A[p..g-1]和A[q+1..],使得A[g]大于等于A[p..q-1]中的每个元素,小于A[q+1..r]中的每个元素。q的值在划分过程中计算。 (2)递归求解:通过递归的调用快速排序,对子数组A[p..q-1]和A[q+1..r]分别排序。 (3)合并:快速排序在原地排序,故不需合并操作。 [问题1] 下面是快速排序的伪代码,请填补其中的空缺。伪代码中的主要变量说明如下。 A:待排序数组。 p,r:数组元素下标,从p到r。 q:划分的位置。 x:枢轴元素。 i:整型变量,用于描述数组下标。下标小于或等于i的元素的值小于或等于枢轴元素的值。 j:循环控制变量,表示数组元素下标。 QUICKSORT (A,p, r) if (p<r) q = PARTITION(A,p,r); QUICKSORT(A,p,q-1); QUICKSORT (A,q+1,r); PARTITION (A,p,r) x=A[r]; i=p-1; for(j=p;j≤r-1; j++) if(A[j]≤x) i=i+1; 交换A[i]和A[j] 交换 (1) 和 (2) //注:空(1)和空(2)答案可互换,但两空全部答对方可得分 return (3) [问题2] (1)假设要排序包含n个元素的数组,清给出在各种不同的划分情况下,快速排序的时间复杂度,用0记号。最佳情况为 (4) ,平均情况为 (5) ,最坏情况为 (6) 。 (2)假设要排序的n个元素都具有相同值时,快速排序的运行时间复杂度属于哪种情况? (7) 。(最佳、平均、最坏) [问题3] (1)待排序数组是否能被较均匀地划分对快速排序的性能有重要影响,因此枢轴元素的选取非常重要。有人提出从待排序的数组元素中随机地取出一个元素作为枢轴元素,下面是随机化快速排序划分的伪代码。利用原有的快速排序的划分操作,请填充其中的空缺处。其中,RANDOM(i/j)表示随机取i到j之间的一个数,包括i和j。 RANDOMIZED-PARTITION(A,p,r) i= RANDOM(p,r); 交换 (8) 和 (9) ;//注:空(8)和空(9)答案可互换 return PARTITION(A,p,r); (2)随机化快速排序是否能够消除最坏情况的发生? (10) 。(是或否)
问答题阅读下列说明和图,回答下面问题。[说明]某公司欲开发招聘系统以提高招聘效率,其主要功能如下:(1)接受申请验证应聘者所提供的自身信息是否完整,是否说明了应聘职位,受理验证合格的申请,给应聘者发送致谢信息。(2)评估应聘者根据部门经理设计的职位要求,审查已经受理的申请;对未被录用的应聘者进行谢绝处理,将未被录用的应聘者信息存入未录用的应聘者表,并给其发送谢绝决策;对录用的应聘者进行职位安排评价,将评价结果存入评价结果表,并给其发送录用决策,发送录用职位和录用者信息给工资系统。现采用结构化方法对招聘系统进行分析和设计,获得如图1所示的顶层数据流图、图2所示0层数据流图和图3所示1层数据流图。图1顶层数据流图图20层数据流图图31层数据流图
问答题【问题1】根据以上说明设计的实体联系图如图2-1所示,请指出读者与图书、书目与读者、书目与图书之间的联系类型。
问答题【问题1】
转换图中缺少哪3条数据流?请指明每条数据流的名称、起点和终点。
问答题阅读下列说明和图,回答下面问题。[说明]某学校开发图书管理系统,以记录图书馆藏书及其借出和归还情况,提供给借阅者借阅图书功能,提供给图书馆管理员管理和定期更新图书表功能。主要功能的具体描述如下。(1)处理借阅。借阅者要借阅图书时,系统必须对其身份(借阅者ID)进行检查。通过与教务处维护的学生数据库、人事处维护的职工数据库中的数据进行比对,以验证借阅者ID是否合法,若合法,则检查借阅者在逾期未还图书表中是否有逾期未还图书,以及罚金表中的罚金是否超过限额。如果没有逾期未还图书并且罚金未超过限额,则允许借阅图书,更新图书表,并将借阅的图书存入借出图书表。借阅者归还所借图书时,先由图书馆管理员检查图书是否缺失或损坏,若是,则对借阅者处以相应罚金并存入罚金表;然后,检查所还图书是否逾期,若是,执行“处理逾期”操作;最后,更新图书表,删除借出图书表中的相应记录。(2)维护图书。图书馆管理员查询图书信息;在新进图书时录入图书信息,存入图书表;在图书丢失或损坏严重时,从图书表中删除该图书记录。(3)处理逾期。系统在每周一统计逾期未还图书,逾期未还的图书按规则计算罚金,并记入罚金表,给有逾期未还图书的借阅者发送提醒消息。借阅者在借阅和归还图书时,若罚金超过限额,管理员收取罚金,并更新罚金表中的罚金额度。现采用结构化方法对该图书管理系统进行分析与设计,获得如图1所示的顶层数据流图和如图2所示的0层数据流图。图1顶层数据流图图20层数据流图
问答题【问题2】
(1)用SQL定义“职员”关系模式,请在空缺处填入正确的内容。
Create Table职员(职员号CHAR(5){{U}} (a) {{/U}},
职员姓名 CHAR(8),
月工资 NUMBER(4),
部门号 CHAR(1),
办公室 CHAR(20),
电话 CHAR(8),
{{U}} (b) {{/U}} (部门号),
CHECK(月工资>=1000 AND 月工资<=8000));
(2)针对人数大于等于2的部门创建视图D_View(Dept,D_num,D_Totals,D_AvgPay),其中,Dept为部门号,D_Num为部门人数,D_Totals为工资总数,D_AvgPay为平均工资,请在空缺处填入正确的内容。
Create View D_View(Dept,D_num,D_Totals,D_AvgPay)As
(Select 部门号,{{U}} (c) {{/U}}
from 职员
{{U}} (d) {{/U}} count(*)>=2 WHERE 部门号 IS NOT NULL):
问答题阅读下列说明和Java代码,将应填入(n)处的字句写在对应栏内。[说明]某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征。需要模拟的飞机种类及其特征如表10.5所示。表10.5飞机种类的特性飞机种类起飞特征飞行特征直升机(Helicopter)垂直起飞(VerticalTakeOff)亚音速飞行(SubSonicFly)客机(AirPlane)长距离起飞(LongDistanceTakeOff)亚音速飞行(SubSonicFly)歼击机(Fighter)长距离起飞(LongDistanceTakeOff)超音速飞行(SuperSonicFly)鹞式战斗机(Harrier)垂直起飞(VerticaITakeOff)超音速飞行(SuperSonicFly)为支持将来模拟更多种类的飞机,采用策略设计模式(Strategy)设计的类图如图10.12示。图10.12中,AirCraft为抽象类,描述了抽象的飞机,而类Helicopter、AirPlane、Fighter和Harrier分别描述具体的飞机种类,方法fly()和takeOff()分别表示不同飞机都具有飞行特征和起飞特征类FlyBehavior与TakeOffBehavior为抽象类,分别用于表示抽象的飞行为与起飞行为;类SubSonicFly与SuperSonicFly分别描述亚音速飞行和超音速飞行的行为;类VerticalTakeOff与LongDistanceTakeOff分别描述垂直起飞与长距离起飞的行为。[Java代码]interfaceFlyBehaviorpublicvoidfly();;classSubSonicFlyimplementsFlyBehaviorpublicvoidfly()(System.out.println("亚音速飞行!");;classSuperSonicFlyimplementsFlyBehaviorpublicvoidfly()(System.out.println("超音速飞行!");;interfaceTakeOffBehaviorpublicvoidtakeOff();;classVerticalTakeOffimplementsTakeOffBehaviorpublicvoidtakeOff()(System.out.println("垂直起飞!");;classLongDistanceTakeOffimplementsTakeOffBehaviorpublicvoidtakeOff()System.out.println("长距离起飞!");;abstractclassAirCraftprotected(1);protected(2);publicvoidfly()((3);)publicvoidtakeOff()(4);;classHelicopter(5)AirCraftpublicHelicopter()flyBehavior=new(6);takeOffBehavior=new(7);;//其他代码省略
问答题【问题3】
将数据流图如图1-11(加工4的细化图)所示中的数据流补充完整,并指明加工名称、数据流的方向(输入/输出)和数据流名称。
问答题设有部门管理系统,需要对部门信息、部门职工信息、产品的信息和制造商信息进行管理。 已知部门信息(Dept):部门号(DNO)、部门经理(DMan);部门职工信息(worker):职工号(WNo)、职工姓名(WName)、家庭住址(WAdd);产品的信息(Product):产品号(PNO)、产品名(PName)、价格(PPrice)、产品型号(PType);制造商信息(Maker):制造商号(MNO)、制造商名称(MName)、制造商地址(MAdd)。 其中的规则为: Ⅰ.一个职工属于一个部门,一个部门有多个职工; Ⅱ.一个部门可销售多种产品,一种产品可被多个部门销售; Ⅲ.一种产品可被多个制造商生产,一个制造商可生产多种产品。 请针对以上描述,完成下列设计内容: ①构建该部门管理系统的ER图。 ②根据构建的ER图,设计满足3NF的关系模式,并标出每个关系模式的主码和外码。
问答题阅读下列说明,回答下面问题。[说明]某物流公司为了整合上游供应商与下游客户,缩短物流过程,降低产品库存,需要构建一个信息系统以方便管理其业务运作活动。[需求分析结果](1)物流公司包含若干部门,部门信息包括部门号、部门名称、经理、电话和邮箱。一个部门可以有多名员工处理部门的日常事务,每名员工只能在一个部门工作。每个部门有一名经理,只需负责管理本部门的事务和人员。(2)员工信息包括员工号、姓名、职位、电话号码和工资,其中,职位包括:经理、业务员等。业务员根据托运申请负责安排承运货物事宜,如装货时间、到达时间等。一个业务员可以安排多个托运申请,但一个托运申请只由一个业务员处理。(3)客户信息包括客户号、单位名称、通信地址、所属省份、联系人、联系电话、银行账号,其中,客户号唯一标识客户信息的每一个元组。每当客户要进行货物托运时,先要提出货物托运申请。托运申请信息包括申请号、客户号、货物名称、数量、运费、出发地、目的地。其中,一个申请号对应唯一的一个托运申请;一个客户可以有多个货物托运申请,但一个托运申请对应唯一的一个客户号。[概念模型设计]根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如图所示。实体联系图[关系模式设计]部门(部门号,部门名称,经理,电话,邮箱)员工(员工号,姓名,职位,电话号码,工资,(a))客户((b),单位名称,通信地址,所属省份,联系人,联系电话,银行账号)托运申请((c),货物名称,数量,运费,出发地,目的地)安排承运((d),装货时间,到达时间,业务员)
问答题【问题2】
数据流图1-8中缺少3条数据流,请指出这3条数据流的起点和终点。
问答题阅读下列说明和图,回答问题1至问题3,将解答填入对应栏内。[说明]希赛公司拟开发一个销售管理系统,其主要功能描述如下:(1)接受客户订单,检查库存货物是否满足订单要求。如果满足,进行供货处理,即修改库存记录文件,给库房开具备货单并且保留客户订单至订单记录文件;否则进行缺货处理,即将缺货订单录入缺货记录文件。(2)根据缺货记录文件进行缺货统计,将缺货通知单发给采购部门。(3)根据采购部门提供的进货通知单进行进货处理,即修改库存记录文件,并从缺货记录文件中取出缺货订单进行供货处理。(4)根据保留的客户订单进行销售统计,打印统计报表给经理。现采用结构化方法对销售管理系统进行分析与设计,获得如图15-17所示的顶层数据流图和如图15-18所示的第0层数据流图。
问答题阅读下列说明和图,回答下面问题。[说明]某学校开发图书管理系统,以记录图书馆藏图书及其借出和归还情况,提供给借阅者借阅图书功能,提供给图书馆管理员管理和定期更新图书表功能,主要功能的具体描述如下。(1)处理借阅。借阅者要借阅图书时,系统必须对其身份(借阅者ID)进行检查。通过与教务处维护的学生数据库、人事处维护的职工数据库中的数据进行比对,以验证借阅者ID是否合法,若合法,则检查借阅者在逾期未还图书表中是否有逾期未还图书,以及罚金表中的罚金是否超过限额。如果没有逾期未还图书并且罚金未超过限额,则允许借阅图书,更新图书表,并将借阅的图书存入借出图书表,借阅者归还所借图书时,先由图书馆管理员检查图书是否缺失或损坏,若是,则对借阅者处以相应罚金并存入罚金表;然后,检查所还图书是否逾期,若是,执行“处理逾期”操作;最后,更新图书表,删除借出图书表中的相应记录。(2)维护图书。图书馆管理员查询图书信息;在新进图书时录入图书信息,存入图书表;在图书丢失或损坏严重时,从图书表中删除该图书记录。(3)处理逾期。系统在每周一统计逾期未还图书,逾期未还的图书按规则计算罚金,并记入罚金表,并给有逾期未还图书的借阅者发送提醒消息。借阅者在借阅和归还图书时,若罚金超过限额,管理员收取罚金,并更新罚金表中的罚金额度。现采用结构化方法对该图书管理系统进行分析与设计,获得如图1所示的顶层数据流图和图2所示的0层数据流图。图1顶层数据流图图20层数据流图
