Problema Del Restaurante. Ejercicio


Objetivo: Problema Del Restaurante. Ejercicio
Buenas!.

Os propongo resolver un problema:
Se trata de un restaurante que es el mejor haciendo "huevos" con "chorizos".

Tenemos que averiguar cuantos platos se pueden hacer si:

- Cada plato está formado por 2 huevos y 200g de chorizo.

A la función hay que pasarle la cantidad de huevos y chorizos que tenemos en la despensa.
Creando una función resolver el problema.

Public Function numdeplatos(docenasdehuevo As Integer, kilosdechorizo As Float) As Integer



End


He encontrado dos formas de hacerlo. Razonar la respuesta.

Saludos

Objetivo: Re: Problema Del Restaurante. Ejercicio
Muevo el hilo a "Retos"

Saludos

Perfil MP  
Objetivo: Re: Problema Del Restaurante. Ejercicio
Ups, no sabía que había un subforo para esto.

Aunque puedo verlo directamente al responder. Ahora ya sé que se encuentra en Aplicaciones/Fragmentos de Código.

Saludos

última edición por Shell el Miercoles, 29 Abril 2020, 09:53; editado 1 vez
Objetivo: Re: Problema Del Restaurante. Ejercicio
Bueno!.

Gran interés!. (Ocurre en todos los foros de programación).

El problema no es resolver el ejercicio, es usar la lógica para encontrar la mejor solución.
Y eso es lo más complicado. Y que se debe ejercer.

Forma que lo haríamos, paso a paso. Si tenemos una cantidad de ingredientes y sabemos que necesitamos,
podemos ir restando una y otra vez de los ingredientes disponibles y crear un plato, llegará un momento que no
podamos hacer más platos.

' Procedimiento habitual
Public Function numdeplatosv1(docenasdehuevo As Integer, kilosdechorizo As Float) As Integer

Dim totalingrediente1 As Integer
Dim totalingrediente2 As Float
Dim totaldeplatos As Integer

'Cantidad total de los ingredientes
'Unidades
totalingrediente1 += docenasdehuevo * 12
'Gramos
totalingrediente2 += kilosdechorizo * 1000

'Se necesita para un plato:
' 2 huevos
' 200g de chorizo

'Vamos eliminando de las existencias los ingredientes necesarios por cada plato
Repeat
totalingrediente1 -= HUEVOSPORPLATO
totalingrediente2 -= CHORIZOPORPLATO
totaldeplatos += 1
Until totalingrediente1 < 2 Or totalingrediente2 < 200

Return totaldeplatos

End


Pero y si...decimos, si se nos acaba uno de los ingredientes necesario para un plato,
no tenemos por que continuar....esto resulta un poco más complejo de pensar la primera vez.

'Pocedimiento alternativo y más rápido
Public Function numdeplatosv2(docenasdehuevo As Integer, kilosdechorizo As Float) As Integer

Dim totalingrediente1 As Integer
Dim totalingrediente2 As Float

'Cantidad total de los ingredientes
'Unidades
totalingrediente1 += docenasdehuevo * 12
'Gramos
totalingrediente2 += kilosdechorizo * 1000

'Se necesita para un plato:
' 2 huevos
' 200g de chorizo

'Si se acaba uno de los ingredientes ya no podemos hacer más plato
'Devolvemos la cantidad de platos máximos que se admite con un total de un ingredientes
If totalingrediente1 / HUEVOSPORPLATO < totalingrediente2 / CHORIZOPORPLATO Then
Return totalingrediente1 / HUEVOSPORPLATO
Else
Return totalingrediente2 / CHORIZOPORPLATO
Endif

End


Fijaros que el condicional comprueba dos ingredientes..Pero y si ahora le queremos
añadir "patatas fritas!" al plato, ahora serian más ingredientes...esa condición no nos valdría..


Y si...usamos otras cosas....

Saludos


