ALU0100893649_ALIMENTO 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,112 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ Top Level Namespace
8
+
9
+ &mdash; Documentation by YARD 0.9.9
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ pathId = "";
19
+ relpath = '';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="class_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="_index.html">Index</a> &raquo;
40
+
41
+
42
+ <span class="title">Top Level Namespace</span>
43
+
44
+ </div>
45
+
46
+ <div id="search">
47
+
48
+ <a class="full_list_link" id="class_list_link"
49
+ href="class_list.html">
50
+
51
+ <svg width="24" height="24">
52
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
53
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
54
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
55
+ </svg>
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <div id="content"><h1>Top Level Namespace
63
+
64
+
65
+
66
+ </h1>
67
+ <div class="box_info">
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+ </div>
80
+
81
+ <h2>Defined Under Namespace</h2>
82
+ <p class="children">
83
+
84
+
85
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="ALU0100893649_ALIMENTO.html" title="ALU0100893649_ALIMENTO (module)">ALU0100893649_ALIMENTO</a></span>
86
+
87
+
88
+
89
+ <strong class="classes">Classes:</strong> <span class='object_link'><a href="Alimento.html" title="Alimento (class)">Alimento</a></span>, <span class='object_link'><a href="AlimentoCategorizable.html" title="AlimentoCategorizable (class)">AlimentoCategorizable</a></span>, <span class='object_link'><a href="GrupoAlimenticio.html" title="GrupoAlimenticio (class)">GrupoAlimenticio</a></span>, <span class='object_link'><a href="Lista.html" title="Lista (class)">Lista</a></span>, <span class='object_link'><a href="Node.html" title="Node (class)">Node</a></span>
90
+
91
+
92
+ </p>
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+ </div>
103
+
104
+ <div id="footer">
105
+ Generated on Fri Nov 24 11:12:15 2017 by
106
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
107
+ 0.9.9 (ruby-2.3.4).
108
+ </div>
109
+
110
+ </div>
111
+ </body>
112
+ </html>
data/lib/Alimento.rb ADDED
@@ -0,0 +1,11 @@
1
+ require "alimento/version"
2
+ require "alimento/Alimento"
3
+ require "alimento/Lista"
4
+ require "alimento/AlimentoCategorizable"
5
+ require "alimento/GrupoAlimenticio"
6
+ require "alimento/PlatoHarvard"
7
+
8
+ # Espacio de nombre que contiene las clases y metodos para el manejo de listas, nodos, alimentos y grupos de alimentos
9
+ # @since 1.0.0
10
+ module ALU0100893649_ALIMENTO
11
+ end
@@ -0,0 +1,65 @@
1
+ # Representación de un alimento según sus calorías aportadas y la cantidad de glucidos, proteinas y lipidos contenidos
2
+ #
3
+ # @author Sebastian Jose Diaz Rodriguez
4
+ # @since 1.0.0
5
+ # @attr_reader String nombre Nombre del alimento
6
+ # @attr_reader Number glucidos glucidos contenidos en el alimento
7
+ # @attr_reader Number proteinas preoteinas contenidos en el alimento
8
+ # @attr_reader Number lipidos lipidos contenidos en el alimento
9
+ class Alimento
10
+ include Comparable
11
+ attr_reader :nombre, :glucidos, :proteinas, :lipidos
12
+
13
+ # Constructor de Alimento
14
+ # @param [String] nombre nombre del alimento
15
+ # @param [Number] glucidos glucidos contenidos en el alimento
16
+ # @param [Number] proteinas preoteinas contenidos en el alimento
17
+ # @param [Number] lipidos lipidos contenidos en el alimento
18
+ #
19
+ # @return [Alimento] Devuelve el objeto creado de clase Alimento
20
+ def initialize(nombre, glucidos, proteinas, lipidos)
21
+ @nombre = nombre
22
+ @glucidos = glucidos
23
+ @proteinas = proteinas
24
+ @lipidos = lipidos
25
+ end
26
+
27
+ # Método para calcular el índice glucémico
28
+ # @param [Array<Float>] alimento vector con los datos de glucosa tras la ingesta del alimento por cada individuo en el experimento
29
+ # @param [Array<Float>] glucosa vector con los datos de glucosa tras la ingesta de 50gr de glucosa por cada individuo en el experimento
30
+ #
31
+ # @return [Float] Devuelve el índice glucémico dado el experimento
32
+ def calculate_index(alimento, glucosa)
33
+ acum = alimento.map{|data| data.map.with_index(1){|x, a| if(a >= data.length) then 0 else (((data[a] - data[0]) + (data[a - 1] - data[0])) /2)*5 end } }
34
+ aibc = acum.map{ |x| x.reduce{|i, a| i + a } }
35
+
36
+ acum = []
37
+
38
+ acum = glucosa.map{|data| data.map.with_index(1){|x, a| if(a >= data.length) then 0 else (((data[a] - data[0]) + (data[a - 1] - data[0])) /2)*5 end } }
39
+ aibcgl = acum.map{ |x| x.reduce{|i, a| i + a } }
40
+
41
+ igind = aibc.map.with_index { |a, x| ((aibc[x] / aibcgl[x]) * 100) }
42
+
43
+ igind.reduce(:+) / igind.length
44
+ end
45
+
46
+ # Convierte el objeto en un String
47
+ # @return [String] descripción del alimento en una cadena de caracteres
48
+ def to_s
49
+ x = "%-20s %-10.2f %-10.2f %-10.2f" % [nombre, proteinas, glucidos, lipidos]
50
+ return x
51
+ end
52
+
53
+ # Constructor de Alimento
54
+ # @return [Number] Devuelve el valor calórico del alimento representado
55
+ def kcal
56
+ @proteinas * 4 + @glucidos * 4 + @lipidos * 9
57
+ end
58
+
59
+ # Constructor de Alimento
60
+ # @param [Alimento] other otro objeto de clase Alimento
61
+ # @return [Number] Devuelve la relación de comparación entre el objeto que invoca el método y el otro objeto Alimento
62
+ def <=>(other)
63
+ kcal <=> other.kcal
64
+ end
65
+ end
@@ -0,0 +1,33 @@
1
+ # Representación de un alimento categorizable según sus calorías aportadas y la cantidad de glucidos, proteinas y lipidos contenidos
2
+ # Hereda de la clase Alimento
3
+ #
4
+ # @author Sebastian Jose Diaz Rodriguez
5
+ # @since 1.0.0
6
+ # @attr_reader String categoria Categoria del alimento
7
+ # @attr_reader String nombre Nombre del alimento
8
+ # @attr_reader Number glucidos glucidos contenidos en el alimento
9
+ # @attr_reader Number proteinas preoteinas contenidos en el alimento
10
+ # @attr_reader Number lipidos lipidos contenidos en el alimento
11
+ class AlimentoCategorizable < Alimento
12
+ attr_reader :categoria
13
+
14
+ # Constructor de Alimento
15
+ # @param [String] nombre nombre del alimento
16
+ # @param [String] categoria categoria del alimento
17
+ # @param [Number] glucidos glucidos contenidos en el alimento
18
+ # @param [Number] proteinas preoteinas contenidos en el alimento
19
+ # @param [Number] lipidos lipidos contenidos en el alimento
20
+ #
21
+ # @return [AlimentoCategorizable] Devuelve el objeto creado de clase AlimentoCategorizable
22
+ def initialize(nombre, categoria, glucidos, proteinas, lipidos)
23
+ super(nombre, glucidos, proteinas, lipidos)
24
+ @categoria = categoria
25
+ end
26
+
27
+ # Convierte el objeto en un String
28
+ # @return [String] descripción del alimento en una cadena de caracteres
29
+ def to_s
30
+ x = "%-10s %-40s %-10.2f %-10.2f %-10.2f" % [nombre, categoria, proteinas, glucidos, lipidos]
31
+ return x
32
+ end
33
+ end
@@ -0,0 +1,63 @@
1
+ # Representación de un grupo alimenticio con categoría
2
+ # Hereda de Lista
3
+ #
4
+ # @author Sebastian Jose Diaz Rodriguez
5
+ # @since 1.0.0
6
+ # @attr_reader String categoria categoria del grupo alimenticio representado
7
+ # @attr_reader Node head Nodo en la cabeza de la lista
8
+ # @attr_reader Node tail Nodo en la última posición de la lista
9
+
10
+ class GrupoAlimenticio < Lista
11
+ attr_reader :categoria
12
+
13
+ # Constructor de GrupoAlimenticio
14
+ # @param [String] categoria categoria del grupo alimenticio
15
+ #
16
+ # @return [GrupoAlimenticio] Devuelve el objeto creado de clase GrupoAlimenticio
17
+ def initialize(categoria)
18
+ super()
19
+ @categoria = categoria
20
+ end
21
+
22
+ # Inserción de AlimentoCategorizable por la cabeza de la lista del GrupoAlimenticio
23
+ # @param [any] x valor del nuevo nodo
24
+ #
25
+ # @return [Node] Devuelve el head
26
+ def push_alimento(x)
27
+ if(x.is_a?(AlimentoCategorizable))
28
+ push_head(AlimentoCategorizable.new(x.nombre, @categoria, x.glucidos, x.proteinas, x.lipidos))
29
+ end
30
+ end
31
+
32
+ # Inserción de varios AlimentoCategorizable por la cabeza de la lista del GrupoAlimenticio
33
+ # @param [Array<any>] x valores de los nuevos nodos
34
+ #
35
+ # @return [Node] Devuelve el head
36
+ def push_alimentos(x)
37
+ x.each do |alimento|
38
+ if(alimento.is_a?(AlimentoCategorizable))
39
+ push_head(AlimentoCategorizable.new(alimento.nombre, @categoria, alimento.glucidos, alimento.proteinas, alimento.lipidos))
40
+ end
41
+ end
42
+ end
43
+
44
+ # Extracción del primer AlimentoCategorizable del GrupoAlimenticio
45
+ #
46
+ # @return [any, nil] devuelve el valor guardado en el primer nodo o nil si no hay nodos en el GrupoAlimenticio
47
+ def pop_alimento()
48
+ pop_head()
49
+ end
50
+
51
+ # Convierte el objeto en un String
52
+ # @return [String] tabla de alimentos que conforman el grupo
53
+ def to_s
54
+ x = categoria + "\n"
55
+ titles = "#{" " * 21}%-10s %-10s %-10s\n" % ["proteínas", "glúcidos", "lípidos"]
56
+ x += titles
57
+ each do |alimento|
58
+ x += Alimento.instance_method(:to_s).bind(alimento).call + "\n"
59
+ end
60
+ x += "\n"
61
+ return x
62
+ end
63
+ end
@@ -0,0 +1,110 @@
1
+ # Representación de un nodo en una lista
2
+ #
3
+ # @author Sebastian Jose Diaz Rodriguez
4
+ # @since 1.0.0
5
+ # @attr_accessor any value Informacion contenida en el nodo
6
+ # @attr_accessor Node next Nodo siguiente con el que esta conectado
7
+ # @attr_accessor Node prev Nodo previo con el que esta conectado
8
+ Node = Struct.new(:value, :next, :prev)
9
+
10
+ # Representación de una lista doblemente enlazada de nodos
11
+ #
12
+ # @author Sebastian Jose Diaz Rodriguez
13
+ # @since 1.0.0
14
+ # @attr_reader Node head Nodo en la cabeza de la lista
15
+ # @attr_reader Node tail Nodo en la última posición de la lista
16
+ class Lista
17
+ include Enumerable
18
+ attr_reader :head, :tail
19
+
20
+ # Inserción por la cabeza de la lista
21
+ # @param [any] x valor del nuevo nodo
22
+ #
23
+ # @return [Node] Devuelve el head
24
+ def push_head(x)
25
+ if(@head == nil)
26
+ @head = Node.new(x, nil, nil)
27
+ @tail = @head
28
+ else
29
+ nuevo = Node.new(x, nil, nil)
30
+ nuevo.next= @head
31
+ @head.prev = nuevo
32
+ @head = nuevo
33
+ end
34
+ end
35
+
36
+ # Inserción por la cola de la lista
37
+ # @param [any] x valor del nuevo nodo
38
+ #
39
+ # @return [Node] Devuelve el tail
40
+ def push_tail(x)
41
+ if(@tail == nil)
42
+ @tail = Node.new(x, nil, nil)
43
+ @head = @tail
44
+ else
45
+ nuevo = Node.new(x, nil, nil)
46
+ nuevo.prev = @tail
47
+ @tail.next = nuevo
48
+ @tail = nuevo
49
+ end
50
+ end
51
+
52
+ # Inserción por la cola de la lista de varios nodos
53
+ # @param [Array<any>] x valores de los nuevos nodos
54
+ #
55
+ # @return [Node] Devuelve el tail
56
+ def push(x)
57
+ x.each{
58
+ |i| push_tail(i)
59
+ }
60
+ end
61
+
62
+ # Extracción del primer nodo de la lista
63
+ #
64
+ # @return [any, nil] devuelve el valor guardado en el primer nodo o nil si no hay nodos en la lista
65
+ def pop_head()
66
+ if(@head == nil)
67
+ return nil
68
+ end
69
+
70
+ x = @head
71
+ @head = @head.next
72
+ if(@head == nil)
73
+ @tail = nil
74
+ else
75
+ @head.prev = nil
76
+ x.next = nil
77
+ end
78
+ x.value
79
+ end
80
+
81
+ # Extracción del último nodo de la lista
82
+ #
83
+ # @return [any, nil] devuelve el valor guardado en el último nodo o nil si no hay nodos en la lista
84
+ def pop_tail()
85
+ if(@tail == nil)
86
+ return nil
87
+ end
88
+
89
+ x = @tail
90
+ @tail = @tail.prev
91
+ if(@tail == nil)
92
+ @head = nil
93
+ else
94
+ @tail.next = nil
95
+ x.prev = nil
96
+ end
97
+ x.value
98
+ end
99
+
100
+ # Método para la enumeración de los nodos de la lista
101
+ #
102
+ # @return [Node] devuelve los nodos que conforman la lista
103
+ def each
104
+ x = @head
105
+ while(x != nil)
106
+ yield x.value
107
+ x = x.next
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,93 @@
1
+ class PlatoHarvard
2
+ attr_reader :name, :ingredients, :measures
3
+
4
+ @@alimentos = {
5
+ "huevo" => AlimentoCategorizable.new("Huevo", "Huevos, lácteos y helados", 14.1, 0.0, 19.5),
6
+ "leche" => AlimentoCategorizable.new("Leche de vaca", "Huevos, lácteos y helados", 3.3, 4.8, 3.2),
7
+ "yogurt" => AlimentoCategorizable.new("Yogurt", "Huevos, lácteos y helados", 3.8, 4.9, 3.8),
8
+ "cerdo" => AlimentoCategorizable.new("Cerdo", "Carnes y derivados", 21.5, 0.0, 6.3),
9
+ "ternera" => AlimentoCategorizable.new("Ternera", "Carnes y derivados", 21.1, 0.0, 3.1),
10
+ "pollo" => AlimentoCategorizable.new("Pollo", "Carnes y derivados", 20.6, 0.0, 5.6),
11
+ "bacalao" => AlimentoCategorizable.new("Bacalao", "Pescados y mariscos", 17.7, 0.0, 0.4),
12
+ "atún" => AlimentoCategorizable.new("Atún", "Pescados y mariscos", 21.5, 0.0, 15.5),
13
+ "salmón" => AlimentoCategorizable.new("Salmón", "Pescados y mariscos", 19.9, 0.0, 13.6),
14
+ "aceite" => AlimentoCategorizable.new("Aceite de oliva", "Alimentos grasos", 0.0, 0.2, 99.6),
15
+ "mantequilla" => AlimentoCategorizable.new("Mantequilla", "Alimentos grasos", 0.7, 0.0, 83.2),
16
+ "chocolate" => AlimentoCategorizable.new("Chocolate", "Alimentos grasos", 5.3, 47.0, 30.0),
17
+ "azúcar" => AlimentoCategorizable.new("Azúcar", "Alimentos ricos en carbohidratos", 0.0, 99.8, 0.0),
18
+ "arroz" => AlimentoCategorizable.new("Arroz", "Alimentos ricos en carbohidratos", 6.8, 77.7, 0.6),
19
+ "lentejaz" => AlimentoCategorizable.new("Lentejas", "Alimentos ricos en carbohidratos", 23.5, 52.0, 1.4),
20
+ "papas" => AlimentoCategorizable.new("Papas", "Alimentos ricos en carbohidratos", 2.0, 15.4, 0.1),
21
+ "tomate" => AlimentoCategorizable.new("Tomate", "Verduras y hortalizas", 1.0, 3.5, 0.2),
22
+ "cebolla" => AlimentoCategorizable.new("Cebolla", "Verduras y hortalizas", 1.3, 5.8, 0.3),
23
+ "calabaza" => AlimentoCategorizable.new("Calabaza", "Verduras y hortalizas", 1.1, 4.8, 0.1),
24
+ "manzana" => AlimentoCategorizable.new("Manzana", "Fruta", 0.3, 12.4, 0.4),
25
+ "plátano" => AlimentoCategorizable.new("Plátano", "Fruta", 1.2, 21.4, 0.2),
26
+ "pera" => AlimentoCategorizable.new("Pera", "Fruta", 0.5 ,12.7, 0.3)
27
+ }
28
+
29
+ @@medidas = [[/piezas? pequeña/, 2],
30
+ [/pieza/ , 4],
31
+ [/taza/ , 1.5],
32
+ [/cuchara/ , 0.4],
33
+ [/cuchar[o|ó]n/ , 0.8],
34
+ [/vaso/ , 2],
35
+ [/pizca/ , 0.1]]
36
+
37
+ def initialize(name, &block)
38
+ @name = name
39
+ @ingredients = []
40
+ @measures = []
41
+
42
+ if block_given?
43
+ if block.arity == 1 then
44
+ yield self
45
+ else
46
+ instance_eval(&block)
47
+ end
48
+ end
49
+ end
50
+
51
+ def ingredient(name, amounts = {})
52
+ if(@@alimentos[name]) then
53
+ @ingredients << @@alimentos[name]
54
+ multiplier = 0
55
+ if(amounts[:porciones]) then
56
+ cantidad = amounts[:porciones].scan(/\d+[,.]?\d*/).first
57
+
58
+ @@medidas.each_index do |i|
59
+ if amounts[:porciones].scan(@@medidas[i][0]).first != nil then
60
+ multiplier = @@medidas[i][1]
61
+ end
62
+ end
63
+ @measures << (multiplier * cantidad.to_f)
64
+ elsif(amounts[:gramos]) then
65
+ cantidad = amounts[:gramos]
66
+ @measures << cantidad
67
+ end
68
+ end
69
+ end
70
+
71
+ alias_method :fruta, :ingredient
72
+ alias_method :vegetal, :ingredient
73
+ alias_method :cereales, :ingredient
74
+ alias_method :proteina, :ingredient
75
+ alias_method :aceite, :ingredient
76
+
77
+ def to_s
78
+ texto = String.new(@name)
79
+ texto << "\n#{'=' * @name.size}\n"
80
+ texto << "Composicion nutricional:\n"
81
+ texto << "#{" " * 51} %-10s %-10s %-10s%-10s\n" % ["proteínas", "glúcidos", "lípidos", "kcal"]
82
+ total = 0
83
+ @ingredients.each_with_index do |i , p|
84
+ texto << i.to_s
85
+ total += i.kcal * @measures[p]
86
+ texto << "%-6.2f" % [i.kcal * @measures[p] ]
87
+ texto << "\n"
88
+ end
89
+ texto << "#{'=' * @name.size}\n"
90
+ texto << "Valor energético total#{(" " * 62)}#{total}"
91
+ return texto
92
+ end
93
+ end