#include <stdio.h> #define X 3 #define Y 6 static int value(int a[], int i, int j) { if(i >= j) return a[(i * (i + 1)) / 2 + j]; //下三角 else return a[(j * (j + 1)) / 2 + i]; //上三角 } static void add(int a[], int b[], int c[][X]) { int i, j; for(i = 0; i < X; i++) { for(j = 0; j < X; j++) { c[i][j] = value(a, i, j) + value(b, i, j); } } } static void mul(int a[], int b[], int c[][X]) { int i, j, k, sum; for(i = 0; i < X; i++) { for(j = 0; j < X; j++) { sum = 0; for(k = 0; k < X; k++) { sum = sum + value(a, i, k) * value(b, k, j); } c[i][j] = sum; } } } static void dis1(int a[]) { int i, j; for(i = 0; i < X; i++) { for(j = 0; j < X; j++) { printf("%4d", value(a, i, j)); } printf("\n"); } } static void dis2(int c[][X]) { int i, j; for(i = 0; i < X; i++) { for(j = 0; j < X; j++) { printf("%4d", c[i][j]); } printf("\n"); } } int main(int argc, char *argv[]) { int a[Y] = {1, 2, 3, 4, 5, 6}; int b[Y] = {1, 1, 1, 1, 1, 1}; int c1[X][X], c2[X][X]; printf("A矩阵:\n"); dis1(a); printf("B矩阵:\n"); dis1(b); add(a, b, c1); printf("A+B:\n"); dis2(c1); mul(a, b, c2); printf("A*B:\n"); dis2(c2); int c[Y],d[Y],ad[X][X],s[X][X]; printf("请输入C矩阵(例如A矩阵输入时应为1 2 3 4 5 6):\n"); for(int i=0; i<Y; i++) scanf("%d",c+i); printf("C矩阵:\n"); dis1(c); for(int i=0; i<Y; i++) scanf("%d",d+i); printf("D矩阵:\n"); dis1(d); add(c, d, ad); printf("C+D:\n"); dis2(ad); mul(c, d, s); printf("C*D:\n"); dis2(s); return 0; }
实验要求
1.1实验目的
掌握对称矩阵的压缩储存方法及相关算法设计
1.2实验内容
已知A和B为两个n*n阶的对称矩阵,在输入时,对称矩阵只输入下三角形元素,存入一维数组,如图6.15所示(对称矩阵M存储在一维数组A中),设计一个程序exp6-5.cpp实现以下功能。
(1) 求对称矩阵A和B的和。
(2) 求对称矩阵A和B的乘积。
要求:描述其逻辑结构+算法;存储结构+算法;介绍每个函数的设计思想,函数调用将的关系及其接口参数的意义。算法代码、算法运行结果。