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
Código
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):
Código: T top(); // devuelve el ultimo elemento de la pila del tipo que sea (int/float/char/...) 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): Código: T front(); // devuelve el elemento que antes se inserto en 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: Código: void push_back(T elemento); // inserta un elemento al final de la lista Ahora respecto a las mejoras de tu programa. Algunas buenas prácticas son:
Sin embargo, la variable <i> de la línea 10 es global y luego en las líneas 140 y 150 vuelves a declarar una variable <i> para cada función de forma local. En este caso te recomiendo borrar la de la línea 10 para evitar una variable global. También tienes en la línea 10 una variable <acum> que sólo usas dentro de la función <sumaPila()> y que contiene lo mismo que la variable <suma> que declaras dentro de la función. Entonces la variable <acum> sobra también. Otra cosa importante es el uso de funciones. Una función sirve para agrupar un grupo de código y poder reutilizarlo por lo que hay que crear funciones fáciles de reutilizar. Tú pregúntate que programa se entiende mejor, el primero o el segundo: Código Como ves en el primer caso delegas TODO el trabajo a otra función <menu()> por lo que te ves en las mismas. El <main> no te dice nada y todo el código está en <menu()>. La cosa está en que leyendo el <main> entiendas lo que el programa hace pero no hace falta que entiendas cómo lo hace. En el segundo ejemplo, se ve que muestras un menú y ese menú devuelve una opción, luego según la opción ves lo que el programa hace (por ejemplo, crear una pila nueva) pero si quieres saber CÓMO es cuando tienes que ir a la función <pilaNueva()>. Así el código queda limpio pero a la vez comprensible. Paso de parámetros: Tú tienes que pasar una variable como parámetro a una función cuando necesites esa variable fuera de la función y el valor de esa variable condicione algo de la función. En tu función <menu()> recibes un parámetro <eleccion> que:
En la función <apilar()> sin embargo es al revés.
Respecto al resto de funciones: La función <menu()> hace demasiadas cosas y recibe parámetros innecesarios. Recomendación: hacer una función <int mostrarMenu()> que sólo muestre las opciones, de al usuario una a elegir y devuelva ese valor. La función <crearPilaVacia()> tiene que retornar un <bool> y no retorna nada. Por tanto lo que retorna es -1 que es el valor de la asignación de la función. Y -1 traducido a <bool> es siempre <true>. No dejes la tarea de adivinar el valor de retorno. Deja bien claro qué devuelve una función (si tiene que devolver algo, claro, yo en este caso lo veo innecesario...). Recomendacion: una función <void pilaNueva()> que lo único que haga sea poner el <tope> a -1. Las funciones <pilaVacia()> y <pilaLlena()> podrías ahorrártelas ya que conoces el tamaño de la pila <MAX> y el número de elementos <tope>. Pero tampoco es un problema grave, si prefieres usar esas funciones eres libre de hacerlo pero se pueden acortar: Código Recomendación: acortar ambas funciones como se ve en el ejemplo. La función <apilar()>, como antes te he explicado, no tiene fundamento lo que haces. Además como antes decía es mejor evitar mostrar mensajes dentro de las funciones. Recomendación: una función <bool apilar(int elemento)> que compruebe si se puede insertar el elemento. Si es posible, lo inserta y devuelve true y si no es posible no lo inserta y devuelve false. Así sin mostrar mensajes tú puedes saber si el elemento se insertó o no. Para la función <desapilar()> más de lo mismo. Se pueden evitar los mensajes haciendo lo mismo que en <apilar()> Recomendación: una función <bool desapilar()> que compruebe si la pila está vacía. Si está vacía devuelve false y si no está vacía, elimina el elemento (restar 1 a <tope>) y devuelve true. (No es necesario poner el elemento a 0 antes de eliminarlo). En la función <visualizarElementos()> se podría eliminar el mensaje que sirve de "titulillo" y dejar únicamente los elementos. En caso de querer que se vea el titulillo ese siempre puedes ponerlo antes de llamar a la función. Código Recomendación: dejar la función igual <void visualizarElementos()> pero quitando el primer mensaje. Y para la última función, <sumaPila()>, que también muestra los mensajes en pantalla tenemos que evitar esto. Recomendación: una función <int sumaPila()> que calcule la suma y en vez de mostrarla por pantalla, la devuelva. Entonces para mostrar la suma haríamos: Código Unos consejos extra: Código Y para los condicionales: Código
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.
Código
Título: Re: Importante-Curioso Publicado por: K-YreX en 29 Agosto 2019, 16:03 pm
La única forma que se me ocurre para poder ayudarte sin tener que volver a escribir un mensaje como el anterior es que me expliques tu razonamiento para:
|