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

[SOLUCIONADO] Arreglos, vectores y matrices

Estas en el tema de Arreglos, vectores y matrices en el foro de C/C++ en Foros del Web. Hola todos, tengo una duda, tengo dos formas de crear un vector de "n" elementos, segun tenia entendido c++ no permitia crear un vector de ...
  #1 (permalink)  
Antiguo 29/04/2014, 15:12
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 8 meses
Puntos: 0
Arreglos, vectores y matrices

Hola todos, tengo una duda, tengo dos formas de crear un vector de "n" elementos, segun tenia entendido c++ no permitia crear un vector de esta forma :
Código C++:
Ver original
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. using namespace std;
  5.  
  6. int main() {
  7. int a,n=0;
  8. cin>>a;
  9. int vec[a];
  10. for(int i=0;i<a;i++){
  11.     vec[i]=n;
  12.     n++;
  13. }
  14. for(int i=0;i<a;i++){
  15.     cout<<vec[i];
  16.     cout.width(5);
  17. }
  18. }

Y que solo se podian hacer asi:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. using namespace std;
  5.  
  6. int main() {
  7. int a=0,n,*p;
  8. cin>>n;
  9. p=new int[n];
  10.  
  11. for(int i=0;i<n;i++){
  12.     p[i]=a;
  13.     a++;
  14. }
  15. for(int i=0;i<a;i++){
  16.     cout<<p[i];
  17.     cout.width(5);
  18. }
  19. }

De igual modo con las matrices, Agradeceria su ayuda.
  #2 (permalink)  
Antiguo 30/04/2014, 02:43
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Arreglos, vectores y matrices

¿Y cual es la duda que tienes?
¿Si tienes que usar la dinámica con las matrices?
Con las matrices bidimencionales la forma es hacer como una especie de tabla de tablas
Se usa puntero que apunta a puntero.Primero se crea el puntero que apunta otro puntero que sera las fila, eso permite guardar otro puntero que sera la columna y por eso debe ser un puntero a puntero. Se usa igual que una matriz bidimensional normal, accediendo de esta forma tabla[10][7] = unvalor;
El ejemplo y la explicación la tienes aquí: http://c.conclase.net/curso/?cap=017#inicio

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5.     int ** tabla;//"tabla" es un puntero que apunta a un objeto de tipo puntero a int."puntero a puntero"
  6.     int n = 134;
  7.     int m = 231;
  8.     int i;
  9.    
  10.     // Sabemos que un puntero se comporta casi igual que un array, por lo tanto nada nos impide que
  11.     // "tabla" apunte al primer elemento de un array de punteros:
  12.     tabla = new int * [n];
  13.    
  14.     // Ahora estamos en un caso similar, "tabla" apunta a un array de punteros a int,
  15.     // cada elemento de este array puede ser a su vez un puntero al primer elemento de otro array:
  16.     // n arrays de m ints
  17.     for ( i = 0; i < n; i++ ) {
  18.         tabla[i] = new int[m];
  19.     }
  20.  
  21.     // Ahora tabla apunta a un array de dos dimensiones de n * m, podemos acceder a cada elemento
  22.     // igual que accedemos a los elementos de los arrays normales: 
  23.     tabla[21][33] = 123;
  24.     cout << tabla[21][33] << endl;
  25.    
  26.     // Otra diferencia con los arrays normales es que antes de abandonar el programa hay que liberar
  27.     // la memoria dinámica usada, primero la asociada a cada uno de los punteros de "tabla[i]":
  28.     // Liberar memoria:
  29.     for ( i = 0; i < n; i++ ) { delete[] tabla[i]; }
  30.    
  31.     // Y después la del array de punteros a int, "tabla":
  32.     delete[] tabla;
  33.    
  34.     return 0;
  35. }//END OF MAIN

Es muy importante no olvidar usar el delete después para liberar la memoria antes de terminar la función se suele usar los destructores para que se encarguen de realizar esa tarea por ti cuando uses las clases, usa los destructores para liberar la memoria.

Última edición por vangodp; 30/04/2014 a las 02:50
  #3 (permalink)  
Antiguo 02/05/2014, 20:49
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Arreglos, vectores y matrices

