Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: charmedever en 19 Octubre 2011, 00:52 am



Título: Pilas C++ usando Estructuras (STRUCT)
Publicado por: charmedever en 19 Octubre 2011, 00:52 am
Hola q tal pueden ayudarme el programa debe de permitir insertar 4 elementos y despues visualizarlos de acuerdo al orden en que fueron insertados
 Anexo el codigo para q me digan mis errores
//IMPLEMENTA UNA PILA
# include <iostream.h>
# include <conio.h>
# include <stdlib.h>

//prototipos de función
void llenar(char a);
char extraer();

const int tam=4;
char tope=-1;
char pila[tam];

int main()
{
  char a;

  cout<<"LLENAR PILA"<<endl;

  while(tope<tam)
  {
   cin>>a;
   llenar(a);
  }

  cout<<"Pulsar cualquier tecla para continuar";
  getche();
 
  system ("CLS");

  cout<<"Datos de la pila"<<endl;

  extraer();
  getche ();
  return -9;
}//fin main()

void llenar(char a)
{
  if(tope+1 >= tam)
      cout<<"Pila llena"<<endl;

  pila[++tope]=a;
}

char extraer()
{
  while(tope>=0)
  {
   cout<<pila[tope--]<<endl;
   getche ();

   if(tope==-1)
      cout<<"Pila vacia";

  }
}


Título: Re: Pilas C++ usando Estructuras (STRUCT)
Publicado por: CeroX901 en 19 Octubre 2011, 01:30 am
y donde está el struct ??

-Usar getche(); para pausar la aplicacion?, mejor usa system("pause");

-La declaracion de la librería iostream, está mal hecha, es sin el .h

-En main retornas -9?

-La funcion extraer debe devolver un valor char, no devuelve nada.

Y por ultimo te recomiendo usar string en ves de char para esta ocasion.

PD: cuando vayas a insertar codigo utiliza las etiquetas correspondientes, donde aparece GeSHi en crear mensaje..

Salud2



Título: Re: Pilas C++ usando Estructuras (STRUCT)
Publicado por: charmedever en 19 Octubre 2011, 23:09 pm
Modifique el codigo como me dijiste
Código
  1. //IMPLEMENTA UNA PILA
  2. # include <iostream.h>
  3. # include <conio.h>
  4. # include <stdlib.h>
  5. struct pilas
  6. {
  7.       int x;
  8. }pi[3];
  9. //prototipos de función
  10. void llenar(pilas);
  11. int extraer(pilas);
  12. int tope=-1;
  13.  
  14. int main()
  15. {
  16.  
  17.  cout<<"LLENAR PILA"<<endl;
  18.  
  19.  while(tope<3)
  20.  {
  21.                 for (int i=0; i<3; i++)
  22.                 {
  23.                     cin>>pi[i].x;
  24.                     llenar (pi);
  25.  
  26.                 }
  27.  }
  28.  
  29.  cout<<"Pulsar cualquier tecla para continuar";
  30.  getche();
  31.  
  32.  system ("CLS");
  33.  
  34.  cout<<"Datos de la pila"<<endl;
  35.  
  36.  extraer(pi);  
  37.  getche ();
  38.  return -9;
  39. }//fin main()
  40.  
  41. void llenar(pilas)
  42. {
  43.  if(tope+1 >=3)
  44.  cout<<"Pila llena"<<endl;
  45.  pi[++tope]=pi[3];
  46. }
  47.  
  48. int extraer(pilas)
  49. {
  50.  while(tope>=0)
  51.  {
  52.                for (int i=0; i<3; i++)
  53.                {
  54.                    cout <<pi[i].x;
  55.                    cout<<pi[tope--]<<endl;
  56.                }
  57.                getche ();
  58.                if(tope==-1)
  59.                cout<<"Pila vacia";
  60.  }
  61. }
  62.  


Título: Re: Pilas C++ usando Estructuras (STRUCT)
Publicado por: Queta en 19 Octubre 2011, 23:24 pm
No hiciste nada de lo que te dijo...

¿Compilaste antes de enseñarnos el código?

Empezando por las librerías, no hace falta ni stdlib ni conio y es más, como bien te dijo CeroX901, iostream va sin la .h final. main sigue devolviendo -9 y no aplicas bien cout.

-Usar getche(); para pausar la aplicacion?, mejor usa system("pause");

Es mejor, en este caso, usar cin.get. Y tampoco usas bien la función extraer.


