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

hola voy con pilas

Estas en el tema de hola voy con pilas en el foro de C/C++ en Foros del Web. ok gracias a todos aquellos que ponen su granito de arena para ayudar alos que empezamos ojala y algundia sea yop el que de una ...
  #1 (permalink)  
Antiguo 09/10/2009, 21:50
 
Fecha de Ingreso: octubre-2009
Mensajes: 19
Antigüedad: 14 años, 6 meses
Puntos: 0
hola voy con pilas

ok gracias a todos aquellos que ponen su granito de arena para ayudar alos que empezamos ojala y algundia sea yop el que de una asesoria este es mi progrma pero no me corre correctamente ojala me puideran decir cual es el error saludos hay comentarios que son de la plantilla que me puseron para realizar este programa saludos todos
#define MAXELE 10
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
/* DEFINICION DE LAS ESTRUCTURAS DE DATOS PARA LA IMPLEMENTACION DE LA PILA */
static int TPILA[MAXELE];
static int cima = 0; /* base es 0 */

//const int tampila=5 //tamaño que tendra la pila
/* Función que almacena un elemento en la pila */
/* Si la pila no está llena, añadir i a la pila en la posición cima e
incrementar cima. En este caso se devuelve 0.
Si la pila está llena, no se hace nada y se devuelve 1
*/
class PILA{
public:
int mpila[MAXELE];
int cima;
void reset();
void push (int j);
//int push (int i)
int pop();
};
void PILA :: reset()
{
cima=0;
/*Añadir código*/
}
void PILA :: push (int j)
{
if (cima<MAXELE)
{
mpila[cima++]=j;
}
}

int PILA::pop()
{
if(cima>0)
{
printf("El valor del tope eliminado era: ");
// Retorna el valor del tope que fue eliminado
return(mpila[--cima]);
}
else
printf("No existen datos para eliminar\n");
return (0);
}

/* Función que extrae un elemento de la pila */
/* Si la pila no está vacía, copiar el elemento que está en la
posición
cima en la dirección apuntada por el parámetro y decrementar cima.
En este caso se devuelve 0.
Si la pila está vacía, no se hace nada y se devuelve 1
*/
//int pop (int *pi)
//{
/*Añadir código*/
//}




/* Función que vacía la pila */
//void vaciar_pila (void)
//{
//cima=0;
//}
void main ()
{
PILA stack;
stack.reset();
int opc,j,dato;
char salir;
do{
do{
// PROGRAMA PRINCIPAL
// muestra un menu para:
printf("1.- Solicitar y almacenar un elemento en la pila\n");
printf("2.- Retirar y mostrar un elemento de la pila\n");
printf("3.- Mostrar todo el contenido en la pila\n");
printf("4.- Vaciar la pila de una sola vez\n");
printf("5.-salir\n");
printf("tu opcion fue:");
scanf("%d",&opc);


}
while (opc>5);
switch (opc)
{
case(1):
if (stack.cima<MAXELE)
{
printf("ingresa los datos a guardar");
scanf("%d",&dato);
stack.push(dato);
}
else
printf("la pila no esta vacia");
printf("deseas salir (Si o No)");
scanf("%s",&salir);

break;

case (2):
stack.pop();
printf("deseas salir (Si o No)");
scanf("%s",&salir);

break;

case (3):
if(stack.cima!=0)
{
printf("los datos almacenados en la pila son :");
for (j=0;j<stack.cima;j++)
{
printf("los datos en la pila son",stack.mpila[j]);


else{
printf("no hay datos guardados en la pila");
printf("deseas salir (Si o No)");
scanf("%s",&salir);
}
}
}
break;

case(4):
stack.reset();
printf("deseas salir (Si o No)");
scanf("%s",&salir);

break;
case(5):
salir='s'; break;
default:
salir='s'; break;
}
}
while(salir=='n' || salir=='N');
}
//void main(){

/* Añadir el código aqui */
//}
  #2 (permalink)  
Antiguo 09/10/2009, 23:49
 
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: hola voy con pilas

Hola que tal, hay unos pequeños errores:

1) La variable "salir" es de tipo char, entonces para leerla se usa "%c" que es para caracteres en vez de "%s" que es para cadenas de caracteres.
Código:
scanf("%c",&salir);
2) Hay una mala sintaxis en unas llaves {} del case 3, acontinuación comento lo que se debe organizar:

