elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  suma matrices
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: suma matrices  (Leído 4,457 veces)
ALONSOQ

Desconectado Desconectado

Mensajes: 62



Ver Perfil
suma matrices
« en: 18 Agosto 2012, 11:07 am »

Hola,
 como se suman estas dos matrices?

Código
  1. #include <stdlib.h>
  2. #include<stdio.h>
  3. #include <time.h>
  4. #include<conio.h>
  5.  
  6. int n,d, i, j;
  7.  
  8. void  generar_matriz1 ();
  9. void generar_matriz2 ();
  10.  
  11.  
  12. int   main()
  13. {
  14.  
  15.    srand (time(NULL));
  16.  
  17.       printf("dimensi\xA2n de la matriz1:");
  18.    scanf("%d",&n);
  19.  
  20.       int matriz1[n][n];
  21.  
  22.        generar_matriz1 ();
  23.  
  24.        printf("dimensi\xA2n de la matriz2:");
  25.    scanf("%d",&n);
  26.  
  27.       int matriz2[n][n];
  28.  
  29.        generar_matriz2 ();
  30.  
  31.        printf ("Presione una tecla para salir.....");
  32.        getch();
  33.  
  34. }
  35. /*********************************************/
  36.  
  37. void generar_matriz1 ()
  38. {
  39.  
  40.    int matriz1[d][d];
  41.  
  42.    for (i=0;i<n;i++)
  43.        {
  44.            for (j=0;j<n;j++)
  45.                {
  46.                    matriz1[i][j]=(rand()%16);
  47.                    printf("%d\t",matriz1[i][j]);
  48.                }
  49.            printf("\n\n");
  50.        }
  51. }
  52.  
  53. void generar_matriz2 ()
  54. {
  55.  
  56.    int matriz2[d][d];
  57.  
  58.    for (i=0;i<n;i++)
  59.        {
  60.            for (j=0;j<n;j++)
  61.                {
  62.                    matriz2[i][j]=(rand()%16);
  63.                    printf("%d\t",matriz2[i][j]);
  64.                }
  65.            printf("\n\n");
  66.        }
  67. }

muchas gracias pr vuestra ayuda


En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: suma matrices
« Respuesta #1 en: 18 Agosto 2012, 20:58 pm »

para sumar 2 matrices deben tener la misma dimension. luego en tu codigo usas la libreria conio.h, algo que no se recomienda por el foro mas que nada porque no es una libreria estandar (diria, yo no uso windows y la verdad no lo se seguro, pero diria que es eso). ademas, creo que la usas para la funcion getch(), y es que tienes una equivalente en la libreria estandar stdio.h que es getchar(). luego yo no estoy muy a favor de usar variables globales, y menos para contadores y demas. si es imprescindible pues si... pero en este caso no lo veo asi. ademas, tus 2 funciones de generar matrices son exactamente la misma, solo cambia el nombre de la variable. por que no haces una solo un poco mas generica y la aplicas a las variables que quieras?

para acabar, no sabia que se podia pedir la dimension de un arreglo y luego declarar la variable estaticamente en medio del codigo. si alguien experto puede aclararme esta duda se lo agradeceria, ya que yo en estos casos suelo usar memoria dinamica.