Pues la duda que tengo es que se supone que para crear una matriz de n*m elementos, tengo que crear un puntero doble que apunte a un puntero etc.... Lo que puse ahi es que yo puse 2 formas, una que no utiliza punteros que se supone que no se puede crear asi, no se supone que se tiene que usar la palabra reservada new para generar memoria dinamica y asi poder crear un matriz de n*m o un vector de n elementos?
Cita:
Iniciado por vangodp Ver Mensaje
¿Y cual es la duda que tienes?
¿Si tienes que usar la dinámica con las matrices?
Con las matrices bidimencionales la forma es hacer como una especie de tabla de tablas
Se usa puntero que apunta a puntero.Primero se crea el puntero que apunta otro puntero que sera las fila, eso permite guardar otro puntero que sera la columna y por eso debe ser un puntero a puntero. Se usa igual que una matriz bidimensional normal, accediendo de esta forma tabla[10][7] = unvalor;
El ejemplo y la explicación la tienes aquí: [url]http://c.conclase.net/curso/?cap=017#inicio[/url]

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5.     int ** tabla;//"tabla" es un puntero que apunta a un objeto de tipo puntero a int."puntero a puntero"
  6.     int n = 134;
  7.     int m = 231;
  8.     int i;
  9.    
  10.     // Sabemos que un puntero se comporta casi igual que un array, por lo tanto nada nos impide que
  11.     // "tabla" apunte al primer elemento de un array de punteros:
  12.     tabla = new int * [n];
  13.    
  14.     // Ahora estamos en un caso similar, "tabla" apunta a un array de punteros a int,
  15.     // cada elemento de este array puede ser a su vez un puntero al primer elemento de otro array:
  16.     // n arrays de m ints
  17.     for ( i = 0; i < n; i++ ) {
  18.         tabla[i] = new int[m];
  19.     }
  20.  
  21.     // Ahora tabla apunta a un array de dos dimensiones de n * m, podemos acceder a cada elemento
  22.     // igual que accedemos a los elementos de los arrays normales: 
  23.     tabla[21][33] = 123;
  24.     cout << tabla[21][33] << endl;
  25.    
  26.     // Otra diferencia con los arrays normales es que antes de abandonar el programa hay que liberar
  27.     // la memoria dinámica usada, primero la asociada a cada uno de los punteros de "tabla[i]":
  28.     // Liberar memoria:
  29.     for ( i = 0; i < n; i++ ) { delete[] tabla[i]; }
  30.    
  31.     // Y después la del array de punteros a int, "tabla":
  32.     delete[] tabla;
  33.    
  34.     return 0;
  35. }//END OF MAIN

Es muy importante no olvidar usar el delete después para liberar la memoria antes de terminar la función se suele usar los destructores para que se encarguen de realizar esa tarea por ti cuando uses las clases, usa los destructores para liberar la memoria.
  #4 (permalink)  
Antiguo 03/05/2014, 02:19
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: Arreglos, vectores y matrices

@shikamarucb: la forma que crees que no se puede usar se llama array de longitud variable, y es aceptada desde C99:

Código C++:
Ver original
  1. int a;
  2. cin >> a;
  3. int vec[a];

El sistema intentará reservarte a*sizeof(int) bytes al momento y la liberará al finalizar el ambito de la variable. El punto en contra de este metodo es que no tienes ninguna forma de saber si el sistema pudo reservar la memoria solicitada, y el problema lo tienes cuando sin haber conseguido reservar memoria intentas trabajar con la variable y provocas un desbordamiento de pila.

Código C++:
Ver original
  1. int a;
  2. cin >> a;
  3. int vec[a];//no puedes comprovar la reserva
  4. vec[0] = 1;//si hubo un error en la reserva de memoria aqui petará la aplicacion

A causa de esto se recomienda usar el new para reservar memoria; en c++ tambien puedes usar malloc para reservar memoria para no-objetos (variables estandar).

Retormando el ejemplo que te puso @vangodp implemento la comprovacion de error en la reserva de memoria:

Código C++:
Ver original
  1. //con try-catch
  2. try {
  3.     tabla = new int * [n];
  4. }
  5. catch (bad_alloc &e) {
  6.     //error
  7. }
  8.  
  9. //con nothrow
  10. if(!(tabla = new (nothrow) int * [n])) {
  11.     //error
  12. }

La comprovacion de reserva tienes que hacerla para cada new, igual que al finalizar tienes que llamar a un delete para cada new.

Saludos
vosk
  #5 (permalink)  
Antiguo 03/05/2014, 04:26
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Arreglos, vectores y matrices

Cita:
//con try-catch
try {
tabla = new int * [n];
}
catch (bad_alloc &e) {
//error
}
Bien señalado ;). Y otra cosa mas: Si ya habías reservado memoria antes, al saltar el error no basta con comprobar, en caso de error había que liberar toda la memoria anteriormente revesada para evitar fugas ya que si el programa se rompe no le iba dar tiempo de llamar a los delete.
  #6 (permalink)  
Antiguo 03/05/2014, 10:50
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Arreglos, vectores y matrices

Muchas gracias a los dos, ya despeje mis dudas..

Etiquetas: arreglos, int, matrices, string, vectores
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 14:42.