Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: ElfoArdiente en 27 Agosto 2019, 04:23 AM

Título: Importante-Curioso
Publicado por: ElfoArdiente en 27 Agosto 2019, 04:23 AM
Buenas estoy haciendo un ejercicio de la Facultad :silbar: y tengo una curiosidad


#include<stdio.h>
#include<stdbool.h>

#define max 10

typedef float tPila[max];
tPila pila;

int i, tope, acum = 0;

int menu(int eleccion);
bool CrearPilaVacia();
bool PilaVacia();
bool PilaLlena();
void Apilar(int);
void Desapilar();
int cima();
void VisualizarElementos();
void sumaPila();

int main()
{
int eleccion;

menu(eleccion);
}
int menu(int eleccion)
{
   int pElementos;
   
while(eleccion != -1)
{
    printf("\n--BIENVENIDO--\n");
    printf("1.- CrearPilaVacia\n");
    printf("2.- Pila vacia? \n");
    printf("3.- Pila Llena? \n");
    printf("4.- Apilar \n");
    printf("5.- Desapilar \n");
    printf("6.- Visualizar Elementos \n");
    printf("7.- Suma Elementos \n");
    printf("-1.- Salir\n\n");
    printf(".- Elige una opcion..\n");
    scanf("%d",&eleccion);
switch(eleccion)
{
case 1:
    CrearPilaVacia();
    printf("Has Creado una pila vacia? %s\n",CrearPilaVacia() ? "si" : "no");
    break;
   
    case 2:
    PilaVacia();
    printf("Pila vacia? %s\n",PilaVacia() ? "si" : "no");
    break;

case 3:
PilaLlena();
printf("Pila Llena? %s\n",PilaLlena() ? "si" : "no");
break;

case 4:
Apilar(pElementos);
break;

case 5:
Desapilar();
    break;
   
    case 6:
    VisualizarElementos();
    break;
   
    case 7:
    sumaPila();
    break;
}
}
}
bool CrearPilaVacia()
{
tope = -1;
}
bool PilaVacia()
{
if(tope == -1)
{
return true; /* Tiene elementos.*/
}
else
{
return false; /* No tiene elementos.*/
}
}
bool PilaLlena()
{
if(tope == (max-1))
{
return true;
}
else
{
return false;
}
}
void Apilar(int pElementos)
{
if(PilaLlena() != true)
{
tope = tope + 1;
pila[tope] = pElementos;
printf("Ingrese un elemento! \n");
scanf("%f",&pila[tope]);
printf("Elemento insertado! %.2f\n",pila[tope]);
}
else
{
printf("Pila Llena!\n");
}
}
void Desapilar()
{
if(PilaVacia() == true)
{
printf("Pila Vacia!!\n");
}
else
{
pila[tope] = 0;
tope = tope - 1;
printf("Elemento eleminado!!\n");
}
}
int cima()
{
return pila[tope];
}
void VisualizarElementos()
{
int i;
printf("Elemento en pila: \n");
for(i=0; i<=tope; i++)
{
printf("\t%.2f",pila[i]);
}
printf("\n\n");
}
void sumaPila()
{
int i;
float suma=0;

printf("Suma de elementos en la pila: \n");

// Suma los elementos de una pila.
for(i=0; i<=tope; i++)
{
suma = suma + pila[i];
acum = suma + 0;
    }
    printf("\t%.2f",acum);
printf("\n\n");
}



Al compilar me da un resultado muy raro, pues nose por que se genera
Al mostrar los elementos de la pila, me da el siguiente resultado.

0.00 4,50 4,30 4.90 5.90

Pues el 0.00 nose por que esta hay y nose como quitarlo
Si me pueden ayudar porfavor a resolver este curioso problema, les agradeceria muchisimo
Título: Re: Importante-Curioso
Publicado por: K-YreX en 27 Agosto 2019, 17:55 PM
Pues tu problema es porque estás introduciendo valores (opción 4) sin crear la pila vacía primero (opción 1).
Pero vamos que aparte de ese problema, ese código es muy mejorable (pero MUY MUCHO)... Tienes:
Título: Re: Importante-Curioso
Publicado por: ElfoArdiente en 28 Agosto 2019, 05:19 AM
Hola te lo agradeceria muchisimo que me ayudaras a entender cómo puedo mejorar , pues no entiendo nada de Pilas, ni de colas ni de listas, el problema es que estoy aprendiendo mal, en mi universidad no me enseñan la parte práctica de programación, este código MAL HECHO, lo estuve tratando de resolver y me llevo un dia entero.

Título: Re: Importante-Curioso
Publicado por: K-YreX en 28 Agosto 2019, 15:44 PM
Una pila o stack es un contenedor LIFO (last in first out), es decir, que el último que entra es el primero que sale. Imagina para esto una "pila" de platos, tú los vas amontonando uno encima de otro y cuando vas a coger uno, coges el de arriba del todo. Puedes fijarte en el contenedor <stack> de la STL para C++ para crear una pila en C lo más parecida posible a lo que existe. Entonces necesitas un contenedor de datos ordenado (en tu caso un array) y las siguiente funciones por lo menos (más o menos ya las tienes):

T top(); // devuelve el ultimo elemento de la pila del tipo que sea (int/float/char/...)
void push(T elemento); // introduce un nuevo elemento
void pop(); // saca el ultimo elemento de la pila
bool empty(); // devuelve true/false dependiendo de si la pila esta vacia o no
int size(); // devuelve el numero de elementos que contiene la pila


Una cola o queue es lo contrario a la pila, un contenedor FIFO (first in first out) donde el primero que entra es el primero que sale. Imagina una cola de personas que se ponen en un cajero, el primero que llega es el primero que usa el cajero y se va. En C++ también existe una cola de la STL <queue> y tiene los siguiente elementos además de un contenedor ordenado (que en tu caso usarías un array):

T front(); // devuelve el elemento que antes se inserto en la cola
void pop(); // elimina el elemento que antes se inserto
T back(); // devuelve el elemento que se inserto el ultimo
// No existe un pop() para eliminar el ultimo ya que entonces no seria una cola ya que dejaria de ser FIFO
void push(T elemento); // introduce un nuevo elemento a la cola
bool empty(); // devuelve true/false dependiendo de si la cola esta vacia o no
int size(); // devuelve el numero de elementos que contiene la cola


Una lista o list es como una mezcla, es un contenedor que permite insertar y eliminar elementos tanto por delante como por detrás. Al igual que para las otras, en C++ tenemos el contenedor <list> de la STL que tiene además del propio contenedor de valores las siguientes funciones:

void push_back(T elemento); // inserta un elemento al final de la lista
void push_front(T elemento); // inserta un elemento al comienzo de la lista
void pop_back(); // elimina el ultimo elemento de la lista
void pop_front(); // elimina el primer elemento de la lista
T front(); // devuelve el primer elemento de la lista
T back(); // devuelve el ultimo elemento de la lista
bool empty(); // devuelve true/false dependiendo de si la lista esta vacia o no
int size(); // devuelve el numero de elementos de la lista



Ahora respecto a las mejoras de tu programa. Algunas buenas prácticas son:
Título: Re: Importante-Curioso
Publicado por: ElfoArdiente en 29 Agosto 2019, 07:55 AM
Hola te agradezco un montón todo lo que me dijiste, ayer intente poner en práctica todo, la verdad no me salio casi nada y es por que no tengo claro los fundamentos ni la práctica aun, pero mi profe me aprobó el trabajo, y todavia no me doy por vencido estoy intentando nuevas cosas como por ejemplo mostrar el último elemento de la pila o mostrar el elemento eliminado de la pila, estoy si viendo si puedo agregar elementos de distinto tipo de dato, fuaa un montón de cosas en fin mira mi codigo, para mi esta muy cambiado pero nose, en fin muchas gracias enserio.


#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

#define max 10

typedef float tPila[max];
tPila pila;

int tope;

int menu(int eleccion);
bool CrearPilaVacia();
bool PilaVacia();
bool PilaLlena();
bool Apilar(float pElementos);
bool Desapilar();
float cima();
float VisualizarElementos();
float sumaPila();

int main()
{
int eleccion = menu(eleccion);
}
int menu(int eleccion)
{
    float pElementos, acum = 0;
while(eleccion != -1)
{
    printf("\n--BIENVENIDO--\n");
    printf("1.- CrearPilaVacia\n");
    printf("2.- Pila vacia? \n");
    printf("3.- Pila Llena? \n");
    printf("4.- Apilar \n");
    printf("5.- Desapilar \n");
    printf("6.- Visualizar Elementos \n");
    printf("7.- Suma Elementos \n");
    printf("8.- Elemento en el tope \n");
    printf("-1.- Salir\n\n");
    printf(".- Elige una opcion..\n");
    scanf("%d",&eleccion);
switch(eleccion)
{
case 1:
    CrearPilaVacia();
    printf("Has Creado una pila vacia? %s\n",CrearPilaVacia() ? "si" : "no");
    break;

    case 2:
    PilaVacia();
    printf("Pila vacia? %s\n",PilaVacia() ? "si" : "no");
    break;

case 3:
PilaLlena();
printf("Pila Llena? %s\n",PilaLlena() ? "si" : "no");
break;

case 4:
Apilar(pElementos);
printf("Ingrese un elemento! \n");
    scanf("%f",&pila[tope]);
    printf("Elemento insertado! %.2f\n",pila[tope]);
break;

case 5:
Desapilar();
    break;

    case 6:
    printf("Elementos en la pila\n");
    VisualizarElementos();
    break;

    case 7:
    sumaPila();
    printf("\tLa suma de los elementos de la pila es: %.2f",sumaPila());
        printf("\n\n");
    break;
   
    case 8:
    printf("El elemento en el tope es: %.2f",cima());
    break;
}
}
}
bool CrearPilaVacia()
{
tope = -1;
}
bool PilaVacia()
{
if(tope == -1)
{
return true; /* Tiene elementos.*/
}
else
{
return false; /* No tiene elementos.*/
}
}
bool PilaLlena()
{
if(tope == (max-1))
{
return true;
}
else
{
return false;
}
}
bool Apilar(float pElementos)
{
if(PilaLlena() != true)
{
tope = tope + 1;
pila[tope] = pElementos;
}
else
{
printf("Pila Llena!\n");
}
}
bool Desapilar()
{
if(PilaVacia() == true)
{
printf("Pila Vacia!!\n");
}
else
{
pila[tope] = 0;
tope = tope - 1;
printf("Elemento eleminado!!\n");
}
}
float cima()
{
return pila[tope];
}
float VisualizarElementos()
{
int i;
for(i=0; i<=tope; i++)
{
   printf("\t %.2f",pila[i]);
}
}
float sumaPila()
{
float suma=0, acum = 0;
int i;
// Suma los elementos de una pila.
for(i=0; i<=tope; i++)
{
suma = suma + pila[i];
acum = suma + 0;
    }
    return acum;
}
Título: Re: Importante-Curioso
Publicado por: K-YreX en 29 Agosto 2019, 16:03 PM