问答题阅读下列算法说明和算法,将应填入(n)的字句写在答题纸的对应栏内。【说明】下列最短路径算法的具体流程如下:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择不使森林中产生回路的边加入到森林中去,直至该森林变成一棵树为止,这棵树便是连通网的最小生成树。该算法的基本思想是:为使生成树上总的权值之和达到最小,则应使每一条边上的权值尽可能地小,自然应从权值最小的边选起,直至选出n-1条互不构成回路的权值最小边为止。【算法】/*对图定义一种新的表示方法,以一维数组存放图中所有边,并在构建图的存储结构时将它构造为一个“有序表”。以顺序表MSTree返回生成树上各条边。*/typedefstrnctVertexTypevex1;VertexTypevex2;VRTypeweight;EdgeType;typedefElemTypeEdgeType;typedefstruct//有向网的定义VertexTypevexs[MAX_VERTEX_NUM];//顶点信息EdgeTypeedge[MAX_EDGE_NUM];//边的信息Mtvexnum,arcnum;//图中顶点的数目和边的数目ELGraph;voidMiniSpanTree_Kruskal(ELGraphG,SqListInitSet(F,G.vexnum);//将森林F初始化为n棵树的集合InitList(MSTree,G.vexaum);//初始化生成树为空树i=O;k=l;while(k<(1))e=G.edge[i];//取第i条权值最小的边rl=fix_mfset(F,LocateVex(e.vexl));r2=(2)//返回两个顶点所在树的树根if(ri(3)r2)//选定生成树上第k条边if(Listlnsert(MSTree,k,e))(4);//插入生成树mix_mfset(F,ri,r2);//将两棵树归并为一棵树(5);//继续考察下一条权值最小边DestroySet(F);
问答题[说明]在某些系统中,存在非常复杂的对象,可以采用循序渐进的方式进行组合,将小对象组合成复杂的大对象。以下实例展示了Builder(生成器)模式。该实例用来建立“文件”,文件内容包括:一个标题、一串字符以及一些有项目符号的项目。Builder类规定组成文件的方法,Director类利用这个方法产生一份具体的文件。图5-1显示了各个类间的关系。[图5-1]以下是C++语言实现,能够正确编译通过。[C++代码]classBuilderpublic:virtualvoidmakeTitle(stringtitle)=0;virtualvoidmakestring(stringstr)=0;virtualvoidmakeItems((1)items)=0;virtualstringgetResult()=0;;classDirectorprivate:(2)builder;public:Director(Builder*builder)this->builder=builder;stringconstruct()vectoritems;items.push_back("早安");items.push_back("午安");builder->makeTitle("Greeting");builder->makeString("从早上到白天结束");builder->makeItems(items);builder->makeString("到了晚上");(3);//清空items向量items.push_back("晚安");items.push_back("好梦");builder->makeItems(items);returnbuilder->getResult();;classTextBuilder:public(4)private:stringbuffer;public:TextBuilder()buffer="";voidmakeTitle(stringtitle)buffer+="=======================================/n";buffer+="『"+title+"』/n";buffer+="/n";voidmakeString(stringstr)buffer+="■"+str+"/n";buffer+="/n";voidmakeItems(vectoritems)vector::iteratorit;for(it=items.begin();it!=items.end();it++)buffer+="."+*it+"/n";buffer+="/n";stringgetResult()buffer+="========================/n";returnbuffer;;intmain()Director*director=newDirector(newTextBuilder());stringresult=(string)director-)(5);coutreturn0;
问答题【说明】下面是一个Applet程序,其功能是建立2个文本区域,一个为编辑区,一个为只读区;建立2个按钮,一个实现将编辑区中被鼠标选定的文本内容拷贝到只读区中,一个实现将只读区的全部文本内容清空。程序运行结果如图3所示。importjava.awt.*;importjava.applet.*;/*<appletcode="ex3_6.class"width=800height=400></applet>*/publicclassex3_6extendsApplet{privateButtonokBtn,clearBtn;privateStringstrMessage;privateTextAreatArea1,tArea2;publicvoidinit(){strMessage="Hello!Welcometothetest!/n"+"Wishyougoodluck!";tArea1=newTextArea(10,25);{{U}}(1){{/U}};tArea2=newTextArea(10,25);{{U}}(2){{/U}};OkBtn;newButton("Copy");dearBtn={{U}}(3){{/U}};add(tArea1);add(tArea2);add(okBtn);add(clearBtn);}publicbooleanaction(Evente,Objecto){if(e.target==okBtn)tArea2,setText({{U}}(4){{/U}});elseif(e.target==clearBtn){{U}}(5){{/U}};returntrue;}}ex3_6.htm|<HTML><HEAD><TITLE>ex3_6</TITLE></HEAD><BODY><appletcode="ex3_6.class"Width=800height=400></applet></BODY></HTML>
问答题
【算法说明】
下面是一段插入排序的程序,将R[k+1]插入到R[1...k]的适当位置。
R[0]=R[k+1]; j=k;
while(R[j]>R[0]) {
R[j+1]=R[j]; j- -;
} R[j+1]=R[0]; 【流程图】
【测试用例设计】 (while循环次数为0、1、2次)
表4-1 测试用例表
循环次数
输入数据
预期结果
覆盖路径
j
R[i-2]
R[i-1]
R[i]
R[i+1]
R[0]
j
R[i-2]
R[i-1]
R[i]
R[i+1]
约束
路径
0
i
-
-
1
2
2
i
-
-
1
2
{{U}}(4){{/U}}
i
-
-
1
1
1
i
-
-
1
1
=
①③
1
i
-
1
3
2
2
i-1
-
1
2
3
{{U}}(7){{/U}}
①②③
i
-
2
3
2
2
i-1
-
{{U}}(8){{/U}}
2
{{U}}(9){{/U}}
>=
①②③
2
i
1
3
4
2
2
i-2
1
2
3
4
>>
{{U}}(5){{/U}}
i
2
3
4
2
2
i-2
2
2
3
4
>>=
{{U}}(6){{/U}}
问答题[C++代码]
class Product { //产品
private:
string pid; //产品识别码
string description; //产品描述
double price; ///产品单价
public:
void setProductPrice(double price); //设置产品单价
string getProduetld(); //获取产品识别码
string getProduetDescriprion 0; //获取产品描述
double getProductPrice0; //获得产品单价
//其他成员省略
};
class ProductList { //产品列表类
private:
vector <Product> products;
public:
ProductList();
Product getProductBylndex(int i); //获得产品列表中的第i件产品
void addProduct(Product t); //在产品列表中加入一件产品
Product * getProductByID(string pid); //获得识别码为pid的产品指针
unsigned iht getProductAmount(); //获得产品列表中的产品娄量
};
class OrderItem { //订单条目类
private:
Product *productPtr; //指向被订购产品的指针
int quantity; //订购数量
public:
OrderItem (Product *,iht);
Product * getProductptr O; //获得指向被订购产品的指针
int getQuantity (); //获取被订刚强产品数量
};
class Order { //订单类
private:
unsigned int orderid; //订单识别号
vector<Orderltem> items; //订单内容(订单项)
public:
Order(unsigned int orderid); //获得识别码为fid的产品在当前订单中被订购的数量
int getOrderedAmount(string fid);
void additem(Product *productPtr,unsigned int n); //在订单中增加一个订单项
};
class OrderList { //订单列表类
private:
vector<Order> orders;
public:
OrderList();
//Begin()返回指向订单列表第一个元素的迭代器(指针)
virtual vector<Order>::iterator OrderList::Begin();
//End()返回指向订单列表最后一个元素之后的迭代器(指向一个不存在的元素)
virtual vector<Order>::iterator orderList::End();
void addOrder(Order t); //在订单列表中加入一份订单
//其他成员省略
};
class SalesSystem{
private:
ProductList catalog; //产品目录
OrderList sales; //订单列表
public:
SalesSystem();
void statistic(); //统计所有产品的订购情况
//其他成员省略
};
//在订单中查找识别码为tid的产品的订购数量,若该产品没有被订购,则返回0
int Order::getOrderedAmount(string tid)
{ for (int k=0; k < items.size(); k++) {
if({{U}} (1) {{/U}}==tid)
return {{U}}(2) {{/U}};
}
return 0;
}
//方法statistic()依次统计产品目录中每个产品的订购总量,并打印输出
//每个产品的识别码、描述、订购总量和订购金额
void SalesSystem::statistic()
{ unsigned int k, t, ordered_qty = 0;
vector<Order>::iterator it; Product p;
cout<<''产品识别码/t描述/t/t订购数量/t金额''<<endl;
for (k = 0; k < catalog.gctProductAmount(); k++){//遍历产品列表
p ={{U}} (3) {{/U}}; //从产品列表取得一件产品信息存入变量p
ordered_qty = 0;
//通过迭代器变量it遍历订单列表中的每一份订单
for (it = sales. Begin();{{U}} (4) {{/U}} : it++) {
//根据产品识别码获得产品p在当前订单中被订购的数量
t ={{U}} (5) {{/U}}(p.getProductld());
ordered_qty +=t;
}
cout << p.getProducfld() << "/t/t"<< p.gntProductDescription() << "/t/t";
cout <<ordered_qty << "/t/t" << p.getProductPrice() * ordered_qty << endl;
}
}
问答题 阅读下列说明和图,回答问题1至问题3。
【说明】 某图书管理系统的主要功能如下:
1.图书管理系统的资源目录中记录着所有可供读者借阅的资源,每项资源都有一个唯一的索引号。系统需登记每项资源的名称、出版时间和资源状态(可借阅或已借出)。
2.资源可以分为两类:图书和唱片。对于图书,系统还需登记作者和页数;对于唱片,还需登记演唱者和介质类型(CD或者磁带)。
3.读者信息保存在图书管理系统的读者信息数据库中,记录的信息包括:读者的识别码和读者姓名。系统为每个读者创建了一个借书记录文件,用来保存读者所借资源的相关信息。
现采用面向对象方法开发该图书管理系统。识别类是面向对象分析的第一步。比较常用的识别类的方法是寻找问题描述中的名词,再根据相关规则从这些名词中删除不可能成为类的名词,最终得到构成该系统的类。表10-4给出了[说明]中出现的所有名词。{{B}} 表10-4{{/B}}
图书管理系统
资源目录
读者
资源
索引号
系统
名称
出版时间
资源状态
图书
唱片
作者
页数
演唱者
介质类型
CD
磁带
读者信息
读者信息数据库
识别码
姓名
借书记录文件
信息
通过对表10-4中的名词进行分析,最终得到了图10-4所示的UML类图(类的说明如表10-5所示)。{{B}} 表10-5{{/B}}
类名
说明
LibrarySystem
图书管理系统
BorrowerDB
保存读者信息的数据库
CatalogItem
资源目录中保存的每项资源
Borrower
读者
BorrowerItems
为每个读者创建的借书记录文件
问答题[说明] 以下C语言程序实现了生成从里到外是连续的自然数排列的回旋矩阵,矩阵形式如下: 7 6 5 16 8 1 4 15 9 2 3 14 10 11 12 13 程序的变量说明如下: x1:矩阵上边界; x2:矩阵下边界; y1:矩阵左边界; y2:矩阵右边界; s:数组元素升降标记,s等于1为升,s等于-1为降; a[]:存放矩阵元素的数组。 仔细阅读C语言程序源码,将 (n) 处的语句补充完整。(注:每处仅一个语句) [C程序] #include<stdio.h> void main ( ) const int N=20; int i=0,j=0,a[N][N],n; int m,x1,x2,y1,y2,s; while (1) Printf ("/ninput matrix row N( N>=2): "); scanf ("%d", printf ("/n"); if (n>=2) break; m=n*n; x1=0; y1=0; x2=n; y2=n; if(n%2==0) j=n-1; y2=n-1; s=1; else i=n-1; y1=1; s=-1; while (1) if (s==1) for (i; i<x2; i++) a[i][j]=m--; i--; j--; (1) for (j;j>=y1;j--) a[i][j]=m--; j++; i--; y1++; (2) else for (i;i>=x1;i--) a[i][j]=m--; i++; j++; (3) for (j;j<y2;j++) (4) (5) i++; (6) S=i; if (m<1) break; for (i=O;i<n; i++) for (j=O;j<n;j++) printf ("%6d",a[i][j]); printf ("/n"); printf ("/n");
问答题【说明】设单链表的结点类和链表类的定义如下,链表不带有表头结点。请填空: #include<iostream.h> #include<assert.h> template<class T>class List; template<class T>class ListNOde friend (1) ; 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++) (2) ; 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( (3) ); template<class T> ostream& operator<<(ostream& ost,List<T>& L) (4) ; template<class T> void List<T>::printList(ostream& ost,ListNode<T>*p) if(p!=NULL) ost<<p->data; (5) ;
问答题【说明】 通常情况下,用户可以对应用系统进行配置,并将配置信息保存在配置文件中,应用系统在启动时首先将配置文件加载到内存中,这些内存配置信息应该有且仅有一份。 下面的代码应用了单身模式(Singleton)以保证Configure类只能有一个实例。这样,Configure类的使用者无法定义该类的多个实例,否则会产生编译错误。 # include <iostream.h> class Configure (1) ; Configure(); //构造函数 public: static Configure *Instance(); public: int GetConfigureData()return data; //获取配置信息 int SetConfigureDate(int m_data) data=m_data; return data; //设置配置信息 private: static Configure* _instance; int data; //配置信息 ; (2) =NULL; Configure * Configure∷Instance() if(_instance==NULL) _instance= (3) ; //加载配置文件并设置内存配置信息,此处省略 return (4) ; void main() Configure *t=NULL; t= (5) ; int d=t->GetConfigureData(); //获取配置信息后进行其它工作,此处省略
问答题[说明]某高校欲开发一个成绩管理系统,记录并管理所有选修课程的学生的平时成绩和考试成绩,其主要功能描述如下:1.每门课程都由3到6个单元构成,每个单元结束后会进行一次测试,其成绩作为这门课程的平时成绩。课程结束后进行期末考试,其成绩作为这门课程的考试成绩。2.学生的平时成绩和考试成绩均由每门课程的主讲教师上传给成绩管理系统。3.在记录学生成绩之前,系统需要验证这些成绩是否有效。首先,根据学生信息文件来确认该学生是否选修这门课程,若没有,那么这些成绩是无效的;如果他的确选修了这门课程,再根据课程信息文件和课程单元信息文件来验证平时成绩是否与这门课程所包含的单元相对应,如果是,那么这些成绩是有效的,否则无效。4.对于有效成绩,系统将其保存在课程成绩文件中。对于无效成绩,系统会单独将其保存在无效成绩文件中,并将详细情况提交给教务处。在教务处没有给出具体处理意见之前,系统不会处理这些成绩。5.若一门课程的所有有效的平时成绩和考试成绩都已经被系统记录,系统会发送课程完成通知给教务处,告知该门课程的成绩已经齐全。教务处根据需要,请求系统生成相应的成绩列表,用来提交考试委员会审查。6.在生成成绩列表之前,系统会生成一份成绩报告给主讲教师,以便核对是否存在错误。主讲教师须将核对之后的成绩报告返还系统。7.根据主讲教师核对后的成绩报告,系统生成相应的成绩列表,递交考试委员会进行审查。考试委员会在审查之后,上交一份成绩审查结果给系统。对于所有通过审查的成绩,系统将会生成最终的成绩单,并通知每个选课学生。现采用结构化方法对这个系统进行分析与设计,得到如图1-1所示的顶层数据流图和图1-2所示的0层数据流图。
问答题[程序5说明] 下列文法可用来描述化学分子式的书写规则(例如,A12(CO3)3”Cu(OH)2): λ→β/βλ β→δ/δn δ→ξ/ξθ/(λ) 其中:λ是—个分子式;δ或是一个元素,或是一个带括号的(子)分子式,元素或是一个大写字母(记为ξ),或是一个大写字母和一个小写字母(记为ξθ)β或是一个δ,或是在δ之后接上一个整数n,δn表示β有n个δ的元素或(子)分子式。—个完整的分子式由若干个β组成。 当然一个正确的分子式除符合上述文法规则外,还应满足分子式本身的语义要求。 下面的程序输入分子式,按上述文法分析分子式,并计算出该分子式的分子量。例如:元素H的原子量是1,元素O的原子量是16。输入分子式H2O,程序计算出它的分子量为18 (1×2+16)。程序中各元素的名及它的原子量从文件atom.dat中读入。 [程序5] #include < stdio. h > #include < string. h > #define MAXN 300 #define GMLEN 30 struct elem char name[ ]; /* 元素名*/ double v;/*原子量*/ nTbl [MAXN]; char cmStr [GMLEN], * 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); retur n - 1.0; elseif (c = ='(') if((num= (1) ) <0.0)return -l.0; /*包括可能为空的情况*/ if( * pos ++ ! = ')') printf (" 分子式中括号不匹配!/n") ;return - 1.0; return num; printf ("分子式中存在非法字符:/t%c/n" ,c); return - 1.0; double mAtom( ) /* 处理文法符号β*/ double num ;int n = ]; if((num= (2) ) <0.0)return-l.0; c= *pos++; if(c >='O' while(c > = 0 c= *poss ++; pos --; return num * n; double factor( ) /*处理文法符号λ*/ double num =0.0,d; if(( hum = mAtom ( )) < 0.0) return - 1.0; while( * pos >= 'A' (5) ; return num;void main( ) char fname[ ] ="atom. dst"; /*元素名及其原子量文件*/int i;double num;if((fp=fopon(fname,"r" )) == NULL) /*以读方式打开正文文件*/ prinff("Can net open%s file. /n' ,fname) ;return /*程序非正常结束 */i=0;while(i < MAXNfclose(fp) ;nTbl[i]. v =-1.0;while(1) [/*输入分子式和计算分子量循环,直至输入空行结束*/ printf(" /n 输入分子式! (空行结束) /n" ) ;gets(cmStr); pos = cmStr; if(cmStr[0] == '/0') break; if( (num = later( ) ) > 0.0) if( * pos! = '/0')printf("分子式不完整! /n" ); else printf("分子式的分子量为%f/n",num);
问答题【说明】一棵非空二叉树中“最左下”结点定义为:若树根的左子树为空,则树根为“最左下”结点;否则,从树根的左子树根出发,沿结点的左孩子分支向下查找,直到某个结点不存在左孩子时为止,该结点即为此二叉树的“最左下”结点。例如:图13-26所示的以A为根的二叉树的“最左下”结点为D,以C为根的子二叉树中的“最左下”结点为C。二叉树的结点类型定义如下:typedefstructBSTNodeintdata;structBSTNode*lch,*rch;//结点的左、右孩子指针*BSTree;代码13-7中,函数BSTreeFind_Del(BSTreeroot)的功能是:若root指向一棵二茶树的根结点,则找出该结点的右子树上的“最左下”结点*p,并从树中删除以*p为根的子树,函数返回被删除子树的根结点指针;若该树根的右子树上不存在“最左下”结点,则返回空指针。【代码13-7】BSTreeFind_Del(BSTreeroot)BSTreep,pre;If(!root)/*root指向的二叉树为空树*/returnNULL;(1);/*令p指向根结点的右子树*/if(!p)returnNULL;(2);/*设置pre的初值*/while(p->lch)/*查找“最左下”结点*/pre=p;p=(3);if((4)==root)/*root的右子树根为“最左下”结点*/pre->rch=NULL;else(5)=NULL;/*删除以“最左下”结点为根的子树*/returnp;
问答题[问题2] 请用IDEF0。图描绘该功能的需求。
问答题[说明]某音像制品出租商店欲开发一个音像管理信息系统,管理音像制品的租借业务。需求如下。(1)系统中的客户信息文件保存了该商店所有客户的用户名、密码等信息。对于首次来租借的客户,系统会为其生成用户名和初始密码。(2)系统中音像制品信息文件记录了商店中所有音像制品的详细信息及库存数量。(3)根据客户所租借的音像制品的品种,会按天收取相应的费用。音像制品的最长租借周期为一周,每位客户每次最多只能租借6件音像制品。(4)客户租借某种音像制品的具体流程如下。①根据客户提供的用户名和密码,验证客户身份。②若该客户是合法客户,查询音像制品信息文件,查看商店中是否还有这种音像制品。③若还有该音像制品,且客户所要租借的音像制品数不多于6个,就可以将该音像制品租借给客户。这时,系统给出相应的租借确认信息,生成一条新的租借记录并将其保存在租借记录文件中。④系统计算租借费用,将费用信息保存在租借记录文件中并告知客户。⑤客户付清租借费用之后,系统接收客户付款信息,将音像制品租借给该客户。(5)当库存中某音像制品数量不能满足客户的租借请求数量时,系统可以接受客户网上预约租借某种音像制品。系统接收到预约请求后,检查库存信息,验证用户身份,创建相应的预约记录,生成预约流水号给该客户,并将信息保存在预约记录文件中。(6)客户归还到期的音像制品,系统修改租借记录文件,并查阅预约记录文件和客户信息文件,判定是否有客户预约了这些音像制品。若有,则生成预约提示信息,通知系统履行预约服务,系统查询客户信息文件和预约记录文件,通知相关客户前来租借音像制品。现采用结构化方法对音像管理信息系统进行分析与设计,得到如图1所示的项层数据流图和如图2所示的0层数据流图。
问答题【说明】 现有事务T1,T2、L3它们对数值型数据A执行的操作分别如下: T1;将A加1。 T2:将A加倍。 T3:输出A的值,并将A置为1。
问答题请阅读以下技术说明、类图及C++代码,回答下列问题。[说明]已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批。主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。采用责任链设计模式(ChainofResponsibility)对上述过程进行设计后得到的类图如图8-23所示。[C++代码]#include<String>#include<iostream>usingnamespacestd;classPurchaseRequestpublic:doubleAmount;//采购的金额intNumber;//采购的单号stringPurpose;//采购的目的;classApprover//审批者类public:Approver()successor=NULL;virtualvoidProcessRequest(PurchaseRequestaRequest)ifsuccessor!=NULL)successor->______;voidSetSuccessor(Approver*aSuccesssor)successor=aSuccesssor;private:______successor;;classCongress:publicApproverpublic:voidProcessRequest(PurohaseRequestaRequest)if(aRequest.Amount>:500000)/*决定是否审批的代码省略*/else______ProcessRequest(aRequest);;classDirector:publicApproverpublic:voidProcessRequest(PurchaseRequestaRequest)/*此处代码省略*/;classPresident:publicApproverpublic:voidProcessRequest(PurchaseRequestaRequest)/*此处代码省略*/;classVicePresident:publicApproverpublic:voidProcessRequest(PurchaseRequestaRequest/*此处代码省略*/;voidmain()CongressMeeting;VicePresidentSam;DirectorLarry;PresidentTammy;//构造责任链Meeting.SetSuccessor(NULL);Sam.SetSuccessor(______);Tammy.SetSuccessor(______);Larry.SetSuccessor(______);PurchaseRequestaRequest;//构造一采购审批请求cin>>aRequest.Amount;//输入采购请求的金额______.ProcessRequest(aRequest);//开始审批return;
问答题【问题3】
在过程启动表中,d,e处应填什么?请分别用4位二进制码表示。
问答题[说明]已知集合A和B的元素分别用不含头节点的单链表存储,函数Difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},如下图(a)所示,运算完成后的结果如下图(b)所示。链表节点的结构类型定义如下:typedefstructNode{ElemTypeelem;structNode*next;}NodeType;[C程序]voidDifference(NodeType**LA,NodeType*LB){NodeType*pa,*pb,*pre,*q;pre=NULL;______;while(pa){pb=LB;while(______)pb=pb→next;if(______){if(!pre)*LA=______;else______=pa→next;q=pa;pa=pa→next;free(q);}else{______;pa=pa→next;}}}
问答题[说明]图书管理系统详细记录图书库存情况、读者信息以及读者借阅记录(包括借书日期和还书日期)。新书入库时要为该书编制图书卡片,包括分类目录号、图书流水号(要保证每本书都有唯一的流水号,即使同类图书也是如此)、书名、作者、内容摘要、价格和购书目期。同一个书名由于版次、作者等不同有可能存在多“种”图书,其间用“分类目录号”区分。系统为每一位合法读者编制一个唯一的借书证号,读者需要提供姓名、单位。一个读者最多可以同时借阅5本图书。借阅图书时,新添借阅记录,并将对应的“归还标记”字段置为“false”,表示“尚未归还”;归还图书时,将相应的“归还标记”字段置为“true”,表示“已经归还”。一本书可能供多位读者借阅,同一本书读者可以重复借阅。图2-1为该系统的E-R图。[图2-1]
问答题 阅读下列说明,回答问题1至问题3,将解答填入对应栏内。
【说明】
某餐厅供应各种标准的营养套餐。假设菜单上共有n项食物m1,m2,…,mn,每项食物mi的营养价值为vi,价格为pi其中i=1,2,…,n,套餐中每项食物至多出现一次。客人常需要一个算法来求解总价格不超过M的营养价值最大的套餐。