Restaurante-0.0.1.tar.gz
Descripción: Problema de lógica. Encontrar cuantos platos podemos hacer con dos ingredientes 
Descargar
Nombre del archivo: Restaurante-0.0.1.tar.gz
Tamaño: 11.71 KB
Descargado: 252 veces
Restaurante-0.0.1.tar.gz
Descripción: Problema de lógica. Encontrar cuantos platos podemos hacer con dos ingredientes 
Descargar
Nombre del archivo: Restaurante-0.0.1.tar.gz
Tamaño: 11.71 KB
Descargado: 252 veces
Restaurante-0.0.1.tar.gz
Descripción: Problema de lógica. Encontrar cuantos platos podemos hacer con dos ingredientes 
Descargar
Nombre del archivo: Restaurante-0.0.1.tar.gz
Tamaño: 11.71 KB
Descargado: 252 veces

Objetivo: Re: Problema Del Restaurante. Ejercicio
Pues la última parte.

No he usado una interfaz gráfica. Quedaría mejor..pero eso es lo de menos, o quizás..no.

Apliquemos ahora programación orientada a o objeto. Usamos dos clases.
Ingrediente:

Private hnombre As String
Private hunidades As Integer

Property Read nombre As String
Property unidades As Integer


Public Sub _new($nombre As String, $unidades As Integer)

hnombre = $nombre
hunidades = $unidades

End

Private Function nombre_Read() As String

Return hnombre

End

Private Function unidades_Read() As Integer

Return hunidades

End

Private Sub unidades_Write(Value As Integer)

hunidades = Value

End

Public Sub addIngrediente(cantidad As Float)

hunidades += cantidad

End


Plato:

Private hnombredelplato As String
Property nombredelplato As String

Private hingredientesparaplato As Collection
Property Read ingredientesparaplato As Collection

Public Sub _new(nomdeplato As String, ...)

Dim ingredientenecesario As Ingrediente
Dim nomingrediente As Ingrediente

hnombredelplato = nomdeplato
hingredientesparaplato = New Collection

For Each nomingrediente In Param
ingredientenecesario = New Ingrediente(nomingrediente.nombre, nomingrediente.unidades)
hingredientesparaplato.Add(ingredientenecesario, ingredientenecesario.nombre)
Next

End

Private Function nombredelplato_Read() As String

Return hnombredelplato

End

Private Sub nombredelplato_Write(Value As String)

hnombredelplato = Value

End

'Probablemente se pueda abreviar
Public Function TotalDePlatos(existencias As Ingrediente[]) As Integer

Dim totaldeplatosposiblesconingrediente As Integer
Dim ingredienteconmenosexistencias As Ingrediente
Dim i As Integer

ingredienteconmenosexistencias = existencias[0]
totaldeplatosposiblesconingrediente = ingredienteconmenosexistencias.unidades / hingredientesparaplato[ingredienteconmenosexistencias.nombre].unidades

For i = 1 To existencias.Count - 1
If totaldeplatosposiblesconingrediente < existencias[i].unidades / hingredientesparaplato[ingredienteconmenosexistencias.nombre].unidades Then
ingredienteconmenosexistencias = existencias[i]
Endif
Next

Return ingredienteconmenosexistencias.unidades / hingredientesparaplato[ingredienteconmenosexistencias.nombre].unidades

End

Private Function ingredientesparaplato_Read() As Collection

Return hingredientesparaplato

End


Y el bloque principal:

Public Sub Main()

Dim platohuevoconchorizos As Plato

'Los ingredientes que necesitamos
Dim ingredientenecesario1 As Ingrediente
Dim ingredientenecesario2 As Ingrediente

'Los que vamos a tener que comprar
Dim existenciasdeingrediente1 As Ingrediente
Dim existenciasdeingrediente2 As Ingrediente

'Todo los ingredientes que voy a tener del mismo plato
Dim existenciastotales As New Ingrediente[]

'Ingredientes para hacer un plato de huevos con chorizos
ingredientenecesario1 = New Ingrediente("huevos", 2)
ingredientenecesario2 = New Ingrediente("chorizos", 200)

'Vamos al mercado a comprar los ingredientes...:-D

existenciasdeingrediente1 = New Ingrediente(ingredientenecesario1.nombre, 0)
existenciasdeingrediente1.addIngrediente(36)

existenciasdeingrediente2 = New Ingrediente(ingredientenecesario2.nombre, 0)
existenciasdeingrediente2.addIngrediente(1000)

