Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Definir tamaño de una matriz

Estas en el tema de Definir tamaño de una matriz en el foro de C/C++ en Foros del Web. Hola, soy nuevo en este foro y este es mi primer mensaje, espero puedan ayudarme a ser mejor programador de modo que yo pueda ayudar ...
  #1 (permalink)  
Antiguo 13/06/2010, 09:47
Avatar de Mercality  
Fecha de Ingreso: junio-2010
Mensajes: 19
Antigüedad: 13 años, 10 meses
Puntos: 0
Definir tamaño de una matriz

Hola, soy nuevo en este foro y este es mi primer mensaje, espero puedan ayudarme a ser mejor programador de modo que yo pueda ayudar a los nuevos que ingresen.

Empezaré pidiendo una ayudita con algo referente a matrices.

Esta ha sido la primera matriz que he hecho gracias a lo que me han enseñado en la universidad(Estudio II Trimestre de informatica y estoy en programacion I).

Código C++:
Ver original
  1. [CODE]#include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #define f 4
  5. #define c 4
  6.  
  7. main () {
  8.      int i,j,k=1,a=0,b=0,d=0,e=0;
  9.      int mat[f][c];
  10.      
  11.      printf("Introduzca la edad de las 16 personas para clasificarlas en Adultos y Jovenes\n\n");
  12.        
  13.      for (i=0;i<f;i++)  {
  14.          
  15.          for (j=0;j<c;j++)  {
  16.              
  17.                  printf("Introduzca la edad de la persona numero %d\n",k);
  18.                  scanf ("%d", &mat[i][j]);
  19. system("cls");
  20.                if (k>=1){
  21.                k=k+1;
  22.                }  
  23.             if(mat[i][j] <= 13) {
  24.             a=a+1;
  25.             }    
  26.             if(mat[i][j] >= 14 && mat[i][j] <=18) {
  27.             b=b+1;
  28.             }    
  29.             if(mat[i][j] >=19 && mat[i][j] <=50) {
  30.             d=d+1;
  31.             }
  32.             if(mat[i][j] > 51) {
  33.             e=e+1;
  34.             }            
  35.          }
  36.      }
  37.        printf("Cantidad de niños: %d\n", a);
  38.        printf("Cantidad de jovenes: %d\n",b);
  39.        printf("Cantidad de Adultos: %d\n",d);
  40.        printf("Cantidad de viejos: %d\n",e);
  41.        getch();    
  42. }[/CODE]

Bueno, mi duda es la siguiente.

Quiero saber si existe una manera de hacer la matriz como decirlo.. Variable? Dinamica? Osea que yo al correr el programa, defina la matriz ya sea dando la cantidad de filas o columnas, o que al dar la cantidad de datos se calcule el tamaño de la matriz adecuado.

Agredezco su ayuda :)
  #2 (permalink)  
Antiguo 13/06/2010, 13:00
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Respuesta: Definir tamaño de una matriz

Bien, para hacer lo que tu deseas, necesitas tener bien aprendido el concepto de punteros, ya sea en C o en C++.

Primero veamos como creamos un vector dinámico.
Primero necesitamos crear un puntero de tipo entero.

Código C:
Ver original
  1. int *arreglo;
Despues declara la variable
y por lo que veo, estas programando en C, por lo tanto debes utilizar la función malloc, que regresa un puntero a la memoria de tamaño size o NULL si existe un error.
usamos el comando sizeof(int) para encontrar el valor de int (4 bytes) y lo multiplicamos por nuestro valor arbitrario.
Código C:
Ver original
  1. int valor_dinamico;
  2. printf("tamano vector: ");
  3. scanf("%d",&valor_dinamico);
  4. arreglo = (int *)malloc(valor_dinamico*sizeof(int))
  5. int i =0;
  6. for(i=0;i<=valor_dinamico;i++)
  7. {
  8.  printf("\nCaptura posicion %d del vector dinamico",i);
  9.  scanf("%d",&arreglo[i]);
  10. }
  11. printf("\nLiberar memoria....");
  12. free(array);
  13. printf("\nMemoria Liberada...");