te dejo el codigo probado:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int** GenerarMatriz(int n); //funcion que devuelve un apuntador a un array de apuntadores
  6. void SumarMatrices(int** m1, int** m2, const int n); //funcion que toma como parametros un apuntador a un array de apunt.
  7.  
  8. int main() {
  9.  
  10. int **matriz1=NULL, **matriz2=NULL, n; //se inicializan los apuntadores a apuntadores con NULL para evitar posibles problemas
  11. srand(time(NULL));
  12.  
  13. printf("Dimension de las matrices: ");
  14. scanf("%d", &n);
  15. printf("\n");
  16. while (getchar() != '\n'); //limpiamos el bufer stdin de basura, es buen habito ponerlo despues del scanf
  17.  
  18. matriz1=GenerarMatriz(n); //primera matriz
  19. matriz2=GenerarMatriz(n); //segunda matriz
  20. SumarMatrices(matriz1, matriz2, n);
  21.  
  22. free(matriz1); //siempre que se reserva memoria hay que liberarla al final
  23. free(matriz2);
  24. printf("Pulse enter para salir...");
  25. return 0;
  26. }
  27.  
  28. int** GenerarMatriz(const int n) {
  29.  
  30. int** matriz=NULL, i, j;
  31.  
  32. //se reserva memoria
  33. matriz=(int**)malloc(n*sizeof(int*)); //reservamos memoria para el array de apuntadores (seran las filas abc en el caso del ejemplo de abajo)
  34. for (i=0; i<n; i++)
  35. *(matriz+i)=(int*)malloc(n*sizeof(int)); //para cada apuntador en el array, le asignamos memoria (los vectores 123, 456, 789, o columnas de la matriz)
  36.  
  37. //aqui rellenamos cada elemento con un numero aleatorio
  38. for (i=0; i<n; i++) {
  39. for (j=0; j<n; j++) {
  40. *(*(matriz+i)+j)=rand()%16;
  41. printf("%d\t", *(*(matriz+i)+j));
  42. }
  43. printf("\n");
  44. }
  45. printf("\n");
  46. return matriz; //con esto hacemos que matriz1 (variable del main y primera matriz) apunte al mismo sitio que "matriz", la creada en esta funcion
  47. }
  48.  
  49. void SumarMatrices(int** m1, int** m2, const int n) {
  50.  
  51. int i, j;
  52.  
  53. for (i=0; i<n; i++) {
  54. for (j=0; j<n; j++) {
  55. printf("%d\t", (*(*(m1+i)+j))+(*(*(m2+i)+j)));
  56. }
  57. printf("\n");
  58. }
  59. printf("\n");
  60. }
  61.  

un saludo!


« Última modificación: 21 Agosto 2012, 05:50 am por xiruko » En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: suma matrices
« Respuesta #2 en: 18 Agosto 2012, 23:37 pm »

Yo estoy casi seguro de que no se puede declarar un arreglo con tamaño variable, hay que usar una expresion constant, para eso debes usar memoria dinamica.

Saludos.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: suma matrices
« Respuesta #3 en: 19 Agosto 2012, 01:28 am »

ya y yo tambien creia eso, pero cogi su codigo y lo copie, compile solo cambiando un par de cosas por no estar en windows, y corria perfectamente, de ahi que dude. sabes por que funciona aunque recomienden no hacerlo?

gracias y un saludo!
En línea

ALONSOQ

Desconectado Desconectado

Mensajes: 62



Ver Perfil
Re: suma matrices
« Respuesta #4 en: 19 Agosto 2012, 22:52 pm »

Muchas gracias por tu ayuda xiruco. La verdad es que me cuesta muchísimo entender lo que has redactado. ¿ sería muy dificil sumar a partir de mi código?

gracias de nuevo
En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: suma matrices
« Respuesta #5 en: 19 Agosto 2012, 23:24 pm »

a ver... para sumar 2 matrices tienen que tener la misma dimension. asi que en tu codigo, con pedir 1 vez la dimension es suficiente. y luego, el trozo de codigo para sumar no es mas que recorrer la matriz igual que lo haces para inicializarla con rand(), pero en vez de eso pones un printf() que muestre matriz1[ i][j]+matriz2[ i][j].

todo el resto del codigo de antes es para solucionar varios errores que cometes en toda la otra parte de codigo, tambien para solucionar el desorden y estructurarlo un poco, y para que sea mas entendible al leerlo.

si ya has estudiado funciones y apuntadores, si quieres modifico mi mensaje anterior añadiendo explicaciones en el codigo para que asi puedas seguirlo y entenderlo; si no, no le hagas mucho caso ya que te sonara a chino y primero deberias leerte la teoria antes de dedicarte a la practica.

un saludo!
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: suma matrices
« Respuesta #6 en: 20 Agosto 2012, 03:48 am »

Yo estoy casi seguro de que no se puede declarar un arreglo con tamaño variable, hay que usar una expresion constant, para eso debes usar memoria dinamica.
En C una declaración como esta:
Código
  1. printf("dimensi\xA2n de la matriz1:");
  2. scanf("%d",&n);
  3.  
  4. int matriz1[n][n];
No es valida si se compila según el estándar C90, este requiere que el numero de elementos en un array se indique mediante una expresión constante.

Pero en los dos siguientes estándares de C (C99 y C11) si es posible, a esos arrays donde el numero de elementos se calcula en tiempo de ejecución se les conoce como "variable length arrays" o "VLAs".

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
ALONSOQ

Desconectado Desconectado

Mensajes: 62



Ver Perfil
Re: suma matrices
« Respuesta #7 en: 20 Agosto 2012, 09:38 am »

