https://foro.gambas-es.org/viewtopic.php?f=15&t=8006&p=48296#p48296
-----------------------------------
Shell
Lunes, 04 May 2020, 14:22

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. :-D

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

[code linenumbers=false syntax=gambas]
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
[/code]

Plato:

[code linenumbers=false syntax=gambas]
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
[/code]

Y el bloque principal:

[code linenumbers=false syntax=gambas]
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
[/code]

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


