C语言编程问题求解答

题目描述
矩阵int a[n][n],矩阵int b[n][n](1≤n≤20)。矩阵的大小和数据由用户输入。输出新的矩阵c=a*b,以及其中的最小值和最大值,输出格式:
c00 c01 c02 …… c0(n-2) c0(n-1)
c10 c11 c12 …… c1(n-2) c1(n-1)
c20 c21 c22 …… c2(n-2) c2(n-1)
…… …… …… …… …… ……
c(n-2)0 c(n-2)1 c(n-2)2 …… c(n-2)(n-2) c(n-2)(n-1)
c(n-1)0 c(n-1)1 c(n-1)2 …… c(n-1)(n-2) c(n-1)(n-1)
cmin cmax

矩阵乘法的计算方法 :
对于矩阵A[n][n]*B[n][n],
相乘的结果为矩阵C[n][n],且对于矩阵C中每一项都有
C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j] + ..... + A[i][n-1]*B[n-1][j]

关于输入
第一行为矩阵的大小,后面跟着输入两个矩阵
n
a00 a01 a02 …… a0(n-2) a0(n-1)
a10 a11 a12 …… a1(n-2) a1(n-1)
a20 a21 a22 …… a2(n-2) a2(n-1)
…… …… …… …… …… ……
a(n-2)0 a(n-2)1 a(n-2)2 …… a(n-2)(n-2) a(n-2)(n-1)
a(n-1)0 a(n-1)1 a(n-1)2 …… a(n-1)(n-2) a(n-1)(n-1)
b00 b01 b02 …… b0(n-2) b0(n-1)
b10 b11 b12 …… b1(n-2) b1(n-1)
b20 b21 b22 …… b2(n-2) b2(n-1)
…… …… …… …… …… ……
b(n-2)0 b(n-2)1 b(n-2)2 …… b(n-2)(n-2) b(n-2)(n-1)
b(n-1)0 b(n-1)1 b(n-1)2 …… b(n-1)(n-2) b(n-1)(n-1)

关于输出
矩阵c
c00 c01 c02 …… c0(n-2) c0(n-1)
c10 c11 c12 …… c1(n-2) c1(n-1)
c20 c21 c22 …… c2(n-2) c2(n-1)
…… …… …… …… …… ……
c(n-2)0 c(n-2)1 c(n-2)2 …… c(n-2)(n-2) c(n-2)(n-1)
c(n-1)0 c(n-1)1 c(n-1)2 …… c(n-1)(n-2) c(n-1)(n-1)
cmin cmax

例子输入
3
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
例子输出
30 36 42
66 81 96
102 126 150
30 150
提示信息
注意矩阵边界,以防计算时越界

请问有哪里需要解答的地方吗?

#include<stdio.h>
int main()
{
    int a[20][20],b[20][20],c[20][20]={0},i,j,k,min,max,n;
    scanf("%d",&n);
    for(i=0;i<=n-1;++i)
        for(j=0;j<=n-1;++j)
            scanf("%d",&a[i][j]);
    for(i=0;i<=n-1;++i)
        for(j=0;j<=n-1;++j)
            scanf("%d",&b[i][j]);
    for(i=0;i<=n-1;++i)
        for(j=0;j<=n-1;++j)
            for(k=0;k<=n-1;++k)
                c[i][j]+=a[i][k]*b[k][j];
    min=max=c[0][0];
    for(i=0;i<=n-1;++i)
        for(j=0;j<=n-1;++j)
        {
            if(min>c[i][j])
                min=c[i][j];
            if(max<c[i][j])
                max=c[i][j];
        }
    for(i=0;i<=n-1;++i)
    {
        for(j=0;j<=n-1;++j)
        {
            printf("%d",c[i][j]);
            if(j!=n-1)
                printf(" ");
        }
        printf("\n");
    }
    printf("%d %d",min,max);
    return 0;
}

#include <stdio.h>
#include <assert.h>
#include <limits.h>
#include <stdlib.h>

struct Matrix
{
    int num_rows;
    int num_cols;
    int *data;
};

struct Matrix *alloc_matrix(int m, int n)
{
    assert(m > 0 && n > 0);
    struct Matrix *matrix = (struct Matrix *)malloc(sizeof(struct Matrix));
    matrix->num_rows = m;
    matrix->num_cols = n;
    matrix->data = (int *)malloc(m * n * sizeof(int));
    return matrix;
}

void free_matrix(struct Matrix *matrix)
{
    free(matrix->data);
    free(matrix);
}

int get_value(const struct Matrix *matrix, int i, int j)
{
    return matrix->data[i * matrix->num_cols + j];
}

void set_value(struct Matrix *matrix, int i, int j, int value)
{
    matrix->data[i * matrix->num_cols + j] = value;
}

void multiply(const struct Matrix *A, const struct Matrix *B, struct Matrix *C)
{
    assert(A->num_cols == B->num_rows);
    assert(C->num_rows == A->num_rows);
    assert(C->num_cols == B->num_cols);
    for (int i = 0; i < C->num_rows; i++)
    {
        for (int j = 0; j < C->num_cols; j++)
        {
            int x = 0;
            for (int k = 0; k < B->num_rows; k++)
            {
                int a = get_value(A, i, k);
                int b = get_value(B, k, j);
                x += a * b;
            }
            set_value(C, i, j, x);
        }
    }
}

int get_max_value(const struct Matrix *matrix)
{
    int v = INT_MIN;
    int size = matrix->num_rows * matrix->num_cols;
    for (int i = 0; i < size; i++)
    {
        if (matrix->data[i] > v)
            v = matrix->data[i];
    }
    return v;
}

int get_min_value(const struct Matrix *matrix)
{
    int v = INT_MAX;
    int size = matrix->num_rows * matrix->num_cols;
    for (int i = 0; i < size; i++)
    {
        if (matrix->data[i] < v)
            v = matrix->data[i];
    }
    return v;
}

void read_matrix(struct Matrix *matrix)
{
    for (int i = 0; i < matrix->num_rows; i++)
    {
        for (int j = 0; j < matrix->num_cols; j++)
        {
            int x;
            scanf("%d", &x);
            set_value(matrix, i, j, x);
        }
    }
}

void write_matrix(const struct Matrix *matrix)
{
    for (int i = 0; i < matrix->num_rows; i++)
    {
        for (int j = 0; j < matrix->num_cols; j++)
        {
            printf("%d ", get_value(matrix, i, j));
        }
        printf("\n");
    }
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    if (n <= 0)
    {
        printf("invalid matrix size\n");
        return -1;
    }

    struct Matrix *a = alloc_matrix(n, n);
    struct Matrix *b = alloc_matrix(n, n);
    struct Matrix *c = alloc_matrix(n, n);

    read_matrix(a);
    read_matrix(b);
    multiply(a, b, c);
    write_matrix(c);
    printf("%d %d\n", get_min_value(c), get_max_value(c));

    free_matrix(a);
    free_matrix(b);
    free_matrix(c);

    return 0;
}