Вы находитесь на странице: 1из 40

Sesin 5

Arreglos

Ms. Ing. CARLOS AURELIO ROMERO SHOLLANDE caromerosh@yahoo.es


UNIVERSIDAD NACIONAL DE TRUJILLO Trujillo - Per

Introduccin
Un arreglo es una estructura homognea compuesta por varios datos del mismo tipo que comparten un nombre comn, a los que se puede acceder por la posicin que ocupa cada uno de ellos, dentro del arreglo. Cada elemento puede ser accedido directamente por el nombre de la variable arreglo acompaado por uno o ms subndices encerrados entre corchetes Un arreglo puede tener una o varias dimensiones.

Arreglos Unidimensionales
Sintaxis : tipo nombre_arreglo[tamao]; Propsito : Declarar el tipo base de cada uno de los elementos de un arreglo que tiene una sola dimensin y asignar el tamao mximo de elementos, el mismo que es colocado entre corchetes. Tambin se le conoce como vector o lista. Ejemplo : int x[10];
En el ejemplo, int declara que el tipo base de cada uno de los elementos del vector x es entero y [10] define que dicho vector guardar 10 elementos.

Arreglos Unidimensionales
Nombre del arreglo (se observa que todos los elementos de este arreglo tienen el mismo nombre x) Nmero de posicin del elemento en el arreglo x. x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] 37 -13 249 -85 1739 0 728 -8329

En C++, todos los arreglos usan cero como ndice del primer elemento; por lo tanto, la declaracin indica que los elementos del vector varan de x[0] hasta x[9]. Todos los elementos del arreglo son del mismo tipo (enteros)

x[8] x[9]

5 -16

Arreglos Unidimensionales
Observar el siguiente fragmento de programa: main() { int j, x[30]; for(j=0;j<80;j++) x[j]=1; } Este bucle iterar 80 veces incluso aunque x tenga 30 elementos. Esto hace superar los lmites establecidos, ocasionando un desbordamiento en el programa. No intentar este ejemplo, puede daar el sistema. Si dos arreglos usan el mismo subndice para referirse a trminos homlogos se llaman arreglos paralelos. Estos arreglos se pueden procesar simultneamente. Ejemplo, cuando un primer vector define los nombres de cada alumno y un segundo vector sus respectivas notas.

Ejemplo
Ingresar el tamao de un vector, as como cada uno de sus elementos. Determinar y reportar el mayor elemento del vector.

1. Anlisis:
Primero se ingresan los datos del arreglo. Enseguida, se asigna el primer elemento del vector al mayor valor actual. Luego, se compara cada uno de los elementos del vector (a partir de segundo elemento) con el mayor valor actual. Si alguno de estos elementos es mayor que el mayor valor actual; entonces el valor del elemento ser asignado al mayor valor actual.

Ejemplo
2. Diagrama de flujo:
Inicio n i=1; n; 1 x[i]

mayor=x[1]
mayor i=2; n; 1 F x[i] >mayor V Fin

mayor= x[i]

i
i

Ejemplo
3. Codificacin:
#include <iostream.h> // MAYOR ELEMENTO DE VECTOR #include <conio.h> main() { int n; // Tamao del vector int i; // Subndice del vector int mayor; // Mayor valor del vector int x[30]; // Elementos del vector clrscr(); gotoxy(15,2); cout<<Tamao del vector; gotoxy(41,2); cin>>n;

Ejemplo
gotoxy(15,4); cout<<ELEMENTOS DEL VECTOR; for(i=1;i<=n;i++) { gotoxy(15,5+1); cout<<Elemento N <<i<< : ; gotoxy(41,5+i); cin>>x[i]; } mayor = x[1]; for(i=2;i<=n;i++) if(x[i]>mayor) mayor = x[i]; gotoxy(15,12); cout<<Mayor valor del vector: <<mayor; getch(): }

