Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Ivancamilo en 27 Septiembre 2016, 03:31 am



Título: Como hacer un vector dinámico?
Publicado por: Ivancamilo en 27 Septiembre 2016, 03:31 am
Hola!
Estoy manejando un programa en dev c++, donde tengo que crear una estructura de tipo vector que tiene un tamaño fijo de 3, y una función para capturar los datos que se van a almacenar en la estructura, la idea que cada vez que yo ingrese a la función de capturar los datos; el tamaño de la estructura vaya incrementando conforme aumentan los registros; pero no tengo idea de como podría hacer eso…
Ayuda este es el código que tengo.
Código
  1. #include <iostream>
  2. #include <conio.h>
  3. #include<windows.h>
  4. //#define gt(x,y) {COORD a;a.X = x; a.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),a);}
  5. #define gt(x,y) {HANDLE hcon;hcon = GetStdHandle(STD_OUTPUT_HANDLE); COORD dwPos;dwPos.X = x;dwPos.Y= y;SetConsoleCursorPosition(hcon,dwPos); }
  6. #include <cstdlib>
  7.  
  8. #define max 3
  9.  
  10. using namespace std;
  11.  
  12. struct cedula{
  13.  
  14.    char ncedula[30],nom[30],ape[30],fn[15],fe[15];
  15.    float estatura;    
  16. }vec[max];
  17.  
  18. int capturo(int);
  19. void formu();
  20.  
  21. int main(){
  22. int h=0;
  23.    char op;
  24.    system("color 3f");
  25. do{
  26. system("cls");
  27. cout<<"1- Capturar"<<endl;
  28. cout<<"2- Consultar"<<endl;
  29. cout<<"3- Modificar"<<endl;
  30. cout<<"4- Eliminar"<<endl;
  31. cout<<"5- Salir"<<endl;
  32. cout<<"Que opcion desea ejecutar? :"<<endl;
  33.        op=getche();
  34.  
  35. switch (op){
  36. case '1':
  37. h=capturo(h);
  38.  
  39. break;
  40. case '2':
  41.  
  42. break;
  43. case '3':
  44.  
  45. break;
  46. case '4':
  47.  
  48. break;
  49. }
  50. }while(op!= '5');
  51.    return 0;
  52.    system("pause");    
  53. }
  54. void formu(){
  55. gt(4,6);cout<<"digite el numero de la ceduala";
  56. gt(4,7);cout<<"digite el nombre";
  57. gt(4,8);cout<<"digite su apellidos";
  58. gt(4,9);cout<<"digite su fecha de nacimiento ";
  59. gt(4,10);cout<<"digite su fecha de expedicion ";
  60. gt(4,11);cout<<"digite su estatura";
  61. }
  62.  
  63. int capturo(int j){
  64. char anadir='s';
  65. int i=j;
  66.  
  67. for(;(i<max && anadir=='s' );i++){
  68.  
  69. system("cls");
  70.     //cout<<"el valor de i es: "<<i<<endl;
  71.     gt(4,3);cout<<"registro "<<++i<<" de "<<max<<endl;
  72.  
  73. formu();
  74.     gt(44,6);gets(vec[i].ncedula);
  75.  
  76. gt(21,7);gets(vec[i].nom);
  77.     gt(24,8);gets(vec[i].ape);
  78. gt(34,9);gets(vec[i].fn);
  79.     gt(34,10);gets(vec[i].fe);
  80.     gt(23,11);cin>>vec[i].estatura;
  81. fflush(stdin);
  82. gt(4,16);cout<<"desea anadir mas registros S/N";
  83. gt(36,16);anadir=getche();
  84. getch();
  85.  
  86. --i;
  87. }
  88. return i;
  89.  
  90. }
  91.  


Título: Re: Como hacer un vector dinámico?
Publicado por: JonaLamper en 28 Septiembre 2016, 00:32 am
¿El tamaño tiene que ser 3 porque así te lo imponen? Cuando aumente de tamaño, ¿cuánto quieres que aumente? ¿No puedes usar la librería <vector> de C++ que internamente te aumenta el vector sin tú hacer nada?

Al margen de eso, la idea sería crear un vector de tamaño n (donde n es el tamaño antiguo + aumento) y copiar todos los elementos en el nuevo vector. La copia se realizaría con un for que dará m vueltas (donde m es la longitud del vector viejo). Para saber cuándo tienes que hacer el aumento, podrías llevar un contador que aumenta cada vez que insertas un nuevo elemento en el vector (contador++). Cuando contador = m - 1, entonces llamas a la función de aumentar tamaño.

Si lo que estas pensando es que el vector debe aumentar el tamaño de 1 en 1, es mejor que no lo hagas así, es muy ineficiente. Quizá una buena idea (si es que quieres hacerlo así) sería aumentar el vector al doble del tamaño antiguo.