问答题【问题4】(4 分)
根据【说明】,将图1-2 中P1-P4 的处理名称填充完整。
问答题[程序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={{U}} (1) {{/U}}) <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={{U}} (2) {{/U}}) <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' {{U}}(5) {{/U}}; } 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); }
问答题【说明】 ①在类体中添加函数move(double ax,double ay)的定义,使得点的坐标x和y分别移动 ax和ay个单位。 ②在类定义外完成重载的两个构造函数CPosition()和CPosition(double dx,double dy),其中前者为不带参数的构造函数,使CPosition对象的默认值为x=0,y=0,后者为带参数的构造函数,把数据成员x和y分别初始化为参数dx和dy的值。 ③完成函数double distance(double bx,double by)的定义,该函数返回*this和点(bx, by)的距离。 注意:除在指定的位置添加语句外,请不要改动程序中的其他语句。 源程序文件test5.cpp清单如下: #include<iostream.h> #include<math.h> class CPosition public: CPosition(); CPosition(double dx,double dy); double getx(); double gety(); (1) double distance(double bx,double by); private: double x; double y; ; (2) x=0;y=0; CPosition::CPosition(doub,e dx,doub,e dy) x=dx; y=dy; double CPosition::getx() return x; double CPosition::gety() return y; double CPosition::distance(double bx,double by) (3) vold main() double a,b; cout<<"|nput x,y position of a point:"; cin >> a >> b; CPosition psA(a,b); cout<<"Input x,y position of another point:"; cin >>a >> b; cout <<"The distance is" <<psA.distance(a,b) <<end1;
问答题【说明】一条直线是由两个点组成的,代码如下。
public class Point
{
private int x, y; //coordinate
public Point (int x, int y)
{{{U}} (1) {{/U}}=x;{{U}} (2) {{/U}};}
public int GetX()
{ return x; }
public int GetY()
{ return y; }
}
class Line //line segment
{
private{{U}} (3) {{/U}}; //extremc points
Line (Point a, Point b) //constructor
{ p1 ={{U}} (4) {{/U}};
p2={{U}} (5) {{/U}};
}
public double Length() {
return Math.sqrt (Math.pow (p2.GetX()-pl.GetX(),2)
+Math.pow (p2.GetY()-p1.GetY(),2)) ;
}
}
问答题[说明]下面是一个Appkt程序,其功能是从3~100之间(包括3和100)每隔0.5秒显示一个新的数字,如果数字为素数,则显示为灰色,其他为绿色。程序运行结果如图4所示。importjava.awt.*importjava.applet.Applet<appletcode=ex2_7,classwidth=800height=400></applet>publicclassex2_7extendsApplet{publicColorcolor2_7=Color.black;privateihtn2_7=3;publicmyPrimethPrime2_7;publicvoidinit(){thPrime2_7=newmyPrime(this);thPrime2_7,start();}publicvoidpaint(Graphicsg){g,setColor(color2_7);g.drawString({{U}}(1){{/U}},50,50);}publicintgetlnt(){returnn2_7;}publicvoidsetlnt(inti){n2_7=i;}}classmyPrimeextendsThreadIex2_7obj2_7;myPrime(ex2_7o){this.obj2_7=o;}publicbooleanisPrime(intn){booleanbPrime=true;ihti=2;if({{U}}(2){{/U}})returnfalse;while(i<n-]i++;}returnbPrime;}publicvoidrun(){inti;for(i=3;{{U}}(4){{/U}};i++){if(isPrime(i))obj2_7,color2_7=Color,gray;elseobj2_7,color2_7=Color.green;{{U}}(5){{/U}};obj2_7,repaint();try{sleep(S00);}catch(InterruptedExceptionie){}}}}ex2_7,html<HTML><HEAD><TITLE>ex2_7</TITLE></HEAD><BODY><appletcode="ex2_?,class"width=800height=400></applet></BODY></HTML>
问答题【说明】(1)这是一个图书馆支持系统。(2)图书馆应用系统可以将图书和杂志借给借书者,这些借书者已经在系统中注册了,图书和杂志也已经注册过了。(3)图书馆负责新书的购买,一本流行图书会多买几本。当旧书和杂志已经过时或破旧不堪时,将它们从图书馆应用系统中删除。(4)图书馆馆员是图书馆的员工。他们与客户(借书者)打交道,并且是在图书馆软件系统提供的支持下开展工作的。(5)借书者可以预订图书馆中当前还没有的图书或杂志,这样,当某借书者所预订的图书或杂志归还回来或购进时,应用系统就通知这个预订人。当该借书者借阅了他所预订的图书或杂志后,或者通过一个显式的取消过程取消他的预订后,他的本次预订就被取消了。(6)图书馆应用系统能够容易地建立、修改和删除系统中的信息,包括书名、借书者、借阅信息和预订信息。(7)图书馆应用系统能够在所有流行的Web浏览器平台(InternetExplorer5.1以上,Netscape4.0以上等等)上运行。(8)图书馆应用系统应该易于扩展新功能。【问题】分析这个图书馆系统中涉及的角色和用例,完成用例图。
问答题【说明】下面的程序先构造Point类,再顺序构造Ball类。由于在类Ball中不能直接存取类Point中的xCoordinate及yCoordinate属性值,Ball中的toString方法调用Point类中的toString方法输出中心点的值。在MovingBall类的toString方法中,super.toString调用父类Ball的toString方法输出类Ball中声明的属性值。
public class Point
{
private double xCoordinate;
private double yCoordinate;
public Point 0 }
public Point(ouble x, double y)
{
xCoordinate = x;
yCoordinate = y;
}
public String toString()
{
return "( + Double.toString(Coordinate)+ ","
+ Double.toString(Coordinate) + ");
}
//other methods
}
public class Ball
{
{{U}} (1) {{/U}}; //中心点
private double radius; //半径
private String colour; ///颜色
public Ball() { }
public Ball(double xValue, double yValue, double r)// 具有中心点及半径的构造方法
{
center= {{U}}(2) {{/U}};//调用类Point 中的构造方法
radius = r;
}
public Ball(double xValue, double yValue, double r, String c)
// 具有中心点、半径及颜色的构造方法
{
{{U}} (3) {{/U}};//调用3个参数的构造方法
colour = c;
}
public String toString()
{
return "A ball with center" + center, toString() + ", radius"
+ Double.toString(radius) + ", colour" + colour;
}
//other methods
}
public class MovingBall. {{U}}(4) {{/U}}
{
private double speed;
public MovingBall() { }
public MovingBall(double xValue, double yValue, double r, String e, double s)
{
{{U}} (5) {{/U}};// 调用父类Ball中具有4个参数的构造方法
speed = s;
}
public String toString( )
{ return super, toString( ) + ", speed "+ Double.toString(speed); }
//other methods
}
public class Tester{
public static void main(String args[]){
MovingBall mb = new MovingBall(10,20,40,"green",25);
System.out.println(mb);
}
}
问答题试题七(15分)阅读以下说明和VisualBasic代码,将应填入(n)处的字句写在答题纸的对应栏内。[说明]某绘图系统定义了一个抽象类IShape,现有三个类CPoint、CLine和CCircle,它们都具有IShape界面。相应的类图关系如图7-1所示。已知某第三方库已经提供了XCircle类,且完全满足CCircle图元显示时所需的功能。代码7-1是抽象类IShape的类模块内容,代码7-2实现了类CCircle的IShape界面,并使用了XCircle提供的显示功能。XCircle提供的显示功能方法接口为displayIt。[图7-1]
问答题【问题 3】(2 分 ) 解释图3-1中用例U3和用例Withdraw、Deposit等四个用例之间的关系及其内涵。
问答题[说明] 给出一个接收三个数a、b、c作为三角形边长并输出三角形的类型的程序。程序代码如下所示:
结点 源代码行
A read a, b, c
B type = "scalene"
C if(a = = b || b = = c|| a = = c)
D type = "isosceles"
E if (a = = b && b= =c)
F type = "equilateral"
G if (a> =b+ c || b> =a+ c||c> =a+ b)
H type = "not a triangle"
I if (a< =0 || b< =0 ||c< =0)
J type = "bad inputs"
K print type
给出上面三角形伪码中的所有可行路径,进行每条路径测试。并找出达到C0和C1覆盖的最小测试案例集合。
问答题对于教学数据库的三个基本表S(S#,SNAME,AGE,SEX),SLLS#,C#,GRADE),C(C#, CNAME,TEACHER)。现根据查询条件填充下面SQL语句空白的部分。
1.检索LIU老师所授课程的课程号和课程名。
2.检索至少选修LIU老师所授课程中一门课程的女学生姓名。
3.检索WANG同学不学的课程的课程名。
4.检索全部学生都选修的课程的课程号与课程名。
5.检索选修课程包含LIU老师所授课程的学生学号。
[说明]
1.SELECT{{U}} (1) {{/U}}FROM C WHERE TEACHER='LIU'
2. SELECT S. SNAME FROM S,SC
WHERE S.S#=SC.S#AND S. SEX='F'AND SC.C#={{U}} (2) {{/U}}
(SELECTC# FROM C WHERE TEACHER = 'LIU')
3. SELECT CNAME FROM C
wHEREc#< >{{U}} (3) {{/U}}(SELECTSC. C# FROM S,SCWHERE S.S#=SC.S#AND S. SNAME=' WANG')
4. 由题知,该问题是在表C中找课程号和课程名,要求这门课被全部学生所选。
SELECT C#,CNAME
FROM C
WHERE NOT EXISTS
(SELECT *
FRoM S
WHERE NOT EXISTS
(SELECT *
FROM S
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE{{U}} (4) {{/U}}
5. SELECT DISTINCT S#
FROM SC
WHERE{{U}} (5) {{/U}}
(SELECT C#
FROM C
WHERE TEACHER = 'LIU'
问答题阅读下列说明和图,回答问题1至问题3。[说明]某大型旅店为了便于管理,欲开发一个客房管理系统。希望实现客房预定、入住登记、帐务结算、退房,以及将服务项目记入客人帐单。旅客包括散客和团体,散客预定或入住时需要提供姓名、性别、身份证和联系电话,团体则提供团体名称、负责人的姓名、性别、身份证和联系电话,以及团体人数。对于散客,还要提供换房。旅店还提供了很多服务项目,比如早餐。对每一个入住客人,服务列表记录了住宿期间的各项服务,包括服务类型、日期、数量等。当然,客人也可以不要任何服务。旅店的客房有一个唯一的房间号,分为不同的类别,不同的房间床位数和价格不同。为了有效的管理,需要记录每天的客房状态。客房的状态有:空闲、占用、已预定和维修。·客人入住后,客房处于占用状态;·客人退房后,客房处于空闲状态;·客人预定后,客房处于已预定状态;·预定客人入住后,客房处于占用状态;·预定客人取消预定后客房处于空闲状态;·需要维修时客房处于维修状态;·维修完成后客房处于空闲状态。该系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图3-1是该系统的类图的一部分,图3-2描述了客房状态的转变情况。[图3-1][图3-2]
问答题[问题3]
按照图3-2中的方法发送邮件时,使用不同的密码体制加密消息和消息摘要,请用 150字以内文字简要说明这样做的理由。
问答题
问答题【说明】数据排序。将给定的n个整数分别按照升序和降序进行排列。
class SortInt_1
{
int i, j, k, temp;
void SortInt(int a1, a2[]){//升序排序
for(i=0; i<a1-1; i++){
k=i;
for(j=i+1 ;j<a1 ;j++)
if ({{U}} (1) {{/U}}) k=j;
if(k!=i){
temp=a2[i];a2[i]=a2[k];a2[k]=temp;
}
}
}
}
class Sortlnt_2{{U}} (2) {{/U}}
{
int i, j, k, temp;
void Sortlnt(int a1,a2[]){//降序排序
for(i=0;i<a1-1 ;i++) {
k=i;
for(j=i+1 ;j<a1 ;j++)
if ({{U}} (3) {{/U}}) k=j;
if(k!=i){
temp=a2[i];a2[i]=a2[k];a2[k]=temp;
}
}
}
}
Class TestOverLoad {
Public static void main(String args[])
{
int a[]={10,55,100,35,87,90,100,16};
Sortlnt_1 newlnt1={{U}} (4) {{/U}};
Newlnt1. SortInt(a. length, a);//调用SortInt_1类的方法
System. out. println("升序排列的数据");
For(int i=0;i<8;i++)
System. out. print(a[i]+" ");
system. out. println();
SortInt_2 newInt2=new sortint_2(); //创建类SortInt_2的对象
{{U}} (5) {{/U}};
System. out. println("降序排列的数据: ");
For(int i=0;i<8;i++)
System. out. print(a[i]+" ");
}
}
问答题问题:1.4 用 200 字以内文字,说明建模图 1-1 和图 1-2 时如何保持数据流图平衡。
问答题【说明】某汽车制造工厂有两条装配线。汽车装配过程如图10-6所示,即汽车底盘进入装配线,零件在多个工位装配,结束时汽车自动完成下线工作。(1)e0和e1表示底盘分别进入装配线0和装配线1所需要的时间。(2)每条装配线有n个工位,第一条装配线的工位为S0,0,S0,1,…,S0,n-0,第二条装配线的工位为S1,0,S1,1,…,S1,n-1。其中S0,k和S1,k(0≤k≤n-1)完成相同的任务,但所需时间可能不同。(3)aij表示在工位Sij处的装配时间,其中i表示装配线(i=0或i=1),j表示工位号(0≤j≤n-1)。(4)tij表示从Sij处装配完成后转移到另一条装配线下一个工位的时间。(5)X0和X1表示装配结束后,汽车分别从装配线0和装配线1下线所需要的时间。(6)在同一条装配线上,底盘从一个工位转移到其下一个工位的时间可以忽略不计。图10-7所示的流程图描述了求最短装配时间的算法,该算法的输入为;n:表示装配线上的工位数;e[i]:表示e1和e2,i取值为0或1:a[i][j]:表示ai,j,i的取值为0或1,j的取值范围为0~n-1;t[i][j]:表示ti,j,i的取值为0或1,j的取值范围为0~n-1;x[i]:表示X0和X1,i取值为0或1。算法的输出为:fi:最短的装配时间;li:获得最短装配时间的下线装配线号(0或者1)。算法中使用的f[i][j]表示从开始点到Si,j处的最短装配时间。
问答题阅读下列说明和数据流图,回答问题1-问题3。【说明】某医院收费系统的主要功能是收取病人门诊的各项费用。系统的收费功能分为3个方面:病历收费、挂号收费和根据处方单内容收取检查或药物费用。1.病人初次来该医院看病,首先购买病历,记录病人基本情况。2.病人看病前要挂号。根据病人的病历和门诊部门(内科、外科等),系统提供相应的挂号单和处方单,并收取费用。3.病人根据处方单进行进一步检查或取药前需交纳各项费用。系统首先根据病人基本情况检查处方单中病历号是否正确,记录合格的处方单,并提供收据。4.所有收费都必须依据定价表中的定价来计算,且所有收费都必须写入收费记录中。医院收费系统的顶层图如图2所示;医院收费系统的第0层DFD图如图3所示。其中,加工1的细化图如图4所示,加工2的细化图如图5所示。假定顶层图是正确的,“定价表”文件已由其他系统生成。【数据流图】
问答题假定Games表存储参赛情况,如下的SQL语句是委员会用于查询“队名为‘China’的各个运动员各自夺取得的总积分”的不完整语句,请在空缺处填入正确的内容。
SEl3ECT{{U}} (1) {{/U}}
FROM Games
WHERE ANo{{U}} (2) {{/U}} (SELECT
ANo FROM{{U}} (3)
{{/U}} WHERE
ATeam="China") GROUP
BY ANo;
问答题[说明]以下是某图像二元树存储与还原算法的主要思想描述。设一幅2n×2n的二值图像,以:“1”表示黑像素点,以“0”表示白像素点。图像二元树结构表示依赖于图像的二元分割,即交替在X轴方向和Y轴方向上分割。先进行水平分割,分成两个2n-1×2n图像子块,然后进行垂直分割,分成4个2n-1×2n-1的正方形块,如此分割,直到子块只含同一像素点为止。如图8-8为一“E”字的二值图像,对其进行二元分割,相应的二元树如图8-9所示。根据图像二元树的0叶结点和1叶结点的数目,删除多者,保留少者。如“E”字图像的二元树0叶结点较多,裁剪后如图8-10所示。图8-8图8-10裁剪后的“E”字图像的二元树裁剪后图像二元树有4类结点,分别用二进制编码如下:◆左右儿子都有的结点,编码为11;◆仅有左儿子的结点,编码为10;◆仅有右儿子的结点,编码为01;◆叶结点,编码为00。存储时,先存储剩余叶结点的类型编码,二进制码00表示0叶结点,11表示1叶结点。再按层次顺序,自左至右存储裁剪后图像二元树各结点的编码。图像二元树的存储算法用C语言描述所定义的数据结构及函数如下:structNode/*图像二元树结点*/streetNode*Left;streetNode*Right;charPixel;structNodeQueue[MaxLen];/*队列*/InitQueue()/*初始化队列Queue的函数;*/EmptyQueue()/*判断队列Queue是否为空的数,若空返回1,否则返回0;*/AddQueue(Item)/*将Item加到队列Queue的数;*/GetQueue()/*取队列Queue第一个元素的函数;*/PutCode(Code)/*写2位二进制码Code到文件的函数*/还原算法是存储算法的逆过程,将文件中的二进制码序列转换成图像二元树。还原算法的数据结构与函数与存储算法的相同,还原算法新增了一个函数GetCode()。GetCode()/*从文件中读2位二进制码的函数*/[C程序]存储算法voidBackup(charCutPixel,structNodeImageTree)'/*CutPixel=0表示裁剪0叶结点*/InitQueue();AddQueue(ImageTree);PutCode(1-CutPixel);While(!EmptyQueue())TreeNode=GetQueue();if(TreeNode→Left==NULL)PutCode(0);continue:Tl=TreeNode→Left;Tr=TreeNode→Right;if(Tl→Left==NULLelse(1);AddQueue(Tl);if(Tr→Left==NULLelse(2)AddQueue(T);(3)还原算法voidRestore(structNode*TreeRoot)TreeRoot=(strutNode*)malloc(sizeof(structNode)InitQueue();AddQueue(TreeRoot);CutPixel=1-GetCode();while(!EmptyQueue())TrecNode=GetQueue(Queue);NodeCode=GetCode();switch(NodeCode)case0:TreeNode→Left=NULL;TreeNode→Right=NULLTreePixel=(4);break;case1:Tr=(structNode*)mallocsizeof(structNode)TreeNode→Right=Tr;AddQueue(Tr);TI=(structNode*)mallocsizeof(structNode)Tl→Lefi-NULL;Tl→RightNULL;Tl→Pixel=CutPixel;break;case2:T1=(structNode*)mallocsizeof(structNode)TreeNode→Left=Tl;(5);Tr=(structNode*)malloc(sizeof(streetNode)Tr→Left=-NULL;Tr→Right=NULL,,Tr→Pixel=CutPixel;break;case3:T1=(structNode*)malloc(sizeof(structNode)TreeNode→Right=Tl;AddQueue(T1);Tr=(structNode*)malloc(sizeof(structNodeTreeNode→Right=Tr;AddQueue(Tr);break;
