UNIVERSIDAD TECNOLÓGICA DE LOS ANDES INGENIERÍA DE SISTEMAS E INFORMÁTICA FUNDAMENTOS DE PROGRAMACIÓN DOCENTE: Ing. Ronald Rentería Ayquipa. ARREGLOS (ARRAYS)- MATRICES. MARCO TEÓRICO: ARREGLOS BIDIMENSIONALES O MATRICES Son aquellos que tienen dos dimensiones, se les conoce también como bidimensionales, matrices o tablas. Una matriz es, como el vector, una colección de elementos del mismo tipo. Sin embargo, mientras el vector es unidimensional —una sóla fila o columna— en la matriz los datos se organizan en dos o más dimensiones. 0 1 Arreglo bidimensional de 8 filas y 10 columnas 2 Dimensión 8x10 3 4 Cantidad de elementos 8x10=80 elementos 5 6 7 0 1 2 3 4 5 6 7 8 9 Declaracion de matrices: Sintaxis: <tipo> nombre_arreglo[filas][columnas]; Donde: tipo= es el tipo de datos del arreglo nombre_arreglo= el nombre que le vas a asignar al arreglo filas= la cantidad de filas de la matriz. columnas= la cantidad de columnas de la matriz. Cabe destacar que las filas y columnas deben ser cualquier expresión entera constante mayor que cero. Ejemplos de declaración de matrices: int unamba[7][9]; //declara una matriz de 7 filas y 9 columnas, 63 elementos enteros de nombre unamba float MiMatriz[50][2]; // declara una matriz de nombre MiMatriz de 100 elementos tipo float, distribuidos en 50 filas y 2 columnas. Universidad Tecnológica de los Andes Fundamentos de Programación 1/5 Ingeniería de Sistemas e Informática Ing. Ronald Rentería A. Manejo de matrices: Cuando declaramos un arreglo, por ejemplo: int mimatriz[5][3]; obtenemos 15 elementos enteros distribuidos en 5 filas y 3 columnas, bajo el mismo nombre (mimatriz), pero ahora ¿Cómo accedemos a cada uno de estos elementos individuales del arreglo? Manipulación de elementos individuales En las matrices necesitamos dos índices. Usamos el nombre del arreglo seguido de los índices que identifican la fila y la columna del elemento que se desea acceder: nombre_arreglo[fila][columna]. En este ejemplo se muestra como asignar valores a los elementos de una matriz de forma individual: int arreglito[2][2]; arreglito[0][0]=4; arreglito[0][1]=6; arreglito[1][0]=0; arreglito[1][1]=15; // declara un arreglo de 4 enteros llamado arreglito (2x2) // asigna 4 al primer elemento (posición 0,0) // asigna 6 al segundo elemento (posición 0,1) // asigna 0 al tercer elemento (posición 1,0) // asigna 15 al cuarto elemento (posición 1,1) El arreglo finalmente quedará lleno de la siguiente manera: arreglito 6 0 0 15 1 0 1 4 Para imprimir los elementos del arreglo anterior también se acceden a los elementos de la forma anterior: cout<<arreglito[0][0]; cout<<arreglito[0][1]; cout<<arreglito[1][0]; cout<<arreglito[1][1]; // imprime el elemento (posición 0,0) // imprime el elemento (posición 0,1) // imprime el elemento (posición 1,0) // imprime el elemento (posición 1,1) Cada elemento de la matriz es, a todos los efectos, una variable que puede usarse independientemente de los demás elementos. Así, por ejemplo, un elemento de la matriz arreglito puede usarse en una instrucción de entrada, salida o de otro tipo igual que cualquier variable simple de tipo int: cout<<”Ingrese un valor”; cin>>arreglito[0][0]; // almacena el valor ingresado en 0,0 cout<<arreglito[0][0]; // imprime el valor del elemento 0,0 arreglito[0][0]= arreglito[0][0]*2; // duplica el valor del elemento 0,0 cout<<arreglito[0][0]; // vuelve a imprimir el valor del elemento 0,0 ahora duplicado Cuando se quiere llenar, imprimir o recorrer una matriz por ejemplo de 20x20 (400 elementos) hacerlo de la forma anteriormente vista es un proceso muy tedioso, lo mejor es usar ciclos para llenarlo rápido. Universidad Tecnológica de los Andes Fundamentos de Programación 2/5 Ingeniería de Sistemas e Informática Ing. Ronald Rentería A. Recorrido de una matriz Una forma habitual de manipular una matriz es accediendo secuencialmente a todos sus elementos, uno tras otro, fila por fila. Para ello, se utilizan dos bucles: el primer bucle con contador, de modo que la variable contador nos sirve como índice para identificar la fila y el segundo bucle anidado con contador, de modo que la variable contador nos sirve como índice para identificar la columna. Así mediante los dos contadores podemos acceder a cada uno de los elementos de la matriz . La estructura más utilizada para recorrer arreglos es for. Supongamos, por ejemplo, que tenemos una matriz de 15 números enteros declarado como int v[5][3]; y dos variables enteras declaradas como int i,j;. Por medio de dos bucles uno anidado en el otro, con ligeras modificaciones, podemos realizar todas estas operaciones: a. Inicializar todos los elementos a un valor cualquiera (por ejemplo, 0): for(i=0 ; i<5 ; i++) { for(j=0 ; j<3 ; j++) { v[i][j]=0; } } // notar el menor estricto (<) para ir de 0 hasta 4 // notar el menor estricto (<) para ir de 0 hasta 2 // asigna el valor ‘0’ a la matriz v en la posición i,j b. Inicializar todos los elementos con valores introducidos por teclado: for(i=0 ; i<5 ; i++) // notar el menor estricto (<) para ir de 0 hasta 4 { for(j=0 ; j<3 ; j++) // notar el menor estricto (<) para ir de 0 hasta 2 { cout<<”Ingrese valor para la posicion [”<<i<<”][“<<j<<”]”; cin>>v[i][j]; // asigna el valor ingresado a la matriz v en la posición i,j } } c. Mostrar todos los elementos en la pantalla: for(i=0 ; i<5 ; i++) // notar el menor estricto (<) para ir de 0 hasta 4 { for(j=0 ; j<3 ; j++) // notar el menor estricto (<) para ir de 0 hasta 2 { cout<<”El valor de la posicion [”<<i<<”][“<<j<<”]=”<<v[i][j]; } cout<<endl; // da un salto de linea entre cada fila } Universidad Tecnológica de los Andes Fundamentos de Programación 3/5 Ingeniería de Sistemas e Informática Ing. Ronald Rentería A. d. Realizar alguna operación que implique a todos los elementos. Por ejemplo, sumarlos: suma=0; for(i=0 ; i<5 ; i++) // notar el menor estricto (<) para ir de 0 hasta 4 { for(j=0 ; j<3 ; j++) // notar el menor estricto (<) para ir de 0 hasta 2 { suma=suma+v[i][j]; } } EJERCICIOS RESUELTOS Ejemplo Nº 01: Hacer un programa para sumar dos matrices. #include<iostream.h> #include<conio.h> void main() { int A[100][100],B[100][100],C[100][100],a,b,c,d,i,j; cout<<"Ingrese dimensiones de la matriz A"<<endl; cout<<"filas : "; cin>>a; cout<<"columnas : "; cin>>b; cout<<"Ingrese dimensiones de la matriz B"<<endl; cout<<"filas : "; cin>>c; cout<<"columnas : "; cin>>d; // COMPROBAR SI LAS DIMENSIONES DE LAS MATRICES SON IGUALES if(a==c && b==d) { cout<<"INGRESAR LOS DATOS A LA MATRIZ A"<<endl; for(i=0;i<a;i++) for(j=0;j<b;j++) { cout<<"Posicion ["<<i<<"]["<<j<<"]"; cin>>A[i][j]; // Lee el numero ingresado y lo almacena en la posición i,j de la matriz } cout<<"INGRESAR LOS DATOS A LA MATRIZ B"<<endl; for(i=0;i<c;i++) for(j=0;j<d;j++) { cout<<"Posicion ["<<i<<"]["<<j<<"]"; cin>>B[i][j]; // Lee el numero ingresado y lo almacena en la posición i,j de la matriz } Universidad Tecnológica de los Andes Fundamentos de Programación 4/5 Ingeniería de Sistemas e Informática Ing. Ronald Rentería A. // REALIZAR LA SUMA DE LAS MATRICES for(i=0;i<a;i++) for(j=0;j<b;j++) C[i][j]=A[i][j]+B[i][j]; // IMPRIMIR LA SUMA DE LAS MATRICES cout<<"La SUMA es: "<<endl; for(i=0;i<a;i++) { for(j=0;j<b;j++) { cout<<C[i][j]<<"\t"; } cout<<endl; } } else cout<<"No se pueden sumar las matrices"; getch(); } Ejemplo Nº 02: Hacer un programa que imprima la diagonal de una matriz cuadrada. #include<iostream.h> #include<conio.h> void main() { int matriz[100][100],i,j,n; //Se declara una matriz de enteros con nombre matriz cout<<"Ingrese dimension de la matriz"; cin>>n; //solo se ingresa una dimension porque la matriz es cuadrada cout<<"INGRESAR LOS DATOS A LA MATRIZ"<<endl; for(i=0;i<n;i++) for(j=0;j<n;j++) { cout<<"Posicion ["<<i<<"]["<<j<<"]"; cin>>matriz[i][j]; // Lee el numero ingresado y lo almacena en la posición i,j de la matriz } // IMPRIMIR LA DIAGONAL DE LA MATRIZ INGRESADA cout<<"La diagonal es: "<<endl; for(i=0;i<n;i++) for(j=0;j<n;j++) if(i==j) cout<<matriz[i][j]<<endl; getch(); } Ejemplo Nº 03: Encontrar otra forma de resolver el ejercicio 2. Universidad Tecnológica de los Andes Fundamentos de Programación 5/5