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

[SOLUCIONADO] Error a mostrar pila

Estas en el tema de Error a mostrar pila en el foro de C/C++ en Foros del Web. Buenas noches comunidad de Forosweb, espero estén bien tengo un problema en el momento de crear la pila, no se que estoy aplicando mal, llevo ...
  #1 (permalink)  
Antiguo 30/03/2014, 21:59
 
Fecha de Ingreso: junio-2009
Ubicación: House
Mensajes: 38
Antigüedad: 14 años, 11 meses
Puntos: 1
Error a mostrar pila

Buenas noches comunidad de Forosweb, espero estén bien tengo un problema en el momento de crear la pila, no se que estoy aplicando mal, llevo unas cuantas horas revisando y leyendo conceptos de apuntadores pero no consigo el error, he creado un programita para inicializar la pila, agregar elementos y remover, me inicia, agrega los elementos y los remueve sin embargo en el momento de mostrar los valores de la pila solo me muestra el ultimo valor ingresado seguido de cero, y cuando voy a eliminar elementos de la pila solo me muestra el ultimo valor agregado y lo demás en 0 ejemplo, si inicio la pila para 4 elementos 1 2 3 4, me muestra 4 0 0 0, y al querer eliminar la pila, elimina cada elemento pero me imprime en pantalla solamente el ultimo elemento ingresado en pantalla dejo el código para que me orienten, gracias de antemano
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4.  
  5. void crearpila (void);
  6. void agregar(void);
  7. void removerpila(void);
  8. void verpila(void);
  9. void mayor(void);
  10. void vaciar(void);
  11.  
  12. int *pila,pilaon=0,ele,arrepila[20],cont=0;
  13.  
  14. main()
  15. {
  16. int re;
  17. char r;
  18. do
  19. {
  20. pila=arrepila;
  21. printf("Programa pila\n\n\n");
  22. printf("\n1. Crear pila\n");
  23. printf("2. Agregar elementos a la pila\n");
  24. printf("3. Remover elementos de la pila\n");
  25. printf("4. Visualizar elementos de la pila\n");
  26. printf("5. Visualizar la cima de la pila\n");
  27. printf("6. Vaciar la pila\n");
  28. printf("7. Salir\n");
  29. printf("Escoja una opcion por favor...\n");
  30. scanf("%d",&re);
  31.  
  32.     switch(re)
  33.      {
  34.         case 1:
  35.             crearpila();
  36.             break;
  37.         case 2:
  38.             agregar();
  39.             break;
  40.         case 3:
  41.             removerpila();
  42.             break;
  43.         case 4:
  44.             verpila();
  45.             break;
  46.      }
  47. }
  48. while (re!=7);
  49. }
  50.  
  51. void crearpila(void)
  52. {
  53. if (pilaon==NULL)
  54.     {
  55.      system("cls");
  56.       puts("Cuantos elementos desea agregar a la pila\n");
  57.      scanf("%d",&ele);
  58.      printf("Se ha creado la pila de %d elementos",ele);
  59.      pilaon=1;
  60.      getch();
  61.      system("cls");
  62.  
  63.     }
  64.     else
  65.     {
  66.         puts("Ya ha creado la pila anteriormente. Vacie la pila para poder crear una nueva.");  
  67.     }
  68.  
  69. }
  70.  
  71. void agregar(void)
  72. {
  73. if (pilaon==NULL)
  74. {
  75. puts("Debe crear una pila primero");
  76. system("cls");
  77. }
  78.  
  79. else
  80. {
  81.  
  82.    
  83.     if(cont==ele)
  84.     {
  85.     puts("La pila se encuentra llena");
  86.     getch(); system("cls");
  87.     }
  88.    
  89.     else
  90.     {
  91.     system("cls");
  92.     puts("Ingrese elemento");
  93.     scanf("%d",&*(pila));
  94.     pila++;
  95.     cont++;
  96.     printf("Elemento ingresado correctamente");
  97.     getch();
  98.     system("cls");
  99.    
  100.     }      
  101.    
  102. }
  103. }
  104.  
  105. void removerpila(void)
  106. {
  107.  
  108.     if (pilaon==NULL)
  109.     {
  110.         printf("No hay elementos en la pila");
  111.     }
  112.     else
  113.     {
  114.         printf("El elemento %d ha sido removido",*(pila));
  115.         pila--;
  116.         cont--;
  117.             if(cont==0)
  118.             {
  119.             pilaon=NULL;
  120.             }
  121.     }
  122.    
  123.  
  124.  
  125. }
  126.  
  127. void verpila(void)
  128. {
  129. for (int i=0;i<cont;i++)
  130. {
  131. printf("%d ",*(pila-i));   
  132. }
  133.  
  134.  
  135. }
  #2 (permalink)  
