Tengo un fallo en el siguiente ejercicio

Iniciado por juni85, 2 Junio 2010, 08:56 AM

0 Miembros y 2 Visitantes están viendo este tema.

juni85

Hola me gustaria cambiar el nombre de un empleado,pero al realizar todo no me lo cambia.
Si me lo podeis corregir lo agradeceria. El ejercio esta hecho con Netbeans

#include <stdlib.h>
#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Empleado{
public:
    string nombre;
    int edad;

public:

    Empleado(string nom, int ed=18){
     nombre=nom;
     edad=ed;
    }
   Empleado(){
      nombre=" ";
       edad=18;
   }
    void set_Empleado(string nom, int ed=18){
      nombre=nom;
      edad=ed;
    }

    void set_nombre(string nom){
        nombre=nom;
    }
     void set_edad(int ed){
        edad=ed;
    }
     string get_nombre(){
         return nombre;
     }
     int get_edad(){
         return edad;
     }

   
    void mostrarEmpleado();

    friend bool operator<(const Empleado &,const Empleado &);


};

Empleado leerEmpleado(){
    string nombre;
    int edad;
    cout<<"INTRODUCIR EMPLEADO "<<endl;
   
    cout<<"    Nombre :"<<endl;
    getline(cin,nombre);
    cout<<"    Edad :"<<endl;
    cin>>edad;
    char aux=getc(stdin);
    Empleado * pa =new Empleado(nombre,edad);
    return * pa;

}

void Empleado::mostrarEmpleado(){

cout<<"MOSTRAR TRABAJADOR "<<endl;
cout<<"Nombre : "<<nombre<<endl;
cout<<"Edad : "<<edad<<endl;

}


bool operator<(const Empleado & p,const Empleado & s){

   return p.nombre<s.nombre;

}


class listaEmpleado{

  public:

      vector<Empleado >v;

      void anadir1(Empleado e){
      v.push_back(e);
     }
   
      void anadir2(string nom,int ed){

       Empleado *e=new Empleado(nom,ed);
       v.push_back(*e);
             }
   

      bool borrar(string n){

         int i=0,u;

         u=v.size();
         bool borrado=false;
         while(i<u){
             if(v.nombre==n){
                 v=v[u-1];
                 v.pop_back();
                 borrado=true;
             }
             i++;
         }
         return(!borrado);
      }
   int get_edad(string n){
        int i=0;
        while(i<v.size()){
            if(v.nombre==n)return v.edad;
            i++;
        }
        return -1;
    }

   void listar(){
       int i=0,u;
       u=v.size();
         while(i<u){
       v.mostrarEmpleado();
       i++;
       }
   }

  int BuscarEmpleado(string d){
 
    int i=0,u;
       u=v.size();
       while(i<u){
           if(v.nombre==d){
            cout<<"encontrado"<<endl;

               return (1);
                  }
           i++;
         
       }
       cout<<"No encontrado"<<endl;
       return -1;

  }
void cambiar_nombre(){
      string nom,nuevo;
      Empleado pa;
//Empleado *pa;
      int em;
     
      cout<<"Introduce el nombre del empleado a cambiar "<<endl;
      getline(cin,nom);
      em=BuscarEmpleado(nom);
      if(em==-1)cout<<"Nombre no valido "<<endl;
      else{
          cout<<"Introduce el nuevo nombre "<<endl;
          getline(cin,nuevo);
          pa.set_nombre(nuevo);
       //pa->set.nombre(nuevo);---el compilador se queda pillado
}
       
     }

void ordenar(){
  sort(v.begin(),v.end());
}
void ordenarInv(){
  reverse(v.begin(),v.end());
}

void reset(){
    v.clear();
}


};




int main() {

    string nombre;
    listaEmpleado le;

    le.anadir2("Palomo",5);
    le.anadir1(leerEmpleado());
    le.anadir1(leerEmpleado());
    le.anadir1(leerEmpleado());
    cout<<"La edad de Palomo es "<<le.get_edad("Palomo")<<endl;

    le.listar();
    cout<<"Buscar Empleado"<<endl;
    cout<<"Introduce nombre del empleado a buscar "<<endl;
    getline(cin,nombre);
    le.BuscarEmpleado(nombre);
    cout<<"----"<<endl;
    le.BuscarEmpleado("Palomo");
    le.borrar("Palomo");
    le.listar();
    le.cambiar_nombre();
    le.listar();
    cout<<"FIN"<<endl;
    cout<<"\n\nVector ordenado\n\n"<<endl;
    le.ordenar();
    le.listar();
   
    le.ordenarInv();
    cout<<"\n\nVector ordenado al reves\n\n"<<endl;
    le.listar();


    return (0);
}




nicolas_cof

#1
Estaria bueno que pongas tu codigo entre etiquetas GeSHI, si no dudo que alguien lo quiera leer :P

