Matrices con punteros en C

Iniciado por S10RIN, Noviembre 27, 2013, 08:46:05 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Noviembre 27, 2013, 08:46:05 PM Ultima modificación: Febrero 27, 2016, 09:59:47 AM por Gabriela
Hola muy buenas acaba de surgirme una duda en C

Tengo esta funcion hecha con punteros hecha en C y el problema es que al invocarla

Código: c
printf("%d",SumarMatrices(mat1,mat2,dim1,dim2))


solo muestra el primer resultado de la operacion y no el resto(PD: con char me funciona porque imprimo toda la cadena con %s)

Código: c
int SumarMatrices(int *mat1, int *mat2,int dim1[],int dim2[]){
   
int *matriz_suma;
int i,j;

matriz_suma=(int*)malloc(dim1[0]*dim2[0]*sizeof(int));
for(i=0;i<dim1[0];i++){
for(j=0;j<dim2[0];j++){

                   *(matriz_suma+i*dim2[i]+j)=+*(mat2+i*dim2[i]+j)+*(mat2+i*dim2[i]+j);                        //calculo de cada elemento
                   

}
}
return matriz_suma;
}

Podes poner todo el código entero así lo copio y pruebo?

Noviembre 27, 2013, 09:28:18 PM #2 Ultima modificación: Febrero 08, 2014, 04:36:23 PM por Expermicid
Código: c
#include <stdio.h>
#include <stdlib.h>

/*
*
*/

int SumarMatrices(int *mat1, int *mat2,int dim1[],int dim2[]){
   
int *matriz_suma;
int i,j;

matriz_suma=(int*)malloc(dim1[0]*dim2[0]*sizeof(int));
for(i=0;i<dim1[0];i++){
for(j=0;j<dim2[0];j++){

                   *(matriz_suma+i*dim2[i]+j)=*(mat2+i*dim2[0]+j)+*(mat2+i*dim2[0]+j);
                   //printf("mat[%d][%d]=%d\n",i,j,*(matriz_suma+i*dim2[i]+j));

}
}
return *matriz_suma;
}



int main(int argc, char** argv) {

    int i,j,numero;
    int *mat1,*mat2;
    int dim1[2],dim2[2];
   
    FILE*datos;
    datos=fopen("datos.dat","r+");
   

    fscanf(datos,"%d",&dim1[0]);
    fscanf(datos,"%d",&dim2[0]);
    mat1=(int*)malloc(dim1[0]*dim2[0]*sizeof(int));
   
    for(i=0;i<dim1[0];i++){
    for(j=0;j<dim2[0];j++){
    fscanf(datos,"%d",&numero);
    *(mat1+i*dim2[0]+j)=numero;
    }
    }
    fscanf(datos,"%d",&dim1[1]);
        fscanf(datos,"%d",&dim2[1]);
    mat2=(int*)malloc(dim1[1]*dim2[1]*sizeof(int));
   
    for(i=0;i<dim1[1];i++){
    for(j=0;j<dim2[1];j++){
    fscanf(datos,"%d",&numero);
    *(mat2+i*dim2[1]+j)=numero;
    }
    }
   

    fclose(datos);
   
   
   
     MultiplicarMatrices(mat1,mat2,dim1,dim2);   
   
         
   
   
    return (EXIT_SUCCESS);
}






PD: Los datos de archivos.dat tienes que poner las dimensiones en una fila y los datos en otra y separados por espacios
Ej para dos matrices 1x3 y 3x2 seria

1 3
6 4 8
3 2
2 5 3 4 0 2

seria como multiplicar

( 6 4 8 )*( 2 5 )
              ( 3 4 )
              ( 0 2 )


Muchas gracias si funciona avisame

Noviembre 28, 2013, 12:45:53 AM #3 Ultima modificación: Febrero 08, 2014, 04:36:46 PM por Expermicid
Mañana voy a revisar el código, lo que si en ese .dat que pusiste no vas a poder sumar las matrices

CitarLos datos de archivos.dat tienes que poner las dimensiones en una fila y los datos en otra y separados por espacios
Ej para dos matrices 1x3 y 3x2 seria

1 3
6 4 8
3 2
2 5 3 4 0 2

Esa matriz solo se puede multiplicar, para que se puedan sumar ambas matrices tienen que ser iguales, mañana pruebo el código que pusiste y te aviso, lo que si antes de sumar la matriz vas a tener que verificar que sean iguales, o sea

Código: C

int SumarMatrices (int *matR, int *mat1, int *mat2, mat1x, mat1y, mat2x, mat2y)
{
   if (mat1x== mat2x) && (mat1y==mat2y)
      {     
        for (int x=0; x<=mat1x; x++)
        {
           for (int y=0; y<=mat1y; y++)
           matR[x][y] = mat1[x][y] + mat2[x][y]; //Aca modifica para la suma con punteros, no me acuerdo si poniendo el * solo era suficiente
        }
       return 0;
      }

return 1;
}



Te dejo esto tambien que encontra por ahi, tal vez te sirva

Código: C


#include <iostream>

using namespace std;

int suma(int,int);
int **CrearMatriz(int,int);
int **LlenarMatriz(int,int);
int **Suma(int**,int**,int,int);

int main()
{
cout<<"Suma de Matrices con punteros"<<endl<<endl;
int filas,colum;
cout<<"Introduzca el numero de filas: ";
cin>>filas;
cout<<"Introduzca el numero de columnas: ";
cin>>colum;

int **matriz1 = CrearMatriz(filas,colum);
int **matriz2 = CrearMatriz(filas,colum);
int **final = CrearMatriz(filas,colum);
cout<<"\nMatriz1\n";
matriz1 = LlenarMatriz(filas,colum);
cout<<"\nMatriz2\n";
matriz2 = LlenarMatriz(filas,colum);

final = Suma(matriz1, matriz2, filas, colum);

cout<<"\nLa suma es:\n";

for(int i=0;i<filas;i++)
{
for(int j=0;j<colum;j++)
{
cout<<final[i][j];
if(j < colum-1)
cout<<", ";
}
cout<<endl;
}
return 0;
}

int **CrearMatriz(int f, int c)
{
int **matriz = new int*[f];
for (int i = 0; i < f; ++i)
matriz[i] = new int[c];
return matriz;
}

int **LlenarMatriz(int f, int c)
{
int **matriz = CrearMatriz(f,c);
for(int i=0;i<f;i++)
{
for(int j=0;j<c;j++)
{
cout<<"Elemento "<<i+1<<","<<j+1<<": ";
cin>>matriz[i][j];
}
}
return matriz;
}

int **Suma(int **m1,int **m2,int f, int c)
{
int **matriz = CrearMatriz(f,c);
for(int i=0;i<f;i++)
for(int j=0;j<c;j++)
matriz[i][j] = m1[i][j]+m2[i][j];
return matriz;
}