软考系统设计师试题 软考软件设计师试题
作者:mb604afd7c2c1a62023-09-25 21:14:12
备考咨询 刷题指导
添加专属学姐
2024上半年软考备考资料+考试大纲
下载
试题一:阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。 【说明】 在一块电路板的上下两端分别有n个接线柱。根据电路设计,用(i,π(i))表示将上端接线柱i与下端接线柱π(i)相连,称其为该电路板上的第i条连线。如图4-1所示的π(i)排列为{8,7,4,2,5,1,9,3,10,6}。对于任何1≤iπ(j)。在制作电路板时,要求将这n条连线分布到若干绝缘层上,在同一层上的
- 试题一:阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。
- 【说明】
- 在一块电路板的上下两端分别有n个接线柱。根据电路设计,用(i,π(i))表示将上端接线柱i与下端接线柱π(i)相连,称其为该电路板上的第i条连线。如图4-1所示的π(i)排列为{8,7,4,2,5,1,9,3,10,6}。对于任何1≤iπ(j)。
- 在制作电路板时,要求将这n条连线分布到若干绝缘层上,在同一层上的连线不相交。现在要确定将哪些连线安排在一层上,使得该层上有尽可能多的连线,即确定连线集Nets={(i,π(i)),1≤i≤n}的最大不相交子集。
- 【分析问题】
- 记N(i,j)={t|(t,π(t))∈Nets,t≤i,π(t)≤j}。N(i,j)的最大不相交子集为MNS(i,j),size(i,j)=|MNS(i,j)|。
- 经分析,该问题具有最优子结构性质。对规模为n的电路布线问题,可以构造如下递归式:
- 【C代码】
- 下面是算法的C语言实现。
- (1)变量说明
- size[i][j]:上下端分别有i个和j个接线柱的电路板的第一层最大不相交连接数
- pi[i]:π(i),下标从1开始
- (2)C程序 #include"stdlib.h"
- #include
- #define N 10 /*问题规模*/
- Int m=0; /*记录最大连接集合中的接线柱*/
- Void maxNum(intpi[],intsize[N+1][N+1],intn){/*求最大不相交连接数*/
- int i,j;
- for(j=0;j for(j=pi[i];j<=n;j++)(1); /*当j>=π(1)时*/
- for(i=2;i for(j=pi[i];j<=n;j++) { /*当j>=c[i]时,考虑两种情况*/
- size[i][j]=size[i-l][j]>=size[i-l][pi[i]-l]+1?size[i-l][j]:
- size[i-l][pi[i]-l]+l;
- }
- }
- /*最大连接数*/
- size[n][n]=size[n-l][n]>=size[n-l][pi[n]-l]+1?size[n-l][n]:size[n-l][pi[n]-l]+l:
- }
- /*构造最大不相交连接集合,net[i]表示最大不相交子集中第i条连线的上端接线柱的序号*/
- void constructSet(int pi[],int size[N+1][N+1],int n,int net[n]){
- int i,j=n;
- m=0;
- for(i=n;i>1;i--) {/*从后往前*/
- if(size[i][j]!=size[i-l][j]){/*(i,pi[i])是最大不相交子集的一条连线*/
- (3); /*将i记录到数组net中,连接线数自增1*/
- j=pi[i]-1; /*更新扩展连线柱区间*/
- }
- }
- if(j>=pi[l])net[m++]=l; /*当i=1时*/
- }
- 【问题1】(6分)
- 根据以上说明和C代码,填充C代码中的空(1)~(3)。
- 【问题2】(6分)
- 根据题干说明和以上C代码,算法采用了(4)算法设计策略。
- 函数maxNum和constructSet的时间复杂度分别为(5)和(6)(用O表示)。
- 【问题3】(3分)
- 若连接排列为{8,7,4,2,5,1,9,3,10,6},即如图4-1所示,则最大不相交连接数为(7),包含的连线为(8)(用(i,π(i))的形式给出)。
[l];j++)(2);>;i++){>[l];j++)>≤n,第i条连线和第j条连线相交的充要条件是π(i)> -
查看答案 - 参考解析:
友试题答案分享: - 试题二:阅读以下说明和C代码,将应填入 (n) 处的字句写在的对应栏内。
【说明】
在一个简化的绘图程序中,支持的图形种类有点(point)和圆(circle),在设计过程中采用面向对象思想,认为所有的点和圆都是一种图形(shape),并定义了类型shape t、 point t和circle t分别表示基本图形、点和圆,并且点和圆具有基本图形的所有特征。
【C代码】
typedef enum { point,circle } shape type; /* 程序中的两种图形:点和圆 */
typedef struct { /* 基本的图形类型 */
shape_type type; /* 图形中类标识:点或者圆*/
void (*destroy) (); /* 销毁图形操作的函数指针*/
void (*draw) (); /* 绘制图形操作的函数指针*/
} shape_t;
typedef struct { shape_t common; int x; iht y; } point_t; /* 定义点类
型, x, y为点坐标*/
void destroyPoint (point_t* this) { free (this); printf ("Point destoryed!
\n"); } ) /* 销毁点对象*/
void drawPoint(point_t* this) { printf("P(%d,%d)", this->x, this->y); }
/* 绘制点对象*/
shape_t* createPoint (va_list* ap) (/* 创建点对象,并设置其属性*/
point_t* p_point;
if ( (p_point= (point_t*)malloc (sizeof (point_t)) ) ==NULL) returnNULL;
p_point->common, type = point; p_point->common, destroy = destroyPoint;
p_point->common.draw = drawPoint;
p_point->x = va_arg(*ap, int); /* 设置点的横坐标*/
p_point->y = va_arg(*ap, int); /* 设置点的纵坐标*/
return (shape_t*)p_ooint; /*返回点对象指针*/
}
typedef struct { /*定义圆类型*/
shape_t common;
point_t 4center; /*圆心点*/
int radius; /*圆半径*/
} circle_t;
void destroyCircle(circle_t* this){
free( (1) ); free(this); printf("Circle destoryed!\n");
}
void drawCircle(circle_t* this) {
print f ("C (");
(2) .draw(this->center); /*绘制圆心*/
printf(",%d) ", this->radius);
}
shape_t* createCircle(va_list4 ap) { /*创建一个圆,并设置其属性*/
circle_t4 p circle;
if ((p_circle = (circle_t4)malloc (sizeof (circle_t)) ) ==NULL ) return NULL;
p_circle->common.type = circle; p_circle->common.destroy = destroy
Circle;
p_circle->common.draw = drawCircle;
(3) = createPoint(ap); /* 设置圆心*/
p_circle->radius = va_arg(*ap, int); /* 设置圆半径*/
return p_circle;
}
shape_t* createShape(shape_type st, "') { /* 创建某一种具体的图形*/
va_list ap; /*可变参数列表*/
shape_t4 p_shape = NULL;
(4) (ap, st);
if( st == point ) p shape = createPoint(&ap); /* 创建点对象*/
if( st == circle ) p shape = createCircle(&ap); /*创建圆对象*/
va_end (ap);
return p_shape;
}
int main( ) {
int i; /* 循环控制变量,用于循环计数*/
shape_t* shapes[2]; /* 图形指针数组,存储图形的地址*/
shapes[0] = createShape( point, 2, 3); /* 横坐标为2,比值坐标为3*/
shapes[ii = createShape( circle, 20, 40, 10); /* 圆心坐标(20,40),
半径为 10*/
for(i=0 i<2; i++) { shapes[i]->draw(shapes[i]); printf("\n"); } /*
纵制数组中图形*/
for( i = 1; i >= 0; i-- ) shapes[i]->destroy(shapes[i]); /* 销毁
数组中图形*/
return 0;
}
【运行结果】
P(2,3)
(5)
Circle destoryed !
Point destoryed !
查看答案
参考解析:
考友试题答案分享:
软考资料: 2024年软考论文范文> 软考考试核心重点难点汇总> 查看更多>
备考刷题:章节练习+每日一练> 软考历年试题+模拟题>查看更多>