matrices 0.0.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.
- data/.gitignore +5 -0
- data/.travis.yml +8 -0
- data/Gemfile +3 -0
- data/Guardfile +8 -0
- data/LICENSE +22 -0
- data/Rakefile +14 -0
- data/Readme.md +43 -0
- data/lib/matrices.rb +12 -0
- data/lib/matrices/elemento_nulo.rb +7 -0
- data/lib/matrices/fraccion.rb +139 -0
- data/lib/matrices/matriz.rb +123 -0
- data/lib/matrices/matriz_densa.rb +38 -0
- data/lib/matrices/matriz_dispersa.rb +66 -0
- data/lib/matrices/mcd.rb +10 -0
- data/lib/matrices/version.rb +3 -0
- data/matrices.gemspec +25 -0
- data/spec/fraccion_spec.rb +109 -0
- data/spec/matrices_spec.rb +140 -0
- data/test/tc_matrices.rb +81 -0
- metadata +139 -0
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Cristo González - Juvenal Santiso
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
|
3
|
+
$:.unshift File.dirname(__FILE__) + 'lib'
|
4
|
+
$:.unshift './lib', './spec'
|
5
|
+
|
6
|
+
require 'rspec/core/rake_task'
|
7
|
+
RSpec::Core::RakeTask.new
|
8
|
+
|
9
|
+
task :default => :spec
|
10
|
+
|
11
|
+
desc "Test Unitarios"
|
12
|
+
task :test do
|
13
|
+
sh "ruby -I ./lib test/tc_matrices.rb"
|
14
|
+
end
|
data/Readme.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
Cristo González Rodríguez | Juvenal Santiso Hernández
|
2
|
+
|
3
|
+
Grupo 07 - Turno de mañana
|
4
|
+
|
5
|
+
====> Práctica 9 <====
|
6
|
+
|
7
|
+
-> Repositorio Inicial
|
8
|
+
|
9
|
+
- Fichero "Rake", con las tareas de ayuda de Bundler, preparado para poder trabajar con la herramienta de integración continua "Travis".
|
10
|
+
- Fichero ".travis.yml" con las versiones/implementaciones de Ruby en las que se va a testear.
|
11
|
+
- Fichero "Gemfile" que controla las dependencias de las gemas utilizadas (gestionadas a través del fichero con extension ".gemspec").
|
12
|
+
- Fichero "Guardfile" para trabajar con la herramienta de comprobación continua "Guard".
|
13
|
+
- Fichero "matrices.gemspec", plantilla para la creación de nuestra gema, con la información requerida, y las dependencias de gemas para "Gemfile".
|
14
|
+
|
15
|
+
- Se incluyen los ficheros "lib/fraccion.rb", "lib/mcd.rb", "lib/matrices.rb" (anterior clase Matriz), que contienen las implementaciones de las anteriores prácticas.
|
16
|
+
- Se incluyen los ficheros de definición de espectativas "spec/fraccion_spec.rb" (para "fraccion.rb"), y "spec/matrices_spec.rb" (para "matrices.rb"), con las espectativas para la antigua clase Matriz.
|
17
|
+
- Se incluye el fichero "tc_matrices.rb" vacío, para la posterior definición de pruebas unitarias.
|
18
|
+
|
19
|
+
-> Definición de espectativas "spec/fraccion_spec.rb"
|
20
|
+
|
21
|
+
- Se definen las espectativas para la creación de matrices dispersas y densas, y la realización de operaciones con las mismas.
|
22
|
+
|
23
|
+
-> Creando el código
|
24
|
+
|
25
|
+
- Se plantea la jerarquía de herencia de la clase matriz, esta se ha planteado que se creara dos clases hijas de matriz.rb matriz_dispersa.rb y matriz_densa.rb. Todos los métodos de operadores se han definido en la clase madre; en las clases hijas en lo que se ha querido hacer incapié es en el modo de almacenar cada una y por consiguiente tendrá metodos de acceso distintos, por esto de definió el método [] y []= de nuevo en la matriz dispersa.
|
26
|
+
|
27
|
+
-> Añadiendo los Test Case
|
28
|
+
|
29
|
+
- Se definen los test para la revisión de los métodos de la clase.
|
30
|
+
|
31
|
+
-> Definición de espectativas para matrices que puedan contener fracciones
|
32
|
+
|
33
|
+
- Se definen las espectativas para trabajar con matrices densas y disperas, y se modifica levemente la implementación para su correcto funcionamiento.
|
34
|
+
|
35
|
+
-> Definición de espectativas de utilización de métodos "max" y "min"
|
36
|
+
|
37
|
+
- Se definen las espectativas para el cálculo de los valores máximos y mínimos de una matriz, con las funciones "max" y "min" respectivamente.
|
38
|
+
|
39
|
+
-> Implementación métodos "max" y "min", y creación de pruebas
|
40
|
+
|
41
|
+
- Se satisfacen las espectativas para el cálculo de los elementos máximos y mínimos de una matriz, mediante la creación de los métodos "max" y "min", en la clase abstracta Matriz
|
42
|
+
- Se añaden al fichero "test/tc_matrices.rb", los test necesarios para comprobar el correcto funcionamiento de dichos métodos.
|
43
|
+
|
data/lib/matrices.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'matrices/version'
|
2
|
+
|
3
|
+
module Matrices
|
4
|
+
|
5
|
+
require 'matrices/mcd.rb'
|
6
|
+
require 'matrices/elemento_nulo.rb'
|
7
|
+
require 'matrices/fraccion.rb'
|
8
|
+
require 'matrices/matriz.rb'
|
9
|
+
require 'matrices/matriz_densa.rb'
|
10
|
+
require 'matrices/matriz_dispersa.rb'
|
11
|
+
|
12
|
+
end # Module Matrices
|
@@ -0,0 +1,139 @@
|
|
1
|
+
|
2
|
+
class Fraccion
|
3
|
+
|
4
|
+
include Comparable
|
5
|
+
attr_accessor :n,:d
|
6
|
+
|
7
|
+
def initialize(x,y=1)
|
8
|
+
m=mcd(x,y)
|
9
|
+
|
10
|
+
# Si el denominador tiene signo negativo, se pasa el signo al numerador
|
11
|
+
if(y < 0)
|
12
|
+
x, y = -x, -y
|
13
|
+
end
|
14
|
+
|
15
|
+
@n,@d = x/m,y/m
|
16
|
+
end
|
17
|
+
|
18
|
+
# Metodo que devuelve el numerador
|
19
|
+
def num()
|
20
|
+
@n
|
21
|
+
end
|
22
|
+
|
23
|
+
# Metodo que devuelve el denominador
|
24
|
+
def denom()
|
25
|
+
@d
|
26
|
+
end
|
27
|
+
|
28
|
+
# Conversion a string
|
29
|
+
def to_s()
|
30
|
+
"#@n/#@d"
|
31
|
+
end
|
32
|
+
|
33
|
+
# Conversion a flotante
|
34
|
+
def to_f()
|
35
|
+
(@n.to_f()/@d.to_f())
|
36
|
+
end
|
37
|
+
|
38
|
+
# Valor absoluto
|
39
|
+
def abs()
|
40
|
+
|
41
|
+
# Si la fraccion es negativa, se devuelve tras cambiarla de signo
|
42
|
+
if(@n < 0)
|
43
|
+
return Fraccion.new((-1)*@n, @d)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Si es positiva, se devuelve
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
# Calculo del reciproco
|
51
|
+
def reciprocal()
|
52
|
+
|
53
|
+
# Se intercambia el numerador y el denominador
|
54
|
+
# Si el signo es negativo, se pasa al nuevo numerador
|
55
|
+
if(@n != @n.abs)
|
56
|
+
return Fraccion.new(@d*(-1), (-1)*@n)
|
57
|
+
end
|
58
|
+
Fraccion.new(@d, @n)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Sobrecarga del operador "-" unario
|
62
|
+
def -@
|
63
|
+
Fraccion.new((-1)*@n,@d)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Suma de fracciones
|
67
|
+
def +(other)
|
68
|
+
if (other.is_a? Numeric)
|
69
|
+
other = Fraccion.new(other)
|
70
|
+
end
|
71
|
+
# Se aplica el algoritmo de euclides para obtener el mcm (nuevo denominador), a partir del mcd
|
72
|
+
den = (@d * other.d) / mcd(@d, other.d)
|
73
|
+
num = ((@n * den) / @d) + ((other.n * den) / other.d)
|
74
|
+
mx = mcd(num, den)
|
75
|
+
Fraccion.new(num / mx, den / mx)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Resta de fracciones
|
79
|
+
def -(other)
|
80
|
+
if (other.is_a? Numeric)
|
81
|
+
other = Fraccion.new(other)
|
82
|
+
end
|
83
|
+
# Se aplica el algoritmo de euclides para obtener el mcm (nuevo denominador), a partir del mcd
|
84
|
+
den = (@d * other.d) / mcd(@d, other.d)
|
85
|
+
num = ((@n * den) / @d) - ((other.n * den) / other.d)
|
86
|
+
mx = mcd(num, den)
|
87
|
+
Fraccion.new(num / mx, den / mx)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Producto de fracciones
|
91
|
+
def *(other)
|
92
|
+
if (other.is_a? Numeric)
|
93
|
+
other = Fraccion.new(other)
|
94
|
+
end
|
95
|
+
num, den = @n * other.n, @d * other.d
|
96
|
+
mx = mcd(num, den)
|
97
|
+
Fraccion.new(num / mx, den / mx)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Division de fracciones
|
101
|
+
def /(other)
|
102
|
+
if (other.is_a? Numeric)
|
103
|
+
other = Fraccion.new(other)
|
104
|
+
end
|
105
|
+
num, den = @n * other.d, @d * other.n
|
106
|
+
mx = mcd(num, den)
|
107
|
+
Fraccion.new(num / mx, den / mx)
|
108
|
+
end
|
109
|
+
|
110
|
+
# Modulo de fracciones
|
111
|
+
def %(other)
|
112
|
+
|
113
|
+
# Se realiza la division, y al cociente se le quita la parte entera, multiplicandola por el divisor para obtener el resto
|
114
|
+
div=self.abs/other.abs
|
115
|
+
resto=other.abs * (div - Fraccion.new(div.to_f.to_i))
|
116
|
+
# Si el dividendo es negativo, el resto sera negativo
|
117
|
+
if (@n < 0)
|
118
|
+
return -resto
|
119
|
+
end
|
120
|
+
resto
|
121
|
+
end
|
122
|
+
|
123
|
+
# Operador <=>
|
124
|
+
def <=>(other)
|
125
|
+
raise TypeError, 'Objeto no valido' unless other.respond_to? :to_f
|
126
|
+
self.to_f <=> other.to_f
|
127
|
+
end
|
128
|
+
|
129
|
+
# Elemento_nulo
|
130
|
+
def elemento_nulo
|
131
|
+
Fraccion.new(0)
|
132
|
+
end
|
133
|
+
|
134
|
+
# Coerce
|
135
|
+
def coerce(other)
|
136
|
+
[self,other]
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
|
2
|
+
class Matriz
|
3
|
+
|
4
|
+
attr_reader :rows, :cols
|
5
|
+
|
6
|
+
def initialize(rows, cols)
|
7
|
+
@rows, @cols = rows , cols
|
8
|
+
end
|
9
|
+
|
10
|
+
def Matriz.vector(rows, cols, ele)
|
11
|
+
raise TypeError, 'No se han introducido suficientes valores' unless (ele.length==rows*cols)
|
12
|
+
if (((ele.count{|e| e == e.elemento_nulo}*100)/(rows*cols)) >= 60) # Matriz dispersa
|
13
|
+
Matriz_dispersa.new(rows,cols,ele)
|
14
|
+
else # Matriz densa
|
15
|
+
Matriz_densa.new(rows,cols,ele)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def Matriz.nula(rows=1, cols=1)
|
20
|
+
aux=Array.new(rows*cols, 0)
|
21
|
+
Matriz_dispersa.new(rows, cols, aux)
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
cadena = "["
|
26
|
+
for i in (0..(@rows-1))
|
27
|
+
cadena += "["
|
28
|
+
for j in (0..(@cols-1))
|
29
|
+
cadena += "#{self[i,j]}"
|
30
|
+
if (j < (@cols-1))
|
31
|
+
cadena += ","
|
32
|
+
end
|
33
|
+
end
|
34
|
+
cadena += "]"
|
35
|
+
if (i < (@rows-1))
|
36
|
+
cadena += ","
|
37
|
+
end
|
38
|
+
end
|
39
|
+
cadena += "]"
|
40
|
+
end
|
41
|
+
|
42
|
+
def +(other)
|
43
|
+
raise TypeError, 'Las matrices no son del mismo tamanyo' unless (@rows==other.rows && @cols==other.cols)
|
44
|
+
result=Array.new
|
45
|
+
for i in 0...@rows
|
46
|
+
for j in 0...@cols
|
47
|
+
result << (self[i,j] + other[i,j])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
Matriz.vector(@rows, @cols, result)
|
51
|
+
end
|
52
|
+
|
53
|
+
def -(other)
|
54
|
+
raise TypeError, 'Las matrices no son del mismo tamanyo' unless (@rows==other.rows && @cols==other.cols)
|
55
|
+
result=Array.new
|
56
|
+
for i in 0...@rows
|
57
|
+
for j in 0...@cols
|
58
|
+
result << (self[i,j] - other[i,j])
|
59
|
+
end
|
60
|
+
end
|
61
|
+
Matriz.vector(@rows, @cols, result)
|
62
|
+
end
|
63
|
+
|
64
|
+
def *(other)
|
65
|
+
if(other.is_a? Numeric)
|
66
|
+
result=Array.new
|
67
|
+
for i in 0...@rows
|
68
|
+
for j in 0...@cols
|
69
|
+
result << (self[i,j]*other)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
return Matriz.vector(@rows,@cols,result)
|
73
|
+
|
74
|
+
elsif(other.is_a? Matriz)
|
75
|
+
raise TypeError, 'Las matrices dadas no se pueden multiplicar entre si' unless (@cols == other.rows)
|
76
|
+
result=Array.new
|
77
|
+
for i in 0...@rows
|
78
|
+
for j in 0...other.cols
|
79
|
+
result << 0
|
80
|
+
for k in 0...@cols
|
81
|
+
result[(result.length)-1]= (result.last + (self[i,k] * other[k,j]))
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
Matriz.vector(@rows,other.cols,result)
|
87
|
+
end
|
88
|
+
|
89
|
+
def max
|
90
|
+
aux=self[0,0]
|
91
|
+
for i in 0...@rows
|
92
|
+
for j in 0...@cols
|
93
|
+
r = aux.coerce(self[i,j])
|
94
|
+
if (r[0] > r[1])
|
95
|
+
aux = r[0]
|
96
|
+
else
|
97
|
+
aux = r[1]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
aux
|
102
|
+
end
|
103
|
+
|
104
|
+
def min
|
105
|
+
aux=self[0,0]
|
106
|
+
for i in 0...@rows
|
107
|
+
for j in 0...@cols
|
108
|
+
r = aux.coerce(self[i,j])
|
109
|
+
if (r[0] < r[1])
|
110
|
+
aux = r[0]
|
111
|
+
else
|
112
|
+
aux = r[1]
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
aux
|
117
|
+
end
|
118
|
+
|
119
|
+
def coerce(other)
|
120
|
+
[self,other]
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
class Matriz_densa < Matriz
|
3
|
+
|
4
|
+
attr_reader :rows, :cols
|
5
|
+
|
6
|
+
def initialize(rows, cols, ele)
|
7
|
+
super(rows, cols)
|
8
|
+
@mat=Array.new(ele)
|
9
|
+
@mat.map! {|e|; if e == e.elemento_nulo; e = 0; else e; end}
|
10
|
+
end
|
11
|
+
|
12
|
+
def pos(x,y)
|
13
|
+
(x*@cols)+y
|
14
|
+
end
|
15
|
+
|
16
|
+
def [](x,y)
|
17
|
+
@mat[pos(x,y)]
|
18
|
+
end
|
19
|
+
|
20
|
+
def []=(x,y,value)
|
21
|
+
@mat[pos(x,y)] = value
|
22
|
+
end
|
23
|
+
|
24
|
+
def ==(other)
|
25
|
+
if (@rows != other.rows || @cols != other.cols)
|
26
|
+
return false
|
27
|
+
end
|
28
|
+
for i in 0...@rows
|
29
|
+
for j in 0...@cols
|
30
|
+
if (@mat[pos(i,j)] != other[i,j])
|
31
|
+
return false
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
return true
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
|
2
|
+
class Matriz_dispersa < Matriz
|
3
|
+
|
4
|
+
attr_reader :rows, :cols
|
5
|
+
|
6
|
+
def initialize(rows, cols, ele)
|
7
|
+
|
8
|
+
super(rows, cols)
|
9
|
+
|
10
|
+
@val, @f, @c = Array.new, Array.new, Array.new
|
11
|
+
|
12
|
+
for i in 0...(@rows*@cols)
|
13
|
+
if(ele[i]!=0)
|
14
|
+
@val << (ele[i])
|
15
|
+
@f << (i/@cols)
|
16
|
+
@c << (i%@cols)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def [](x,y)
|
22
|
+
for pos in 0...@val.length
|
23
|
+
if (@f[pos] == x && @c[pos] == y)
|
24
|
+
return @val[pos]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
0
|
28
|
+
end
|
29
|
+
|
30
|
+
def []=(x,y,value)
|
31
|
+
for pos in 0...@val.length
|
32
|
+
if (@f[pos] == x && @c[pos] == y)
|
33
|
+
if (value != 0)
|
34
|
+
@val[pos] = value
|
35
|
+
else
|
36
|
+
@val.delete_at(pos)
|
37
|
+
@f.delete_at(pos)
|
38
|
+
@c.delete_at(pos)
|
39
|
+
end
|
40
|
+
return
|
41
|
+
end
|
42
|
+
end
|
43
|
+
if (value != 0)
|
44
|
+
@val << value
|
45
|
+
@f << x
|
46
|
+
@c << y
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def length
|
51
|
+
@val.length
|
52
|
+
end
|
53
|
+
|
54
|
+
def ==(other)
|
55
|
+
if (@val.length != other.length || @rows != other.rows || @cols != other.cols)
|
56
|
+
return false
|
57
|
+
end
|
58
|
+
for pos in 0...@val.length
|
59
|
+
if (@val[pos] != other(@f[pos],@c[pos]))
|
60
|
+
return false
|
61
|
+
end
|
62
|
+
end
|
63
|
+
true
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
data/lib/matrices/mcd.rb
ADDED
data/matrices.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "matrices/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "matrices"
|
7
|
+
s.version = Matrices::VERSION
|
8
|
+
s.authors = ["Cristo González | Juvenal Santiso"]
|
9
|
+
s.email = ["alu0100694987@ull.edu.es | alu0100696585@ull.edu.es"]
|
10
|
+
s.homepage = "https://github.com/alu0100694987/prct09.git"
|
11
|
+
s.summary = %q{Creación de matrices}
|
12
|
+
s.description = %q{Permite representar y realizar operaciones con matrices densas y dispersas}
|
13
|
+
|
14
|
+
s.rubyforge_project = "matrices"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency "rake"
|
22
|
+
s.add_development_dependency "rspec"
|
23
|
+
s.add_development_dependency "guard-rspec"
|
24
|
+
s.add_development_dependency "guard-bundler"
|
25
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'matrices/fraccion.rb'
|
2
|
+
|
3
|
+
describe Fraccion do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@frac1 = Fraccion.new(3,4)
|
7
|
+
@frac2 = Fraccion.new(4,10)
|
8
|
+
@frac3 = Fraccion.new(2,-5)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "# Numerador y denominador: " do
|
12
|
+
it "Almacenamiento correcto de numerador" do
|
13
|
+
@frac1.n.should eq(3)
|
14
|
+
end
|
15
|
+
it "Almacenamiento correcto de denominador" do
|
16
|
+
@frac1.d.should eq(4)
|
17
|
+
end
|
18
|
+
it "Almacenamiento reducido de numerador" do
|
19
|
+
@frac2.n.should eq(2)
|
20
|
+
end
|
21
|
+
it "Almacenamiento reducido de denominador" do
|
22
|
+
@frac2.d.should eq(5)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "# Metodos num() y denom(): " do
|
27
|
+
it "Obtencion de numerador" do
|
28
|
+
@frac1.num().should == 3
|
29
|
+
end
|
30
|
+
it "Obtencion de denominador" do
|
31
|
+
@frac2.denom().should == 5
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "# Salida en consola: " do
|
36
|
+
it "Mostrar fraccion en pantalla" do
|
37
|
+
@frac1.to_s().should == "3/4"
|
38
|
+
@frac2.to_s().should == "2/5"
|
39
|
+
end
|
40
|
+
it "Mostrar fraccion en formato flotante" do
|
41
|
+
@frac1.to_f().to_s().should eq("0.75")
|
42
|
+
@frac2.to_f().to_s().should eq("0.4")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "# Igualdad de fracciones:" do
|
47
|
+
it "Comparar si dos fracciones son iguales" do
|
48
|
+
(@frac1 == Fraccion.new(4)).should be_false
|
49
|
+
(@frac1 == Fraccion.new(6,8)).should be_true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "# Operaciones unarias:" do
|
54
|
+
it "Calculo del valor absoluto" do
|
55
|
+
@frac1.abs.should == @frac1
|
56
|
+
@frac3.abs.to_s().should eq("2/5")
|
57
|
+
end
|
58
|
+
it "Calculo del reciproco" do
|
59
|
+
@frac1.reciprocal.to_s().should eq("4/3")
|
60
|
+
@frac3.reciprocal.to_s().should eq("-5/2")
|
61
|
+
end
|
62
|
+
it "Calculo del opuesto" do
|
63
|
+
((-@frac1) == @frac1).should be_false
|
64
|
+
(-@frac3).to_s.should eq("2/5")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "# Operaciones binarias:" do
|
69
|
+
|
70
|
+
it "Suma de fracciones" do
|
71
|
+
(@frac1 + @frac2).to_s().should eq("23/20")
|
72
|
+
((@frac2 + @frac3) == Fraccion.new(0)).should be_true
|
73
|
+
end
|
74
|
+
|
75
|
+
it "Diferencia de fracciones" do
|
76
|
+
(@frac1 - @frac2).to_s().should eq("7/20")
|
77
|
+
(@frac3 - @frac2).to_s().should eq("-4/5")
|
78
|
+
end
|
79
|
+
|
80
|
+
it "Producto de fracciones" do
|
81
|
+
((@frac1 * @frac2) == Fraccion.new(3,10)).should be_true
|
82
|
+
((@frac2 * @frac3) == Fraccion.new(-4,25)).should be_true
|
83
|
+
end
|
84
|
+
|
85
|
+
it "Division de fracciones" do
|
86
|
+
((@frac1 / @frac2) == Fraccion.new(15,8)).should be_true
|
87
|
+
((@frac3 / @frac3) == Fraccion.new(1,1)).should be_true
|
88
|
+
end
|
89
|
+
|
90
|
+
it "Resto entre fracciones" do
|
91
|
+
((@frac1 % @frac2) == Fraccion.new(7,20)).should be_true
|
92
|
+
((@frac2 % @frac3) == Fraccion.new(0,1)).should be_true
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
describe "# Comparaciones entre fracciones:" do
|
99
|
+
it "Comparacion mayor, y mayor e igual" do
|
100
|
+
(@frac1 >= @frac2).should be_true
|
101
|
+
(@frac1 > @frac1).should be_false
|
102
|
+
end
|
103
|
+
it "Comparacion menor, y menor e igual" do
|
104
|
+
(@frac2 <= @frac2).should be_true
|
105
|
+
(@frac2 < @frac3).should be_false
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
# Fichero en el que se definen las espectativas de la clase Matriz
|
2
|
+
|
3
|
+
require 'matrices.rb'
|
4
|
+
|
5
|
+
describe Matriz do
|
6
|
+
|
7
|
+
before :all do
|
8
|
+
@m1 = Matriz.nula # Dispersa
|
9
|
+
@m2 = Matriz.nula(3,2) # Dispersa
|
10
|
+
@m3 = Matriz.vector(3,2,[2,3,0,1,0,3]) # Densa
|
11
|
+
@m4 = Matriz.vector(2,4,[0,1,0,0,7,0,2,0]) # Dispersa
|
12
|
+
@m5 = Matriz.vector(4,4,[1,1,5,1,2,1,6,1,1,5,1,3,1,2,1,1]) # Densa
|
13
|
+
@m6 = Matriz.vector(2,2,[Fraccion.new(1),Fraccion.new(1,5),Fraccion.new(0),Fraccion.new(1,3)]) # Densa
|
14
|
+
@m7 = Matriz.vector(1,3,[Fraccion.new(0),Fraccion.new(0),Fraccion.new(4)]) # Dispersa
|
15
|
+
@m8 = Matriz.vector(1,2,[Fraccion.new(1,2),Fraccion.new(3,2)]) # Densa
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "# Asignacion correcta del tipo de matriz: " do
|
19
|
+
it "Identificacion de Matriz.nula como Matriz_dispersa" do
|
20
|
+
@m1.class.should eq(Matriz_dispersa)
|
21
|
+
@m2.class.should eq(Matriz_dispersa)
|
22
|
+
end
|
23
|
+
it "Identificacion de Matriz.vector como Matriz_dispersa o Matriz.vector en funcion del numero de ceros" do
|
24
|
+
@m3.class.should eq(Matriz_densa)
|
25
|
+
@m4.class.should eq(Matriz_dispersa)
|
26
|
+
end
|
27
|
+
it "Identificacion de matrices de fracciones como Matriz_dispersa y Matriz_nula" do
|
28
|
+
@m6.class.should eq(Matriz_densa)
|
29
|
+
@m7.class.should eq(Matriz_dispersa)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "# Almacenamiento de numero de filas y columnas: " do
|
34
|
+
it "Almacenamiento correcto del numero de filas en matrices densas" do
|
35
|
+
@m3.rows.should eq(3)
|
36
|
+
@m5.rows.should eq(4)
|
37
|
+
end
|
38
|
+
it "Almacenamiento correcto del numero de filas en matrices dispersas" do
|
39
|
+
@m1.rows.should eq(1)
|
40
|
+
@m4.rows.should eq(2)
|
41
|
+
end
|
42
|
+
it "Almacenamiento correcto del numero de columnas en matrices densas" do
|
43
|
+
@m3.cols.should eq(2)
|
44
|
+
@m5.cols.should eq(4)
|
45
|
+
end
|
46
|
+
it "Almacenamiento correcto del numero de columnas en matrices dispersas" do
|
47
|
+
@m1.cols.should eq(1)
|
48
|
+
@m4.cols.should eq(4)
|
49
|
+
end
|
50
|
+
it "Almacenamiento correcto del numero de filas y columnas en matrices de fracciones" do
|
51
|
+
@m7.rows.should eq(1)
|
52
|
+
@m7.cols.should eq(3)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "# Correcta conversion a cadena de caracteres: " do
|
57
|
+
it "Funcionamiento correcto del metodo to_s en matrices densas" do
|
58
|
+
@m3.to_s.should eq('[[2,3],[0,1],[0,3]]')
|
59
|
+
@m5.to_s.should eq('[[1,1,5,1],[2,1,6,1],[1,5,1,3],[1,2,1,1]]')
|
60
|
+
end
|
61
|
+
it "Funcionamiento correcto del metodo to_s en matrices dispersas" do
|
62
|
+
@m1.to_s.should eq('[[0]]')
|
63
|
+
@m4.to_s.should eq('[[0,1,0,0],[7,0,2,0]]')
|
64
|
+
end
|
65
|
+
it "Funcionamiento correcto del metodo to_s en matrices densas y dispersas de fracciones" do
|
66
|
+
@m6.to_s.should eq('[[1/1,1/5],[0,1/3]]')
|
67
|
+
@m7.to_s.should eq('[[0,0,4/1]]')
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "# Acceso a los elementos de la matriz: " do
|
72
|
+
it "Insercion correcta de elementos en matrices densas y dispersas" do
|
73
|
+
@m2[0,0]= 1; @m2[0,1]= 1
|
74
|
+
@m2[1,0]= 1; @m2[1,1]= 1
|
75
|
+
@m2[2,0]= 1; @m2[2,1]= 1
|
76
|
+
@m3[2,0]= 5
|
77
|
+
@m2.to_s.should eq('[[1,1],[1,1],[1,1]]')
|
78
|
+
@m3.to_s.should eq('[[2,3],[0,1],[5,3]]')
|
79
|
+
end
|
80
|
+
it "Obtencion correcta de elementos en matrices densas y dispersas" do
|
81
|
+
@m4[1,0].should eq(7)
|
82
|
+
@m5[1,2].should eq(6)
|
83
|
+
end
|
84
|
+
it "Insercion y obtencion correcta de elementos en matrices de fracciones" do
|
85
|
+
@m7[0,2]= Fraccion.new(1,2)
|
86
|
+
@m7[0,2].to_s.should eq('1/2')
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "# Operaciones aritmeticas: " do
|
91
|
+
it "Suma de matrices" do
|
92
|
+
(@m2 + @m3).to_s.should eq('[[3,4],[1,2],[6,4]]')
|
93
|
+
end
|
94
|
+
it "Resta de matrices" do
|
95
|
+
(@m3 - @m3).to_s.should eq('[[0,0],[0,0],[0,0]]')
|
96
|
+
end
|
97
|
+
it "Multiplicacion por escalar" do
|
98
|
+
(2 * @m3).to_s.should eq('[[4,6],[0,2],[10,6]]')
|
99
|
+
end
|
100
|
+
it "Multiplicacion de matrices" do
|
101
|
+
(@m3 * @m4).to_s.should eq('[[21,2,6,0],[7,0,2,0],[21,5,6,0]]')
|
102
|
+
end
|
103
|
+
it "Comprobacion del tipo de clase del resultado de las operaciones" do
|
104
|
+
(@m2 + @m3).class.should eq(Matriz_densa)
|
105
|
+
(@m2 - @m2).class.should eq(Matriz_dispersa)
|
106
|
+
(@m3 * @m4).class.should eq(Matriz_densa)
|
107
|
+
end
|
108
|
+
it "Operaciones con matrices que contienen alguna fraccion" do
|
109
|
+
(@m6 + @m6).to_s.should eq('[[2/1,2/5],[0,2/3]]')
|
110
|
+
(@m8 * @m6).to_s.should eq('[[1/2,3/5]]')
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "# Comparacion de matrices: " do
|
115
|
+
it "Igualdad de matrices" do
|
116
|
+
(@m5 == Matriz.vector(4,4,[1,1,5,1,2,1,6,1,1,5,1,3,1,2,1,1])).should be_true
|
117
|
+
(@m1 == Matriz.nula(5,2)).should be_false
|
118
|
+
end
|
119
|
+
it "Igualdad de matrices de fracciones" do
|
120
|
+
(@m6 == Matriz.vector(2,2,[Fraccion.new(1),Fraccion.new(1,5),Fraccion.new(0),Fraccion.new(1,3)])).should be_true
|
121
|
+
(@m6 == Matriz.vector(2,2,[1,Fraccion.new(1,5),0,Fraccion.new(1,3)])).should be_true
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe "# Calculo del minimo y el maximo de los elementos de una matriz" do
|
126
|
+
it "Obtencion del minimo de una matriz" do
|
127
|
+
@m4.min.should eq(Fraccion.new(0))
|
128
|
+
@m5.min.should eq(1)
|
129
|
+
@m6.min.should eq(0)
|
130
|
+
@m8.min.should eq(Fraccion.new(1,2))
|
131
|
+
end
|
132
|
+
it "Obtencion del maximo de una matriz" do
|
133
|
+
@m4.max.should eq(7)
|
134
|
+
@m5.max.should eq(6)
|
135
|
+
@m6.max.should eq(1)
|
136
|
+
@m7.max.should eq(Fraccion.new(1,2))
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
data/test/tc_matrices.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# Pruebas unitarias asociadas a la creacion de matrices
|
2
|
+
|
3
|
+
require 'lib/matrices.rb'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
class Test_Matrices < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@m1=Matriz.vector(2,2,[0,1,1,0])
|
10
|
+
@m2=Matriz.vector(2,2,[1,1,1,1])
|
11
|
+
@m3=Matriz.nula
|
12
|
+
@m4=Matriz.vector(2,2,[0,0,0,5])
|
13
|
+
@m5=Matriz.vector(2,2,[1,1,1,1])
|
14
|
+
@m6=Matriz.vector(2,2,[1,2,3,4])
|
15
|
+
end
|
16
|
+
|
17
|
+
def tear_down
|
18
|
+
#nothing
|
19
|
+
end
|
20
|
+
|
21
|
+
#to_s
|
22
|
+
def test_str
|
23
|
+
assert_equal(@m3.to_s,'[[0]]')
|
24
|
+
assert_equal(@m2.to_s,'[[1,1],[1,1]]')
|
25
|
+
end
|
26
|
+
|
27
|
+
#Comprobacion de la creacion de matrices
|
28
|
+
def test_creac
|
29
|
+
#Matriz densa
|
30
|
+
assert_equal(@m1.rows, 2)
|
31
|
+
assert_equal(@m1.cols, 2)
|
32
|
+
|
33
|
+
#Matriz dispersa
|
34
|
+
assert_equal(@m4.rows, 2)
|
35
|
+
assert_equal(@m4.cols, 2)
|
36
|
+
|
37
|
+
#Creacion
|
38
|
+
assert_equal(Matriz.vector(2,2,[1,1,1,1]).to_s,@m2.to_s)
|
39
|
+
assert_equal(Matriz.nula.to_s,@m3.to_s)
|
40
|
+
end
|
41
|
+
|
42
|
+
#Comprobacion del tipo de las matrices creadas
|
43
|
+
|
44
|
+
def test_tipo
|
45
|
+
assert_kind_of(Matriz_dispersa, @m3)
|
46
|
+
assert_kind_of(Matriz_dispersa, @m4) #Matriz.vector siendo clase dispersa
|
47
|
+
assert_kind_of(Matriz_densa, @m2)
|
48
|
+
end
|
49
|
+
|
50
|
+
#Comprobacion de las operaciones
|
51
|
+
def test_method
|
52
|
+
#==
|
53
|
+
assert_operator(@m2,'==',@m5)
|
54
|
+
#max y min
|
55
|
+
assert_equal(5,@m4.max)
|
56
|
+
assert_equal(4,@m6.max)
|
57
|
+
assert_equal(1,@m6.min)
|
58
|
+
#Operaciones
|
59
|
+
assert_equal(Matriz.vector(2,2,[1,2,2,1]).to_s,(@m1+@m2).to_s)
|
60
|
+
assert_equal(Matriz.vector(2,2,[1,0,0,1]).to_s,(@m2-@m1).to_s)
|
61
|
+
assert_equal(Matriz.vector(2,2,[1,1,1,1]).to_s,(@m1*@m2).to_s)
|
62
|
+
assert_equal(Matriz.vector(2,2,[2,2,2,2]).to_s,(@m2*2).to_s)
|
63
|
+
end
|
64
|
+
|
65
|
+
#Insercion y obtencion del contenido
|
66
|
+
def test_cont
|
67
|
+
@m4[0,0]=1
|
68
|
+
@m1[0,0]=1
|
69
|
+
#insercion
|
70
|
+
assert_equal(@m4.to_s,'[[1,0],[0,5]]')
|
71
|
+
assert_equal(@m1.to_s,'[[1,1],[1,0]]')
|
72
|
+
#obtencion
|
73
|
+
assert_equal(@m4[1,1],5)
|
74
|
+
assert_equal(@m1[0,0],1)
|
75
|
+
end
|
76
|
+
|
77
|
+
#test de fallo
|
78
|
+
def test_failure
|
79
|
+
assert_equal(Matriz.vector(2,2,[5,1,0,2]).to_s,(@m1+@m2).to_s)
|
80
|
+
end
|
81
|
+
end
|
metadata
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: matrices
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- "Cristo Gonz\xC3\xA1lez | Juvenal Santiso"
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2013-11-19 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rake
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
type: :development
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: rspec
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: guard-rspec
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
type: :development
|
61
|
+
version_requirements: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: guard-bundler
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
type: :development
|
75
|
+
version_requirements: *id004
|
76
|
+
description: Permite representar y realizar operaciones con matrices densas y dispersas
|
77
|
+
email:
|
78
|
+
- alu0100694987@ull.edu.es | alu0100696585@ull.edu.es
|
79
|
+
executables: []
|
80
|
+
|
81
|
+
extensions: []
|
82
|
+
|
83
|
+
extra_rdoc_files: []
|
84
|
+
|
85
|
+
files:
|
86
|
+
- .gitignore
|
87
|
+
- .travis.yml
|
88
|
+
- Gemfile
|
89
|
+
- Guardfile
|
90
|
+
- LICENSE
|
91
|
+
- Rakefile
|
92
|
+
- Readme.md
|
93
|
+
- lib/matrices.rb
|
94
|
+
- lib/matrices/elemento_nulo.rb
|
95
|
+
- lib/matrices/fraccion.rb
|
96
|
+
- lib/matrices/matriz.rb
|
97
|
+
- lib/matrices/matriz_densa.rb
|
98
|
+
- lib/matrices/matriz_dispersa.rb
|
99
|
+
- lib/matrices/mcd.rb
|
100
|
+
- lib/matrices/version.rb
|
101
|
+
- matrices.gemspec
|
102
|
+
- spec/fraccion_spec.rb
|
103
|
+
- spec/matrices_spec.rb
|
104
|
+
- test/tc_matrices.rb
|
105
|
+
homepage: https://github.com/alu0100694987/prct09.git
|
106
|
+
licenses: []
|
107
|
+
|
108
|
+
post_install_message:
|
109
|
+
rdoc_options: []
|
110
|
+
|
111
|
+
require_paths:
|
112
|
+
- lib
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 3
|
119
|
+
segments:
|
120
|
+
- 0
|
121
|
+
version: "0"
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
hash: 3
|
128
|
+
segments:
|
129
|
+
- 0
|
130
|
+
version: "0"
|
131
|
+
requirements: []
|
132
|
+
|
133
|
+
rubyforge_project: matrices
|
134
|
+
rubygems_version: 1.8.15
|
135
|
+
signing_key:
|
136
|
+
specification_version: 3
|
137
|
+
summary: "Creaci\xC3\xB3n de matrices"
|
138
|
+
test_files: []
|
139
|
+
|