Ayuda en una lista contenedora

Iniciado por DarkSorcerer, 9 Octubre 2013, 02:54 AM

0 Miembros y 1 Visitante están viendo este tema.

DarkSorcerer

Estaba haciendo un ejercicio con uso de punteros, arreglos y asignación dinámica, todo marchaba perfectamente pero con un pequeño error en la última parte y no se por que sera.

Mi ejercicio consiste en esto: Quiero crear una "lista" llamada Carpeta que contiene un arreglo de punteros a Alumno, cada alumno tiene nombre, rut (número de identificación en mi pais) y edad.

En el main cree en un ciclo for que solo agregue 3 alumnos, se pide ingresar por teclado el nombre, rut y edad y se agrega a la carpeta, todo marcha bien, el problema sucede cuando es hora de mostrar los resultados, una vez que termino de ingresar los datos, la última instrucción es desplegar los datos, pero hay un problema con el ciclo for, por que dentro de la función "desplegar" de Carpeta, hay un título que dice "Datos de los alumnos", eso lo imprime correctamente, pero llega al for y comienza el problema y no se por que sera. Ojalá me puedan ayudar.

Les pongo lo que me sale en la pantalla de comandos y el código.

Ingresando datos

Individuo 1
Ingrese nombre: Juan
Ingrese RUT: 1234
Ingrese edad: 15

Individuo 2
Ingrese nombre: Simon
Ingrese RUT: 4321
Ingrese edad: 17

Individuo 3
Ingrese nombre: Rodrigo
Ingrese RUT: 5678
Ingrese edad: 16

Datos de los alumnos

RUN FAILED (exit value 1,, total time: 36s)


Código (cpp) [Seleccionar]
#ifndef CARPETA_H
#define CARPETA_H
#include "Alumno.h"
#include <string>

using namespace std;

class Carpeta {
public:
    Carpeta();
    Carpeta(const Carpeta& orig);
    virtual ~Carpeta();
    void agregarAlumno(Alumno *a);
    Alumno* getAlumno(string n);
    void desplegar();
    bool isFull();
    bool isEmpty();
private:
    Alumno **alumnos;
    int cantAlumnos;
};

#endif /* CARPETA_H */



Código (cpp) [Seleccionar]
#include "Carpeta.h"
#include <iostream>
#include <string>

using namespace std;

/*
* Constructor por defecto de la carpeta, planeado para un curso de 40 alumnos.
*/

Carpeta::Carpeta() {
   
    this->alumnos = new Alumno*[40];
    this->cantAlumnos = 0;
   
}

Carpeta::Carpeta(const Carpeta& orig) {   
}

/*
* Destructor.
*/

Carpeta::~Carpeta() {
   
    cout << "\nEliminando carpeta";
    delete []alumnos;
   
}

/*
* Funcion que agrega un puntero a Alumno a la lista.
*/

void Carpeta::agregarAlumno(Alumno *a){
   
    if(isFull()){
       
        cout << "\nEsta lleno";
       
    }else{
       
        alumnos[cantAlumnos];
        cantAlumnos++;
       
    }
   
}

/*
* Funcion que devuelve un puntero a Alumno
*/

Alumno* Carpeta::getAlumno(string nombre){
   
    if(isEmpty()){
       
        cout << "\nEsta vacio\n";
       
    }else{
       
        for(int i=0; i<cantAlumnos; i++){
           
            if(alumnos[i]->getNombre() == nombre){
               
                return alumnos[i];
               
            }
        }
    }
   
}

/*
* Funcion que verifica si la lista esta vacia.
*/

bool Carpeta::isEmpty(){
   
    if(cantAlumnos == 0){
       
        return true;
       
    }else{
       
        return false;
       
    }
   
}

/*
* Funcion que verifica si la lista esta llena.
*/
bool Carpeta::isFull(){
   
    if(cantAlumnos == 40){
       
        return true;
       
    }else{
       
        return false;
       
    }
   
}

/*
* Funcion que despliega todos los alumnos de la lista.
*/

