class Menu include Comparable attr_reader :titulo, :porcentaje, :descripcion, :porciones, :ingesta, :platos, :calorias,:proteinas,:grasas,:hidratos #Constructor de un Menu. Recibe 9 parámetros. #[Parámetros:] # * titulo : DESAYUNO|MEDIA MAÑANA|ALMUERZO|MERIENDA|CENA # * porcentaje : Array de dos enteros # * desc : Array de cadenas la cuales son descripciones de los platos # * porc : Array de cadenas la cuales son porciones de los platos # * gramos : Array de enteros los cuales son los gramos de cada plato # * calorias : Flotante que representa el porcentaje de calorías del menu # * proteinas : Entero que representa el porcentaje de proteinas del menu # * grasas : Entero que representa el porcentaje de grasas del menu # * hidratos : Entero que representa el porcentaje de hidratos del menu def initialize(titulo="DESAYUNO",porcentaje=[0,0],desc=[""],porc=[""],gramos=[0],calorias=0.0,proteinas=0,grasas=0,hidratos=0,&block) #Titulo regexp = /\s*(\w*)\s*(DESAYUNO|MEDIA MAÑANA|ALMUERZO|MERIENDA|CENA)\s*(\w*)\s*/ resultado = regexp.match(titulo) if (resultado == nil ) raise "Titulo no válido" elsif ((resultado[1] != "") || (resultado[3] != "")) raise "Titulo no válido" end @titulo = resultado[2] #Porcentaje if !porcentaje.is_a?(Array) raise "El porcentaje no es un array" elsif porcentaje.length > 2 raise "El rango del porcentaje tiene que estar entre dos numeros,se han especificado 3 o mas" elsif (porcentaje.length == 2) && !(porcentaje[0].is_a?(Integer) && porcentaje[1].is_a?(Integer)) raise "Uno de los numeros del rango no es un entero" elsif (porcentaje.length) == 1 && !(porcentaje[0].is_a?(Integer)) raise "El porcentaje no es un entero" elsif porcentaje.length == 0 raise "El porcentaje no se ha especificado" end @porcentaje = porcentaje #Descripcion de un plato if !desc.is_a?(Array) raise "Las descripciones de plato no estan en un array" elsif desc.length >= 1 desc.each{ |descripcion| if !descripcion.is_a?(String) raise "Las descripciones de plato deben ser cadena sde caracteres" end } elsif desc.length == 0 raise "Las descripciones de plato no han sido especificadas" end @descripcion = desc #Porcion recomendada de un plato if !porc.is_a?(Array) raise "Las porciones de plato no estan en un array" elsif porc.length >= 1 porc.each{ |porcion| if !porcion.is_a?(String) raise "Las porciones de plato deben ser cadenas de caracteres" end } elsif porc.length == 0 raise "Las descripciones de plato no han sido especificadas" end @porciones = porc #Ingesta de un plato if !gramos.is_a?(Array) raise "Las ingestas de plato no estan en un array" elsif gramos.length >= 1 gramos.each{ |ingesta| if !ingesta.is_a?(Integer) raise "Las ingestas de plato deben ser numeros" end } elsif gramos.length == 0 raise "Las ingestas de plato no han sido especificadas" end @ingesta = gramos #Platos. Calculo del numero de platos y estructura correcta de sus datos #platos,calorias,proteinas,grasas,hidratos @platos = @descripcion.length if @porciones.length != @platos raise "Los datos de los platos estan incompletos" elsif @ingesta.length != @platos raise "Los datos de los platos estan incompletos" end #Calorias if !calorias.is_a?(Float) raise "Las calorias deben ser de tipo flotante" end @calorias = calorias #Proteinas if !proteinas.is_a?(Integer) raise "Las proteinas deben ser de tipo entero" end @proteinas = proteinas #Grasas if !grasas.is_a?(Integer) raise "Las grasas deben ser de tipo entero" end @grasas = grasas #Hidratos de carbono if !hidratos.is_a?(Integer) raise "Los hidratos deben ser de tipo entero" end @hidratos = hidratos #Bloque if block_given? @descripcion = [] @porciones = [] @ingesta = [] @platos = 0 instance_eval &block end end #Metodo para obtener el titulo def get_titulo "#{@titulo}" end #Metodo para obtener el porcentaje def get_porcentaje if @porcentaje.length==1 "(#{@porcentaje[0]}%)" else "(#{@porcentaje[0]} - #{@porcentaje[1]}%)" end end #Metodo para obtener la descripcion del plato. Recibe un parámetro # [Parámetros:] # * num_plato : Entero que representa la descripción a obtener. 0 es el del primer plato def get_descripcion(num_plato) if (num_plato<0)&&(num_plato>@platos) raise "El plato no existe" else "#{@descripcion[num_plato]}" end end #Metodo para obtener un plato. Recibe un parámetro # [Parámetros:] # * num_plato : Entero que representa el plato a obtener. 0 es el primero def get_plato(num_plato) if (num_plato<0)&&(num_plato>@platos) raise "El plato no existe" else "- #{get_descripcion(num_plato)}, #{@porciones[num_plato]}, #{@ingesta[num_plato]} g" end end #Metodo para obtener el conjunto de platos def get_conjunto_platos i=0 cadena="" while(i<@platos) cadena=cadena+"#{get_plato(i)}" if(i!=@platos-1) #if para que no se añada \n en el ultimo plato cadena=cadena+"\n" end i=i+1 end cadena end #Metodo para obterner el VCT def get_vct "#{@calorias} kcal" end #Metodo para obtener el porcentaje de proteinas def get_proteinas "#{@proteinas}%" end #Metodo para obtener el porcentaje de proteinas def get_grasas "#{@grasas}%" end #Metodo para obtener el porcentaje de proteinas def get_hidratos "#{@hidratos}%" end #Metodo para obtener el menu formateado def to_s "#{get_titulo} #{get_porcentaje}\n#{get_conjunto_platos}\nV.C.T. | % #{get_vct} | #{get_proteinas} - #{get_grasas} - #{get_hidratos}" end #Metodo de comparación entre menus(Por calorias). Recibe un parámetro # [Parámetros:] # * other : Un objeto Menu def <=> other @calorias <=> other.calorias end #Metodo de comparación sobrecargando el operador == entre menus(Por calorias,proteinas,grasas e hidratos en este orden). Recibe un parámetro # [Parámetros:] # * other : Un objeto Menu def == (other) if (@calorias == other.calorias) if (@proteinas == other.proteinas) if (@grasas == other.grasas) if (@hidratos == other.hidratos) return true end end end end return false end def title(nombre) @titulo = nombre end def intake(opciones = {}) #@titulo = nombre #ingredient << " (#{optiones[:amount]})" if options[:amount] #ingredients << ingredient porcentaje = [] porcentaje << opciones[:min] porcentaje << opciones[:max] @porcentaje = porcentaje end def dish(opciones = {}) @descripcion << opciones[:descripcion] @porciones << opciones[:porcion] @ingesta << opciones[:gramos] @platos = @platos + 1 end def percentages(opciones = {}) @calorias = opciones[:vct] @proteinas = opciones[:proteinas] @grasas = opciones[:grasas] @hidratos = opciones[:hidratos] end end