' Y los añadimos a la despensa
existenciastotales.Add(existenciasdeingrediente1)
existenciastotales.Add(existenciasdeingrediente2)

'Leemos la receta y le añadimos los ingredientes que necesita
platohuevoconchorizos = New Plato("Huevos con chorizos", ingredientenecesario1, ingredientenecesario2)

'Con los que tenemos en la despensa podemos hacer:
Print Subst("Platos que se pueden preparar: &1", platohuevoconchorizos.TotalDePlatos(existenciastotales))

End


Como habréis visto he usado unidades, no kg en la mayoría de los problemas. La solución es la misma.

Ahora se le añade una GUI y quedará mejor. Pero para la lógica no se necesitan florituras.
Si para los ojos y atraer usuarios..

Saludos


RestaurantePOO-0.0.1.tar.gz
Descripción: Resolver el problema del restaurante usando la programación orientada a objetos. Sin interfaz gráfica. 
Descargar
Nombre del archivo: RestaurantePOO-0.0.1.tar.gz
Tamaño: 12.35 KB
Descargado: 250 veces
RestaurantePOO-0.0.1.tar.gz
Descripción: Resolver el problema del restaurante usando la programación orientada a objetos. Sin interfaz gráfica. 
Descargar
Nombre del archivo: RestaurantePOO-0.0.1.tar.gz
Tamaño: 12.35 KB
Descargado: 250 veces
RestaurantePOO-0.0.1.tar.gz
Descripción: Resolver el problema del restaurante usando la programación orientada a objetos. Sin interfaz gráfica. 
Descargar
Nombre del archivo: RestaurantePOO-0.0.1.tar.gz
Tamaño: 12.35 KB
Descargado: 250 veces

Objetivo: Re: Problema Del Restaurante. Ejercicio
¿ Sabéis que cuando nos acostumbramos a la programación por procedimientos cometemos errores a la hora de crear el mismo programa en POO ?.

Visto eso. Mejor comenzar directamente por POO..

Dice un dicho. "La programación por procedimientos a la hora de depurarla es como llevar encima un calamar gigante y no puedes evitar que algún tentáculo
te de en toda la cara."

Saludos

Objetivo: Re: Problema Del Restaurante. Ejercicio
una vez que uno comprende POO, pasa a un plano superlativo en programacion

se transforma en Jedi

Perfil MP  
Objetivo: Re: Problema Del Restaurante. Ejercicio
tercoIDE:

Citar:

una vez que uno comprende POO, pasa a un plano superlativo en programacion

se transforma en Jedi




Bueno, pero no quita que nos podamos equivocar también...
En ese caso la localización se simplifica más.

Saludos

última edición por Shell el Lunes, 04 May 2020, 15:14; editado 1 vez
Objetivo: Re: Problema Del Restaurante. Ejercicio
Añado los ordinogramas.

Básico:

procedimentob_sico

Mejor depurado:

procedimientomejorusado

Código en PseInt:

Citar:

Algoritmo Restaurante
Escribir numdeplatosv1(3, 1);
Escribir numdeplatosv2(3, 1);
FinAlgoritmo

Funcion platos <- numdeplatosv1(docenasdehuevo, kilosdechorizo)
Definir platos Como Entero;
docenasdehuevo <- docenasdehuevo * 12;
kilosdechorizo <- kilosdechorizo * 1000;
platos <- 0;
Repetir
docenasdehuevo<-docenasdehuevo - 2;
kilosdechorizo<-kilosdechorizo - 200;
platos<-platos + 1;
Hasta Que (docenasdehuevo<2 o kilosdechorizo<200)

FinFuncion

Funcion platos <- numdeplatosv2(docenasdehuevo , kilosdechorizo)
Definir n1 Como Entero;
Definir n2 Como Real;
Definir platos Como Entero;
n1 <- (docenasdehuevo * 12) / 2 ;
n2 <- (kilosdechorizo * 1000) / 200;

si n1 < n2 Entonces
// Devolver n1
platos <- n1;
sino
// Devolver n2
platos <- n2;
FinSi
FinFuncion


Saludos


Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.2146s (PHP: -14% SQL: 114%)
Consultas SQL: 48 - Debug off - GZIP Activado