void Carpeta::desplegar(){
   
    cout <<"\nDatos de los alumnos\n";
   
    for(int i=0; i<cantAlumnos; i++){
       
        cout <<"\nNombre: " << alumnos[i]->getNombre();
        cout <<"\nRut: " << alumnos[i]->getRut();
        cout <<"\nEdad: " << alumnos[i]->getRut();
       
    }
}



Código (cpp) [Seleccionar]
#ifndef ALUMNO_H
#define ALUMNO_H
#include <string>

using namespace std;

class Alumno {
public:
    Alumno();
    Alumno(string n, string r, int e);
    Alumno(const Alumno& orig);
    virtual ~Alumno();
    string getNombre();
    string getRut();
    int getEdad();
private:
    string nombre;
    string rut;
    int edad;
};

#endif /* ALUMNO_H */



Código (cpp) [Seleccionar]
#include "Alumno.h"
#include <string>
#include <iostream>

using namespace std;

Alumno::Alumno() {
}

Alumno::Alumno(string n, string r, int e){
   
    this->nombre = n;
    this->rut = r;
    this->edad = e;
   
}

Alumno::Alumno(const Alumno& orig) {
   
    // Sin implementar.
   
}

Alumno::~Alumno() {
   
    cout << "\nEliminando alumno";
   
}

string Alumno::getNombre(){
   
    return nombre;
   
}

string Alumno::getRut(){
   
    return rut;
   
}

int Alumno::getEdad(){
   
    return edad;
   
}



Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>
#include "Alumno.h"
#include "Carpeta.h"
#include <string>

using namespace std;

Carpeta carpetaAlumnos;

int main(int argc, char** argv) {
   
    string nombre;
    string rut;
    int edad;
   
    cout << "Ingresando datos\n";
   
    for(int i=0; i<3; i++){
       
        cout << "\nIndividuo " << i+1 << "\n";
       
        cout <<"Ingrese nombre: ";
        getline(cin,nombre);
       
        cout <<"Ingrese RUT: ";
        getline(cin,rut);
       
        cout <<"Ingrese edad: ";
        cin >> edad;
       
        Alumno *alumno = new Alumno(nombre,rut,edad);
        carpetaAlumnos.agregarAlumno(alumno);
       
        cin.ignore();
       
    }
   
    carpetaAlumnos.desplegar();

    return 0;
}


EvilGoblin

Verifica con un COUT antes de entrar en el FOR el valor de CantAlumnos
Experimental Serial Lain [Linux User]

eferion

Primer y principal problema:
Código (cpp) [Seleccionar]

void Carpeta::agregarAlumno(Alumno *a){

    if(isFull()){

        cout << "\nEsta lleno";

    }else{

        alumnos[cantAlumnos];
        cantAlumnos++;

    }

}


y más concretamente la línea:

Código (cpp) [Seleccionar]
alumnos[cantAlumnos];

esa línea no hace aboslutamente nada. No estás metiendo al alumno en la lista. La línea debería quedar así:

Código (cpp) [Seleccionar]
alumnos[cantAlumnos] = a;

Y luego tienes un segundo error en el código, lo que pasa es que éste es irrelevante porque no usas esa función... pero si la usases te daría problemas:

Código (cpp) [Seleccionar]

Carpeta::Carpeta(const Carpeta& orig) {   
}


Si implementas el constructor copia, lo mínimo que debes hacer es completar la función... si no vas a hacer nada mejor quita esa función o, mejor aún, declárala como privada. Si no la vas a usar puedes hasta evitar implementarla... así evitas que el compilador cree un constructor copia por defecto.

Y para rematar un consejo: intenta evitar las variables globales... no son buena idea porque en códigos más complejos pierdes la traza de dicha variable... además de que puedes modificarla sin querer en otras partes del código.

DarkSorcerer

:O, en que diablos estuve pensando esa vez para que se me olvidara agregar el alumno al arreglo, fue culpa mía u.u (quizas se deba a que eran las 3 de la mañana)

Bueno, gracias por tu respuesta y acerca del constructor copia, lo tendré en cuenta cuando debe estar y cuando no.

Saludos.