lpp_t_04_matrix 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +2 -0
- data/lib/lpp_t_04_matrix.rb +104 -56
- data/lib/lpp_t_04_matrix/version.rb +1 -1
- data/lpp_t_04_matrix.gemspec +2 -2
- metadata +4 -4
data/README.md
CHANGED
@@ -104,3 +104,5 @@ Or install it yourself as:
|
|
104
104
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
105
105
|
4. Push to the branch (`git push origin my-new-feature`)
|
106
106
|
5. Create new Pull Request
|
107
|
+
|
108
|
+
[![Build Status](https://travis-ci.org/LPP-T-04/prct09.png?branch=master)](https://travis-ci.org/LPP-T-04/prct09)
|
data/lib/lpp_t_04_matrix.rb
CHANGED
@@ -1,29 +1,67 @@
|
|
1
|
+
# == Fichero que contiene la gema para el trabajo con matrices.
|
2
|
+
#
|
3
|
+
# Operacion con matrices densas y dispersas.
|
4
|
+
#
|
5
|
+
# Authors: Eliezer Cruz Suarez, Carlos Barreda Falciano
|
6
|
+
#
|
7
|
+
# Email: alu0100611298@ull.edu.es, alu0100596113@ull.edu.es
|
8
|
+
#
|
1
9
|
require "lpp_t_04_matrix/version"
|
2
10
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
11
|
+
# == Modulo que contiene la gema para el trabajo con matrices.
|
12
|
+
#
|
13
|
+
# Operacion con matrices densas y dispersas.
|
14
|
+
#
|
15
|
+
# Authors: Eliezer Cruz Suarez, Carlos Barreda Falciano
|
16
|
+
#
|
17
|
+
# Email: alu0100611298@ull.edu.es, alu0100596113@ull.edu.es
|
18
|
+
#
|
19
|
+
# Para realizacion de esta practica se ha creado una jerarquia de clases.
|
20
|
+
# Teniendo en cuenta que tenemos una clase abstracta de nombre Matriz, y de la cual han heredado las otras dos clases que definen el tipo de objetos que tenemos, MatrizDensa y MatrizDispersa, se han implementado los metodos para operar con ambos tipos de matrices, sin importar que objeto sea.
|
21
|
+
# Además se ha incluido el tratamiento de fracciones desarrollado en la practica anterior con la idea de que la matriz sea capaz de operar con elementos del tipo Franction. Los metodos implemnetados son:
|
22
|
+
#
|
23
|
+
# * Suma.
|
24
|
+
# * Resta.
|
25
|
+
# * Multiplicacion.
|
26
|
+
# * Traspuesta.
|
27
|
+
#
|
28
|
+
module LppT04Matrix
|
29
|
+
|
30
|
+
# Clase Abstracta Matriz
|
31
|
+
class Matriz # Clase Abstracta Matriz
|
32
|
+
# Variable que guarda el numero de filas y columnas de la matriz.
|
33
|
+
attr_accessor :filas, :columnas
|
34
|
+
# Contructor de la clase Matriz
|
35
|
+
def initialize (filas, columnas) # Contructor de la clase Matriz
|
36
|
+
# Variable que guarda el numero de filas de la matriz.
|
7
37
|
@filas = filas
|
38
|
+
# Variable que guarda el numero de columnas de la matriz.
|
8
39
|
@columnas = columnas
|
9
40
|
end
|
10
41
|
end
|
11
42
|
|
43
|
+
# Clase Matriz Densa hereda de Matriz
|
12
44
|
class MatrizDensa < Matriz # Clase Matriz Densa hereda de Matriz
|
45
|
+
# Vector en el que se almacena el valor de los elementos de la matriz.
|
13
46
|
attr_accessor :elemento
|
14
|
-
|
47
|
+
# Contructor de la clase MatrizDensa
|
48
|
+
def initialize (filas, columnas, elemento) # Contructor de la clase MatrizDensa
|
15
49
|
super(filas, columnas)
|
50
|
+
# Vector en el que se almacena el valor de los elementos de la matriz.
|
16
51
|
@elemento = elemento
|
17
52
|
end
|
18
53
|
|
54
|
+
# Metodo de acceso a la matriz
|
19
55
|
def [](i) # Metodo de acceso a la matriz
|
20
56
|
@elemento[i]
|
21
57
|
end
|
22
58
|
|
23
|
-
|
59
|
+
# Devuelve el valor del indice i j
|
60
|
+
def indice(i,j) # Devuelve el valor del indice i j
|
24
61
|
@elemento[i][j]
|
25
62
|
end
|
26
63
|
|
64
|
+
# Convierte la fraccion a una cadena
|
27
65
|
def to_s # Convierte la fraccion a una cadena
|
28
66
|
imprimir = ""
|
29
67
|
@filas.times do |i|
|
@@ -35,7 +73,8 @@ module LppT04Matrix # Clase Abstracta Matriz
|
|
35
73
|
imprimir
|
36
74
|
end
|
37
75
|
|
38
|
-
|
76
|
+
# Suma dos Fracciones se le pasa un tipo fraccion.
|
77
|
+
def +(other) # Suma dos Fracciones se le pasa un tipo fraccion.
|
39
78
|
raise ArgumentError, "La longitud de las matrices no coincide." unless @filas == other.filas && @columnas == other.columnas
|
40
79
|
elemento = Array.new
|
41
80
|
@filas.times do |i|
|
@@ -48,7 +87,8 @@ module LppT04Matrix # Clase Abstracta Matriz
|
|
48
87
|
MatrizDensa.new(@filas, @columnas,elemento)
|
49
88
|
end
|
50
89
|
|
51
|
-
|
90
|
+
# Resta dos Fracciones se le pasa un tipo fraccion.
|
91
|
+
def -(other) # Resta dos Fracciones se le pasa un tipo fraccion.
|
52
92
|
raise ArgumentError, "La longitud de las matrices no coincide." unless @filas == other.filas && @columnas == other.columnas
|
53
93
|
elemento = Array.new
|
54
94
|
@filas.times do |i|
|
@@ -61,6 +101,7 @@ module LppT04Matrix # Clase Abstracta Matriz
|
|
61
101
|
MatrizDensa.new(@filas, @columnas,elemento)
|
62
102
|
end
|
63
103
|
|
104
|
+
# Multiplica dos Fracciones se le pasa un tipo fraccion.
|
64
105
|
def *(other) # Multiplica dos Fracciones se le pasa un tipo fraccion.
|
65
106
|
raise ArgumentError, "La longitud de las matrices no coincide." unless @columnas == other.filas
|
66
107
|
elemento = Array.new
|
@@ -80,17 +121,20 @@ module LppT04Matrix # Clase Abstracta Matriz
|
|
80
121
|
MatrizDensa.new(@filas, other.columnas, elemento)
|
81
122
|
end
|
82
123
|
|
124
|
+
# Devuelve la trasuesta de una Matriz
|
83
125
|
def traspuesta # Devuelve la trasuesta de una Matriz
|
84
126
|
elemento = Array.new
|
85
|
-
@columnas
|
127
|
+
0.upto(@columnas - 1) do |i|
|
86
128
|
elemento_fila = Array.new
|
87
|
-
@filas
|
129
|
+
0.upto(@filas - 1) do |j|
|
88
130
|
elemento_fila << @elemento[j][i]
|
89
131
|
end
|
90
132
|
elemento << elemento_fila
|
91
133
|
end
|
92
134
|
MatrizDensa.new(@columnas, @filas, elemento)
|
93
135
|
end
|
136
|
+
|
137
|
+
# Devuelve el valor maximo
|
94
138
|
def maximo # Devuelve el valor maximo
|
95
139
|
aux = @elemento[0][0]
|
96
140
|
@columnas.times do |i|
|
@@ -100,6 +144,8 @@ module LppT04Matrix # Clase Abstracta Matriz
|
|
100
144
|
end
|
101
145
|
aux
|
102
146
|
end
|
147
|
+
|
148
|
+
# Devuelve el valor minimo.
|
103
149
|
def minimo # Devuelve el valor minimo.
|
104
150
|
aux = @elemento[0][0]
|
105
151
|
@columnas.times do |i|
|
@@ -111,18 +157,24 @@ module LppT04Matrix # Clase Abstracta Matriz
|
|
111
157
|
end
|
112
158
|
end
|
113
159
|
|
114
|
-
|
115
|
-
class MatrizDispersa < Matriz # Clase Matriz Dispersa hereda de Matriz
|
160
|
+
# Clase Matriz Dispersa hereda de Matriz
|
161
|
+
class MatrizDispersa < Matriz # Clase Matriz Dispersa hereda de Matriz.
|
162
|
+
# Hash de hashes que guarda los elementos de la matriz por filas y columnas.
|
116
163
|
attr_accessor :elemento
|
117
|
-
|
164
|
+
# Contructor de la clase MatrizDispersa
|
165
|
+
def initialize (filas, columnas, elemento) # Contructor de la clase Matriz.
|
118
166
|
super(filas, columnas)
|
167
|
+
# Hash de hashes que guarda los elementos de la matriz por filas y columnas.
|
119
168
|
@elemento = elemento
|
120
169
|
end
|
121
170
|
|
122
|
-
|
171
|
+
# Metodo de acceso a la matriz.
|
172
|
+
def [](i) # Metodo de acceso a la matriz.
|
123
173
|
@elemento[i]
|
124
174
|
end
|
125
|
-
|
175
|
+
|
176
|
+
# Devuelve el valor del indice i j
|
177
|
+
def indice(i,j) # Devuelve el valor del indice i j
|
126
178
|
elemento = @elemento.fetch(i,0)
|
127
179
|
if elemento!= 0
|
128
180
|
elemento.fetch(j,0)
|
@@ -131,11 +183,13 @@ module LppT04Matrix # Clase Abstracta Matriz
|
|
131
183
|
end
|
132
184
|
end
|
133
185
|
|
186
|
+
# Convierte la fraccion a una cadena
|
134
187
|
def to_s # Convierte la fraccion a una cadena
|
135
188
|
@elemento
|
136
189
|
end
|
137
190
|
|
138
|
-
|
191
|
+
# Suma dos Fracciones se le pasa un tipo fraccion.
|
192
|
+
def +(other) # Suma dos Fracciones se le pasa un tipo fraccion.
|
139
193
|
raise ArgumentError, "La longitud de las matrices no coincide." unless @filas == other.filas && @columnas == other.columnas
|
140
194
|
case other
|
141
195
|
when MatrizDensa
|
@@ -148,6 +202,7 @@ module LppT04Matrix # Clase Abstracta Matriz
|
|
148
202
|
end
|
149
203
|
end
|
150
204
|
|
205
|
+
# Resta dos Fracciones se le pasa un tipo fraccion.
|
151
206
|
def -(other) # Resta dos Fracciones se le pasa un tipo fraccion.
|
152
207
|
raise ArgumentError, "La longitud de las matrices no coincide." unless @filas == other.filas && @columnas == other.columnas
|
153
208
|
case other
|
@@ -161,6 +216,7 @@ module LppT04Matrix # Clase Abstracta Matriz
|
|
161
216
|
end
|
162
217
|
end
|
163
218
|
|
219
|
+
# Multiplica dos Fracciones se le pasa un tipo fraccion.
|
164
220
|
def *(other) # Multiplica dos Fracciones se le pasa un tipo fraccion.
|
165
221
|
raise ArgumentError, "La longitud de las matrices no coincide." unless @columnas == other.filas
|
166
222
|
case other
|
@@ -194,6 +250,7 @@ module LppT04Matrix # Clase Abstracta Matriz
|
|
194
250
|
end
|
195
251
|
end
|
196
252
|
|
253
|
+
# Devuelve la trasuesta de una Matriz
|
197
254
|
def traspuesta # Devuelve la trasuesta de una Matriz
|
198
255
|
elemento = Hash.new(Hash.new())
|
199
256
|
@elemento.each {
|
@@ -206,6 +263,8 @@ module LppT04Matrix # Clase Abstracta Matriz
|
|
206
263
|
elemento
|
207
264
|
MatrizDispersa.new(@filas, @columnas, elemento)
|
208
265
|
end
|
266
|
+
|
267
|
+
# Devuelve el valor maximo
|
209
268
|
def maximo # Devuelve el valor maximo
|
210
269
|
aux = @elemento.keys
|
211
270
|
aux1 = aux[0]
|
@@ -219,6 +278,8 @@ module LppT04Matrix # Clase Abstracta Matriz
|
|
219
278
|
}
|
220
279
|
mayor
|
221
280
|
end
|
281
|
+
|
282
|
+
# Devuelve el valor minimo.
|
222
283
|
def minimo # Devuelve el valor minimo.
|
223
284
|
aux = @elemento.keys
|
224
285
|
aux1 = aux[0]
|
@@ -235,25 +296,32 @@ module LppT04Matrix # Clase Abstracta Matriz
|
|
235
296
|
end
|
236
297
|
end
|
237
298
|
|
299
|
+
# Clase para el trabajo con fracciones.
|
238
300
|
class Frac
|
301
|
+
# Se definen set y get para acceder a las variables de la clase.
|
239
302
|
attr_reader :numerador, :denominador # Se definen set y get para acceder a las variables de la clase.
|
303
|
+
# Se incluye el modulo de nombre "comparable" utilizado para el operador <=>.
|
240
304
|
include Comparable # Se incluye el modulo de nombre "comparable" utilizado para el operador <=>.
|
241
305
|
|
306
|
+
# Se define el constructor.
|
242
307
|
def initialize(numerador, denominador) # Se define el constructor.
|
243
308
|
mcd = gcd(numerador,denominador)
|
244
309
|
@numerador , @denominador = numerador/mcd, denominador/mcd
|
245
310
|
end
|
246
311
|
|
312
|
+
# Devuelve el numerador.
|
247
313
|
def num() # Devuelve el numerador.
|
248
314
|
@numerador
|
249
315
|
end
|
250
316
|
|
317
|
+
# Devuelve el denominador.
|
251
318
|
def denom() # Devuelve el denominador.
|
252
319
|
@denominador
|
253
320
|
end
|
254
321
|
|
322
|
+
# Si el denominador es 1, solo se imprimer el numerador
|
255
323
|
def to_s
|
256
|
-
if @denominador == 1 #Si el denominador es 1, solo se imprimer el numerador
|
324
|
+
if @denominador == 1 # Si el denominador es 1, solo se imprimer el numerador
|
257
325
|
"#{@numerador}"
|
258
326
|
elsif @denominador == -1 #En el caso de que b=-1 y a>0 ó a=-1
|
259
327
|
if @numerador>0 || @numerador==-1
|
@@ -272,14 +340,17 @@ class Frac
|
|
272
340
|
end
|
273
341
|
end
|
274
342
|
|
343
|
+
# Imprime el resultado de la fraccion como un float.
|
275
344
|
def to_f() # Imprime el resultado de la fraccion como un float.
|
276
345
|
@numerador.to_f/@denominador
|
277
346
|
end
|
278
347
|
|
348
|
+
# Se define el operador <=> para el modulo comparable.
|
279
349
|
def <=>(other) # Se define el operador <=> para el modulo comparable.
|
280
350
|
@numerador.to_f/@denominador <=> other.numerador.to_f/other.denominador
|
281
351
|
end
|
282
352
|
|
353
|
+
# Se calcula el valor absoluto de una fraccion.
|
283
354
|
def abs() # Se calcula el valor absoluto de una fraccion.
|
284
355
|
if (@numerador > 0 && @denominador > 0)
|
285
356
|
Frac.new(@numerador, @denominador).to_s
|
@@ -292,10 +363,12 @@ class Frac
|
|
292
363
|
end
|
293
364
|
end
|
294
365
|
|
366
|
+
# Calcula el reciproco de una fraccion.
|
295
367
|
def reciprocal() # Calcula el reciproco de una fraccion.
|
296
368
|
Frac.new(@denominador, @numerador)
|
297
369
|
end
|
298
370
|
|
371
|
+
# Calcula la suma de dos fracciones.
|
299
372
|
def +(other) # Calcula la suma de dos fracciones.
|
300
373
|
if other.class == Frac
|
301
374
|
Frac.new(@numerador*other.denominador + other.numerador*@denominador , @denominador*other.denominador)
|
@@ -305,6 +378,7 @@ class Frac
|
|
305
378
|
|
306
379
|
end
|
307
380
|
|
381
|
+
# Calcula la resta de dos fracciones.
|
308
382
|
def -(other) # Calcula la resta de dos fracciones.
|
309
383
|
if (other.class == Frac)
|
310
384
|
Frac.new(@numerador*other.denominador - other.numerador*@denominador , @denominador*other.denominador)
|
@@ -313,6 +387,7 @@ class Frac
|
|
313
387
|
end
|
314
388
|
end
|
315
389
|
|
390
|
+
# Calcula la multiplicacion de dos fracciones.
|
316
391
|
def *(other) # Calcula la multiplicacion de dos fracciones.
|
317
392
|
if other.class == Frac
|
318
393
|
Frac.new(@numerador * other.numerador, @denominador * other.denominador)
|
@@ -321,55 +396,28 @@ class Frac
|
|
321
396
|
end
|
322
397
|
end
|
323
398
|
|
399
|
+
# Calcula la division de dos fracciones.
|
324
400
|
def /(other) # Calcula la division de dos fracciones.
|
325
401
|
Frac.new(@numerador * other.denominador, @denominador * other.numerador)
|
326
402
|
end
|
327
403
|
|
404
|
+
# Calcula el resto al dividir dos fracciones (modulo)
|
328
405
|
def %(other) # Calcula el resto al dividir dos fracciones (modulo)
|
329
406
|
result = self./(other)
|
330
407
|
result = (result.numerador%result.denominador).to_i
|
331
408
|
end
|
332
409
|
|
333
|
-
|
410
|
+
# Se define el metodo coerce para operar enteros con fracciones.
|
411
|
+
def coerce(other) # Se define el metodo coerce para operar enteros con fracciones.
|
334
412
|
[self,other]
|
335
413
|
end
|
336
|
-
end
|
337
414
|
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
415
|
+
# Metodo que calculo el maximo comun divisor de dos numeros.
|
416
|
+
def gcd(u, v) # Metedo que calculo el maximo comun divisor de dos numeros.
|
417
|
+
u, v = u.abs, v.abs
|
418
|
+
while v != 0
|
419
|
+
u, v = v, u % v
|
420
|
+
end
|
421
|
+
u
|
422
|
+
end
|
344
423
|
end
|
345
|
-
|
346
|
-
if __FILE__ == $0
|
347
|
-
# Trabajo con la clase:
|
348
|
-
include LppT04Matrix
|
349
|
-
|
350
|
-
m1 = MatrizDensa.new(2,2,[[1,2],[3,4]])
|
351
|
-
m2 = MatrizDispersa.new(2, 2, {0 => {0 => 1, 1 => 2}, 1 => {0 => 3, 1 => 4}})
|
352
|
-
m3 = MatrizDensa.new(2,2,[[7,10],[15,22]])
|
353
|
-
m4 = MatrizDispersa.new(2, 2, {0 => {0 => Frac.new(1,2), 1 => Frac.new(1,2)}, 1 => {0 => Frac.new(1,2), 1 => Frac.new(1,2)}})
|
354
|
-
a = Frac.new(1,2)
|
355
|
-
b = Frac.new(2,2)
|
356
|
-
c = Frac.new(3,2)
|
357
|
-
d = Frac.new(4,2)
|
358
|
-
e = Frac.new(3,2)
|
359
|
-
f = Frac.new(9,2)
|
360
|
-
g = Frac.new(3,1)
|
361
|
-
h = Frac.new(6,1)
|
362
|
-
m9 = MatrizDensa.new(2,2,[[a,b],[c,d]])
|
363
|
-
m10 = MatrizDensa.new(2,2,[[e,3],[f,6]])
|
364
|
-
puts m9-(m1)
|
365
|
-
puts
|
366
|
-
puts m1-(m9)
|
367
|
-
puts
|
368
|
-
puts m4.to_s
|
369
|
-
puts m4*m1
|
370
|
-
puts m1*m4
|
371
|
-
puts m1*m1
|
372
|
-
puts (m2*m4).to_s
|
373
|
-
puts (m4*m2).to_s
|
374
|
-
puts m1
|
375
|
-
end
|
data/lpp_t_04_matrix.gemspec
CHANGED
@@ -6,8 +6,8 @@ require 'lpp_t_04_matrix/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "lpp_t_04_matrix"
|
8
8
|
spec.version = LppT04Matrix::VERSION
|
9
|
-
spec.authors = ["
|
10
|
-
spec.email = ["alu0100611298@ull.edu.es"]
|
9
|
+
spec.authors = ["Eliezer Cruz Suarez, Carlos Barreda Falciano"]
|
10
|
+
spec.email = ["alu0100611298@ull.edu.es, alu0100596113"]
|
11
11
|
spec.description = %q{Para realizacion de esta practica se ha creado una jerarquia de clases.
|
12
12
|
Teniendo en cuenta que tenemos una clase abstracta de nombre Matriz, y de la cual han heredado las
|
13
13
|
otras dos clases que definen el tipo de objetos que tenemos, MatrizDensa y MatrizDispersa, se han
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lpp_t_04_matrix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
|
-
-
|
8
|
+
- Eliezer Cruz Suarez, Carlos Barreda Falciano
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-11-
|
12
|
+
date: 2013-11-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -68,7 +68,7 @@ description: ! "Para realizacion de esta practica se ha creado una jerarquia de
|
|
68
68
|
la idea\n de que la matriz sea capaz de operar con elementos del tipo Franction.
|
69
69
|
Los metodos implemnetados son: \n suma, resta, multiplicacion y traspuesta."
|
70
70
|
email:
|
71
|
-
- alu0100611298@ull.edu.es
|
71
|
+
- alu0100611298@ull.edu.es, alu0100596113
|
72
72
|
executables: []
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|