Eso es para vectores dinamicos, para tener una matriz dinamica.. en realidad son vectores dinamicos apuntando a mas vectores dinamicas, ya que una matriz dinamica no existe como tal.
  #3 (permalink)  
Antiguo 13/06/2010, 14:20
Avatar de Mercality  
Fecha de Ingreso: junio-2010
Mensajes: 19
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Definir tamaño de una matriz

Me va quedando mas claro, pero podrías explicarme un poco mas esto? "función malloc, que regresa un puntero a la memoria de tamaño size o NULL si existe un error."

Aún no entiendo bien lo que significa "Regresar" tampoco eso de tamaño size.
  #4 (permalink)  
Antiguo 13/06/2010, 14:43
Avatar de Mercality  
Fecha de Ingreso: junio-2010
Mensajes: 19
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Definir tamaño de una matriz

He hecho lo que me dices, el programa compila. Pero me salta error de que "ha dejado de funcionar, buscando solucion al problema" Que sucede ahora?
Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <conio.h>
  4.  
  5. main() {
  6.        int f,c;
  7.        int *mat[f][c];
  8.        int i,j,k=1,a=0,b=0,d=0,e=0,valor_dinamico;
  9.        printf("Tamaño del vector");
  10.        scanf("%d",&valor_dinamico);
  11.        mat[f][c] = (int *)malloc(valor_dinamico*sizeof(int));
  12.        
  13.         printf("Introduzca la edad de las 16 personas para clasificarlas en niños, jovenes y adultos.\n\n");
  14.        
  15.      for (i=0;i<f;i++)  {
  16.          
  17.          for (j=0;j<c;j++)  {
  18.              
  19.                  printf("Introduzca la edad de la persona numero %d\n",k);
  20.                  scanf ("%d", &mat[i][j]);
  21. system("cls");
  22.                if (k>=1){
  23.                k=k+1;
  24.                }  
  25.             if((int)mat[i][j] <= 13) {
  26.             a=a+1;
  27.             }    
  28.             if((int)mat[i][j] >= 14 && (int)mat[i][j] <=18) {
  29.             b=b+1;
  30.             }    
  31.             if((int)mat[i][j] >=19 && (int)mat[i][j] <=50) {
  32.             d=d+1;
  33.             }
  34.             if((int)mat[i][j] > 51) {
  35.             e=e+1;
  36.             }            
  37.          }
  38.      }
  39.        printf("Cantidad de niños: %d\n", a);
  40.        printf("Cantidad de jovenes: %d\n",b);
  41.        printf("Cantidad de Adultos: %d\n",d);
  42.        printf("Cantidad de viejos: %d\n",e);
  43.        getch();    
  44. }
  #5 (permalink)  
Antiguo 13/06/2010, 15:03
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Respuesta: Definir tamaño de una matriz

Bueno la funcion malloc() en C, se utiliza para asignar un bloque de memoria a tu programa dinamicamente.
En otras palabras, la funcion malloc asigna bloques de bytes en la memoria de la computadora, si malloc tiene exito al asignar esos bloques de bytes en tu memoria, entonces malloc regresa, o establece un puntero a dichos bloques de memoria a tu programa, de lo contrario si falla al asignar esos bloques de memoria, malloc regresa un puntero NULL

En palabras aun mas simples.
Cuando tu creas un arreglo arbitrario (digamos int arreglo[10] ) , la computadora ya sabe que debe asignar un bloque de memoria de 4 bytes para dicho arreglo, ya que ese es el espacio estandar asignado a variables tipo int.

En cambio cuando asignas memoria dinamicamente, tu le debes decir a la computadora cuanto espacio debe asignar para tu arreglo. En este caso utilizamos:
sizeof(int) = 4 (bytes) multiplicado por la cantidad de espacios asignados dinamicamente a tu arreglo.
Tiene sentido lo que digo?

Ya has visto el tema de punteros? Sería muchisimo mas facil de entender si ya sabes de punteros.
  #6 (permalink)  
Antiguo 13/06/2010, 15:18
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Respuesta: Definir tamaño de una matriz

Para definir arrays de dos dimensiones, es en realidad un array de UNA dimension de punteros.

