问答题下面是一个Applet程序,其功能是在绘图区域中通过鼠标的移动来绘制直线,并且有清除绘图区域按钮,用来清除已经绘制的图像。程序运行结果如图5所示。importjava.awt.*;importjava.applet.*;/*<appletcode=ex6_7.classwidth=800height=400></applet>*/publicclassex6_7extendsAppletprivateButtonbtn;privatebooleanbDraw,bClear;privateintupX,upY,downX,downY;publicvoidint()setLayout(null);bClear=false;bDraw=false;btn=newButton("clear");btn.reshape(250,150,70,30);add(btn);publicvoidpaint(Graphicsg)if(bClear)g.clearRect(0,0,getSize().width,getSize().height);(1);if(bDraw)g.drawLine((2));bDraw=false;publicvoidupdate(Graphicsg)(3);publicbooleanmouseDown(Eventevent,intx,inty)downX=x;downY=y;returntrue;publicbooleanmouseup(Eventevent,intX,inty)upX=x;upY=y;(4);repaint();returntrue;publicbooleanaction(Eventevent,Objectobject)if((5))bClear=true;repaint();returntrue;ex6_7.html<HTML><HEAD><TITLE>ex6_7</TITLE></HEAD><BODY><appletcode="ex6_7.class"width=800height=400></applet></BODY></HTML>
问答题[说明]图12-5中显示一张交通违章处罚通知书。每一个交通违章通知书有一个惟一的编号。交通违章通知书包含了收到处罚的违章者记录、涉及违章的机动车记录、违章记录、处罚记录以及经办警察记录等信息。所根据这张通知书所提供的信息回答下面问题。1.[问题1]根据这张通知书所提供的信息,设计了一个E-R模型,如图12-6所示。请将(n)处补充完整。
问答题[问题1]
请用120字以内文字,从业务的继承性、升级成本(时间、工作量)和扩展性三个方面简要说明开发人员所提方案的优点。
问答题阅读以下说明和表,回答问题1至问题3。
[说明]
图12-5中显示一张交通违章处罚通知书。每一个交通违章通知书有一个惟一的编号。交通违章通知书包含了收到处罚的违章者记录、涉及违章的机动车记录、违章记录、处罚记录以及经办警察记录等信息。所根据这张通知书所提供的信息回答下面问题。
问答题[说明]下面的流程图(如图3所示)用N-S盒图形式描述了数组A中的元素被划分的过程。其划分方法是:以数组中的第一个元素作为基准数,将小于基准数的元素向低下标端移动,而大于基准数的元素向高下标端移动。当划分结束时,基准数定位于A[i],并且数组中下标小于i的元素的值均小于基准数,下标大于i的元素的值均大于基准数。设数组A的下界为low,上界为high,数组中的元素互不相同。例如,对数组(4,2,8,3,6),以4为基准数的划分过程如下:[流程图][算法说明]将上述划分的思想进一步用于被划分出的数组的两部分,就可以对整个数组实现递增排序。设函数intp(intA[],intlow,inthieh)实现了上述流程图的划分过程并返回基准数在数组A中的下标。递归函数voidsort(intA[],intL,intH)的功能是实现数组A中元素的递增排序。[算法]voidsort(intA[],intL,intH)if(L<H)k=p(A,L,R);//p()返回基准数在数组A中的下标sort((4));//小于基准敷的元素排序sort((5));//大于基准数的元素排序
问答题【说明】在一个分布网络中,资源(石油、天然气、电力等)可从生产地送往其他地方。在传输过程中,资源会有损耗。例如,天然气的气压会减少,电压会降低。我们将需要输送的资源信息称为信号。在信号从信源地送往消耗地的过程中,仅能容忍一定范围的信号衰减,称为容忍值。分布网络可表示为一个树型结构,如图10-9所示。信号源是树根,树中的每个节点(除了根)表示一个可以放置放大器的子节点,其中某些节点同时也是信号消耗点,信号从一个节点流向其子节点。每个节点有一个d值,表示从其父节点到该节点的信号衰减量。例如,在图10-9中,节点w、p、q的d值分别为2、1、3,树根节点表示信号源,其d值为0。每个节点有一个M值,表示从该节点出发到其所有叶子的信号衰减量的最大值。显然,叶子节点的M值为0。对于非叶子节点j,M(j)=max{M(k)+d(k)|k是j的孩子节点}。在此公式中,要计算节点的M值,必须先算出其所有子节点的M值。在计算M值的过程中,对于某个节点i,其有一个子节点k满足d(k)+M(k)大于容忍值,则应在k处放置放大器,否则,从节点i到某叶子节点的信号衰减量会超过容忍值,使得到达该叶子节点时信号不可用,而在节点i处放置放大器并不能解决到达叶子节点的信号衰减问题。例如,在图10-9中,从节点p到其所有叶子节点的最大衰减值为4。若容忍值为3,则必须在s处放置信号放大器,这样可使得节点p的M值为2。同样,需要在节点小v处放置信号放大器,如图10—10阴影节点所示。若在某节点放置了信号放大器,则从该节点输出的信号与信号源输出的信号等价。函数placeBoosters(TreeNode*root)的功能是:对于给定树型分布网络中各个节点,计算其信号衰减量的最大值,并确定应在树中的哪些节点放置信号放大器。全局变量Tolerance保存信号衰减容忍值。树的节点类型定义如下:typedefstructTreeNode{intid;/*当前节点的识别号*/intChildNum;/*当前节点的子节点数目*/intd;/*父节点到当前节点的信号衰减值*/structTreeNode**childptr;/*向量,存放当前节点到其所有子节点的指针*/intM;/*当前节点到其所有子节点的信号衰减值中的最大值*/boolboost;/*是否在当前节点放置信号放大器的标志*/}TreeNode;【C语言函数】voidplaceBoosters(TreeNode*root){/*计算root所指节点处的衰减量,如果衰减量超出了容忍值,则放置放大器*/TreeNode*p;inti,degradation;if({{U}}(1){{/U}}){degradation=0;root->M=0;i=0;if(i>=root->ChildNum)return;p={{U}}(2){{/U}};for(;i<root->ChildNum&&p;i++,p={{U}}(3){{/U}}){p->M=0;{{U}}(4){{/U}};if(p->d+p->M>Tolerance){/*在p所指节点中放置信号放大器*/p->boost=true;p->M=0;}if(p->d+p->M>degradation)degradation=p->d+p->M;}root->M={{U}}(5){{/U}};}}
问答题【函数3说明】 函数DeleteNode(Bitree * r,int e)的功能是:在树根结点指针为r的二叉查找(排序)树上删除键值为e的结点,若删除成功,则函数返回0,否则函数返回-1。二叉查找树结点的类型定义为: typedef struct Tnode int data; /*结点的键值*/ struct Tnode * Lchild,*Rchild; /*指向左、右子树的指针*/ * Bitree; 在二叉查找树上删除一个结点时,要考虑三种情况: ①若待删除的结点p是叶子结点,则直接删除该结点; ②若待删除的结点p只有一个子结点,则将这个子结点与待删除结点的父结点直接连接,然后删除结点P; ③若待删除的结点p有两个子结点,则在其左子树上,用中序遍历寻找关键值最大的结点s,用结点s的值代替结点p的值,然后删除结点s,结点s必属于上述①、②情况之一。 【函数3】 int DeleteNode(Bitree * r,int e) Bitree p=*r,pp,s,c; while( (1) ) /*从树根结点出发查找键值为e的结点*/ pp=p; if(e<p->data)p=p->Lchild; else p=p->Rchild; if(!p)return-1; /*查找失败*/ if(p->Lchild &&p->Rchild)/*处理情况③*/ s= (2) ; pp=p; while( (3) )pp=s;s=s->Rchild; p->data=s->data;p=s; /*处理情况①、②*/ if( (4) )c=p->Lchild; else c=p->Rchild; if(p==*r)*r=c; else if( (5) )pp->Lchild=c; else pp->Rchild=c; free(p); return 0;
问答题[说明]已知对某载客车辆(Car)进行类建模,如图4-19所示。其中,类Engine表示发动机引擎,类Wheel表示车轮,类Body表示车身,类Driver表示司机,类Passenger表示乘客。[C++代码]car.run();}
问答题[问题1]
经过进一步分析,设计人员决定定义一个类Items on loan,以表示类Book和CD的共有属性和方法。请采用图1-2中属性和方法的名称给出类Items_on_loan应该具有的属性和方法(注意:不同名称的属性和方法表示不同的含义,如CD中的composer与 Book甲的author无任何关系)。
问答题【说明】本程序将两个从小到大的有序链表合成一个新的从小到大的有序链表。链表的每一项由类Node描述,而链表由类List描述。类List的成员函数有以下几个。 ①createList():创建从小到大的有序链表。 ②multiplyList(List L1,List L2):将链表L1和链表L2合并。 ③print();打印链表。 # include <iostream.h>class List;class Node friend class List; public: Node(int data) (1) ; private: int data; Node *next; ;class List public: List( ) list = NULL; void multiplyList(List L1, List L2); void createList( ); void print( ); private: Node *list;;void List::createList( ) Node *p, *u, *pm; int data; list = NULL; while (1) cout<<"输入链表的一项: (小于零,结束链表)"<<end1; cin >> data; if(data<0)break; //小于零,结束输入 p = list; while (p != NULL p = p->next; u= (2) : if(p==list) list = u; else pre->next = u; (3) :void List::multiplyList (List L1, List L2) Node *pL1, *pL2, *pL, *u; list = NULL; pL1 = L1.list; pL2 = L2.1ist; while (pL1 != NULL pL1 = pL1 ->next; else u = new Node (pL2->data)); pL2 = pL2->next; if (list==NULL) list= (4) ; else pL->next = u; pL =u; pL1 = (pL1 != NULL) ? pL1:pL2; while (pL1 != NULL) u = (5) ; pL1 = pL1->next; if (list==NULL) list=pL=u; else pL->next = u; pL = u; void List::print( ) Node *p; p = list; while (p != NULL) cout << p->data << "/t"; p = p->next; cout << end1;void main ( ) List L1, L2, L; cout << "创建第一个链表/n"; L1.createList ( ); cout << "创建第二个链表/n"; L2.createList ( ); L1.print ( ); L2.print ( ); L.multiplyList (L1, L2); L.print ( );
问答题[Java程序7-21]
import java.u61.*;
public class SalesSystem {
private ProductList catalog;
private OrderList sales;
private static PrintWriter stdOut = new PrintWriter(System.out, true);
public void statistic() {
for (Product product: {{U}}(3) {{/U}}) {
iht number = 0;
for (Order order: {{U}}(4) {{/U}}) {
for ( {{U}}(5) {{/U}}: order) {
if (produet.equals(item.getProduct()))
number += item. getQuantity();
}
}
stdOut.println(product .getCode() +" "
+ product.getDescription() +" "
+ number +" "+ number * product.getPrice());
}
}
//其余的方法末列出
}
问答题阅读下列说明和数据流图,回答问题1至问题3,[说明]考务处理系统具有如下功能:(1)对考生送来的报名单进行检查。(2)对合格的报名单编好准考证号后将准考证送给考生,并将汇总后的考生名单送给阅卷。(3)对阅卷站送来的成绩清单进行检查,并根据考试中心制订的合格标准审定合格者。(4)制作考生通知单送给考生。(5)进行成绩分类统计(按地区、年龄、文化程度、职业、考试级别等分类)和试题难度分析,产生统计分析表。以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图1-1是顶层数据流图,图1-2是第0层数据流图,图1-3是第l层数据流图,其中(A)是加工1的子图,(B)是加工2的子图。[图1-1][图1-2][图1-3][数据字典]报名单=地区+序号+姓名+性别+年龄+文化程度+职业+考试级别+通信地址正式报名单=报名单+准考证号准考证=地区+序号+姓名+准考证号+考试级别考生名单=准考证号+考试级别统计分析表=分类统计表+难度分析表考生通知单=考试级别+准考证号+姓名+合格标志+通信地址
问答题[函数5-1]
bool SearchBtree(BTreeNode* root, ElemKeyType akey, BTreeNode **ptr)
{
int lw, hi, mid;
BTreeNode*p = root;
*ptr = NULL;
while ( p ) {
1w = 1; hi={{U}} (1) {{/U}};
while (1w <= hi) {
mid = (1w + hi)/2;
if (p -> K[mid] == akey) {
*ptr = p;
return TRUE;
}
else
if ({{U}} (2) {{/U}})
hi=mid - 1;
else
1w = mid + 1;
}
*ptr = p;
p ={{U}} (3) {{/U}};
}
return FALSE;
}
问答题问题:3.3 (5分)
根据说明中的描述,使用说明中的术语,给出图3-3中C1~C5所对应的类名。
问答题[说明] 某房屋租赁公司欲建立一个房屋租赁服务系统,统一管理房主和租赁者的信息,从而快速地提供租赁服务。该系统具有以下功能: 1.登记房主信息。对于每名房主,系统需登记其姓名、住址和联系电话,并将这些信息写入房主信息文件。 2.登记房屋信息。所有在系统中登记的房屋都有一个唯一的识别号(对于新增加的房屋,系统会自动为其分配一个识别号)。除此之外,还需登记该房屋的地址、房型(如平房、带阳台的楼房、独立式住宅等)、最多能够容纳的房客数、租金及房屋状况(待租赁、已出租)。这些信息都保存在房屋信息文件中。一名房主可以在系统中登记多个待租赁的房屋。 3.登记租赁者信息。所有想通过该系统租赁房屋的租赁者,必须首先在系统中登记个人信息,包括:姓名、住址、电话号码、出生年月和性别。这些信息都保存在租赁者信息文件中。 4.租赁房屋。已经登记在系统中的租赁者,可以得到一份系统提供的待租赁房屋列表。一旦租赁者从中找到合适的房屋,就可以提出看房请求。系统会安排租赁者与房主见面。对于每次看房,系统会生成一条看房记录并将其写入看房记录文件中。 5.收取手续费。房主登记完房屋后,系统会生成一份费用单,房主根据费用单缴纳相应的费用。 : 6.变更房屋状态。当租赁者与房主达成租房或退房协议后,房主向系统提交变更房屋状态的请求。系统将根据房主的请求,修改房屋信息文件。 数据流图1-1和图1-2分别给出了该系统的顶层数据流图和0层数据流图。
问答题[说明]散列文件的存储单位称为桶(Bucket)。假如一个桶能存放m个记录,当桶中已有m个同义词(散列函数值相同)的记录时,存放第m+1个同义词会发生“溢出”。此时需要将第m+1个同义词存放到另一个称为“溢出桶”的桶中。相对地,称存放前m个同义词的桶为“基桶”。溢出桶和基桶大小相同,用指针链接。查找指定元素记录时,首先在基桶中查找。若找到,则成功返回;否则沿指针到溢出桶中进行查找。例如,设散列函数为Hash(Key)=Keymod7,记录的关键字序列为15,14,21,87,96,293,35,24,149,19,63,16,103,77,5,153,145,356,51,68,705,453,建立的散列文件内容如下图所示。为简化起见,散列文件的存储单位以内存单元表示。函数InsertToHashTable(intNewElemKey)的功能是:若新元素NewElemKey正确插入散列文件中,则返回值1;否则返回值0。采用的散列函数为Hash(NewElemKey)=NewElemKey%P,其中P设定基桶数目。函数中使用的预定义符号如下:#defineNULLKEY-1/*散列桶的空闲单元标识*/#defineP7/*散列文件中基桶的数目*/#defineITEMS3/*基桶和溢出桶的容量*/typedefstructBucketNode{/*基桶和溢出桶的类型定义*/intKeyData[ITEMS];structBucketNode*Link;}BUCKET;BUCKETBucket[P];/*基桶空间定义*/函数InsertToHashTable代码如下:intInsertToHashTable(intNewElemKey){/*将元素NewElemKey插入散列桶中,若插入成功则返回0,否则返回-1*//*设插入第一个元素前基桶的所有KeyData[]、Link域已分别初始化为NULLKEY、NULL*/intIndex;/*基桶编号*/inti,k;BUCKET*s,*front,*t;______;for(i=0;i<ITEMS;i++)/*在基桶查找空闲单元,若找到则将元素存入*/if(Bucket[Index].KeyData[i]==NULLKEY){Bucket[Index].KeyData[i]=NewElemKey;break;}if(______)return0;/*若基桶已满,则在溢出桶中查找空闲单元,若找不到则申请新的溢出桶*/______;t=Bucket[Index].Link;if(t!=NULL){/*有溢出桶*/while(t!=NULL){for(k=0;k<ITEMS;k++)if(t→KeyData[k]==NULLKEY){/*在溢出桶链表中找到空闲单元*/t→KeyData[k]=NewElemKey;break;}/*if*/front=t;if(______)t=t;Link;elsebreak;}/*while*/}/*if*/if(______){/*申请新溢出桶并将元素存入*/s=(BUCKET*)malloc(sizeof(BUCKET));if(!s)return-1;s→Link=NULL;for(k=0;k<ITEMS;k++)s→KeyData[k]=NULLKEY;S→KeyData[0]=NewElemKey;______;}/*if*/return0;}/*InsertToHashTable*/
问答题【说明】
本程序在3×3方格中填入1~N(N≥10)内的某9个互不相同的整数,使所有相邻两个方格内的两个整数之和为质数。试求出满足这个要求的所有填法。3×3方格中的每个方格按行按列(先行后列)序号排列为:0,1,2,3,4,5,6,7,8。
程序采用试探法,即从序号为0的方格开始,为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数。如不能为当前方格找到一个合理的可填整数,就要回退到前一方格,调整前一方格的填入整数;直至序号为8的方格也填入合理的整数后,就找到了一个解,将该解输出。再调整序号为8的方格所填整数,继续去找下一个解。为了检查当前方格的填入整数的合理性,程序引入二维数组check Matrix,存放需要进行合理性检查的相邻方格的序号。
# include <stdio. h>
# define N 12
int b[N+1];
int pos;
int a[9];/* 用于存储诸方格所填入的整数*/
int AllNum=0;/* 统计有多少种填法*/
int checkMatrix[][3]={ {-1},{0,-1},{1,-1},
{0,-1},{1,3,-1},{2,4,-1},
{3,-1},{4,6,-1},{5,7,-1}};
void write(int a[])
{ int i, j;
for(i=0; i<3; i++)
{ for(j=0; j<3; j++)
printf("%3d", a[3*i+j]);
printf("/n");
}
}
int isPrime(int m)
{ int i;
if(m==2)return 1;
if(m==1 ‖ m%2==0)return 0;
for(i=3; i*i<m;)
{ if(m%i==0)return 0;
i+=2;
}
return 1;
}
int selectNum(int start)
{ int j;
for(j=start; j<=N; j++)
if(b[j])return j;
return 0;
}
int check()/*检查填入pos位置的整数是否合理*/
{ int i,j;
for(i=0; (j={{U}} (1) {{/U}})>=0; i++)
if(!isPrime(a[pos]+a[j]))
{{U}}(2) {{/U}};
{{U}}(3) {{/U}};
}
extend ()/* 为下一方格找一个尚未使用过的整数*/
{ a[{{U}} (4) {{/U}}]=selectNum(1);
b[a[pos]]=0;
}
void change ()/*为当前方格找下一个尚未使用过的整数(找不到回溯)*/
{ int j;
while(pos >=0
if(pos<0)return;
b[a[pos]]=1; a[pos]=j; b[j]=0;
}
int find ()
{ int ok=1;
pos=0; a[pos]=1; b[a[pos]]=0;
do{
if(ok)
if(pos==8)
{ write(a);
change();
AllNum++;/* 统计有多少种填法*/
}
else extend();
else change();
ok=check();
}while(pos>=0);
}
void main()
{ int i;
for(i=1; i<=N; i++) b[i]=1;
find();
prinrf("共有%d种不同填法!/n", AllNum);
}
问答题阅读以下利用场景法设计测试用例的技术说明,根据要求回答问题1~问题4。
[说明]
现有的软件通常都是由事件触发来控制流程的,事件触发时的情景便形成了场景,而同一事件不同的触发顺序和处理结果就形成了事件流。该软什设计思想也可被引入到软件测试中,从而生动描绘出事件触发时的情景,有利于测试设计者设计测试用例,同时使得测试用例更容易得到理解和执行。
用例场景是通过描述流经用例的路径来确定的过程,这个流经过程要从用例开始到结束遍历其中所有基本流(基本事件)和备选流(分支事件)。表7-15是对某IC卡加油机应用系统基本流的描述,表7-16是对该IC卡加油机应用系统备选流的描述。
{{B}}表7-15 基本流描述表{{/B}}
{{B}}序号{{/B}}
{{B}}用例名称{{/B}}
{{B}}用例描述{{/B}}
A1
准备加油
客户将IC加油卡插入加油机
A2
验证加油卡
加油机从加油卡的磁条中读取账户代码,并检查它是否属于可以接收的加油卡
A3
验证黑名单
加油机验证该卡账户是否存在于黑名单中,如果属于黑名单,则加油机吞卡
A4
输入购油量
客户输入需要购买的汽油数量
A5
加油
加油机完成加油操作,从加油卡中扣除相应金额
A6
返回加油卡
退还加油卡
{{B}}表7-16 备选流描述表{{/B}}
{{B}}序号{{/B}}
{{B}}用例名称{{/B}}
{{B}}用例描述{{/B}}
B
加油卡无效
在基本流A2过程中,该卡不能够识别或是非本机可以使用的IC卡,加油机退卡,并退出基本流
C
卡账户属于黑名单
在基本流A3过程中,判断该卡账户属于黑名单(如已经挂失),加油机吞卡并退出基本流
D
加油卡账面资金不足
系统判断加油卡内资金不足,重新加入基本流A4,或选择退卡
E
加油机油量不足
系统判断加油机内油量不足,重新加入基本流A4,或选择退卡
问答题[说明] 计算下列源代码的McCabe环数,画出控制流程图并用罗马数字标出区域。 read x,y,z; type =“scalene”; if (x= =y or x = = z or y= = z)type =“isosceles ”; if (x = = y and x = = z) type =“equilateral”; if (x>= y+ z Or y>= x+20rz>=x+ y) type= “not a triangle”; if (x<=0 or y<= 0 or z <=0) type =“bad inputs”; print type;
问答题[说明]已知某唱片播放器不仅可以播放唱片,而且可以连接电脑并把电脑中的歌曲刻录到唱片上(同步歌曲)。连接电脑的过程中还可自动完成充电。关于唱片,还有以下描述信息:1.每首歌曲的描述信息包括:歌曲的名字、谱写这首歌曲的艺术家以及演奏这首歌曲的艺术家。只有两首歌曲的这三部分信息完全相同时,才认为它们是同一首歌曲。艺术家可能是一名歌手或一支由2名或2名以上的歌手所组成的乐队。一名歌手可以不属于任何乐队,也可以属于一个或多个乐队。2.每张唱片由多条音轨构成;一条音轨中只包含一首歌曲或为空,一首歌曲可分布在多条音轨上;同一首歌曲在一张唱片中最多只能出现一次。3.每条音轨都有一个开始位置和持续时间。一张唱片上音轨的次序是非常重要的,因此对于任意一条音轨,播放器需要准确地知道,它的下一条音轨和上一条音轨是什么(如果存在的话)。根据上述描述,采用面向对象方法对其进行分析与设计,得到了如表3-1所示的类列表、如图3-1所示的初始类图以及如图3-2所示的描述播放器行为的UML状态图。