Antiguo 30/03/2014, 22:29
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 11 meses
Puntos: 61
Respuesta: Error a mostrar pila

do - while es un ciclo.
Por cada "vuelta" de ese ciclo haces pila=arrepila;
o sea, todas las veces llevas el puntero al mismo lugar. ¿Era esa la intencion?
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 30/03/2014, 22:57
 
Fecha de Ingreso: junio-2009
Ubicación: House
Mensajes: 38
Antigüedad: 14 años, 11 meses
Puntos: 1
Respuesta: Error a mostrar pila

Hola Calgary gracias por tu observación y efectivamente ya he resuelto el problema por un descuido, estuve varias horas bueno ya he realizado la pila me ha quedado así
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4.  
  5. void crearpila (void);
  6. void agregar(void);
  7. void removerpila(void);
  8. void verpila(void);
  9. void mayor(void);
  10. void espacio(void);
  11.  
  12. int *pila,pilaon=0,ele,arrepila[20],cont=0;
  13.  
  14. main()
  15. {
  16. int re;
  17. char r;
  18. pila=arrepila;
  19. do
  20. {
  21.  
  22. printf("Programa pila\n\n\n");
  23. printf("\n1. Crear pila\n");
  24. printf("2. Agregar elementos a la pila\n");
  25. printf("3. Remover elementos de la pila\n");
  26. printf("4. Visualizar elementos de la pila\n");
  27. printf("5. Visualizar la cima de la pila\n");
  28. printf("6. Mostrar espacio de la pila\n");
  29. printf("7. Salir\n");
  30. printf("Escoja una opcion por favor...\n");
  31. scanf("%d",&re);
  32.  
  33.     switch(re)
  34.      {
  35.         case 1:
  36.             crearpila();
  37.             break;
  38.         case 2:
  39.             agregar();
  40.             break;
  41.         case 3:
  42.             removerpila();
  43.             break;
  44.         case 4:
  45.             verpila();
  46.             break;
  47.         case 5:
  48.             mayor();
  49.                break;
  50.         case 6:
  51.             espacio();
  52.                     break;
  53.      }
  54. }
  55. while (re!=7);
  56. }
  57.  
  58. void crearpila(void)
  59. {
  60. if (pilaon==NULL)
  61.     {
  62.      system("cls");
  63.       puts("Cuantos elementos desea agregar a la pila\n");
  64.      scanf("%d",&ele);
  65.      printf("Se ha creado la pila de %d elementos",ele);
  66.      pilaon=1;
  67.      getch();
  68.      system("cls");
  69.  
  70.     }
  71.     else
  72.     {
  73.         puts("Ya ha creado la pila anteriormente. Vacie la pila para poder crear una nueva.");  
  74.     }
  75.  
  76. }
  77.  
  78. void agregar(void)
  79. {
  80. if (pilaon==NULL)
  81. {
  82. puts("Debe crear una pila primero");
  83. system("cls");
  84. }
  85.  
  86. else
  87. {
  88.  
  89.    
  90.     if(cont==ele)
  91.     {
  92.     puts("La pila se encuentra llena");
  93.     getch(); system("cls");
  94.     }
  95.    
  96.     else
  97.     {
  98.     system("cls");
  99.     puts("Ingrese elemento");
  100.     scanf("%d",&*(pila));
  101.     pila++;
  102.     cont++;
  103.     printf("Elemento ingresado correctamente");
  104.     getch();
  105.     system("cls");
  106.    
  107.     }      
  108.    
  109. }
  110. }
  111.  
  112. void removerpila(void)
  113. {
  114.  
  115.     if (pilaon==NULL)
  116.     {
  117.         printf("No hay elementos en la pila");
  118.     }
  119.     else
  120.     {
  121.         printf("El elemento %d ha sido removido",*(pila-1));
  122.         pila--;
  123.         cont--;
  124.             if(cont==0)
  125.             {
  126.             pilaon=NULL;
  127.             }
  128.     }
  129.    
  130.  
  131.  
  132. }
  133.  
  134. void verpila(void)
  135. {
  136.     int a=1;
  137. for (int i=0;i<cont;i++)
  138. {
  139. printf("%d ",*(pila-a));   
  140. a++;
  141. }
  142.  
  143.  
  144. }
  145.  
  146. void mayor(void)
  147. {
  148. system("cls");
  149. printf("%d ",*(pila-1));
  150. }
  151.  
  152. void espacio(void)
  153. {
  154.     int espacio;
  155.  if (cont==ele)
  156.  {
  157.     puts("Pila esta llena");
  158.  } 
  159.  else
  160.  {
  161.     espacio=ele-cont;
  162.     printf("Quedan %d espacios en la pila",espacio);
  163.  }
  164. }
