找考题网-背景图
问答题



【说明】
某大学准备开发一个学生课程注册系统,学生可以使用该系统查询新学期将开设的课程和讲课教师情况,选择自己要学习的课程进行登记注册,并可以查询成绩单;教师可以使用该系统查询新学期将开设的课程和选课学生情况,并可以登记成,绩单;注册管理员使用该系统进行注册管理,包括维护教师信息、学生信息和课程信息等。
在每个学期的开始,学生可以获得该学期的课程目录表,课程目录表列出每门课程的所有信息,诸如基本信息、教师、开课系和选课条件等。
新学期开始前两周为选课注册时间,在此期间学生可以选课注册,并且允许改变或取消注册申请,开学两周后注册管理员负责关闭课程注册。每个学生可以选择不超过4门课程,同时指定2门侯选课程以备主选课程未选上。每门课程最多不能超过10人,最少不能低于3人,低于3人选课的课程将被取消。一旦学生的注册过程完毕,注册系统将有关信息提交收费系统以便学生付费。如果在实际注册过程中名额已满,系统将通知学生在提交课程表之前予以更改。
在学期结束时,学生可以存取系统查看电子成绩单。由于学生成绩属于敏感信息,系统必须提供必要的安全措施以防非法存取。
【用例图】
                                     表1 学生课程注册系统的实体类
实体类 说明
Professor 学校中讲课的教师
student 学校中注册课程的学生
Schedule 学生在新学期选择登记的课程列表
CourseCatalog 学校所有课程的目录
Course 课程的基本信息
CourseOffering 新学期课程的开设信息,如讲课教师、时间、地点等信息

                                      表2 学生课程注册系统的边界类
边界类 说明
LoginForm 为教师、学生和注册管理员提供登录的操作
RegisterCoursesForm 为学生提供选课注册的操作
ViewReportForm 为学生提供成绩查询的操作
selecrTeachCoursesForm 为教师提供查看学生选课情况的操作
SubmitCradesForm 为教师提供登记成绩的操作
MaintainProfessorsForm 为注册管理员提供维护教师信息的操作
MaintainStudentsForm 为注册管理员提供维护学生信息的操作
MaintainCoursesForm 为注册管理员提供维护课程信息的操作
CloseRegistrationForm 为注册管理员提供关闭注册的操作
BillingSystemNotice 提供与收费系统的信息交换接口

                                       表3 学生课程注册系统的控制类
控制类 说明
RegisterCoursesControl 负责新学期学生的选课登记
ViewReportControl 负责学生成绩的查询
SelectTeachCoursesControl 负责新学期课程的学生选择情况
SubmitGradesControl 负责学生成绩的登记
CloseRegistrationControl 负责关闭课程注册
【协作图】


【时序图】
注释1:学生打算注册新的课程。
注释2:一张这学期可选择的课程列表。
注释3:显示一张为学生选课用的空白登记表。
【问题1】
在UML中,用例代表一个完整的功能,如与角色通信、进行计算或在系统内工作等。请简要说明用例具有哪些的特征,并指出用例图中(1)~(3)处表示的内容。

【参考答案】

用例的特征如下:用例总是由角色初始化;用例为角色提供值;用例具有完全性,即不管其内部是如何实现的,只有最终产生了返回角色的结果,用例的执行才能完毕。
(1)登记成绩(2)查询成绩单(3)关闭注册
热门试题

问答题【函数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) &&j<B. length) if(A. elem[j] < B. elem[j] )return(-1) else if(A. elem[j] > B. elem[j] )return(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 &L, int m) if( (4) &&L->next) 链表不空且Lm!=0 P = L->next; k=1; while( k < m&&p) 查找am,所在结点 P= (5) ;++k; if( (6) &&p->next) n! =0 时才需要修改指针 ha = L -> next; 以指针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) 。

问答题【程序说明】 本程序先从文件读人各考生的准考证号(设为整型数)及成绩,并将其存放在一棵检索二叉树上,二叉树结点的健值是成绩,每个结点带一链表,链表结点存放取得该成绩的考生的准考证号。然后,程序按中序遍历检索二叉树,从高分到低分输出结果,使每行输出成绩及其取得成绩的考生的准考证号。 【程序】 #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);

问答题【说明】 本题将有向网(带权有向图)定义为类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 forvoid 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;

【说明】
本题将有向网(带权有向图)定义为类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;