Digamos que tienes array dinamico de 6 posiciones
array_dinamico1:
|__|__|__|__|__|__|__|
0 1 2 3 4 5 6

Si queremos hacer una matriz dinámica, entonces cada elemento del array dinamico es a su vez otro array dinamico.
matriz_dinamica1:
|_0_|_0_|_0_|_0_|_0_|_0_|_0_| ...... |_i__|
|_1_|_1_|_1_|_1_|_1_|_1_|_1_| ...... |_i+1|
|_._|_._|_._|_._|_._|_._|_._|_._| ...... |_...._|
|_._|_._|_._|_._|_._|_._|_._|_._| ...... |_...._|
|_._|_._|_._|_._|_._|_._|_._|_._| ...... |_...._|
|_j_|_j_|_j_|_j_|_j_|_j_|_j_|_j_| ...... |_i+j_|


Espero que mi dibujo sea claro, porque me tarde haciendolo :P

Entonces para una matriz de i-filas y j-columnas, tenemos
Código C:
Ver original
  1. int **matriz;
  2.  
  3. int filas_dinamicas;
  4. int columnas_dinamicas;
  5.  
  6. matriz = (int**) malloc(filas_dinamicas*sizeof(int));
  7. int i =0;
  8. for(i=0;i<filas_dinamicas;i++)
  9. {
  10. matriz[i] = (int**)malloc(columnas_dinamicas*sizeof(int));
  11. }
para liberarlo es:
Código C:
Ver original
  1. for(i=0;i<filas_dinamicas;i++)
  2. {
  3. free (matriz[i]);
  4. }
  5. free(matriz);
Osea que primero liberamos las columnas ( o los vectores dinamicos que creamos despues) y despues liberamos al primer vector dinamico que creamos....


De verdad te recomiendo primero que te eches una leída al tema de puntero, es muchisimo mas claro ya cuando entiendes exactamente como se manejan los punteros

Y ahora solo a manera de nota, eso es código para C, cuando estas trabajando con C++ es muchisimo mas rápido y eficiente utilizar new y delete
  #7 (permalink)  
Antiguo 13/06/2010, 15:20
Avatar de Mercality  
Fecha de Ingreso: junio-2010
Mensajes: 19
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Definir tamaño de una matriz

Bueno, esta todo muy bien explicado, empezaré a hacer las modificaciones y ver un curso de punteros, cuando lo arregle lo pondré acá :D

Última edición por Mercality; 13/06/2010 a las 15:26
  #8 (permalink)  
Antiguo 13/06/2010, 15:31
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Respuesta: Definir tamaño de una matriz

Ah y bueno... me pareció algo obvio, pero aun asi lo voy a resultar en este espacio:

fila_dinamica y columna_dinamica, son variables tipo enteras no inicializadas.
En otras palabras, si compilas el codigo, sin pedir al usuario el tamaño de fila dinamica y columna dinamica, entonces te generara un error (tal vez no de compilación).
Solo asegurate de tener un valor para esas variables.
Por ejemplo:
Código C:
Ver original
  1. scanf("%d",&fila_dinamica);
  2. scanf("%d",&columna_dinamica);
  #9 (permalink)  
Antiguo 13/06/2010, 15:51
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Respuesta: Definir tamaño de una matriz

Mira te dejo el código para C++
Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.     int **matriz;
  6.     int fila_dinamica;
  7.     int columna_dinamica;
  8.    
  9.     cout<<"Capture dimension de matriz Filas Columnas";
  10.     cin>>fila_dinamica;
  11.     cin>>columna_dinamica;
  12.    
  13.     matriz = new int *[fila_dinamica];
  14.     for(int i = 0; i<=fila_dinamica; i++)
  15.     {
  16.       matriz[i] = new int[columna_dinamica];
  17.     }
  18.    
  19.     cout<<endl<<"Inicia captura de datos: "<<endl;
  20.     for(int i=0;i<=fila_dinamica-1;i++)
  21.     {
  22.             for(int j=0;j<=columna_dinamica-1;j++)
  23.             {
  24.                     cout<<"Capture valor de Matriz["<<i<<"]["<<j<<"]: ";
  25.                     cin>>matriz[i][j];
  26.             }
  27.     }
  28.    
  29.     cout<<"Liberando matriz de ["<<fila_dinamica<<"]["<<columna_dinamica<<"] posiciones....";
  30.      
  31.     for(int i = 0; i<=fila_dinamica-1; i++)
  32.     {
  33.       delete[] matriz[i];
  34.     }
  35.     delete[] matriz;
  36.    
  37.     cout<<endl<<"Array Liberado!";
  38.     cin.get();
  39.     return 0;
  40. }

