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

[SOLUCIONADO] Consulta: se puede hacer esto en c++

Estas en el tema de Consulta: se puede hacer esto en c++ en el foro de C/C++ en Foros del Web. Hola, quiero programar algo y tengo en mente hacer de la siguiente manera: 1. Imaginen que creo un objeto llamado alumno, el cual tiene como ...
  #1 (permalink)  
Antiguo 24/06/2014, 19:06
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 9 años, 10 meses
Puntos: 1
Pregunta Consulta: se puede hacer esto en c++

Hola, quiero programar algo y tengo en mente hacer de la siguiente manera:

1. Imaginen que creo un objeto llamado alumno, el cual tiene como miembros objetos dos vectores de N(constante) longitud, cada uno de ellos con llenos de enteros.

2. Ahora quiero definir una matriz cursos(i,j) donde cada elemento i,j sea un objeto alumno, con i constante pero j puede variar. Imagínense que los j son los alumnos y las i el curso, así cursos(2,3) sería el alumno 3 del curso 2.

3. Como dije quiero que en la matriz cursos(i,j) se pueda cambiar la dimensión j, es decir que si esta en 2, poder subir a 3 y definir un nuevo curso son sus alumno. Esta definición no se sabe al inicio del programa es decir habrá algún mecanismo donde se empieza a aumentar esa j y no se sabe a que valor llegará.

Esto se puede hacer en c++?, y que herramientas necesito saber para programarlos (uso de punteros por ejemplo)?

Muchas gracias.
  #2 (permalink)  
Antiguo 26/06/2014, 12:09
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Consulta: se puede hacer esto en c++

Pues... me supongo es un ejercicio que te dieron para resolver....

Como sea... un arreglo que puede crecer..... lo puedes implementar "a lo macho" con punteros haciendo una "lista enlazada" o usar librerias para eso..... tambien podrias usar una "cola"

Leer una lista enlazada no es dificil....... una cola debes volver a encolar........ todo depende de como quieras sea el "acceso"
__________________
Salu2!
  #3 (permalink)  
Antiguo 26/06/2014, 14:04
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Consulta: se puede hacer esto en c++

Tb se puede usar el tipo vector, #include <vector>, luego

vector<tipoValor> v;
v.push_back( nuevo_valor ); // nuevo_valor tiene tipo tipoValor

y el vector crece y crece a medida que le agregan elementos y tiene la misma sintaxis de un arreglo para acceder al contenido.
__________________
Visita mi perfil en LinkedIn
  #4 (permalink)  
Antiguo 27/06/2014, 20:57
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 9 años, 10 meses
Puntos: 1
Respuesta: Consulta: se puede hacer esto en c++

Gracias por sus respuestas, pero no me han especificado si se puede hacer un arreglo con objetos, por tanto supongo que si.

Es mejor usar los arreglos nativos de c++ o mejor los de la librería vector?

Saludos
  #5 (permalink)  
Antiguo 27/06/2014, 22:34
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Consulta: se puede hacer esto en c++

Es que que la clase vector hace eso. te lo ha dicho Calgary pero a lo mejor no lo has pillao.XD
Cuando creas un vector vector<tipoValor> v; el "tipoValor" de vector<tipoValor> v; es como un arreglo de objetos pero muuuucho mejor.
Luego con v.pushback(nuevo_valor ) vas metiendo objetos a gusto XD.
Ademas tienes una ventaja sobre los arreglos que el tamaño como puedes intuir va aumentando.
No es un array a los que algunos le dicen vector de c, es una clase llamada vector que tiene unas cuantas sorprecitas :D
necesitas incluir a #include<vector>
Ademas una cosa mas... array es para c en cpp los contenedores son vector, maps, lists ya que son mas propios para c++ y están mas preparados para usar objetos, si usas array mejor te quedas en c >_<.
http://v1.minidosis.org/C++/Vectores/
http://v1.minidosis.org/C++/Listas/
http://v1.minidosis.org/C++/Maps/
Array es como cuando llevamos ruedecillas en la bici >_<.
  #6 (permalink)  
Antiguo 30/06/2014, 12:12
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 9 años, 10 meses
Puntos: 1
Respuesta: Consulta: se puede hacer esto en c++

Muchas gracias, voy a revisar todo el material que me habéis dejado, espero poder contar con su apoyo, si tengo nuevas dudas.

Saludos
  #7 (permalink)  
Antiguo 30/06/2014, 14:24
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Consulta: se puede hacer esto en c++