Arreglos Bidimensionales
Sintaxis : tipo nombre_arreglo[tamaoF][tamaoC]; Propsito : Declarar el tipo base de cada uno de los elementos de un arreglo que tiene dos dimensiones (filas y columnas) y asignar el tamao mximo de las filas y las columnas, cada uno de los cuales est colocado entre corchetes. Tambin se llama matriz o tabla. Ejemplo : int A[3][4]; Este ejemplo declara al arreglo bidimensional A, cuyos elementos son de tipo entero de tamao 3 x 4 (3 filas y 4 columnas). Cada tamao debe ir entre sus propios corchetes.

Arreglos Bidimensionales
Fila 0 Columna 0 A[0][0] Columna 1 A[0][1] Columna 2 A[0][2] Columna 3 A[0][3]

Fila 1 Fila 2

A[1][0] A[2][0]

A[1][1] A[2][1]

A[1][2] A[2][2]

A[1][3] A[2][3]

Subndice de columna Subndice de fila Nombre de arreglo

Los arreglos bidimensionales definen la ubicacin de cada uno de sus elementos por medio de dos subndices, donde el primer ndice indica la fila y el segundo la columna. Cuando se accede a un arreglo el ndice ms a la derecha cambia ms rpido que el que esta ms a la izquierda.

Arreglos Bidimensionales
Existen diversos tipos de arreglos bidimensionales o matrices, los que se pueden definir de la siguiente manera:
MATRIZ CERO La matriz cero tiene asignado el valor cero en todos sus elementos. Por ejemplo: 0 0 0 C[i][ j ] 0 0 0 MATRIZ UNIDAD La matriz unidad tiene asignado el valor uno en todos sus elementos. Por ejemplo: 1 1 1 U [i][ j ] 1 1 1

Arreglos Bidimensionales
MATRIZ CUADRADA Es la matriz en la cual el nmero de filas es igual al nmero de columnas. Este tipo de matriz presenta dos diagonales:
La diagonal principal (inclinada hacia la izquierda) La diagonal secundaria (inclinada hacia la derecha)

Diagonal secundaria

Diagonal principal

Arreglos Bidimensionales
MATRIZ IDENTIDAD Es una matriz cuadrada con el valor 1 0 0 uno en cada elemento de su diagonal A[i ][ j ] 0 1 0 principal, y cero en todos los dems 0 0 1 elementos. Por ejemplo:

MATRIZ DIAGONAL Es una matriz cuadrada en la cual los 5 0 0 elementos que se encuentran sobre la A[i ][ j ] 0 9 0 diagonal principal pueden tener 0 0 4 cualquier valor y el resto de valores son ceros. Por ejemplo:

Arreglos Bidimensionales
MATRIZ TRIANGULAR Es una matriz cuadrada cuyos valores diferentes de cero caen todos sobre la diagonal principal y a un lado de dicha diagonal.

Si todos los elementos caen sobre y 8 3 4 a la derecha de la diagonal A[i ][ j ] 0 6 5 principal se llama matriz 0 0 7 triangular superior. Si todos los elementos caen por debajo y a la izquierda de la diagonal principal se llama matriz triangular inferior.
11 0 0 A[i ][ j ] 3 5 0 4 9 8

Arreglos Bidimensionales
MATRIZ ESTRICTAMENTE TRIANGULAR Es una matriz cuadrada que contiene elementos diferentes de cero solamente a un lado de la diagonal principal y ceros sobre dicha diagonal.

Si dichos elementos caen sobre y a 0 5 4 la derecha de la diagonal principal A[i][ j ] 0 0 13 se llama matriz estrictamente 0 0 0 triangular superior. Si dichos elementos caen por debajo y a la izquierda de la diagonal principal se llama matriz estrictamente triangular inferior.
0 0 0 A[i ][ j ] 7 0 0 2 10 0