Última edición por AlanChavez; 27/06/2010 a las 15:25
  #10 (permalink)  
Antiguo 14/06/2010, 19:19
Avatar de Mercality  
Fecha de Ingreso: junio-2010
Mensajes: 19
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Definir tamaño de una matriz

Hasta que por fin! Pude medio entender esto y hacer lo que quería! jaja!

Aquí esta el resultado que esperaba
Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. main() {
  4.        int f,c,g;
  5.        int **mat;
  6.  do {
  7.       int i,j,k=1,a=0,b=0,d=0,e=0;
  8.       printf("Especifique la cantidad de Filas:\n");
  9.       scanf("%d", &f);
  10.       printf("Especifique la cantidad de Columnas:\n");
  11.       scanf("%d", &c);
  12.      
  13.        mat = (int**) malloc(f*sizeof(int));
  14.        
  15.       for(i=0;i<f;i++)
  16.       {
  17.           mat[i] = (int*)malloc(c*sizeof(int));
  18. }
  19.        
  20.         printf("Introduzca la edad de las personas para clasificarlas en niños, jovenes y adultos.\n\n");
  21.        
  22.      for (i=0;i<f;i++)  {
  23.          
  24.          for (j=0;j<c;j++)  {
  25.              
  26.                  printf("Introduzca la edad de la persona numero %d\n",k);
  27.                  scanf ("%d", &mat[i][j]);
  28. system("cls");
  29.                if (k>=1){
  30.                k=k+1;
  31.                }  
  32.             if((int)mat[i][j] <= 13) {
  33.             a=a+1;
  34.             }    
  35.             if((int)mat[i][j] >= 14 && (int)mat[i][j] <=18) {
  36.             b=b+1;
  37.             }    
  38.             if((int)mat[i][j] >=19 && (int)mat[i][j] <=50) {
  39.             d=d+1;
  40.             }
  41.             if((int)mat[i][j] > 51) {
  42.             e=e+1;
  43.             }            
  44.          }
  45.      }
  46.        printf("Cantidad de niños: %d\n", a);
  47.        printf("Cantidad de jovenes: %d\n",b);
  48.        printf("Cantidad de Adultos: %d\n",d);
  49.        printf("Cantidad de viejos: %d\n",e);
  50.        printf("**********  Presione 1 para salir, Cualquier otra tecla para repetir. ***************");
  51.        scanf("%d", &g);
  52.        system("cls");
  53.        k=(k-k+1);
  54.        for(i=0;i<f;i++) {
  55. free (mat[i]);
  56. }
  57. free(mat);    
  58.           }
  59.           while(g!=1);
  60.           return 0;
  61. }

Algo que agregar?

También me parecen muchas lineas para algo que al ejecutarlo sea tan simple xd.

Bueno, se te agradece mucho AlanChavez (:
  #11 (permalink)  
Antiguo 14/06/2010, 19:32
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Respuesta: Definir tamaño de una matriz

:P
Por eso a veces se utiliza las librerias STL, para que andar re-inventando el hilo negro si ya hay una libería que lo hace todo por nosotros.
(JA! debi haberlo mencionado antes, pero asi no te hubieras hecho la pregunta de que es lo que esta pasando en la computadora)

todo se simplifica un poquito mas si utilizas
#include <vector>
Y utilizas los vectores con memoria dinamica que ya te ofrece, cambia solo un poquito la estructura del código, pero te invito a que te aventures a probar la STL solo cuando ya tengas algo de conocimiento de Programacion Orientada a Objetos :)
De nada y fue un placer ayudarte, me da gusto que hayas aprendido algo.

Etiquetas: definir, matriz, tamaño
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:05.