软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷19
-
阅读以下说明和C++代码,将应填(n)处的字句写在对应栏内。
【说明】
本题将有向网(带权有向图)定义为类Adjacency WDigraph。类中的数据成员n表示有向网中的顶点数;a为带权邻接矩阵,用于存储有向网中每一对顶点间弧上的权值;c为二维数组,存储有向网中每一对顶点间的最短路径长度;kay为二维数组,存储最短路径,kay[i][j]=k表示顶点i到达顶点j的最短路径必须经过顶点k。类中的主要成员函数有:
Input():输入有向网的顶点数、各条弧及权值,建立带权领接矩阵a。若顶点i到顶点j有弧,则a[i][j]取弧上的权值,否则a[i][j]的值取NoEdge。
AllPairs();用弗洛伊德(Floyd)算法求有向网中每一对顶点间的最短路径长度。
OutShortestPath (int i, int j:计算顶点i到顶点j的最短路径。
outputPath(int i, int j):输出顶点i到顶点j的最短路径上的顶点。
Floyd算法的基本思想是递推地产生一个矩阵序列C0,C1,C2,…,Cn,其中C0是已知的带权邻接矩阵,a,Ck(i, j(0≤i,j<)表示从顶点i到顶点j的中间顶点序号不大于k的最短路径长度。如果i到j的路径没有中间顶点,则对于0≤k<n,有Ck(i,j)=C0(i,j)= a[i][j]。递推地产生C1,C2,…,Cn的过程就是逐步将可能是最短路径上的顶点作为路径上的中间顶点进行试探,直到为全部路径都找遍了所有可能成为最短路径上的中间顶点,所有的最短路径也就全部求出,算法就此结束。
【C++代码】
#include < iostream. h >
#define NoEdge 10000// 当两个顶点之间没有边相连时,在邻接矩阵中用NoEdge表示
void Make2DArray(int * * &x, int rows, int cols);
class AdjacencyWDigraph {
private
int n; //有向网中的顶点数目
int* *a; //存储顶点间弧上的权值
int* *c; //存储计算出的最短路径长度
int* * kay; //存储求出的最短路径
pubic:
int Vertices( )const j return n;}
void AllPairs( );
void Input( ); //输入有向网的顶点数、各条弧及权值,建立邻接矩阵a
void OutShortestPath(int i, int j); //计算顶点i到j的最短路径(试卷中未列出)
~ AdjacencyWDigraph ( ); //析构函数(试卷中未列出)
private:
void outputPath(int i, int j);
};
void AdjacencyWDigraph: :AllPairs( )
int i,j,k,t1,t2,t3;
for(i=1;i<=n; k++)
for(j=1;j<=n; ++j)
{c[i][j]=(1); kay[i][j]=0;}
for(k=1;k<=n; k++)
for(i=1;i<=n; i++){
if(i= =k) continue;
t1=c[i][k];
for(j=1;j<=n; j++){
if(j==k||j==i) continue;
t2 =c[k] [j]; t3 =c[i] [j];
if( t1 ! = NoEdge && t2! = NoEdge &&(t3==NoEdge || t1+t2<t3) )
{c[i][j]=(2);kay[i][j]=(3);}
}//for
}//for
void AdjacencyWDigraph:: outputPath(int i, int j)
{ //输出顶点i到j的最短路径上的顶点
if(i==j) return;
if(kay[i] [j]==0)cout<<j <<";
else { outputPath(i,(4)); outputPath((5));}
}
void Adjacency WDigraph: :lnput( )
{int i,j,u,v,w,E;
cout << "输入网中顶点个数:";cin> >n;
cout << "输入网中弧的个数:"; cin> >E;
Make2DArray (a, n+1, n+1);
for(i=1;i<=n; i++)
for(j=1; j<=n; j++) a[i][j]=NoEdge;
for(i=1;i< =n; i++) a[i][i]=0;
Make2DArray(c, n+1, n+1);
Make2DArray(kay, n+1, n+1)
for(i=1;i<=E; i++){
cout<<"输入弧的信息(起点终点权值); "; cin> >u> >v> >w; a[u][v] =w;
}
}
void Make2DArray(int * * &x, int rows, int cols)
{ int i,j;
x=new int* [rows+1];
for(i=0;i<rows+1;i ++ ) x[i]=new int [cols+1];
for(i=1;i<= rows; i ++)
for(j=1;j<=cols; j++) x[i][j]=0;
-
【说明】
下面是一个Applet程序,其功能是通过一个按钮控制一个窗口的创建,显示与隐藏,并且以按钮文字作为提示,可以随着窗口的状态改变,即如果窗口出现,则按钮文字为"Hide myFrm",提示用户点击按钮,则隐藏窗口,反之亦然。请将横线处语句补充完整。
程序运行结果如图5所示:
import java. awt. *;
import java. applet. *;
<applet code =" ex8_7. class" width =800 height =400 >
</applet >
*/
public class ex8_7 extends Applet{
private Frame. frm;
private Button showBtn;
public void init() {
showBtn = new Button("Show Frame");
(1);
}
public boolean action( Event e, Object o ) {
if( e. target = = showBtn ) {
if( (2) ) {
(3);
frm. dispose()
(4)
showBtn, setLabel("Show myFrm");
}
else {
frm = new Frame( "myFrm" );
frm. resize( 200, 150 );
frm. setBackground( Color. gray );
(5);
showBtn, setLabel (" Hide myFrm" );
}
}
return true;
}
}
ex8_7, html
< HTML >
< HEAD >
<TITLE > ex8_7 </TITLE >
</HEAD >
< BODY >
<appletcode =" ex8_7, class" width=800 height=400 >
</applet >
</BODY >
</HTML >
-
阅读以下说明和C程序,填入(n)外。
[说明]
以下C程序实现了将字符串转化为浮点数的功能。例如字符串“1234567”转化为浮点数1234567;字符串“100.02035”转化为浮点数100.02035;字符串“-100.02035”转化为浮点数-100.02035。程序中的部分变量的含义如表9-5。
[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&=0xDF;
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&=0xDF;
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&=0xDF;
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)处的字句,写在对应栏内。
【程序说明】
本程序先从文件读人各考生的准考证号(设为整型数)及成绩,并将其存放在一棵检索二叉树上,二叉树结点的健值是成绩,每个结点带一链表,链表结点存放取得该成绩的考生的准考证号。然后,程序按中序遍历检索二叉树,从高分到低分输出结果,使每行输出成绩及其取得成绩的考生的准考证号。
【程序】
#include < stdio. h >
typedef struet idnode {
int id;
struct idnode * next;
} ldNode;
typedef struct marknode I
int mark;
ldNode * head;
struct marknode * left, * right;
} MarkNode;
char fname [ ] = "sp07.dat";
main( )
{ int id, mark;
MarkNode * root = null;
FILE * fp = fopen(fname," r" );
if(!fp) {
printf("file%s open error, \n" , fname);
exit(0);
}
while (!feop(fp)) {
fscanf(fp," %d%d", &id, &mark);
btree(&root, id, mark);
}
fclose(fp);
print(root);
}
btree(MarkNod * * mpptr, int id, int mark)
{ ldNode * ip;
MarkNode *mp = * mpptr;
if (1) {
if (mark==p->mark) addldNODE ((2), id);
else if ( mark >mp -> mark) btree (&top -> left, id, mark);
else btree(&mp-> right, id, mark);
} else
Imp = ( marknode * ) malloc(sizeo (marknode) );
mp -> mark = mark;
mp -> left =mp -> right = NULL;
(3)
addldNode(&mp -> head, id);
(4);
}
}
addldNode(ldNode * * ipp, int id)
{ ldNode * ip = * ipp;
if ((5))addldNode ((6)), id;
else {
ip = (ldNode * )malloc(sizeof(ldNode) );
sp - > id = id;
ip -> next = NULL;
(7)
}
}
print(MarkNode * rap)
{ ldNode *ip, *ip0;
if (mp) {
print ( mp -> left);
printf(" %6d: \t" ,mp -> mark);
ip = mp -> head;
while(ip) {
printf(" %6d" ,ip -> id);
ip0 =ip;
ip = ip -> next;
free (ip0);
}
printf(" \n" ); printf( mp -> right); free(mp);
}
}
-
根据Steve Cook和John Danils的观点,类图可以分为三个层次:概念层(Conseptual)、说明层(Specification)和实现层(Implementation)。如何理解着三个层的划分?这种观点在软件开发中有什么样指导作用?请简要说明。
-
图9-5为电梯管理系统状态图。以下有8个引起状态转移的事件。请根据说明和系统状态图将对应的事件标号填入相应的(n)内。
A.召唤请求 B.发生超载
C.超载解除 D.电梯就绪且状态正常
E.电梯就绪但状态异常P.电梯到达非调度层G.电梯响应目的地请求H.电梯到达调度层或遇到紧急情况
-
阅读下列说明以及图3-1和图3-2,回答问题1、问题2和问题3。
[说明]
下面是某公司开发的电梯管理系统,系统功能如下:
1.响应用户召唤指令。当用户需要电梯时可以通过按楼层面板召唤。
2.进入电梯后,乘客可以通过电梯面板选择目的楼层。
3.当电梯到达调度楼层后,判断是否响应停止运行,开启电梯门,完成调度。
4.当电梯到达非调度楼层时,不作响应,继续运行。
5.乘客在电梯中能够知道电梯的运动状态,如运动方向、电梯运行到的楼层等。
6.电梯超载报警。
系统采用面向对象方法进行开发。在开发过程中某设计室设计的电梯管理系统用例如表9-4所示。电梯管理系统用例图如图9-4所示。
根据说明,回答下面问题:
仔细分析系统的用例说明和用例图,从功能要求角度来看,该系统的用例并不完善。请根据功能要求补充至少两个用例,并作简单说明。
-
如下的SQL语句是检索“每个学生及其选修的课程名和成绩”的不完整语句,请在空缺处填入正确的内容。
SELEC(1)
FROM(2)
WHERE(3)
-
如下的SQL语句是检索“信息系(IS)和计算机科学系(CS)的学生的姓名和性别”的不完整语句,请在空缺处填入正确的内容。
SELECT(1)
FROM(2)
WHERE(3)
-
阅读以下说明和表,回答问题1~4问题。
[说明]
一个描述学校的部分关系模式的结果描述如下:
1.一个系有若干学生,但一个学生只能在一个系;
2.一个系只有一名主任;
3.一个学生可以选修多门课程,每门课程有若干学生选修;
4.每个学生所学的每门课程都有一个成绩;
5.“学生”和“课程表”及“选课表”的关系示例分别如表9-1、表9-2、表9-3所示。
Student(学生表)的字段按顺序为学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所属院系(Sdept)、系主任(Smaster);
Course(课程表)的字段按顺序为课程编号(Cno)、课程名(Cname)、先行课程(Cpno)、课程学分 (Ccredit);
SC(选课表)的字段按顺序为学号(Sno)、课程号(Cno)、成绩(Grade)。
各表的记录如下:
试分析该关系模式中的函数依赖,并指出关系模式的候地选码。
-
请补齐下列数据字典条目:
系统命令=检索命令|统计命令|打印命令|维护命令;
干部信息=____________________________________
输入信息=____________________________________
检索项=______________________________________
统计项=______________________________________
-
阅读以下说明和数据流图,回答问题1~3问题。
[说明]
干部信息管理系统(CMIS)是用于对干部信息进行管理的特定系统。利用该系统,干部科可以对本单位干部信息进行管理,根据不同命令对信息进行增、删、改、内部调动,打印人事表格,进行统计、检索。干部科输入的系统命令需要合法性检查才能被接受、处理。系统命令可以是检索命令、统计命令、打印命令、维护命令中的任何一种。干部科的输入的干部信息数据包括输入信息、检索项、统计项、打印项、维护项等条目。一个完整的输入信息应包括干部的档号、干部的姓名、干部的性别、干部的年龄、干部的级别、干部的职称、干部的政治面貌等内容。系统进行检索处理时可以根据干部的档号、姓名或年龄进行简单检索,也可以根据“档号+姓名”或者“性别+年龄”进行组合检索。系统进行统计处理时,可以根据干部的性别、年龄或职称进行简单统计,也可以根据“年龄+职称”或“性别+职称”进行综合统计。通过系统授权,用户可以对系统进行维护。当用户需要对系统进行维护时,输入维护命令,得到合法性确认后,可以对系统数据库信息进行修改维护。维护命令包括:增加命令,根据输入信息增加干部信息;修改命令,根据修改项修改干部信息;检索命令,根据检索项检索干部信息。系统可以输出统计信息、人事表格、检索信息以供干部科用户使用。
干部信息管理系统的顶层图如图9-1所示;干部信息管理系统的第0层DFD图如图9-2所示,其中,加工3的细化图如图9-3所示。
数据流图9-1缺少了一条数据流(在图9-2中也未给出该数据流),请给出此数据流的起点和终点,并采用说明中的词汇给出此数据流名。
-
数据流图9-3中缺少了与“增加干部信息3.2”加工相关的数据流,请指出此数据流的方向,并采用说明中的词汇给出此数据流名。