a ver... para sumar 2 matrices tienen que tener la misma dimension. asi que en tu codigo, con pedir 1 vez la dimension es suficiente. y luego, el trozo de codigo para sumar no es mas que recorrer la matriz igual que lo haces para inicializarla con rand(), pero en vez de eso pones un printf() que muestre matriz1[ i][j]+matriz2[ i][j].

todo el resto del codigo de antes es para solucionar varios errores que cometes en toda la otra parte de codigo, tambien para solucionar el desorden y estructurarlo un poco, y para que sea mas entendible al leerlo.

si ya has estudiado funciones y apuntadores, si quieres modifico mi mensaje anterior añadiendo explicaciones en el codigo para que asi puedas seguirlo y entenderlo; si no, no le hagas mucho caso ya que te sonara a chino y primero deberias leerte la teoria antes de dedicarte a la practica.

un saludo!

Hola Xiruco, sí me he estudiado las funciones y apuntadores, de hecho el problema es que no entiendo bien el tema de apuntadores y paso de argumentos por referencia a las matrices; si no te es mucha molestia, a lo mejor añadiendo las explicaciones al código me sirven de ayuda.

un saludo
En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: suma matrices
« Respuesta #8 en: 21 Agosto 2012, 05:41 am »

si no entiendes bien el tema apuntadores repasalos en este enlace que no es muy largo y esta bien explicado:

http://c.conclase.net/curso/?cap=012

en cuanto a las matrices, estas no son mas que un apuntador a un array de apuntadores a entero (en este caso).  en el code que te deje tendriamos esto:

                 i           j
matriz -> | a | -> | 1 | 2 | 3 |
               | b | -> | 4 | 5 | 6 |
               | c | -> | 7 | 8 | 9 |

donde los vectores 123, 456, 789 son un array de enteros, y representan las filas de la matriz. el vector abc es un array de apuntadores a enteros: "a" es un apuntador a entero (int*) y apunta a "1"; "b" es un apuntador a entero y apunta a "4"; etc. y luego "matriz" es un apuntador a un array de apuntadores (int**), y "matriz" apunta, como en toda cadena de cualquier cosa, al primer elemento "a".

entonces, si por ejemplo quieres acceder al numero 4, y cogemos los indices i,j del dibujo, seria: matriz[1][0] (recuerda que los arrays empiezan en la posicion 0), o lo que es lo mismo: *(*(matriz+1)+0). para el numero 8 seria matriz[2][1] o *(*(matriz+2)+1). etc.

si hasta aqui lo entiendes, entonces lo de pasar por referencia a una funcion como parametro no es mas que darle el apuntador de la matriz a la funcion, en este caso "matriz". asi luego dentro de la funcion podras acceder y modificar cualquier elemento de la matriz.

no se si me explique muy bien, ahora comentare un poco el code de antes y si tienes alguna duda en particular intentaremos resolverla.

un saludo!

edito:
Citar
No es valida si se compila según el estándar C90, este requiere que el numero de elementos en un array se indique mediante una expresión constante.

Pero en los dos siguientes estándares de C (C99 y C11) si es posible, a esos arrays donde el numero de elementos se calcula en tiempo de ejecución se les conoce como "variable length arrays" o "VLAs".
gracias por comentarlo, no tenia ni idea y ya me he puesto al dia leyendo sobre ello.
« Última modificación: 21 Agosto 2012, 05:56 am por xiruko » En línea

ALONSOQ

Desconectado Desconectado

Mensajes: 62



Ver Perfil
Re: suma matrices
« Respuesta #9 en: 21 Agosto 2012, 17:36 pm »

Muchísimas gracias de verdad por la explicación tan buena  y detallada que me has dado; realmente me ha servido de mucho.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
suma matrices
Programación C/C++
ALONSOQ 3 2,374 Último mensaje 21 Junio 2012, 17:20 pm
por ALONSOQ
suma de matrices
Programación C/C++
flony 3 3,303 Último mensaje 6 Diciembre 2012, 03:30 am
por jhousef_innovador
Problema en suma de matrices
Programación C/C++
NicolasPileci 4 1,724 Último mensaje 18 Octubre 2016, 22:19 pm
por NicolasPileci
ayuda en suma de matrices
Programación C/C++
daniel735 0 1,311 Último mensaje 6 Noviembre 2016, 18:39 pm
por daniel735
suma de dos matrices dinamicas con punteros
Programación C/C++
piyor6 2 5,339 Último mensaje 6 Mayo 2018, 17:27 pm
por piyor6
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines