找考题网-背景图
问答题


阅读以下说明和流程图,回答问题1和问题2,将答案写在答卷的对应栏内。


【说明】
本流程图实现从比赛成绩文件生成赛车成绩一览表。
某国际高等级赛车比赛使用如图所示的成绩处理流程,比赛成绩记录在成绩文件F0中,其记录格式如下:
赛车号 车手姓名 第1赛段成绩 第2赛段成绩 第n赛段成绩
由该成绩文件生成如下所示的车手成绩一览表。生成的车手成绩一览表按总名次(系统会根据总成绩和分段成绩按规定方式计算得出总名次,不会有相同名次存在)降序排列。表中第n赛段的名次是该车手相应赛段在全部车手中的名次,成绩是根据规定方式计算而得的成绩,总名次是总成绩在所有车手中排名的名次。
赛车号 车手姓名 赛段1 赛段n 全程
成绩 名次 成绩 名次 总成绩 总名次
                   
                   
流程图中的顺序文件F0是车手成绩文件,F0文件经处理l处理后产生顺序文件F,然后经处理2至处理4对文件F进行处理和更新,在处理5中,仅仅对文件F的记录进行车手成绩一览表的编排输出,不进行排序和增加名次等处理。
【问题2】
简述处理2、处理3和处理4做何种处理,若有排序处理则需指明排序的键及序(升序或降序)。

【参考答案】

按课程代码(升序)、成绩(降序) 处理2:对文件F排序。 处理3:决定分赛段名次,计算总成绩,决定总名次,填入文件F的相应字段。 处理4:按总成绩(降序),按课程代码(降序)排列。试题1[解析] 文件F是文件F0经过处理1产生的文件,这个文件又经过处理2、处理3、处理4的处理和更新,而在处理5中,只......

(↓↓↓ 点击‘点击查看答案’看完整答案 ↓↓↓)
热门试题

问答题【说明】构造最优二叉查找树。 具有n个结点的有序序列a1, a2, …, an存在于数组元素a[1]、a[2], …, a[n]之中, a[0]未被使用。结点a1, a2, …, an-1, an的查找成功的概率p1, p2, …, pn-1, pn存在于数组元素 p[1]、p[2], …, p[n—1]、p[n]之中, p[0]未用。另外, 查找失败的概率q0, q1, …, qn-1, qn存在于数组元素q[0]、p[1], …, q[n-1]、q[n]之中。算法计算的序列ai+1, ai+2,…, aj-1, aj的最优二叉查找树Tij的代价Cij存在于数组元素c[i][j]之中, Tij的根结点的序号rij存在于r[i][j]之中, 它的权值存在于w[i][j]之中。为了便于内存的动态分配, 统统使用一维数组取代二维数组。 const float MAXNUM=99999. 0; 尽可能大的浮点数 template< (1) > void OPtimal_Binary_Search_Tree(float p[], float q[], Type a[], int n) { float *C, *W; c= (2) ; w= (3) ; int *r; r=new int[(n+1)*(n+1)]; for(i=0; i<=n; i++) { c[i*(n+1)+i]=0. 0; 即:c[i][i]=0.0, 用一维数组表示 w[i*(n+1)+i]=q[i]; 即:w[i][i]=q[i], 用一维数组表示 } int i, j, k, m, length; m表示根结点的下标或序号, 范围为0~n float minimum; for(length=1; length<=n; length++) 处理的序列长度由1到n for(i=0; i<=n-length; i++){ i为二叉查找树Tij的起始序号 j=i + length; j为二叉查找树Tij的终止序号。如:处理序列a1a2a3时, 相应的二叉查找树为T03, i=0, 而j=3 w[i*(n+1)+j]= (4) ; minimum =MAXMUM; for(k=i+1; k<=j; k++) 考察以ai+1、ai+2, …, ai为根的情况 if( (5) <minimum) { minimum=c[i*(n+1)+k-1]+c[k*(n+1)+j];m=k; } c[i*(n+1)+j]=w[i*(n+1)+j]+c[i*(n+1)+m-1]+c[m*(n+1)+j]; r[i*(n+1)+j]=m; r[i][j]=m } } 构造好的最优二叉查找树的根结点的序号在r[0][n]中