Arreglos Bidimensionales
MATRIZ TRANSPUESTA La matriz transpuesta viene a ser igual a la matriz original pero en donde las filas se transponen en columnas y las columnas en filas. Por tanto, si A es una matriz de orden m x n, entonces su transpuesta B ser una matriz de orden n x m, cuyos elementos se determinan como: B[i][j] = A[j][i] Ejemplo: 7 6 7 3 1 B[i ][ j ] 3 0 A[i][ j ] 6 0 9
9 1

Ejemplo
Ingresar el orden de una matriz y cada uno de sus elementos. Si la matriz es cuadrada calcular la suma de los elementos ubicados en la diagonal principal. En caso contrario, reportar el mensaje: La matriz no es cuadrada 1. Anlisis: La matriz es cuadrada cuando el nmero de filas es igual al nmero de columnas (m==n). La caracterstica de los elementos ubicados en la diagonal principal es que la posicin de la fila es igual a la posicin de la columna (i==j). En este caso, solo se sumaran los elementos ubicados en la diagonal principal. El resto no.

Ejemplo
2. Diagrama de flujo:
Inicio m, n i=1; m; 1 j=1; n; 1 S=0 i=1; n; 1 j=1; n; 1 i=j V S = S + x[i][j] F

V
m=n F La matriz no es cuadrada

x[i][j]
S i Fin

i
j

Ejemplo
3. Codificacin:
#include <iostream.h> //Suma de Diagonal Principal #include <conio.h> main() { int f, c; // Tamao de la matriz int i, j; // Subndices de filas y columnas de matriz int x[20][20]; // Elementos de la matriz int s; // Suma de elementos de diagonal principal clrscr(); cout<<Nmero filas:; cin>>f; cout<<Nmero columnas: ; cin>>c;

Ejemplo
for(i=1; i<f; i++) { for(j=1; j<=c; j++) { cout<<Elemento Fila<<i<<Columna<<j<<:; cin>>x[i][j]; } } if(f==c) {s=0; for(i=1; i<=f; i++) for(j=1; j<=f; j++) if(i==j) s = s + x[i][j]; cout<<\nSuma de la diagonal principal: <<s; } else cout<<\nLa matriz no es cuadrada\n\n; getch(); }

Arreglos Multidimensionales
Sintaxis : tipo nombre_arreglo[tam1][tam2]...[tamN]; Propsito : Declarar el tipo base de cada elemento de un arreglo que tiene N dimensiones y asignar el tamao mximo a cada dimensin. Tambin se le conoce como poliedro. Ejemplo : int x[5][10][4]; Esta sentencia crea un arreglo entero de 5x10x4 elementos. Los enteros requieren de 2 bytes; entonces la cantidad de memoria a utilizar ser: 5 x 10 x 4 x 2 = 400 bytes Si el arreglo fuera de tipo double (8 bytes de largo), entonces requerir 1600 bytes. Un programa con arreglos de ms de 3 dimensiones puede encontrarse fuera de la memoria rpidamente.

Inicializacin de Arreglos
Sintaxis : tipo nom_arreg[tm1][tm2]...[tmN]={list_val}; Propsito : Inicializar arreglos en forma global. Ejemplo : int b[6]={1,2,3,4,5,6}; list_val es una lista de constantes separadas con comas, stas son de tipo compatible con el tipo base del arreglo. Esta sentencia pondr la primera constante en la primera posicin del arreglo, la segunda en la segunda posicin, y as sucesivamente. Despus del final del bloque } debe ir punto y coma. El ejemplo anterior inicializa un arreglo de seis elementos enteros con los nmeros del 1 al 6 e indica que b[0] tendr el valor 1 y b[5] el 6.

Inicializacin de Arreglos
Se puede dejar al C++ que dimensione automticamente los arreglos, usando arreglos sin tamao, esto se logra no especificando el tamao de los mismos. Entonces C++ crear automticamente un arreglo lo suficientemente grande para guardar todos los inicializadores presentados. Ejemplo: int g[ ] = { 23,31,37,42,48,57,63 }; En el caso de arreglos unidimensionales el C++ no restringe las inicializaciones de arreglos sin tamao.

