问答题[说明]对多个元素的聚合进行遍历访问时,需要依次推移元素,例如对数组通过递增下标的方式,数组下标功能抽象化、一般化的结果就称为迭代器(Iterator)。模式以下程序模拟将书籍(Book)放到书架(BookShelf)上并依次输出书名。这样就要涉及到遍历整个书架的过程。使用迭代器Iterator实现。图5-1显示了各个类间的关系。以下是C++语言实现,能够正确编译通过。[图5-1][C++代码]template(1)>classIteratorpublic:virtualboolhasNext()=0;(2)Object*next()=0;;classBook//省略具体方法和属性;classBookShelfprivate:vectorbooks;public:BookShelf()Book*getBookAt(intindex)returnintgetLength()returnbooks.size();;templateclassBookshelfIterator:public(3)private:BookShelf*bookShelf;intindex;public:BookshelfIterator(BookShelf*bookShelf)this->bookShelf=bookShelf;index=0;boolhasNext()//判断是否还有下一个元素if(indexgetLength())returntrue;elsereturnfalse;Objeot*next()//取得下一个元素returnbookShelf->getBookAt(index++);;intmain()BookShelfbookShelf;//将书籍上架,省略代码Book*book;Iterator*it=newBookShelfIterator((4));while((5))//遍历书架,输出书名book=(Book*)it->next();/*访问元素*/return0;
问答题[问题1]
如果将数据库服务器(记为DB)作为一个外部实体,那么在绘制该系统的数据流图时,还应有哪些外部实体和数据存储?
问答题[说明] 以下C程序实现了将字符串转化为浮点数的功能。例如字符串“1234567”转化为浮点数1234567;字符串“100.02035”转化为浮点数100.02035;字符串“-100.02035”转化为浮点数-100.02035。程序中的部分变量的含义如表9-5。 表9-5 变量名 含 义 intpart 字符串转化为浮点数后的整数部分 doublepart 字符串转化为浮点数后的小数部分 kdouble 记录小数部分的阶次 resoult 字符串转化为浮点数后的结果 psign 字符串转化为浮点数后的符号标识 [C程序] double StrToDouble(char*s) char hexch[]="0123456789"; int i,j,psign=1; DWORD n,k,intpart=0; double doublepart=0,kdouble,resoult; char ch; if (*s=='.' (1) ; (2) ; char*s1=s,*temp=NULL; temp=strrchr ( s1,'.' ); if (!temp) k=1; intpart=0; for (i=strlen (s); i>0;i--) ch=s[i-1]; if (ch>0x3f) ch n=0; for (j=0; j<10; j++) if ( ch==hexch[j]) n=j; intpart+= (n*k); k*=10; else s1=temp+1; kdouble=0.1; doublepart=0; for ((3) ) ch=s1[i-1]; if (ch>0x3f) ch n=0; for (j=0; j<10; j++ ) if (ch==hexch[j]) n=j; doublepart+= (n*kdouble); (4) ; *temp=NULL; k=1; intpart=0; for ((5) ;) ch=s[i-1]; if (ch>0x3f) ch n=0; for (j=0; j<10; j++) if (ch==hexch[j]) n=j; intpart+= (n*k); k*=10; //end else (6) ; return resoult;
问答题【说明】 下面是某医院信息管理系统中需要的信息。 科室:科名、科地址、科电话、医生姓名。 病房:病房号、床位号、所属科室名。 医生:姓名、职称、所属科室名、年龄、工作证号。 病人:病历号、姓名、性别、诊断、主管医生、病房。 其中,一个科室有多个病房,多个医生,一个病房只能属于一个科室,一个医生只属于一个科室,但可以负责多个病人的诊治,一个病人的主管医生只有一个。
问答题阅读下列说明和C代码,回答问题。 [说明]
设有n个货物要装入若干个容量为C的集装箱以便运输,这n个货物的体积分别为{S1,S2,…,Sn},且有si≤C(1≤i≤n)。为节省运输成本,用尽可能少的集装箱来装运这n个货物。
下面分别采用最先适宜策略和最优适宜策略来求解该问题。
最先适宜策略(Firstfit)首先将所有的集装箱初始化为空,对于所有货物,按照所给的次序,每次将一个货物装入第一个能容纳它的集装箱中。
最优适宜策略(Bestfit)与最先适宜策略类似,不同的是,总是把货物装到能容纳它且目前剩余容量最小的集装箱,使得该箱子装入货物后闲置空间最小。
[C代码] 下面是这两个算法的C语言核心代码。 {{U}}
1 {{/U}}变量说明。 n:货物数。 C:集装箱容量。
s:数组,长度为n,其中每个元素表示货物的体积,下标从0开始。
b:数组,长度为n,b[i]表示第i+1个集装箱当前已经装入货物的体积,下标从0。 i,j:循环变量。
k:所需的集装箱数。 min:当前所用的各集装箱装入了第i个货物后的最小剩余容量。
m:当前所需要的集装箱数。 temp:临时变量。 {{U}}
2 {{/U}}函数firstfit。 int firstfit(){
inti,j; k=0; for(i=0;i<n;i++){
b[i]=0; } for(i=0;i<n;i++){
{{U}} {{U}} 1 {{/U}} {{/U}};
while(C-b[j]<s[i]){ j++; }
{{U}} {{U}} 2 {{/U}} {{/U}};
k=k>(j+1)?k:(j+1); } returnk
} {{U}} 3 {{/U}}函数bestfit。 int
bestfit(){ int i,j,min,m,temp; k=0;
for(i=0;i<n;i++){ b[i]=0; }
for(i=0;i<n;i++){ min=C;
m=k+1; for(j=0;j<k+1;j++){
temp=C-b[j]-s[i]; if(temp>0&&temp<min){
{{U}} {{U}} 3 {{/U}} {{/U}}; m=j;
} } {{U}} {{U}} 4
{{/U}} {{/U}}; k=k>(m+1)?k:(m+1);
} return k; }
问答题【说明】C市刚开通了地铁线,为方便乘客,计划开发自动售票系统。该公司在每一个地铁站放置了多台自动售票机,每一台售票机有一唯一编号,售票记录统一汇总主机。自动售票机只发售从该站起始的各种地铁票,因此乘客只需输入目的站,起始站默认为该站,售票机给出从该站到达目的站的单程票。打印地铁票时为其编一个唯一的流水号,并同时打印自动售票机的编号及票价。售票机的状态变化如下:“空闲”时,显示地铁线路图,等待乘客输入目的站;当乘客输入目的站后,转入“目的站确认/票数输入”状态,同时给出票价,此时若目的站有误,可返回到空闲状态重新输入,否则,输入票数;乘客输入票数后,转入“票数确认/付款”状态,同样此时若票数有误,可返回到上一状态重新输入,否则,投入钱币付款;当付款金额足够时,“出票/找零”(有必要时进行找零);然后转入“空闲”等待输入目的站状态。该系统采用面向对象方法开发,系统中的类及类之间的关系用UML类图表示,如图9-18所示是该系统类图的一部分,图9-19描述了自动售票机的状态转换图。
问答题[说明]已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批。主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。采用责任链设计模式(ChainofResponsibility)对上述过程进行设计后得到的类图如图3-27所示。[C++代码]
问答题[说明]公司IT部门决定开发一个计算机管理系统以记录期刊的传阅情况。期刊在公司内部传阅,员工可以要求加入传阅队列。图书室登记公司收到的期刊,交给名单中的第一名员工。员工应在三个工作日内完成阅读,员工阅读完毕后通知系统,系统提醒下一位阅读者取书,下一个员工必须确认已收到期刊。当传阅名单中“下一位”员工出差在外时将无法进行传阅,此时将期刊传给再下一位,而将该员工作标记,再次传递此书时优先考虑该员工。最后一位员工阅读完毕后,将期刊交还图书室以便共用。系统能在员工忘记传递期刊时发出提醒信息。系统详细记录期刊传阅情况,当员工阅读完后通知系统,系统记录该员工员工号及日期,并在备注栏注明是传出;同样,当员工收到期刊后给系统确认,系统记录该员工员工号及日期,并在备注栏注明是收到。公司的员工都有一个唯一的员工号。公司订阅了多种期刊,为每一本期刊(有唯一期刊流水号)产生一份传阅名单,并详细记录传阅情况。员工的出差情况存储在系统主机中。该系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图1-1是该系统的类图的一部分,图1-2描述了成功传递期刊的序列图。[图1-1][图1-2]1.根据题意,给出类“传阅记录”的主要属性。
问答题假定SP表存储供应情况,如下的SQL语句是用于查询“产地为‘Beijing’、零件号为‘P101’的零件的所供应的总数(包括所有供应商)”的不完整语句,请在空缺处填入正确的内容。
SELECT SUM(Qty) FROM SP WHERE
PNo=”P101’ {{U}} (1) {{/U}}PNo{{U}} (2) {{/U}}
(SELECT PNo FROM{{U}} (3) {{/U}}
WHERE city="Beijing") {{U}} (4)
{{/U}}PNo;
问答题请补充函数fun(),该函数的功能是将字符串tt中的大写字母都改为对应的小写字母,其他字符不变。例如,若输入“Are you come from Sichuan?”,则输入“are you come from si- chuan?”。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。 试题程序: #include<stdio.h> #include<stnng.h> #include<conlo.h> char *fun(char tt[]) int i; for(i=0; tt[i];i++) if((tt[i]>='A')&&( (1) )) (2) ; return( (3) ); main() charn[81]; printf("/nPlease enter a string:"); gets(tt); printf("/nThe result string is:/n%s",fun(tt));
问答题阅读以下说明和流程图,回答问题1和问题2,将答案写在答卷的对应栏内。【说明】本流程图实现从比赛成绩文件生成赛车成绩一览表。某国际高等级赛车比赛使用如图所示的成绩处理流程,比赛成绩记录在成绩文件F0中,其记录格式如下:赛车号车手姓名第1赛段成绩第2赛段成绩…第n赛段成绩由该成绩文件生成如下所示的车手成绩一览表。生成的车手成绩一览表按总名次(系统会根据总成绩和分段成绩按规定方式计算得出总名次,不会有相同名次存在)降序排列。表中第n赛段的名次是该车手相应赛段在全部车手中的名次,成绩是根据规定方式计算而得的成绩,总名次是总成绩在所有车手中排名的名次。赛车号车手姓名赛段1…赛段n全程成绩名次……成绩名次总成绩总名次 流程图中的顺序文件F0是车手成绩文件,F0文件经处理l处理后产生顺序文件F,然后经处理2至处理4对文件F进行处理和更新,在处理5中,仅仅对文件F的记录进行车手成绩一览表的编排输出,不进行排序和增加名次等处理。
问答题问题:1.4 (5分)
图1-2所示的数据流图中,功能(6)发送通知包含创建通知并发送给学生或老师。请分解图1-2中加工(6),将分解出的加工和数据流填入答题纸的对应栏内。(注:数据流的起点和终点须使用加工的名称描述)
问答题【问题2】
经改写后的文法是否是LL(1)的?指出它的预测分析表中(1)~(3)处的内容。
问答题[问题1]
在需求分析阶段,采用UML的用例图(use case diagram)描述系统功能需求,如图4-4所示。指出图中的A,B,C和D分别是哪个用例?
问答题函数intToplogical(LinkedWDigraphG)的功能是对图G中的顶点进行拓扑排序,并返回关键路径的长度。其中图G表示一个具有n个顶点的AOE网,图中顶点从1~n依次编号,图G的存储结构采用邻接表表示,其数据类型定义如下:typedefstructGnode{/*邻接表的表结点类型*/intadjvex;/*邻接顶点编号*/intweight;/*弧上的权值*/structGnode*nextarc;/*指示下一个弧的结点*/}Gnode;typedefstructAdjlist{/*邻接表的头结点类型*/charvdata;/*顶点的数据信息*/structGnode*Firstadj;/*指向邻接表的第一个表结点*/}Adjulist;typedefstructLinkedWDigraph{/*图的类型*/intn,e;/*图中顶点个数和边数*/structAdjlist*head;/*指向图中第一个顶点的邻接表的头结点*/}LinkedWDigraph;例如,某AOE网如图1所示,其邻接表存储结构如图2所示。图1AOE网图2AOE网邻接表存储结构[函数代码]intToplogical(LinkedWDigraphG){Gnode*p;intj,w,top=0;int*Stack,*ve,*indegree;ve=(int*)malloc((G.n+1)*sizeof(int));indegree=(int*)malloc((G.n+1)*sizeof(int));/*存储网中各项点的入度*/stack=(int*)malloc((G.n+1)*sizeof(int));/*存储入度为0的顶点的编号*/if(!ve||!indegree||!Stack)exit(0);for(j=1;j<=G.n;j++){ve[j]=0;indegree[j]=0;}/*for*/for(j=1;j<=G.n;j++){/*求网中各项点的入度*/p=G.head[j].Firstadj;while(p){{{U}}{{U}}{{/U}}{{/U}};p=p->nextarc;}/*while*/}/*for*/for(j=1;j<=G.n;j++)/*求网中入度为0的顶点并保存其编号*/if(!indegree[j])Stack[++top]=j;while(top>0){w={{U}}{{U}}{{/U}}{{/U}};printf("%c",G.head[w].vdata);p=G.head[w].Firstadj;while(p){{{U}}{{U}}{{/U}}{{/U}};if(!indegree[p->adjvex])Stack[++top]=p->adjvex;if({{U}}{{U}}{{/U}}{{/U}})ve[p->adjvex]=ve[w]+p->weight;p=p->nextarc;}/*while*/}/*while*/return{{U}}{{U}}{{/U}}{{/U}};}/*Toplogical*/
问答题试题六(15分,每空3分)阅读以下说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。[说明]通常情况下,用户可以对应用系统进行配置,并将配置信息保存在配置文件中。应用系统在启动时首先将配置文件加载到内存中,这些内存配置信息应该有且仅有一份。下面的代码应用了单身模式(Singleton)以保证Configure类只能有一个实例。这样,Configure类的使用者无法定义该类的多个实例,否则会产生编译错误。
问答题【说明】下面是一个Applet程序,其功能是通过一个按钮控制一个窗口的创建,显示与隐藏,并且以按钮文字作为提示,可以随着窗口的状态改变,即如果窗口出现,则按钮文字为"HidemyFrm",提示用户点击按钮,则隐藏窗口,反之亦然。请将横线处语句补充完整。程序运行结果如图5所示:importjava.awt.*;importjava.applet.*;<appletcode="ex8_7.class"width=800height=400></applet>*/publicclassex8_7extendsAppletprivateFramefrm;privateButtonshowBtn;publicvoidinit()showBtn=newButton("ShowFrame");(1);publicbooleanaction(Evente,Objecto)if(e.target==showBtn)if((2))(3);frm.dispose()(4)showBtn,setLabel("ShowmyFrm");elsefrm=newFrame("myFrm");frm.resize(200,150);frm.setBackground(Color.gray);(5);showBtn,setLabel("HidemyFrm");returntrue;ex8_7,html<HTML><HEAD><TITLE>ex8_7</TITLE></HEAD><BODY><appletcode="ex8_7,class"width=800height=400></applet></BODY></HTML>
问答题【说明】本程序ExceptionTester实现功能:读入两个整数,第1个数除以第2个数,之后输出。若第2个数为0,则自动进行异常处理。 程序如下: (1) ; public class ExceptionTester public static void main(String args[]) int result; int number[]=new int[2]; boolean valid; for(int i=0;i<2;i++) valid= (2) ; while(!valid) try System.out.println("Enter number"+(i+1)); number[i]=Integer.valueOf(Keyboard.getString()).intValue(); valid=true; catch(NumberFormatExceptione) System.out.println("Invalid integer entered.Please try again."); by result=number[0]/number[1]; System.out.print(number[0]+"/"+number[1]+"="+result); catch( (3) ) System.out.println("Second number is 0,cannot do division!"); 其中,Keyboard类的声明为: impon java.io.*; public class Keyboard static BufferedReader inputStream=new (4) (new InputStreamReader(System.in)); public static int getInteger() try return(Integer,valueOf(inputStream.readLlne().trim()).intValue()); catch(Exceptione) e.printStackTrace(); return 0; public (5) by return(inputStream.readLine()); catch(IOExceptione) return "0";
问答题【说明】栈(Stack)结构是计算机语言实现中的一种重要数据结构。对于任意栈,进行插入和删除操作的一端称为栈顶(StockTop),而另一端称为栈底(StockBottom)。栈的基本操作包括:创建栈(NewStack)、判断栈是否为空(IsEmpty)、判断栈是否已满(IsFull)、获取栈顶数据(Top)、压栈/入栈(Push)、弹栈/出栈(Pop)。当设计栈的存储结构时,可以采取多种方式。其中,采用链式存储结构实现的栈中各数据项不必连续存储(如下图所示)。以下C代码采用链式存储结构实现一个整数栈操作。【C代码】typedefstructList{intdata;//栈数据structList*next;//上次入栈的数据地址}List;typedefstructStack{List*pTop;//当前栈顶指针}Stack;Stack*NewStack(){return(Stack*)calloc(1/sizeof(Stack));}intIsEmpty(Stack*S){//判断栈S是否为空栈if({{U}}(1){{/U}})return1;return0;}intTop(Stack*s){//获取栈顶数据。若栈为空,则返回机器可表示的最小整数if(IsEmpty(S))returnINT_MIN;return{{U}}(2){{/U}};}voidPush(Stack*S,inttheData){//将数据theData压栈List*newNode;newNode=(List*)calloc(1/sizeof(List));newNode->data=theData;newNode->next=S->pTop;S->pTop={{U}}(3){{/U}};}voidPop(Stack*S){//弹栈List*lastTop;if(IsEmpty(S))return;lastTop=S->pTop;S->pTop={{U}}(4){{/U}};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;}以上程序运行时的输出结果为:{{U}}(5){{/U}}
问答题【程序5说明】 著名的四色定理指出任何平面区域图均可用四种颜色着色,使相邻区域着不同的颜色。本程序对给定的区域图找出所有可能的不超过四种颜色的着色方案。 程序中用1~4表示四种颜色。要着色的N个区域用0~N-1编号,区域相邻关系用 adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域j相邻;矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i所着颜色。 【程序5】 #include<stdio.h> #define N 10 void output(int color[])/*输出一种着色方案*/ int i; for(i=0;i<N;i++) printf("%4d",color[i]); printf("/n"); int back (int * ip,int color[])/*回溯*/ int c=4; while(c==4) if(*ip<=0)return 0; --(*ip); c= (1) ; color[*ip]=-1; return c; /*检查区域i,对c种颜色的可用性*/ int colorOk(int i,int c,int [][N],int color[] int j; for(j=0;j<i;j++) if( (2) ) return 0; return 1; /*为区域i选一种可着的颜色*/ int select (int i,int c,int adj[][N],int color[]) int k; for(k=c;k<=4;k++) if(colorOK( (3) )) return k; return 0; int coloring(int adj[][N])/*寻找各种着色方案*/ int color[N],i,c,cnt; for(i=0;i<N;i++)color[i] =-1; i=c=0;cnt=0; while(1) if((c= (4) )==0) c=back(&i,color); if(c==0)return cnt; else (5) ;i++; if(i==N) output(color); ++cnt; c=back(&i,color); else c=0; void main() int adj[N][N]= 0,1,0,1,1,1,1,1,1,1, 1,0,1,1,0,1,1,1,1,0, 0,1,0,1,0,1,1,0,1,1, 1,1,1,0,1,1,0,0,1,1, 1,0,0,1,0,1,0,0,0,0, 1,1,1,1,1,0,1,0,0,1, 1,1,1,0,0,1,0,0,1,0, 1,1,0,0,0,0,0,0,1,1, 1,1,1,1,0,0,1,1,0,1, 1,0,1,1,0,1,0,1,1,0 ; printf("共有%d组解./n",coloring(adj));
