gematdd-dibad 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.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +14 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +115 -0
- data/Guardfile +82 -0
- data/README.md +41 -0
- data/Rakefile +11 -0
- data/bin/bundle +105 -0
- data/bin/console +14 -0
- data/bin/htmldiff +29 -0
- data/bin/ldiff +29 -0
- data/bin/rspec +29 -0
- data/bin/setup +8 -0
- data/doc/DatosAntropometricos.html +782 -0
- data/doc/Etiqueta.html +1339 -0
- data/doc/Factor.html +262 -0
- data/doc/FactorActFisica.html +136 -0
- data/doc/FichaValoracionNutricional.html +857 -0
- data/doc/Gematdd.html +133 -0
- data/doc/Gematdd/Error.html +124 -0
- data/doc/Grasas.html +578 -0
- data/doc/Hidratos.html +576 -0
- data/doc/Individuo.html +845 -0
- data/doc/Lista.html +1281 -0
- data/doc/Node.html +409 -0
- data/doc/Paciente.html +379 -0
- data/doc/PacienteConDatos.html +988 -0
- data/doc/PacienteConObesidad.html +342 -0
- data/doc/PacienteSinObesidad.html +342 -0
- data/doc/_index.html +251 -0
- data/doc/class_list.html +51 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +58 -0
- data/doc/css/style.css +496 -0
- data/doc/file.README.html +118 -0
- data/doc/file_list.html +56 -0
- data/doc/frames.html +17 -0
- data/doc/index.html +118 -0
- data/doc/js/app.js +292 -0
- data/doc/js/full_list.js +216 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +787 -0
- data/doc/top-level-namespace.html +112 -0
- data/examples/ejemplo.rb +32 -0
- data/gematdd.gemspec +35 -0
- data/lib/gematdd.rb +6 -0
- data/lib/gematdd/etiqueta/etiqueta.rb +100 -0
- data/lib/gematdd/etiqueta/factor.rb +32 -0
- data/lib/gematdd/etiqueta/grasas.rb +24 -0
- data/lib/gematdd/etiqueta/hidratos.rb +23 -0
- data/lib/gematdd/lista/lista.rb +170 -0
- data/lib/gematdd/menu/menu.rb +89 -0
- data/lib/gematdd/menu/menu.rb~ +95 -0
- data/lib/gematdd/paciente/individuo.rb +37 -0
- data/lib/gematdd/paciente/paciente.rb +16 -0
- data/lib/gematdd/paciente/paciente_con_obesidad.rb +21 -0
- data/lib/gematdd/paciente/paciente_datos.rb +69 -0
- data/lib/gematdd/paciente/paciente_sin_obesidad.rb +22 -0
- data/lib/gematdd/valoracion/datos_antropometricos.rb +37 -0
- data/lib/gematdd/valoracion/ficha_valoracion.rb +70 -0
- data/lib/gematdd/version.rb +3 -0
- metadata +235 -0
@@ -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
|
+
— Documentation by YARD 0.9.16
|
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> »
|
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="Factor.html" title="Factor (module)">Factor</a></span>, <span class='object_link'><a href="FactorActFisica.html" title="FactorActFisica (module)">FactorActFisica</a></span>, <span class='object_link'><a href="Gematdd.html" title="Gematdd (module)">Gematdd</a></span>
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
<strong class="classes">Classes:</strong> <span class='object_link'><a href="DatosAntropometricos.html" title="DatosAntropometricos (class)">DatosAntropometricos</a></span>, <span class='object_link'><a href="Etiqueta.html" title="Etiqueta (class)">Etiqueta</a></span>, <span class='object_link'><a href="FichaValoracionNutricional.html" title="FichaValoracionNutricional (class)">FichaValoracionNutricional</a></span>, <span class='object_link'><a href="Grasas.html" title="Grasas (class)">Grasas</a></span>, <span class='object_link'><a href="Hidratos.html" title="Hidratos (class)">Hidratos</a></span>, <span class='object_link'><a href="Individuo.html" title="Individuo (class)">Individuo</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>, <span class='object_link'><a href="Paciente.html" title="Paciente (class)">Paciente</a></span>, <span class='object_link'><a href="PacienteConDatos.html" title="PacienteConDatos (class)">PacienteConDatos</a></span>, <span class='object_link'><a href="PacienteConObesidad.html" title="PacienteConObesidad (class)">PacienteConObesidad</a></span>, <span class='object_link'><a href="PacienteSinObesidad.html" title="PacienteSinObesidad (class)">PacienteSinObesidad</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 Wed Dec 12 00:08:11 2018 by
|
106
|
+
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
107
|
+
0.9.16 (ruby-2.5.1).
|
108
|
+
</div>
|
109
|
+
|
110
|
+
</div>
|
111
|
+
</body>
|
112
|
+
</html>
|
data/examples/ejemplo.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'lib/gematdd/paciente/paciente_con_obesidad'
|
2
|
+
require 'lib/gematdd/paciente/paciente_sin_obesidad'
|
3
|
+
|
4
|
+
p1 = Paciente.new("David", "Afonso Dorta", 1, "18-11-1998", "Estudiante",
|
5
|
+
"Clinica ULL")
|
6
|
+
puts p1.to_s
|
7
|
+
|
8
|
+
|
9
|
+
puts "------------------------------\n"
|
10
|
+
|
11
|
+
datos = DatosAntropometricos.new(50, 1.80, 52, 58)
|
12
|
+
p2 = PacienteConDatos.new("David", "Afonso Dorta", 1, "18-11-1998", "Estudiante",
|
13
|
+
"Clinica ULL", datos)
|
14
|
+
puts p2.to_s
|
15
|
+
|
16
|
+
|
17
|
+
puts "------------------------------\n"
|
18
|
+
|
19
|
+
datos = DatosAntropometricos.new(150, 1.80, 52, 58)
|
20
|
+
p3 = PacienteConObesidad.new("David", "Afonso Dorta", 1, "18-11-1998", "Estudiante",
|
21
|
+
"Clinica ULL", datos)
|
22
|
+
|
23
|
+
puts p3.to_s
|
24
|
+
|
25
|
+
|
26
|
+
puts "------------------------------\n"
|
27
|
+
|
28
|
+
datos = DatosAntropometricos.new(50, 1.80, 52, 58)
|
29
|
+
p4 = PacienteSinObesidad.new("David", "Afonso Dorta", 1, "18-11-1998", "Estudiante",
|
30
|
+
"Clinica ULL", datos)
|
31
|
+
|
32
|
+
puts p4.to_s
|
data/gematdd.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "gematdd/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "gematdd-dibad"
|
8
|
+
spec.version = Gematdd::VERSION
|
9
|
+
spec.authors = ["David Afonso"]
|
10
|
+
spec.email = ["alu0101015255@ull.edu.es"]
|
11
|
+
|
12
|
+
spec.summary = %q{Gema para las prácticas de LPP}
|
13
|
+
spec.description = %q{Gema utilizada durante las prácticas de LPP aprender
|
14
|
+
Ruby y los diferentes paradigmas de programación que hay}
|
15
|
+
spec.homepage = "https://github.com/ULL-ESIT-LPP-1819/tdd-Dibad.git"
|
16
|
+
|
17
|
+
# Specify which files should be added to the gem when it is released.
|
18
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
19
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
20
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
21
|
+
end
|
22
|
+
spec.bindir = "exe"
|
23
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
|
+
spec.require_paths = ["lib", "lib/gematdd"]
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.17"
|
27
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
29
|
+
spec.add_development_dependency "ruby-units"
|
30
|
+
spec.add_development_dependency "guard"
|
31
|
+
spec.add_development_dependency "guard-rspec"
|
32
|
+
spec.add_development_dependency "guard-bundler"
|
33
|
+
spec.add_development_dependency "yard"
|
34
|
+
spec.add_development_dependency "coveralls"
|
35
|
+
end
|
data/lib/gematdd.rb
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'ruby-units'
|
2
|
+
|
3
|
+
require 'etiqueta/grasas'
|
4
|
+
require 'etiqueta/hidratos'
|
5
|
+
require 'etiqueta/factor'
|
6
|
+
|
7
|
+
# Etiqueta utilizada en los cálculos del valor nutricional de un alimento.
|
8
|
+
# Utiliza las clases Grasa e Hidratos y el modulo Factor para los cálculos.
|
9
|
+
class Etiqueta
|
10
|
+
include Comparable
|
11
|
+
|
12
|
+
attr_accessor :nombre, :gramos, :grasas, :hidratos, :proteinas, :sal,
|
13
|
+
:fibra_alimentaria, :vitamina_mineral, :porciones
|
14
|
+
|
15
|
+
def initialize(nombre, gramos, grasas, hidratos, proteinas,
|
16
|
+
sal = nil, fibra_alimentaria = nil, vitamina_mineral = nil, porciones = 1)
|
17
|
+
@nombre = nombre
|
18
|
+
@gramos = Unit.new(gramos).convert_to('g')
|
19
|
+
@grasas = grasas
|
20
|
+
@hidratos = hidratos
|
21
|
+
@proteinas = Unit.new(proteinas).convert_to('g')
|
22
|
+
@sal = Unit.new(sal).convert_to('g') unless sal.nil?
|
23
|
+
@fibra_alimentaria = Unit.new(fibra_alimentaria).convert_to('g') unless fibra_alimentaria.nil?
|
24
|
+
@vitamina_mineral = Unit.new(vitamina_mineral).convert_to('mg') unless vitamina_mineral.nil?
|
25
|
+
@porciones = porciones
|
26
|
+
end
|
27
|
+
|
28
|
+
# Devuelve el valor nutricional de un alimento en Kilojulios
|
29
|
+
def valor_nutr_kj
|
30
|
+
grasas.total * Factor::GRASAS_KJ + hidratos.total * Factor::HIDRATOS_KJ + proteinas *
|
31
|
+
Factor::PROTEINAS_KJ
|
32
|
+
end
|
33
|
+
|
34
|
+
# Devuelve el valor nutricional de un alimento en Kilocalorías
|
35
|
+
def valor_nutr_kcal
|
36
|
+
grasas.total * Factor::GRASAS_KCAL + hidratos.total * Factor::HIDRATOS_KCAL + proteinas *
|
37
|
+
Factor::PROTEINAS_KCAL
|
38
|
+
end
|
39
|
+
|
40
|
+
# Calcula la cantidad de gramos que tendrá un nutriente por cada una de las
|
41
|
+
# porciones del alimento
|
42
|
+
def por_porcion(nutriente)
|
43
|
+
(nutriente * (gramos / porciones) / '100 g').round(2).abs unless nutriente.nil?
|
44
|
+
end
|
45
|
+
|
46
|
+
# Cálculo de la Ingesta de Referencia (IR)
|
47
|
+
def IR(nutriente)
|
48
|
+
case nutriente
|
49
|
+
when :valor_energ_kj
|
50
|
+
n = valor_nutr_kj / Factor::VALOR_ENERG_KJ_IR
|
51
|
+
when :valor_energ_kcal
|
52
|
+
n = valor_nutr_kcal / Factor::VALOR_ENERG_KCAL_IR
|
53
|
+
when :grasas
|
54
|
+
n = grasas.total / Factor::GRASAS_IR
|
55
|
+
when :saturadas
|
56
|
+
n = grasas.saturadas / Factor::SATURADAS_IR
|
57
|
+
when :hidratos
|
58
|
+
n = hidratos.total / Factor::HIDRATOS_IR
|
59
|
+
when :azucares
|
60
|
+
n = hidratos.azucares / Factor::AZUCARES_IR
|
61
|
+
when :proteinas
|
62
|
+
n = proteinas / Factor::PROTEINAS_IR
|
63
|
+
when :sal
|
64
|
+
n = sal / Factor::SAL_IR
|
65
|
+
when :vitamina_mineral
|
66
|
+
n = vitamina_mineral / Factor::VITAMINA_MINERAL_IR unless
|
67
|
+
vitamina_mineral.nil?
|
68
|
+
end
|
69
|
+
|
70
|
+
n.convert_to('%').round(2).abs unless n.nil?
|
71
|
+
end
|
72
|
+
|
73
|
+
def <=>(other)
|
74
|
+
[sal, proteinas, hidratos, grasas, gramos,
|
75
|
+
fibra_alimentaria, vitamina_mineral, porciones] <=>
|
76
|
+
[other.sal, other.proteinas, other.hidratos, other.grasas, other.gramos,
|
77
|
+
other.fibra_alimentaria, other.vitamina_mineral, other.porciones]
|
78
|
+
end
|
79
|
+
|
80
|
+
def to_s
|
81
|
+
"\t--> Etiqueta de Información Nutricional de #{nombre} <--
|
82
|
+
|
83
|
+
Gramos del producto: #{gramos}\t\t Nº de porciones: #{porciones}
|
84
|
+
|
85
|
+
\t\t\tPor 100g o 100ml\tIR\t\tPor porcion de #{(gramos / porciones)}\t\tIR
|
86
|
+
Valor energetico\t#{valor_nutr_kj} / #{valor_nutr_kcal}\t#{IR(:valor_energ_kj)}\t\t#{por_porcion(valor_nutr_kj)} / #{por_porcion(valor_nutr_kcal)}\t\t#{por_porcion(IR(:valor_energ_kj))}
|
87
|
+
Grasas\t\t#{grasas.total}\t\t\t#{IR(:grasas)}\t\t#{por_porcion(grasas.total)}\t\t\t\t#{por_porcion(IR(:grasas))}
|
88
|
+
- Saturadas\t\t#{grasas.saturadas}\t\t\t#{IR(:saturadas)}\t\t#{por_porcion(grasas.saturadas)}\t\t\t\t#{por_porcion(IR(:saturadas))}
|
89
|
+
- Monoinsaturadas\t#{grasas.monoinsaturadas}\t\t\t-\t\t#{por_porcion(grasas.monoinsaturadas)}\t\t\t\t-
|
90
|
+
- Polinsaturadas\t#{grasas.polinsaturadas}\t\t\t-\t\t#{por_porcion(grasas.polinsaturadas)}\t\t\t\t-
|
91
|
+
Hidratos\t\t#{hidratos.total}\t\t\t#{IR(:hidratos)}\t\t#{por_porcion(hidratos.total)}\t\t\t\t#{por_porcion(IR(:hidratos))}
|
92
|
+
- Azucares\t\t#{hidratos.azucares}\t\t\t#{IR(:azucares)}\t\t#{por_porcion(hidratos.azucares)}\t\t\t\t#{por_porcion(IR(:azucares))}
|
93
|
+
- Polialcoholes\t\t#{hidratos.polialcoholes}\t\t-\t\t#{por_porcion(hidratos.polialcoholes)}\t\t\t\t-
|
94
|
+
- Almidón\t\t#{hidratos.almidon}\t\t\t-\t\t#{por_porcion(hidratos.almidon)}\t\t\t\t-
|
95
|
+
Fibra alimentaria\t#{fibra_alimentaria}\t\t\t-\t\t#{por_porcion(fibra_alimentaria)}\t\t\t\t-
|
96
|
+
Proteínas\t\t#{proteinas}\t\t\t#{IR(:proteinas)}\t\t#{por_porcion(proteinas)}\t\t\t\t#{por_porcion(IR(:proteinas))}
|
97
|
+
Sal\t\t\t#{sal}\t\t\t#{IR(:sal)}\t\t#{por_porcion(sal)}\t\t\t\t#{por_porcion(IR(:sal))}
|
98
|
+
Vitamina/Mineral\t#{vitamina_mineral}\t\t\t#{IR(:vitamina_mineral)}\t\t#{por_porcion(vitamina_mineral)}\t\t\t\t#{por_porcion(IR(:vitamina_mineral))}"
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Constantes utilizadas en los cálculos de los valores nutricionales
|
2
|
+
module Factor
|
3
|
+
GRASAS_KJ = '37 kJ/g'.freeze
|
4
|
+
MONOINSATURADAS_KJ = '37 kJ/g'.freeze
|
5
|
+
POLINSATURADAS_KJ = '37 kJ/g'.freeze
|
6
|
+
HIDRATOS_KJ = '17 kJ/g'.freeze
|
7
|
+
POLIALCOHOLES_KJ = '10 kJ/g'.freeze
|
8
|
+
ALMIDON_KJ = '17 kJ/g'.freeze
|
9
|
+
FIBRA_ALIMENTARIA_KJ = '8 kJ/g'.freeze
|
10
|
+
PROTEINAS_KJ = '17 kJ/g'.freeze
|
11
|
+
SAL_KJ = '25 kJ/g'.freeze
|
12
|
+
|
13
|
+
GRASAS_KCAL = '9 kcal/g'.freeze
|
14
|
+
MONOINSATURADAS_KCAL = '9 kcal/g'.freeze
|
15
|
+
POLINSATURADAS_KCAL = '9 kcal/g'.freeze
|
16
|
+
HIDRATOS_KCAL = '4 kcal/g'.freeze
|
17
|
+
POLIALCOHOLES_KCAL = '2.4 kcal/g'.freeze
|
18
|
+
ALMIDON_KCAL = '4 kcal/g'.freeze
|
19
|
+
FIBRA_ALIMENTARIA_KCAL = '2 kcal/g'.freeze
|
20
|
+
PROTEINAS_KCAL = '4 kcal/g'.freeze
|
21
|
+
SAL_KCAL = '6 kcal/g'.freeze
|
22
|
+
|
23
|
+
VALOR_ENERG_KJ_IR = '8400 kJ'.freeze
|
24
|
+
VALOR_ENERG_KCAL_IR = '2000 kcal'.freeze
|
25
|
+
GRASAS_IR = '70 g'.freeze
|
26
|
+
SATURADAS_IR = '20 g'.freeze
|
27
|
+
HIDRATOS_IR = '260 g'.freeze
|
28
|
+
AZUCARES_IR = '90 g'.freeze
|
29
|
+
PROTEINAS_IR = '50 g'.freeze
|
30
|
+
SAL_IR = '6 g'.freeze
|
31
|
+
VITAMINA_MINERAL_IR = '80 mg'.freeze
|
32
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'ruby-units'
|
2
|
+
|
3
|
+
# Agrupa los diferentes tipos de grasas que pueden haber en una etiqueta
|
4
|
+
class Grasas
|
5
|
+
include Comparable
|
6
|
+
|
7
|
+
attr_accessor :total, :saturadas, :monoinsaturadas, :polinsaturadas
|
8
|
+
def initialize(total, saturadas, monoinsaturadas = nil, polinsaturadas =
|
9
|
+
nil)
|
10
|
+
@total = Unit.new(total).convert_to('g')
|
11
|
+
@saturadas = Unit.new(saturadas).convert_to('g')
|
12
|
+
@monoinsaturadas = Unit.new(monoinsaturadas).convert_to('g') unless monoinsaturadas.nil?
|
13
|
+
@polinsaturadas = Unit.new(polinsaturadas).convert_to('g') unless polinsaturadas.nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
def <=>(other)
|
17
|
+
[total, saturadas, monoinsaturadas, polinsaturadas] <=>
|
18
|
+
[other.total, other.saturadas, other.monoinsaturadas, other.polinsaturadas]
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
"#{total}"
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'ruby-units'
|
2
|
+
|
3
|
+
# Agrupa los diferentes tipos de hidratos que puede tener una etiqueta
|
4
|
+
class Hidratos
|
5
|
+
include Comparable
|
6
|
+
|
7
|
+
attr_accessor :total, :azucares, :polialcoholes, :almidon
|
8
|
+
def initialize(total, azucares, polialcoholes = nil, almidon = nil)
|
9
|
+
@total = Unit.new(total).convert_to('g')
|
10
|
+
@azucares = Unit.new(azucares).convert_to('g')
|
11
|
+
@polialcoholes = Unit.new(polialcoholes).convert_to('g') unless polialcoholes.nil?
|
12
|
+
@almidon = Unit.new(almidon).convert_to('g') unless almidon.nil?
|
13
|
+
end
|
14
|
+
|
15
|
+
def <=>(other)
|
16
|
+
[total, azucares, polialcoholes, almidon] <=>
|
17
|
+
[other.total, other.azucares, other.polialcoholes, other.almidon]
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
"#{@total}"
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
# Nodos utilizados por la lista (Unidad mínima)
|
2
|
+
Node = Struct.new(:value, :next, :prev)
|
3
|
+
|
4
|
+
# Implementación de una Lista Doblemente Enlazada
|
5
|
+
class Lista
|
6
|
+
include Enumerable
|
7
|
+
include Comparable
|
8
|
+
|
9
|
+
attr_reader :head, :tail, :size
|
10
|
+
|
11
|
+
def initialize(*values)
|
12
|
+
@size = 0
|
13
|
+
values.each{|val| push_back(val)}
|
14
|
+
end
|
15
|
+
|
16
|
+
# Comprueba si la lista está vacía
|
17
|
+
def empty?
|
18
|
+
@size.zero?
|
19
|
+
end
|
20
|
+
|
21
|
+
# Limpia la lista completamente
|
22
|
+
def clear
|
23
|
+
@head = @tail = nil
|
24
|
+
@size = 0
|
25
|
+
end
|
26
|
+
|
27
|
+
def front
|
28
|
+
@head.value unless @head == nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def back
|
32
|
+
@tail.value unless @tail == nil
|
33
|
+
end
|
34
|
+
|
35
|
+
# Inserta elementos en la lista desde el frente
|
36
|
+
def push_front(value)
|
37
|
+
node = Node.new(value, @head, nil)
|
38
|
+
|
39
|
+
if empty?
|
40
|
+
@head = @tail = node
|
41
|
+
else
|
42
|
+
@head.prev = node
|
43
|
+
@head = node
|
44
|
+
end
|
45
|
+
|
46
|
+
@size += 1
|
47
|
+
end
|
48
|
+
|
49
|
+
# Elimina elementos en la lista desde el frente
|
50
|
+
def pop_front
|
51
|
+
node = @head
|
52
|
+
|
53
|
+
if @size == 1
|
54
|
+
node = @head
|
55
|
+
@head = @tail = nil
|
56
|
+
else
|
57
|
+
@head.next.prev = nil
|
58
|
+
@head = @head.next
|
59
|
+
node.next = nil
|
60
|
+
end
|
61
|
+
|
62
|
+
@size -= 1
|
63
|
+
node
|
64
|
+
end
|
65
|
+
|
66
|
+
# Inserta elementos en la lista desde detrás
|
67
|
+
def push_back(value)
|
68
|
+
node = Node.new(value, nil, @tail)
|
69
|
+
if empty?
|
70
|
+
@head = @tail = node
|
71
|
+
else
|
72
|
+
@tail.next = node
|
73
|
+
@tail = node
|
74
|
+
end
|
75
|
+
|
76
|
+
@size += 1
|
77
|
+
end
|
78
|
+
|
79
|
+
# Elimina elementos en la lista desde detrás
|
80
|
+
def pop_back
|
81
|
+
node = @tail
|
82
|
+
if @size == 1
|
83
|
+
node = @tail
|
84
|
+
@head = @tail = nil
|
85
|
+
else
|
86
|
+
@tail.prev.next = nil
|
87
|
+
@tail = @tail.prev
|
88
|
+
node.prev = nil
|
89
|
+
end
|
90
|
+
|
91
|
+
@size -= 1
|
92
|
+
node
|
93
|
+
end
|
94
|
+
|
95
|
+
# Inserta un valor después del nodo especificado
|
96
|
+
def insert(node, value)
|
97
|
+
inserted = Node.new(value, node.next, node)
|
98
|
+
node.next.prev = inserted
|
99
|
+
node.next = inserted
|
100
|
+
|
101
|
+
@size += 1
|
102
|
+
inserted
|
103
|
+
end
|
104
|
+
|
105
|
+
def remove(value)
|
106
|
+
if @size == 1 && @head.value == value
|
107
|
+
@head = @tail = nil
|
108
|
+
else
|
109
|
+
node = @head
|
110
|
+
while node
|
111
|
+
if node.value == value
|
112
|
+
erase(node)
|
113
|
+
break
|
114
|
+
end
|
115
|
+
node = node.next
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# Elimina el nodo especificado
|
121
|
+
def erase(node)
|
122
|
+
if @size == 1 && @head == node
|
123
|
+
@head = @tail = nil
|
124
|
+
@size -= 1
|
125
|
+
else
|
126
|
+
if @size > 1
|
127
|
+
if @head == node
|
128
|
+
pop_front
|
129
|
+
elsif @tail == node
|
130
|
+
pop_back
|
131
|
+
else
|
132
|
+
node.next.prev = node.prev
|
133
|
+
node.prev.next = node.next
|
134
|
+
@size -= 1
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
node.next = nil
|
140
|
+
node.prev = nil
|
141
|
+
node
|
142
|
+
end
|
143
|
+
|
144
|
+
# Recorre la lista doblemente enlazada de principio a fin
|
145
|
+
def each
|
146
|
+
current = @head
|
147
|
+
while current
|
148
|
+
yield current.value
|
149
|
+
current = current.next
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# Ordena la lista (sobre ella misma)
|
154
|
+
def for_sort!
|
155
|
+
swapped = true
|
156
|
+
|
157
|
+
while swapped
|
158
|
+
node = @head
|
159
|
+
swapped = false
|
160
|
+
while node && !node.next.nil?
|
161
|
+
if node.next.value < node.value
|
162
|
+
node.value, node.next.value = node.next.value, node.value
|
163
|
+
swapped = true
|
164
|
+
end
|
165
|
+
node = node.next
|
166
|
+
end
|
167
|
+
node = @head if swapped
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|