Título: Re: Pilas C++ usando Estructuras (STRUCT)
Publicado por: charmedever en 19 Octubre 2011, 23:40 pm
las librerias las uso asi porq estoy trabajando con DEV C++ el iostream.h para cout y cin, conio.h para pausar pantalla getche() y stdlib.h para limpiar pantalla esas librerias siempre las he utilizado, la funcion main puede aceptar cualquier numero entero sea positivo o negativo


Título: Re: Pilas C++ usando Estructuras (STRUCT)
Publicado por: Queta en 19 Octubre 2011, 23:47 pm
las librerias las uso asi porq estoy trabajando con DEV C++

Eso es irrelevante, a parte de que este IDE ya está medio obsoleto y su última actualización no es ni oficial.

el iostream.h para cout y cin

Repito, iostream va sin .h final y no usas cout correctamente.

conio.h para pausar pantalla getche()

Puedes perfectamente hacer servir una función estándar; ya te dí una solución...

stdlib.h para limpiar pantalla

Aunque no es recomendado el uso de system, quizás es el argumento de más peso :rolleyes:.

la funcion main puede aceptar cualquier numero entero sea positivo o negativo

Exactamente, y la coherencia juega un papel importante en el desarrollo de un programa.


Título: Re: Pilas C++ usando Estructuras (STRUCT)
Publicado por: rir3760 en 19 Octubre 2011, 23:53 pm
Si se trata de compilar tu programa en Dev-C++ con las opciones predeterminadas se genera el mensaje:
Código:
#warning This file includes at least one deprecated or antiquated header. 
Please consider using one of the 32 headers found in section 17.4.1.2 of the C++
standard. Examples include substituting the <X> header for the <X.h> header for
C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To
disable this warning use -Wno-deprecated.
Ello en relación a la inclusión de <iostream.h>, caso similar con <stdlib.h>. En cuanto a <conio.h> no es necesario utilizarla.

En cuanto a la función principal esta debe retornar cero o bien un valor distinto en caso de error (tu devuelves 9 de forma indiscriminada).

En mi opinión deberías revisar alguna pagina sobre pilas en la red (por ejemplo Wikipedia) y rescribir el programa desde cero ya que tiene varios errores.

Un saludo


Título: Re: Pilas C++ usando Estructuras (STRUCT)
Publicado por: Queta en 19 Octubre 2011, 23:56 pm
En definitiva, lo que le intentamos explicar CeroX901 y yo y no entendió.


Título: Re: Pilas C++ usando Estructuras (STRUCT)
Publicado por: CeroX901 en 20 Octubre 2011, 01:36 am
No sé exactamente lo que pide, recuerdo mi primer programa en la U que trataba sobre Listas doblemente enlazadas con estructuras y punteros, me quedó hermoso  ese programa :xD, no sé si quiere hacer lo mismo..


Título: Re: Pilas C++ usando Estructuras (STRUCT)
Publicado por: charmedever en 20 Octubre 2011, 02:05 am
Hola modifique el codigo lo compile con DEV C++ y me corre, me deja ingresar 4 elementos de tipo entero pero no me deja visualizarlos en el orden en q los ingrese
Anexo el codigo
Código
  1. //IMPLEMENTA UNA PILA
  2. # include <iostream.h>
  3. # include <conio.h>
  4. # include <stdlib.h>
  5. struct pilas
  6. {
  7.       int x;
  8. }pi[3];
  9. //prototipos de función
  10. void llenar(pilas);
  11. int extraer(pilas);
  12. int tope=-1;
  13.  
  14. int main()
  15. {
  16.  
  17.  cout<<"LLENAR PILA"<<endl;
  18.  
  19.  while(tope<3)
  20.  {
  21.                 for (int i=0; i<3; i++)
  22.                 {
  23.                     cin>>pi[i].x;
  24.                     llenar (pi[i]);
  25.                 }
  26.  }
  27.  cout<<"Pulsar cualquier tecla para continuar";
  28.  getche();
  29.  system ("CLS");
  30.  cout<<"Datos de la pila"<<endl;
  31.  for (int i=0; i<3; i++)
  32.  {
  33.      cout <<pi[i].x;
  34.      extraer(pi[i]);
  35.  }
  36.  getche ();
  37.  return 0;
  38. } //fin de main
  39.  
  40. void llenar(pilas)
  41. {
  42.  if(tope+1 >=3)
  43.  cout<<"Pila llena"<<endl;
  44.  pi[++tope]=pi[3];
  45. }
  46.  
  47. int extraer(pilas)
  48. {
  49.  while(tope>=0)
  50.  {
  51.                for (int i=0; i<3; i++)
  52.                {
  53.                    pi[--tope]=pi[3];
  54.                    getche ();
  55.                }
  56.                if(tope==-1)
  57.                cout<<"Pila vacia";
  58.  }
  59.  return 0;
  60. }
  61.  


