InforNutricional 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,47 @@
1
+ # Clase para definir otros métodos de array
2
+ class Array
3
+
4
+
5
+ #Método para ordenar un array usando for.
6
+ def ordenar_For()
7
+ array_aux = Array.new()
8
+ array_aux = self
9
+
10
+ for i in 0..(array_aux.length) do
11
+ for j in 0..(array_aux.length-2) do
12
+ if(array_aux[j] > array_aux[j+1])
13
+ temp = array_aux[j]
14
+ array_aux[j] = array_aux[j+1]
15
+ array_aux[j+1] = temp
16
+ end
17
+ end
18
+ end
19
+ array_aux
20
+ end
21
+
22
+ #Método para ordenar un array usando each.
23
+ def ordenar_Each()
24
+
25
+ array_aux = Array.new()
26
+ array_aux = self
27
+
28
+ indice = 0
29
+ array_aux.each do |x|
30
+ array_aux.each do |y|
31
+ if (indice < array_aux.length-1)
32
+ if (array_aux[indice] > array_aux[indice+1])
33
+ temp = array_aux[indice]
34
+ array_aux[indice] = array_aux[indice+1]
35
+ array_aux[indice+1] = temp
36
+ end
37
+ end
38
+ indice = indice+1
39
+ end
40
+ indice = 0
41
+ end
42
+
43
+ array_aux
44
+ end
45
+
46
+ end
47
+
@@ -0,0 +1,132 @@
1
+ class Dsl_menu
2
+
3
+ attr_reader :ingesta, :desayunos, :almuerzos, :cenas
4
+
5
+ #Equivalencias de las porciones en gramos
6
+ @@equivalencias = {"pieza"=>200, "taza"=>250, "cucharón"=>80, "rodaja"=>50, "vaso"=>200, "porción"=>100}
7
+
8
+
9
+ def initialize (dia, &bloque)
10
+
11
+ @desayunos = ["Desayuno"]
12
+ @almuerzos = ["Almuerzo"]
13
+ @cenas = ["Cena"]
14
+ @dia = dia
15
+ @v_energ_total = 0.0
16
+
17
+ instance_eval(&bloque)
18
+
19
+ end
20
+
21
+
22
+ def titulo(titulo_aux)
23
+ @titulo = titulo_aux
24
+ end
25
+
26
+
27
+ def ingesta (opciones = {})
28
+ if (opciones[:min])
29
+ @min = opciones[:min]
30
+ end
31
+ if ( opciones[:max] )
32
+ @max = opciones[:max]
33
+ end
34
+ end
35
+
36
+
37
+ def convertidor(porcion)
38
+
39
+ num_array = porcion.split(" ")[0]
40
+ word_array = porcion.split(" ")[1]
41
+ gramos = num_array.to_f * @@equivalencias[word_array.chomp ' ']
42
+
43
+ gramos
44
+ end
45
+
46
+
47
+ def desayuno(opciones={})
48
+
49
+ if opciones[:gramos]
50
+ cantidad = opciones[:gramos]
51
+ elsif opciones[:porcion]
52
+ cantidad = convertidor(opciones[:porcion])
53
+ end
54
+
55
+ @desayuno_aux = Nutricion.new(opciones[:descripcion], opciones[:grasas].to_f, 0.0, 0.0, opciones[:carbohidratos].to_f, 0.0, 0.0, 0.0, opciones[:proteinas].to_f, 0.0, 0.0, opciones[:sal].to_f )
56
+
57
+ @v_energ_total += @desayuno_aux.kcal
58
+ @desayunos << @desayuno_aux
59
+
60
+ end
61
+
62
+
63
+ def almuerzo( opciones={} )
64
+
65
+ if opciones[:gramos]
66
+ cantidad = opciones[:gramos]
67
+ elsif opciones[:porcion]
68
+ cantidad = convertidor(opciones[:porcion])
69
+ end
70
+
71
+ @almuerzo_aux = Nutricion.new( opciones[:descripcion], opciones[:grasas].to_f, 0.0, 0.0, opciones[:carbohidratos].to_f , 0.0, 0.0, opciones[:fibra].to_f, opciones[:proteinas].to_f, 0.0, 0.0, opciones[:sal].to_f )
72
+
73
+
74
+ @v_energ_total += @desayuno_aux.kcal
75
+ @almuerzos << @almuerzo_aux
76
+
77
+ end
78
+
79
+
80
+ def cena( opciones={} )
81
+
82
+ if opciones[:gramos]
83
+ cantidad = opciones[:gramos]
84
+ elsif opciones[:porcion]
85
+ cantidad = convertidor(opciones[:porcion])
86
+ end
87
+
88
+ @cena_aux = Nutricion.new( opciones[:descripcion], opciones[:grasas], 0, 0, opciones[:carbohidratos], 0, 0, 0, opciones[:proteinas], 0, 0, opciones[:sal] )
89
+
90
+ @v_energ_total += @desayuno_aux.kcal
91
+ @cenas << @cena_aux
92
+
93
+ end
94
+
95
+
96
+ def to_s
97
+ output = @dia + "\t"
98
+ output += "\nMENU: " + @titulo
99
+ output += "\n\n\t\t\tComposición nutricional: \n"
100
+ output += "=============================================================================================================\n"
101
+
102
+ @desayunos.each_with_index do |desayuno, index|
103
+ output += "_____________________________________________________________________________________________________________\n"
104
+ output += "#{desayuno.to_s}\n"
105
+ end
106
+
107
+ output += "_____________________________________________________________________________________________________________\n"
108
+ output += ".............................................................................................................\n"
109
+
110
+ @almuerzos.each_with_index do |almuerzo, index|
111
+ output += "_____________________________________________________________________________________________________________\n"
112
+ output += "#{almuerzo.to_s}\n"
113
+ end
114
+
115
+ output += "_____________________________________________________________________________________________________________\n"
116
+ output += ".............................................................................................................\n"
117
+
118
+ @cenas.each_with_index do |cena, index|
119
+ output += "_____________________________________________________________________________________________________________\n"
120
+ output += "#{cena.to_s}\n"
121
+ end
122
+
123
+ output += "_____________________________________________________________________________________________________________\n"
124
+ output += ".............................................................................................................\n"
125
+ output += "Valor energetico total = " + (@v_energ_total).round(2).to_s
126
+ output += "\n=============================================================================================================\n"
127
+
128
+ output
129
+
130
+ end
131
+
132
+ end
@@ -0,0 +1,307 @@
1
+ # Clase que representa los datos básicos de un Individuo
2
+ class Individuo
3
+
4
+ attr_reader :nombre, :edad, :sexo
5
+ #Incluyendo módulo mixin comparable
6
+ include Comparable
7
+ #Método para inicializar y hacer new
8
+ def initialize(nombre, edad, sexo)
9
+ #Variables de instancia
10
+ @nombre = nombre
11
+ @edad = edad
12
+ @sexo = sexo
13
+
14
+ end
15
+
16
+ def to_s() #Método para mostrar los resultados.
17
+ "Datos del individuo: #{@nombre}. Edad: #{@edad}. Sexo: #{@sexo}. "
18
+ end
19
+
20
+
21
+ def <=>(other) # Método comparable
22
+ return nil unless other.instance_of?Individuo
23
+ @nombre <=> other.nombre
24
+ @edad <=> other.edad
25
+ @sexo <=> other.sexo
26
+ end
27
+
28
+ end
29
+
30
+
31
+ # Clase Paciente que hereda de Individuo
32
+ class Paciente < Individuo
33
+
34
+
35
+ attr_reader :nombre, :peso, :talla, :imc, :oms, :descripcion, :grasa, :edad, :sexo, :cintura, :cadera, :descripcion_rcc, :brazo, :tricipital, :bicipital, :subescapular, :suprailiaco, :rcc, :actividad, :peso_t_i, :gasto_energ_basal, :efecto_termogeno, :gasto_actividad, :gasto_energ_total
36
+ # include Comparable se hereda
37
+
38
+ #Método initialize:
39
+ def initialize(nombre, peso, talla, edad, sexo, cintura, cadera, brazo, tricipital, bicipital, subescapular, suprailiaco, actividad)
40
+
41
+ # Heredando datos básicos de Individuo
42
+ super(nombre, edad, sexo)
43
+
44
+ #Variables de instancia:
45
+ @peso = peso
46
+ @talla = talla
47
+ @cintura = cintura
48
+ @cadera = cadera
49
+ @brazo = brazo
50
+ @tricipital = tricipital
51
+ @bicipital = bicipital
52
+ @subescapular = subescapular
53
+ @suprailiaco = suprailiaco
54
+ @actividad = actividad
55
+
56
+ #Metodos:
57
+ calculo_imc(peso, talla)
58
+ clasificar_imc(imc)
59
+ descripcion_popular(imc)
60
+ calculo_grasa(imc, edad, sexo)
61
+ calculo_rcc(cintura, cadera, sexo)
62
+ calculo_circunferencia_brazo(brazo)
63
+ calculo_media_pliegues(tricipital, bicipital, subescapular, suprailiaco)
64
+ calculo_peso_teorico_ideal()
65
+ calculo_gasto_energetico_basal()
66
+ calculo_efecto_termogeno()
67
+ calculo_gasto_actividad_fisica()
68
+ calculo_gasto_energ_total()
69
+ end
70
+
71
+ # Método que calcula el peso teórico ideal del paciente
72
+ def calculo_peso_teorico_ideal()
73
+
74
+ @peso_t_i = (@talla - 1.50) * 0.75 + 50
75
+ @peso_t_i.round(3)
76
+ end
77
+
78
+ # Método que calcula el gasto energético basal según el sexo del paciente.
79
+ def calculo_gasto_energetico_basal()
80
+ if (@sexo == 0)
81
+ @gasto_energ_basal = (10.0*@peso) + (6.25 * @talla) - (5.0*@edad) - 161.0
82
+ else
83
+ @gasto_energ_basal = (10.0*@peso) + (6.25 * @talla) - (5.0*@edad) + 5.0
84
+ end
85
+ @gasto_energ_basal.round(3)
86
+ end
87
+
88
+ # Método que calcula el efecto termógeno del paciente.
89
+ def calculo_efecto_termogeno()
90
+ if (@sexo == 0)
91
+ @efecto_termogeno = @gasto_energ_basal*0.10
92
+ else
93
+ @efecto_termogeno = @gasto_energ_basal*0.10
94
+ end
95
+
96
+ @efecto_termogeno = @efecto_termogeno.round(3)
97
+ end
98
+
99
+ #Método que calcula el gasto de actividad física del paciente, en función a su actividad.
100
+ def calculo_gasto_actividad_fisica()
101
+ case @actividad
102
+ when "reposo"
103
+ @factor_act = 0.0
104
+ when "ligera"
105
+ @factor_act = 0.12
106
+ when "moderada"
107
+ @factor_act = 0.27
108
+ else
109
+ @factor_act = 0.54
110
+ end
111
+ @gasto_actividad = @gasto_energ_basal * @factor_act
112
+ @gasto_actividad = @gasto_actividad.round(4)
113
+ end
114
+
115
+ # Método que calcula el gasto energético total del paciente
116
+ def calculo_gasto_energ_total()
117
+ @gasto_energ_total = @gasto_energ_basal + @efecto_termogeno + @gasto_actividad
118
+ @gasto_energ_total.round(3)
119
+ end
120
+
121
+ # Método comparable
122
+ def <=>(other)
123
+ return nil unless other.instance_of?Paciente
124
+ # @peso <=> other.peso
125
+ # @talla <=> other.talla
126
+ # @cintura <=> other.cintura
127
+ # @cadera <=> other.cadera
128
+ # @brazo <=> other.brazo
129
+ # @tricipital <=> other.tricipital
130
+ # @bicipital <=> other.bicipital
131
+ # @subescapular <=> other.subescapular
132
+ # @suprailiaco <=> other.suprailiaco
133
+ @gasto_energ_total <=> other.gasto_energ_total
134
+ end
135
+
136
+ #Método para calcular el valor de imc dado el peso y altura de la persona:
137
+ def calculo_imc(peso, talla)
138
+ imc = peso/(talla*talla)
139
+ @imc = imc.round(2)
140
+ end
141
+
142
+
143
+
144
+ #Método para poder ver los valores que toman nuestras variables de instancia y así poder verificar la veracidad de los datos con respecto a los resultados de las pruebas:
145
+ def to_s()
146
+
147
+ @output = super
148
+
149
+ @output <<
150
+
151
+ "El IMC de la persona #{@nombre} es #{@imc}. Su peso es #{@peso} y su altura es #{@talla}. \nTeniendo en cuenta el imc se clasifica como #{@oms} y se considera #{@descripcion}" +
152
+ " \n#{@nombre} tiene #{@edad} años, es con sexo=#{@sexo} y tiene un porcentaje de grasa de #{@grasa}." +
153
+ " \nLa media de cintura es #{@cintura} y la media de cadera es #{@cadera}, por lo tanto la relación cadera-cintura(RCC) es #{@rcc}, parece ser #{@descripcion_rcc}" +
154
+ " Asimismo, la media de la circunferencia de su brazo es #{@brazo}." +
155
+ " \nLa media de los pliegues cutáneos(mm) es la siguiente: Media tricipital: #{@tricipital}; Media bicipital: #{@bicipital}; Media subescapular: #{@subescapular}; Media suprailiaco: #{@suprailiaco}."
156
+ end
157
+
158
+
159
+ #Método para clasificar el imc según la tabla:
160
+ def clasificar_imc(imc)
161
+ case @imc
162
+
163
+ when 0 .. 18.49
164
+ @oms = "bajo peso"
165
+ when 18.5 .. 24.9
166
+ @oms = "adecuado"
167
+ when 25.0 .. 29.9
168
+ @oms = "sobrepeso"
169
+ when 30.0 .. 34.9
170
+ @oms = "obesidad grado 1"
171
+ when 35.0 .. 39.9
172
+ @oms = "obesidad grado 2"
173
+
174
+ else
175
+ @oms = "obesidad grado 3"
176
+ end
177
+
178
+ end
179
+
180
+ #Método para clasificar el imc según la descripción popular:
181
+ def descripcion_popular(imc)
182
+ case @imc
183
+
184
+ when (0 .. 18.49)
185
+ @descripcion = "delgado."
186
+ when (18.5 .. 24.9)
187
+ @descripcion = "aceptable."
188
+ when (25.0 .. 29.9)
189
+ @descripcion = "sobrepeso."
190
+ when (30.0 .. 34.9)
191
+ @descripcion = "obesidad."
192
+ when (35.0 .. 39.9)
193
+ @descripcion = "obesidad."
194
+
195
+ else
196
+ @descripcion = "obesidad."
197
+ end
198
+
199
+ end
200
+
201
+ #Método para calcular el porcentaje de grasa según el valor del imc, edad y sexo de la persona. Son necesarios datos auxiliares para realizar el cálculo:
202
+ def calculo_grasa(imc, edad, sexo)
203
+ aux1 = 1.2
204
+ aux2 = 0.23
205
+ aux3 = 10.8
206
+ aux4 = 5.4
207
+
208
+ grasa = (aux1*imc) + (aux2*edad) - (aux3*sexo) - aux4
209
+ @grasa = grasa.round(2)
210
+
211
+ end
212
+
213
+ #Método para calcular la relación cadera-cintura dado las medias de estas y el sexo de la persona:
214
+ def calculo_rcc(cintura, cadera, sexo)
215
+
216
+ #Necesito calcular las medias de cintura
217
+ suma = 0
218
+ cintura.each { |num| suma += num }
219
+ @cintura = (suma/cintura.length).round(2)
220
+
221
+ #Necesito calcular las medias de cadera
222
+ suma = 0
223
+ cadera.each { |num| suma += num }
224
+ @cadera = (suma/cadera.length).round(2)
225
+
226
+ #Una vez tengo los datos calculo su rcc
227
+ rcc = (@cintura/@cadera).round(2)
228
+ @rcc = "#{rcc}"
229
+
230
+
231
+
232
+ #Determinando a partir del valor del rcc, el riesgo de la persona.
233
+
234
+ #Hombres
235
+ if (sexo == 1)
236
+ case rcc
237
+ when (0 .. 0.82)
238
+ @descripcion_rcc = "que los datos obtenidos son demasiado bajos."
239
+ when (0.83 .. 0.88)
240
+ @descripcion_rcc = "bajo."
241
+ when (0.89 .. 0.95)
242
+ @descripcion_rcc = "moderado."
243
+ when (0.96 .. 1.01)
244
+ @descripcion_rcc = "alto."
245
+
246
+ else
247
+ @descripcion_rcc = "muy alto."
248
+
249
+ end
250
+ end
251
+
252
+ #Mujeres
253
+ if (sexo == 0)
254
+ case rcc
255
+ when 0 .. 0.71
256
+ @descripcion_rcc = "que los datos obtenidos son demasiado bajos."
257
+ when 0.72 .. 0.75
258
+ @descripcion_rcc = "bajo."
259
+ when 0.76 .. 0.78
260
+ @descripcion_rcc = "bajo-moderado."
261
+ when 0.78 .. 0.82
262
+ @descripcionn_rcc = "moderado."
263
+
264
+ else
265
+ @descripcion_rcc = "alto."
266
+ end
267
+ end
268
+
269
+ end
270
+
271
+
272
+ #Método para calcular la circunferencia del brazo que faltaba por calcular:
273
+ def calculo_circunferencia_brazo(brazo)
274
+
275
+ suma = 0
276
+ brazo.each { |num| suma += num }
277
+ @brazo = (suma/brazo.length).round(2)
278
+
279
+ end
280
+
281
+
282
+ #Método para calcular la media de cada uno de los pliegues:
283
+ def calculo_media_pliegues(tricipital, bicipital, subescapular, suprailiaco)
284
+ suma = 0
285
+ tricipital.each { |num| suma += num }
286
+ @tricipital = (suma/tricipital.length).round(2)
287
+
288
+ suma = 0
289
+ bicipital.each { |num| suma += num }
290
+ @bicipital = (suma/bicipital.length).round(2)
291
+
292
+ suma = 0
293
+ subescapular.each { |num| suma += num }
294
+ @subescapular = (suma/subescapular.length).round(2)
295
+
296
+ suma = 0
297
+ suprailiaco.each { |num| suma += num }
298
+ @suprailiaco = (suma/suprailiaco.length).round(2)
299
+
300
+ end
301
+
302
+
303
+
304
+
305
+
306
+
307
+ end