软件设计师1990年下午试题7(C语言)

简介: [程序说明] 设对于一个 n×n 的上三角矩阵 a,为节约存贮,只将它的上三角元素按行主序连续存放在数组 b 中。下面的函数 trans 在不引入工作数组的情况下,实现将 a 改为按列主序连续存放在数组 b 中。

[程序说明]

设对于一个 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┘

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 ); ·

}  

相关文章
|
6月前
|
算法 Java 程序员
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
68 7
|
存储 安全 Java
使您的软件运行起来: 防止缓冲区溢出(C语言精华帖)
使您的软件运行起来: 防止缓冲区溢出(C语言精华帖)
88 1
|
测试技术 API C语言
C语言实现一个简易版的打字软件
C语言实现一个简易版的打字软件
143 0
|
IDE NoSQL 前端开发
C语言学习——IDE软件Code::Blocks教程
C语言学习——IDE软件Code::Blocks教程
664 0
C语言学习——IDE软件Code::Blocks教程
|
程序员 编译器 C语言
[软考考点解析]软件设计师--C语言存储空间
1. 题目 C程序中全局变量存储空间在____分配。 A 代码区 B 静态数据区 C 栈区 D 堆区
141 0
|
算法 程序员 API
《C语言接口与实现:创建可重用软件的技术》一导读
C语言接口与实现:创建可重用软件的技术 如今的程序员忙于应付大量关于API(Application Programming Interface)的信息。但是,大多数程序员都会在其所写的几乎每一个应用程序中使用API并实现API的库,只有少数程序员会创建或发布新的能广泛应用的API。
2754 0