Claro compañero ;)
Esperamos que te vaya bien y aquí te esperamos.
  #8 (permalink)  
Antiguo 30/06/2014, 20:49
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 9 años, 10 meses
Puntos: 1
Respuesta: Consulta: se puede hacer esto en c++

Realmente me han fascinado los videos que me enviaste vangodp. Sé lo super básico de cpp y estos manuales me vienen muy bien. Aún los estoy estudiando pero tengo una pregunta (espero que no sea prematura) para hacer una matriz se puede usar la clase vector?, quizá un vector dentro de otro vector. Creo que por maps si se podría pero me gustan mas los vectores jeje. Gracias de nuevo.
  #9 (permalink)  
Antiguo 01/07/2014, 08:30
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Consulta: se puede hacer esto en c++

claro que si compañero. Pero eso ya es mas avanzado.
Busca vector de vectores en C++ google y encontraras ;)
es algo como esto: vector< vector<int> > m
Pero hay movidas por causa del tamaño de los vectores.


Te recomiendo leer detenidamente sobre el tema.
Ademas hay medios de tratar un vector unidimensional como si fuera bidimensional.
http://www.cplusplus.com/forum/general/833/
Es una pasada todo el tema.


Dejo esto:
Busca también vector bidimensional o vector 2d y tenga en cuanta que muchos resultados son basura ya que que en c le dicen mucho a vector a los arrays y el buscador se lía algo. Pon siempre c++ junto a la búsqueda.

https://www.google.es/?gfe_rd=cr&ei=...sional+c%2B%2B
https://www.google.es/?gfe_rd=cr&ei=...2B%2B&start=10

Mucha lectura falta para eso y practica ;)
Suerte.


También tengo que dar una leída a los temas estos :3

Última edición por vangodp; 01/07/2014 a las 08:36
  #10 (permalink)  
Antiguo 01/07/2014, 08:38
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Consulta: se puede hacer esto en c++

Cita:
Iniciado por dmorill Ver Mensaje
para hacer una matriz se puede usar la clase vector?
Mira... suponte esa matriz de 4x3

Cita:
1234
5678
9ABC

Acaso no se puede linealizar y meter en un vector ?

Cita:
123456789ABC

Si lo piensas es lo mismo..... lo que cambia es la parte "logica" o sea... como encontrar una posicion (x,y) a partir de algo lineal........ se el vector crece en 4 unidades, la matriz agrega otra fila

Cita:
1234
5678
9ABC
DEFG
seri ahora en un vector esto:

Cita:
123456789ABCDEFG

PD: use "G" para que me quede alineado....claramente despues de la F no sigue la G en hexa que fue con lo que comencé
__________________
Salu2!
  #11 (permalink)  
Antiguo 01/07/2014, 10:40
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: Consulta: se puede hacer esto en c++

Cita:
Iniciado por dmorill Ver Mensaje
tengo una pregunta (espero que no sea prematura) para hacer una matriz se puede usar la clase vector?,
Pues sí y ahí va un ejemplo:

Código C++:
Ver original
  1. introduzca el numero de filas: 3
  2. introduzca el numero de columnas: 8
  3.  
  4.   1   2   3   4   5   6   7   8
  5.   9  10  11  12  13  14  15  16
  6.  17  18  19  20  21  22  23  24
  7.  
  8. Process returned 0 (0x0)   execution t

Código C++:
Ver original
  1. #include <iostream>
  2. #include<vector>
  3. #include <iomanip>
  4.  
  5. using namespace std;
  6.  int main() {
  7.   int fil, col, k = 1;
  8.   cout << "introduzca el numero de filas: " ;
  9.   cin >> fil;
  10.   cout << "introduzca el numero de columnas: " ;
  11.   cin >> col;
  12.   cout << endl;
  13.  
  14.   vector < vector < int > > Vector2 ( fil, vector < int > ( col ) );
  15.  
  16.   for( int i = 0; i < fil; i++ )
  17.       for( int  j = 0; j < col; j++, k++)
  18.           Vector2[i][j] = ( k );
  19.  
  20.   for ( int i = 0; i < fil; i++ ) {
  21.     for ( int j = 0; j < col; j++ )
  22.       cout << setw ( 3 ) << Vector2[i][j] <<' ';
  23.     cout << endl;
  24.     }
  25.   return 0;
  26. }

Última edición por leosansan; 01/07/2014 a las 10:45
  #12 (permalink)  
Antiguo 01/07/2014, 12:24
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Consulta: se puede hacer esto en c++

