Clase de objetos 3: Matrices con métodos

En el apartado de Arreglos vimos como crear matrices y realizar algunas operaciones con ellas, pero todo se realizaba dentro del método main de la misma clase, esta vez se realizaran las mismas operaciones pero creando una clase Matriz propia que contendrá métodos de las diferentes operaciones y podrán ser llamados en cualquier clase que se desee.

 

Primeramente crearemos la clase “Matriz” la cual tendrá 3 atributos de tipo entero: las filas, las columnas y una matriz de tipo int para hacer referencia a las operaciones que se realizaran.

private int renglones; 
private int columnas; 
private int matriz[][];

 

Creamos un constructor.

       //Constructor 
        public Matriz(int renglones, int columnas){ 
                this.renglones=renglones; 
                this.columnas=columnas; 
                matriz=new int[renglones][columnas]; 
        }

 

Creamos sus métodos getters y setters.

        public int getColumnas() { 
                return columnas; 
        } 

        public void setColumnas(int columnas) { 
                this.columnas = columnas; 
        } 

        public int[][] getMatriz() { 
                return matriz; 
        } 

        public void setMatriz(int[][] matriz) { 
                this.matriz = matriz; 
        } 

        public int getRenglones() { 
                return renglones; 
        } 

        public void setRenglones(int renglones) { 
                this.renglones = renglones; 
        }

Ya tenemos los métodos básicos para manipular los datos de la matriz fuera de ésta clase.

 

 

Primeramente crearemos un método para pedir datos y guardarlos en la matriz después de que ésta se crea.

       //Pedir datos
        public void datos(){
                int i,j;
                for(i=0;i<renglones;i++){
                        for(j=0;j<columnas;j++){
                                matriz[i][j]=Integer.parseInt(JOptionPane.showInputDialog("Digita un valor"));
                        }
                }
        }

 

Podemos necesitar un método para mostrar los datos de una matriz, podría ser de la siguiente manera.

//Mostrar datos
        public String mostrarDatos(){
                String salida="Los datos de la matriz son: \n";
                for(int i=0;i<renglones;i++){
                        for(int j=0;j<columnas;j++){
                                salida+=matriz[i][j]+"  ";
                        }
                        salida+="\n";
                }
                return salida;
        }

 

Ahora si comencemos las operaciones de matrices. Primeramente la suma de matrices.

public Matriz suma(Matriz mat){
                Matriz resultado=new Matriz(renglones,columnas);
                        for(int i=0;i<renglones;i++){
                                for(int j=0;j<columnas;j++){
                                        resultado.matriz[i][j]=matriz[i][j]+mat.matriz[i][j];
                                }
                        }
                return resultado;
        }

Éstos métodos pueden resultar un poco enredosos, lo explicaré de forma breve.

 

Declaramos el método con nombre “suma” que retorna un objeto de tipo “Matriz”, es del mismo tipo que nuestra clase así que ese objeto contiene los mismos métodos y los mismos atributos que declaramos anteriormente (y posteriormente a éste método), de igual manera recibe como parámetro un objeto de tipo “Matriz” llamado “mat”, que será necesario para realizar la suma.

 

Dentro del método declaramos un objeto de tipo “Matriz” llamado resultado, que será nuestro objeto que retornará el método conteniendo los valores de la suma de las matrices.

 

Realizamos la suma, en éste momento tenemos 3 matrices, la primer matriz es la matriz declara al inicio (La matriz declara como atributo), la matriz que se paso como parámetro y la matriz resultado. Recordar que para acceder a un miembro de una clase se hace con el nombre del objeto creado, punto y el nombre del miembro. Por ejemplo.

 

 

resultado.matriz[i][j];

 

En este caso se hace referencia a una matriz que contiene el objeto resultado, y es en esa matriz donde se guardara el resultado de la suma, de la misma manera se hace con la matriz que pasamos como parámetro. Se realiza la suma y retornamos resultado.

 

De la misma forma se realizan los demás métodos:

public Matriz resta(Matriz mat){
                Matriz resultado=new Matriz(renglones,columnas);
                        for(int i=0;i<renglones;i++){
                                for(int j=0;j<columnas;j++){
                                        resultado.matriz[i][j]=matriz[i][j]-mat.matriz[i][j];
                                }
                        }
                return resultado;
                }
        
        public Matriz multiplicacion(Matriz mat){
                Matriz matC=new Matriz(renglones,mat.columnas);
                for(int i=0;i<renglones;i++){
                        for(int j=0;j<mat.columnas;j++){
                                int sum=0;
                                for(int k=0;k<columnas;k++){
                                        sum=matriz[i][k]*mat.matriz[k][j];
                                }
                                matC.matriz[i][j]=sum;
                        }
          }
                return matC;
        }
        
        public boolean superior(){
                int c=0;
                for(int i=1;i<renglones;i++){
                    for(int j=0;j<columnas;j++){
                        if(j<i){
                                c+=matriz[i][j];        
                        }
                    }
                  }
                  if(c==0){
                          return true;
                  }
                  else{
                          return false;
                  }

        }
        
        public boolean inferior(){
                int c=0;
                for(int j=1;j<columnas;j++){
                    for(int i=0;i<renglones;i++){
                        if(i<j){
                                c+=matriz[i][j];
                        }
                    }
                  }
                  if(c==0){
                    return true;
                  }
                  else{
                    return false; 
                  }
        }

Clase Matriz completa

package pqtMatriz;

import javax.swing.*;
public class Matriz {
        private int renglones;
        private int columnas;
        private int matriz[][];
        
        
        public int getColumnas() {
                return columnas;
        }

        public void setColumnas(int columnas) {
                this.columnas = columnas;
        }

        public int[][] getMatriz() {
                return matriz;
        }

        public void setMatriz(int[][] matriz) {
                this.matriz = matriz;
        }

        public int getRenglones() {
                return renglones;
        }

        public void setRenglones(int renglones) {
                this.renglones = renglones;
        }

        
        
        //Constructor
        public Matriz(int renglones, int columnas){
                this.renglones=renglones;
                this.columnas=columnas;
                matriz=new int[renglones][columnas];
        }
        
        //Pedir datos
        public void datos(){
                int i,j;
                for(i=0;i<renglones;i++){
                        for(j=0;j<columnas;j++){
                                matriz[i][j]=Integer.parseInt(JOptionPane.showInputDialog("Digita un valor"));
                        }
                }
        }
        
        //Mostrar datos
        public String mostrarDatos(){
                String salida="Los datos de la matriz son: \n";
                for(int i=0;i<renglones;i++){
                        for(int j=0;j<columnas;j++){
                                salida+=matriz[i][j]+"  ";
                        }
                        salida+="\n";
                }
                return salida;
        }
        
        public Matriz suma(Matriz mat){
                Matriz resultado=new Matriz(renglones,columnas);
                        for(int i=0;i<renglones;i++){
                                for(int j=0;j<columnas;j++){
                                        resultado.matriz[i][j]=matriz[i][j]+mat.matriz[i][j];
                                }
                        }
                return resultado;
        }
        
        public Matriz resta(Matriz mat){
                Matriz resultado=new Matriz(renglones,columnas);
                        for(int i=0;i<renglones;i++){
                                for(int j=0;j<columnas;j++){
                                        resultado.matriz[i][j]=matriz[i][j]-mat.matriz[i][j];
                                }
                        }
                return resultado;
                }
        
        public Matriz multiplicacion(Matriz mat){
                Matriz matC=new Matriz(renglones,mat.columnas);
                for(int i=0;i<renglones;i++){
                        for(int j=0;j<mat.columnas;j++){
                                int sum=0;
                                for(int k=0;k<columnas;k++){
                                        sum=matriz[i][k]*mat.matriz[k][j];
                                }
                                matC.matriz[i][j]=sum;
                        }
          }
                return matC;
        }
        
        public boolean superior(){
                int c=0;
                for(int i=1;i<renglones;i++){
                    for(int j=0;j<columnas;j++){
                        if(j<i){
                                c+=matriz[i][j];        
                        }
                    }
                  }
                  if(c==0){
                          return true;
                  }
                  else{
                          return false;
                  }

        }
        
        public boolean inferior(){
                int c=0;
                for(int j=1;j<columnas;j++){
                    for(int i=0;i<renglones;i++){
                        if(i<j){
                                c+=matriz[i][j];
                        }
                    }
                  }
                  if(c==0){
                    return true;
                  }
                  else{
                    return false; 
                  }
        }
}

 

Necesitamos una clase con el método main para invocar las operaciones de la matriz.

Clase Principal

package pqtMatriz;

import javax.swing.JOptionPane;

public class Principal {

        public static void main(String[] args) {
                String menu="";
                int op, renglones, columnas;
                //Matrices para las operaciones
                Matriz matriz1,matriz2,matrizResultado;
                
                do{
            menu="******** Menú Operaciones con matrices ********\n";
            menu+="1.- Suma \n";
            menu+="2.- Resta \n";
            menu+="3.- Multiplicación \n";
            menu+="4.- Triangular superior \n";
            menu+="5.- Triangular inferior \n";
            menu+="6.- Salir \n";
            menu+="Elija una opción";
            op=Integer.parseInt(JOptionPane.showInputDialog(menu));
                        switch(op){
            case 1:
                //Creacion primera matriz                               
                                renglones=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de renglones para la matriz 1"));
                                columnas=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de columnas para la matriz 1"));
                                matriz1=new Matriz(renglones,columnas);
                                //Llenamos de datos la matriz
                                matriz1.datos(); 
                                //Creacion segunda matriz
                                renglones=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de renglones para la matriz 2"));
                                columnas=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de columnas para la matriz 2"));
                                matriz2=new Matriz(renglones,columnas);
                                matriz2.datos();
                                JOptionPane.showMessageDialog(null,"Los datos ingresados son: \n"+matriz1.mostrarDatos()+" \n"+matriz2.mostrarDatos());
                                if((matriz1.getRenglones()==matriz2.getRenglones())&&(matriz1.getColumnas()==matriz2.getColumnas())){
                                        matrizResultado=new Matriz(renglones,columnas);
                                        matrizResultado=matriz1.suma(matriz2);
                                        JOptionPane.showMessageDialog(null,matrizResultado.mostrarDatos());
                                }else{
                                        JOptionPane.showMessageDialog(null,"No se pueden sumar las matrices tienen diferentes dimensiones");
                                }
                break;
            case 2:
                //Creacion primera matriz
                                renglones=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de renglones para mat1"));
                                columnas=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de columnas para mat1"));
                                matriz1=new Matriz(renglones,columnas);
                                matriz1.datos();
                                //Creacion segunda matriz
                                renglones=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de renglones para mat2"));
                                columnas=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de columnas para mat2"));
                                matriz2=new Matriz(renglones,columnas);
                                matriz2.datos();
                                JOptionPane.showMessageDialog(null,"Los datos ingresados son: \n"+matriz1.mostrarDatos()+" \n"+matriz2.mostrarDatos());
                                if((matriz1.getRenglones()==matriz2.getRenglones())&&(matriz1.getColumnas()==matriz2.getColumnas())){
                                        matrizResultado=new Matriz(renglones,columnas);
                                        matrizResultado=matriz1.resta(matriz2);
                                        JOptionPane.showMessageDialog(null,matrizResultado.mostrarDatos());
                                }else{
                                        JOptionPane.showMessageDialog(null,"No se pueden restar las matrices tienen diferentes dimensiones");
                                }
                break;  
            case 3:
                //Creacion primera matriz
                                renglones=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de renglones para mat1"));
                                columnas=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de columnas para mat1"));
                                matriz1=new Matriz(renglones,columnas);
                                matriz1.datos();
                                //Creacion segunda matriz
                                renglones=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de renglones para mat2"));
                                columnas=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de columnas para mat2"));
                                matriz2=new Matriz(renglones,columnas);
                                matriz2.datos();
                                JOptionPane.showMessageDialog(null,"Los datos ingresados son: \n"+matriz1.mostrarDatos()+" \n"+matriz2.mostrarDatos());
                                if((matriz1.getColumnas())==(matriz2.getRenglones())){
                                        matrizResultado=new Matriz(matriz1.getRenglones(),matriz2.getColumnas());
                                        matrizResultado=matriz1.multiplicacion(matriz2);
                                        JOptionPane.showMessageDialog(null,matrizResultado.mostrarDatos());
                                }else{
                                        JOptionPane.showMessageDialog(null,"No se pueden multiplicar las matrices tienen diferentes dimensiones");
                                }
                break;  
            case 4:
                //Creacion de la matriz
                                renglones=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de renglones para la matriz"));
                                columnas=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de columnas para la matriz"));
                                matriz1=new Matriz(renglones,columnas);
                                matriz1.datos();
                                JOptionPane.showMessageDialog(null,matriz1.mostrarDatos());
                                if(matriz1.getRenglones()==matriz1.getColumnas()){
                                        if(matriz1.superior()){
                                                JOptionPane.showMessageDialog(null,"La matriz es triangular superior");
                                        }else{
                                                JOptionPane.showMessageDialog(null,"La matriz no es triangular superior");
                                        }
                                }else{
                                        JOptionPane.showMessageDialog(null,"La matriz no es cuadrada");
                                }
                break;   
            case 5:
                //Creacion de la matriz
                                renglones=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de renglones para la matriz"));
                                columnas=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de columnas para la matriz"));
                                matriz1=new Matriz(renglones,columnas);
                                matriz1.datos();
                                JOptionPane.showMessageDialog(null,matriz1.mostrarDatos());
                                if(matriz1.getRenglones()==matriz1.getColumnas()){
                                        if(matriz1.inferior()){
                                                JOptionPane.showMessageDialog(null,"La matriz es triangular inferior");
                                        }else{
                                                JOptionPane.showMessageDialog(null,"La matriz no es triangular inferior");
                                        }
                                }else{
                                        JOptionPane.showMessageDialog(null,"La matriz no es cuadrada");
                                }
                break;       
            }
        }while(op!=6);  
        }

}

¿Y si simplificamos un poco el código?

Como se puede observar, en cada case siempre se repite la forma en crear una la matriz cuando se piden las filas y las columnas, esto lo pudiéramos simplificar (Y ahorrarnos muchas lineas de código) si declaramos un método que haga esa tarea, y dentro del case simplemente llamarlo.

 

 

Éste nuevo método lo podemos hacer en la clase Principal ya que no es un método que deba hacerse en la clase Matriz, la diferencia de esto es que, en la clase Matriz definimos los atributos y métodos que definen el comportamiento de la clase Matriz, sin embargo, en la clase Principal estamos interactuando con el usuario, por lo tanto sería incorrecto crear el nuevo método en la clase Matriz.

 

Método para crear una matriz.

private static Matriz crearMatriz(){                   
                int renglones=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de renglones para la matriz"));
                int columnas=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de columnas para la matriz"));
                Matriz matriz=new Matriz(renglones,columnas);
                //Llenamos de datos la matriz
                matriz.datos();
                return matriz;
        }

Esta vez se creo un método estático, éste nos permite acceder al método sin la necesidad de tener un objeto creado, la implementación sería la siguiente.

 

matriz1=crearMatriz();

matriz1=crearMatriz();

 

Los cambios a la clase “Principal” son mínimos, y aun así se ahorraron muchas lineas de código.

Clase Principal2

package pqtMatriz;

import javax.swing.JOptionPane;

public class Principal2 {

        public static void main(String[] args) {
                String menu="";
                int op, renglones, columnas;
                //Matrices para las operaciones
                Matriz matriz1,matriz2,matrizResultado;
                
                do{
            menu="******** Menú Operaciones con matrices ********\n";
            menu+="1.- Suma \n";
            menu+="2.- Resta \n";
            menu+="3.- Multiplicación \n";
            menu+="4.- Triangular superior \n";
            menu+="5.- Triangular inferior \n";
            menu+="6.- Salir \n";
            menu+="Elija una opción";
            op=Integer.parseInt(JOptionPane.showInputDialog(menu));
                        switch(op){
            case 1:
                matriz1=crearMatriz();
                                matriz2=crearMatriz();
                                JOptionPane.showMessageDialog(null,"Los datos ingresados son: \n"+matriz1.mostrarDatos()+" \n"+matriz2.mostrarDatos());
                                if((matriz1.getRenglones()==matriz2.getRenglones())&&(matriz1.getColumnas()==matriz2.getColumnas())){
                                        matrizResultado=new Matriz(matriz1.getRenglones(),matriz1.getColumnas());
                                        matrizResultado=matriz1.suma(matriz2);
                                        JOptionPane.showMessageDialog(null,matrizResultado.mostrarDatos());
                                }else{
                                        JOptionPane.showMessageDialog(null,"No se pueden sumar las matrices tienen diferentes dimensiones");
                                }
                break;
            case 2:
                matriz1=crearMatriz();
                                matriz2=crearMatriz();
                                JOptionPane.showMessageDialog(null,"Los datos ingresados son: \n"+matriz1.mostrarDatos()+" \n"+matriz2.mostrarDatos());
                                if((matriz1.getRenglones()==matriz2.getRenglones())&&(matriz1.getColumnas()==matriz2.getColumnas())){
                                        matrizResultado=new Matriz(matriz1.getRenglones(),matriz1.getColumnas());
                                        matrizResultado=matriz1.resta(matriz2);
                                        JOptionPane.showMessageDialog(null,matrizResultado.mostrarDatos());
                                }else{
                                        JOptionPane.showMessageDialog(null,"No se pueden restar las matrices tienen diferentes dimensiones");
                                }
                break;  
            case 3:
                matriz1=crearMatriz();
                                matriz2=crearMatriz();
                                JOptionPane.showMessageDialog(null,"Los datos ingresados son: \n"+matriz1.mostrarDatos()+" \n"+matriz2.mostrarDatos());
                                if((matriz1.getColumnas())==(matriz2.getRenglones())){
                                        matrizResultado=new Matriz(matriz1.getRenglones(),matriz2.getColumnas());
                                        matrizResultado=matriz1.multiplicacion(matriz2);
                                        JOptionPane.showMessageDialog(null,matrizResultado.mostrarDatos());
                                }else{
                                        JOptionPane.showMessageDialog(null,"No se pueden multiplicar las matrices tienen diferentes dimensiones");
                                }
                break;  
            case 4:
                matriz1=crearMatriz();
                                JOptionPane.showMessageDialog(null,matriz1.mostrarDatos());
                                if(matriz1.getRenglones()==matriz1.getColumnas()){
                                        if(matriz1.superior()){
                                                JOptionPane.showMessageDialog(null,"La matriz es triangular superior");
                                        }else{
                                                JOptionPane.showMessageDialog(null,"La matriz no es triangular superior");
                                        }
                                }else{
                                        JOptionPane.showMessageDialog(null,"La matriz no es cuadrada");
                                }
                break;   
            case 5:
                matriz1=crearMatriz();
                                JOptionPane.showMessageDialog(null,matriz1.mostrarDatos());
                                if(matriz1.getRenglones()==matriz1.getColumnas()){
                                        if(matriz1.inferior()){
                                                JOptionPane.showMessageDialog(null,"La matriz es triangular inferior");
                                        }else{
                                                JOptionPane.showMessageDialog(null,"La matriz no es triangular inferior");
                                        }
                                }else{
                                        JOptionPane.showMessageDialog(null,"La matriz no es cuadrada");
                                }
                break;       
            }
        }while(op!=6);
        }

        private static Matriz crearMatriz(){                    
                int renglones=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de renglones para la matriz"));
                int columnas=Integer.parseInt(JOptionPane.showInputDialog("Digita el número de columnas para la matriz"));
                Matriz matriz=new Matriz(renglones,columnas);
                //Llenamos de datos la matriz
                matriz.datos();
                return matriz;
        }
}