软件设计师1990年下午试题7(C语言)
2011-07-02 20:09
169 查看
[程序说明]
设对于一个 n×n 的上三角矩阵 a,为节约存贮,只将它的上三角元素按行主序连续存放在数组 b 中。下面的函数 trans 在不引入工作数组的情况下,实现将 a 改为按列主序连续存放在数组 b 中。
设 n=5,
b=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
经调用 trans 函数后,b 变为
b=(1,2,6,3,7,10,4,8,11,13,5,9,12,14,15)
函数 tans 对数组元素的存贮位置作调整。调整过程中存在若干个循环传送链:
b(i1)→b(i2)→…→b(ij)→b(i1) 1≤j<n
例如,考察调整后的数组元素 b(2)( 值为 6 ),与该元素相关的位置调整将形成下面的循环传送链:
b(2)→b(3)→b(6)→…→b(12)→b(9)→b(5)→b(2)
关键是确定循环传送链的下标 i1,i2,…,ij ,以及在考察调整后的元素 b(k)( k;3,4,… ) 时能判定 b(k) 是已被传送过的某传送链上的元素。
函数 ctr(k,n) 计算调整后的数组 b 的第 k 个元素 b(k) 在原数组 b 中的位置,该位置作为函数 ctr(k,n) 的返回值。函数 ctr 根据 k 确定它在矩阵中的行号 i 和列号 j ( 注意行号和列号均从 0 算起 ),然后按矩阵存放原则计算出它在 b 中的位置。
[程序]
trans( b,n )
int n,b[]
{
int m,k,r,cc,rr;int w;
m=(n+1)*n/2-4;
k=2
while (m>0)
{
r=ctr(k,n);
if ( r == k )
m--;
else
{ cc=k;rr=r;
while(rr!=k && cc>=k)
{ cc=rr,rr=ctr(cc,n);
}
if (cc>=k)
{ cc=k;rr=r;w=b[k];
while(rr!=k)
{ b[cc]=b[rr];m--;
cc=rr,rr=ctr(cc,n);
}
b[cc]=w;m--;
}
}
k++;
}
}
ctr( k,n )
int k,n;
{
int i,j;
i=k;j=0 ;
while (i>j)
i -= ++j ;
return( i*n+j-i*(i+1)/2 ); ·
}
设对于一个 n×n 的上三角矩阵 a,为节约存贮,只将它的上三角元素按行主序连续存放在数组 b 中。下面的函数 trans 在不引入工作数组的情况下,实现将 a 改为按列主序连续存放在数组 b 中。
设 n=5,
┌1 | 2 | 3 | 4 | 5┐ | |
│0 | 6 | 7 | 8 | 9│ | |
a= | │0 | 0 | 10 | 11 | 12│ |
│0 | 0 | 0 | 13 | 14│ | |
└0 | 0 | 0 | 0 | 15┘ |
经调用 trans 函数后,b 变为
b=(1,2,6,3,7,10,4,8,11,13,5,9,12,14,15)
函数 tans 对数组元素的存贮位置作调整。调整过程中存在若干个循环传送链:
b(i1)→b(i2)→…→b(ij)→b(i1) 1≤j<n
例如,考察调整后的数组元素 b(2)( 值为 6 ),与该元素相关的位置调整将形成下面的循环传送链:
b(2)→b(3)→b(6)→…→b(12)→b(9)→b(5)→b(2)
关键是确定循环传送链的下标 i1,i2,…,ij ,以及在考察调整后的元素 b(k)( k;3,4,… ) 时能判定 b(k) 是已被传送过的某传送链上的元素。
函数 ctr(k,n) 计算调整后的数组 b 的第 k 个元素 b(k) 在原数组 b 中的位置,该位置作为函数 ctr(k,n) 的返回值。函数 ctr 根据 k 确定它在矩阵中的行号 i 和列号 j ( 注意行号和列号均从 0 算起 ),然后按矩阵存放原则计算出它在 b 中的位置。
[程序]
trans( b,n )
int n,b[]
{
int m,k,r,cc,rr;int w;
m=(n+1)*n/2-4;
k=2
while (m>0)
{
r=ctr(k,n);
if ( r == k )
m--;
else
{ cc=k;rr=r;
while(rr!=k && cc>=k)
{ cc=rr,rr=ctr(cc,n);
}
if (cc>=k)
{ cc=k;rr=r;w=b[k];
while(rr!=k)
{ b[cc]=b[rr];m--;
cc=rr,rr=ctr(cc,n);
}
b[cc]=w;m--;
}
}
k++;
}
}
ctr( k,n )
int k,n;
{
int i,j;
i=k;j=0 ;
while (i>j)
i -= ++j ;
return( i*n+j-i*(i+1)/2 ); ·
}
相关文章推荐
- 软件设计师1990年下午试题2(流程图解析)
- 软件设计师2008年12月下午试题4(C语言 动态规划)
- 软件设计师1991年下午试题2(C语言 压缩矩阵乘法)
- 软件设计师1990年下午试题5(流程图解析)
- 软件设计师2007年11月下午试题5(C语言 面向对象)
- 软件设计师1990年下午试题1(流程图解析)
- 软件设计师2006年11月下午试题5(C语言 树及其孩子-兄弟表示)
- 软件设计师2006年11月下午试题6(C++ 状态模式)
- 历年软件设计师下午考试试题汇总统计
- 历年软件设计师下午考试试题汇总统计
- 软件设计师上下午试题技巧知识点
- 软件设计师1991下午试题1(流程图解析)
- 软件设计师历年下午试题知识点分布情况
- 历年软件设计师下午考试试题汇总统计(更新至2016年上半年)
- 历年软件设计师下午考试试题汇总统计
- 软件设计师2005年11月试题4(C语言 散列文件存储)
- 历年软件设计师下午考试试题汇总统计(持续更新中......)
- 软件设计师2006年5月试题5(C语言 多叉平衡查找树)
- 软件设计师2004年11月下午试题6(C++ Singleton模式)
- 软件设计师2005年11月下午试题5(C++ 观察者模式)