Cita:
vector < vector < int > > Vector2 ( fil, vector < int > ( col ) );
Hasta a mi me servio eso


Y lo que comenta italico no esta mal. y puede ser hasta mas sencillo de usar.
¡Pero Ojo! El problema de eso es que va a perder lo que mejor le va a los vectores que es la ventaja de poder agrandarlos a gusto.
Por que de esta forma el vector va tener que tener un tamaño fijo o para agrandar todas esas casas va haber una tremenda movida de datos de aca para alla.
asi que si lo creas un vector de tamaño fijo su forma no esta mal, per osi tienes que alterar el tamaño puede ser algo pesado.
  #13 (permalink)  
Antiguo 03/07/2014, 02:03
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: Consulta: se puede hacer esto en c++

Cita:
Iniciado por vangodp Ver Mensaje
Hasta a mi me servio eso
.................................................. ........
¡Pero Ojo! El problema de eso es que va a perder lo que mejor le va a los vectores que es la ventaja de poder agrandarlos a gusto.
Por que de esta forma el vector va tener que tener un tamaño fijo o para agrandar todas esas casas va haber una tremenda movida de datos de aca para alla.
asi que si lo creas un vector de tamaño fijo su forma no esta mal, pero si tienes que alterar el tamaño puede ser algo pesado.
Eso de que tiene un tamaño fijo siendo un "vector" es un decir.

Por ejemplo, y a lo simple, puedes añadir columnas y/o filas:

Código C++:
Ver original
  1. 1   2   3
  2.   4   5   6
  3.   7   8   9
  4.  
  5.  
  6.   1   2   3   1   2   3
  7.   4   5   6   4   5   6
  8.   7   8   9   7   8   9
  9.  
  10.   1   2   3   1   2   3
  11.   4   5   6   4   5   6
  12.   7   8   9   7   8   9
  13.   1   2   3   4   5   6
  14.   7   8   9  10  11  12
  15.  13  14  15  16  17  18
  16.  
  17.  
  18.   1   2   3   1   2   3   1
  19.   4   5   6   4   5   6   2   3
  20.   7   8   9   7   8   9   4   5   6
  21.   1   2   3   4   5   6   7   8   9  10
  22.   7   8   9  10  11  12  11  12  13  14  15
  23.  13  14  15  16  17  18  16  17  18  19  20  21
  24.  
  25. Process returned 0 (0x0)   execution time : 0.36

Código C++:
Ver original
  1. #include <iostream>
  2. #include<vector>
  3. #include <iomanip>
  4.  
  5. using namespace std;
  6.  
  7. void imprimir ( vector < vector < int > > &Vector ){
  8.   for ( size_t i = 0; i < Vector.size(); i++ ) {
  9.     for ( size_t j = 0; j < Vector[i].size(); j++ )
  10.       cout << setw ( 3 ) << Vector[i][j] << ' ';
  11.     cout << endl;
  12.     }
  13. }
  14.  
  15. using namespace std;
  16.  
  17.  int main() {
  18.   size_t i, j, fil=3, col=3, k = 1;
  19.   ///vector < vector < int > > Vector ( fil, vector < int > ( col ) );
  20.   /// Otra forma de declarar el vector:
  21.   vector < vector < int > > Vector;
  22.   Vector.resize(fil, vector<int>(col));
  23.   for( i = 0; i < fil; i++ )
  24.     for(  j = 0; j < col; j++, k++)
  25.       Vector[i][j] = ( k );
  26.   imprimir (Vector);
  27.   cout << endl;
  28.  
  29. for ( i = 0, k=1; i < Vector.size(); i++ )
  30.     for ( j = 0; j < 3; j++,k++ )
  31.       Vector[i].push_back(k); /// Anyado columnas  a las filas
  32.   imprimir (Vector);
  33.   cout << endl;
  34.  
  35.  
  36.   Vector.resize(6, vector<int>(6)); /// Anyado filas
  37.   for ( i = 3, k=1; i < Vector.size(); i++ )
  38.     for ( j = 0; j < Vector[i].size(); j++,k++ )
  39.       Vector[i][j]=k;
  40.  
  41.   imprimir (Vector);
  42.   cout << endl;
  43.  
  44.   for ( i = 0, k=1; i < Vector.size(); i++ )
  45.     for ( j = 0; j <=i; j++,k++ )
  46.       Vector[i].push_back(k); /// Anyado mas columnas de longitud variable a las filas
  47.   imprimir (Vector);
  48.   cout << endl;
  49.   return 0;
  50. }

