P06 0.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="P06.html" title="P06 (module)">P06</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="Alimento_concreto.html" title="Alimento_concreto (class)">Alimento_concreto</a></span>, <span class='object_link'><a href="Array.html" title="Array (class)">Array</a></span>, <span class='object_link'><a href="List.html" title="List (class)">List</a></span>, <span class='object_link'><a href="Nodo.html" title="Nodo (class)">Nodo</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 Nov 28 18:13:07 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.0).
108
+ </div>
109
+
110
+ </div>
111
+ </body>
112
+ </html>
@@ -0,0 +1,23 @@
1
+ require "P06/version"
2
+ require "P06/alimento"
3
+ require "P06/list"
4
+ require "P06/alimento_concreto"
5
+ require "P06/DSL"
6
+ require 'benchmark'
7
+
8
+
9
+ # encoding: utf-8
10
+ # Este modulo se ha creado para poder
11
+ # poner el código que necesitemos
12
+ # poner para poder realizar los
13
+ # TDD del spec.
14
+ # Este código va a pertenecer a las
15
+ # distintas clases que hemos ido creando:
16
+ # Alimento, Alimento_concreto y List.
17
+ #
18
+ #Author: Juan Pablo Claros Romero (alu0100972603@ull.edu.es)
19
+
20
+
21
+ module P06
22
+ # Your code goes here...
23
+ end
@@ -0,0 +1,168 @@
1
+ class DSL
2
+
3
+ attr_accessor :name, :datos, :total
4
+
5
+ def initialize(nombre, alimentos, &block)
6
+ @nombre = nombre
7
+ @datos = []
8
+ @alimentos = alimentos
9
+ @total = 0
10
+
11
+ if block_given?
12
+ if block.arity == 1
13
+ yield self
14
+ else
15
+ instance_eval(&block)
16
+ end
17
+ end
18
+ end
19
+
20
+ def to_s
21
+
22
+ output = "\n#{@nombre}"
23
+ output << "\n#{'=' * 80}\n\n"
24
+ output << "Composicion nutricional:\n"
25
+ output << "\t\t|Proteínas\tGlúcidos\tLípidos\t\tValor Energético\n"
26
+ for i in (0..@alimentos.size-1)
27
+ if @alimentos[i].nombre.size > 7
28
+ output << "#{@alimentos[i].nombre}\t|#{@alimentos[i].proteinas}\t\t#{@alimentos[i].glucidos}\t\t#{@alimentos[i].grasas}\t\t#{@datos[i].round(2)}"
29
+ else
30
+ output << "#{@alimentos[i].nombre}\t\t|#{@alimentos[i].proteinas}\t\t#{@alimentos[i].glucidos}\t\t#{@alimentos[i].grasas}\t\t#{@datos[i].round(2)}"
31
+ end
32
+ @total = @total + datos[i]
33
+ output << "\n"
34
+ end
35
+ output << "#{'=' * 80}\n\n"
36
+ output << "Valor energético total\t\t\t\t\t\t#{@total.round(2)}\n\n"
37
+
38
+ output
39
+ end
40
+
41
+ def vegetal(nombre, opciones = {})
42
+
43
+ gramos = conversor(opciones)
44
+ calorias = 0
45
+
46
+ for i in (0..@alimentos.size-1)
47
+
48
+ if @alimentos[i].nombre == nombre
49
+ calorias = @alimentos[i].calorias*gramos
50
+ end
51
+
52
+ end
53
+
54
+ @datos << calorias
55
+ end
56
+
57
+ def fruta(nombre, opciones = {})
58
+
59
+ gramos = conversor(opciones)
60
+ calorias = 0
61
+
62
+ for i in (0..@alimentos.size-1)
63
+
64
+ if @alimentos[i].nombre == nombre
65
+ calorias = @alimentos[i].calorias*gramos
66
+ end
67
+
68
+ end
69
+
70
+ @datos << calorias
71
+ end
72
+
73
+ def cereal(nombre, opciones = {})
74
+
75
+ gramos = conversor(opciones)
76
+ calorias = 0
77
+
78
+ for i in (0..@alimentos.size-1)
79
+
80
+ if @alimentos[i].nombre == nombre
81
+ calorias = @alimentos[i].calorias*gramos
82
+ end
83
+
84
+ end
85
+
86
+ @datos << calorias
87
+ end
88
+
89
+ def proteina(nombre, opciones = {})
90
+
91
+ gramos = conversor(opciones)
92
+ calorias = 0
93
+
94
+ for i in (0..@alimentos.size-1)
95
+
96
+ if @alimentos[i].nombre == nombre
97
+ calorias = @alimentos[i].calorias*gramos
98
+ end
99
+
100
+ end
101
+
102
+ @datos << calorias
103
+ end
104
+
105
+ def aceite(nombre, opciones = {})
106
+
107
+ gramos = conversor(opciones)
108
+ calorias = 0
109
+
110
+ for i in (0..@alimentos.size-1)
111
+
112
+ if @alimentos[i].nombre == nombre
113
+ calorias = @alimentos[i].calorias*gramos
114
+ end
115
+
116
+ end
117
+
118
+ @datos << calorias
119
+ end
120
+
121
+ def conversor(opciones)
122
+ gramos=0.0
123
+
124
+ if opciones[:amount] =~ /(?i)pieza[s]?\s{0,4}/
125
+ gramos=gramos+1.18
126
+ opciones[:amount] =opciones[:amount].gsub(/(?i)pieza[s]?\s{0,4}/,"")
127
+ end
128
+
129
+ if opciones[:amount] =~ /(?i)taza[s]?\s{0,4}/
130
+ gramos=gramos+2.974
131
+ opciones[:amount] =opciones[:amount].gsub(/(?i)taza[s]?\s{0,4}/,"")
132
+ end
133
+
134
+ if opciones[:amount] =~ /(?i)cucharada[s]?\s{0,4}/
135
+ gramos=gramos+0.089
136
+ opciones[:amount] =opciones[:amount].gsub(/(?i)cucharada[s]?\s{0,4}/,"")
137
+ end
138
+
139
+ if opciones[:amount] =~ /(?i)cucharon(es)?\s{0,4}/
140
+ gramos=gramos+9.778
141
+ opciones[:amount] =opciones[:amount].gsub(/(?i)cucharon(es)?\s{0,4}/,"")
142
+ end
143
+
144
+ if opciones[:amount] =~ /(?i)pequeña[s]?\s{0,1}/
145
+ gramos=gramos-0.2
146
+ opciones[:amount] = opciones[:amount].gsub(/(?i)pequeña[s]?\s{0,1}/,"")
147
+ end
148
+
149
+ if opciones[:amount] =~ /\d\/\d/
150
+ valor1 = /\d\//.match(opciones[:amount]).to_s.gsub(/\//,"")
151
+ valor2 = /\/\d/.match(opciones[:amount]).to_s.gsub(/\//,"")
152
+ resultado = valor1.to_f/valor2.to_f
153
+ gramos=gramos*resultado
154
+ end
155
+
156
+ if opciones[:amount] =~ /\d/
157
+ if gramos > 0
158
+ gramos=gramos*opciones[:amount].to_f
159
+ opciones[:amount] = opciones[:amount].gsub(/\d/,"")
160
+ end
161
+ else
162
+ gramos=gramos+(opciones[:amount]/10)
163
+ end
164
+
165
+ gramos
166
+
167
+ end
168
+ end
@@ -0,0 +1,53 @@
1
+ # Esta clase permite representar a un alimento
2
+ # con sus porteinas, glucidos y grasas correspondientes.
3
+ # Tambien se puede sacar las calorias de los alimentos
4
+ # con las proteinas, glucidos y grasas.
5
+
6
+ class Alimento
7
+
8
+
9
+ attr_reader :nombre, :proteinas, :glucidos, :grasas
10
+
11
+ # Se asigna el nombre del alimento, las proteinas,
12
+ # los glucidos y las grasas.
13
+ def initialize(nombre,proteinas,glucidos,grasas,individuos)
14
+ @nombre = nombre
15
+ @proteinas = proteinas
16
+ @glucidos = glucidos
17
+ @grasas = grasas
18
+ @cal
19
+ @individuos = individuos
20
+ end
21
+
22
+ # Este es el metodo to_s que muestra al alimento por pantalla.
23
+ def to_s
24
+ "El alimento #{@nombre} tiene #{@proteinas} gramos de proteínas, #{@glucidos} gramos de glúcidos, #{@grasas} gramos de lípidos y #{calorias} calorías"
25
+ end
26
+
27
+ # Este metodo muestra al alimento formateado.
28
+ def formateado
29
+ print "Nombre: ",@nombre,"\t","Proteínas: ",@proteinas,"\t","Glúcidos: ",@glucidos,"\t","Grasas: ",@grasas
30
+ puts
31
+ end
32
+
33
+ # Este metodo calcula las calorias del alimento
34
+ # según las proteinas, los glucidos y las grasas
35
+ # del alimento.
36
+ def calorias
37
+ @cal = (4*@proteinas)+(4*@glucidos)+(9*@grasas)
38
+ end
39
+
40
+ # Este metodo lo que hace es devolverme el valor correspondiente
41
+ # dependiendo de la posicion en la que me encuentre en el vector,
42
+ # esto lo hago para que no me acceda a la posicion -1.
43
+ def neg(pos,gluc)
44
+ pos < 0 ? gluc[0] : gluc[pos]
45
+ end
46
+
47
+ # Este metodo me calcula el AIBC. Se ha aplicado la programacion
48
+ # funcional.
49
+ def AIBC
50
+ @individuos.map{|i| g=i.first; pos=-1; i.map{|j| prev=neg(pos,i); pos=pos+1; (((j-g)+(prev-g))*2.5)}.reduce(:+).round(2)}
51
+ end
52
+
53
+ end
@@ -0,0 +1,64 @@
1
+ # Esta clase es una clase heredada de alimento que contiene
2
+ # también el grupo del alimento.
3
+ # Se ha incluido el módulo Comparable
4
+
5
+ class Alimento_concreto < Alimento
6
+
7
+ include Comparable
8
+
9
+ attr_accessor :grupo
10
+
11
+ # Se asigna el grupo del alimento y los otros datos del
12
+ # alimento se le pasa al initialize de Alimento
13
+ def initialize (grupo,nombre,proteinas,glucidos,grasas)
14
+ super(nombre,proteinas,glucidos,grasas,[])
15
+ @grupo = grupo
16
+ end
17
+
18
+ # Este metodo se encarga de realizar las
19
+ # comparaciones.
20
+ def <=>(another)
21
+ calorias <=> another.calorias
22
+ end
23
+
24
+ # Este metodo se encarga de mostrar al alimento
25
+ # por pantalla.
26
+ def to_s
27
+ "Grupo: #{@grupo}\t" + "Nombre: #{@nombre}\t" + "Proteínas: #{@proteinas}\t" + "Glúcidos: #{@glucidos}\t" + "Grasas: #{@grasas}\t" + "Calorias: #{calorias}"
28
+ end
29
+
30
+ end
31
+
32
+ # Aqui abro la clase array y creo los metodos de ordenacion
33
+ # for y each. El sort ya lo tiene la clase
34
+ class Array
35
+
36
+ # Este es el metodo de ordenacio for. Utilizo el
37
+ # metodo burbuja.
38
+ def ordenar_for
39
+
40
+ @vector=self
41
+
42
+ for i in (0..@vector.size-1)
43
+ for j in (0..@vector.size-1)
44
+ if j+1 != @vector.size
45
+ if @vector[j+1] < @vector[j]
46
+ @vector[j], @vector[j+1] = @vector[j+1], @vector[j]
47
+ end
48
+ end
49
+ end
50
+ end
51
+ @vector
52
+ end
53
+
54
+ #Este es el metodo de ordenacion each.
55
+ def ordenar_each
56
+
57
+ @ordenado= []
58
+ aux_self=self.clone
59
+
60
+ (0..self.size-1).each{|i| min=aux_self.min; @ordenado << min; aux_self.delete(min)}
61
+
62
+ @ordenado
63
+ end
64
+ end
@@ -0,0 +1,162 @@
1
+ # Aqui estamos declarando la clase Nodo,
2
+ # pero lo hacemos mediante un Struct,
3
+ # que nos incluye ya los mixin Comparable y Enumerable.
4
+
5
+ Nodo = Struct.new(:value, :next, :prev)
6
+
7
+ # Esta clase permite representar una lista
8
+ # doblemente enlazada.
9
+ # Se ha incluido el módulo Enumerable.
10
+
11
+ class List
12
+
13
+ include Enumerable
14
+ attr_accessor :head, :tail
15
+
16
+ # Se asignan el valor del head y el tail de
17
+ # la lista, que inicialmente es nil.
18
+ def initialize
19
+ @head = nil
20
+ @tail = nil
21
+ end
22
+
23
+ # Inseta un valor por la cabeza de la lista.
24
+ def push_head (nodo)
25
+ if @head == nil
26
+ @head = Nodo.new(nodo,nil,nil)
27
+ @tail = @head
28
+ else
29
+ @head.next = Nodo.new(nodo,nil,@head)
30
+ @head = @head.next
31
+ end
32
+ end
33
+
34
+ # Devuelve el valor de un nodo que le
35
+ # pasamos por parametros.
36
+ def get_value(value)
37
+ if @head == nil #Comprobamos si la lista no esta vacía
38
+ raise RuntimeError, "Lista vacía, no se puede extraer nodo"
39
+ else
40
+ i = @tail
41
+ @valor=nil
42
+ while i != nil
43
+ if i.value == value
44
+ @valor = i.value
45
+ end
46
+ i = i.next
47
+ end
48
+ end
49
+ @valor
50
+ end
51
+
52
+ # Nos devuelve el nodo siguiente de un
53
+ # nodo que le pasamos por parámetros.
54
+ def get_next(value)
55
+ if @head == nil #Comprobamos si la lista no esta vacía
56
+ raise RuntimeError, "Lista vacía, no se puede extraer nodo"
57
+ else
58
+ i = @tail
59
+ @valor = nil
60
+ while i != nil
61
+ if i.value == value
62
+ @valor = i.next
63
+ end
64
+ i = i.next
65
+ end
66
+ end
67
+ @valor
68
+ end
69
+
70
+ # Devuelve el nodo previo al nodo
71
+ # que pasamos por parámetros.
72
+ def get_prev(value)
73
+ if @head == nil #Comprobamos si la lista no esta vacía
74
+ raise RuntimeError, "Lista vacía, no se puede extraer nodo"
75
+ else
76
+ i = @tail
77
+ @valor = nil
78
+ while i != nil
79
+ if i.value == value
80
+ @valor = i.prev
81
+ end
82
+ i = i.next
83
+ end
84
+ end
85
+ @valor
86
+ end
87
+
88
+ # Este metodo nos devuelve el tamaño
89
+ # de la lista.
90
+ def size
91
+ size = 0
92
+ i = @tail
93
+ while i != nil
94
+ i = i.next
95
+ size+=1
96
+ end
97
+ return size
98
+ end
99
+
100
+ # Este metodo nos permite insertar varios
101
+ # valores a la lista.
102
+ # Estos valores se insertan por el head.
103
+ def push_others(values)
104
+ for i in (0..values.size-1)
105
+ push_head(values[i])
106
+ end
107
+ end
108
+
109
+ # Este metodo nos permite extraer el
110
+ # tail de la lista.
111
+ def pop_tail
112
+
113
+ extraido = false
114
+
115
+ if @head == nil #Comprobamos si la lista no esta vacía
116
+ raise RuntimeError, "Lista vacía, no se puede extraer nodo"
117
+ else
118
+ extraido = true
119
+ if @head == @tail
120
+ @head = nil
121
+ @tail = nil
122
+ else
123
+ @tail = @tail.next
124
+ @tail.prev = nil
125
+ end
126
+ end
127
+ return extraido
128
+ end
129
+
130
+ # Este metodo nos permite extraer
131
+ # el head de la lista.
132
+ def pop_head
133
+ extraido = false
134
+ if @head == nil #Comprobamos si la lista no esta vacía
135
+ raise RuntimeError, "Lista vacía, no se puede extraer nodo"
136
+ else
137
+ extraido = true
138
+ if @head == @tail
139
+ @head = nil
140
+ @tail = nil
141
+ else
142
+ @head = @head.prev
143
+ @head.next = nil
144
+ end
145
+ end
146
+
147
+ return extraido
148
+ end
149
+
150
+ # Este metodo es el each que van a
151
+ # utilizar los metodos del módulo
152
+ # Enumerable, pero esta acomodado
153
+ # a nuestra clase.
154
+ def each
155
+ i = @tail
156
+ while i != nil
157
+ yield i.value
158
+ i = i.next
159
+ end
160
+ end
161
+
162
+ end