Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Programación Orientada en Objetos de C++

Estas en el tema de Programación Orientada en Objetos de C++ en el foro de C/C++ en Foros del Web. El objetivo es pasar este código a un formato de Programación Orientada a Objetos Código Estructural: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original #include "stdafx.h" #include ...
  #1 (permalink)  
Antiguo 16/07/2013, 18:09
 
Fecha de Ingreso: septiembre-2008
Mensajes: 221
Antigüedad: 15 años, 7 meses
Puntos: 1
Programación Orientada en Objetos de C++

El objetivo es pasar este código a un formato de Programación Orientada a Objetos


Código Estructural:
Código C++:
Ver original
  1. #include "stdafx.h"
  2. #include "iostream"
  3. #include <conio.h>
  4. using namespace System;
  5. using namespace std;
  6. struct nodo
  7. {
  8.     int datos;
  9.     nodo *sig;
  10. };
  11. nodo *inicial=NULL;
  12. void leer_nodo(nodo *nuevo) // Método - Leer nodo
  13. {
  14.     cout<<"Entre valor del nodo"<<endl; // Permite ingresar la cantidad de Nodos
  15.     cin>>nuevo->datos;
  16. }
  17. void crear_lista(nodo *anterior, nodo *nuevo)
  18. {
  19.     if(anterior == NULL)
  20.     {
  21.         nuevo->sig = inicial;
  22.         leer_nodo(nuevo); // Lee 1ra vez
  23.         inicial = nuevo;
  24.     }
  25.     else
  26.     {
  27.         nuevo->sig = anterior->sig;
  28.         anterior->sig = nuevo;
  29.         leer_nodo(nuevo); // Lee N vez
  30.     }
  31. }
  32. void imprime_nodo(nodo *apun) // Cambio
  33. {
  34.     cout<<"El valor es :    "<<apun->datos<<endl;
  35. }
  36. void reco_iter(nodo *apun) // Cambio
  37. {
  38.     while(apun != NULL)
  39.     {
  40.         imprime_nodo(apun); // Imprime valor nodo
  41.         apun = apun->sig;
  42.     }
  43.     getch();
  44. }
  45. void borrar_lista(nodo *apun)
  46. {
  47.     nodo *inicial;
  48.     while(apun != NULL)
  49.     {
  50.         inicial=apun->sig;
  51.         delete apun;
  52.         apun=inicial;
  53.     }
  54. }
  55. void main()
  56. {
  57.     nodo *anterior, *nuevo, *apun; // Cambio -> apun
  58.     char resp;
  59.     anterior=NULL;
  60.     do
  61.     {
  62.         nuevo = new nodo;
  63.         crear_lista(anterior, nuevo);
  64.         anterior = nuevo;
  65.         cout<<"Desea crear otro nodo? (s/n) "<<endl;
  66.         cin>>resp;
  67.         resp=tolower(resp);
  68.     }while(resp != 'n');
  69.     //inicio del recorrido de la lista
  70.     apun = inicial;
  71.     reco_iter(apun);
  72.     borrar_lista(inicial) ;
  73. }



Código en Objetos con ERROR

Código C++:
Ver original
  1. #include "stdafx.h"
  2. #include "iostream"
  3. #include <conio.h>
  4. using namespace System;
  5. using namespace std;
  6. struct nodo
  7. {
  8.     int datos;
  9.     nodo *sig;
  10.    
  11. };
  12. class lista // Nueva clase - Lista
  13. {
  14. private:
  15.     nodo *inicial;
  16. public:
  17.     lista();   // La lista  - Publico
  18.     ~lista();  // ~La lista - Publico
  19.    
  20.     void crear_lista(nodo *anterior, nodo *nuevo); // Metodo "crear_lista" - Publico
  21.     void leer_nodo(nodo *nuevo); // Método - Leer nodo
  22.     void imprime_nodo(nodo *apun); // Cambio
  23.     void reco_iter(nodo *apun); // Cambio
  24.     void borrar_lista(nodo *inicial) ;
  25. };
  26. lista::lista()
  27. {
  28.     inicial=NULL; // Inicializa NULL
  29. }
  30. void lista::leer_nodo(nodo *nuevo) // Método - Leer nodo
  31. {
  32.     cout<<"Entre valor del nodo"<<endl; // Permite ingresar la cantidad de Nodos
  33.     cin>>nuevo->datos;
  34. }
  35. void lista::crear_lista(nodo *anterior, nodo *nuevo)
  36. {
  37.     if(anterior == NULL)
  38.     {
  39.         nuevo->sig = inicial;
  40.         leer_nodo(nuevo); // Lee 1ra vez
  41.         inicial = nuevo;
  42.     }
  43.     else
  44.     {
  45.         nuevo->sig = anterior->sig;
  46.         anterior->sig = nuevo;
  47.         leer_nodo(nuevo); // Lee N vez
  48.     }
  49. }
  50. void lista::imprime_nodo(nodo *apun) // Cambio
  51. {
  52.     cout<<"El valor es :    "<<apun->datos<<endl;
  53. }
  54. void lista::reco_iter(nodo *apun) // Cambio
  55. {
  56.     while(apun != NULL)
  57.     {
  58.         imprime_nodo(apun); // Imprime valor nodo
  59.         apun = apun->sig;
  60.     }
  61. }
  62. lista::~lista() // Metodo "borrar_lista" - Publico
  63. {
  64.     nodo *apun; // " * " es para crear nodo
  65.     apun=inicial;
  66.     while(apun != NULL)
  67.     {
  68.         cout<<"borro"<<endl;
  69.         inicial=apun->sig;
  70.         delete apun;
  71.         apun=inicial;
  72.     }
  73. }
  74. void main()
  75. {
  76.     nodo *anterior, *nuevo, *apun;
  77.     lista objlista; // Dar memoria a la lista
  78.     char resp;
  79.     anterior=NULL;
  80.     do
  81.     {
  82.         nuevo = new nodo;
  83.         objlista.crear_lista(anterior, nuevo); // Nuevo metodo
  84.         anterior = nuevo;
  85.         cout<<"Desea crear otro nodo? (s/n) "<<endl;
  86.         cin>>resp ; resp=tolower(resp);
  87.     }while (resp != 'n');
  88.     //inicio del recorrido de la lista
  89.     apun = inicial;
  90.     objlista.reco_iter(apun);
  91.     objlista.borrar_lista(inicial) ;
  92. }

¿Cuál es el error en esta compilación?
  #2 (permalink)  
Antiguo 16/07/2013, 18:40
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Programación Orientada en Objetos de C++

¿Que error de compilación da?

Por cierto, no hace falta que crees una clase lista, C++ ya provee una lista enlazada con bastantes operaciones:
http://www.cplusplus.com/reference/list/list/
  #3 (permalink)  
Antiguo 16/07/2013, 18:56
 
Fecha de Ingreso: septiembre-2008
Mensajes: 221
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Programación Orientada en Objetos de C++



Aqui la imagen en Flirck: http://farm6.staticflickr.com/5508/9...e9e4fe81_o.png

¿Cómo puedo ver los números de las líneas?

Me bota error de: "inicial" - identificador no declarado

Me imagino que tienes razón: "por cierto, no hace falta que crees una clase lista, C++ ya provee una lista enlazada con bastantes operaciones:"

Pero resulta que así es la tarea :(
  #4 (permalink)  
Antiguo 16/07/2013, 19:39
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Programación Orientada en Objetos de C++

damn! no se como te compila esa cosa si mezclas librerías propietarias de microsoft y borland.

De cualquier manera veo que muchos te problemas son porque no sabes que esta pasando exactamente.

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct nodo
  6. {
  7.     int datos;
  8.     nodo *sig;
  9.  
  10. };
  11.  
  12. class lista // Nueva clase - Lista
  13. {
  14.     private:
  15.         nodo *inicial;
  16.     public:
  17.         lista();   // La lista  - Publico
  18.         ~lista();  // ~La lista - Publico
  19.  
  20.         void crear_lista(nodo *anterior, nodo *nuevo); // Metodo "crear_lista" - Publico
  21.         void leer_nodo(nodo *nuevo); // Método - Leer nodo
  22.         void imprime_nodo(nodo *apun); // Cambio
  23.         void reco_iter(); // Cambio
  24. };
  25.  
  26. lista::lista()
  27. {
  28.     inicial=NULL; // Inicializa NULL
  29. }
  30.  
  31. void lista::leer_nodo(nodo *nuevo) // Método - Leer nodo
  32. {
  33.     cout<<"Entre valor del nodo"<<endl; // Permite ingresar la cantidad de Nodos
  34.     cin>>nuevo->datos;
  35. }
  36.  
  37. void lista::crear_lista(nodo *anterior, nodo *nuevo)
  38. {
  39.     if(anterior == NULL)
  40.     {
  41.         nuevo->sig = inicial;
  42.         leer_nodo(nuevo); // Lee 1ra vez
  43.         inicial = nuevo;
  44.     }
  45.     else
  46.     {
  47.         nuevo->sig = anterior->sig;
  48.         anterior->sig = nuevo;
  49.         leer_nodo(nuevo); // Lee N vez
  50.     }
  51. }
  52.  
  53. void lista::imprime_nodo(nodo *apun) // Cambio
  54. {
  55.     cout<<"El valor es :    "<<apun->datos<<endl;
  56. }
  57.  
  58. void lista::reco_iter() // Cambio
  59. {
  60.     nodo *apun = inicial;
  61.     while(apun != NULL)
  62.     {
  63.         imprime_nodo(apun); // Imprime valor nodo
  64.         apun = apun->sig;
  65.     }
  66. }
  67.  
  68. lista::~lista() // Metodo "borrar_lista" - Publico
  69. {
  70.     nodo *apun = inicial; // " * " es para crear nodo
  71.     while(apun != NULL)
  72.     {
  73.         cout << "borro" << endl;
  74.         inicial = apun->sig;
  75.         delete apun;
  76.         apun = inicial;
  77.     }
  78. }
  79.  
  80. int main()
  81. {
  82.     nodo *anterior, *nuevo, *apun;
  83.     lista objlista; // Dar memoria a la lista
  84.     char resp;
  85.     anterior = NULL;
  86.     do
  87.     {
  88.         nuevo = new nodo;
  89.         objlista.crear_lista(anterior, nuevo); // Nuevo metodo
  90.         anterior = nuevo;
  91.         cout<<"Desea crear otro nodo? (s/n) "<<endl;
  92.         cin>>resp ; resp=tolower(resp);
  93.     }while (resp != 'n');
  94.  
  95.     //inicio del recorrido de la lista
  96.     objlista.reco_iter();
  97.     objlista.~lista();
  98.     return 0;
  99. }
  #5 (permalink)  
Antiguo 16/07/2013, 21:15
 
Fecha de Ingreso: septiembre-2008
Mensajes: 221
Antigüedad: 15 años, 7 meses
Puntos: 1
Pregunta Respuesta: Programación Orientada en Objetos de C++

Gracias por tu respuesta, pero:

1. ¿Porqué quitar le "nodo *apun" a void reco_iter(nodo*apun) y quitar definitivamente "void borrar_lista(nodo *inicial);"?

Código C++:
Ver original
  1. void reco_iter(nodo *apun); // Cambio
  2.     void borrar_lista(nodo *inicial) ;

De esto

Código C++:
Ver original
  1. void lista::reco_iter(nodo *apun) // Cambio
  2. {
  3.     while(apun != NULL)
  4.     {
  5.         imprime_nodo(apun); // Imprime valor nodo
  6.         apun = apun->sig;
  7.     }
Pasas a esto:

Código C++:
Ver original
  1. void lista::reco_iter() // Cambio
  2.     {
  3.         nodo *apun = inicial;
  4.         while(apun != NULL)
  5.         {
  6.             imprime_nodo(apun); // Imprime valor nodo
  7.             apun = apun->sig;
  8.         }
  9.     }

2. ¿Porqué metes dentro el "nodo *apun = inicial;"?
3. ¿Porqué este cambio?

De esto:
Código C++:
Ver original
  1. nodo *apun; // " * " es para crear nodo
  2.     apun=inicial;

A esto:
Código C++:
Ver original
  1. nodo *apun = inicial; // " * " es para crear nodo

4. ¿Porqué de "void main()" pasas a "int main()"?
5. ¿Porqué de esto

Código C++:
Ver original
  1. apun = objlista.inicial;
  2.     objlista.reco_iter(apun);
  3.     objlista.borrar_lista(objlista.inicial)

Pasas a esto:

Código C++:
Ver original
  1. objlista.reco_iter();
  2.         objlista.~lista();
  3.         return 0;

Gracias por las aclaraciones :)
  #6 (permalink)  
Antiguo 16/07/2013, 23:22
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Programación Orientada en Objetos de C++

Primero que nada una disculpa por no explicar los cambios que hice, pensé que así como pusiste el código sin mas explicación también podrías entender los cambios sin mucha explicación.

Cita:
Iniciado por ambigus Ver Mensaje
1. ¿Porqué quitar le "nodo *apun" a void reco_iter(nodo*apun) y quitar definitivamente "void borrar_lista(nodo *inicial);"?


Código C++:
Ver original
  1. void reco_iter(nodo *apun); // Cambio
  2.     void borrar_lista(nodo *inicial) ;

De esto

Código C++:
Ver original
  1. void lista::reco_iter(nodo *apun) // Cambio
  2. {
  3.     while(apun != NULL)
  4.     {
  5.         imprime_nodo(apun); // Imprime valor nodo
  6.         apun = apun->sig;
  7.     }
Pasas a esto:

Código C++:
Ver original
  1. void lista::reco_iter() // Cambio
  2.     {
  3.         nodo *apun = inicial;
  4.         while(apun != NULL)
  5.         {
  6.             imprime_nodo(apun); // Imprime valor nodo
  7.             apun = apun->sig;
  8.         }
  9.     }
Veo que no comprendes aun bien el concepto de encapsulamiento. Dime, ¿Por que debo de pasarle y yo por mi parte mantener siempre el primer nodo de la lista, que no eso debería de ser transparente?

Cita:
Iniciado por ambigus Ver Mensaje
2. ¿Porqué metes dentro el "nodo *apun = inicial;"?
3. ¿Porqué este cambio?

De esto:
Código C++:
Ver original
  1. nodo *apun; // " * " es para crear nodo
  2.     apun=inicial;

A esto:
Código C++:
Ver original
  1. nodo *apun = inicial; // " * " es para crear nodo
Bueno la pregunta 2 y 3 es la misma pregunta. Ahora realmente me pregunto si tu escribiste este código. Es básico, una de las primeras cosas que vez cuando aprendes C o C++ que int x = 1; es igual que si tuvieras. int x; x = 1; simplemente es como una abreviación.

Cita:
Iniciado por ambigus Ver Mensaje
4. ¿Porqué de "void main()" pasas a "int main()"?
Como te dije antes, es porque no estas acostumbrado a los estándares, pero un estándar de C++ es que regresen un entero. 0 en caso que todo salio bien y cualquier otro valor si algo salio mal. De hecho no te debería de compilar con void main() con cualquier compilador de C++ minimamente decente.

Cita:
Iniciado por ambigus Ver Mensaje
5. ¿Porqué de esto

Código C++:
Ver original
  1. apun = objlista.inicial;
  2.     objlista.reco_iter(apun);
  3.     objlista.borrar_lista(objlista.inicial)

Pasas a esto:

Código C++:
Ver original
  1. objlista.reco_iter();
  2.         objlista.~lista();
  3.         return 0;
No tenias implementado borrar_lista solo tenias implementado el destructor. Así que mejor cambie la llamada de borrar_lista al destructor. Y el de reco_iter siempre obtenias objlista.inicial y luego se lo pasabas de parámetro al método entonces dije porque mejor no simplemente lo tomas internamente en la clase y ya.

Otra cosa trata de separar con una linea en blanco tus métodos porque todos juntos no se venia donde terminaba uno y donde empezaba otro.
  #7 (permalink)  
Antiguo 17/07/2013, 16:52
 
Fecha de Ingreso: septiembre-2008
Mensajes: 221
Antigüedad: 15 años, 7 meses
Puntos: 1
Pregunta Respuesta: Programación Orientada en Objetos de C++

Gracias por tu ayuda!.. Este es otro código. El cambio del anterior es que la función "recu_recur()" es una función Recursiva.

¿Porqué en la linea 66 me dice: "Error: Hay demasiados argumentos en la llamada a función"?

Código C++:
Ver original
  1. reco_recur(apun->sig); // Cambio - Nueva Funcion Recursiva


Código C++:
Ver original
  1. #include "stdafx.h"
  2. #include "iostream"
  3. #include <conio.h>
  4. using namespace System;
  5. using namespace std;
  6.      
  7.     struct nodo
  8.     {
  9.         int datos;
  10.         nodo *sig;
  11.      
  12.     };
  13.      
  14.     class lista // Nueva clase - Lista
  15.     {
  16.         private:
  17.             nodo *inicial;
  18.         public:
  19.             lista();   // La lista  - Publico
  20.             ~lista();  // ~La lista - Publico
  21.      
  22.             void crear_lista(nodo *anterior, nodo *nuevo); // Funcion "crear_lista" - Publico
  23.             void leer_nodo(nodo *nuevo); // Funcion - Leer nodo
  24.             void imprime_nodo(nodo *apun);
  25.             void reco_recur(); // Cambio - Nueva Funcion Recursiva
  26.     };
  27.      
  28.     lista::lista()
  29.     {
  30.         inicial=NULL; // Inicializa NULL
  31.     }
  32.      
  33.     void lista::leer_nodo(nodo *nuevo) // Método - Leer nodo
  34.     {
  35.         cout<<"Entre valor del nodo"<<endl; // Permite ingresar la cantidad de Nodos
  36.         cin>>nuevo->datos;
  37.     }
  38.      
  39.     void lista::crear_lista(nodo *anterior, nodo *nuevo)
  40.     {
  41.         if(anterior == NULL)
  42.         {
  43.             nuevo->sig = inicial;
  44.             leer_nodo(nuevo); // Lee 1ra vez
  45.             inicial = nuevo;
  46.         }
  47.         else
  48.         {
  49.             nuevo->sig = anterior->sig;
  50.             anterior->sig = nuevo;
  51.             leer_nodo(nuevo); // Lee N vez
  52.         }
  53.     }
  54.      
  55.     void lista::imprime_nodo(nodo *apun) // Cambio
  56.     {
  57.         cout<<"El valor es :    "<<apun->datos<<endl;
  58.     }
  59.      
  60.     void lista::reco_recur() // Cambio - Nueva Funcion Recursiva
  61.     {
  62.         nodo *apun = inicial;
  63.         if (apun != NULL)
  64.         {
  65.             imprime_nodo(apun); // Imprime valor nodo
  66.             reco_recur(apun->sig); // Cambio - Nueva Funcion Recursiva
  67.         }
  68.     }
  69.      
  70.     lista::~lista() // Metodo "borrar_lista" - Publico
  71.     {
  72.         nodo *apun = inicial; // " * " es para crear nodo
  73.         while(apun != NULL)
  74.         {
  75.             cout << "borro" << endl;
  76.             inicial = apun->sig;
  77.             delete apun;
  78.             apun = inicial;
  79.         }
  80.     }
  81.      
  82.     int main()
  83.     {
  84.         nodo *anterior, *nuevo, *apun;
  85.         lista objlista; // Dar memoria a la lista
  86.         char resp;
  87.         anterior = NULL;
  88.         do
  89.         {
  90.             nuevo = new nodo;
  91.             objlista.crear_lista(anterior, nuevo); // Nuevo metodo
  92.             anterior = nuevo;
  93.             cout<<"Desea crear otro nodo? (s/n) "<<endl;
  94.             cin>>resp;
  95.             resp=tolower(resp);
  96.         }while (resp != 'n');
  97.         //inicio del recorrido de la lista
  98.         objlista.reco_recur();
  99.         getch();
  100.         objlista.~lista();
  101.         return 0;
  102.     }
  #8 (permalink)  
Antiguo 17/07/2013, 17:21
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Programación Orientada en Objetos de C++

Porque evidentemente le estas pasando mas argumentos de los que espera recibir la función.

Lo arreglaría de la siguiente manera:
Código C++:
Ver original
  1. void lista::reco_recur() // Cambio - Nueva Funcion Recursiva
  2.     {
  3.         reco_recur(inicial);
  4.     }
  5.  
  6. void lista::reco_recur(nodo *apun) // Cambio - Nueva Funcion Recursiva
  7.     {
  8.         if (apun != NULL)
  9.         {
  10.             imprime_nodo(apun); // Imprime valor nodo
  11.             reco_recur(apun->sig); // Cambio - Nueva Funcion Recursiva
  12.         }
  13.     }

No olvides añadir las declaraciones de funciones correspondientes.
  #9 (permalink)  
Antiguo 17/07/2013, 17:49
 
Fecha de Ingreso: septiembre-2008
Mensajes: 221
Antigüedad: 15 años, 7 meses
Puntos: 1
Pregunta Respuesta: Programación Orientada en Objetos de C++

Una vez más el mismo problema de "Demasiadas llamadas a la función".... :(



En Flirck: http://farm4.staticflickr.com/3794/9...68d34e43_o.png

¿Porqué sucede esto?, ¿A qué te refieres con las "declaraciones"?

NOTA: Esto es una tarea. No tengo ni idea de cómo se programa en C++ :( Sin embargo, tengo un mínimo conocimiento en Java. Pero la tarea es en C++ :(
  #10 (permalink)  
Antiguo 17/07/2013, 18:17
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Programación Orientada en Objetos de C++

Como te dije en el post anterior. No agregaste la declaración de la función y no necesitas pasarle argumentos.

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.      
  5.     struct nodo
  6.     {
  7.         int datos;
  8.         nodo *sig;
  9.      
  10.     };
  11.      
  12.     class lista // Nueva clase - Lista
  13.     {
  14.         private:
  15.             nodo *inicial;
  16.         public:
  17.             lista();   // La lista  - Publico
  18.             ~lista();  // ~La lista - Publico
  19.      
  20.             void crear_lista(nodo *anterior, nodo *nuevo); // Funcion "crear_lista" - Publico
  21.             void leer_nodo(nodo *nuevo); // Funcion - Leer nodo
  22.             void imprime_nodo(nodo *apun);
  23.             void reco_recur(); // Cambio - Nueva Funcion Recursiva
  24.             void reco_recur(nodo *apun); // Cambio - Nueva Funcion Recursiva
  25.  
  26.     };
  27.      
  28.     lista::lista()
  29.     {
  30.         inicial=NULL; // Inicializa NULL
  31.     }
  32.      
  33.     void lista::leer_nodo(nodo *nuevo) // Método - Leer nodo
  34.     {
  35.         cout<<"Entre valor del nodo"<<endl; // Permite ingresar la cantidad de Nodos
  36.         cin>>nuevo->datos;
  37.     }
  38.      
  39.     void lista::crear_lista(nodo *anterior, nodo *nuevo)
  40.     {
  41.         if(anterior == NULL)
  42.         {
  43.             nuevo->sig = inicial;
  44.             leer_nodo(nuevo); // Lee 1ra vez
  45.             inicial = nuevo;
  46.         }
  47.         else
  48.         {
  49.             nuevo->sig = anterior->sig;
  50.             anterior->sig = nuevo;
  51.             leer_nodo(nuevo); // Lee N vez
  52.         }
  53.     }
  54.      
  55.     void lista::imprime_nodo(nodo *apun) // Cambio
  56.     {
  57.         cout<<"El valor es :    "<<apun->datos<<endl;
  58.     }
  59.  
  60.     void lista::reco_recur()
  61.     {
  62.         reco_recur(inicial);
  63.     }
  64.      
  65.     void lista::reco_recur(nodo *apun) // Cambio - Nueva Funcion Recursiva
  66.     {
  67.         if (apun != NULL)
  68.         {
  69.             imprime_nodo(apun); // Imprime valor nodo
  70.             reco_recur(apun->sig); // Cambio - Nueva Funcion Recursiva
  71.         }
  72.     }
  73.      
  74.     lista::~lista() // Metodo "borrar_lista" - Publico
  75.     {
  76.         nodo *apun = inicial; // " * " es para crear nodo
  77.         while(apun != NULL)
  78.         {
  79.             cout << "borro" << endl;
  80.             inicial = apun->sig;
  81.             delete apun;
  82.             apun = inicial;
  83.         }
  84.     }
  85.      
  86.     int main()
  87.     {
  88.         nodo *anterior, *nuevo, *apun;
  89.         lista objlista; // Dar memoria a la lista
  90.         char resp;
  91.         anterior = NULL;
  92.         do
  93.         {
  94.             nuevo = new nodo;
  95.             objlista.crear_lista(anterior, nuevo); // Nuevo metodo
  96.             anterior = nuevo;
  97.             cout<<"Desea crear otro nodo? (s/n) "<<endl;
  98.             cin>>resp;
  99.             resp=tolower(resp);
  100.         }while (resp != 'n');
  101.         //inicio del recorrido de la lista
  102.         objlista.reco_recur();
  103.         objlista.~lista();
  104.         return 0;
  105.     }
  #11 (permalink)  
Antiguo 17/07/2013, 18:45
 
Fecha de Ingreso: septiembre-2008
Mensajes: 221
Antigüedad: 15 años, 7 meses
Puntos: 1
De acuerdo Respuesta: Programación Orientada en Objetos de C++

Dios te bendiga hermano!!!!

Verdaderamente estoy en deuda :) Espero algún día poder recompensarte.

Tengo diversos conocimientos de optimización por experiencia y varias utilidades en la computación.

Apenas estoy apreniendo a programar y agradesco eternamente tu paciencia y comprensión :)

Se que esto está fuera del tema. Pero me gustaría compartirte los diversos recursos que tanto trabajo me ha costado encontrar y comprender :) Aquí una captura de pantalla que evidencia su efectividad :)



http://farm3.staticflickr.com/2869/9...91345600_o.png

Solicito que porfavor el tema aún no sea cerrado debido a que me faltan todavía dos "Códigos"

Gracias de antemano
  #12 (permalink)  
Antiguo 17/07/2013, 21:38
 
Fecha de Ingreso: septiembre-2008
Mensajes: 221
Antigüedad: 15 años, 7 meses
Puntos: 1
Pregunta Respuesta: Programación Orientada en Objetos de C++

Gracias, una duda:

¿Porqué me dice en las lineas 114 y 123 -> el identificador "leer_nodo" no esta definido?, ¿Cómo lo defino? Si anteriormente sólo definia void lista::función

¿Porqué también me dice en la linea 160-> el identificador "inicial" no está definido?

Código C++:
Ver original
  1. #include "stdafx.h"
  2. #include "iostream"
  3. #include <conio.h>
  4. using namespace System;
  5. using namespace std;
  6.      
  7.     struct nodo
  8.     {
  9.         int   codigo; // Nuevo
  10.         char *nombre; // Nuevo
  11.         int   nivel; // Nuevo
  12.         nodo *sig;
  13.      
  14.     };
  15.      
  16.     class lista // Nueva clase - Lista
  17.     {
  18.         private:
  19.             nodo *inicial;
  20.         public:
  21.             lista();   // La lista  - Publico
  22.             ~lista();  // ~La lista - Publico
  23.      
  24.             void crear_lista(nodo *anterior, nodo *nuevo); // Funcion "crear_lista" - Publico
  25.             void leer_nodo(nodo *nuevo); // Funcion - Leer nodo
  26.             void imprime_nodo(nodo *apun);
  27.             void reco_recur(); // Cambio - Nueva Funcion Recursiva
  28.             void reco_recur(nodo *apun); // Cambio - Nueva Funcion Recursiva
  29.            
  30.     };
  31.      
  32.     lista::lista()
  33.     {
  34.         inicial=NULL; // Inicializa NULL
  35.     }
  36.  
  37.     /////////////////////////////////////////////////////
  38.     void lista::leer_nodo(nodo *nuevo) // Método - Leer nodo
  39.     {
  40.         cout<<"Entre codigo del estudiante"<<endl;  // Nuevo
  41.         cin>>nuevo->codigo;                         // Nuevo
  42.         cout<<"Entre nombre del estudiante"<<endl;  // Nuevo
  43.         cin.ignore();                               // Nuevo
  44.         nuevo->nombre=new char[30];                 // Nuevo
  45.         cin.getline(nuevo->nombre,30);              // Nuevo
  46.         cout<<"Entre nivel del estudiante"<<endl;   // Nuevo
  47.         cin>>nuevo->nivel; 
  48.     }
  49.  
  50.     /////////////////////////////////////////////////////
  51.     void lista::crear_lista(nodo *anterior, nodo *nuevo)
  52.     {
  53.         if(anterior == NULL)
  54.         {
  55.             nuevo->sig = inicial;
  56.             leer_nodo(nuevo); // Lee 1ra vez
  57.             inicial = nuevo;
  58.         }
  59.         else
  60.         {
  61.             nuevo->sig = anterior->sig;
  62.             anterior->sig = nuevo;
  63.             leer_nodo(nuevo); // Lee N vez
  64.         }
  65.     }
  66.  
  67.     /////////////////////////////////////////////////////
  68.     void lista::imprime_nodo(nodo *apun) // Cambio
  69.     {
  70.         cout<<"-----------------------------"<<endl;
  71.         cout<<"El codigo es:     "<<apun->codigo<<endl;
  72.         cout<<"El nombre es:     "<<apun->nombre<<endl;
  73.         cout<<"El nivel  es:     "<<apun->nivel<<endl;
  74.         cout<<"-----------------------------"<<endl;
  75.        
  76.     }
  77.  
  78.     /////////////////////////////////////////////////////
  79.     void lista::reco_recur() // Cambio - Nueva Funcion Recursiva - Se crea debido a conflictos con la recursividad en la forma Estructural
  80.         {
  81.             reco_recur(inicial);
  82.         }
  83.    
  84.     /////////////////////////////////////////////////////
  85.     void lista::reco_recur(nodo *apun) // Cambio - Nueva Funcion Recursiva
  86.         {
  87.             if (apun != NULL)
  88.             {
  89.                 imprime_nodo(apun); // Imprime valor nodo
  90.                 reco_recur(apun->sig); // Cambio - Nueva Funcion Recursiva
  91.             }
  92.         }
  93.      
  94.  
  95.     /////////////////////////////////////////////////////
  96. nodo *buscar_nodo(nodo *apun,int &codigo)
  97. {
  98.     while(apun != NULL)
  99.     {
  100.         if(apun->codigo==codigo)return apun;
  101.         else apun=apun->sig;
  102.     }
  103.     return NULL;
  104. }
  105.  
  106. /////////////////////////////////////////////////////
  107. nodo *agregar_nodo(nodo *anterior,nodo *nuevo,int &codigo)
  108. {
  109.     if(codigo == 0)
  110.     {
  111.         //agrega al inicio de la lista
  112.         nuevo->sig=anterior;
  113.         anterior=nuevo;
  114.         leer_nodo(nuevo);
  115.         return anterior;
  116.     }
  117.     else
  118.     {
  119.         //Agrega despues del primero, segundo,..., o último
  120.         //elemento de la lista
  121.         nuevo->sig=anterior->sig;
  122.         anterior->sig=nuevo;
  123.         leer_nodo(nuevo);
  124.         return anterior;
  125.     }
  126. };
  127.  
  128.  
  129.     lista::~lista() // Metodo "borrar_lista" es el desctructivo- Publico
  130.     {
  131.         nodo *apun = inicial; // " * " es para crear nodo
  132.         while(apun != NULL)
  133.         {
  134.             cout << "borro" << endl;
  135.             inicial = apun->sig;
  136.             delete apun;
  137.             apun = inicial;
  138.         }
  139.     }
  140.      
  141.     int main()
  142.     {
  143.         nodo *anterior, *nuevo, *apun; char resp; anterior=NULL;
  144.         lista objlista; // Dar memoria a la lista
  145.         cout<<"EMPIEZA A CREAR LA LISTA ORIGINAL"<<endl<<endl;;
  146.         do
  147.         {
  148.             nuevo = new nodo;
  149.             objlista.crear_lista(anterior, nuevo); 
  150.             anterior = nuevo;
  151.             cout<<endl ;
  152.             cout<<"DESEA CREAR OTRO NODO? (s/n) "<<endl<<endl;;
  153.             cin>>resp;
  154.             resp=tolower(resp);
  155.         }while(resp != 'n');
  156.  
  157.         //inicio del recorrido de la lista
  158.         cout<<"LA LISTA ORIGINALMENTE CREADA ES : "<<endl;
  159.         apun = inicial;
  160.         objlista.reco_recur();
  161.         //inicio de la agregación de nuevos nodos
  162.         cout<<endl ;
  163.         cout<<"INICIO DE LA AGREGACION DE NUEVOS NODOS A LA LISTA ORIGINAL"<<endl;
  164.         int codigo;
  165.         apun=inicial;
  166.         do
  167.         {
  168.                 cout<<endl;
  169.                 cout<<"Entre codigo clave (Digite 0 si va agregar a la cabeza de la lista,"<<endl;
  170.                 cout<<"en caso contrario digite el codigo del nodo anterior al que va a crear) "<<endl<<endl;
  171.                
  172.                 cin>>codigo ;
  173.                 if(codigo==0)
  174.                 {
  175.                     nuevo =new nodo;   
  176.                     inicial = agregar_nodo(inicial,nuevo,codigo);
  177.                 }
  178.                 else
  179.                 {
  180.                     anterior=inicial;
  181.                     anterior = buscar_nodo(anterior,codigo);
  182.                 if(anterior!=NULL)
  183.                 {
  184.                     nuevo =new nodo;
  185.                     anterior = agregar_nodo(anterior,nuevo,codigo);
  186.                 }
  187.                 else cout<<"El nodo no ha sido encontrado "<<endl;
  188.                 }
  189.                 cout<<"DESEA AGREGAR OTRO NODO (s/n)"<<endl;
  190.                 cin>>resp;
  191.                 resp=tolower(resp);
  192.         }while(resp != 'n');
  193.  
  194.         cout<< "LA LISTA COMPLETA ES: "<<endl;
  195.         apun = inicial;
  196.         objlista.reco_recur();
  197.         getch();
  198.         objlista.~lista();
  199.         return 0;
  200. }
  #13 (permalink)  
Antiguo 17/07/2013, 22:13
 
Fecha de Ingreso: septiembre-2008
Mensajes: 221
Antigüedad: 15 años, 7 meses
Puntos: 1
Pregunta Respuesta: Programación Orientada en Objetos de C++

¿Qué hay de mal en este código?, ¿Porqué no me elimina al estudiante que le digito el código?

Código C++:
Ver original
  1. #include "stdafx.h"
  2. #include "iostream"
  3. #include <conio.h>
  4. using namespace System;
  5. using namespace std;
  6. struct nodo
  7. {
  8.     int   codigo; // Nuevo
  9.     char *nombre; // Nuevo
  10.     int   nivel; // Nuevo
  11.     nodo *sig; // Nuevo
  12. };
  13.  
  14. nodo *inicial=NULL;
  15. /////////////////////////////////////////////////////
  16. void leer_nodo(nodo *nuevo)
  17. {
  18.     cout<<"Entre codigo del estudiante"<<endl;  // Nuevo
  19.     cin>>nuevo->codigo;                         // Nuevo
  20.     cout<<"Entre nombre del estudiante"<<endl;  // Nuevo
  21.     cin.ignore();                               // Nuevo
  22.     nuevo->nombre=new char[30];                 // Nuevo
  23.     cin.getline(nuevo->nombre,30);              // Nuevo
  24.     cout<<"Entre nivel del estudiante"<<endl;   // Nuevo
  25.     cin>>nuevo->nivel;                          // Nuevo
  26. }
  27.  
  28. /////////////////////////////////////////////////////
  29. void crear_lista(nodo *anterior, nodo *nuevo)
  30. {
  31.     if(anterior == NULL)
  32.     {
  33.         nuevo->sig = inicial;
  34.         leer_nodo(nuevo);
  35.         inicial = nuevo;
  36.     }
  37.     else
  38.     {
  39.         nuevo->sig = anterior->sig;
  40.         anterior->sig = nuevo;
  41.         leer_nodo(nuevo);
  42.     }
  43. }
  44.  
  45. /////////////////////////////////////////////////////
  46. void imprime_nodo(nodo *apun)
  47. {
  48.     cout<<"-----------------------------"<<endl;
  49.     cout<<"El codigo es:     "<<apun->codigo<<endl;
  50.     cout<<"El nombre es:     "<<apun->nombre<<endl;
  51.     cout<<"El nivel  es:     "<<apun->nivel<<endl;
  52.     cout<<"-----------------------------"<<endl;
  53. }
  54.  
  55. /////////////////////////////////////////////////////
  56. void reco_recur(nodo *apun)
  57. {
  58.     if (apun != NULL)
  59.     {
  60.         imprime_nodo(apun);
  61.         reco_recur(apun->sig);
  62.     }
  63. }
  64.  
  65. /////////////////////////////////////////////////////
  66. void borrar_lista(nodo *apun)
  67. {
  68.     nodo *inicial;
  69.     while(apun != NULL)
  70.     {
  71.         inicial=apun->sig;
  72.         delete apun;
  73.         apun=inicial;
  74.     }
  75. }
  76.  
  77. /////////////////////////////////////////////////////
  78. nodo *buscar_nodo(nodo *apun,int &codigo)
  79. {
  80.     while(apun != NULL)
  81.     {
  82.         if(apun->codigo==codigo)return apun;
  83.         else apun=apun->sig;
  84.     }
  85.     return NULL;
  86. }
  87.  
  88. ////////// INVENTADO ////////////////////////
  89. nodo *eliminar_nodo(nodo *apun,int &codigo)
  90. {
  91.     nodo *aux;
  92.     aux=inicial;
  93.  
  94.     while(aux->sig != apun)aux=aux->sig;
  95.     aux->sig = apun ->sig;
  96.     delete apun;
  97.     return NULL;
  98. }
  99.  
  100. /////////////////////////////////////////////////////
  101. nodo *agregar_nodo(nodo *anterior,nodo *nuevo,int &codigo)
  102. {
  103.     if(codigo == 0)
  104.     {
  105.         //agrega al inicio de la lista
  106.         nuevo->sig=anterior;
  107.         anterior=nuevo;
  108.         leer_nodo(nuevo);
  109.         return anterior;
  110.     }
  111.     else
  112.     {
  113.         //Agrega despues del primero, segundo,..., o último
  114.         //elemento de la lista
  115.         nuevo->sig=anterior->sig;
  116.         anterior->sig=nuevo;
  117.         leer_nodo(nuevo);
  118.         return anterior;
  119.     }
  120. };
  121.  
  122.  /////////////////////////////////////////////////////
  123. void main()
  124. {
  125.     nodo *anterior, *nuevo, *apun; char resp; anterior=NULL;
  126.     cout<<"EMPIEZA A CREAR LA LISTA ORIGINAL"<<endl<<endl;;
  127.     do
  128.     {
  129.         nuevo = new nodo;
  130.         crear_lista(anterior, nuevo);
  131.         anterior = nuevo;
  132.         cout<<endl ;
  133.         cout<<"DESEA CREAR OTRO NODO? (s/n) "<<endl<<endl;;
  134.         cin>>resp;
  135.         resp=tolower(resp);
  136.     }while(resp != 'n');
  137.  
  138.     //inicio del recorrido de la lista
  139.     cout<<"LA LISTA ORIGINALMENTE CREADA ES : "<<endl;
  140.     apun = inicial;
  141.     reco_recur(apun);
  142.     //inicio de la agregación de nuevos nodos
  143.     cout<<endl ;
  144.     cout<<"INICIO DE LA AGREGACION DE NUEVOS NODOS A LA LISTA ORIGINAL"<<endl;
  145.     int codigo;
  146.     apun=inicial;
  147.     do
  148.     {
  149.         cout<<endl;
  150.         cout<<"Entre codigo clave (Digite 0 si va agregar a la cabeza de la lista,"<<endl;
  151.         cout<<"en caso contrario digite el codigo del nodo anterior al que va a crear) "<<endl<<endl;
  152.        
  153.         cin>>codigo ;
  154.         if(codigo==0)
  155.         {
  156.             nuevo =new nodo;
  157.             inicial = agregar_nodo(inicial,nuevo,codigo);
  158.         }
  159.         else
  160.         {
  161.             anterior=inicial;
  162.             anterior = buscar_nodo(anterior,codigo);
  163.             if(anterior!=NULL)
  164.             {
  165.                 nuevo =new nodo;
  166.                 anterior = agregar_nodo(anterior,nuevo,codigo);
  167.             }
  168.             else cout<<"El nodo no ha sido encontrado "<<endl;
  169.         }
  170.         cout<<"DESEA AGREGAR OTRO NODO (s/n)"<<endl;
  171.         cin>>resp;
  172.         resp=tolower(resp);
  173.     }while(resp != 'n');
  174.  
  175.     cout<< "LA LISTA COMPLETA ES: "<<endl;
  176.     apun = inicial;
  177.     reco_recur(apun);
  178.  
  179.         //inicio de la agregación de nuevos nodos
  180.     cout<<endl ;
  181.     cout<<"INICIO DE LA ELIMINACION DE NODOS DE LA LISTA ACTUAL"<<endl;
  182.    
  183.     apun=inicial;
  184.     do
  185.     {
  186.         cout<<endl;
  187.         cout<<"Entre codigo clave (Digite el codigo del estudiante que va a eliminar) "<<endl<<endl;
  188.        
  189.         cin>>codigo ;
  190.  
  191.         anterior=inicial;
  192.         anterior = buscar_nodo(anterior,codigo);
  193.  
  194.         if(anterior!=NULL)
  195.         {
  196.             anterior = eliminar_nodo(anterior,codigo);
  197.             if ( anterior==NULL)
  198.             {
  199.                 cout<<"El nodo ha sido eliminado existosamente "<<endl;
  200.             }
  201.         }
  202.         else cout<<"El nodo no ha sido encontrado "<<endl;
  203.        
  204.         cout<<"DESEA ELIMINAR OTRO NODO (s/n)"<<endl;
  205.         cin>>resp;
  206.         resp=tolower(resp);
  207.     }while(resp != 'n');
  208.  
  209.     cout<< "LA LISTA COMPLETA ES: "<<endl;
  210.     apun = inicial;
  211.     reco_recur(apun);
  212.  
  213.     getch();
  214.     borrar_lista(inicial);
  215. }

Etiquetas: int, objetos, orientada, programa, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:09.