Código:
if(stack.cima!=0){
   printf("los datos almacenados en la pila son :\n");
   for (j=0;j<stack.cima;j++){
      printf("los datos en la pila son",stack.mpila[j]);
   } // Esta llave faltaba ponerla
}    // Esta llave faltaba ponerla 
 else{
   printf("no hay datos guardados en la pila");
   printf("deseas salir (Si o No)");
   scanf("%c",&salir);
}
//} Esta llave sobra
//} Esta llave sobra
3) Falta imprimir los números devueltos por "pop"
Código:
dato = stack.pop();
printf("%d",dato);
4) Dentro del for del case3 faltó imprimir los números de la pila
Código:
for (j=0;j<stack.cima;j++){
   printf("%d ",stack.mpila[j]);
}
Eso sería. Mucha suerte.
Saludos.

PD: Cuando postees usa [code] y [ /code] para encerrar códigos, de esta forma su lectura se facilita mucho más.
  #3 (permalink)  
Antiguo 10/10/2009, 03:26
Avatar de r0d
r0d
 
Fecha de Ingreso: noviembre-2007
Mensajes: 86
Antigüedad: 16 años, 5 meses
Puntos: 3
Respuesta: hola voy con pilas

Que horror esta mescla de C y C++
__________________
Alicia: Sólo quiero saber que camino debo tomar.
Gato risón: Pues... depende mucho de donde quieras ir.

Mi página web
  #4 (permalink)  
Antiguo 10/10/2009, 12:53
 
Fecha de Ingreso: octubre-2009
Mensajes: 39
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: hola voy con pilas

pregunta: ¿Porque no usas pilas dinamicas?

Otra observacion mejora la presentacion de tu codigo, se ve mal , es solo una observacion, pero dime cual es tu problema????
  #5 (permalink)  
Antiguo 10/10/2009, 18:35
 
Fecha de Ingreso: octubre-2009
Mensajes: 19
Antigüedad: 14 años, 6 meses
Puntos: 0
porqueee

como mezcla de c y c++ que es lo que mezclo de uno y otro asi me lo estan enseñando pero bueno quiero ser buen programador que problema hay??????
  #6 (permalink)  
Antiguo 10/10/2009, 22:02
 
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: hola voy con pilas

r0d tiene razón. Es recomendable escribir, o sólo en C, o solo en C++. Una comparación entre los dos sería más o menos lo siguiente:

C --------------------> C++

#include<stdio.h> ---------------> #include<iostream>
scanf("%d",&num); ----------------> cin>>num;
printf("texto"); -------------------> cout<<"texto";
struct{ -------------------------> class{

O usas los códigos de la columna izquierda, o los códigos de la columna derecha.
  #7 (permalink)  
Antiguo 11/10/2009, 04:44
Avatar de r0d
r0d
 
Fecha de Ingreso: noviembre-2007
Mensajes: 86
Antigüedad: 16 años, 5 meses
Puntos: 3
Respuesta: hola voy con pilas

gracias joticajulian :)
Es una lucha dificil, sobre todo en el "mundo hispanofono".
C y C++ son dos languajes muy distintos. No es la misma manera de programar. Es importantisimo entender esto si quieres ser buen programador. Un programa escrito en C y un otro escrito en C++ no se conciben de la misma manera. No es el mismo proceso de construccion del programa, por asi decir. Es por eso que es importante entender bien las diferencias entre Cy C++, y despues, solo despues, se podrá mesclar C y C++, pero respectando algunas normas (como por ejemplo, no mesclar C y C++ en el mismo fichero).

Mira, por ejemplo en c++ es un error implementar una clase Pila, porque ya existen varias (en nativo), et no harás mejor que eso. Es un buen ejercicio en C, porque es una buena manera de practicar los manipulaciones de memoria y tal, pero en C++ no tiene sentido.
__________________
Alicia: Sólo quiero saber que camino debo tomar.
Gato risón: Pues... depende mucho de donde quieras ir.

Mi página web
  #8 (permalink)  
Antiguo 11/10/2009, 19:40
 
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: hola voy con pilas

r0d gracias por el comentario, pero no me queda claro qué clases hay en c++ que sirvan como pilas. En java he usado ArrayList, pero en c++ no sé.
¿qué se usa en c++?
Saludos.
  #9 (permalink)  
Antiguo 11/10/2009, 20:46
 
Fecha de Ingreso: octubre-2009
Mensajes: 19
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: hola voy con pilas

hola de nuevo le hice los cambios mencionados arriba y ahora me cierre el c++ tengo c+builder 5.1 ayuda por favor.
Código:
#define MAXELE 10
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
/* DEFINICION DE LAS ESTRUCTURAS DE DATOS PARA LA IMPLEMENTACION DE LA PILA */
static int TPILA[MAXELE];
static int cima = 0; /* base es 0 */


class PILA{
public:
   int mpila[MAXELE];
   int cima;
   void reset();
   void push (int j);
//int push (int i)
int pop();
};
void   PILA :: reset()
{
cima=0;
}
  void PILA :: push (int j)
   {
    if (cima<MAXELE)
    {
     mpila[cima++]=j;
     }
  }

