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.
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ *~
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - jruby-19mode
5
+ - rbx-2.1.1
6
+ - ruby-head
7
+ - jruby-head
8
+ - rbx-19mode
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,8 @@
1
+ guard 'bundler' do
2
+ watch('Gemfile')
3
+ end
4
+
5
+ guard 'rspec', :version => 2 do
6
+ watch(%r{^spec/.+_spec\.rb$})
7
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
8
+ end
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.
@@ -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
@@ -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
+
@@ -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,7 @@
1
+
2
+ class Numeric
3
+
4
+ def elemento_nulo
5
+ 0
6
+ end
7
+ end
@@ -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
@@ -0,0 +1,10 @@
1
+
2
+ # Metodo que calcula el maximo comun divisor
3
+
4
+ def mcd(x, y)
5
+ x, y = x.abs, y.abs
6
+ while y != 0
7
+ x, y = y, x % y
8
+ end
9
+ x
10
+ end
@@ -0,0 +1,3 @@
1
+ module Matrices
2
+ VERSION = "0.0.1"
3
+ end
@@ -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
@@ -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
+