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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


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

Desconectado Desconectado

Mensajes: 15


Ver Perfil
CONTENEDORES STL vector
« en: 7 Junio 2014, 01:43 am »

Hola tengo una duda sobre como acceder a el nombre de esta estructura:
       
        typedef struct habitacion{
         string nombre;
        };
        typedef vector<habitacion> habitaciones;
        vector<habitaciones> planta;

Esta declarado dentro de una clase privada, pero al intentar incluir un nombre..
planta [hab][pla]=nombre;
me sale un error, como puedo entonces acceder a nombre?


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: CONTENEDORES STL vector
« Respuesta #1 en: 7 Junio 2014, 02:56 am »

Código
  1. planta[hab][pla].nombre

Por cierto, en C++, se pone simplemente:

Código
  1. struct habitacion{
  2.    string nombre;
  3. };
  4.  
  5. vector< vector<habitacion> > plantas;


En línea

chicainge

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: CONTENEDORES STL vector
« Respuesta #2 en: 7 Junio 2014, 14:36 pm »

Gracias pero el programa me sigue dejando de funcionar, mira ;
este es el main:
Código:
#include <iostream>
#include <string>
#include <cctype>
#include "hotel.hpp"
using namespace std;
using namespace umalcc;

void leer_num(unsigned& num, const string& msj)
{
    cout << msj ;
    cin >> num;
}
void leer_str(string& str, const string& msj)
{
    cout << msj ;
    cin >> str;
}
void leer_cliente(string& nombre)
{
    leer_str(nombre, "Introduzca el nombre del cliente: ");
}
void check_ok(bool ok, const string& msj)
{
    if (ok) {
        cout << "Operacion Correcta. [" << msj << "]" << endl;
    } else {
        cout << "Operacion Erronea. [" << msj << "]" << endl;
    }
}
char menu()
{
    char op;
    cout << "X: Fin" << endl;
    cout << "A: Mostrar Datos Hotel" << endl;
    cout << "B: Alojar Nuevo Cliente" << endl;
    cout << "C: Desalojar Cliente" << endl;
    do {
        cout << endl << "    Opcion: ";
        cin >> op;
        op = char(toupper(op));
    } while (!((op == 'X')||((op >= 'A')&&(op <= 'E'))));
    cout << endl;
    return op;
}
int main()
{
    unsigned n_plantas, n_habs;
leer_num(n_plantas, "Introduzca el numero de plantas del hotel: ");
leer_num(n_habs, "Introduzca el numero de habitaciones por planta: ");
Hotel hotel(n_plantas, n_habs);
    bool ok;
    string nombre, msj;
    unsigned planta, n_hab;
    char op = ' ';
    do {
op = menu();
switch(op) {
case 'A':
hotel.Mostrar();
break;
case 'B':
leer_cliente(nombre);
hotel.Alojar(nombre, planta, n_hab, ok);
check_ok(ok, "Alojar");
if (ok) {
cout << " Alojar: " << nombre
<< " Planta: " << planta
<< " Hab: " << n_hab << endl;
}
break;
case 'C':
leer_str(nombre, "Introduzca el nombre del cliente: ");
hotel.Desalojar(nombre, ok);
check_ok(ok, "Desalojar");
break;
}
    } while (op != 'X');
}
este el hpp:
Código:
#ifndef hotel_hpp__
#define hotel_hpp__ 1
#include <iostream>
#include <string>
#include <queue>
#include <vector>
using namespace std;
namespace umalcc {
//--------------------------------------------------------------------------

class Hotel {
public:
Hotel(unsigned n_plantas, unsigned n_habs);
void Mostrar() const;
void Alojar(const std::string& nombre,
unsigned& plant, unsigned& n_hab, bool& ok);
void Desalojar(const std::string& nombre, bool& ok);
private:
//- tipos ----------------------
typedef struct habitacion{
      string nombre;
        };
        vector<  vector<habitacion>  > planta;
unsigned MAXPLANTA,MAXHABITACIONES;
};
}
#endif

y este el cpp del hpp:

Código:
#include <iostream>
#include "hotel.hpp"
#include <string>
#include <queue>
#include <vector>

using namespace std;
using namespace umalcc;