Y como se observa se pueden tener el equivalente a arrays bidimensionales pero no necesariamente cuadrados o rectangulares.

Código C++:
Ver original
  1. 1   2   3
  2.   4   5   6
  3.   7   8   9
  4.  
  5.   1   2   3   1
  6.   4   5   6   2   3
  7.   7   8   9   4   5   6
  8.  
  9.   1   2   3   1
  10.   4   5   6   2   3
  11.   7   8   9   4   5   6
  12.   1   2   3   4   5   6
  13.   7   8   9  10  11  12
  14.  13  14  15  16  17  18
  15.  19  20  21  22  23  24
  16.  25  26  27  28  29  30
  17.  31  32  33  34  35  36
  18.  37  38  39  40  41  42
  19.  
  20. Vector.size()= 10
  21.  
  22.   1   2   3   1   1
  23.   4   5   6   2   3   2   3
  24.   7   8   9   4   5   6   4   5   6
  25.   1   2   3   4   5   6   7   8   9  10
  26.   7   8   9  10  11  12  11  12  13  14  15
  27.  13  14  15  16  17  18  16  17  18  19  20  21
  28.  19  20  21  22  23  24  22  23  24  25  26  27  28
  29.  25  26  27  28  29  30  29  30  31  32  33  34  35  36
  30.  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45
  31.  37  38  39  40  41  42  46  47  48  49  50  51  52  53  54  55

,,,
. .
|
\-/


¡¡¡Saluditos!!!


Última edición por leosansan; 03/07/2014 a las 05:52
  #14 (permalink)  
Antiguo 07/07/2014, 02:40
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 9 años, 10 meses
Puntos: 1
Respuesta: Consulta: se puede hacer esto en c++

Hola, no había escrito porque aún me encontraba estudiando la información que me habéis suministrado.

Primero gracias a todos en especial a vangodp y leosansan por su atención y sus aportes, realmente es muy agradable que personas compartan sus grandes conocimientos :D

Estoy intentando implementar la solución de los vectores de vectores, en breve les informaré como me ha ido, para ver si damos por terminado esta pregunta.

saludos
  #15 (permalink)  
Antiguo 07/07/2014, 04:30
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: Consulta: se puede hacer esto en c++

Cita:
Iniciado por dmorill Ver Mensaje
.................................................. ........
Primero gracias a todos en especial a vangodp y leosansan por su atención y sus aportes, realmente es muy agradable que personas compartan sus grandes conocimientos :D
..........................................
De nada, es un placer compartir conocimientos con otros.

Aprovecho para ahondar en l idea sugerida por Italico76 de obtener una matriz a partir de un vector unidimensional.

Para ello sólo hay que tener en cuenta que se compondrá de un número de elemetos igual a filas x columnas y su acceso será a partir de que [ i ][ j ] == [ i * columnas + j ]:

Código C++:
Ver original
  1. El numero de filas es: 4
  2. El numero de columnas es: 8
  3.  
  4. La matriz es:
  5.   1    2    3    4    5    6    7    8
  6.   9   10   11   12   13   14   15   16
  7.  17   18   19   20   21   22   23   24
  8.  25   26   27   28   29   30   31   32
  9.  
  10. Presione una tecla para continuar . . .

Código C++:
Ver original
  1. #include<iostream>
  2. #include<vector>
  3. #include<cstdlib>
  4.  
  5. using namespace std;
  6.  
  7. void llenarMatriz( vector < int > &matriz, size_t filas, size_t columnas );
  8. void imprimirMatriz( vector < int > matriz, size_t filas, size_t columnas );
  9.  
  10. int main(){
  11.   size_t fil , col ;
  12.   cout << "El numero de filas es: ";
  13.   cin >> fil;
  14.   cout << "El numero de columnas es: ";
  15.   cin >> col;
  16.  
  17.   vector < int > mat ( fil * col ) ;
  18.  
  19.   llenarMatriz( mat , fil , col );
  20.   cout <<  endl;
  21.  
  22.   imprimirMatriz( mat , fil , col );
  23.   cout<<endl;
  24.  
  25.   system("pause");
  26.   return 0;
  27. }
  28. void llenarMatriz( vector < int > &matriz, size_t filas, size_t columnas ){
  29.   ///cout <<"Ingrese los elementos de la matriz \"Matriz\": "<< endl;
  30.   size_t k = 1;
  31.   for( size_t i = 0; i < filas; i++ )
  32.     for( size_t j = 0; j < columnas; j++, k++ ){
  33.       ///cout << "matriz[" << i << "][" << j << "] = " ;
  34.       ///cin >> matriz[ i * columnas  + j ];
  35. /// Si quieres entrar a mano desactiva lo que sigue y activa lo anterior
  36.         matriz[ i * columnas + j ] = k;
  37.     }
  38. }
  39.  
  40. void imprimirMatriz( vector < int > matriz, size_t filas, size_t columnas ){
  41.   cout << "La matriz es: " << endl;
  42.   for( size_t i = 0; i < filas ; i++){
  43.     for( size_t j = 0; j < columnas; j++ )
  44.       cout.width(3),cout << matriz[ i * columnas + j ] << "  ";
  45.     cout <<  endl;
  46.   }
  47. }

