问答题[说明] 以下C++代码使用虚函数实现了同一基类shape派生出来的Class rectangle、Class triangle、Class circle实现了计算矩形、圆形面积的计算。仔细阅读以下代码,将 (n) 处语句补充完整。 [代码5-1]#include<iostream.h> #define PI 3.14159 class shape //基类 protected: (1) ; public: (2) ; (3) ; ; [代码5-2] class rectangle: public shape public: rectangle (int x2,int y2,int r2): (4) ; double area ( ) return x*y; ; ; class circle: public shape public: circle (int x3,int y3,int r3): (5) ; double area ( ) return r*r*PI; ; ; [代码5-3] void main ( ) rectangle r (10,20,0); circle c (0,0,30); shape (6) ; cout<<"长方形面积="<<s1->area ( ) <<endl; cout<<"圆形面积="<<s2->area ( ) <<endl; [运行结果] 长方形面积=200 圆形面积=2827.43
问答题【函数1说明】 函数compare(SqList A, SqList B)的功能是:设A=(al,…,am)和B=(b1,…,bn)均为顺序表,“比较”,两个顺序表A和B的大小。设A’ 和B’ 分别为A和B中除去最大共同前缀后的子表(例如,A=(y,x,x,z,x,z),B=(y,x,x,2,y,x,x,z),则两者中最大的共同前缀为 (y,x,x,z),在两表中除去最大共同前缀后的子表分别为A'=(x,z)和B'=(y,x,x,z))。若 A'=B'=空表,则A=B;若A'=空表,而B'≠空表,或者两者均不为空表,且A'的首元小于 B'首元,则A<B:否则A>B。 提示:算法的基本思想为:若相等,则j+1,之后继续比较后继元素;否则即可得出比较结果。显然,j的初值应为0,循环的条件是j不超出其中任何一个表的范围。若在循环内不能得出比较结果,则循环结束时有3种可能出现的情况需要区分。 【函数1】 int compare ( SqListA, SqList B) //若A<B,则返回-1;若A=B,则返回0:若A>B,则返回1 j =0; while(i< (1) else (2) ; if(A. length == B. length) return(0); else if(A. length<B. length)return(-1); else return(1)//compare //函数1的时间复杂度是 (3) 。 【函数2说明】 函数exchanse_L(SLnk&L,int m)的功能是:用尽可能少的辅助空间将单链表中前m个结点和后n个结点的互换。即将单链表(a1、a2…,am,b1,b2,…,bn)改变成(b1,b2,…,bn,a1, a2,…,am,)。【函数2】void exchange_L(SLink k=1; while( k < m++k; if( (6) //以指针ha记a1结点的位置 L -> next = p -> next; //将B1结点链接在头结点之后 p -> next = NULL; //设am的后继为空 q= (7) ; //令q指向b1结点 while(q->next)q = (8) ; //查找bn结点 q->>next= (9) ; //将a1结点链接到bn结点之后 //函数2的时间复杂度是 (10) 。
问答题快速排序是一种典型的分治算法。采用快速排序对数组A[p..r]排序的三个步骤如下:
分解:选择一个枢轴(pivot)元素划分数组。将数组A[p..r]划分为两个子数组(可能为空)A[p..q-1]和A[q+1..r],使得A[q]大于等于A[p..q-1]中的每个元素,小于A[q+1..r]中的每个元素。q的值在划分过程中计算。
递归求解:通过递归的调用快速排序,对子数组A[p..q-1]和A[q+1..r]分别排序。
合并:快速排序在原地排序,故不需合并操作。
问答题[说明] 很多时候,希望某些类只有一个或有限的几个实例,典型解决方案是所谓单身(Singleton)模式。但在多线程情况下,singleton模式有可能出现问题,需要进行同步检查。如果对“检查Singleton对象是否已经创建”进行同步,则存在严重的瓶颈,所有的线程都必须待检查对象是否存在。解决方式是一种称为Double-Checked-Locking模式,其意图是将非必须的锁定优化掉,同步检查最多只发生一次,因此不会成为瓶颈。以下是Java语言实现,能够正确编译通过。 [Java代码] public class USTax private static USTax instance = null; ______ USTax() private ______ static void doSync() if(instance == null) System.out.println ("实例不存在,创建实例..."); instance = ______; System.out.print ln ("实例创建成功"); else System.out.println ("实例已被创建了"); public static USTax getInstance() if(instance == null) System.out.println ("实例暂时不存在"); ______; / /同步控制 else System.out.println ("实例已经存在"); return ______; .
问答题【说明】栈(Stack)结构是计算机语言实现中的一种重要数据结构。对于任意栈,进行插入和删除操作的一端称为栈顶(StockTop),而另一端称为栈底(StockBottom)。栈的基本操作包括:创建栈(NewStack)、判断栈是否为空(IsEmpty)、判断栈是否已满(IsFull)、获取栈顶数据(Top)、压栈/入栈(Push)、弹栈/出栈(Pop)。当设计栈的存储结构时,可以采取多种方式。其中,采用链式存储结构实现的栈中各数据项不必连续存储(如下图所示)。以下C代码采用链式存储结构实现一个整数栈操作。【C代码】typedefstructListintdata;//栈数据structList*next;//上次入栈的数据地址List;typedefstructStackList*pTop;//当前栈顶指针Stack;Stack*NewStack()return(Stack*)calloc(1/sizeof(Stack));intIsEmpty(Stack*S)//判断栈S是否为空栈if((1))return1;return0;intTop(Stack*s)//获取栈顶数据。若栈为空,则返回机器可表示的最小整数if(IsEmpty(S))returnINT_MIN;return(2);voidPush(Stack*S,inttheData)//将数据theData压栈List*newNode;newNode=(List*)calloc(1/sizeof(List));newNode->data=theData;newNode->next=S->pTop;S->pTop=(3);voidPop(Stack*S)//弹栈List*lastTop;if(IsEmpty(S))return;lastTop=S->pTop;S->pTop=(4);free(lastTop);#defineMD(a)a<<2intmain()inti;Stack*myStack;myStack=NewStack();Push(myStack,MD(1));Push(myStack,MD(2));Pop(myStack);Push(myStack,MD(3)+1);while(!IsEmpty(myStack))printf("%d",Top(myStack));Pop(myStack);return0;以上程序运行时的输出结果为:(5)
问答题[问题1]根据以上说明设计的实体联系图如下图所示,请指出读者与图书、书目与读者、书目与图书之间的联系类型。
问答题[说明]在一些财务软件中,经常需要将阿拉伯数字的账目转化为汉语习惯中的金额计数方法,例如:“3.45”转化为“叁元四角五分”;“3.4”转化为“叁元四角”;“3.40”转化为“叁元四角零分”;“3.456”转化为“叁元四角五分”;“345.00”转化为“叁百四十五元零角零分”;“345”转化为“叁百四十五元”;以下VisualBasic代码实现了小写金额转换为大写金额。界面如图10-9所示。结合实际例子说明,仔细阅读下面代码,将(n)代码补充完整。[代码7-1]BeginVB.FormForm1Caption="小写金额转换为大写金额"//...窗体描述(略)BeginVB.CommandButtonCommand1Caption="退出"//...窗体描述(略)EndBeginVB.TextBoxText2//...窗体描述(略)EndBeginVB.TextBoxText1Enabled=0'False//…窗体描述(略)EndBeginVB.Labe1Labe12Caption="转换为大写金额"//...窗体描述(略)EndBeginVB.Labe1Labe11Caphon="请输入数字"//...窗体描述(略)EndEnd[代码7-2]PrivateFunctionsetdata(numAsInteger)AsString'数字转换SelectCaSenumCase0setdata="零"Case1Setdata="壹"Case2Setdata="贰"Case3Setdata="叁"Case4Setdata="肆"Case5Setdata="伍"Case6Setdata="陆"Case7Setdata="柒"Case8Setdata="捌"Case9Setdata="玖"EndSelectEndFunctionPrivateFunctionchang(aaaAsInteger)AsString'位数转换SelectCaSeaaaCase1chang=""Case2chang="十"Case3chang="百"Case4chang="千"Case5chang="万"Case6chang="十"Case7chang="百"Case8chang="千"Case9chang="亿"Case10chang="十"EndSelectEndFunction[代码7-3]PrivateSubText2_Change()'小写转大写DimiAsIntegerDimjAsIntegerDimmyintAsIntegerDimmyint1AsIntegerDimmydoubAsDoubleDimmystrAsStringDimmystr1AsStringDimmystr2AsStringDimmystr3AsStringDimmystr4AsStringDimmoneyAsLongDimmoney1AsIntegerDimmoney2AsLongmystr=Text2.Textmyint=InStr(mystr,".")Ifmyint=0Thenmystr=Text2.TextElsemystr3=Right(Text2.Text,Len(Text2.Text)-myint)Ifmystr3<>""Then'转换小数位mystr4=Left(mystr3,1)mystr3=Right(mystr3,Len(mystr3)-1)Ifmystr4<>"0"Then(1)EndIfIfmystr3<>""Thenmystr4=Left(mystr3,1)(2)EndIfEndIfmystr=Left(Text2.Text,myint-1)EndIfj=Len(mystr)Fori=1ToLen(mystr,i)money2=Left(mystr,i)money1=Right(money2,1)Ifmoney1=0ThenIfj=5Then(3)Else(4)EndIfElse(5)EndIfj=j-1NextiText1.Text=mystr1&"元"&mystr2'显示大写Endsub
问答题有下列关于运动会管理系统的ER图,如图10所示。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体之间的关系。假定已通过下列SQL语言建立了基本表。CREATETABLEATHLETEANAMECHAR(20),ASEXCHAR(1),ATEAMCHAR(20));CREATETABLE|TEM(INOCHAR(6)NOTNULL,INAMECHAR(20),ITIMECHAR(12),IPLACECHAR(20);CREATETABLEGAMES(ANOCHAR(6)NOTNULL,INOCHAR(6)NOTNULL,SCORRECHAR(10));为了答题的方便,图中的实体和属性同时给出了中英文两种文字,回答问题时只需写出英文名即可。【E-R图】【问题】填充下列SQL程序1~4中的(1)~(7),使它们分别完成相应的功能:程序1:统计参加比赛时男运动员人数。SELECT{{U}}(1){{/U}}FROMATHLETEWHEREASEX='M';程序2:查100872号运动员参加的所有项目及其比赛时间和地点。SELECTITEM,INO,INAME,ITIME,IPLACEFROMGAMES,ITEMWHERE{{U}}(2){{/U}};AND{{U}}(3){{/U}};程序3:查参加100035项目的所有运动员名单。SELECTANO,ANAME,ATEAMFROMATHLETEWHERE{{U}}(4){{/U}};(SELECT{{U}}(4)(5){{/U}}FROMGAMESWHEREGAMESANO=ATHLETE.ANOANDINO='100035');程序4:建立运动员成绩视图。{{U}}(6){{/U}}ATHLETE-SCOREASSELECTATHLETE,ANO,ANAME,ATEAM,INAME,SCOREFORM{{U}}(7){{/U}}WHEREATHLETE.ANO=GAMES.ANOANDGAMES.INO=ITEM.INO;
问答题【说明】 源程序中定义了Circle类与Money类,Circle类可对半径为r的圆进行周长与面积的计算,而Money类用于计算一圆形游泳池的造价。游泳池四周有原形过道,过道外围上栅栏,过道宽度为3米,根据键入的游泳池半径,每米栅栏价格及每平方米过道价格,即可计算出游泳池的造价。请按要求完成下列操作,将程序补充完整。 ①定义符号常量PI(值为3.14159f)与WIDTH(值为3.00f),分别用于表示圆周率与过道的固定宽度。 ②定义Circle类默认构造函数,把私有成员radius初始化为参数r的值。 ③完成Money类默认构造函数的定义,把私有成员FencePrice(每米栅栏的价格)、ConcretePrice(每平方米过道的价格)初始化为参数f,c的值。 ④完成Money类成员函数float Money::TotalMoney(float fencelen,float conarea)的定义,根据参数fencelen(栅栏的长度)和conarea(过道的面积),返回栅栏与过道的总造价。 注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。 源程序文件test4.cpp清单如下: #include<iostream.h> (1) class Circle private: float radius; public: (2) float Circumference()return 2 * P| * radius; float Area()return P|*radius * radius; ; class Money private: float FencePrice; float ConcretePrice; public: Money(float f,float c); float Tota|Money(float fencelen, float conarea); ; Money::Money(float f,float c) (3) float Money::Tota|Money(float fencelen, float conarea) (4) void main( ) float radius, fence, concrete; cout. setf(ios:: fixed); cout. setf(ios:: showpoint); cout. precision (2); cout << "Enter the radius of the pool:"; cin > > radius; cout << "Enter the FencePrice:"; cin > > fence; cout << "Enter the ConcretePrice: "; cin > > concrete; Circle Pool(radius); Circle PoolRim(radius + WIDTH); Money mon( fence, concrete); float totalmoney = mon. TotalMoney( PoolRim. Circumference( ), ( PoolRim. Area ( ) - Pool. Area ( ) ) ); cout << "The total money is RMB" << totalmoney << end|;
问答题试题七(共15分) 阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接(Bridge)设计模式进行设计所得类图如图7-1所示。 采用该设计模式的原因在于:系统解析BMP、GIF与JPEG文件的代码仅与文件格式相关,而在屏幕上显示像素矩阵的代码则仅与操作系统相关。 【Java代码】 classMatrix{//各种格式的文件最终都被转化为像素矩阵 //此处代码省略 }; abstractclassImageImp{ publicabstractvoiddoPaint(Matrixm);//显示像素矩阵m }; classWinImpextendsImageImp{ publicvoiddoPaint(Matrixm){/*调用windows系统的绘制函数绘制像素矩阵*/} }; classLinuxImpextendsImageImp{ publicvoiddoPaint(Matrixm){/*调用Linux系统的绘制函数绘制像素矩阵*/} }; abstractclassImage{ publicvoidsetImp(ImageImpimp){ ________=imp;} publicabstractvoidparseFile(StringfileName); protected________imp; }; classBMPextendsImage{ publicvoidparseFile(StringfileName){ //此处解析BMP文件并获得一个像素矩阵对象m ________;//显示像素矩阵m } }; classGIFextendsImage{ //此处代码省略 }; classJPEGextendsImage{ //此处代码省略 }; publicclassjavaMain{ publicstaticvoidmain(String[]args){ //在windows操作系统上查看demo.bmp图像文件 Imageimage1=________; ImageImpimageImp1=________; ________; image1.parseFile("demo.bmp"); } } 现假设该系统需要支持10种格式的图像文件和5种操作系统,不考虑类Matrix和类javaMain,若采用桥接设计模式则至少需要设计________个类。
问答题【说明】在一公文处理系统中,开发者定义了一个公文结构OfficeDoc,其中定义了公文应该具有的属性。当公文的内容或状态发生变化时,与之相关联的DocExplorer结构的值都需要发生改变。一个OfficeDoc结构能够关联一组DocExplorer结构。当OfficeDoc结构的内容或状态发生变化时,所有与之相关联的DocExplorer结构都将被更新,这种应用被称为观察者模式。以下代码采用C语言实现,能够正确编译通过。【代码13-4】#include<stdio.h>#defineOBS_MAXNUM20/*一个OfficeDoc变量最多能够关联的DocExplorer变量的个数*/typedefvoid((1))(strucOffieeDoc*,structDoeExplorer*)I;structDocExplorerfuncupdate;/*DocExplorer结构采用的更新函数*//*其它的结构字段省略*/;struetOffieeDoc(2)myObs[OBS_MAXNUM;/*存储所有与OfficeDoc相关联的DocExplorer结构指针*/intindex;/*与OffieeDoc结构变量相关联的DoeExplorer结构变量的个数*/;voidattaeh(structOfficeDoc*doc,structDocExplorer*ob)/*关联Observer结构ob与OffieeDoe结构doe*/intloop=0;if(doc->index>=OBS_MAXNUM||ob==NULL)return;for(loop=0,loop<doc->index;loop++)if(doc->myObs[loop]==ob)return;doc->myObs[doe->index]=ob;doc->index++;voiddetaeh(structOfficeDoc*doc,structDocExplorer*ob)/*解除doc结构与ob结构间的关联*/intloop;if(ob==NULL)return;for(loop=0;loop<doc->index;loop++)if(doe->myObs[loop]==ob)if(loop<=doc->index-2)doc->myObs[loop]=doc->myObs[(3)];doc->myObs[doc->index-1]=NULL;doc->index——;breack;voidupdatel(structOfficeDoe*doe,structDoeExplorer*ob)/*更新ob结构的值,更新代码省略*/voidupdate2(structOffieeDoc*doc,struetDocExplorer*ob)/*更新ob结构的值,更新代码省略*/voidnotifyObs(structOfficeDoc*doc)/*当doc结构的值发生变化时,通知与之关联的所有DocExplorer结构变量*/intloop;for(loop=0;loop<doc->index;loop++)(doc->myObs[loop)->update((4));voidmain()structOfficeDocdoc;/*定义一了OfficeDoe变量*/structDocExplorerexplorer1,explorer2;/*定义两个DocExplorer变量*//*初始化与OfficeDoc变量相关的DocExplorer变量个数为0*/doc.index=0;explorer1.update=update1;/*设置explorer1变量的更新函数*/explorer2.update=update2;/*设置explorer2变量的更新函数*/attach(/*关联explorer1与doc对象*/attach(/*关联explorer2与doc对象*//*其它代码省略*/(5);/*通知与OfficeDoe相关的所有DoeExploer变量*/return;
问答题[说明] ①定义私有数据成员code、english分别用于表示考生的编号、英语成绩,它们都是int型的数据。 ②完成成员函数void Student::inputinformation()的定义,该函数用于用户输入一个考生对象的信息,输入格式如下: 输入编号: 英语成绩: 计算机成绩: ③利用已实现的类Student的成员函数,完成函数void firstname(Student *A[],int uum)的定义,该函数根据考生信息A[],输出num个考生中总分最高者的编号及其相应的总分,在此不考虑总分相同的情况。 源程序文件test1.cpp清单如下: #include < iostream. h > class Student (1) int computer; int total; public void getinformation( ); void computesum( ); int getcode( ); int gettotalscore( ); ~Student( ); ; void Student: :getinformation( ) (2) cout <<"英语成绩:"; cin> >english; cout <<"计算机成绩:"; cin > > computer; void Student:: computesum ( ) total = english + computer; cout <<"编号" << code <<"总分:" <<total << endl; int Student::getcode( ) return code; int Student:: gettotalscore ( ) return total; void firstname(Student * A[] ,int num) (3) tempsum = ( * A[0] ). gettotalscore( ); for( int i=1; i <num; i++) if ( ( ( * A[i] ). gettotalscore( ) ) > tempsum) tempcode = ( * A[i] ). getcode( ); tempsum = ( * A[i] ). gettotalscore( ); cout <<"总分最高者--" << tempcode <<":" << tempsum <<endl; void main( ) Student * A[3]; int i,n =3 for(i=0;i<n;i ++) A[i] = new Student; A[i] -> getinformation( ) for(i=0;i<n;i ++) A[i] -> computesum( ) firstname ( A,3 );
问答题阅读下列算法说明和算法,将应填入(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) ;
