第八周项目3对称矩阵压缩存储的实现与应用(3)

来源:互联网 发布:农产品溯源系统 源码 编辑:程序博客网 时间:2024/05/21 13:40

/*  

*Copyright  (c)2017,烟台大学计算机与控制工程学院      

*All rights reservrd.      

*文件名称 :test.cpp      

*作者:潘亚楠  

*完成时间:2017年12月14日      

*版本号:v1.0      

*问题描述:写出对上、下三角矩阵、对角矩阵的压缩存储结构,以及相关的基本运算的实现 

问题及代码:


  1. #include <stdio.h>    
  2. #include <malloc.h>    
  3. #define N 4    
  4. #define M 10    
  5. void Init(int *&b)    
  6. {    
  7.     b = (int*)malloc(sizeof(int)*(N*(N+1)/2));    
  8. }    
  9.     
  10. //返回存储在b[M]中,对应二维数组A[i][j]的值    
  11. int Value(int b[], int i, int j)    
  12. {    
  13.     if (i>=j)    
  14.         return b[(i*(i+1))/2+j];    
  15.     else    
  16.         return b[(j*(j+1))/2+i];    
  17. }    
  18.     
  19. //将e赋值给对应二维数组元素A[i][j],要存储到B[M]中    
  20. void Assign(int b[], int e, int i, int j)    
  21. {    
  22.     if (i>=j)    
  23.         b[(i*(i+1))/2+j] = e;    
  24.     else    
  25.         b[(j*(j+1))/2+i] = e;    
  26.     return;    
  27. }    
  28.     
  29. //输出压缩存储在b中的对称矩阵    
  30. void Disp(int b[])    
  31. {    
  32.     int i,j;    
  33.     for (i=0; i<N; i++)    
  34.     {    
  35.         for (j=0; j<N; j++)    
  36.             printf("%4d",Value(b,i,j));    
  37.         printf("\n");    
  38.     }    
  39. }    
  40.     
  41. //销毁存储空间    
  42. void Destroy(int b[])    
  43. {    
  44.     free(b);    
  45. }    
  46. int value(int a[],int i,int j)    
  47. {    
  48.     if (i>=j)    
  49.         return a[(i*(i+1))/2+j];    
  50.     else    
  51.         return a[(j*(j+1))/2+i];    
  52. }    
  53. void madd(int a[],int b[],int c[][N])    
  54. {    
  55.     int i,j;    
  56.     for (i=0; i<N; i++)    
  57.         for (j=0; j<N; j++)    
  58.             c[i][j]=value(a,i,j)+value(b,i,j);    
  59. }    
  60. void mult(int a[],int b[],int c[][N])    
  61. {    
  62.     int i,j,k,s;    
  63.     for (i=0; i<N; i++)    
  64.         for (j=0; j<N; j++)    
  65.         {    
  66.             s=0;    
  67.             for (k=0; k<N; k++)    
  68.                 s=s+value(a,i,k)*value(b,k,j);    
  69.             c[i][j]=s;    
  70.         }    
  71. }    
  72. void disp1(int a[])    
  73. {    
  74.     int i,j;    
  75.     for (i=0; i<N; i++)    
  76.     {    
  77.         for (j=0; j<N; j++)    
  78.             printf("%4d",value(a,i,j));    
  79.         printf("\n");    
  80.     }    
  81. }    
  82. void disp2(int c[][N])    
  83. {    
  84.     int i,j;    
  85.     for (i=0; i<N; i++)    
  86.     {    
  87.         for (j=0; j<N; j++)    
  88.             printf("%4d",c[i][j]);    
  89.         printf("\n");    
  90.     }    
  91. }    
  92. int main()    
  93. {    
  94.     int *b1;  //指向整型的指针,待初始化    
  95.     int i, j;    
  96.     int v;    
  97.     Init(b1);    
  98.     printf("请输入对称矩阵(只需要输入下三角部分即可)\n");    
  99.     for(i=0;i<N;i++)    
  100.     {    
  101.         printf("输入第%d行的%d个数据元素: ", i+1, i+1);    
  102.         for(j=0; j<=i; j++)    
  103.         {    
  104.             scanf("%d", &v);    
  105.             Assign(b1, v, i, j);    
  106.         }    
  107.     }    
  108.     Disp(b1);    
  109.     Destroy(b1);    
  110.     int a[M]= {1,2,3,4,5,6,7,8,9,10};  //a表示压缩存储的对称矩阵    
  111.     int b[M]= {1,1,1,1,1,1,1,1,1,1};    
  112.     int c1[N][N],c2[N][N];    
  113.     madd(a,b,c1);    
  114.     mult(a,b,c2);    
  115.     printf("a矩阵:\n");    
  116.     disp1(a);    
  117.     printf("b矩阵:\n");    
  118.     disp1(b);    
  119.     printf("a+b:\n");    
  120.     disp2(c1);    
  121.     printf("a×b:\n");    
  122.     disp2(c2);    
  123.     printf("\n");    
  124.     return 0;    
  125. }    

阅读全文
0 0