Inicializacin de Arreglos
Para arreglos multidimensionales, se deben especificar todas las dimensiones excepto la de ms a la izquierda para permitir indexar el arreglo apropiadamente. En este sentido se pueden construir tablas de longitud variable mientras el compilador asigna automticamente el almacenamiento suficiente. Por ejemplo: int x[ ][2]?{ 1,1, 2,4, 3,9, 4,16 }; La ventaja de esta declaracin relacionada con el tamao, es que se puede alargar o acortar la tabla sin cambiar las dimensiones del arreglo.

Uso de Macros
Sintaxis : #define nombre_macro valor_macro Propsito : Sustituir el nombre de la macro por el correspondiente valor de la macro. Ejemplo : #include <iostream.h> #define MAXIMO 18 int x[MAXIMO]; main() { int i; for(i=1;i<=MAXIMO;i++) cin >>x[i]); for(i=1;i<=MAXIMO;i++) cout <<x[i]; } Aqu la macro MAXIMO se usa para dar una dimensin 18 al arreglo de enteros x. Observar que no hay punto y coma detrs de la segunda sentencia.

Uso de Macros
La sustitucin es realizada por el C++ antes de iniciarse la traduccin de las sentencias del programa fuente. El resto del programa fuente puede utilizar una o varias veces el nombre de la macro en lugar de su valor. Se puede incluir cualquier nmero de espacios entre el nombre de la macro y su valor, pero, una vez que comienza el valor, slo puede terminarla una nueva lnea. La macro controla la condicin del bucle for que inicializa el arreglo. Si se tiene un arreglo que posee diversas subrutinas, para acceder al arreglo, en vez de la codificacin estricta del arreglo con una constante, es mejor definir un tamao y usar la macro siempre que se necesite dicho tamao.

Uso de Macros
El valor de una macro puede ser tambin una cadena de caracteres limitada por un par de comillas, por ejemplo:
#define ERROR Error de sintaxis . cout<<ERROR; Este cdigo provoca que el compilador sustituya la cadena Error de sintaxis cuando encuentre la macro ERROR.

Uso de Macros
Las macros tambin se utilizan para dar otros nombres a identificadores y smbolos. Ejemplo:
#define entero int #define inicio { #define fin } #define programa main #define imprimir cout programa() inicio entero n=5; imprimir<<n; fin

Suma de Arreglos
La suma vectorial es factible realizarla slo cuando los tamaos de los vectores sean iguales. Consiste en sumar los elementos ubicados en la misma posicin en ambos vectores y el resultado se ubica en la misma posicin del vector suma: z[4] = x[4] + y[4] La suma matricial es factible cuando el nmero de filas de ambas matrices sean iguales y el nmero de columnas tambin sean iguales. Consiste en sumar los elementos ubicados en la misma posicin en ambas matrices (X e Y) y el resultado se ubica en la misma posicin en la matriz suma (Z): Z[3][2] = X[3][2] + Y[3][2]

Resta de Arreglos
Tanto la diferencia vectorial como la diferencia matricial es similar a la suma vectorial o suma matricial respectivamente, excepto que el signo de suma se reemplaza por un signo menos. Esta operacin tambin ser factible cuando ambos arreglos tienen el mismo orden. Ejemplo para la diferencia vectorial: z[3] = x[3] - y[3] Ejemplo para la diferencia matricial: Z[2][4] = X[2][4] - Y[2][4]

Multiplicacin Escalar con Arreglos


En la multiplicacin escalar todos los elementos de una matriz se multiplican por una constante dada. Por ejemplo, una matriz de orden 2 x 3 multiplicada por la constante 12: Y[1][1] = 12 * X[1][1] Y[1][2] = 12 * X[1][2] . Y[2][3] = 12 * X[2][3]

Multiplicacin Vectorial con Arreglos


