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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda en una lista contenedora
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda en una lista contenedora  (Leído 1,982 veces)
DarkSorcerer

Desconectado Desconectado

Mensajes: 69



Ver Perfil
Ayuda en una lista contenedora
« en: 9 Octubre 2013, 02:54 am »

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.

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
  1. #ifndef CARPETA_H
  2. #define CARPETA_H
  3. #include "Alumno.h"
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. class Carpeta {
  9. public:
  10.    Carpeta();
  11.    Carpeta(const Carpeta& orig);
  12.    virtual ~Carpeta();
  13.    void agregarAlumno(Alumno *a);
  14.    Alumno* getAlumno(string n);
  15.    void desplegar();
  16.    bool isFull();
  17.    bool isEmpty();
  18. private:
  19.    Alumno **alumnos;
  20.    int cantAlumnos;
  21. };
  22.  
  23. #endif /* CARPETA_H */
  24.  
  25.  

Código
  1. #include "Carpeta.h"
  2. #include <iostream>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. /*
  8.  * Constructor por defecto de la carpeta, planeado para un curso de 40 alumnos.
  9.  */
  10.  
  11. Carpeta::Carpeta() {
  12.  
  13.    this->alumnos = new Alumno*[40];
  14.    this->cantAlumnos = 0;
  15.  
  16. }
  17.  
  18. Carpeta::Carpeta(const Carpeta& orig) {    
  19. }
  20.  
  21. /*
  22.  * Destructor.
  23.  */
  24.  
  25. Carpeta::~Carpeta() {
  26.  
  27.    cout << "\nEliminando carpeta";
  28.    delete []alumnos;
  29.  
  30. }
  31.  
  32. /*
  33.  * Funcion que agrega un puntero a Alumno a la lista.
  34.  */
  35.  
  36. void Carpeta::agregarAlumno(Alumno *a){
  37.  
  38.    if(isFull()){
  39.  
  40.        cout << "\nEsta lleno";
  41.  
  42.    }else{
  43.  
  44.        alumnos[cantAlumnos];
  45.        cantAlumnos++;
  46.  
  47.    }
  48.  
  49. }
  50.  
  51. /*
  52.  * Funcion que devuelve un puntero a Alumno
  53.  */
  54.  
  55. Alumno* Carpeta::getAlumno(string nombre){
  56.  
  57.    if(isEmpty()){
  58.  
  59.        cout << "\nEsta vacio\n";
  60.  
  61.    }else{
  62.  
  63.        for(int i=0; i<cantAlumnos; i++){
  64.  
  65.            if(alumnos[i]->getNombre() == nombre){
  66.  
  67.                return alumnos[i];
  68.  
  69.            }
  70.        }
  71.    }
  72.  
  73. }
  74.  
  75. /*
  76.  * Funcion que verifica si la lista esta vacia.
  77.  */
  78.  
  79. bool Carpeta::isEmpty(){
  80.  
  81.    if(cantAlumnos == 0){
  82.  
  83.        return true;
  84.  
  85.    }else{
  86.  
  87.        return false;
  88.  
  89.    }
  90.  
  91. }
  92.  
  93. /*
  94.  * Funcion que verifica si la lista esta llena.
  95.  */
  96. bool Carpeta::isFull(){
  97.  
  98.    if(cantAlumnos == 40){
  99.  
  100.        return true;
  101.  
  102.    }else{
  103.  
  104.        return false;
  105.  
  106.    }
  107.  
  108. }
  109.  
  110. /*
  111.  * Funcion que despliega todos los alumnos de la lista.
  112.  */
  113.  
  114. void Carpeta::desplegar(){
  115.  
  116.    cout <<"\nDatos de los alumnos\n";
  117.  
  118.    for(int i=0; i<cantAlumnos; i++){
  119.  
  120.        cout <<"\nNombre: " << alumnos[i]->getNombre();
  121.        cout <<"\nRut: " << alumnos[i]->getRut();
  122.        cout <<"\nEdad: " << alumnos[i]->getRut();
  123.  
  124.    }
  125. }
  126.  
  127.  

Código
  1. #ifndef ALUMNO_H
  2. #define ALUMNO_H
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. class Alumno {
  8. public:
  9.    Alumno();
  10.    Alumno(string n, string r, int e);
  11.    Alumno(const Alumno& orig);
  12.    virtual ~Alumno();
  13.    string getNombre();
  14.    string getRut();
  15.    int getEdad();
  16. private:
  17.    string nombre;
  18.    string rut;
  19.    int edad;
  20. };
  21.  
  22. #endif /* ALUMNO_H */
  23.  
  24.  