    int PILA::pop()
{
  if(cima>0)
    {
    printf("El valor del tope eliminado era: ");

    return(mpila[--cima]);
    }
  else
  printf("No existen datos para eliminar\n");
  return (0);
}


void  main ()
 {
 PILA stack;
 stack.reset();
 int opc,j,dato;
 char salir;
 do{
     do{

  printf("1.- Solicitar y almacenar un elemento en la pila\n");
  printf("2.- Retirar y mostrar un elemento de la pila\n");
  printf("3.- Mostrar todo el contenido en la pila\n");
  printf("4.- Vaciar la pila de una sola vez\n");
  printf("5.-salir\n");
  printf("tu opcion fue:");
 scanf("%d",&opc);


}
while (opc>5);
switch (opc)
{
case(1):
     if (stack.cima<MAXELE)
     {
          printf("ingresa los datos a guardar");
          scanf("%d",&dato);
          stack.push(dato);
     }
     else
           printf("la pila no esta vacia");
           printf("deseas salir (Si o No)");
           scanf("%c",&salir);

break;

case (2):
stack.pop();
    printf("deseas salir (Si o No)");
  scanf("%c",&salir);

break;

case (3):
if(stack.cima!=0)
{
     //printf("los datos almacenados en la pila son :");
       for (j=0;j<stack.cima;j++)
     {
     dato = stack.pop();
printf("%d",dato);
  printf("los datos en la pila son %d:",stack.mpila[j]);
      }
      }
 else{
 printf("\n no hay datos guardados en la pila");
  printf("deseas salir (Si o No)");
  scanf("%c",&salir);
     }

break;

case(4):
  stack.reset();
  printf("deseas salir (Si o No)");
  scanf("%c",&salir);

  break;
  case(5):
    salir='s'; break;
default:
    salir='s'; break;
}
}
while(salir=='n' || salir=='N');
}
]
se que soy muy molesto y que a lo mejor mis errores son demaciado tontos pero no encuentro mi error,se que han de decir que no hago mis tareas pero la cuestin esque estudi mi carrrera a distancia osea por internet entonces no hay alguien que me explique bien bien todo lo hago por medio de internet ojala que este dentro de sus posibilidades el checsr una vez mas mi programa de no ser asi agradezco de todos modos sus antencios para conmigo

Última edición por angelperdido; 11/10/2009 a las 20:54
  #10 (permalink)  
Antiguo 11/10/2009, 21:45
 
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: hola voy con pilas

Que tal angelperdido: No está mal preguntar o insistir, a todos nos pasa.
Primero que todo, siguiendo los consejos de r0d, veo que usas más c que c++, entonces todo pásalo a "c"; esto es:
- quitar <iostream> (de todas formas ni se está usando)
- redefinir la clase PILA como una estructura (struct PILA{ ... }) y cada una de sus funciones.

Por otro lado, cuando me refería a:
Cita:
3) Falta imprimir los números devueltos por "pop"
Código:
 dato = stack.pop();
printf("%d",dato);
me refería a imprimirlo en el case2 (ahí no se está imprimiendo), no en el case3 porque ahí no se está pidiendo sacar datos de la pila, sólo mostrarlos y de eso ya se encarga el for que recorre todos los datos de la pila.

Saludos.
PD: La próxima vez detalla con más claridad qué es lo que pasa, no entendí bien si es que el programa se está cerrando o que. Más detalles.
  #11 (permalink)  
Antiguo 12/10/2009, 06:36
Avatar de r0d
r0d
 
Fecha de Ingreso: noviembre-2007
Mensajes: 86
Antigüedad: 16 años, 5 meses
Puntos: 3
Respuesta: hola voy con pilas

Cita:
Iniciado por joticajulian Ver Mensaje
r0d gracias por el comentario, pero no me queda claro qué clases hay en c++ que sirvan como pilas. En java he usado ArrayList, pero en c++ no sé.
¿qué se usa en c++?
Saludos.
Es igual que en java o en c#: existen ya varios contenedores, según lo que querremos hacer. Y luego, hay algoritmos (#include <algorithm>) que se aplican a estos contenedores.
. La STL define 10 contenedores (vector, list, stack, queue, dequeue, priority_queue, map, set, multi_map y multi_set).
. TR2* añade algunos, no me acuerdo exactamente pero 3 o 4 me parece
. boost** lleva una decena más.