Mi pregunta es ¿esta bien hecha? como podría mejorarla mas, Gracias de antemano

Última edición por RaKKoS; 30/03/2014 a las 23:04
  #4 (permalink)  
Antiguo 31/03/2014, 07:18
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 11 meses
Puntos: 61
Respuesta: Error a mostrar pila

Si pasaras a C++ tu codigo, podrias usar varias mejoras, sino en C hay algunas alternativas:

- Solo puedes tener 1 pila en tu programa. Mejor seria guardar todo al interior de una clase que permitiera tener mas de 1 y esconda las variables para su manejo al interior de ella. La alternativa hecha en C es definir una struct y que las funciones reciban como parametro a esa struct que modifican internamente. El programa principal se encargaria de pasar a las funciones cada vez.

- Solo puedes tener pilas de enteros. Mejor seria usar templates y permitir que quien use la pila defina que tipos de datos se guardan al interior.

- pilaon es un entero, mientras que NULL tipicamente es el puntero a nada. pilaon parece ser un tipo bool, el que ya existe en C++.

- La indentacion del codigo que presentas requiere mejoras. Deja la misma cantidad de espacios al abrir una llave, si usas tabs + espacios, se vera mal para quienes definan una cantidad de tabs distintos a los que te gustan, mejor usar espacios solamente.

y otras posibilidades:
- Incluye funciones que prueben la pila sin usar el menu, sino que directamente usen las funciones para manejar la cola y prueben que lo basico funciona.
__________________
Visita mi perfil en LinkedIn
  #5 (permalink)  
Antiguo 31/03/2014, 09:19
 
Fecha de Ingreso: junio-2009
Ubicación: House
Mensajes: 38
Antigüedad: 14 años, 11 meses
Puntos: 1
Respuesta: Error a mostrar pila

Gracias Calgary pos tus interesantes observaciones, practicare aplicando esas sugerencias que me has mencionado a si que me tocara investigar un poco sobre templates lo que no me quedo del todo claro fue tu ultima observación

Cita:
y otras posibilidades:
- Incluye funciones que prueben la pila sin usar el menu, sino que directamente usen las funciones para manejar la cola y prueben que lo basico funciona.
Gracias de igual forma

Etiquetas: Ninguno
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 13:07.