问答题【说明】用克鲁斯卡尔算法求解给定图的最小生成树。#include <stdio. h>#include <stdlib. h>#define MAXN 30typedef struct{ int v1,v2; *一条边依附的两个顶点* int weight; *边上的权值* }EDGE; typedef struct{ int Vnum; *图中的顶点数目* EDGE e[MAXN*(MAXN-1) 2]; *图中的边* }Graph; typedef struct node{ *用链表存储同一个连通分量的顶点* int v; struct node *next; }Alist; void heapadjust(EDGE data[], int s, int m){ *将元素序列data[s..m]调整为小顶堆, 堆顶元素(最小元素)为data[s]* int j; EDGE t; t=data[s]; *备份元素data[s], 为其找到适当位置后再插入* for(j=2*s+1; j<=m; j=j*2+1){ *沿值较小的子结点向下筛选* if(j<m && (1) ) ++j; if(!(t. weight>data[j]. weight)) break; data[s]=data[j];s=j; *用s记录待插入元素的位置(下标)* } *for* data[s]=t; *将备份元素插入由s所指出的插入位置* } *heapadjust* int creat_graph(Graph *p) *输入图中的顶点及边, 返回图中边的数目* { int k=0; *记录图中边的数目* int n; int v1,v2; int w; printf( vertex number of the graph: ); scanf( %d , &n); *输入图中的顶点数目* if(n<1) return 0; p->Vnum=n; do{ printf( edge(vertex1,vertex2,weight): ); scanf( %d %d %d , &V1, &v2, &w); if(v1>=0 && v1<n && v2>=0 && v2<n){p->e[k]. v1=v1; p->e[k]. v2=v2; p->e[k]. weight=w; k++; } *if* }while(!( (2) )); return k; *返回图中边的数目* } *creat_graph* int kruskal(Graph G, int enumber, int tree[][3]){ *用kruskal算法求无向连通图G的最小生成树, 图中边所得数目为enumber, * *数组tree[][3]中存放生成树中边的顶点和边上的权值, 函数返回生成树的代价* int i, k, m, c=0; int v1, v2; Alist *p, *q, *a[MAXN]; for(i=0; i<G.Vnum; ++i){ *将每个连通分量中的顶点存放在一个单链表中* a[i]=(Alist*)malloc(sizeof(Alist)); if(!a[i]) {printf( n mernory allocation error! ); exit(0); } *if* a[i]->v=i; a[i]->next=NULL; } *for* for(i=enumber-1; i>=0; --i) *按照边上的权值建立小顶堆* heapadjust( (3) ); k=G. Vnum; *k用于计算图中的连通分量数目* m=enumber-1; i=0; do{v1=G. e[0]. v1; v2=G. e[0]. v2; p=a[v1]; while(p && p->v!=v2){ *判断当前选择的边的顶点是否在一个连通分量中* q=p; p=p->next; }if(!p){ *当前边的顶点不在一个连通分量中* p=q; p->next=a[G. e[0]. v2]; p=a[G. e[0]. v1); *加入边(v1,v2), 将两个连通分量合并为一个* while(p){a[p->v]= (4) ; p=p->next; }k--; *连通分量数目减少一个* tree[i][0]=v1; *记录加入最小生成树的边* tree[i][1]=v2; tree[i][2]=G. e[0]. weight; c+=G. e[0]. weight; ++i; } *if* G. e[0]=G. e[m]; m--; heapadjust ( (5) );} while(k>1); *当所有顶点不在同一个连通时, 继续* return c; *返回最小生成树的代价* } *kruskal* void main(void){ int i, enumber; int tree[MAXN][3]; int cost=0; Graph G; enumber=creat_graph(&G); cost=-kruskal(G,enumber,tree); printf( Minimum-Cost spanning tree(kruskal): n ); printf( edge t weight t n ); for(i=0; i<G. Vnum-1; ++i)printf( v %d –v %d t %d n , tree[i][0], tree[i][1], tree[i][2]); printf( Cost:%d n , cost); }