求助!问题出在哪里?

xxpfei 2016-12-06 11:35:46
5.6 实现一个函数, 传入一个矩阵, 输出该矩阵乘以该矩阵转置的结果
输入:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
输出:
30 70 110 150
70 174 278 382
110 278 446 614
150 382 614 846
#include<stdio.h>
int n,m;
int main()
{
int i,j;
printf("请输入矩阵的行数n与列数m:");
scanf("%d%d",&n,&m);
int x[n][m];
printf("请输入整数矩阵");
for(i=0;i<=n-1;i++)
{for(j=0;j<=m-1;j++)
{scanf("%d",&x[i][j]);}
}
void y(int x[n][m]);
y(x);
return 0;
}
void y(int x[n][m])
{int i,j,k;
int z[n][n];
z[0][0]=0;
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{
for(k=0;k<=m-1;k++)
{z[i][j]=z[i][j]+x[i][k]*x[j][k];}
}
}
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{printf("%40d",z[i][j]);}
printf("\n");}
}
...全文
126 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36311818 2016-12-07
  • 打赏
  • 举报
回复
首先呢你的定义int 放在main函数里面,而且你要定义数组后再调用,数组不能是b[n],数组大小一定要是申明数组这个变量时就确定的。如果要根据输入的值来确定数组的维数的话,这就要用到动态内存分配了。建议你好好看看相关数组的教学视频,补一下基础吧
Mr_Zhouzl 2016-12-07
  • 打赏
  • 举报
回复
定义数组不能使用变量,比如用new开辟空间
自信男孩 2016-12-07
  • 打赏
  • 举报
回复

#include<stdio.h>
#include <string.h>

#define ROW     8
#define COL     4


void calculate_matrix(int (*arr)[COL]);
static void output_matrix(int *arr, int max, int col);

int main(int argc, const char *argv[])
{
    int i, j, cnt = 1;

    //printf("请输入矩阵的行数n与列数m:");
    //scanf("%d%d",&n,&m);
    int array[ROW][COL];

    //printf("请输入整数矩阵");
    for(i = 0; i <= ROW-1; i++) {
        for(j = 0; j <= COL-1; j++) {
            //scanf("%d",&array[i][j]);
            array[i][j] = cnt++;   /* initize the matrix. */
        }
    }
    printf("Initize the matrix: \n");
    output_matrix(&array[0][0], COL * ROW, COL);
    calculate_matrix(array);

    return 0;
}

/* Show the array data. */
static void output_matrix(int *arr, int max, int col)
{
    int i;

    for (i = 0; i < max; i++) {
        printf("%-8d", arr[i]);
        if ((i + 1) % col == 0)
            putchar(10);
    }
    putchar(10);
}
void calculate_matrix(int (*array)[COL])
{
    int i, j, k;
    int result[ROW][ROW];
    int matrix_trans[COL][ROW];


    /* matrix transpose */
    for (i = 0; i < ROW; i++) {
        for (j = 0; j < COL; j++) {
            matrix_trans[j][i] = array[i][j];
        }
    }
    printf("After matrix transpose: \n");
    output_matrix(&matrix_trans[0][0], COL * ROW, ROW);

    /* matrix multip */
    int res = 0;
    for (i = 0; i < ROW; i++) {
        for (j = 0; j < ROW; j++) {
            res = 0;
            for (k = 0; k < COL; k++) {
                res += array[i][k] * matrix_trans[k][j];
            }
            result[i][j] = res;
            //printf("result = %d\n", res);
        }
    }

    printf("Show the result: \n");
    output_matrix(&result[0][0], ROW * ROW, ROW);
}
这是我改你的代码,改动比较大些,你可以试一下;一下是我的一些小建议: 1) 对于数组长度建议多用宏,C语言里是不支持变长数组的, 所以建议你使用宏(当然也可以动态申请空间,可以规避变长数组); 2) 建议你的代码写简单一些, 对于矩阵转置和乘法,可以先做转置,再做乘法,并且分在两个函数里实现(我在一个函数里做的, 你可以再分一下)这样让读你代码的人更清晰你的每个步骤,也便于理解和查找你的问题; 3) 对于变量和函数名,最好能做到见名知义,对阅读你的代码会提高效率,同时对自己将来阅读自己的代码也是有好处的;代码写出来还是要让别人和将来的自己看的,不是只为了实现功能; 4) 若有多个功能,比如你需要做初始化矩阵,矩阵转置,最后矩阵相乘,输出结果;你可以分步输出验证每步是否有问题,这样对你验证最后结果是否正确有指导意义;建议你做一个输出查看函数; 最后,加油吧,在前进的道路上总有一些做的不好的地方,不过不要灰心,一点一点努力吧~
paschen 2016-12-07
  • 打赏
  • 举报
回复
没有这种形式的语法:void y(int x[n][m]),不能两个维数都是不确定的值 建议动态申请内存吧(代码我直接复制楼上大神的)

int **z;
        z = (int **)malloc(sizeof(int *)* n);
    for (i = 0; i < n; i++)
        z[i] = (int *)malloc(sizeof(int)* m);
小灸舞 版主 2016-12-07
  • 打赏
  • 举报
回复
y函数里int z[n][n];这种写法都是不对的。
可以写成用malloc来分配空间。(包含头文件stdlib.h)

int **z;
for (i = 0; i < n; i++)
z = (int **)malloc(sizeof(int *)* n);
for (i = 0; i < n; i++)
z[i] = (int *)malloc(sizeof(int)* n);

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