Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: chicainge en 7 Junio 2014, 01:43 am



Título: CONTENEDORES STL vector
Publicado por: chicainge 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?


Título: Re: CONTENEDORES STL vector
Publicado por: ivancea96 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;


Título: Re: CONTENEDORES STL vector
Publicado por: chicainge 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++;
    }
}


Título: Re: CONTENEDORES STL vector
Publicado por: eferion 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.


Título: Re: CONTENEDORES STL vector
Publicado por: chicainge en 9 Junio 2014, 10:50 am
MUCHÍSIMAS GRACIAS:)