Título: Re: Pilas C++ usando Estructuras (STRUCT)
Publicado por: Ferno en 21 Octubre 2011, 00:54 am
Por supuesto que no te deja visualizarlo, esa no es la funcionalidad de una pila. No estás usando la estructura correcta (o al menos la más eficiente) para hacerlo.
Para ingresar y extraer exactamente en el orden en que ingresaste el dato, es mejor usar una Cola (First in, First out). La pila (First in, Last out) va extrayendo en base al último dato que ingresaste en ella, es decir, el tope.


Título: Re: Pilas C++ usando Estructuras (STRUCT)
Publicado por: terym en 21 Noviembre 2011, 20:52 pm
hola disculpen soy nueva en esto y me encontre con este foro q me parecio interesante y creo q me podria ayudar estoy implementando una pila
#include <stdio.h>
#include <stdlib.h>


  /* declaracion */
struct tpila{
  int clave;
  struct tpila *sig;
};
   /* prototipos e implementacion */

void crear(struct tpila **pila);
int vacia(struct tpila *pila);
void apilar(struct tpila *pila, int elem);
int desapilar(struct tpila *pila,int *elem);
void imprimirpila( struct tpila *ptrActual,struct tpila *pila);


void imprimirpila( struct tpila *ptrActual,struct tpila *pila)
{


    printf( "La pila es:\n\n" );


    while ( ptrActual != NULL) {
        printf( "%d -> ", ptrActual->clave );
       ptrActual= pila->sig;
       pila->sig= ptrActual;
       system("pause");



    }
     printf( "apunta a null\n" );


}




void crear(struct tpila **pila)
{  *pila = (struct tpila *) malloc(sizeof(struct tpila));

  (*pila)->sig = NULL;

  printf("pila creada\n");
}

int vacia(struct tpila *pila){
  return (pila->sig == NULL);
}

void apilar(struct tpila *pila, int elem){
  struct tpila *nuevo;

  nuevo = (struct tpila *) malloc(sizeof(struct tpila));


  nuevo->clave = elem;
   nuevo->sig = pila->sig;
  pila->sig = nuevo;
}

 int desapilar(struct tpila *pila,int *elem){
  struct tpila *aux;


  aux = pila->sig;
  *elem= aux->clave;
  pila->sig = aux->sig;
  free(aux);
  return *elem;
}

   /* programa de prueba */
int main(void)
{
  struct tpila *pila;
  int elem,opc,reg;
  crear(&pila);

do{
  printf("que deseas hacer  1)apilar 2)desapilar 3)imprimir\n");
  scanf("%d",&opc);


  switch(opc){

    case 1:

    printf("introduce el numero a apilar");
      scanf("%d",&elem);
     apilar(pila,elem);
   printf("pulse la tecla 5 para regresar al menu principal");
    scanf("%d",&reg);
    break;

    case 2:
    if(!vacia(pila)){
     desapilar(pila,&elem);
     printf( "elemento retirado\n");
    }
                else
                    printf( "La pila esta vacia\n" );
                break;

    case 3:
    if ( !vacia( pila ) )
    imprimirpila( pila );
                else
                    printf( "La pila esta vacia\n" );
                    printf("pulse la tecla 5 para regresar al menu principal");
    scanf("%d",&reg);
                break;

    }

}
  while(reg==5);
return 0;



}
 les vuelvo a comentar soy principiante si alguien me podri ayudar les agradeceria mucho el error esta ala hora de imprimir no me imprime todos los elementos de la lista le dejo mi correo por detecta el error terezza_31@hotmail.com


Título: Re: Pilas C++ usando Estructuras (STRUCT)
Publicado por: RyogiShiki en 21 Noviembre 2011, 21:03 pm
éste hilo lleva innactivo más de un mes. No está perimitido revivir hilos antiguos. Lo mejor es que crees un nuevo tema, Y cuando bayas a colocar el código hazlo usando GeSHi (extremo superior derecho de las herramientas de edición de un mensaje)

Saludos


Título: Re: Pilas C++ usando Estructuras (STRUCT)
Publicado por: x64core en 21 Noviembre 2011, 21:11 pm
En la funcion de imprimir e falta un parametro que es el puntero donde se encuentra una instruccion de la pila
en ensamblador seria el registro BP

tambie otra cosa... la declaracion de los prototipos se usa para indicarle al compilador que en
algunas parte se encuentran dichas funciones en el archivo fuente... los prototipos se pueden
omitir si las funciones estan declaradas antes de la funcion main...