Por ejemplo, la pila básica es la std::stack. Las filas son std::queue y std::dequeue. La diferencia con java es que en c++, estos contenedores usan la "templatización", mientras que java usa la herencia (gracias a el objeto "raíz": java.lang.object). Y no parece pero es una diferencia importante. Por ejemplo, el hecho que en java, cada objeto hereda de Object es un gasto importante: los destructores de cada objeto tiene que ser virtual, y entonces ¡bam! cada objeto tiene que poseer una vtable. El hecho de utilizar un template permite cambiar el comportamiento del contenedor gracias al paradigma "alocation, trait, policy".

Todo lo que estoy hablando aquí es lo que llaman el c++ moderno. El próximo estándar del c++ va en este sentido, es por eso que es importante aprender el c++ de esta manera. Además, el comité abandono toda la parte de "programación por contrato", que hubiera permitido tener un concepto de interfaz en c++ bien claro, y acercarse al mundo del java.


* TR2 es algo como una "parte non oficial" de la STL, que se usa para probar cosas, pero en el próximo estándar c++0x, cual fecha de "oficialización" esta prevista para fin 2011, incluirá casi todo el TR-2.

** boost es una librería distinta de la STL (standard template library), pero usa paradigmas compatibles con la STL ( allocator, trait, policy, RAII, NVI, iterator, etc...). Así que por ejemplo, los contenedores de boost pueden ser utilizados con los algoritmos de la STL.
__________________
Alicia: Sólo quiero saber que camino debo tomar.
Gato risón: Pues... depende mucho de donde quieras ir.

Mi página web
  #12 (permalink)  
Antiguo 12/10/2009, 17:05
 
Fecha de Ingreso: octubre-2009
Mensajes: 19
Antigüedad: 14 años, 6 meses
Puntos: 0
haaaay no me queda

Código:
#define MAXELE 10
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
static int TPILA[MAXELE];
static int cima = 0; /* base es 0 */

///////////////////////////////////////////////////

struct  PILA{
   int mpila[MAXELE];
   int cima;
   void reset();
   void push (int j);
   int pop();
};
///////////////////////////////////////////////
void   PILA :: reset()
   {
    cima=0;
   }
//////////////////////////////////////////////////////
      void PILA :: push (int j)
      {
         if (cima<MAXELE)
           {
             mpila[cima++]=j;
           }
      }

//////////////////////////////////////////////////////
  int PILA::pop()
 {
    if(cima>0)
    {
    printf("El valor del tope eliminado era: ");
    return(mpila[--cima]);
     }
      else{
      printf("No existen datos para eliminar\n");
       return (0);
       }
  }
///////////////////////////////////////////////////////

void  main ()
 {
 PILA stack;
 stack.reset();
 int opc,j,dato;
 char salir;
 do{
     do{

        printf("\n\n\t1.- Solicitar y almacenar un elemento en la pila\n");
        printf("\t2.- Retirar y mostrar un elemento de la pila\n");
        printf("\t3.- Mostrar todo el contenido en la pila\n");
        printf("\t4.- Vaciar la pila de una sola vez\n");
        printf("\t5.-salir\n");
        printf("\t\ttu opcion fue:");
        scanf("%d",&opc);
        }
while (opc>5);
   switch (opc)
     {
       case(1):
         if (stack.cima<MAXELE)
            {
             printf("ingresa los datos a guardar");
             scanf("%d",&dato);
             stack.push(dato);
             }
          else
             printf("la pila no esta vacia");
             printf("deseas salir (Si o No)");
             scanf("%s",&salir);
          break;

   case (2):
     stack.pop();
     dato = stack.pop();
      printf("%d",dato);
      printf("deseas salir (Si o No)");
      scanf("%s",&salir);
   break;

case (3):
   if(stack.cima!=0)
   {
       for (j=0;j<stack.cima;j++)
        {
         printf("los datos en la pila son %d    \n",stack.mpila[j]);
         }
   }
 else {
 printf("\n no hay datos guardados en la pila");
  printf("deseas salir (Si o No)");
  scanf("%s",&salir);
      }
break;

case(4):
   stack.reset();
   printf("deseas salir (Si o No)");
    scanf("%s",&salir);
break;

  case(5):
    salir='s'; break;
   default:
    salir='s'; break;
}
}
while(salir=='n' || salir=='N');
}
este es mi programa ya mas o menos corre pero no se porque en el case 3 al mostrarme lo que esta almacenado me manda tambien luego luego el menu de nuevo y de lo demas pues no se si ya esta bien alguien de ustedes podria checarlo porfavor otra csa que encontre es que en la opcion de salir S y N si le pongo un solo caracter %c me manda errores de ejecucion pero si le pongo %s ya no a que se debe ese problema lo eh tenido con todas las actividades que me an mandado porfavor ayudaaaa gracias a todos los que an puesto su granito con este programa
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 16:16.