[code=cpp][/code]

Mmmm yo mucho de C++ no conozco, pero hacer esto me parece un poco redundante...

...
class Empleado{
public:
   string nombre;
   int edad;

public:
   Empleado(string nom, int ed=18){
    nombre=nom;
    edad=ed;
   }
...


Creo que con un public seria mas que suficiente... (Que me corriga si no alguien experto en el lenguaje)

Salu10.

M3LiNdR1

Cita de: nicolas_cof en  2 Junio 2010, 11:50 AM
Estaria bueno que pongas tu codigo entre etiquetas GeSHI, si no dudo que alguien lo quiera leer :P

[code=cpp][/code]

Mmmm yo mucho de C++ no conozco, pero hacer esto me parece un poco redundante...

...
class Empleado{
public:
    string nombre;
    int edad;

public:
    Empleado(string nom, int ed=18){
     nombre=nom;
     edad=ed;
    }
...


Creo que con un public seria mas que suficiente... (Que me corriga si no alguien experto en el lenguaje)

Salu10.

Debe estar mal, seguramente el primer public tiener que ser un private, a nose que quieras acceder a esos dos campos desde fuera la clase. (No me mirado el codigo entero).
Va baixar davant dels meus...ulls molt suaument...sense alterar la quietud de la nit,amb un somriure ple de confiança com sino se li escapes res...


C/C++ - Prolog - Java - PHP - Python - SQL - ASP.NET - C# - javascript

pizarron

#3
nicolas_cof, tenes razón que un public al principio seria suficiente, pero algunos utilizan los modificadores además como separador entre los data members y los métodos, una forma de dejar la declaración de la clase un poco más legible.

M3LiNdR1, que no sea private no quiere decir que esté mal, el código va a compilar y va a funcionar como espera, pero corre el riesgo de tener esas propiedades expuestas y que luego en caso de error sea complejo encontrar la falla.


juni85, tu error esta en el método cambiar_nombre() :

Código (cpp) [Seleccionar]
void cambiar_nombre(){
     string nom,nuevo;
     Empleado pa;
//Empleado *pa;
     int em;
   
     cout<<"Introduce el nombre del empleado a cambiar "<<endl;
     getline(cin,nom);
     em=BuscarEmpleado(nom);
     if(em==-1)cout<<"Nombre no valido "<<endl;
     else{
         cout<<"Introduce el nuevo nombre "<<endl;
         getline(cin,nuevo);
         pa.set_nombre(nuevo);
      //pa->set.nombre(nuevo);---el compilador se queda pillado
}


Estás llamando a set_nombre() a un objeto creado solo en este método que no apunta a ninguno de los elementos del vector de Empleados. Lo que yo haría sería crear una referencia hacia el empleado que se está buscando y cambiarle el nombre :

Código (cpp) [Seleccionar]
void cambiar_nombre(){
     string nom,nuevo;
     int em;
   
     cout<<"Introduce el nombre del empleado a cambiar "<<endl;
     getline(cin,nom);

     // Busca al empleado en el vector por el nombre
     int indiceEmpleado;
     for( indiceEmpleado = 0; indiceEmpleado < v.size(); indiceEmpleado++ ){
           if( v[indiceEmpleado].get_nombre() == nom )
                 break;
     }

     // Si el indice encontrado es igual al tamaño del vector, el nombre no fue encontrado
     if( indiceEmpleado == v.size() ){
           cout<<"Nombre no valido "<<endl;
     }
     else{
         // Creo la referencia al empleado encontrado para poder trabajar en ese elemento
         Empleado & pa = v[indiceEmpleado];
         cout<<"Introduce el nuevo nombre "<<endl;
         getline(cin,nuevo);
         pa.set_nombre(nuevo);
      }
}


De paso, echale una mirada a BuscarEmpleado() que tiene errores.

Saludos.

juni85

Gracias por la ayuda al final lo hice asi:
CAMBIAR NOMBRE
cout<<"Introduce el nombre del empleado a cambiar "<<endl;
      getline(cin,nom);
      em=BuscarEmpleado(nom);
      if(em==-1)cout<<"Nombre no valido "<<endl;
      else{
          cout<<"Introduce el nuevo nombre "<<endl;
          getline(cin,nuevo);
       
       while(i<u){
           if(v.nombre==nom){
            cout<<"encontrado"<<endl;
            v.set_nombre(nuevo);
               }
           i++;
          }
         }

BUSCAR EMPLEADO

bool borrar(string n){

         int i=0,u;

         u=v.size();
         bool noborrado=true;
         while(i<u && noborrado){
             if(v.nombre==n){
                 v=v[u-1];
                 v.pop_back();
                 noborrado=false;
             }
             i++;
         }
         return(!noborrado);
      }