计算c中两个矩阵之和时出错

时间:2016-07-28 07:37:07

标签: c

所以我是C的新手并试图编写一个程序来添加两个矩阵

计划1

#include <stdio.h>
int main(){
int m,n,o,p,i,j;
int mat1[m][n];
int mat2[m][n];
int result[m][n];
printf("enter the number of rows and columns for matrix ");
scanf("%i%i",&m,&n);
printf("enter elements of matrix one :");
for(i=0;i<m;i++){
    for(j=0;j<n;j++){
        scanf("%i",&mat1[i][j]);
    }
}
printf("enter the elements of matrix two:");
for(i=0;i<m;i++){
    for(j=0;j<n;j++){
        scanf("%i",&mat2[i][j]);
    }
}
for(i=0;i<m;i++){
    for(j=0;j<n;j++){
        result[i][j]=mat1[i][j]+mat2[i][j];
    }
}

printf("the sum of the matrices are");
for(i=0;i<m;i++){
    for(j=0;j<n;j++){
        printf("%i",result[i][j]);
    }
}
return 0;

}

这没有产生错误

方法二

当我使用函数在矩阵中输入两个值时,它产生了以下错误

25  24  C:\Users\Hp\my-programs\matrix-entry-function.cpp   [Error] invalid types 'int[int]' for array subscript
25  35  C:\Users\Hp\my-programs\matrix-entry-function.cpp   [Error] invalid types 'int[int]' for array subscript

代码:

#include <stdio.h>

int mat_entry(int m,int n)
{
    printf("enter the rows and columns of matrix ");
    scanf("%i%i",&m,&n);
    int mat[m][n];
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("\nenter the %i'th element %i'th row :",j+1,i+1);
            scanf("%i",&mat[i][j]);
        }
    }
}

int main()
{
    int a,b,c,d,e,f,m,n;
    int res[m][n];
    int mat1=mat_entry(a,b);
    int mat2=mat_entry(c,d);

    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            res[i][j]=(mat1[i][j]+mat2[i][j]);
        }
    }
}

4 个答案:

答案 0 :(得分:3)

你的程序1 发生不会产生错误。你运气不好您通过使用具有自动存储持续时间的未初始化变量中的值来调用未定义行为,这些变量是不确定的。在阅读mat1mat2之后,您必须声明resultmn

int main(){
int m,n,o,p,i,j;
printf("enter the number of rows and columns for matrix ");
scanf("%i%i",&m,&n);
/* move these declaretions after reading number of rows and columns */
int mat1[m][n];
int mat2[m][n];
int result[m][n];
printf("enter elements of matrix one :");

您的程序2通过使用没有return语句的函数的返回值来调用未定义的行为。同样使用[]运算符和两个类型为int的操作数是错误的。 E1[E2]等同于(*((E1)+(E2)))N1570 6.5.2.1数组下标,第2段),因此它的一个操作数必须是一个指针(包括一个从数组转换而来)。

要将矩阵作为函数的返回值返回,请考虑使用结构并为元素分配内存。

答案 1 :(得分:0)

您已使用

int mat1=mat_entry(a,b);
int mat2=mat_entry(c,d);

而不是将参数从一个函数发送到另一个函数,这只有在您使用的变量是指针时才有效,这里您必须使用mat1mat2作为指针,或者您必须使用它们整数矩阵。

答案 2 :(得分:0)

你的朋友没有做错事。 您甚至没有使用动态内存分配,但仍尝试使用尚未定义的值声明矩阵。尝试运行代码,即使您的第一个代码也不会运行。 我已经为您纠正了您的代码:

#include <stdio.h>
int main(){
int m,n;
printf("enter the number of rows and columns for matrix ");
scanf("%i%i",&m,&n);
int mat1[m][n];
int mat2[m][n];
int result [m][n];
 int i,j;

printf("enter elements of matrix one :");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
    scanf("%d",&mat1[i][j]);
 }
  }
  printf("enter the elements of matrix two:");
 for(i=0;i<m;i++){
 for(j=0;j<n;j++){
    scanf("%d",&mat2[i][j]);
 }
 }
for(i=0;i<m;i++){
for(j=0;j<n;j++){
    result[i][j]=mat1[i][j]+mat2[i][j];
  }   
    }   
printf("the sum of the matrices are");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
    printf("%d",result[i][j]);
 }
  }
   return 0;

 }

我认为将此功能放入函数中并不困难。试一试

答案 3 :(得分:0)

除非您使用动态分配(在此阶段您可能不想要),否则无法编写使用用户提供的维度制作矩阵的函数。

幸运的是,你不需要那个!由于您只需要添加矩阵,因此它们应具有相同的尺寸,并且您只需要询问用户一次尺寸是什么。之后,填写两个矩阵,然后执行&#34;添加&#34;一部分。

那是:

int main()
{
    int a,b,c,d,e,f,m,n;
    printf("enter the rows and columns of matrix ");
    scanf("%i%i",&m,&n);
    int res[m][n];
    int mat1[m][n];
    int mat2[m][n];

    mat_entry(m, n, mat1); // fill matrix 1
    mat_entry(m, n, mat2); // fill matrix 2

    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            res[i][j]=(mat1[i][j]+mat2[i][j]);
        }
    }
}

函数mat_entry没有返回值(即void),但它接收矩阵以通过指针填充(细节有点复杂,但语法很简单):

void mat_entry(int m,int n, int mat[m][n])
{
    ...
}

里面的代码与您的建议相同,减去维度要求:

    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("\nenter the %i'th element %i'th row :",j+1,i+1);
            scanf("%i",&mat[i][j]);
        }
    }