Código
  1. #include "Alumno.h"
  2. #include <string>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. Alumno::Alumno() {
  8. }
  9.  
  10. Alumno::Alumno(string n, string r, int e){
  11.  
  12.    this->nombre = n;
  13.    this->rut = r;
  14.    this->edad = e;
  15.  
  16. }
  17.  
  18. Alumno::Alumno(const Alumno& orig) {
  19.  
  20.    // Sin implementar.
  21.  
  22. }
  23.  
  24. Alumno::~Alumno() {
  25.  
  26.    cout << "\nEliminando alumno";
  27.  
  28. }
  29.  
  30. string Alumno::getNombre(){
  31.  
  32.    return nombre;
  33.  
  34. }
  35.  
  36. string Alumno::getRut(){
  37.  
  38.    return rut;
  39.  
  40. }
  41.  
  42. int Alumno::getEdad(){
  43.  
  44.    return edad;
  45.  
  46. }
  47.  
  48.  

Código
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include "Alumno.h"
  4. #include "Carpeta.h"
  5. #include <string>
  6.  
  7. using namespace std;
  8.  
  9. Carpeta carpetaAlumnos;
  10.  
  11. int main(int argc, char** argv) {
  12.  
  13.    string nombre;
  14.    string rut;
  15.    int edad;
  16.  
  17.    cout << "Ingresando datos\n";
  18.  
  19.    for(int i=0; i<3; i++){
  20.  
  21.        cout << "\nIndividuo " << i+1 << "\n";
  22.  
  23.        cout <<"Ingrese nombre: ";
  24.        getline(cin,nombre);
  25.  
  26.        cout <<"Ingrese RUT: ";
  27.        getline(cin,rut);
  28.  
  29.        cout <<"Ingrese edad: ";
  30.        cin >> edad;
  31.  
  32.        Alumno *alumno = new Alumno(nombre,rut,edad);
  33.        carpetaAlumnos.agregarAlumno(alumno);
  34.  
  35.        cin.ignore();
  36.  
  37.    }
  38.  
  39.    carpetaAlumnos.desplegar();
  40.  
  41.    return 0;
  42. }
  43.  
  44.  


En línea

EvilGoblin


Desconectado Desconectado

Mensajes: 2.323


YO NO LA VOTE!


Ver Perfil
Re: Ayuda en una lista contenedora
« Respuesta #1 en: 9 Octubre 2013, 03:06 am »

Verifica con un COUT antes de entrar en el FOR el valor de CantAlumnos


En línea

Experimental Serial Lain [Linux User]
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Ayuda en una lista contenedora
« Respuesta #2 en: 9 Octubre 2013, 08:14 am »

Primer y principal problema:
Código
  1. void Carpeta::agregarAlumno(Alumno *a){
  2.  
  3.    if(isFull()){
  4.  
  5.        cout << "\nEsta lleno";
  6.  
  7.    }else{
  8.  
  9.        alumnos[cantAlumnos];
  10.        cantAlumnos++;
  11.  
  12.    }
  13.  
  14. }

y más concretamente la línea:

Código
  1. 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
  1. 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
  1. Carpeta::Carpeta(const Carpeta& orig) {    
  2. }

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.
En línea

DarkSorcerer

Desconectado Desconectado

Mensajes: 69



Ver Perfil
Re: Ayuda en una lista contenedora
« Respuesta #3 en: 9 Octubre 2013, 21:42 pm »

: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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Cargar una lista [SOLUCIONADO]
Programación C/C++
pitka 4 2,888 Último mensaje 20 Mayo 2012, 19:01 pm
por pitka
[Ayuda] Renombrar una lista de archivos
Scripting
Geormarsch 3 2,533 Último mensaje 15 Septiembre 2012, 18:16 pm
por Eleкtro
[AYUDA] Con lista en C
Programación C/C++
agrey 8 2,938 Último mensaje 13 Diciembre 2012, 17:14 pm
por rir3760
Clase contenedora de bytes
Programación C/C++
Kaxperday 5 1,700 Último mensaje 18 Octubre 2015, 22:30 pm
por ivancea96
Ayuda en lista C++ !!!
Programación C/C++
Necrø 1 1,802 Último mensaje 10 Octubre 2016, 20:09 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines