Título: Petición de ayuda para un problema bastante básico de programación en c++ Publicado por: JoaquinVT312 en 9 Mayo 2021, 11:55 am Soy nuevo programando, y tengo que entregar un ejercicio y estoy bastante perdido, debo hacer que el programa me diga si una receta de comida es vegetariana o no, viendo si alguno de los ingredientes que contiene es animal, imprimiendo un 1 si lo es, un 0 si no lo es o un -1 si hay algún ingrediente de la receta que no este en la base de datos que da el enunciado.
Llevo algo hecho pero estoy muy perdido puesto que soy nuevo y no sé aún como funcionan este tipo de programas. Agradecería algo de ayuda, por favor. Adjunto el programa tal y como lo llevo. :P Código
MOD: El código debe ir entre etiquetas de Código GeSHi Título: Re: Petición de ayuda para un problema bastante básico de programación en c++ Publicado por: K-YreX en 9 Mayo 2021, 13:13 pm El código está bastante bien estructurado (que no es poco decir).
Sin embargo, la función procesarReceta() sí que tiene algunos errores: utilizas dos tipos al mismo tiempo (int y struct...). Antes de empezar con el problema concreto voy a mencionar un par de consejos para utilizarlos yo mismo a partir de aquí: Cuando se define una estructura, puedes utilizar la palabra typedef para crear un nuevo tipo y no tener que utilizar siempre la palabra struct. Los nombres de los structs es mejor que empiecen por mayúscula. Código
En primer lugar, tal y como dices en la explicación, la función debe devolver {1, 0, -1} por lo que el tipo de valor de retorno deberá ser int, mejor que float. Ahora vamos a ver los parámetros... Si tú quieres ver si una receta tiene ingredientes de origen animal necesitarás, para empezar, la receta. ¿Cuántas? 1, la que quieres procesar. No todas las recetas. Por lo que de momento: Código Ahora esa receta tiene una lista de ingredientes (concretamente un array con los ids de los ingredientes). Entonces necesitarás recibir una lista con todos los ingredientes para poder buscar según su id. Por lo tanto: Código * En C/C++, cuando se pasa un array como parámetro suele ser necesario en la mayoría de los casos pasar un parámetro adicional para saber la longitud de ese array. ** En vez de llamar a la struct "Ingredientes" (en plural), la llamaría "Ingrediente" (en singular). Porque cada instancia será un ingrediente y no varios. A diferencia de "Propiedades" que cada instancia engloba varias propiedades. Y con esos parámetros ya podemos implementar la función, por lo que quedaría así: Código
Ahora el algoritmo de tu función: Teniendo la receta que quieres comprobar, tienes que recorrer todos sus ingredientes mientras que no hayas encontrado uno que sea animal y mientras no se acaben los ingredientes. Por cada uno de esos ingredientes, debes recorrer el array de ingredientes para encontrar el que coincide según su id y mirar si es de tipo animal. Hay un pequeño detalle que no está bien definido en la explicación: si una receta tiene un ingrediente de origen animal y otro desconocido, qué se debe devolver? 1 o -1? Eso quedará a decisión tuya. En pseudocódigo sería algo así: Código: i := 0 // Indica el indice del ingrediente actual de la receta Conviértelo a C (es muy sencillo) y pruébalo. A partir de ahí puedes hacer los cambios que consideres. Título: Re: Petición de ayuda para un problema bastante básico de programación en c++ Publicado por: JoaquinVT312 en 9 Mayo 2021, 14:04 pm El código está bastante bien estructurado (que no es poco decir). Sin embargo, la función procesarReceta() sí que tiene algunos errores: utilizas dos tipos al mismo tiempo (int y struct...). Antes de empezar con el problema concreto voy a mencionar un par de consejos para utilizarlos yo mismo a partir de aquí: Cuando se define una estructura, puedes utilizar la palabra typedef para crear un nuevo tipo y no tener que utilizar siempre la palabra struct. Los nombres de los structs es mejor que empiecen por mayúscula. Código
En primer lugar, tal y como dices en la explicación, la función debe devolver {1, 0, -1} por lo que el tipo de valor de retorno deberá ser int, mejor que float. Ahora vamos a ver los parámetros... Si tú quieres ver si una receta tiene ingredientes de origen animal necesitarás, para empezar, la receta. ¿Cuántas? 1, la que quieres procesar. No todas las recetas. Por lo que de momento: Código Ahora esa receta tiene una lista de ingredientes (concretamente un array con los ids de los ingredientes). Entonces necesitarás recibir una lista con todos los ingredientes para poder buscar según su id. Por lo tanto: Código * En C/C++, cuando se pasa un array como parámetro suele ser necesario en la mayoría de los casos pasar un parámetro adicional para saber la longitud de ese array. ** En vez de llamar a la struct "Ingredientes" (en plural), la llamaría "Ingrediente" (en singular). Porque cada instancia será un ingrediente y no varios. A diferencia de "Propiedades" que cada instancia engloba varias propiedades. Y con esos parámetros ya podemos implementar la función, por lo que quedaría así: Código
Ahora el algoritmo de tu función: Teniendo la receta que quieres comprobar, tienes que recorrer todos sus ingredientes mientras que no hayas encontrado uno que sea animal y mientras no se acaben los ingredientes. Por cada uno de esos ingredientes, debes recorrer el array de ingredientes para encontrar el que coincide según su id y mirar si es de tipo animal. Hay un pequeño detalle que no está bien definido en la explicación: si una receta tiene un ingrediente de origen animal y otro desconocido, qué se debe devolver? 1 o -1? Eso quedará a decisión tuya. En pseudocódigo sería algo así: Código: i := 0 // Indica el indice del ingrediente actual de la receta Conviértelo a C (es muy sencillo) y pruébalo. A partir de ahí puedes hacer los cambios que consideres. Primero muchas gracias por la atención. Tengo varias dudas al respecto, por si podrías ayudarme, por favor. Primero decir que es verdad que me expliqué mal acerca del ejercicio. El programa devolvería 1 de ser totalmente vegetariana la receta y 0 de encontrar algún alimento animal, pero siempre prevalecería el encontrar un ingrediente desconocido, es decir, de encontrar uno devolvería -1, independientemente ya de que sea vegetal o animal la receta. Segundo decir que es un ejercicio predefinido y, por lo tanto, solo puedo tocar la función, ( no me permite editar el enunciado en sí, y el nombre de las cosas, (lo digo por el tema que me has comentado de facilitar algunas cosas utilizando plurales o no teniendo que usar struct siempre, aún así me ha venido bien y te lo agradezco, puesto que me lo he apuntado para futuros programas en los que si pueda aplicarlos. Tengo dudas sobre la llamada a la función: // LLamada a función procesaReceta. Pruebe diferentes recetas anteriores: r[0], r[1] o r[2] res = procesarReceta(Receta receta, Ingredientes ingredientes[], numIngredientes); Eso me da error y no me deja compilar, por lo que me quedo ahí atascado y no puedo compilar e ir probando s editar el código de la función para ver si va funcionando correctamente o no. Gracias de nuevo por la atención. Título: Re: Petición de ayuda para un problema bastante básico de programación en c++ Publicado por: K-YreX en 9 Mayo 2021, 14:30 pm Primero decir que es verdad que me expliqué mal acerca del ejercicio. El programa devolvería 1 de ser totalmente vegetariana la receta y 0 de encontrar algún alimento animal, pero siempre prevalecería el encontrar un ingrediente desconocido, es decir, de encontrar uno devolvería -1, independientemente ya de que sea vegetal o animal la receta. En el algoritmo anterior he intercambiado el significado del 1 y el 0 pero puedes corregir eso sin mayor problema.También deberás cambiar un poco el código para que busque todos los ingredientes por si alguno es desconocido. Tengo dudas sobre la llamada a la función: Te dará error de compilación porque el prototipo de la función tiene que ser igual que la implementación y no lo habrás cambiado en ambas partes del código.// LLamada a función procesaReceta. Pruebe diferentes recetas anteriores: r[0], r[1] o r[2] res = procesarReceta(Receta receta, Ingredientes ingredientes[], numIngredientes); Eso me da error y no me deja compilar, por lo que me quedo ahí atascado y no puedo compilar e ir probando s editar el código de la función para ver si va funcionando correctamente o no. Gracias de nuevo por la atención. Si el problema no es ese, añade el prototipo de la función, la implementación y la llamada para ver cómo la utilizas. Título: Re: Petición de ayuda para un problema bastante básico de programación en c++ Publicado por: JoaquinVT312 en 9 Mayo 2021, 17:32 pm En el algoritmo anterior he intercambiado el significado del 1 y el 0 pero puedes corregir eso sin mayor problema. Te adjunto lo que llevo porque me sigue saliendo error en la llamada y estoy atascado ahí.También deberás cambiar un poco el código para que busque todos los ingredientes por si alguno es desconocido. Te dará error de compilación porque el prototipo de la función tiene que ser igual que la implementación y no lo habrás cambiado en ambas partes del código. Si el problema no es ese, añade el prototipo de la función, la implementación y la llamada para ver cómo la utilizas. De nuevo gracias por la ayuda. Código
MOD: El código debe estar entre etiquetas de Código GeSHi Título: Re: Petición de ayuda para un problema bastante básico de programación en c++ Publicado por: K-YreX en 9 Mayo 2021, 17:56 pm El código publicado en un mensaje debe estar entre etiquetas de Código GeSHi. Puedes seleccionarlas desde el desplegable que dice Código GeSHi (eligiendo el lenguaje adecuado) o escribiendo directamente:
[code=c] Tu código aquí [/code] Tienes 3 problemas:
Código
Si te limitas a copiar la solución sin entenderla, no vas a conseguir nada. El segundo problema demuestra que intentas utilizar una función sin entender su funcionamiento y en general todo demuestra que no quieres entenderlo, sólo conseguir que funcione. Y eso va a ser tu mayor problema. Igual de fácil que me es a mí saber todo eso sólo viendo tu código, le será a tu profesor/a o a quien tengas que entregar ese programa. Y una simple búsqueda por Internet le servirá para ver de dónde has sacado la solución... :rolleyes: :rolleyes: Intentando engañar a los demás, sólo te engañas a ti mismo. |