prac09 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 +18 -0
- data/.travis.yml +6 -0
- data/Gemfile +4 -0
- data/Guardfile +12 -0
- data/LICENSE.txt +22 -0
- data/README.md +47 -0
- data/Rakefile +11 -0
- data/lib/prac09.rb +9 -0
- data/lib/prac09/fraccion.rb +149 -0
- data/lib/prac09/matriz.rb +190 -0
- data/lib/prac09/matrizdensa.rb +22 -0
- data/lib/prac09/matrizdispersa.rb +59 -0
- data/lib/prac09/version.rb +3 -0
- data/pkg/prac09-0.0.1.gem +0 -0
- data/prac09.gemspec +26 -0
- data/spec/fraccion_spec.rb +169 -0
- data/spec/matrices_spec.rb +128 -0
- data/test/tc_matrices.rb +69 -0
- metadata +124 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'bundler' do
|
5
|
+
watch('Gemfile')
|
6
|
+
end
|
7
|
+
|
8
|
+
guard 'rspec', :version => 2 do
|
9
|
+
watch(%r{^spec/.+_spec\.rb$})
|
10
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
11
|
+
watch('spec/spec_helper.rb') { "spec" }
|
12
|
+
end
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Leonor Priego, Carlos Martin
|
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/README.md
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
==============================================================
|
2
|
+
Prac09
|
3
|
+
Estado actual de TRAVIS [](https://travis-ci.org/alu0100699906/pract09)
|
4
|
+
==============================================================
|
5
|
+
|
6
|
+
|
7
|
+
La Gema Prac09 consta de clases que nos permiten crear, gestionar y trabajar, de manera distinta, con matrices densas y matrices dispersas.
|
8
|
+
|
9
|
+
Como dato, cabe añadir que una matriz se considerará dispersa si tiene más de un 60% de ceros.
|
10
|
+
|
11
|
+
## Instalación
|
12
|
+
|
13
|
+
Añade esta línea al Gemfile de tu aplicación:
|
14
|
+
|
15
|
+
gem 'prac09'
|
16
|
+
|
17
|
+
Luego ejecuta:
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
O instálalo tú mismo de esta forma:
|
22
|
+
|
23
|
+
$ gem install prac09
|
24
|
+
|
25
|
+
## Uso
|
26
|
+
|
27
|
+
Si quieres usar esta gema en tu aplicación Ruby, incluye el fichero "pract09"
|
28
|
+
|
29
|
+
## Contribución
|
30
|
+
|
31
|
+
1. Haz un fork
|
32
|
+
2. Crea tu rama de características (`git checkout -b my-new-feature`)
|
33
|
+
3. Haz un commit de tus cambios (`git commit -am 'Add some feature'`)
|
34
|
+
4. Empuja los cambios a la rama(`git push origin my-new-feature`)
|
35
|
+
5. Crea un nuevo Pull Request.
|
36
|
+
|
37
|
+
## Documentación
|
38
|
+
|
39
|
+
### Herencia de clases
|
40
|
+
|
41
|
+
clase Matriz //clase base
|
42
|
+
.________|______.
|
43
|
+
↓ ↓
|
44
|
+
clase Mdispersa clase Mdensa //clases derivadas
|
45
|
+
|
46
|
+
La clase Matriz contendrá la implementacion de unos métodos generales para las operaciones +, -, *, to_s, == (método que pasa a una cadena de caracteres). Las clases derivadas implementarán para cada una los métodos de comparación y de acceso ([]=, []) ya que éstos tienen funcionamientos distintos debido a cómo almacena la información cada una de las clases.
|
47
|
+
|
data/Rakefile
ADDED
data/lib/prac09.rb
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
class Fraccion
|
2
|
+
|
3
|
+
#el modulo comparable contiene todos los metodos que permiten hacer comparaciones
|
4
|
+
include Comparable
|
5
|
+
#metodo que permite acceder a los atributos de la clase
|
6
|
+
attr_reader :numerador, :denominador
|
7
|
+
|
8
|
+
def initialize(n,d)
|
9
|
+
simp=gcd(n,d) #guarda el maximo comun divisor
|
10
|
+
|
11
|
+
if d!=0
|
12
|
+
@numerador=n
|
13
|
+
@denominador=d
|
14
|
+
end
|
15
|
+
|
16
|
+
#utiliza el maximo comun divisor para simplificar la fraccion
|
17
|
+
@numerador, @denominador = n/simp, d/simp
|
18
|
+
end
|
19
|
+
|
20
|
+
#metodo que devuelve el numerador
|
21
|
+
def num()
|
22
|
+
@numerador
|
23
|
+
end
|
24
|
+
|
25
|
+
#metodo que devuelve el denominador
|
26
|
+
def denom()
|
27
|
+
@denominador
|
28
|
+
end
|
29
|
+
|
30
|
+
#metodo para mostrar por la consola la fraccion
|
31
|
+
def to_s
|
32
|
+
"#{@numerador}/#{@denominador}"
|
33
|
+
end
|
34
|
+
|
35
|
+
#metodo para mostrar por la consola la fraccion en punto flotante
|
36
|
+
def to_float
|
37
|
+
(@numerador.to_f()/@denominador.to_f)
|
38
|
+
end
|
39
|
+
|
40
|
+
#metodo para calcular el valor absoluto de una fraccion
|
41
|
+
def abs ()
|
42
|
+
Fraccion.new(@numerador.abs,@denominador.abs)
|
43
|
+
end
|
44
|
+
|
45
|
+
##metodo para calcular el reciproco de una fraccion
|
46
|
+
def reciprocal ()
|
47
|
+
Fraccion.new(@denominador,@numerador)
|
48
|
+
end
|
49
|
+
|
50
|
+
#metodo para calcular el opuesto de una fraccion
|
51
|
+
def -@ ()
|
52
|
+
if(@numerador>0 && @denominador<0)
|
53
|
+
@numerador = @numerador.abs
|
54
|
+
@denominador = @denominador.abs
|
55
|
+
|
56
|
+
elsif(@numerador<0 && @denominador>0)
|
57
|
+
@numerador = @numerador.abs
|
58
|
+
@denominador = @denominador.abs
|
59
|
+
|
60
|
+
else
|
61
|
+
@numerador = -(@numerador.abs)
|
62
|
+
@denominador = @denominador.abs
|
63
|
+
end
|
64
|
+
Fraccion.new(@numerador,@denominador)
|
65
|
+
end
|
66
|
+
|
67
|
+
#metodo para calcular la suma de dos fracciones
|
68
|
+
def +(object)
|
69
|
+
if (object.instance_of?(Fraccion)==true)
|
70
|
+
|
71
|
+
aux=mcm(@denominador,object.denominador)
|
72
|
+
return Fraccion.new((((aux*@numerador)/@denominador)+(aux*object.numerador)/object.denominador),aux)
|
73
|
+
|
74
|
+
end
|
75
|
+
if (object.instance_of?( Fixnum )==true)
|
76
|
+
aux=Fraccion.new(object, 1)
|
77
|
+
m=mcm(@denominador,aux.denominador)
|
78
|
+
return Fraccion.new((((m*@numerador)/@denominador) + (m*aux.numerador)/aux.denominador),m)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
#metodo para calcular la resta de dos fracciones
|
83
|
+
def -(object)
|
84
|
+
aux=mcm(@denominador,object.denominador)
|
85
|
+
Fraccion.new((((aux*@numerador)/@denominador)-(aux*object.numerador)/object.denominador),aux)
|
86
|
+
end
|
87
|
+
|
88
|
+
#metodo para calcular la multiplicacion de dos fracciones
|
89
|
+
def *(object)
|
90
|
+
if(object.is_a?(Numeric))
|
91
|
+
object = Fraccion.new(object,1)
|
92
|
+
end
|
93
|
+
Fraccion.new(@numerador*object.numerador,@denominador*object.denominador)
|
94
|
+
end
|
95
|
+
|
96
|
+
#metodo para calcular la division de dos fracciones
|
97
|
+
def /(object)
|
98
|
+
#multiplica numerador con numerador y denominador con denominador
|
99
|
+
Fraccion.new(@numerador*object.denominador,@denominador*object.numerador)
|
100
|
+
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
#metodo para calcular el resto de la division de dos fracciones
|
105
|
+
def % (object)
|
106
|
+
#guarda la division de las fracciones
|
107
|
+
division=self.abs/object.abs
|
108
|
+
#calcula el resto
|
109
|
+
resto=object.abs * (division - Fraccion.new(division.to_float.to_i,1))
|
110
|
+
if (object.numerador < 0)
|
111
|
+
#si el numerador es negativo imprime el opuesto del resto
|
112
|
+
return -resto
|
113
|
+
end
|
114
|
+
#lo imprime
|
115
|
+
resto
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
#Utilizamos el metodo del modulo Comparable para realizar operaciones comparacionales de fracciones
|
120
|
+
def <=> (object)
|
121
|
+
self.to_float<=>object.to_float
|
122
|
+
end
|
123
|
+
|
124
|
+
def gcd(n, d)
|
125
|
+
n1,n2 = n.abs,d.abs
|
126
|
+
gcd = 1
|
127
|
+
k = 1
|
128
|
+
while (k <= n1 and k <= n2)
|
129
|
+
if (n1 % k == 0 and n2 % k == 0)
|
130
|
+
gcd = k
|
131
|
+
end
|
132
|
+
k += 1
|
133
|
+
end
|
134
|
+
return gcd
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
#metodo para hallar el minimo comun multiplo de los dos numeros pasados como parametros
|
139
|
+
def mcm(a,b)
|
140
|
+
#mediante el metodo de euclides, resolvemos el minimo comun multiplo mediante el
|
141
|
+
#maximo comun divisor
|
142
|
+
aux=gcd(a,b)
|
143
|
+
(a/aux)*b
|
144
|
+
end
|
145
|
+
|
146
|
+
def coerce(object)
|
147
|
+
[self,object]
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,190 @@
|
|
1
|
+
|
2
|
+
class Matriz
|
3
|
+
|
4
|
+
def initialize(filas, columnas)
|
5
|
+
@filas, @columnas = filas , columnas
|
6
|
+
end
|
7
|
+
|
8
|
+
#get filas
|
9
|
+
def filas()
|
10
|
+
@filas
|
11
|
+
end
|
12
|
+
|
13
|
+
#get columnas
|
14
|
+
def columnas()
|
15
|
+
@columnas
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def Matriz.constructor(filas, columnas, velementos)
|
20
|
+
|
21
|
+
longitud=filas*columnas
|
22
|
+
if (((velementos.count(0)*100)/(longitud)) >= 60)
|
23
|
+
|
24
|
+
MatrizDispersa.new(filas,columnas,velementos)
|
25
|
+
else
|
26
|
+
|
27
|
+
MatrizDensa.new(filas,columnas,velementos)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def +(object)
|
33
|
+
|
34
|
+
if ( (@filas == object.filas) && (@columnas == object.columnas))
|
35
|
+
|
36
|
+
matrizresultado=Array.new
|
37
|
+
i = 0
|
38
|
+
while (i < @filas) do
|
39
|
+
|
40
|
+
j=0
|
41
|
+
while (j < @columnas) do
|
42
|
+
|
43
|
+
matrizresultado << (self[i,j] + object[i,j])
|
44
|
+
j=j+1
|
45
|
+
end
|
46
|
+
i=i+1
|
47
|
+
end
|
48
|
+
Matriz.constructor(@filas, @columnas, matrizresultado)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def -(object)
|
54
|
+
|
55
|
+
if ( (@filas == object.filas) && (@columnas == object.columnas))
|
56
|
+
|
57
|
+
matrizresultado=Array.new
|
58
|
+
i = 0
|
59
|
+
while (i < @filas) do
|
60
|
+
|
61
|
+
j=0
|
62
|
+
while (j < @columnas) do
|
63
|
+
|
64
|
+
matrizresultado << (self[i,j] - object[i,j])
|
65
|
+
j=j+1
|
66
|
+
end
|
67
|
+
i=i+1
|
68
|
+
end
|
69
|
+
Matriz.constructor(@filas, @columnas, matrizresultado)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
def ==(object)
|
76
|
+
if ((@filas == object.filas) && (@columnas == object.columnas))
|
77
|
+
i = 0
|
78
|
+
while (i < @filas) do
|
79
|
+
|
80
|
+
j = 0
|
81
|
+
while (j < @columnas) do
|
82
|
+
|
83
|
+
if (self[i,j] == object[i,j]) #comparamos elemento a elemento
|
84
|
+
es_igual = true
|
85
|
+
else
|
86
|
+
return es_igual = false #si solo uno es distinto la funcion devuelve falso
|
87
|
+
end
|
88
|
+
j = j + 1
|
89
|
+
end
|
90
|
+
i = i + 1
|
91
|
+
end
|
92
|
+
end
|
93
|
+
return es_igual #si compara todos los elementos y son iguales devuelve verdadero
|
94
|
+
end
|
95
|
+
|
96
|
+
def *(object)
|
97
|
+
|
98
|
+
if(object.is_a? Numeric)
|
99
|
+
matrizresultado=Array.new
|
100
|
+
i=0
|
101
|
+
while (i<@filas)
|
102
|
+
j=0
|
103
|
+
while (j<@columnas)
|
104
|
+
matrizresultado << (self[i,j]*object)
|
105
|
+
j=j+1
|
106
|
+
end
|
107
|
+
i=i+1
|
108
|
+
end
|
109
|
+
return Matriz.constructor(@filas,@columnas,matrizresultado)
|
110
|
+
|
111
|
+
|
112
|
+
elsif ((object.is_a?(Matriz)==true) && (@columnas==object.filas()))
|
113
|
+
i=0
|
114
|
+
matrizresultado = Array.new
|
115
|
+
while (i < @filas)
|
116
|
+
j = 0
|
117
|
+
while (j < object.columnas())
|
118
|
+
k = 0
|
119
|
+
matrizresultado<<0
|
120
|
+
while (k < @columnas) #itera en las columnas de la primera matriz y las filas de la segunda
|
121
|
+
matrizresultado[(matrizresultado.size)-1]= (matrizresultado.last + (self[i,k] * object[k,j]))
|
122
|
+
k = k + 1
|
123
|
+
end
|
124
|
+
j = j + 1
|
125
|
+
end
|
126
|
+
i = i + 1
|
127
|
+
end
|
128
|
+
return Matriz.constructor(@filas,object.columnas,matrizresultado)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def max()
|
133
|
+
maximo = 0 # maximo provisional
|
134
|
+
i, j = 0,0
|
135
|
+
while i<=@filas
|
136
|
+
while j<=@columnas
|
137
|
+
if (self[i,j]>maximo) #si el valor es mayor que el provisional almacena el nuevo
|
138
|
+
maximo = self[i,j]
|
139
|
+
end
|
140
|
+
j += 1;
|
141
|
+
end
|
142
|
+
i += 1;
|
143
|
+
end
|
144
|
+
return maximo
|
145
|
+
end
|
146
|
+
|
147
|
+
def min()
|
148
|
+
minimo = 0 # maximo provisional
|
149
|
+
i, j = 0,0
|
150
|
+
while i<=@filas
|
151
|
+
while j<=@columnas
|
152
|
+
if (self[i,j]<minimo) #si el valor es mayor que el provisional almacena el nuevo
|
153
|
+
minimo = self[i,j]
|
154
|
+
end
|
155
|
+
j += 1;
|
156
|
+
end
|
157
|
+
i += 1;
|
158
|
+
end
|
159
|
+
return minimo
|
160
|
+
end
|
161
|
+
|
162
|
+
def to_s
|
163
|
+
string= "[" ##corchete de matriz
|
164
|
+
|
165
|
+
fil=0
|
166
|
+
while (fil<@filas)
|
167
|
+
string = string + "[" #corchete de fila
|
168
|
+
col=0
|
169
|
+
while (col<@columnas)
|
170
|
+
string = string + "#{self[fil,col]}"
|
171
|
+
col += 1
|
172
|
+
if(col < @columnas)
|
173
|
+
string = string + ","
|
174
|
+
end
|
175
|
+
end
|
176
|
+
string = string + "]" #cerramos el corchete de fila
|
177
|
+
fil += 1
|
178
|
+
if (fil < @filas)
|
179
|
+
string = string + ","
|
180
|
+
end
|
181
|
+
end
|
182
|
+
string = string +"]" ##cerramos el corchete de matriz
|
183
|
+
end
|
184
|
+
|
185
|
+
|
186
|
+
def coerce(object)
|
187
|
+
[self,object]
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
class MatrizDensa < Matriz
|
4
|
+
|
5
|
+
def initialize(filas, columnas, velementos)
|
6
|
+
super(filas, columnas)
|
7
|
+
@matriz=Array.new(velementos)
|
8
|
+
end
|
9
|
+
|
10
|
+
def pos(i,j)
|
11
|
+
(i*@columnas)+j
|
12
|
+
end
|
13
|
+
|
14
|
+
def [](i,j)
|
15
|
+
@matriz[pos(i,j)]
|
16
|
+
end
|
17
|
+
|
18
|
+
def []=(i,j,valor)
|
19
|
+
@matriz[pos(i,j)] = valor
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
|
2
|
+
class MatrizDispersa < Matriz
|
3
|
+
|
4
|
+
def initialize(filas, columnas, velementos)
|
5
|
+
super(filas, columnas)
|
6
|
+
@vvalores= Array.new
|
7
|
+
@vfil= Array.new
|
8
|
+
@vcol = Array.new
|
9
|
+
|
10
|
+
longitud=(@filas*@columnas)
|
11
|
+
i=0
|
12
|
+
while(i<longitud)
|
13
|
+
|
14
|
+
if(velementos[i]!=0)
|
15
|
+
|
16
|
+
@vvalores<< (velementos[i])
|
17
|
+
@vfil << (i/@columnas)
|
18
|
+
@vcol<< (i%@columnas)
|
19
|
+
end
|
20
|
+
i=i+1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def [](f,c)
|
25
|
+
no_nulo = @vvalores.size
|
26
|
+
i=0
|
27
|
+
while(i < no_nulo)
|
28
|
+
|
29
|
+
if (@vfil[i] == f && @vcol[i] == c)
|
30
|
+
return @vvalores[i]
|
31
|
+
end
|
32
|
+
i=i+1
|
33
|
+
end
|
34
|
+
return 0
|
35
|
+
end
|
36
|
+
|
37
|
+
def []= (i,j,nvalor) #setter
|
38
|
+
ind = 0
|
39
|
+
while ind<@vvalores.size
|
40
|
+
if (i == @vfil[ind] && j == @vcol[ind] && nvalor != 0) #para poner un nuevo valor no nulo
|
41
|
+
@vvalor[ind]=nvalor
|
42
|
+
return
|
43
|
+
end
|
44
|
+
if (i == @vfil[ind] && j == @vcol[ind] && nvalor == 0) #para poner un nuevo valor nulo en una posicion ocupada anteriormente
|
45
|
+
@vvalores.delete_at(ind) #simplemente eliminamos el valor que habia antes pues los nulos no se almacenan
|
46
|
+
@vfil.delete_at(ind)
|
47
|
+
@vcol.delete_at(ind)
|
48
|
+
return
|
49
|
+
end
|
50
|
+
ind += 1
|
51
|
+
end #si la posicion no existia la anyadimos con el correspondiente valor
|
52
|
+
@vvalores << (nvalor)
|
53
|
+
@vfil << (i)
|
54
|
+
@vcol << (j)
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
end
|
Binary file
|
data/prac09.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'prac09/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "prac09"
|
8
|
+
spec.version = Prac09::VERSION
|
9
|
+
spec.authors = ["Leonor Priego","Carlos Martin"]
|
10
|
+
spec.email = ["alu0100699906@ull.edu.es","alu0100702293@ull.edu.es"]
|
11
|
+
spec.description = %q{Clases que permiten gestionar matrices densas y dispersas de manera distinta}
|
12
|
+
spec.summary = %q{Aplicación para trabajar con matrices densas y dispersas}
|
13
|
+
spec.homepage = "https://github.com/alu0100699906/pract09"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "rspec"
|
24
|
+
spec.add_development_dependency "guard-rspec"
|
25
|
+
spec.add_development_dependency "guard-bundler"
|
26
|
+
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
require "prac09/fraccion.rb"
|
2
|
+
|
3
|
+
describe Fraccion do #espectativa para la clase
|
4
|
+
##
|
5
|
+
describe "#se asignan bien los valores de denominador y numerador"do
|
6
|
+
it "Creacion correcta de fraccion con numerador y denom." do
|
7
|
+
fa = Fraccion.new(1,2)
|
8
|
+
fa.numerador.should == 1
|
9
|
+
fa.denominador.should == 2
|
10
|
+
end
|
11
|
+
end
|
12
|
+
##
|
13
|
+
describe "#la fraccion esta en su minima expresion" do
|
14
|
+
it "Fraccion simplificada" do
|
15
|
+
fa = Fraccion.new(6,4)
|
16
|
+
fa.numerador.should == 3
|
17
|
+
fa.denominador.should == 2
|
18
|
+
end
|
19
|
+
end
|
20
|
+
##
|
21
|
+
describe "#el valor del numerador y denominador se obtiene mediante num() y denom()" do
|
22
|
+
it ".num() existe" do
|
23
|
+
fa = Fraccion.new(1,2)
|
24
|
+
fa.num() == 1
|
25
|
+
end
|
26
|
+
it ".denom() existe" do
|
27
|
+
fa = Fraccion.new(1,2)
|
28
|
+
fa.denom() == 2
|
29
|
+
end
|
30
|
+
end
|
31
|
+
##
|
32
|
+
describe " #Se debe mostrar num/denom" do
|
33
|
+
it " .to_s()" do
|
34
|
+
fa = Fraccion.new(1,2)
|
35
|
+
fa.to_s().should == "1/2"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
##
|
39
|
+
describe " #Se debe mostrar en formato flotante" do
|
40
|
+
it " .to_float()" do
|
41
|
+
fa = Fraccion.new(1,2)
|
42
|
+
fa.to_float().should == 0.5
|
43
|
+
end
|
44
|
+
end
|
45
|
+
##
|
46
|
+
describe " #comparacion con == "do
|
47
|
+
it "\n comparando"do
|
48
|
+
fa = Fraccion.new(6,4)
|
49
|
+
fb = Fraccion.new(3,2)
|
50
|
+
fc = Fraccion.new(1,5)
|
51
|
+
|
52
|
+
(fa == fb).should be_true
|
53
|
+
(fa == fc).should be_false
|
54
|
+
(fb == fc).should be_false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
##
|
58
|
+
describe " #valor absoluto con metodo abs"do
|
59
|
+
it ".abs"do
|
60
|
+
fa = Fraccion.new(-6,4)
|
61
|
+
fb = Fraccion.new(1,-5)
|
62
|
+
fc = Fraccion.new(1,5)
|
63
|
+
|
64
|
+
fa.abs.num.should == 3
|
65
|
+
fa.abs.denom.should == 2
|
66
|
+
fb.abs.should == fc
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
##
|
71
|
+
describe " #Operaciones con fracciones"do
|
72
|
+
it ".recriprocal calcula inversa" do
|
73
|
+
fa = Fraccion.new(3,2)
|
74
|
+
fb = Fraccion.new(2,3)
|
75
|
+
|
76
|
+
(fa.reciprocal == fb).should be_true
|
77
|
+
end
|
78
|
+
it "-@ opuesto" do
|
79
|
+
fa = Fraccion.new(2,4)
|
80
|
+
fb = Fraccion.new(-1,2)
|
81
|
+
fc = Fraccion.new(1,-4)
|
82
|
+
|
83
|
+
((-fa) == fa).should be_true
|
84
|
+
(-fb).to_s.should eq("1/2")
|
85
|
+
(-fc).should eq(Fraccion.new(1,4))
|
86
|
+
end
|
87
|
+
it "@+@ operacion suma" do
|
88
|
+
fa = Fraccion.new(3,2)
|
89
|
+
fb = Fraccion.new(1,4)
|
90
|
+
fc = Fraccion.new(7,4)
|
91
|
+
|
92
|
+
(fa + fb).should == fc
|
93
|
+
(fb + fc).should eq(Fraccion.new(2,1))
|
94
|
+
end
|
95
|
+
it "@-@ operacion resta" do
|
96
|
+
fa = Fraccion.new(2,3)
|
97
|
+
fb = Fraccion.new(1,4)
|
98
|
+
fc = Fraccion.new(5,12)
|
99
|
+
|
100
|
+
(fa - fb).should == fc
|
101
|
+
(fb - fc).should eq(Fraccion.new(-1,6))
|
102
|
+
end
|
103
|
+
it "@*@ operacion producto" do
|
104
|
+
fa = Fraccion.new(2,3)
|
105
|
+
fb = Fraccion.new(1,4)
|
106
|
+
fc = Fraccion.new(5,2)
|
107
|
+
|
108
|
+
(fa * fb).should eq(Fraccion.new(1,6))
|
109
|
+
(fa * fc).should eq(Fraccion.new(5,3))
|
110
|
+
(fb * fc).should eq(Fraccion.new(5,8))
|
111
|
+
end
|
112
|
+
it "@/@ operacion division" do
|
113
|
+
fa = Fraccion.new(2,3)
|
114
|
+
fb = Fraccion.new(5,2)
|
115
|
+
fc = Fraccion.new(4,15)
|
116
|
+
|
117
|
+
(fa / fb == fc).should be_true
|
118
|
+
(fa / fc == fb).should be_true
|
119
|
+
end
|
120
|
+
it "@%@ operacion modulo" do
|
121
|
+
fa = Fraccion.new(2,3)
|
122
|
+
fb = Fraccion.new(5,2)
|
123
|
+
fc = Fraccion.new(4,15)
|
124
|
+
|
125
|
+
(fa % fb).to_s.should =="2/3"
|
126
|
+
(fa % fc).to_s.should =="2/15"
|
127
|
+
end
|
128
|
+
it "@<@ operacion menor que" do
|
129
|
+
fa = Fraccion.new(1,4)
|
130
|
+
fb = Fraccion.new(5,2)
|
131
|
+
fc = Fraccion.new(3,4)
|
132
|
+
|
133
|
+
(fa < fb).should be_true
|
134
|
+
(fa < fc).should be_true
|
135
|
+
(fc < fb).should be_true
|
136
|
+
end
|
137
|
+
it "@>@ operacion mayor que" do
|
138
|
+
fa = Fraccion.new(1,4)
|
139
|
+
fb = Fraccion.new(5,2)
|
140
|
+
fc = Fraccion.new(3,4)
|
141
|
+
|
142
|
+
(fb > fa).should be_true
|
143
|
+
(fc > fa).should be_true
|
144
|
+
(fb > fc).should be_true
|
145
|
+
end
|
146
|
+
it "@<=@ operacion menor o igual que" do
|
147
|
+
fa = Fraccion.new(1,4)
|
148
|
+
fb = Fraccion.new(5,2)
|
149
|
+
fc = Fraccion.new(1,4)
|
150
|
+
|
151
|
+
(fa <= fb).should be_true
|
152
|
+
(fa <= fc).should be_true
|
153
|
+
(fc <= fb).should be_true
|
154
|
+
end
|
155
|
+
it "@>=@ operacion mayor o igual que" do
|
156
|
+
fa = Fraccion.new(1,4)
|
157
|
+
fb = Fraccion.new(5,2)
|
158
|
+
fc = Fraccion.new(1,4)
|
159
|
+
|
160
|
+
(fb >= fa).should be_true
|
161
|
+
(fc >= fa).should be_true
|
162
|
+
(fb >= fc).should be_true
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
|
@@ -0,0 +1,128 @@
|
|
1
|
+
|
2
|
+
require 'prac09.rb'
|
3
|
+
|
4
|
+
describe Matriz do
|
5
|
+
|
6
|
+
before (:each) do
|
7
|
+
|
8
|
+
@ma = Matriz.constructor(2,2,[1,1,2,2])
|
9
|
+
@mz = Matriz.constructor(2,2,[1,1,2,2])
|
10
|
+
@md = Matriz.constructor(2,2,[2,2,4,4])
|
11
|
+
@dis = Matriz.constructor(2,2,[2,0,0,0])
|
12
|
+
|
13
|
+
@mb = Matriz.constructor(3,3,[0,0,0,0,0,1,0,0,0])
|
14
|
+
@mg = Matriz.constructor(3,3,[0,0,0,0,0,1,0,0,0])
|
15
|
+
@mo = Matriz.constructor(3,3,[0,0,0,0,0,2,0,0,0])
|
16
|
+
@mp = Matriz.constructor(3,3,[1,2,3,0,0,0,0,0,4])
|
17
|
+
@mq = Matriz.constructor(3,3,[2,4,0,0,0,0,2,0,0])
|
18
|
+
|
19
|
+
@fa = Fraccion.new(1,2)
|
20
|
+
@fb = Fraccion.new(3,4)
|
21
|
+
@fc = Fraccion.new(5,6)
|
22
|
+
@fd = Fraccion.new(7,8)
|
23
|
+
@ra = Fraccion.new(11,8)
|
24
|
+
@ro = Fraccion.new(19,12)
|
25
|
+
|
26
|
+
@a = Matriz.constructor(2,2, [@fa,@fb,@fc,@fd])
|
27
|
+
@b = Matriz.constructor(2,2,[@fd, @fc, @fb, @fa])
|
28
|
+
@c = Matriz.constructor(2,2,[@ra,@ro,@ro,@ra])
|
29
|
+
|
30
|
+
@pro1 = Matriz.constructor(3,3,[1,1,1,2,2,2,3,3,3])
|
31
|
+
@pro2 = Matriz.constructor(3,3,[1,2,3,1,2,3,1,2,3])
|
32
|
+
|
33
|
+
@multip = Matriz.constructor(3,2,[2,3,0,1,0,3])
|
34
|
+
@multip1 = Matriz.constructor(2,4,[0,1,0,0,7,0,2,0])#dispersa
|
35
|
+
|
36
|
+
@l1=Matriz.constructor(2,2,[0,0,0,1])
|
37
|
+
@l2=Matriz.constructor(2,2,[0,1,0,0])
|
38
|
+
|
39
|
+
@l4=Matriz.constructor(3,3,[0,1,2,1,0,0,0,0,0])
|
40
|
+
@l5=Matriz.constructor(3,3,[2,0,2,2,0,0,0,0,0])
|
41
|
+
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "# pruebas " do
|
46
|
+
|
47
|
+
it "instanciacion de un racional" do
|
48
|
+
@fa = Fraccion.new(1,2)
|
49
|
+
@fa.numerador.should == 1
|
50
|
+
@fa.denominador.should == 2
|
51
|
+
end
|
52
|
+
|
53
|
+
it "suma de matrices con fracciones" do
|
54
|
+
(@a + @b).should == @c
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
it "#comprobacion de clases" do
|
59
|
+
@mb.instance_of?(MatrizDispersa)
|
60
|
+
@ma.instance_of?(MatrizDensa)
|
61
|
+
@dis.instance_of?(MatrizDispersa)
|
62
|
+
end
|
63
|
+
|
64
|
+
it " igualdad densa "do
|
65
|
+
@ma.should == @mz
|
66
|
+
end
|
67
|
+
|
68
|
+
it " igualdad dispersa "do
|
69
|
+
@mb.should == @mg
|
70
|
+
end
|
71
|
+
|
72
|
+
it " suma " do
|
73
|
+
|
74
|
+
(@ma + @mz).should == @md #suma densas
|
75
|
+
(@mg + @mb).should == @mo #suma dispersas
|
76
|
+
(@mp + @mq).to_s.should == ('[[3,6,3],[0,0,0],[2,0,4]]') #suma dispersas
|
77
|
+
(@a + @md).to_s.should == ('[[5/2,11/4],[29/6,39/8]]')#suma racional con densa
|
78
|
+
(@a + @dis).to_s.should ==('[[5/2,3/4],[5/6,7/8]]') #suma racional con dispersa
|
79
|
+
(@dis+ @a).to_s.should == ('[[5/2,3/4],[5/6,7/8]]') #suma dispersa con racional
|
80
|
+
(@ma + @dis).to_s.should == ('[[3,1],[2,2]]') #suma dispersa con densa
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
it "resta" do
|
85
|
+
(@md -@mz).should eq(@ma)
|
86
|
+
(@mo - @mg).should eq(@mb)
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
it " producto "do
|
91
|
+
(2*@pro1).to_s.should ==('[[2,2,2],[4,4,4],[6,6,6]]')
|
92
|
+
(@ma * @a).to_s.should == ('[[4/3,13/8],[8/3,13/4]]')
|
93
|
+
(@a * @l1).to_s.should == ('[[0/4,3/4],[0/24,7/8]]')
|
94
|
+
( @a * @a ).to_s.should == ('[[7/8,33/32],[55/48,89/64]]') #multiplica 2 racionales
|
95
|
+
(@pro1 * @pro2).to_s.should == ('[[3,6,9],[6,12,18],[9,18,27]]')
|
96
|
+
(@multip * @multip1).to_s.should ==('[[21,2,6,0],[7,0,2,0],[21,0,6,0]]') #multiplica densa con dispersa
|
97
|
+
(@l1*@l2).to_s.should ==('[[0,0],[0,0]]') #multiplica dispersas
|
98
|
+
(@l4*@l5).to_s.should ==('[[2,0,0],[2,0,2],[0,0,0]]') #multiplica dispersas
|
99
|
+
end
|
100
|
+
|
101
|
+
it " getter y setter"do
|
102
|
+
@mz[0,0].should == 1
|
103
|
+
@ma[0,1]= 2
|
104
|
+
@ma[0,1].should == 2
|
105
|
+
|
106
|
+
@multip[0,0].should == 2
|
107
|
+
@multip[1,2]= 5
|
108
|
+
@mq[0,1].should == 4
|
109
|
+
|
110
|
+
|
111
|
+
@mb[1,2].should == 1
|
112
|
+
@mb[0,0]= 5
|
113
|
+
@mb[0,0].should == 5
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
end
|
118
|
+
it " maximo y minimo"do
|
119
|
+
@mq.max.should == 4
|
120
|
+
@md.max.should == 4
|
121
|
+
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
data/test/tc_matrices.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'prac09.rb'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class Test_Matrices < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@ma = Matriz.constructor(2,2,[1,1,2,2])
|
7
|
+
@mz = Matriz.constructor(2,2,[1,1,2,2])
|
8
|
+
@md = Matriz.constructor(2,2,[2,2,4,4])
|
9
|
+
@mc = Matriz.constructor(3,3,[8,8,4,5,4,7,1,2,9])
|
10
|
+
|
11
|
+
@mb = Matriz.constructor(3,3,[0,0,0,0,0,1,0,0,0])
|
12
|
+
@mg = Matriz.constructor(3,3,[0,0,0,0,0,1,0,0,0])
|
13
|
+
@mo = Matriz.constructor(3,3,[0,0,0,0,0,2,0,0,0])
|
14
|
+
@mp = Matriz.constructor(3,3,[1,2,3,0,0,0,0,0,4])
|
15
|
+
@mq = Matriz.constructor(3,3,[2,4,0,0,0,0,2,0,0])
|
16
|
+
@mr = Matriz.constructor(3,3,[3,6,3,0,0,0,2,0,4])
|
17
|
+
|
18
|
+
@fa = Fraccion.new(1,2)
|
19
|
+
@fb = Fraccion.new(3,4)
|
20
|
+
@fc = Fraccion.new(5,6)
|
21
|
+
@fd = Fraccion.new(7,8)
|
22
|
+
@ra = Fraccion.new(11,8)
|
23
|
+
@ro = Fraccion.new(19,12)
|
24
|
+
@rb = Fraccion.new(33,32)
|
25
|
+
@rc = Fraccion.new(55,48)
|
26
|
+
@rd = Fraccion.new(89,64)
|
27
|
+
|
28
|
+
@a = Matriz.constructor(2,2, [@fa,@fb,@fc,@fd])
|
29
|
+
@b = Matriz.constructor(2,2,[@fd, @fc, @fb, @fa])
|
30
|
+
@c = Matriz.constructor(2,2,[@ra,@ro,@ro,@ra])
|
31
|
+
|
32
|
+
@pro1 = Matriz.constructor(3,3,[1,1,1,2,2,2,3,3,3])
|
33
|
+
@pro2 = Matriz.constructor(3,3,[1,2,3,1,2,3,1,2,3])
|
34
|
+
@pro3 = Matriz.constructor(3,3,[3,6,9,6,12,18,9,18,27])
|
35
|
+
end
|
36
|
+
|
37
|
+
def tear_down
|
38
|
+
#nothing
|
39
|
+
end
|
40
|
+
|
41
|
+
#pruebas para el metodo suma
|
42
|
+
def test_suma
|
43
|
+
assert_equal(@mr,(@mq+@mp)) #dispersas
|
44
|
+
assert_equal(@c,(@a+@b)) #fraccionales
|
45
|
+
assert_equal(@md,(@ma+@mz)) #densa
|
46
|
+
end
|
47
|
+
|
48
|
+
#pruebas para el metodo resta
|
49
|
+
def test_resta
|
50
|
+
assert_equal(@ma, (@md-@mz)) #densa
|
51
|
+
assert_equal(@a, (@c-@b)) #fraccionales
|
52
|
+
assert_equal(@mp, (@mr-@mq)) #dispersa
|
53
|
+
end
|
54
|
+
|
55
|
+
#pruebas para el metodo producto
|
56
|
+
def test_producto
|
57
|
+
assert_equal(@pro3, (@pro1*@pro2))
|
58
|
+
assert_equal((@ma * @a).to_s,('[[4/3,13/8],[8/3,13/4]]'))
|
59
|
+
end
|
60
|
+
|
61
|
+
#pruebas para los fallos
|
62
|
+
def test_failure
|
63
|
+
assert_equal(@c,(@a+@b))
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_maximo_minimo
|
67
|
+
assert_equal(@mq.max,4)
|
68
|
+
end
|
69
|
+
end
|
metadata
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: prac09
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Leonor Priego
|
9
|
+
- Carlos Martin
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-11-19 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: bundler
|
17
|
+
requirement: &9760260 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '1.3'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *9760260
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rake
|
28
|
+
requirement: &9759780 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *9759780
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rspec
|
39
|
+
requirement: &9759260 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *9759260
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: guard-rspec
|
50
|
+
requirement: &9758660 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *9758660
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: guard-bundler
|
61
|
+
requirement: &9758080 !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
type: :development
|
68
|
+
prerelease: false
|
69
|
+
version_requirements: *9758080
|
70
|
+
description: Clases que permiten gestionar matrices densas y dispersas de manera distinta
|
71
|
+
email:
|
72
|
+
- alu0100699906@ull.edu.es
|
73
|
+
- alu0100702293@ull.edu.es
|
74
|
+
executables: []
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- .gitignore
|
79
|
+
- .travis.yml
|
80
|
+
- Gemfile
|
81
|
+
- Guardfile
|
82
|
+
- LICENSE.txt
|
83
|
+
- README.md
|
84
|
+
- Rakefile
|
85
|
+
- lib/prac09.rb
|
86
|
+
- lib/prac09/fraccion.rb
|
87
|
+
- lib/prac09/matriz.rb
|
88
|
+
- lib/prac09/matrizdensa.rb
|
89
|
+
- lib/prac09/matrizdispersa.rb
|
90
|
+
- lib/prac09/version.rb
|
91
|
+
- pkg/prac09-0.0.1.gem
|
92
|
+
- prac09.gemspec
|
93
|
+
- spec/fraccion_spec.rb
|
94
|
+
- spec/matrices_spec.rb
|
95
|
+
- test/tc_matrices.rb
|
96
|
+
homepage: https://github.com/alu0100699906/pract09
|
97
|
+
licenses:
|
98
|
+
- MIT
|
99
|
+
post_install_message:
|
100
|
+
rdoc_options: []
|
101
|
+
require_paths:
|
102
|
+
- lib
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
111
|
+
requirements:
|
112
|
+
- - ! '>='
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
requirements: []
|
116
|
+
rubyforge_project:
|
117
|
+
rubygems_version: 1.8.11
|
118
|
+
signing_key:
|
119
|
+
specification_version: 3
|
120
|
+
summary: Aplicación para trabajar con matrices densas y dispersas
|
121
|
+
test_files:
|
122
|
+
- spec/fraccion_spec.rb
|
123
|
+
- spec/matrices_spec.rb
|
124
|
+
- test/tc_matrices.rb
|