龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

数据结构题集--数组(二维数组)

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
设计一个矩阵相乘的程序 假设有 1 5 7 3 3 9 1 4 1 4 A= 3 6 3 9 B= 5 6 7 9 0 3 1 2 8 7 3 2 7 2 5 6 0 3 1 9 9 7 4 7 8 0 3 2 5 4 求出A*B的矩阵 程序构思: 我们所知的矩阵乘法运算的算式如下: Cij = Aik X Bkj

设计一个矩阵相乘的程序

  假设有

  

   1 5 7 3 3 9 1 4 1 4

  A= 3 6 3 9 B= 5 6 7 9 0 3

   1 2 8 7 3 2 7 2 5 6

   0 3 1 9 9 7 4 7 8 0

   3 2 5 4

  

  求出A*B的矩阵

  程序构思:

  我们所知的矩阵乘法运算的算式如下:

  

  Cij = Aik X Bkj 的k从1到 n 的和,那么可以用一个3层循环来运算此算式:

  

  C(1,1)=A(1,1)*B(1,1)+A(1,2)*B(2,1)+A(1,3)*B(3,1)+A(1,4)*B(4,1)

   =(1*3)+(5*5)+(7*3)+(3*9)

   =3+25+21+27

   =76

  同理

  C(1,2)=A(1,1)*B(1,2)+A(1,2)*B(2,2)+A(1,3)*B(3,2)+A(1,4)*B(2,2)

   =(1*9)+(5*6)+(7*2)+(3*7)

   =9+30+14+21

   =74

  依此类推,我们可以求得矩阵A与矩阵B的矩阵乘积。

  void main(void)

  {

   int matrixa[5][4]={1,5,7,3,

   3,6,3,9,

   1,2,8,7,

   0,3,1,9,

   3,2,5,4};

   int matrixb[4][6]={3,9,1,4,1,4,

   5,6,7,9,0,3,

   3,2,7,2,5,6,

   9,7,4,7,8,0};

   int matrixc[5][6];

   int i,j,k;

   for(i=0;i<5;i++)

   for(j=0;j<6;j++)

   {

   matrixc[i][j]=0;

   for(k=0;k<4;k++)

   matrixc[i][j]+=matrixa[i][k]*matrixb[k][j];

  

}

   printf("The matrix A:

");

   for(i=0;i<5;i++)

   {

   for(k=0;k<4;k++)

   printf("%5d",matrixa[i][k]);

   printf("

");

   }

   printf("

The matrixb:

");

   for(k=0;k<4;k++)

   {

   for(j=0;j<6;j++)

   printf("%5d",matrixb[k][j]);

   printf("

");

   }

   printf("

Matrix C=Matrix A* Matrix B

");

   for(i=0;i<5;i++)

   {

   for(j=0;j<6;j++)

   printf("%5d",Matrixc[i][j]);

   printf("

");

   }

  }

  运行结果:

  The Matrix A:

  1 5 7 3

  3 6 3 9

  1 2 8 7

  0 3 1 9

  3 2 5 4

  

  The Matrix B:

  3 9 1 4 1 4

  5 6 7 9 0 3

  3 2 7 2 5 6

  9 7 4 7 8 0

  

  Matrix C=Matrix A*Matrix B:

   76 74 97 84 60 61

   129 132 102 135 90 48

   100 86 99 87 97 58

   99 83 64 92 77 15

   70 77 68 68 60 48

  

  二维数组行列互换

  程序实例:

   设计一个能将二维数组转换成以列为主的一维数组和以行为主的一维数组。

   默认二维数组数据为:

   9 7 6 6

   3 5 3 3

   Data = 6 6 4 7

   7 5 1 4

   1 2 8 0

  程序构思:

   依题意知道,本程序所运用的数据结构为“二维数组”,上报为进行数组以列为主和以行为主的转换。

  已知该二维数组的大小为 5*4

  以行为主的数组转换公式为:

   Data[i][j]的位置=(i*4)+j

  以列为主的数组的转换公式为:

   Data[i][j]的位置=(j*5)+i

  声明一个大小为20的一维数组,用来存久违转换以列为主后的数据,并声明一个大小为20的一维数组,用来存久违转换后以行为主的数据。

  void main(void)

  {

   int data[5][4]={ 9,7,6,6,

   3,5,3,5,

   6,6,4,7,

   7,5,1,4,

   1,2,8,0};

   int rawdata[20];

   int coldata[20];

   int i,j;

   printf("The Data of two dimensional array:

");

   for(i=0;i<5;i++)

   {

   for(j=0;j<4;j++)

   printf("%4d",data[i][j]);

   printf("

");

   }

   for(i=0;i<5;i++)

   for(j=-;j<4;j++)

   rowdata[i*4+j]=data[i][j];

   printf("

The Row Major Matrix:

");

   for(i=0;i<20;i++)

   printf("%3d",rowdata[i]);

   printf("

");

   for(i=0;i<5;i++)

   for(j=0;j<4;j++)

   coldata[j*5+i]=data[i][j];

   printf("

The Column Major Matrix:

");

   for(i=0;i<20;i++)

   &nbs

  

  

精彩图集

赞助商链接