Portal    Foro    Buscar    FAQ    Registrarse    Conectarse

Problema Del Restaurante. Ejercicio

Problema Del Restaurante. Ejercicio
Artículo
Responder citando    Descargar mensaje  
Mensaje 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



 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Martes, 28 Abril 2020, 20:55 ]
 


Problema Del Restaurante. Ejercicio
Comentarios
Responder citando    Descargar mensaje  
Mensaje Re: Problema Del Restaurante. Ejercicio 
 
Muevo el hilo a "Retos"

Saludos



 
jguardon - Ver perfil del usuario Enviar mensaje privado  
jguardon [ Martes, 28 Abril 2020, 21:15 ]
Responder citando    Descargar mensaje  
Mensaje 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 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Miercoles, 29 Abril 2020, 09:50 ]
Responder citando    Descargar mensaje  
Mensaje 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: 266 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: 266 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: 266 veces




 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Lunes, 04 May 2020, 14:14 ]
Responder citando    Descargar mensaje  
Mensaje 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: 264 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: 264 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: 264 veces




 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Lunes, 04 May 2020, 14:22 ]
Responder citando    Descargar mensaje  
Mensaje 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



 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Lunes, 04 May 2020, 14:26 ]
Responder citando    Descargar mensaje  
Mensaje Re: Problema Del Restaurante. Ejercicio 
 
una vez que uno comprende POO, pasa a un plano superlativo en programacion

se transforma en Jedi



 
tercoIDE - Ver perfil del usuario Enviar mensaje privado  
tercoIDE [ Lunes, 04 May 2020, 14:45 ]
Responder citando    Descargar mensaje  
Mensaje 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 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Lunes, 04 May 2020, 15:11 ]
Responder citando    Descargar mensaje  
Mensaje 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



 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Lunes, 04 May 2020, 15:13 ]
Mostrar mensajes anteriores:    
 
Publicar nuevo tema  Responder al tema  Página 1 de 1
 
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 



 

cron