module Alimento $alimentos = [] $alimentos << GrupoAlimento.new("Huevos, lácteos y helados", "Huevo frito", 14.1, 0.0, 19.5, []) $alimentos << GrupoAlimento.new("Huevos, lácteos y helados", "Leche vaca", 3.3, 4.8, 3.2, []) $alimentos << GrupoAlimento.new("Huevos, lácteos y helados", "Yogurt", 3.8, 4.9, 3.8, []) $alimentos << GrupoAlimento.new("Carnes y derivados", "Cerdo", 21.5, 0.0, 6.3, []) $alimentos << GrupoAlimento.new("Carnes y derivados", "Ternera", 21.1, 0.0, 3.1, []) $alimentos << GrupoAlimento.new("Carnes y derivados", "Pollo", 20.6, 0.0, 5.6, []) $alimentos << GrupoAlimento.new("Pescados y mariscos", "Bacalao", 17.7, 0.0, 0.4, []) $alimentos << GrupoAlimento.new("Pescados y mariscos", "Atún", 21.5, 0.0, 15.5, []) $alimentos << GrupoAlimento.new("Pescados y mariscos", "Salmón", 19.9, 0.0, 13.6, []) $alimentos << GrupoAlimento.new("Alimentos grasos", "Aceite de oliva", 0.0, 0.2, 99.6, []) $alimentos << GrupoAlimento.new("Alimentos grasos", "Mantequilla", 0.7, 0.0, 83.2, []) $alimentos << GrupoAlimento.new("Alimentos grasos", "Chocolate", 5.3, 47.0, 30.0, []) $alimentos << GrupoAlimento.new("Alimentos ricos en carbohidratos", "Azúcar", 0.0, 99.8, 0.0, []) $alimentos << GrupoAlimento.new("Alimentos ricos en carbohidratos", "Arroz", 6.8, 77.7, 0.6, []) $alimentos << GrupoAlimento.new("Alimentos ricos en carbohidratos", "Lentejas", 23.5, 52.0, 1.4, []) $alimentos << GrupoAlimento.new("Alimentos ricos en carbohidratos", "Papas", 2.0, 15.4, 0.1, []) $alimentos << GrupoAlimento.new("Verduras y Hortalizas", "Tomate", 1.0, 3.5, 0.2, []) $alimentos << GrupoAlimento.new("Verduras y Hortalizas", "Cebolla", 1.3, 5.8, 0.3, []) $alimentos << GrupoAlimento.new("Verduras y Hortalizas", "Calabaza", 1.1, 4.8, 0.1, []) $alimentos << GrupoAlimento.new("Frutas", "Manzana", 0.3, 12.4, 0.4, []) $alimentos << GrupoAlimento.new("Frutas", "Plátano", 1.2, 21.4, 0.2, []) $alimentos << GrupoAlimento.new("Frutas", "Pera", 0.5, 12.7, 0.3, []) $equivalencias = { "pieza pequeña" => 100, "piezas pequeñas" => 100, "pieza" => 140, "piezas" => 140, "taza" => 200, "tazas" => 200, "cucharon" => 120, "cucharones" => 120, "cucharada" => 60, "cucharadas" => 60, "gramos" => 100} class Plato attr_accessor :name, :ingredientes, :cantidad def initialize(name, &block) @name = name @ingredientes = [] @cantidad = [] if block_given? if block.arity == 1 yield self else instance_eval(&block) end end end def vegetal(name, options = {}) ingrediente(name, options) end def fruta(name, options = {}) ingrediente(name, options) end def cereal(name, options = {}) ingrediente(name, options) end def proteina(name, options = {}) ingrediente(name, options) end def aceite(name, options = {}) ingrediente(name, options) end def bebida(name, options = {}) ingrediente(name, options) end def ingrediente(name, options = {}) alimento = $alimentos.find { |i| i.nombre == name} gramos = 0 if options.has_key?(:porcion) valor = options[:porcion].partition(" ").first cantidad = options[:porcion] cantidad.slice! (valor + " ") gramos = valor.to_r * $equivalencias[cantidad] else gramos = options[:gramos] end @ingredientes << alimento @cantidad << gramos end def calorias_totales calorias = 0 (0..(@ingredientes.size-1)).each do |i| calorias += @ingredientes[i].valor_energetico.to_f * (@cantidad[i].to_f / 100) end return calorias end def to_s output = @name output << "\n" format = '%-18s %-10s %-10s %-10s %-15s' format << "\n" output << format % [' ', 'Glúcidos', 'Proteínas', 'Lípidos', 'Valor energético'] (0..(@ingredientes.size-1)).each do |i| nombre = @ingredientes[i].nombre glucidos = @ingredientes[i].glucidos.to_f * (@cantidad[i].to_f / 100) proteinas = @ingredientes[i].proteinas.to_f * (@cantidad[i].to_f / 100) lipidos = @ingredientes[i].lipidos.to_f * (@cantidad[i].to_f / 100) v_energetico= @ingredientes[i].valor_energetico.to_f * (@cantidad[i].to_f / 100) output << format % [nombre, glucidos.round(2), proteinas.round(2), lipidos.round(2), v_energetico.round(2)] end total_calorias = calorias_totales() output << format % ['Total Calorias',' ', ' ',' ', total_calorias.round(2)] return output end end end