require "alimentos/version" # # Modulo que contiene todo los relacionado con el TDD # # @author Pablo Molina Martinez alu0101103181@ull.edu.es # module Alimentos # # Encargada de la representacion de un alimento # # @author Pablo Molina Martinez alu0101103181@ull.edu.es # class Alimento include Comparable, Enumerable attr_accessor :name, :gei, :terrain, :pro, :car, :lip # # Da valores a las variables de instacia de la clase # # @param [String] name Nombre del alimento # @param [Float] gei Efectos de gas invernadero del alimento # @param [Float] terrain M^2 de terreno # @param [Float] pro Proteinas por cada 100 gr # @param [Float] car Carbohidratos por cada 100 gr # @param [Float] lip Lipidos por cada 100 gr # def initialize(name, gei, terrain, pro, car, lip) @name = name @gei = gei @terrain = terrain @pro = pro @car = car @lip = lip end # # Formato del alimento a string # # @return [String] String con el formato para la representacion de un alimento # def to_s "#{@name}, #{@gei}, #{terrain}" end # # Calcula las calorias de un alimento # # @return [Float] (Proteinas + Carbohidratos) * 4 + Lipidos * 9 # def energi (@pro * 4 + @car * 4 + @lip * 9).round(2) end # # Calcula el impacto ambiental de un alimento # # @return [Float] Gases de efecto inverdero + Terreno # def ambient (@gei + @terrain).round(2) end # # Calcula el impacto sobre la dieta diaria nesesaria para un hombre de X gramos del alimento # # @param [Float] x Cantidad de gramos del alimento a calcular # # @return [[Float,Float]] Las calorias y las proteinas diarias # def impactMen(x) [((energi / 3000) * x / 100).round(2), ((@pro / 54) * x / 100).round(2)] end # # Calcula el impacto sobre la dieta diaria nesesaria para una mujer de X gramos del alimento # # @param [Float] x Cantidad de gramos del alimento a calcular # # @return [[Float,Float]] Las calorias y las proteinas diarias # def impactWom(x) [((energi / 2300) * x / 100).round(2), ((@pro / 41) * x / 100).round(2)] end end # # Encargada de la representacion de una lista doblemente elazada # # @author Pablo Molina Martinez alu0101103181@ull.edu.es # class Lista include Comparable, Enumerable attr_reader :lista, :cabeza, :cola, :tam # # Crea un lista vacia, con una cabeza nula y una cola nula, ademas de un tamaño 0 # def initialize @lista = [] @cabeza = nil @cola = nil @tam = 0 end # # Inserta un nodo por la cola de la lista, cambiando la cola del ultimo nodo y poniendo la del suyo propio a 0 # # @param [Node] nodo Nodo que se va a insertar a la lista # # @return [Int] Devuelve el tamaño nuevo de la lista # def insert(nodo) node = Struct.new(:value, :next, :prev) if @cabeza == nil @lista[@tam] = node.new(nodo, nil, nil) @cabeza = @lista[0] @cola = @lista[0] else @lista[@tam] = node.new(nodo, nil, @lista[@tam - 1]) @lista[@tam - 1].next = @lista[@tam] @cola = @lista[@tam] end @tam += 1 end # # Extrae la cabeza de la lista modificado el 2 miembro. # # @return [Int] Devuelve el tamaño nuevo de la lista # def extract_head @tam -= 1 aux = @cabeza @lista.slice!(0) if @tam != 0 @lista[0].prev = nil @cabeza = @lista[0] @cola = @lista[@tam - 1] end aux end # # Extrae la cola de la lista modificado el antepenultimo miembro. # # @return [Int] Devuelve el tamaño nuevo de la lista # def extract_tail aux = @cola @lista.slice!(@tam - 1) @tam -= 1 if @tam != 0 @lista[@tam - 1].next = nil @cola = @lista[@tam - 1] end aux end end # # Encargada de la representacion de un plato con diferentes cantidades de alimentos # # @author Pablo Molina Martinez alu0101103181@ull.edu.es # class Plato include Comparable attr_reader :name, :receip, :grams # # Da valor a las variables de instacia de la clase # # @param [String] name Nombre del plato # @param [Array[Alimento]] receip Lista de alimentos del plato # @param [Array[Int]] grams Lista de gramos de los alimentos # def initialize(name, receip, grams) @name = name @receip = receip @grams = grams end # # Comparable para Plato, centrado en las calorias # # @param [Plato] param Plato a comparar # # @return [Bool] Devuelve el booleano de realizar la comprobacion de Comparable # def <=>(param) calories <=> param.calories end # # Calcula el porcentaje de proteinas de un plato # # @return [Float] Porcentaje de proteinas # def proPercent aux = 0 for i in 0..@receip.tam - 1 aux += @receip.lista[i].value.pro end x = [] for i in 0..@receip.tam - 1 x[i] = (@receip.lista[i].value.pro / aux).round(2) end x end # # Calcula el porcentaje de lipidos de un plato # # @return [Float] Porcentaje de lipidos # def lipPercent aux = 0 for i in 0..@receip.tam - 1 aux += @receip.lista[i].value.lip end x = [] for i in 0..@receip.tam - 1 x[i] = (@receip.lista[i].value.lip / aux).round(2) end x end # # Calcula el porcentaje de carbohidratos de un plato # # @return [Float] Porcentaje de carbohidratos # def carPercent aux = 0 for i in 0..@receip.tam - 1 aux += @receip.lista[i].value.car end x = [] for i in 0..@receip.tam - 1 x[i] = (@receip.lista[i].value.car / aux).round(2) end x end # # Calcula las calorias de un plato en comparacion a los gramos # # @return [Float] Calorias del plato con respecto a sus gramos # def calories aux = [] for i in 0..@grams.length() - 1 aux[i] = @grams[i] / 100 end cal = 0 for i in 0..@grams.length() - 1 cal += @receip.lista[i].value.energi * aux[i] end (cal).round(2) end # # Formato de un plato a string # # @return [String] String con el formato para la representacion de un plato # def to_s aux = "" for i in 0..@receip.tam - 1 aux += "#{@receip.lista[i].value.name} " end aux end end # # Encargada de la representacion de un plato centrada en su impacto ambiental # # @author Pablo Molina Martinez alu0101103181@ull.edu.es # class PlatoA < Plato include Comparable # # Llama al constructor de Plato (su padre) # # @param [String] name Nombre del plato # @param [Array[Alimento]] receip Lista de alimentos del plato # @param [Array[Int]] grams Lista de gramos de los alimentos # def initialize(name, receip, grams) super(name, receip, grams) end # # Comparable para PlatoA, centrado en la huella nutricional # # @param [Plato] param PlatoA a comparar # # @return [Bool] Devuelve el booleano de realizar la comprobacion de Comparable # def <=>(param) huella_nut <=> param.huella_nut end # # Calcula la huella nutricional de un plato y halla su baremo # # @return [Float] Media entre la huella calorica y ambiental baremadas # def huella_nut cal = calories gas = plato_ambiente if cal < 670 cal = 1 elsif cal < 830 cal = 2 else cal = 3 end if gas < 800 gas = 1 elsif gas < 1200 gas = 2 else gas = 3 end (cal + gas) / 2.round(2) end # # Calcula los gases de efecto invernaderos de un plato # # @return [Float] Gases de efecto invernadero # def plato_gei aux = 0 for i in 0..@receip.tam - 1 aux += @receip.lista[i].value.gei end aux.round(2) end # # Cacula el uso del terreno en m^2 de un plato # # @return [Float] Uso del terreno en M^2 # def plato_terreno aux = [] for i in 0..@grams.length() - 1 aux[i] = @grams[i] / 100 end x = 0 for i in 0..@receip.tam - 1 x += @receip.lista[i].value.terrain * aux[i] end x.round(2) end # # Calcula el impacto ambiental de un plato # # @return [Float] Impacto ambiental del plato # def plato_ambiente aux = [] for i in 0..@grams.length() - 1 aux[i] = @grams[i] / 100 end x = 0 for i in 0..@receip.tam - 1 x += @receip.lista[i].value.gei * aux[i] end x.round(2) end # # Formato del plato a string # # @return [String] String con el formato para la representacion de un PlatoA # def to_s "#{plato_gei}, #{plato_terreno}" end end class PlatoB def initialize(nombre, &bloque) @nombre = nombre @alimentos = [] if block_given? if bloque.arity == 1 yield self else instance_eval(&bloque) end end end def alimento(alimento) @alimentos << [alimento[:descripcion], alimento[:gramos]] end def nombre(nombre) @descripcion = nombre end def to_s plato = "" plato << @nombre + ", " + @descripcion + " compuesta de: \n" @alimentos.each do |alimento| plato << alimento[0] + " => " + alimento[1].to_s + ".gr\n" end plato end end class MenuA def initialize(nombre, &bloque) @nombre = nombre @platos = [] @precio = 0 @descripcion = "" if block_given? if bloque.arity == 1 yield self else instance_eval(&bloque) end end end def componente (componentes) @platos << [componentes[:descripcion], componentes[:precio]] end def descripcion(descripcion) @descripcion = descripcion end def precio(precio) @precio = precio end def to_s menu = "" menu << @nombre + ", " + @descripcion + " con valor " + @precio.to_s + "\n" @platos.each do |plato| menu << plato[0].to_s + "Con valor:" + plato[1].to_s + "\n" end menu end end end