savagehjsc 2021-06-16 18:18 采纳率: 0%
浏览 32

数据结构xxxxxxx

方阵。下图中,C 是一个方阵,A 是一个下三角矩阵,B 是一个上三角矩阵。
矩阵 C=A×B,上图中是计算三角矩阵乘法的公式。写一个 C 语言的程序,读 入一个正整数 n,5≤n≤20, 设为方阵的行数与列数。使用动态内存分配三角矩阵 A、B、和 C 不为 0 的内存空间,并分别为下三角矩阵 A 和上三角矩阵 B 随 机生成元素 ai,j (i≥j) 和 bi,j (i≤j);假设 -99≤ai,j, bi,j≤99。然后计算矩阵乘法 C=A ×B,并输出矩阵 A、B 和 C,不要打印矩阵 A 的上三角和矩阵 B 的下三角 值为 0 的元素。(提示:若列下标从为 0 至 n-1,下三角矩阵的第 i 列有 i+1 个 非 0 元素;上三角矩阵的第 i 列有 n-i 个非 0 元素,且向左移位 i 个位置

  • 写回答

1条回答 默认 最新

  • K_n_i_g_h_t_1990 2023-11-01 10:29
    关注
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    // 定义一个结构体,用来存储三角矩阵的信息
    typedef struct {
        int n; // 矩阵的行数和列数
        int *data; // 矩阵的非零元素数组
        int type; // 矩阵的类型,0表示下三角,1表示上三角
    } TriMatrix;
    
    // 创建一个三角矩阵,并随机生成元素
    TriMatrix *create_tri_matrix(int n, int type) {
        TriMatrix *matrix = (TriMatrix *)malloc(sizeof(TriMatrix)); // 分配结构体内存
        matrix->n = n;
        matrix->type = type;
        int size = n * (n + 1) / 2; // 计算非零元素的个数
        matrix->data = (int *)malloc(sizeof(int) * size); // 分配数组内存
        for (int i = 0; i < size; i++) {
            matrix->data[i] = rand() % 199 - 99; // 随机生成-99到99之间的整数
        }
        return matrix;
    }
    
    // 销毁一个三角矩阵,释放内存
    void destroy_tri_matrix(TriMatrix *matrix) {
        free(matrix->data); // 释放数组内存
        free(matrix); // 释放结构体内存
    }
    
    // 打印一个三角矩阵,不打印值为0的元素
    void print_tri_matrix(TriMatrix *matrix) {
        int n = matrix->n;
        int type = matrix->type;
        int index = 0; // 数组下标
        for (int i = 0; i < n; i++) { // 遍历每一行
            for (int j = 0; j < n; j++) { // 遍历每一列
                if ((type == 0 && i >= j) || (type == 1 && i <= j)) { // 判断是否是非零元素所在位置
                    printf("%d\t", matrix->data[index]); // 打印非零元素
                    index++; // 更新数组下标
                } else {
                    printf("0\t"); // 打印0元素
                }
            }
            printf("\n"); // 换行
        }
    }
    
    // 计算两个三角矩阵的乘积,返回一个方阵
    TriMatrix *multiply_tri_matrix(TriMatrix *A, TriMatrix *B) {
        if (A->n != B->n || A->type != 0 || B->type != 1) { // 判断是否满足乘法条件,即两个矩阵都是方阵,且A是下三角,B是上三角
            return NULL; // 不满足条件则返回空指针
        }
        int n = A->n;
        TriMatrix *C = create_tri_matrix(n, 1); // 创建一个上三角矩阵作为结果
        for (int i = 0; i < n; i++) { // 遍历每一行
            for (int j = i; j < n; j++) { // 遍历每一列,只计算上三角部分
                int sum = 0; // 累加器,用来计算C[i][j]的值
                for (int k = i; k <= j; k++) { // 遍历A的第i行和B的第j列的非零元素,按照公式计算乘积并累加
                    sum += A->data[i * (i + 1) / 2 + k] * B->data[k * (2 * n - k + 1) / 2 + j];
                }
                C->data[i * (2 * n - i + 1) / 2 + j] = sum; // 将累加器的值赋给C[i][j]
            }
        }
        return C;
    }
    
    int main() {
        srand(time(NULL)); // 设置随机数种子
        int n; // 矩阵的行数和列数
        printf("请输入一个正整数n,5<=n<=20,作为方阵的行数与列数:\n");
        scanf("%d", &n); // 输入n
        if (n < 5 || n > 20) { // 判断n是否在范围内
            printf("输入错误,程序结束。\n");
            return 0;
        }
        TriMatrix *A = create_tri_matrix(n, 0); // 创建一个下三角矩阵A
        TriMatrix *B = create_tri_matrix(n, 1); // 创建一个上三角矩阵B
        TriMatrix *C = multiply_tri_matrix(A, B); // 计算矩阵乘法C = A * B
        printf("矩阵A为:\n");
        print_tri_matrix(A); // 打印矩阵A
        printf("矩阵B为:\n");
        print_tri_matrix(B); // 打印矩阵B
        printf("矩阵C为:\n");
        print_tri_matrix(C); // 打印矩阵C
        destroy_tri_matrix(A); // 销毁矩阵A
        destroy_tri_matrix(B); // 销毁矩阵B
        destroy_tri_matrix(C); // 销毁矩阵C
        return 0;
    }
    
    
    评论 编辑记录

报告相同问题?

悬赏问题

  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数
  • ¥15 ADS时域 连续相位观察方法
  • ¥15 Opencv配置出错
  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused