lib/matriz.rb~ in matrizdispersascp-0.0.1 vs lib/matriz.rb~ in matrizdispersascp-0.0.2

- old
+ new

@@ -1,135 +1,152 @@ -# Practica 8 Lenguajes y Paradigmas de la programación usando #desarrollo dirigido por pruebas (Test Driven Development - TDD) con -# la herramienta Rspec. +# Etsii ull grado informática +# Lenguajes y Paradigmas de la programacion # Pedro Javier Núñez Rodríguez # Constanza Leon Baritussio -# +# Clase matriz -class Matriz - +require 'fraccion' + +class Matriz + include Comparable #Modulo comparable - attr_accessor :matrix, :n, :m - @matrix - @n # filas - @m # columnas - - def initialize(n,m) #Constructor de la clase que inicializa la matriz con los valores que se le pasan por parametros - raise ArgumentError, 'Tamaño de matriz no valido' unless n.is_a? Integer and m.is_a? Integer and n > 0 and m > 0 - @n = n - @m = m - @matrix=[] - for i in (0...@n) - @matrix[i]=[] - for j in (0...@m) - @matrix[i][j] = 0 - end - end + + attr_accessor :filas, :columnas, :matriz + + def initialize(m) + @filas = m.size + @columnas = m[0].size + @matriz = m; end - def set(i, j, valor) #Método para aaceder a los valores i , j y valor de la matriz - raise ArgumentError, 'Indice no valido' unless i.is_a? Integer and i >= 0 and i < @n - raise ArgumentError, 'Indice no valido' unless j.is_a? Integer and j >= 0 and j < @m - raise ArgumentError, 'Valor no numerico' unless valor.is_a? Integer - @matrix[i][j] = valor + def [](fila, columna) + @matriz[fila][columna] end - - def get(i, j) - return @matrix[i][j] + + def []=(fila, columna, valor) + @matriz[fila][columna] = valor end def to_s #Método encargado de mostrar por consola la matriz de forma matriz[i][j] - s = "" - s += "{" - for i in (0...n) - s += "{" - for j in (0...m) - if j == 0 - s += "#{matrix[i][j]}" - else - s += "," - s += "#{matrix[i][j]}" - end - end - s += "}" - end - s += "}" - s + s = "" + s += "{" + for i in (0...filas) + s += "{" + for j in (0...columnas) + if j == 0 + s += "#{matriz[i][j]}" + else + s += "," + s += "#{matriz[i][j]}" + end + end + s += "}" + end + s += "}" + s end def to_f # Método encargado de mostrar por la consola la matriz en formato flotante - s = "" - s = "{" - for i in (0...n) - s += "{" - for j in (0...m) - if j == 0 - s += "#{matrix[i][j].to_f}" - else - s += "," - s += "#{matrix[i][j].to_f}" - end - end - s += "}" - end - s += "}" - s + s = "" + s = "{" + for i in (0...filas) + s += "{" + for j in (0...columnas) + if j == 0 + s += "#{matriz[i][j].to_f}" + else + s += "," + s += "#{matriz[i][j].to_f}" + end + end + s += "}" + end + s += "}" + s end def -@ # Sobrecarga del operador - para calcular el opuesto de una matriz - mat = Matriz.new(n,m) - for i in (0...n) - for j in (0...m) - if matrix[i][j] != 0 - mat.matrix[i][j] = (matrix[i][j] * -1) - end - end - end - mat + mat = Matriz.new(self.matriz) + for i in (0...filas) + for j in (0...columnas) + if matriz[i][j] != 0 + mat.matriz[i][j] = (matriz[i][j] * -1) + end + end + end + mat end def * num #Método que multiplica un número por una matriz - mat = Matriz.new(n,m) - for i in (0...n) - for j in (0...m) - mat.set(i,j,matrix[i][j] * num) - end - end - mat + mat = Matriz.new(self.matriz) + for i in (0...filas) + for j in (0...columnas) + mat.matriz[i][j] = (matriz[i][j] * num) + end + end + mat end def + matAux #Método para hacer la suma de de matrices - mat = Matriz.new(n,m) - for i in (0...n) - for j in (0...m) - mat.set(i,j,matrix[i][j] + matAux.matrix[i][j]) - end + mat = Matriz.new(matAux.matriz) + for i in (0...filas) + for j in (0...columnas) + mat.matriz[i][j] = (matriz[i][j] + matAux.matriz[i][j]) + end end mat end def - matAux #Método para hacer la resta de matrices - mat = Matriz.new(n,m) - for i in (0...n) - for j in (0...m) - mat.set(i,j,matrix[i][j] - matAux.matrix[i][j]) - end + mat = Matriz.new(matAux.matriz) + for i in (0...filas) + for j in (0...columnas) + mat.matriz[i][j] = (matriz[i][j] - matAux.matriz[i][j]) + end end mat end def * matAux #Método para hacer la multiplicacion de matrices - mat = Matriz.new(n,m) - for k in 0...n - for i in (0...n) - contador = 0 - for j in (0...m) - contador = contador +(self.get(i,j) * matAux.get(i,j)) - end - end - mat.set(i,j, contador) + prod = Array.new(matriz.size - 1,0) + for i in 0...matriz[0].size + prod[i] = Array.new(matAux.matriz.size,0) + for j in 0...matAux.matriz.size + for pos in 0...matriz.size + prod[i][j] = prod[i][j] + (matriz[i][pos] * matAux.matriz[pos][j]) + end + end + end + Matriz.new(prod) + end + + def max + maximo = 0.to_f + for i in 0...matriz.size + for j in 0...matriz[i].size + if matriz[i][j].to_f > maximo + maximo = matriz[i][j].to_f + end + end end - mat + maximo end + + def min + minimo = 1000 + for i in 0...matriz.size + for j in 0...matriz[i].size + if matriz[i][j].to_f < minimo + minimo = matriz[i][j].to_f + end + end + end + minimo + end + + #def coerce(something) + # [self, Fraccion.new(something)] + #end end