Hotel::Hotel(unsigned n_plantas, unsigned n_habs){
    MAXPLANTA=n_plantas;
    MAXHABITACIONES = n_habs;
    planta[MAXHABITACIONES][MAXPLANTA];
}
void Hotel::Mostrar() const{
    for(unsigned j=0; j<=planta.size();j++){
    cout<<"PLANTA "<< j <<" : "<<endl;
    for(unsigned i=0;i<MAXHABITACIONES;i++){
        cout<<"HABITACION "<< i <<" : "<<planta[i][0].nombre<<endl;
    }
    }
}
void Hotel::Alojar(const std::string& nombre, unsigned& plant, unsigned& n_hab, bool& ok){
    ok=false;

    unsigned j,n_p=planta.size();
    while(ok!=true || j!=(n_p+1)){
    for(j=0; j<=n_p;j++){
        for(unsigned i=0;i<MAXHABITACIONES;i++){
            if(planta[i][j].nombre!="") {
                    plant=j;
                    n_hab=i;
                    planta[i][j].nombre=nombre;
                    ok=true;
               }
            }
    }
    j++;
    }
}
void Hotel::Desalojar(const std::string& nombre, bool& ok){
    ok=false;
    unsigned j,n_p;
    n_p=planta.size();
    while(ok!=true || j<=(n_p+1)){
    for(j=0; j<=planta.size();j++){
        for(unsigned i=0;i<MAXHABITACIONES;i++){
            if(planta[i][j].nombre==nombre){
               planta[i][j].nombre="";
               ok=true;
            }
        }
    }
    j++;
    }
}
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: CONTENEDORES STL vector
« Respuesta #3 en: 9 Junio 2014, 09:16 am »

Código
  1. typedef struct habitacion{
  2.      string nombre;
  3. };

La palabra reservada "typedef" sobra porque en esa línea, sencillamente no hace nada.

"typedef" sirve para definir alias dentro del código con el fin de conseguir un código más legible. En tu caso no estás definiendo ningún alias, por lo que te puedes ahorrar esa palabra reservada.

Código
  1. vector<  vector<habitacion>  > planta;
  2. unsigned MAXPLANTA,MAXHABITACIONES;

la clase "vector" dispone de un método llamado "size()" que devuelve el número de elementos que contiene dicho vector. Si en el constructor de la clase "Hotel" creas tantos elementos en "planta" como plantas tenga el hotel y tantas habitaciones en cada planta como corresponda, te puedes ahorrar el uso de las variables "MAXPLANTA" y "MAXHABITACIONES":

Código
  1. Hotel::Hotel(unsigned n_plantas, unsigned n_habs)
  2. {
  3.  for ( int i = 0; i < n_plantas; i++ )
  4.  {
  5.    // "Creamos" una planta con "n_habs" habitaciones
  6.    planta.push_back( std::vector< habitacion >( n_habs ) );
  7.  }
  8. }

Entre otras cosas, la siguiente línea que tienes en el constructor simplemente no va a funcionar porque no estás definiendo un array en memoria, sino que estás creando y configurando una clase de tipo "vector":

Código
  1. Hotel::Hotel(unsigned n_plantas, unsigned n_habs){
  2.  // ...
  3.  planta[MAXHABITACIONES][MAXPLANTA];
  4. }

Con esto, el código del método "Alojar" se puede simplificar un poco... eso sin contar que el código que tienes actualmente tiene algún error:

Código
  1. void Hotel::Alojar(const std::string& nombre, unsigned& plant, unsigned& n_hab, bool& ok)
  2. {
  3.  ok=false;
  4.  
  5.  for ( plant = 0; plant < planta.size( ) && !ok; plant++ )
  6.  {
  7.    for ( n_hab = 0; n_hab < planta[ plant ].size( ) && !ok; n_hab++ )
  8.    {
  9.      if ( planta[ plant ][ n_hab ].nombre.empty( ) )
  10.      {
  11.        planta[ plant][ n_hab ].nombre = nombre;
  12.        ok = true;
  13.      }
  14.    }
  15.  }
  16.  
  17.  // Si no hay habitaciones libres, indicamos la posicion de una habitacion no valida (por si acaso)
  18.  if ( !ok )
  19.  {
  20.    plant = -1;
  21.    n_hab = -1;
  22.  }
  23. }

La función "Desalojar" tiene los mismos errores que "Alojar", si aplicas lo aprendido en "Alojar" verás que no es demasiado difícil corregir ese código.
En línea

chicainge

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: CONTENEDORES STL vector
« Respuesta #4 en: 9 Junio 2014, 10:50 am »

MUCHÍSIMAS GRACIAS:)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Contenedores de Archivos
Programación Visual Basic
Yekka 3 1,777 Último mensaje 30 Octubre 2007, 19:35 pm
por Yekka
¿¿Alguien me deja claro el tema de formatos y contenedores??
Multimedia
WildFroVII 9 2,631 Último mensaje 4 Febrero 2008, 14:01 pm
por Songoku
Crashes en contenedores de std que uso en una DLL
Programación C/C++
kafok 1 1,460 Último mensaje 2 Diciembre 2014, 01:46 am
por Eternal Idol
Microsoft añadiría contenedores Hyper-V a Windows 10
Noticias
wolfbcn 0 885 Último mensaje 3 Diciembre 2015, 21:44 pm
por wolfbcn
Contenedores anidados. (Arraylist)
Java
cunian 6 5,371 Último mensaje 24 Mayo 2017, 11:27 am
por marvin49
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines