Programación en C++ Arrays y cadenas de texto Arrays y cadenas de texto Los arrays son usados extensamente por los programadores pa ra contener listas de datos en la memoria, por ejemplo, los datos almacenados en un disco suelen leerse y ponerse po nerse dentro de un array con el objetivo de facilitar la manipulación de dichos datos, ya que los datos en memoria pueden ser modificados, clasificados, marcados para su eliminacion, etc. para luego ser reescritos al disco. Otro ejemplo podría ser el de un menú de opciones que se desplegarán dentro de una ventana para que el usuario pueda elegir una de éstas, en tales casos y cuando las opciones son numerosas, solamente se ponen unas cuantas de ellas dentro de la ventana pero se le da al usuario la oportunidad de poder subir y bajar a su antojo para ver el resto de opciones que, aunque no se vean en la ventana, forman parte del menú o array de opciones.
Array: Un array es un conjunto de datos del mismo tipo ordenados en forman líneal uno después de otro. Los componentes de un array se han de referenciar por medio del nombre del array y un índice de desplazamiento para indicar el componente deseado.
Indices de un array Los índices son números que se utilizan para identificar a cada uno de los componentes de un array. A modo de ejemplo, podemos pensar que los índices son como los números de habitaciones de un hotel, es decir, para poder dirijirnos a un hotel específico es necesario saber el nombre del mismo, luego, si queremos llegar a una habitación específica de dicho hotel necesitaremos, además del nombre del hotel, el número de habitación deseado.
Dimensiones de un array De acuerdo a la forma en que se construye o declara un array, éste puede ser clasificado como: unidimensional, bidimensional y multidimensional. Los arrays que se emplean con mucha más frecuencia son los estructurados a manera de vector ( array unidimensional ) y los estructurados a manera de matriz ( array bidimensional ), así, aunque en C++ se pueden crear estructuras multidimensionales, en este capítulo solo trataremos con vectores y matrices.
Array unidimensional
Una array uni-dimensional es aquel en donde los componentes son accesibles por medio de uno y solamente un índice que apunte al componente requerido. Los arrays de este tipo son vectores. Conceptualmente, podemos pensar en un conocidos también con el nombre de vectores. array unidimensional como en una lista compuesta de líneas o filas en donde para referinos a una de ellas emplearemos un número para indicar la posición de la misma dentro de la lista. Por ejemplo, consideremos el caso de la tabla o array VentaSemanal, la cual está pensada para registrar las ventas de cada uno de los días de la semana. De manera conceptual podemos ver el array como se muestra a continuación: Nota: en C++ los arrays están basados en 0 ( cero ), es decir, el e l primer elemento de un array se indexa mediante el 0, y el índice para el último de los elementos es igual al número de componentes menos uno. array: VentaSemanal +------+ | dato | |------| | dato | |------| | dato | |------| | dato | |------| | dato | |------| | dato | |------| | dato | |------|
<-- componente 0, ( fila 0 ) <-- componente 1, ( fila 1 ) ... ... ... ... <-- componente 6, ( fila 6 )
Si en el array VentaSemanal queremos que el elemento 4 ( por ejemplo ) contenga el valor de 8987 lo podemos lograr con la instrucción: VentaSemanal[4] = 8987; y el estado del array sería: array: VentaSemanal +------+ | dato | |------| | dato | |------|
| dato | |------| | dato | |------| | 8987 | <--- componente 4 |------| | dato | |------| | dato | |------|
Array bidimensional Una array bi-dimensional es aquel en donde los componentes son accesibles por medio de una pareja de índices que apunten a la fila y a la columna del componente requerido. Los arrays de este tipo son conocidos también con el nombre de matrices. Conceptualmente, podemos pensar en un array bidimensional como en una lista compuesta de filas y columnas, en donde para referirnos a una de ellas emplearemos un número para indicar la posición de fila y otro número para indicar la posición de la columna del componente deseado. Por ejemplo, consideremos el caso de la tabla o array VentaSemanaQ, la cual está pensada para registrar las ventas de cada uno de los días de la semana por cuatro semanas, o sea, una tabla de 7 x 4 elementos. De manera conceptual podemos ver el array como se muestra a continuación: array: VentaSemanaQ C O L U M N A S
F I L A S
+--- componente ( 0, 0 ) | +------+------+------+------+ | dato | dato | dato | dato | |------|------|------|------| | dato | dato | dato | dato | |------|------|------|------| | dato | dato | dato | dato | |------|------|------|------| | dato | dato | dato | dato | |------|------|------|------| | dato | dato | dato | dato | |------|------|------|------| | dato | dato | dato | dato | |------|------|------|------| | dato | dato | dato | dato | +------+------+------+------+ | +---- componente ( 6, 3 )
Si en el array VentaSemanaQ queremos que el elemento de la fila 4, columna 3 ( por ejemplo ) contenga el valor de 5000 lo podemos lograr con la instrucción: VentaSemanaQ[4][3] = 5000; y el estado del array sería:
array: VentaSemanaQ +--- componente ( 0, 0 ) | +------+------+------+------+ | dato | dato | dato | dato | |------|------|------|------| | dato | dato | dato | dato | |------|------|------|------| | dato | dato | dato | dato | |------|------|------|------| | dato | dato | dato | dato | |------|------|------|------| | dato | dato | dato | 5000 | <-- componente ( 4, 3 ) |------|------|------|------| | dato | dato | dato | dato | |------|------|------|------| | dato | dato | dato | dato | +------+------+------+------+ | +---- componente ( 6, 3 )
Declaración de arrays en C, C++ En C, C++ para declarar un array se emplea la sintaxis: tipo identificador [tamaño]
= { lista de inicialización }
;
donde, •
•
•
•
tipo se refiere al tipo de datos que contendrá el array. El tipo puede ser cualquiera de los tipos estándar (char, int, float, etc.) o un tipo definido por el usuario. Es más, el tipo del array puede ser de una estructura creada con: struct, union y class. identificador se refiere al nombre que le daremos al array. tamaño es opcional e indica el número de elementos que contendrá el array. Si un array se declara sin tamaño, el mismo no podrá contener elemento alguno a menos que en la declaración se emplee una lista de inicialización. lista de inicialización es opcional y se usa para establecer valores para cada uno de los componentes del array. Si el array es declarado con un tamaño específico, el número de valores inicializados no podrá ser mayor a dicho tamaño.
Ejemplos:
int intA[5]; long longA[5] = { 1, 2, 3, 4, 5 }; char charA[3] = { 'a', 'b', 'c' };
Iteraciones dentro de un array (vector) El termino Iterar se refiere al hecho de acceder (con el fin de leer o escribir) sobre cada uno de los componentes de un array. Así, para poner un ejemplo reconsideremos el caso de la tabla VentaSemanal (vista en una sección anterior), y que dicho sea de paso es un array de 7 elementos de tipo double . Luego, vamos a mostrar como ejemplo un programa completo en el cual se declara el array mencionado con valores inicializados, que serán mostrados en pantalla y al final la suma de estos. Observe que la variable i usada para iterar dentro del array va desde 0 hasta FILAS - 1 ( FILAS es el tamaño del array ). Nota: por motivos de simplificación el programa está escrito al estilo de C estándar. Sin embargo puede ser compilado y ejecutado en un compilador de C++. #include
#include #define FILAS 7 int main() { float ventas[FILAS] = { 123.50, 234.60, 345.45, 321.40, 345.00, 456.65, 0.0 }; float total = 0; int i; puts("Ventas de la semana"); puts("-------------------"); for (i=0; i
456.65 0.00 -------1826.60
Iteraciones dentro de un array (matriz) Con el fin de leer o escribir sobre cada uno de los componentes de una matriz se deben crear dos ciclos de iteración. Así, para poner un ejemplo reconsideremos el caso de la tabla VentaSemanaQ (vista en una sección anterior), y que dicho sea de paso es un array de 4 x 4 elementos de tipo double . Luego, vamos a mostrar como ejemplo un programa completo en el cual se declara el array mencionado con valores inicializados, que serán mostrados en pantalla y al final la suma de estos. Observe que en este caso se utilizan dos variables, una para iterar sobre las filas y otra para iterar sobre las columnas d e la matriz. #include #include //hola #define FILAS 7 #define COLS 4 int main() { float VentaSemanaQ[FILAS][COLS] = { 123.50, 234.60, 345.45, 321.40, 345.00, 456.65, 123.50, 234.60, 345.45, 321.40, 345.00, 456.65, 123.50, 234.60, 345.45, 321.40, 345.00, 456.65, 123.50, 234.60, 345.45, 321.40, 345.00, 456.65, 0.0, 0.0, 0.0, 0.0 }; float totales[COLS] = { 0.0, 0.0, 0.0, 0.0 }; float grantotal = 0; int f, c, t = 0 ; /* indices para filas, columnas y totales */ puts("Ventas de cuatro semanas"); puts("------------------------"); for (f=0; f
for (t=0; t
Salida del programa: Ventas de cuatro semanas -----------------------123.50 234.60 345.45 321.40 345.00 456.65 123.50 234.60 345.45 321.40 345.00 456.65 123.50 234.60 345.45 321.40 345.00 456.65 123.50 234.60 345.45 321.40 345.00 456.65 0.00 0.00 0.00 0.00 -------------------------------------1627.90 2025.30 1627.90 2025.30 Gran total:
7306.40
Cadenas de caracteres En C, C++ las cadenas de caracteres no son más que arrays de caracteres, salvo que a este tipo de arrays el compilador les da un tratamiento especial. Usted puede manipular las cadenas de caracteres de la misma manera en que manipula cualquier otro tipo de array, sin embargo, es preferible hacer uso de una librería estándar especialmente escrita para manipulacion de cadenas de caracteres, me refiero a la librería y que viene incluida con todo compilador de C, C++. Para comenzar y antes de ver algunas de las funciones de la mencionada librería, tenemos los siguientes ejemplos: 1. char 2. char •
•
nombre[] = "Oscar"; nombre2[] = { 'O', 's', 'c', 'a', 'r', '\0' };
En el ejemplo 1 se está declarando la variable nombre como una cadena de caracteres y cuyo contenido inicial es "Oscar". En el ejemplo 2 se está declarando la variable nombre2 como una cadena de caracteres y cuyo contenido inicial es { 'O', 's', 'c', 'a', 'r', '\0' };.
En ambos casos el resultado es el mismo, es decir, al final se obtiene la misma cadena, pero usted debe poner atención al hecho de que toda cadena de caracteres en C, C++ debe terminar con el caracter NULL, que normalmente es igual a cero y se puede escribir como '\0'. Ahora bien, cuando usted usa la sintaxis mostrada en el ejemplo 1 no tiene que preocuparse por agregar el caracter NULL, ya que esto lo hace el compilador automáticamente.
La biblioteca string Los compiladores de C, C++ dan soporte a la biblioteca de funciones , a la que accede por medio de la directiva #include . No veremos en detalle todas las funciones contenidas en dicha biblioteca, y nos limitaremos a mostrar algunos ejemplos de ciertas funciones importantes.
strlen(): Obtener longitud de cadenas Sintaxis: size_t strlen(const char *s); Comentarios: La función strlen() devuelve la longitud de la cadena s. Ejemplo: char cout
*nombre = "Oscar E. Palacios"; << strlen(nombre) << endl;
strcpy(): Copiar cadenas Sintaxis: char *stpcpy(char *dest, const char *src); Comentarios: stpcpy copia la cadena src hacia dest, la función termina hasta haber encontrado en src el caracter de terminación null. Ejemplo: char *nombre = "Oscar E. Palacios"; char copia[80]; strcpy(copia, nombre); cout << copia << endl;
strcat(): Concatenar cadenas Sintaxis: char *strcat(char *dest, const char *src); Comentarios: strcat agrega la cadena src a dest, la función termina hasta haber encontrado en src el caracter de terminación null.
Ejemplo: char nombre[] = "Oscar E."; char copia[80] = " Palacios"; strcat(copia, nombre); cout << copia << endl;
strlwr(): Convertir a minúsculas. Sintaxis: char *strlwr(char *dest); Comentarios: strlwr convierte todos los caracteres alfabéticos ( 'A' .. 'Z' ) en dest a sus correspondientes caracteres alfabéticos ( 'a' .. 'z' ). Ejemplo: char nombre[] = "Oscar E. Palacios"; strlwr(nombre); cout << nombre << endl;
strupr(): Convertir a mayúsculas. Sintaxis: char *strupr(char *dest); Comentarios: strupr convierte todos los caracteres alfabéticos ( 'a' .. 'z' ) en dest a sus correspondientes caracteres alfabéticos ( 'A' .. 'Z' ).
strchr(): Buscar caracter ( hacia adelante ) Sintaxis: char *strchr(char *s, int c); Comentarios: strchr busca en s el caracter c. La busqueda se lleva a cabo desde el inicio hasta el final de s. Regreso: si la operación es exitosa strchr regresa un puntero hacia la primera ocurrencia de c en s, en caso contrario strchr regresa null. Ejemplo: char char
nombre[] *p;
= "Oscar E. Palacios";
p = strchr(nombre, 'E'); if (p) { cout << "nombre contiene a E" << endl; cout << "indice = " << (p - nombre) << endl; } else cout << "E no está en nombre" << endl;
strrchr(): Buscar caracter ( hacia atras ) Sintaxis: char *strrchr(char *s, int c); Comentarios: strchr busca en s el caracter c. La busqueda se lleva a cabo desde el final hasta el inicio de s. Regreso: si la operación es exitosa strchr regresa un puntero hacia la última ocurrencia de c en s, en caso contrario strchr regresa null. Ejemplo: char char
nombre[] *p;
= "Oscar E. Palacios";
p = strrchr(nombre, 'E'); if (p) { cout << "nombre contiene a E" << endl; cout << "indice = " << (p - nombre) << endl; } else cout << "E no está en nombre" << endl;
strstr(): Buscar subcadena Sintaxis: char *strstr(const char *s1, char *s2); Comentarios: strstr busca en s1 la subcadena s2. La búsqueda se lleva a cabo desde el inicio hasta el final de s1. Regreso: si la operación es exitosa strstr regresa un puntero hacia la primera ocurrencia de s2 en s1, en caso contrario strstr regresa null. Ejemplo: char char
s[] *p;
= "Un barco de tristeza";
p = strstr(s, "barco"); if (p) { cout << "barco está en s" << endl; cout << "indice = " << (p - s) << endl; } else cout << "barco no está en s" << endl;
Cadenas en C++ En la sección anterior descubrimos algunas funciones para trabajar con cadenas de caracteres al estilo de C estándar, si bien no está de más tener tal conocimiento, también es cierto que C++ es un lenguaje de programacíón orientado a objetos, de tal manera que ciertos compiladores ( como el gcc, utilzado por Bloodshed Dev-C++ y otros tantos entornos de desarrolo ) dan soporte a la clase cstring , que no debe confundirse con la . Nota: Bloodshed Dev-C++ es un IDE (Editor con Depurador Integrado) para programar en C++ en un ambiente gráfico para Windows, distibuido gratuitamente bajo licencia GPL GNU y usted puede encontrarlo aquí: www.bloodshed.net. Actualmente (febrero de 2008) se recomienda b ajar la versión Dev-C++ 4.9.9.2. Nota:Como el Dev-c++ ya esta descontinuado, es recomendable usar su estencion Wx Dev-C++ que esta actualmente activa y es recomendable para muchos proyectos bajo el lenguaje C++, este programa tambien es licensia GPL, podras descargarlo desde=wxdsgn.sourceforge.net, y encontraras informacion de este aqui=es.wikipedia.org/wiki/WxDev-C%2B%2B.
Una de las ventajas que ofrece la clase cstring es que, a diferencia de las cadenas estándar, ésta posee la capacidad de crecer o disminuir su tamaño en tiempo de ejecución. Además, entre otras caracteristicas destacables, la clase string soporta operaciones de asignación tales como: =, +, +=, etc.; y de comparación tales como: ==, <=, etc. Para tener una idea básica sobre las cadenas en C++ veamos el siguiente programa: Nota: en el programa se debe de observar el uso del operador de asignación +=, algo que no es posible hacer con las cadenas estándar. // Ejemplo: demostración de la clase string // Compilado y ejecutado con exito en Bloodshed Dev-C++ #include #include using namespace std; int main(int argc, char *argv[]) { string s("Hola, "); s += "cómo estan ustedes..."; cout << s << endl; system("PAUSE"); return EXIT_SUCCESS; }
Un estudio exhaustivo sobre la clase string requiere de un capítulo completo, ya que la misma, según el manual de referencia de C++, posee aproximadamente 33 métodos y unos 7 constructores; además de los atributos.
Arrays en C++ Así como C++ da aternativas elegantes para la manipulación de cadenas de caracteres, también da el soporte para la manipulacíon de arrays dinámicos . Este tema será ampliado en el capítulo Libreria de Plantillas Estándar STL, sin embargo para tener una idea de lo que vendrá mostraremos aquí un ejemplo sencillo en donde se usará la clase plantilla vector . // Ejemplo: demostración de la clase vector // Compilado y ejecutado con exito en Bloodshed Dev-C++ #include #include #include using namespace std; int main(int argc, char *argv[]) { // creación de un vector de enteros vector v; // metiendo datos en el vector for (int x = 500; x<1000; x+=50) v.push_back(x); // desplegando los datos del vector for (int x = 0; x < v.size(); x++) cout << "v[" << x << "] = " << v[x] << endl; system("PAUSE"); return EXIT_SUCCESS; }
La clase Matriz y la clase Vector Vectores y matrices Un vector es un array unidimensional de números. Se define la clase Vector con dos miembros dato, el número de datos que guarda y el array unidimensional que guarda dichos datos. public class Vector { public int n; double[] x;
La clase Vector y la clase Matriz están en el mismo paquete. El miembro dato x de la clase Vector tiene el control de acceso por defecto, es decir, público dentro del mismo paquete pero privados fuera del paquete. Más abajo, en esta página al definir las funciones miembro de la clase Matriz que realizan operaciones entre matrices y vectores veremos que, los objetos de la clase Vector necesitan acceder a su miembro dato x. Una matriz es un array bidimensional de números. En general, decimos que una matriz tiene una dimensión m x n, cuando los números están dispuestos en m filas y n columnas. Se denominan matrices cuadradas a aquellas que tienen el mismo número de filas que de columnas. Estas matrices tienen especial importancia y serán las que tratemos en estas páginas. public class Matriz{ public int n; private double[][] x;
La clase Matriz tiene dos miembros dato, la dimensión de la matriz n, y un array bidimensional x, que crearemos e inicializaremos en los constructores.
Los constructores Vamos a definir dos constructores en la clase Vector , al primero se le pasa el número de elementos que va a guardar e inicializan a cero todos sus elementos.
public Vector(int n) { this.n=n; x=new double[n]; for(int i=0; i
Para crear un vector v de dimensión tres se escribe Vector v=new Vector(3);
Al segundo constructor, se le pasa el array unidiemensional, e inicializa el miembro dato x con los valores que guardan los elementos de dicho array en una única y simple operación de asignación public Vector(double[] x) { this.x=x; n=x.length; }
Para crear un vector v que guarde los datos del array v1 se escribe double[] v1={1, 2, 3}; Vector v=new Vector(v1);
Para la clase Matriz necesitamos definir dos constructores, al primero se le pasa la dimensión n de la matriz cuadrada, creando un array bidimensional de n filas y n columnas, e inicializa todos sus elementos a cero. public Matriz(int n) { this.n=n; x=new double[n][n]; for(int i=0; i
Para crear una matriz a de dimensión tres cuyos elementos son todos ceros, se escribe. Matriz a=new Matriz(3);
Al segundo constructor, se le pasa un array bidimensional, e inicializa el miembro dato x con los valores que guardan los elementos de dicho array en una única y simple operación de asignación. public Matriz(double[][] x) { this.x=x; n=x.length;
}
Para crear la matriz a
se crea un array bidimensional a1, y se le pasa al constructor de la clase Matriz double[][] a1={{1, 2, 3},{-2, -4, -5},{3, 5, 6}}; Matriz a=new Matriz(a1); public class Vector { public int n; //dimensión double[] x; public Vector(int n) { this.n=n; x=new double[n]; for(int i=0; i
Mostrar un vector y una matriz Para mostrar un vector redefinimos la función toString de la clase base Object , de la cual deriva implícitamente Vector. Separamos sus elementos mediante el carácter tabulador '\t' . public String toString(){ String texto=" "; for(int i=0; i
Vamos añadiendo al string texto, los elementos del vector y el carácter separador entre elementos, limitamos el número de decimales a tres mediante la función Math.round . Para concluir la fila y pasar a la siguiente en la pantalla de texto, añadimos un carácter retorno de carro '\n'. Mediante la operación + definida en la clase String podemos concatenar fácilmente los distintos elementos y crear la representación textual del vector que devuelve la función toString Para mostrar el vector v en la pantalla de texto, basta escribir la sentencia Vector v=new Vector(v1); System.out.println(v);
Mostrar una matriz en la pantalla de texto es difícil, ya que Java no dispone de una función que sitúe el cursor de texto en una posición de la pantalla, como lo hace la función gotoxy disponible en los lenguajes C/C++. La única alternativa que nos queda es mostrar los elementos de una fila unos a continuación de los otros separados por un tabulador, después otra fila y así hasta mostrar todos los elementos de la matriz. Para mostrar los elementos de la matriz, redefinimos la función toString de la clase base Object , de la cual deriva implícitamente Matriz. Separamos los elementos de una fila mediante el carácter tabulador '\t' , y limitamos el número de decimales a tres mediante la función Math.round . Cuando se acaba una fila se inserta un retorno de carro '\n' y se continua con la siguiente fila, y así sucesivamente. for(int j=0; j
Vamos añadiendo al string texto, los elementos de la matriz y los caracteres separadores entre elementos y entre filas de elementos. public String toString(){ String texto="\n"; for(int i=0; i
for(int j=0; j
Para mostrar una matriz a en la pantalla de texto basta escribir la sentencia Matriz a=new Matriz(a1); System.out.println(a);
public class Vector { public int n; //dimensión double[] x; //... public String toString(){ String texto=" "; for(int i=0; i
Copia de una matriz dada Cuando calculamos la matriz inversa de una dada, pasamos una matriz en el único parámetro de la función estática denominada inversa. En el cuerpo de dicha función se
realizan operaciones con los elementos de dicha matriz. Dado que en Java se pasan por valor las referencias a objetos, la matriz original resulta modificada en el curso de la llamada a la función inversa. Si queremos mantener la matriz original, hacemos una copia de dicha matriz en el cuerpo de la función y realizamos las operaciones con la matriz copia dejando la original sin modificar. Para realizar una copia hemos de implementar el interface Cloneable, y redefinir la función miembro clone de la clase base Object , de la cual derivan todas las clases en Java. El primer paso es la llamada a la función clone de la clase base Object . public class Matriz implements Cloneable{ public int n; //dimensión private double[][] x; //.......... public Object clone(){ Matriz obj=null; try{ //llama a clone de la clase base Object obj=(Matriz)super.clone(); }catch(CloneNotSupportedException ex){ System.out.println(" no se puede duplicar"); } //copia la matriz bidimensional obj.x=(double[][])obj.x.clone(); for(int i=0; i
Para obtener una copia a de una matriz d se escribe. Matriz a=(Matriz)d.clone();
La promoción (casting) es necesaria ya que clone devuelve una referencia a un objeto de la clase base Object .
Traza de una matriz Se denomina traza de una matriz cuadrada a la suma de los elementos de su diagonal principal. public double traza(){ double tr=0.0; for(int i=0; i
tr+=x[i][i]; } return tr; }
Para obtener la traza de la matriz a de la sección anterior se escribe double traza=a.traza();
Operaciones con matrices y vectores Suma de dos matrices cuadradas Cuando se suman dos matrices de las mismas dimensiones
Se obtiene otra matriz c en la que sus elementos cij son las suma de los correspondientes elementos de las matrices a y b, es decir cij=aij+bij Para sumar dos matrices, se define una función miembro estática denominada suma. Dentro de la función, se crea una matriz temporal resultado, con la misma dimensión de las matrices que intervienen en la operación, y se guardan en sus elementos el resultado de la suma de las matrices a y b. Finalmente, la función suma devuelve la matriz resultado. public static Matriz suma(Matriz a, Matriz b){ Matriz resultado=new Matriz(a.n); for(int i=0; i
Veamos ahora como se llama a la función que suma dos matrices. double[][] a1={{1, 2, 3},{4,5,6},{7,8,9}}; Matriz a=new Matriz(a1); double[][] b1={{1, 0, -1},{2,1,3},{-1, 0, 2}}; Matriz b=new Matriz(b1); Matriz re=Matriz.suma(a, b);
System.out.println("matriz "+re);
Producto de dos matrices La regla para multiplicar dos matrices es bastante más complicada que para sumar dos matrices de las mismas dimensiones. En general, se puede n multiplicar dos matrices de dimensiones m x n y n x q, dando como resultado una matriz de dimensiones m x q. En este apartado nos circunscribiremos exclusivamente a matrices cuadradas de dimensión n.
Los elementos cij se obtienen multiplicando los elementos aik de la fila i por los elementos akj de la columna j, y sumando los resultados.
La codificación se realiza empleando un tripe bucle for, guardando en los elementos de la la matriz local resultado la suma de los productos de la fórmula anterior. public static Matriz producto(Matriz a, Matriz b){ Matriz resultado=new Matriz(a.n); for(int i=0; i
Otras variantes de la operación producto son: El producto de un escalar (número real) por una matriz que da como resultado otra matriz cuyos elementos están todos multiplicados por dicho escalar. Se define también la operación conmutativa public static Matriz producto(double d, Matriz a){ Matriz resultado=new Matriz(a.n); for(int i=0; i
Al multiplicar una matriz cuadrada de dimensión n, por un vector columna de la misma dimensión obtenemos otro vector columna. Cada elemento del vector resultante se obtiene multiplicando los elementos de una fila de la matriz por los correspondientes elementos del vector columna y se suman los resultados. La codificación de esta función producto es la siguiente: public static Vector producto(Matriz a, Vector v){ int n=v.n; Vector b=new Vector(n); for(int i=0; i
Al multiplicar un vector fila por una matriz c uadrada de la misma dimensión obtenemos otro vector fila. El código es semejante al de la función producto definida previamente. public static Vector producto(Vector v, Matriz a){ int n=v.n; Vector b=new Vector(n); for(int j=0; j
Matriz traspuesta Una matriz traspuesta de otra matriz es aquella que tiene los mismos elementos pero dispuestos en forma distinta. Las columnas de la matriz original se transforman en filas de la matriz traspuesta. La definición de la función estática traspuesta no reviste dificultad alguna public static Matriz traspuesta(Matriz a){ int n=a.n; Matriz resultado=new Matriz(a.n); for(int i=0; i
Para hallar la matriz traspuesta de la matriz a se escribe double[][] a1={{1, 2, 3},{4,5,6},{7,8,9}}; Matriz a=new Matriz(a1); Matriz tras=Matriz.traspuesta(a); System.out.println("matriz traspuesta"+tras);