Y observa la sutil diferencia con el siguiente en la declaración del vector y donde hago uso de push_back para introducir, y hacer que el vector crezca, los valores del vector:

Código C++:
Ver original
  1. #include<iostream>
  2. #include<vector>
  3. #include<cstdlib>
  4.  
  5. using namespace std;
  6.  
  7. void llenarMatriz( vector < int > &matriz, size_t filas, size_t columnas );
  8. void imprimirMatriz( vector < int > matriz, size_t filas, size_t columnas );
  9.  
  10. int main(){
  11.   size_t fil , col ;
  12.   cout << "El numero de filas es: ";
  13.   cin >> fil;
  14.   cout << "El numero de columnas es: ";
  15.   cin >> col;
  16.  
  17.   vector < int > mat  ;
  18.  
  19.   llenarMatriz( mat , fil , col );
  20.   cout <<  endl;
  21.  
  22.   imprimirMatriz( mat , fil , col );
  23.   cout<<endl;
  24.  
  25.   system("pause");
  26.   return 0;
  27. }
  28. void llenarMatriz( vector < int > &matriz, size_t filas, size_t columnas ){
  29.   cout <<"Ingrese los elementos de la matriz \"Matriz\": "<< endl;
  30.   size_t k = 1 , dato;
  31.   for( size_t i = 0; i < filas; i++ )
  32.     for( size_t j = 0; j < columnas; j++, k++ ){
  33.       ///cout << "matriz[" << i << "][" << j << "] = " ;
  34.       ///cin >> dato,matriz.push_back( dato );
  35. /// Si quieres entrar a mano desactiva lo que sigue y activa lo anterior
  36.         matriz.push_back(k);
  37.     }
  38. }
  39.  
  40. void imprimirMatriz( vector < int > matriz, size_t filas, size_t columnas ){
  41.   cout << "La matriz es: " << endl;
  42.   for( size_t i = 0; i < filas ; i++){
  43.     for( size_t j = 0; j < columnas; j++ )
  44.       cout.width(3),cout << matriz[ i * columnas + j ] << "  ";
  45.     cout <<  endl;
  46.   }
  47. }

También podría usar:

Código C++:
Ver original
  1. void llenarMatriz( vector < int > &matriz, size_t filas, size_t columnas ){
  2.   ///cout <<"Ingrese los elementos de la matriz \"Matriz\": "<< endl;
  3.   size_t k = 1 , dato;
  4.   for( size_t i = 0; i < filas * columnas; i++ ,k++ ){
  5.     ///cout << "matriz[" << i / filas << "][" << i % filas << "] = " ;
  6.     ///cin >> dato,matriz.push_back( dato );
  7. /// Si quieres entrar a mano desactiva lo que sigue y activa lo anterior
  8.     matriz.push_back(k);
  9.   }
  10. }


Última edición por leosansan; 07/07/2014 a las 07:24
  #16 (permalink)  
Antiguo 11/07/2014, 07:56
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 9 años, 10 meses
Puntos: 1
Respuesta: Consulta: se puede hacer esto en c++

Hola, por aquí nuevamente, pero gustoso de que estoy aprendiendo mucho. Y en gran medida a todos ustedes, especialmente a vangodp y leosansan muchas gracias.

leosansan, seguí tu modelo de vector de vectores y me funciona muy bien. Es excelente trabajar con matrices que no son cuadradas.

Una pregunta más, en la ventana inmediato se puede consultar el valor de un vector de vectores?, por ejemplo, detengo el algoritmo y en dicha ventana (inmediato) puedo preguntar por la variable "a" así "debug.print a", pero he probado debug.print a[1][2] pero no funciona. Y en google no he encontrado muchas respuestas.

Etiquetas: c++, objetos, 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 16:00.