Para que sea factible la multiplicacin vectorial, el primer vector debe ser un vector fila y el segundo un vector columna, ambos del mismo orden. El resultado es un solo elemento obtenido mediante una suma acumulativa de los productos de los elementos ubicados en el primer vector por los correspondientes elementos ubicados en el segundo vector. Por ejemplo, el producto de los vectores x e y, ambos de orden 5: P = x[1]*y[1] + x[2]*y[2] + . + x[5]*y[5]

Multiplicacin Matricial con Arreglos


Para que sea factible el clculo de la matriz producto, se requiere que el nmero de columnas de la primera matriz sea igual al nmero de filas de la segunda matriz. La matriz producto resultante tendr un nmero de filas igual al de la primera matriz y un nmero de columnas igual al de la segunda matriz. Cada uno de los elementos de la matriz producto es una suma acumulativa de los productos de los elementos ubicados en la fila de la primera matriz por los correspondientes elementos ubicados en la columna de la segunda matriz. Ejemplo: z[2][3] = x[2][1] * y[1][3] + x[2][2] * y[2][3] + ... + x[2][k] * y[k][3] + ... + x[2][N] * y[N][3]

Ejemplo
Ingresar el orden de dos matrices, las mismas que poseen nmeros extrados al azar y comprendidos entre 0 y 20. Si es factible, calcular y reportar la matriz producto. En caso contrario, reportar el mensaje: No es factible el producto de matrices. 1. Anlisis:

Para que sea factible el clculo de la matriz producto, se requiere que el nmero de columnas de la primera matriz sea igual al nmero de filas de la segunda matriz.

Ejemplo
2. Diagrama de flujo:
Inicio
j=1; s; 1

q, r, s, t k=1; t; 1 h=1; q; 1
y[j][k] = rand()%21

i=1; r; 1
k

x[h][i] = rand()%21
j i

Ejemplo
r=s F No es factible el producto de matrices

V
h=1; q; 1 k=1; t; 1 z[h][k] = 0 i=1; r; 1 h=1; q; 1 k=1; t; 1 z[h][k] k j

z[h][k] = z[h][k] + x[h][i]* y[i][k] i k h

Fin

Ejemplo
3. Codificacin:
#include <iostream.h> // MATRIZ PRODUCTO #include <conio.h> #include <stdlib.h main() { int q, r; // Tamao de la primera matriz int s, t; // Tamao de la segunda matriz int h, i; // Subndices de filas y columnas de primera matriz int j, k; // Subndices de filas y columnas de segunda matriz int x[20][20]; // Elementos de la primera matriz int y[20][20]; // Elementos de la segunda matriz int z[20][20]; // Elementos de la matriz producto clrscr(); cout<<Nmero filas primera matriz: ; cin>>q; cout<<Nmero columnas primera matriz: ; cin>>r;

Ejemplo
cout<<Nmero filas segunda matriz: ; cin>>s; cout<<Nmero columnas segunda matriz: ; cin>>t; randomize(); for(h=1;h<=q;h++) for(i=1;i<=r;i++) x[h][i] = rand()%21; for(j=1;j<=s;j++) for(k=1;k<=t;k++) y[j][k] = rand()%21; if(r==s) { clrscr(); for(h=1;h<=q;h++) { for (k=1;k<=t;k++) { z[h][k]=0; // Valor inicial de suma acumulativa for(i=1;i<=r,i++) z[h][k] = z[h][k] + x[h][i]* y[i][k]; } } cout<< PRIMERA MATRIZ\n\n; for(h=1;h<=q;h++) { for(i=1;i<=r;i++) cout<<x[h][i]; cout<<\n; }

Ejemplo
cout<< SEGUNDA MATRIZ\n\n; for(j=1;j<=s;j++) { for(k=1;k<=t;k++) cout<<y[j][k]; cout<<\n; } cout<< MATRIZ PRODUCTO\n\n; for(h=1;h<=q;h++) { for(k=1;k<=t;k++) cout<<z[h][k]; cout<<\n; } } else { clrscr(); cout<<El producto de matrices no es factible\n\n; } getch(); }