鱼C论坛

 找回密码
 立即注册
查看: 1496|回复: 2

[已解决]数组,scanf

[复制链接]
发表于 2022-3-4 21:17:35 | 显示全部楼层 |阅读模式
5鱼币
4-4矩阵积的转置
问题描述       
输入M×K矩阵A和K×N矩阵B各元素值,计算矩阵A和矩阵B相乘的结果,并将乘积矩阵进行转置。
矩阵的相乘:设A为m×p的矩阵,B为p×n的矩阵,那么称m×n的矩阵C为矩阵A与B的乘积,其中矩阵C中的第i行第j列元素可以表示为:
如下:A=B=C=AB=
矩阵的转置:是指把m×n矩阵A的行换成同序数的列得到一个n×m矩阵,此矩阵叫做A的转置矩阵,写作AT。
例如矩阵经过转置后成为

输入说明
第一行给出正整数M、K、N(0<M、N、K<50),为A矩阵和B矩阵的行数和列数。接下来给出矩阵的信息,A矩阵信息:随后M行,每行给出K个整数,其间以空格分隔;B矩阵信息:随后K行,每行给出N个整数,其间以空格分隔。

输出说明
输出矩阵(A*B)T的结果,矩阵元素之间用空格分隔,数组每行元素用换行分隔。


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

int main()
{
    int m,k,n;
    scanf("%d%d%d",&m,&k,&n);
    int a[m][k];
    int b[k][n];
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<k;j++)
        {
            scanf_s("%d",&a[i][j]);//输入数组a
        }
    }

    for(int i=0;i<k;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf_s("%d",&b[i][j]);//输入数组b
        }
    }
    int c[m][n];
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            c[i][j]=0;
            for(int s=0;s<k;s++)
            {
                c[i][j]+=a[i][k]*b[k][j];//矩阵相乘的赋值
            }
        }
    }
    for(int j=0;j<n;j++)
    {
        for(int i=0;i<m;i++)
        {
            printf("%d ",c[i][j]);//输出矩阵(转置后)
        }
        printf("\n");
    }
    return 0;
}


请问为什么我b数组输入后无法正常赋值呢
最佳答案
2022-3-4 21:17:36
34 行有问题
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int m,k,n;
    scanf("%d %d %d",&m,&k,&n);
    int a[m][k];
    int b[k][n];
    printf("请输入数组A\n") ; 
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<k;j++)
        {
            scanf("%d",&a[i][j]);//输入数组a
        }
    }
        printf("请输入数组B\n") ;
    for(int i=0;i<k;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%d",&b[i][j]);//输入数组b
        }
    }
    int c[m][n];
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            c[i][j]=0;
            for(int s=0;s<k;s++)
            {
                c[i][j]+=a[i][s]*b[s][j];//矩阵相乘的赋值   ||||| 用k越界了 
            }
        }
    }
    printf("打印转置矩阵\n") ;
    for(int j=0;j<n;j++)
    {
        for(int i=0;i<m;i++)
        {
            printf("%d ",c[i][j]);//输出矩阵(转置后)
        }
        printf("\n");
    }
    return 0;
}

2 2 2
请输入数组A
1 2
3 4
请输入数组B
5 6
7 8
打印转置矩阵
19 43
22 50

最佳答案

查看完整内容

34 行有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-4 21:17:36 | 显示全部楼层    本楼为最佳答案   
34 行有问题
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int m,k,n;
    scanf("%d %d %d",&m,&k,&n);
    int a[m][k];
    int b[k][n];
    printf("请输入数组A\n") ; 
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<k;j++)
        {
            scanf("%d",&a[i][j]);//输入数组a
        }
    }
        printf("请输入数组B\n") ;
    for(int i=0;i<k;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%d",&b[i][j]);//输入数组b
        }
    }
    int c[m][n];
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            c[i][j]=0;
            for(int s=0;s<k;s++)
            {
                c[i][j]+=a[i][s]*b[s][j];//矩阵相乘的赋值   ||||| 用k越界了 
            }
        }
    }
    printf("打印转置矩阵\n") ;
    for(int j=0;j<n;j++)
    {
        for(int i=0;i<m;i++)
        {
            printf("%d ",c[i][j]);//输出矩阵(转置后)
        }
        printf("\n");
    }
    return 0;
}

2 2 2
请输入数组A
1 2
3 4
请输入数组B
5 6
7 8
打印转置矩阵
19 43
22 50
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-5 15:07:57 | 显示全部楼层

没注意,还以为是scanf的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 08:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表