practica6germanAT 0.1.0

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,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.20
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="Practica6.html" title="Practica6 (module)">Practica6</a></span>
86
+
87
+
88
+
89
+ <strong class="classes">Classes:</strong> <span class='object_link'><a href="Comida.html" title="Comida (class)">Comida</a></span>, <span class='object_link'><a href="List.html" title="List (class)">List</a></span>, <span class='object_link'><a href="MejorPlato.html" title="MejorPlato (class)">MejorPlato</a></span>, <span class='object_link'><a href="Menu.html" title="Menu (class)">Menu</a></span>, <span class='object_link'><a href="Plato.html" title="Plato (class)">Plato</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 Tue Dec 17 19:32:04 2019 by
106
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
107
+ 0.9.20 (ruby-2.5.1).
108
+ </div>
109
+
110
+ </div>
111
+ </body>
112
+ </html>
data/lib/practica6.rb ADDED
@@ -0,0 +1,14 @@
1
+ require "practica6/version"
2
+ require 'bigdecimal'
3
+ require 'bigdecimal/util'
4
+ require "practica6/comida"
5
+ require "practica6/menu"
6
+ require "practica6/lista"
7
+ require "practica6/platos"
8
+ require "practica6/mejorplatos"
9
+
10
+ # test test test
11
+
12
+ module Practica6
13
+ class Error < StandardError; end
14
+ end
@@ -0,0 +1,59 @@
1
+ # @autor Germán Alfonso Teixidó
2
+ class Comida
3
+ # La clase es comparable
4
+ include Comparable;
5
+ # Los atributos son de lectura
6
+ attr_reader :nombre, :proteinas, :carbohidratos, :lipidos, :GEI, :costeTerreno
7
+
8
+ #
9
+ # Constructor
10
+ #
11
+ # @param [String] nombre Nombre del alimento.
12
+ # @param [Integer] proteinas Cantidad en gramos de proteinas.
13
+ # @param [Integer] carbohidratos Cantidad en gramos de carbohidratos.
14
+ # @param [Integer] lipidos Cantidad en gramos de lipidos.
15
+ # @param [Integer] gei Gases de efecto invernadero emitidos en la producción de 1000g de este alimento
16
+ # @param [Integer] costeTerreno m2 utilizados en la producción de 1000g de este alimento
17
+ #
18
+ def initialize(nombre, proteinas, carbohidratos, lipidos, gei, costeTerreno)
19
+ @nombre, @proteinas, @carbohidratos, @lipidos, @GEI, @costeTerreno= nombre, proteinas, carbohidratos, lipidos, gei, costeTerreno
20
+ end
21
+
22
+ #
23
+ # Devuelve un string con un resumen del alimento
24
+ #
25
+ # @return [String] Cadena del resumen del alimento.
26
+ #
27
+ def resumen()
28
+ "#{@nombre}:\n
29
+ -Proteinas:#{@proteinas}g.\n
30
+ -Carbohidratos:#{@carbohidratos}g.\n
31
+ -Lipidos:#{@lipidos}g.\n
32
+ -GEI:#{@GEI}kgCO2eq.\n
33
+ -Coste del terreno:#{@costeTerreno}m2año.\n"
34
+ end
35
+
36
+ #
37
+ # Devuelve un double con las kilocalorias que proporciona el alimento
38
+ #
39
+ # @return [Double] Kilocalorias que devuelve el alimento.
40
+ #
41
+ def kilocalorias
42
+ ((@proteinas* 4.0.to_d)+ (@lipidos* 9.0.to_d)+ (@carbohidratos* 4.0.to_d))
43
+ end
44
+
45
+ #
46
+ # Sobreescritura de la funcion <=> de la clase Comparable para comparar dos elementos
47
+ #
48
+ # @param [Comida] another Alimento con el que se pretende comparar este alimento (el alimento que proporcione mayor kilocalorias será mayor).
49
+ #
50
+ def <=>(another)
51
+ if another.class== Comida
52
+ aux1= kilocalorias
53
+ aux2= another.kilocalorias
54
+ aux1<=> aux2
55
+ end
56
+ end
57
+
58
+ end
59
+
@@ -0,0 +1,173 @@
1
+ # @autor Germán Alfonso Teixidó
2
+ class List
3
+ # La clase es enumerable
4
+ include Enumerable
5
+
6
+ # Nodo que forma la Lista
7
+ #
8
+ # @param [<Template>] value Contenido del nodo.
9
+ # @param [Node] next Siguiente nodo en la lista.
10
+ # @param [Node] prev Anterior nodo en la lista.
11
+ #
12
+ Node= Struct.new(:value, :next, :prev)
13
+
14
+ # Los atributos son de lecutra
15
+ attr_reader :tail, :head, :size
16
+
17
+ #
18
+ # Constructor. Genera una Lista vacia, sin nodos, con head y tail nil.
19
+ #
20
+ def initialize
21
+ @tail= nil
22
+ @head= nil
23
+ @size= 0
24
+ end
25
+
26
+ #
27
+ # Introduce un elemento (nodo o valor) en la lista por la cabeza.
28
+ # Si el valor es un nodo, se incluye directamente. Si no lo es, primero se transforma en nodo y se incluye en la lista.
29
+ #
30
+ # @param [<Template>] valor Nodo o valor a introducir en la lista.
31
+ #
32
+ def push_head(valor)
33
+ if valor.class== Node
34
+ addedNode= valor
35
+ else
36
+ addedNode= Node.new(valor)
37
+ end
38
+ addedNode.prev= nil
39
+ addedNode.next= @head
40
+ @head.prev= addedNode unless @head.nil?
41
+ @head= addedNode
42
+ @tail= addedNode if @tail.nil?
43
+ @size= @size+ 1
44
+ return nil
45
+ end
46
+
47
+ #
48
+ # Extrae un nodo en la lista por la cabeza.
49
+ #
50
+ # @return [<Template>] Valor del nodo extraido
51
+ #
52
+ def pop_head
53
+ @head= @head.next unless @head== nil
54
+ @head.prev= nil unless @head== nil
55
+ @tail= nil if @head== nil
56
+ if @size> 0
57
+ @size= @size- 1
58
+ end
59
+ return nil
60
+ end
61
+
62
+ #
63
+ # Introduce un elemento (nodo o valor) en la lista por la cola.
64
+ # Si el valor es un nodo, se incluye directamente. Si no lo es, primero se transforma en nodo y se incluye en la lista.
65
+ #
66
+ # @param [<Template>] valor Nodo o valor a introducir en la lista.
67
+ #
68
+ def push_tail(valor)
69
+ if valor.class== Node
70
+ addedNode= valor
71
+ else
72
+ addedNode= Node.new(valor)
73
+ end
74
+ addedNode.next= nil
75
+ addedNode.prev= @tail
76
+ @tail.next= addedNode unless @tail.nil?
77
+ @tail= addedNode
78
+ @head= addedNode if @head.nil?
79
+ @size= @size+ 1
80
+ return nil
81
+ end
82
+
83
+ #
84
+ # Extrae un nodo en la lista por la cola.
85
+ #
86
+ # @return [<Template>] Valor del nodo extraido
87
+ #
88
+ def pop_tail
89
+ @tail= @tail.prev unless @tail== nil
90
+ @tail.next= nil unless @tail== nil
91
+ @head= nil if @tail== nil
92
+ if @size> 0
93
+ @size= @size- 1
94
+ end
95
+ return nil
96
+ end
97
+
98
+ #
99
+ # Emisiones emitidas por el total de alimentos de la lista, en caso de que la lista sea de #Comida
100
+ #
101
+ # @return [Double] Emisiones totales de la lista de alimentos.
102
+ #
103
+ def emisiones
104
+ iterator= head
105
+ emision= 0.0.to_d
106
+ while iterator!= nil do
107
+ emision= emision+ iterator.value.GEI.to_d
108
+ iterator= iterator.next
109
+ end
110
+
111
+ return emision
112
+ end
113
+
114
+ #
115
+ # Emisiones anuales emitidas por el total de alimentos de la lista, en caso de que la lista sea de #Comida
116
+ #
117
+ # @return [Double] Emisiones totales de la lista de alimentos en un año.
118
+ #
119
+ def emisionest
120
+ return (emisiones* 365)
121
+ end
122
+
123
+ #
124
+ # Coste de terreno en m2 del total de alimentos de la lista, en caso de que la lista sea de #Comida
125
+ #
126
+ # @return [Double] Coste de terreno en m2 de la lista de alimentos.
127
+ #
128
+ def terreno
129
+ iterator= head
130
+ coste= 0.0.to_d
131
+ while iterator!= nil do
132
+ coste= coste+ iterator.value.GEI.to_d
133
+ iterator= iterator.next
134
+ end
135
+
136
+ return coste
137
+ end
138
+
139
+ #
140
+ # Ejecuta un bloque de código para cada elemento de la Lista.
141
+ #
142
+ def each
143
+ iterator= @head
144
+ while iterator!= nil do
145
+ yield iterator.value
146
+ iterator= iterator.next
147
+ end
148
+ end
149
+
150
+ #
151
+ # Permite acceder a un elemento de la lista en concreto.
152
+ #
153
+ # @param [Integer] posición del nodo al que se desea acceder.
154
+ #
155
+ # @return [<Tempalte>] Valor del nodo al que se ha accedido.
156
+ #
157
+ def [] (index)
158
+ if index.is_a?Integer
159
+ if index== 0
160
+ return @head.value
161
+ elsif index== (@size- 1)
162
+ return @tail.value
163
+ elsif index< (@size- 1) && index> 0
164
+ iterator= @head
165
+ index.times{iterator= iterator.next}
166
+ return iterator.value
167
+ else
168
+ return nil
169
+ end
170
+ end
171
+ end
172
+
173
+ end
@@ -0,0 +1,122 @@
1
+ # @autor Germán Alfonso Teixidó
2
+ class MejorPlato < Plato
3
+
4
+ #
5
+ # Constructor
6
+ #
7
+ # @param [String] nombrePlato Nombre del plato.
8
+ # @param [List] conjuntoAlimentos Lista de alimentos que forman el plato.
9
+ # @param [List] conjuntoCantidades Lista de cantidades de cada alimento que forma el plato.
10
+ #
11
+ def initialize(nombrePlato, conjuntoAlimentos, conjuntoCantidades)
12
+ super(nombrePlato, conjuntoAlimentos, conjuntoCantidades)
13
+ end
14
+
15
+ #
16
+ # Cantidad de gases de efecto invernadero liberados por el plato en cuestión.
17
+ #
18
+ # @return [Double] Emisiones de efecto ivernaderos emitidas por el plato.
19
+ #
20
+ def emisionInvernadero
21
+ emision= 0.0.to_d
22
+ conjuntoAlimentos.size.times do |i|
23
+ emision+= (conjuntoAlimentos[i].GEI.to_d)* (conjuntoCantidades[i].to_d/100.0)
24
+ end
25
+ return emision
26
+ end
27
+
28
+ #
29
+ # Cantidad de m2 que han necesitado ser utilizados para producir el plato.
30
+ #
31
+ # @return [Double] Coste en m2 de la producción del plato.
32
+ #
33
+ def costeTerreno
34
+ coste= 0.0.to_d
35
+ conjuntoAlimentos.size.times do |i|
36
+ coste+= (conjuntoAlimentos[i].costeTerreno.to_d)* (conjuntoCantidades[i].to_d/1000.0)
37
+ end
38
+ return coste
39
+ end
40
+
41
+ #
42
+ # Eficiencia energética del plato (kilocalorias)
43
+ #
44
+ # @return [Double] Kilocalorias producidas por el plato
45
+ #
46
+ def eficienciaEnergetica
47
+ eficiencia= 0.0.to_d
48
+ conjuntoAlimentos.size.times do |i|
49
+ eficiencia+= (conjuntoAlimentos[i].kilocalorias.to_d)* (conjuntoCantidades[i].to_d/1000.0)
50
+ end
51
+ return eficiencia
52
+ end
53
+
54
+ # Practica 9: Paradigmas de programacción funcional
55
+
56
+ #
57
+ # Devuelve un entero en un rango [1 - 3] que indica el impacto medioambiental del plato según su valor calórico total y sus emisiones de efecto invernadero.
58
+ #
59
+ # @return [Integer] Huella nutricional del plato (1, 2, 3).
60
+ #
61
+ def huellaNutricional
62
+ return (indicadorEnergia.to_i+ indicadorCarbono.to_i)/2.to_i
63
+ end
64
+
65
+ #
66
+ # Vease #huellaNutricional
67
+ #
68
+ def indicadorEnergia
69
+ if(valorCaloricoTotal< 670)
70
+ return 1
71
+ elsif(valorCaloricoTotal> 830)
72
+ return 3
73
+ else
74
+ return 2
75
+ end
76
+ end
77
+
78
+ #
79
+ # Vease #huellaNutricional
80
+ #
81
+ def indicadorCarbono
82
+ if(emisionInvernadero< 800)
83
+ return 1
84
+ elsif(emisionInvernadero> 1200)
85
+ return 3
86
+ else
87
+ return 2
88
+ end
89
+ end
90
+
91
+ #
92
+ # Sobreescritura de la funcion <=> de la clase Comparable para comparar dos elementos
93
+ #
94
+ # @param [Comida] another Plato/MejorPlato con el que se pretende comparar este Plato (el plato con mayor #huellaNutricional será mayor).
95
+ #
96
+ def <=>(another)
97
+ if another.class== MejorPlato
98
+ huellaNutricional<=> another.huellaNutricional
99
+ end
100
+ end
101
+
102
+ #
103
+ # Dado un array de platos y un array de precios, incrementa el array de los precios en base al plato con mayor Huella Nutricional del array de platos.
104
+ #
105
+ # @param [Array[Float]] arrayPrecios Array de precios.
106
+ # @param [Array[MejorPlato]] arrayPrecios Array de platos.
107
+ #
108
+ # @return [Array[Float]] array de precios arrayPrecio incrementado.
109
+ #
110
+ def self.aumentarPrecios(arrayPrecios, menu)
111
+ if(menu.max.huellaNutricional== 1)
112
+ arrayPrecios.map{ |a| a * 2}
113
+ elsif(menu.max.huellaNutricional== 2)
114
+ arrayPrecios.map{ |a| a * 3}
115
+ elsif(menu.max.huellaNutricional== 3)
116
+ arrayPrecios.map{ |a| a * 4}
117
+ else
118
+ return -1
119
+ end
120
+ end
121
+
122
+ end