You are on page 1of 68

Definir estructura de datos.

Identificar los arreglos dentro de la clasificacin de los tipos de datos mas frecuentes en los diversos lenguajes de programacin.

Definir un arreglo
Identificar las caractersticas basicas de un arreglo. Enunciar y diferenciar los diferentes tipos de arreglos

Hasta ahora slo habiamos visto estructuras de datos simples (como variables y constantes enteras, reales y caracter )., pero estas no son suficientes para resolver problemas mas complejos. Por ejemplo como responderiamos a estas interrogantes.

Cmo almacenar y accesar a las respuestas a 10 preguntas de 5 opciones mltiples 'A','B','C','D' y 'E' ? Usaramos las variables. rpta1, rpta2, ....... rpta10 ?

indices 0

Nombres
Julio Perez Edgar Condori Erica Castro Luis Risco

Notas 12 4 11 9 16 12 5
Nombre Sueldo 2400.6 3500.5 2800.8

Cmo almacenar y localizar las notas y los nombres de 25 alumnos de esta clase ? Usaramos las variables. Nombre1, Nombre2, ....... Nombre25 y
Nota1, Nota2, ... Nota25?

1 2 3

.....
22 23 24 Miura Fernndez Ada Lugo Andr Fernndez indices 0 1 2 i 37 Ada Lugo Miura Fernndez Andr Fernndez

Cmo almacenar y localizar los nombres y sueldos de los 40 empleados de una pequea empresa ? Usaramos las variables. Nombre1, Nombre2, ....... Nombre10 y

.....
Gladys Garcia

...
3200.0

Sueldo1, Sueldo2, ...Sueldo39 ?

38 39

Jorge Barzola Maria Cano

2105 3700.2

Cmo almacenar y localizar la cantidad de vehiculos ( bicicletas, triciclos, motos, autos y camiones) vendidos en cada uno de los 12 meses del ao 2001, por una importadora de vehiculos de transporte y carga. ? Usaramos las variables. Can1, Can2, Can3 ... Can30?

Fig. 4.1 Ejemplos de Arreglos

Esas no serian las soluciones a los problemas planteados verdad ? Ya no es adecuado usar los tipos de datos simples (enteros reales o caracteres) porque tendriamos que declarar muchas variables ! Para resolver problemas de este tipo se requieren datos estructurados mas complejas, capaces de almacenar datos relacionados entre s.

Definicin 1 Una estructura de datos es un modelo matemtico o lgico de una organizacin particular de datos. Definicin 2. Una estructura de datos es una coleccin de datos que se caracterizan por la FORMA en que estos se ORGANIZAN, y por las OPERACIONES que se pueden definir sobre dichos datos.

Los tipos de datos mas frecuentes utilizados en los diferentes lenguajes de programacin son:
Entero Real Caracter Lgico

Tipo de Datos Simples (Datos Simples)

Estndar

Definidos por el usuario

Subrango Enumerado

Caracterstica :Un identificador de un tipo de dato simple (nombre de variable) representa a un unico elemento Tipos de Datos Complejos (Datos estructurados) Estticos Array (Vectores y Matrices) Registros Archivos Conjuntos Cadenas

Listas Lineales Dinmicos

Pilas Colas Listas enlazadas Arboles

Listas No Lin.

Grafos

Caracterstica:- Un identificador de un tipo de dato estructurado (nombre de variable) puede representar a multiples datos individuales, pudiendo cada uno de ellos ser accesados de manera independiente. Tipos Abstractos de Datos

Fig. 4.2 Clasificacin de los Tipos de Datos

La eleccin de la estructura de datos adecuada depender del tipo de aplicacin. Existen dos maneras de representar en memoria a las estructuras lineales (o listas lineales): En arreglos (o arrays) , almacenandolo los elementos de la lista en posiciones consecutivas de memoria. En listas enlazadas, reflejando la relacin entre los elementos por medio de punteros o enlaces. Esto lo veremos posteriormente.

Definicin 1 : Es un conjunto ordenado y finito de elementos homogneos. Es decir, sus caractersticas bsicas son:

"Finito" , porque se requiere definir el tamao del array (definir el tama antes de ser utilizado). Ejm : el array Notas que almacena las notas de los 25 alumnos de una clase es de tamao 25 "Homogneos" , porque todos los elementos del array son del mismo tipo. Ejm: en el array Notas, todas las notas almacenadas son de tipo entero. "Ordenado" , porque se pueden identificar a cada elemento del array por la posicin que ocupan : el primero, el segundo, el tercero, ..., el n-esimo, etc. Ejm: en el array Notas, la nota del tercer alumno de la clase (puede ser en orden alfabetico), ocupa la posicin 3.

Fig. 4.3 Arreglos unidimensionales - caracteristicas Definicin 2 : Son posiciones en memoria consecutivas relacionadas entre s por el hecho de que tienen el mismo nombre y los datos que contiene son todos del mismo tipo.

Son entidades estticas ya que conservan el mismo tamao durante toda la ejecucin del programa.

Los arreglos se clasifican en: a) Arreglo unidimensional ( array lineal o vector ) En matemtica es conocido como Vector. Ejm:
Cantidad de canastas anotadas por el equipo peruano en cada uno de los 5 partodps del Sudamericano 2000 Tamao 5

Arreglos unidimensionales paralelos

Dos o mas vectores de igual tamao donde sus elementos de igual indice estan relacionados. Ejm:
Descripcion de productos y sus respectivos precios (8 tipos de productos). Tamao 8

Arreglo bidimensional (array bidimensional o matriz )

En matemtica es conocido como Matriz, o en base de datos como tabla. Ejm: Los sueldosde 10 empleados en cada
uno de los meses de Enero a Junio 2000.

Tamao 10x6

Arreglo multidimensional ( n - dimensional)

Ejm: Estados (libre u ocupado) de las 10 aulas en cada uno de los 4 pisos de los 5 pabellones. Tamao 10x4x5

Fig. 4.4 Clasificacin de arreglos

Definir un arreglo unidimensional. Saber declarar un arreglo unidimensional de cualquier tipo. Declarar arreglos unidimensionales en el contexto de un problema, diferencinadolos de los datos simples.
Conocer, citar y utilizar las reglas que definen un arreglo unidimensional.

Operaciones:

Citar los diferentes tipos de operaciones que se pueden realizar sobre los arreglos unidimensonales. Saber Inicializar arreglos unidimensionales de diversos tipos.

Saber asignar o dar valores a los elementos de un arreglo unidimensional. Saber leer y mostrar todo un arreglo unidimensional. Identificar los procesos para solucionar un problema que requiera de recorrido, visitado o barrido de un arreglo unidimensional. Sumar los elementos numericos de un arreglo. Conocer y aplicar los algoritmos para calcular el minimo y maximo valor de un arreglo unidimensional.
Disear el desarrollo de problemas que requieran sumar o restar arreglos. Disear el desarrollo de problemas que requiera multiplicar un arreglo unidimensional por un escalar y multiplicar arreglos unidimensionales.

Conocer el algoritmo para borrar o insertar un elemento en un arreglo unidimensional.


Conocer y emplear el algoritmo burbuja para clasificar arreglos unidimensionales de tipo numerico y/o cadenas.

Conocer y emplear el algoritmo busqueda secuencial para encontrar un elemento en un arreglo unidimensional de tipo numerico y/o cadenas. Conocer y emplear el algoritmo busqueda binaria para encontrar un elemento en un arreglo unidimensional de tipo numerico y/o cadenas ordenados en orden creciente. Conocer y emplear el algoritmo de mezcla o intercalacin de arreglos unidimensionales ordenados en orden creciente, sin repeticion de elementos.

Convertir algoritmos que utilizan arreglos en programas C++.


Identificar problemas de la vida real donde se puedan utilizar arreglos unidimensionales.

Demostrar como usar arreglos unidimensionales en algoritmos y en C++. Reconocer situaciones en la solucin de problemas que requieran del concepto de arreglos. Desarrollar algoritmos en problemas que requieran de arreglos. Dar ejemplos de problemas que utilicen arreglos unidimensionales.

... Piense en algunos ejemplos de arreglos unidimensionales

Fig. 4.5 Ejemplos de arreglos unidimensionales

Es una estructura de datos lineal formado por una lista ordenada y finita de elementos de la misma naturaleza (o tipo), que se distinguen unos de otros por la posicin que ocupan dentro de la lista. De manera que a cada elemento se le puede asociar un indice que seala el numero de orden dentro de la estructura.

Se dice que la estructura es lineal porque sus elementos forman una secuencia (lista lineal) Los elementos del arreglo se almacenan en memoria en celdas consecutivas y se referencian a travs de ndices (nmeros consecutivos). Si la longitud o tamao del arreglo es n, los ndices segun los lenguajes de programacin pueden ser :

En pascal :
1 2 3 i n-1 n

En C++:
0 1 2 i n-2 n-1

En general la longitud o numero de datos del arreglo pueden obtenerse de la formula: Longitud (o tamao) = LS - LI + 1

LS = ndice de mayor valor o lmite superior del arreglo. LI = ndice de menor valor o lmite inferior del arreglo Si Li = 0 y Ls = n -1 : Longitud = n -1 - 0 +1 = n elementos Si Li = 1 y Ls = n Longitud = n -1+1 = n elementos V 12 14 16 10 20 06 09 12 17 ... 19 08 17

12

13

14

ver Arreglo_Unid

Cada Lenguaje de Programacin tiene sus reglas para declarar un arreglo Pero cada declaracin debe incluir 3 clases de informacin acerca del arreglo:

El nombre del arreglo. El tipo de los datos del arreglo El conjunto de ndices del arreglo(tamao). Autos[1..16] OF integer int Autos[16];

Ejm En PASCAL: Ejm: En C++

Al declararse un arreglo unidimensional se reserva espacio en la memoria principal para una cantidad de elementos del tipo declarado. A este tipo de estructura se le denomina estatico, porque la longitud del arreglo no puede variarse durante la ejecucin del programa. Las estructuras dinmicas pueden cambiar su tamao (aumentar o disminuir) durante la ejecucin del programa.

EJEMPLO DE DECLARACION DE ARREGLOS UNIDIMENSIONALES


real nota[25] EN ALGORITMOS (seudocdigo) y en C++ (cdigo) respectivamente nota almacena hasta 25 datos reales

double nota[25]; real talla[30] double talla [30]; entero codigo[30] int codigo[30]; entero unidCompradas[10] int unidCompradas[10]; caracter Letras[45] char Letras[45]; caracter estCivil[50] char estCivil[50]; caracter nombres[5] [30] char nombres [5] [30]; char* nombres[5]; talla almacena hasta un maximo de 30 datos reales codigo almacena hasta 30 datos enteros unidCompradas almacena hasta 10 datos enteros Letras almacena hasta 45 datos caracter ('r','T','s', ...) estCivil almacena hasta 50 datos caracter ('S','C','S', ...) Los dos ultimos nombres son arrays de tamao 5 que almacenan nombres en el primer caso de tamao definido (30) y en el segundo caso de un tamao no definido.

Fig. 4.6 Operaciones que pueden hacerse con arreglos unidimensionales

A) Inicializacin de vectores

Al igual que con las variables simples (no estructurados), los vectores se pueden inicializar al momento de declararse. Ejm:
Ejemplos de declaracin e inicializacin de arreglos unidimensionales en algoritmos (pseudocdigo) y en C++ real nota[25] = { 12,07,15,12, ...,10,20,19} nota se inicializa con 25 datos reales. double nota[25]={ 12,07,15,12, ...,10,20,19}; real talla[30] = { 1.56, 1.78, 1.45, 1.71, ....,1.52 } double talla[30] = { 1.56, 1.78, 1.45, 1.71 ,..., 1.52}; talla se inicializa con 30 datos reales

entero codigo[30]={11,12,22,23,33,34,...,99} int codigo[30]={11,12,22,23,33,34,...,99}; entero unidCompradas[10] = {12. 24, 36, ...,100} int unidCompradas[10] = {12. 24, 36, ...,100}; caracter Letras[52]={'A','B','C', .,'Z','a','b',...,'z'} char Letras[52]={'A','B','C', .,'Z','a','b',...,'z'}; caracter estCivil[50]={'S','C','C','V','S',...,'V','S'} char estCivil[50]={'S','C','C','V','S',...,'V','S'};

codigo se inicializa con 30 datos enteros unidCompradas se inicializan con 10 datos enteros Letras se inicializa con 52 datos de tipo caracter estCivil se inicializa con 50 datos de tipo caracter

caracter Rpta[] = {'a','d','c','a','c','b','a','b'}; char Rpta[] = {'a','d','c','a','c','b','a','b'}; entero A[5]={1,3,7,}; int A[5]={1,3,7,};
char* preProf [4]={"Ing. ","Lic. ", "Dr. ", "Mag."}; char* descripcion[10] = { "TV 14","TV 24", "TV 29", ..., "VHS"} caracter nombres[2] [30] = {"Juana", "Jose Luis"} char nombres[2] [30] = {"Juana", "Jose Luis"};

El compilador completa el tamao del arreglo con el numero de inicializadores proporcionado (8) A se inicializa con 5 datos de tipo entero, el resto se inicializa en 0
preProf inicializa 4 datos prefijos que son punteros a cadenas descripcion inicializa 10 datos que son punteros a cadenas nombres inicializa dos nombres (cadenas cuyo maximo numero de caracteres es 30)

Los arreglos de caracteres pueden inicializarse asi: char A[4] = {'a','b','c','c'}; o char A[5] = "abcd"; El compilador aade "\0" (fin de cadena) por lo tanto el arreglo debe ser al menos 1 mas grande que el numero de caracteres de la cadena.

B) Asignacin Permite dar valor a uno o varios elementos de un vector.


Asignacin de valores a los elementos de un vector. En algoritmos (pseudocdigo) y en C++ entero A[15]; caracter* nombre[5]; caracter vocales[5]; real talla[10]; caracter Apell[5][25] A[10] = 45 Asigna el valor 45 al elemento de indice 10 del arreglo A. int A[15]; char* nombre[5]; char vocales[5]; double talla[10]; char Apell[5][25]; A[10] = 45;

talla[2] = 1.56 Asigna 1.56 al elemento de indice 2 del arreglo talla

talla[2] = 1.56;

nombre[2] = "Andre Fernandez G." Asigna Andre Fernandez G. al elemento de indice 2 del arreglo nombre

nombre[2] = "Andre Fernandez.";

vocales[3] = 'E' Asigna E al elemento de indice 3 del arreglo vocales.

vocales[3] = 'E';

CopiaCadena(Apell[2], "Garcia") Asigna el apellido Garcia al elemento de indice 2 del arreglo Apell.

strcpy (Apell[2] , "Garcia");

C) Operaciones de Entrada/Salida Lectura/Escritura .- Permite dar valor (leer o ingresar por teclado) o mostrar (en pantalla) el valor de los elementos de un arreglo unidimensional Ejm:
Lectura / Escritura de elementos de un arreglo en pseudocdigo y en C++ respectivamente Leer V[3] Permite Leer el elemento de indice 3 del array unidimensional V cin>> V[3] ;

Mostrar V[3] Permite Mostrar el elemento de indice 3 del array unidimensional V cout<< V[3] ;

Lectura / Escritura de los elementos de un arreglo por grupos en pseudocdigo y en C++ respectivamente

const entero N=10


entero V[N] real Peso[N] para (i = 1 ; hasta i <= N ; con i=i+1) { Leer V [ i ]; } for (i = 0 ; i < N ; i=i+1) { cin>> V [ i ]; }

const int N=10;


int V[N]; double Peso[N]; Lee los elementos del vector V cuyo indice i varia desde 1 hasta N ( i varia de 1 en 1). Nota: N debe ser conocido. En C++: Lee los elementos del vector V cuyo indice i varia desde 0 hasta N1( i varia de 1 en 1). Nota N debe ser conocido.

para (i = 1 ; hasta i<= N ; con i=i+1) { Mostrar Peso [ i ]; }

Muestra los elementos del vector V cuyo indice i varia desde 1 hasta N.(i varia de 1 en 1). Nota: N debe ser conocido.

for (i = 0 ; i< N ; i = i+1) { cout<< Peso [ i ]; } Ejemplo : entero V[5] real Peso[5] para (i = 1 ; hasta i<= 5 ; con i=i+1) { Leer V [ i ]; }

En C++: Muestra los elementos del vector V cuyo indice i varia desde 0 hasta N-1. (i varia de 1 en 1). Nota: N debe ser conocido. Ejemplo : entero V[5]; real Peso[5]; Permite ingresar por teclado los valores para cada elemento del array: V[1], V[2], V[3], V[4] y V[5]

for (i = 0 ; i<= 4 ; i = i+1) { cin>> V [ i ]; } Ejemplo para (i = 1 ; Hasta i<= 5 ; con i=i+1) { Mostrar Peso [ i ]; } for (i = 0 ; i< 5 ; i = i+1) { cout >> Peso [ i ]; }

Permite ingresar por teclado los valores para cada elemento del array: V[0], V[1], V[2], V[3] y V[4] Ejemplo Muestra en pantalla los valores almacenados en cada elemento del array: Peso[1], Peso[2], Peso[3], Peso[4] y Peso[5]

Muestra en pantalla los valores almacenados en cada elemento del array: Peso[0], Peso[1], Peso[2], Peso[3] y Peso[4]

D) Operaciones de acceso a los arreglos

D1) Recorrido ( barrido o visitado ) .- Procesamiento que permite el acceso a todos y cada uno de los elementos del array. Asi se puede recorrer todo un array para procesos como:

Crear o leer o asignar valores a todos los elementos del arreglo. Mostrar o visualizar en pantalla todos los elementos del arreglo.
Sumar todos los elementos del arreglo. Averiguar por una determinada caracteristica de los elementos del arreglo. Como por ejemplo que productos tuvieron una venta menor a 1000 soles. o cuantos alumnos aprobaron un examen.

Ejm: generico de Recorrido : Recorrido del array lineal A con lmite inferior LI y lmite superior LS conocidos (i ngresados por teclado o
asignados). El algoritmo recorre al arreglo realizando la operacin PROCESO a cada uno de los elementos del arreglo. a) Use estructura repetitiva Mientras. b) use para.

a) Recorrido usando la estructura repetitiva Mientras o while

Algoritmo RECORRIDO

PROGRAMA RECORRIDO C++

INICIO
COM: Declaracin de Variables

{
// Declaracin de Variables

entero LI, LS, i real A [20]


COM: Inicializa el valor de LI y LS

int LI, LS, i; double A [20];


// Inicializa el valor de LI y LS

LI = 1 LS = 20;
COM Inicializa el contador

LI = 0 ; LS = 19;
// Inicializa el contador

i = LI ; mientras ( i <= LS ) { // Visita al elemento A[i] PROCESA A [ i ] i = i + 1 // Incrementa el contador } FIN

i = LI; while ( i <= LS ) { // Visita al elemento A[i] procesa A [ i ] i = i + 1; // Incrementa el contador } }

procesa cambia de acuerdo a los requerimientos del problema. PROCESA puede ser : LEER (cin>>) cada elemento del array. MOSTRAR (cout<<) cada elemento del array Acumular los elementos A[i] Si es igual a algun valor contar o mostrar el elemento A[]

b) Recorrido usando la estructura repetitiva para

Algoritmo RECORRIDO INICIO


COM: Declaracin de Variables

Programa RECORRIDO C++ {


// Declaracin de Variables

entero LI, LS, i real A [20] LI = 1 LS = 20


COM: Recorrido del Array A

int LI, LS, i ; double A [20] ; LI = 0 ; LS = 19 ;


// Recorrido del Array A

para ( i= LI ; hasta LS ; i =i+1) { COM: Visita al elemento A[i] PROCESA a A [ i ] } FIN

for ( i= LI ; i <= LS ; i =i+1 ) { // Visita al elemento A[i] PROCESA a A [ i ] } }

procesa cambia de acuerdo a los requerimientos del problema. PROCESA puede ser : Leer (cin>>) cada elemento del array. Mostrar (cout<<) cada elemento del array Acumular los elementos A[i] Si es igual a algun valor contar o mostrar el elemento A[] Calcular el minimo y el maximo valor del arreglo A.

Ejemplo - Aplicacin : Una compaa de autos utiliza un arreglo AutoV para almacenar el numero de autos vendidos desde 1979 hasta 2000. AutoV [ k ] = numero de autos vendidos en el ao k LS = 2000. LI =1979 Longitud = 2000 -1979 + 1 = 22.

ALGORITMO autos INICIO o entero AutoV[22], i, Min, Max,Ca, Av


COM: Crear el array AutoV

Programa autos.cpp { o int AutoV[22], i, Min, Max, Ca, Av;


// Crear el array AutoV

para( i=1, hasta 22 ,i=i+1) o { COM: visita cada elemento i LEER AutoV [ i ] }
COM: Mostrar AutoV y el ao en que se vendieron.

for ( i=0 ; i<= 21 ; i=i+1) { // visita cada elemento i cin>> AutoV [ i ]; }


// Mostrar AutoV y el ao en que se vendieron.

para ( i=1, hasta 22 ,i=i+1) { // Visita cada elemento i MOSTRAR AutoV [ i ], i +1978 }
COM: Cuantos autos se vendieron de 1979 a 2000

for ( i=0 ; i<= 21 ; i=i+1) { // Visita cada elemento i cout<<AutoV [ i ]<<" "<< i+1979<<endl; }
// Cuantos autos se vendieron de 1979 a 2000

AV= 0 // Inicializa AutosVendidos para ( i=1, hasta 22 ,i=i+1) { // Visita cada elemento i AV = AV + AutoV [ i ] }
COM: Aos transcurridos de 1979 a 2000

AV= 0 // Inicializa AutosVendidos for ( i=0 ; i <=21 ; i=i+1) { // Visita cada elemento i AV = AV + AutoV [ i ]; }
// Aos transcurridos de 1979 a 2000

CA = 0 // Inicializa Contador de Aos PARA ( i=1, hasta 22 ,i=i+1) { // Visita cada elemento i contando CA = CA + 1 }
COM: En que aos se vendieron mas de 900 autos anuales y cuantos se vendieron en cada uno de esos aos

CA = 0 // Inicializa Contador de Aos for ( i=0 ; i<= 21 ; i=i+1) { // Visita cada elemento i contando CA = CA + 1; }
/* En que aos se vendieron mas de 900 autos anuales y cuantos se vendieron en cada uno de esos aos */

PARA ( i=1, hasta 22 ,i=i+1) { // Visita cada elemento i

for ( i=0 ; i<=21 ; i=i+1) { // Visita cada elemento i

SI ( AutoV [ i ] > 900 ) { MOSTRAR i+1978, AutoV[ i ] } }


COM: En que ao o aos se vendieros menos autos y cual es ese valor

SI ( AutoV [ i ] > 900 ) { cout<<i+1979<<" "<<AutoV [ i ]<< endl; } }


//: En que ao o aos se vendieros menos autos y cual es ese valor

Min = AutoV[ 1 ]; PARA ( i=1, hasta 22 ,i=i+1) { // Visita cada elemento i SI (AutoV[ i ] < Min ) { Min = AutoV[ i ]; } } Mostrar Min PARA ( i=1, hasta 22 ,i=i+1) { // Visita cada elemento i SI ( AutoV[ i ] = Min ) { Mostrar i+1978 } }
COM: En que ao o aos se vendieron mas autos y cuantos fueron

Min = AutoV [0 ]; for ( i=0; i<=21;=i+1) { // Visita cada elemento i SI (AutoV[ i ] < Min ) { Min = AutoV [ i ]; } } cout<< Min<<endl; for ( i=0 ; i<=21 ; i=i+1) { // Visita cada elemento i if ( AutoV[ i ] == Min ) { cout << i+1979<<endl; } }
// En que ao o aos se vendieron mas autos y cuantos fueron

MAX = AutoV [ 1 ] PARA ( i=1, hasta 22 ,i=i+1) { COM: Visita cada elemento i SI ( AutoV[ i ] > Max ) { Max = AutoV [ i ] } } Mostrar Max PARA ( i=1, hasta 22 ,i=i+1) { COM: Visita cada elemento i SI ( AutoV[ i ] = Max ) { Mostrar i+1978 } } FIN

MAX = AutoV [ 0 ]; for ( i=0; i<=21; i=i+1) { // Visita cada elemento i if ( AutoV[ i ] > Max ) { Max = AutoV [ i ]; } } cout<<Max<<endl; for ( i=0 ; i<=21; i=i+1) { // Visita cada elemento i if ( AutoV[ i ] == Max ) { cout<< i+1979<<endl; } } }

E) Operaciones de Actualizacin

E1) Insercin Adicin de un nuevo elemento al array unidimensional o vector.

E2) Borrado Eliminacin de un elemento del array unidimensional o vector. Ver insercin y borrado.

F) Otras Operaciones F1) Ordenamiento o clasificacin Organizacin de los elementos de la lista de acuerdo con algn tipo de orden. Ejemplo ordenar las notas de mayor a menor , ordenar los nombres en orden alfabtico, etc. Porqu se clasifica un arreglo ? Esto se hace por lo general para facilitar la bsqueda de los elementos del array. Asi se clasifica en: los diccionarios, las agendas telefnicas, los casilleros de bibliotecas, relacin de amigos, etc.

Ordenamiento por el Mtodo de burbuja

Para entender el mtodo ordenaremos de menor a mayor la lista de 8 datos enteros, usando el mtodo de burbuja ( N = 8 ). Sea el arreglo A: A 30 Paso1: Objetivo: Obtener el mas grande al final de la lista. Para ello se compara cada elemento A[j] con el siguiente A[j+1], donde j varia de 1 a N -1 ( 7 comparaciones) Es decir : si A[j] > A[j +1] es verdad se intercambia. 50 28 89 76 24 16 60

Finalmente el arreglo queda as : 30 A[1] 28 A[2] 50 A[3] 76 A[4] 24 A[5] 16 A[6] 60 A[7] 89 A[8]

El elemento mas grande esta en la posicin 8. Paso2 : Objetivo: Obtener el mas grande al final de la lista (con 7 elementos). Para ello se compara cada elemento A[j] con el siguiente A[j+1], donde j varia de 1 a N -2.(6 comparaciones)

Es decir :

si A[j] > A[j +1] es verdad se intercambia.

Finalmente el arreglo queda as : 28 A[1] 30 A[2] 50 A[3] 24 A[4] 16 A[5] 60 A[6] 76 A[7] 89 A[8]

El elemento mas grande esta en la posicin 7 Paso 3: Objetivo: Obtener el mas grande al final de la lista (con 6 elementos). Para ello se compara cada elemento A[j] con el siguiente A[j+1], donde j varia de 1 a N -3.(5 comparaciones) Es decir : si A[j] > A[j +1] es verdad se intercambia.

Finalmente el arreglo queda as : 28 A[1] 30 A[2] 50 A[3] 24 A[4] 16 A[5] 60 A[6] 76 A[7] 89 A[8]

El elemento mas grande esta en la posicin 6 Paso 4:

Objetivo: Obtener el mas grande al final de la lista (con 5 elementos). Para ello se compara cada elemento A[j] con el siguiente A[j+1], donde j varia de 1 a N -4 (4 comparaciones). Es decir : si A[j] > A[j +1] es verdad se intercambia.

Finalmente el arreglo queda as : 28 A[1] 24 A[2] 16 A[3] 30 A[4] 50 A[5] 60 A[6] 76 A[7] 89 A[8]

El elemento mas grande esta en la posicin 5 Paso 5: Objetivo: Obtener el mas grande al final de la lista (con 4 elementos). Para ello se compara cada elemento A[j] con el siguiente A[j+1], donde j varia de 1 a N -5 (3 comparaciones). Es decir : si A[j] > A[j +1] es verdad se intercambia.

Finalmente el arreglo queda as : 28 A[1] 24 A[2] 16 A[3] 30 A[4] 50 A[5] 60 A[6] 76 A[7] 89 A[8]

El elemento mas grande esta en la posicin 4

Paso 6: Objetivo: Obtener el mas grande al final de la lista (con 3 elementos). Para ello se compara cada elemento A[j] con el siguiente A[j+1], donde j varia de 1 a N -6 (2 comparaciones). Es decir : si A[j] > A[j +1] es verdad se intercambia.

Finalmente el arreglo queda as : 16 A[1] 24 A[2] 28 A[3] 30 A[4] 50 A[5] 60 A[6] 76 A[7] 89 A[8]

El elemento mas grande esta en la posicin 3 Paso 7: Objetivo: Obtener el mas grande al final de la lista (con 2 elementos). Para ello se compara cada elemento A[j] con el siguiente A[j+1], donde j varia de 1 a N -7 ( 1 comparacin). Es decir : si A[j] > A[j +1] es verdad se intercambia.

Finalmente el arreglo queda as (ordenado de mayor a menor): 16 A[1] 24 A[2] 28 A[3] 30 A[4] 50 A[5] 60 A[6] 76 A[7] 89 A[8]

El elemento mas grande esta en la posicin 2 EL ARRAY YA ORDENADO DE MENOR A MAYOR 16 A[1] 24 A[2] 28 A[3] 30 A[4] 50 A[5] 60 A[6] 76 A[7] 89 A[8]

Observacin : Si se desea ordenar de mayor a menor, lo unico que cambia es la pregunta para hacer el intercambio, con el objetivo de obtener en cada paso el mas pequeo al final de la lista Es decir : si A[j] < A[j +1] es verdad se intercambia.

Algoritmo BURBUJA INICIO


COM: Declaracion de variables

Programa C++ BURBUJA {


// Declaracion de variables

entero A[10], k , J, Aux , N=8 const int N=10;


COM: Inicializacin o lectura del arreglo A

int A[10], k , J, Aux , N=8; const int N = 10;


// Inicializacin o lectura del arreglo A

para (i=1, hasta N, i = i+1) { Leer A[i] }


COM: Algoritmo de ordenamiento burbuja COM: k = Numero de pasos (1 a N-1)

for (i=0; i < N ; i = i+1) { cin>> A[i] ; }


// Algoritmo de ordenamiento burbuja // k = Numero de pasos (1 a N-1)

para ( k =1 hasta N -1; k=k+1 ) {


COM: Nro de compar. j depende del Nro de paso

for ( k = 0 ; k < N -1 ; k = k+1 ) {


// Nro de comparac. j depende del Nro de paso

para(J=1, hasta N1-k;J =J +1)

for (J = 0 ;J < N 1-k ; J =J +1)

SI ( A [J ] > A [J+1] ) { COM: Intercambiamos A[J] y A[J+1] Aux = A [ J ] A [ J ] = A [ J+1] A [ J+1] = Aux } } }
COM: fin del PARA interior COM: fin

if ( A [J ] > A [J+1] ) { // Intercambiamos A[J] y A[J+1] Aux = A [ J ]; A [ J ] = A [ J+1] ; A [ J+1] = Aux; } } // fin del para interno } //COM: fin del PARA exterior
// Se muestra el arreglo ordenado

del PARA exterior

COM: Se muestra el arreglo ordenado

para (i=1, hasta N, i = i+1) { Mostrar A[i] } FIN

for (i=0 : i < N ; i = i+1) { cout<< A[i] <<" "; } }

Cuando se trata de arreglos de cadenas se requiere usar las funciones de comparacin y de asignacin de variables de ese tipo.

F2) Bsqueda Bsqueda de la posicin ocupada por un elemento con un determinado valor o del registro con un determinado valor de clave.

Mtodo de BUSQUEDA SECUENCIAL

Sea el arreglo A de tamao 50 que almacena valores reales, y sea ElemB el elemento que deseamos buscar en el arreglo. Lug almacena el lugar donde se encuentra a Elem dentro del arreglo ( es decir, 1 a 50 en pseudocodigo o 1 a 49 en c++). Suponga que el arreglo ha sido inicializado.

BusquedaSecuencial ALGORITMO BusquedaSecuencial INICIO


constante entera N = 50 real A[ N ] = { 1.5,2.6,7.8, ..... , 6.9, 8.0} real ElemB entero i, Lug ; Leer ElemB para ( i= 1, hasta N , i = i+1 ) {
COM: compara c/elemento i de A con ElemB

BusquedaSecuencial - C++ void main ( ) {


const int N = 50; double A[N] = { 1.5,2.6,7.8, ..... , 6.9, 8.0}; double ElemB; int i, Lug; cin>> ElemB; for ( i= 0 ; i< N ; i = i+1 )

// compara c/elemento i de A con ElemB

if (A [ i ] == ElemB )

SI ( A [ i ] = ElemB ) { Lug = i Mostrar Esta en , Lug ruptura; }

// si lo encuentra muestra la posicin

Lug = i; cout<< Esta en <<Lug <<endl ; break; // sale del for }

} FIN

COM: fin del para

} }

// fin del for

BusquedaSecuencial void main( ) { // con do while o const int N = 50;

BusquedaSecuencial - C++ void main ( ) { o


// con while const int N = 50;

double A[N] = { 1.5,2.6,7.8, ..... , 6.9, 8.0}; double ElemB; int Enc, Lug, i=-1 ; cin>> ElemB; do

double A[N] = { 1.5,2.6,7.8, .. , 6.9, 8.0}; double ElemB; int Lug, i=0 ; cin>> ElemB; while ((ElemB!=A[i] && (i< 50))

// el indice incrementa

{ }

// el indice incrementa

i = i+1;
// si no lo encuentra e i <50 continua buscando

i = i+1;
// fin del while

} while ((ElemB !=A[i] ) && (i<50)); if ( i == 50) { Lug = i; cout<<"esta en "<<Lug<<endl; } else { cout<<" no esta"<<endl; } getch();

if ( i == 50) { Lug = i; cout<<"esta en "<<Lug<<endl; } else { cout<<" no esta"<<endl; } getch();"

FIN

Ver Procedimiento busqueda_secuencial

Mtodo de BUSQUEDA BINARIA

Se utiliza para arreglos ordenados de manera creciente (tanto numericos como cadenas). Ejemplo: Si queremos buscar una palabra en el diccionario, podemos usar este algoritmo:

Abrimos el diccionario por la mitad para determinar que mitad contiene la palabra buscada. Teniendo la mitad elegida, la abrimos nuevamente por la mitad, para determinar que cuarta parte contiene la palabra buscada. Si repetimos este proceso, podemos encontrar rapidamente la palabra buscada pues reducimos las posibles zonas donde se encuentra la palabra buscada.

Sea el array A que inicialmente debe estar ordenado de manera ascendente. 1259 1 1470 2 1554 3 1789 4 1790 5 1891 6 1956 7 2001 8 2345 9 2567 10 3200 11

Se busca el elemento 1956. Las variables LI y LS indican los limites superior e inferior del intervalo de bsqueda Se empieza con : LI = 1 y LS = 11 Se examina el elemento central: c = (1+11)/2 = 6 1259 1 1470 2 1554 3 1789 4 1790 5 1891 6 1956 7 2001 8 2345 9 2567 10 3200 11

LI =1

c= 6

LS=11

Como 1956 > 1891 (A[c] , nos quedamos con la segunda sublista: 1956 2001 2345 2567 3200

10

11

LI =7

LS=11

LI = c+1 = 7
Se examina el elemento central : c = ( LI + LS)/2 = 9 1956 7 2001 8 2345 9 2567 10 3200 11

LI =7

c=9

LS=11

Como 2345 > 1956 nos quedamos con la primera sublista 1956 7 2001 8

LI =7

LS=8

LS = c -1 = 8 Se examina el elemento central :

c = ( LI + LS)/2 = 7 1956 2001

c=7 Como A[c] es igual al Elemento buscado, entonces sale del lazo while. Como el elemento buscado es igual al elemento central A[c] al Lug se le asigna c Si el elemento no se encuentra en el arreglo A , llegar un momento en que LS < LI. Esto indica que la busqeuda a sido fallida y en ese caso Lug = 0 (fuera de conjunto de datos de 1 a N

Pseudocodigo Algoritmo Busqueda Binaria INICIO void main() {

Programa C++

constante entero N = 11 entero i , ElemB, LI, LS,c, Lug entero A[N] = {1,5,7,9,12,15,,...., 56,78 } LEER ElemB LI = 1 COM: Lim Inferior de busqueda LS = N COM: Lim Superior de busqueda c = (LI+LS)/2 Mientras ((LI<=LS) y (A[c] ElemB)) { SI ( ElemB < A[c] ) { LS = c-1 } COM: primera sublista sino { LI = c+1 } COM: segunda sublista c = entero de ( LI+LS) /2 } SI ( ElemB = A[c ] ) { Lug = c Mostrar Lug } Sino { Lug = 0 Mostrar ElemB, "No se encuentra }

const int N = 11; int i , ElemB, LI, LS,c, Lug; int A[N] = {1,5,7,9,12,15,,...., 56,78 }; cin>> ElemB; LI = 0; // Lim Inferior de busqueda LS = N -1; // Lim Superior de busqueda c = (LI+LS)/2; while ((LI <= LS) && ( A[c] != ElemB)) { if ( ElemB < A[c] ) { LS = c - 1; } // primera sublista else { LI = c + 1; } // segunda sublista . c = (LI+LS)/2; } if ( ElemB == A[c ] ) { Lug = c; cout<< Lug<<endl; } else { Lug = 0; cout<<ElemB<< no se encuentra<<endl; }

FIN

ver procedimiento BusquedaBinaria

G) Operaciones entre arreglos unidimensionales

G1) Sumar Sumar los elementos de dos arreglos A y B para obtener un tercer arreglo S:

En

A[1]

A[2]

A[ i ]

....

A[n-1]

A[n]

pseudocodigo

1
B[1]

2
B[2]

i
B[ i ] ....
B[n-1]

n
B[n]

En

pseudocodigo

1
A[1] + B[1]

2
A[2] + B[2]

i
A[i]+B[i]

n-1

n
A[n] + B[n]

En

pseudocodigo

n-1

S[i]=A[i]+B[i]
// a cada elemento A[i] se le suma el respectivo elemento B[i]

G2) Restar Restar los elementos de dos arreglos A y B para obtener un tercer arreglo R:

En

A[1]

A[2]

A[ i ]

....

A[n-1]

A[n]

pseudocodigo

1
B[1]

2
B[2]

i
B[ i ] ....
B[n-1]

n
B[n]

En

pseudocodigo

1
A[1] - B[1]

2
A[2] - B[2]

i
A[i]-B[i]

n-1

n
A[n] - B[n]

En

pseudocodigo

n-1

R[i]=A[i]-B[i]
// a cada elemento A[i] se le resta el respectivo elemento B[i]

Programas en C++ para sumar y restar arreglos unidimensionales

SUMA ARREGLOS void main() { const int N=20;


// Declaracin de Variables

RESTA ARREGLOS void main() { const int N=20;


// Declaracin de Variables

int i; double A[N], B[N] S[N]; ........ // Leer o inicializar Arreglo A

int i; double A[N], B[N], R[N]; ........ // Leer o inicializar Arreglo A

.......

// Leer o inicializar Arreglo B

.......

// Leer o inicializar Arreglo B

// Recorrido del Array A

// Recorrido del Array A

for ( i= 0 ; i < N ; i =i+1 ) { // suma elemento por elemento S[i] = A [ i ] + B[i] ; } .... // Muestra arreglo S } }

for ( i= 0 ; i < N ; i =i+1 ) { // Multiplica elmento por elemento R [i] = A [ i ] - B[i] ; } ...... // Muestra arreglo R

G3) Multiplicar arreglo unidimensional por un escalar Multiplicar cada elemento del arreglo A por un escalar K:

En

A[1]

A[2]

A[i]

....

A[n-1]

A[n]

pseudocodigo

1
k*A[1]

2 k*A[2] 2

i
k *A[i]

n
k*A[n]

En

pseudocodigo

n-1

C[i] = k * A[i]
// cada elemento de A[i] es multiplicado por el escalar k

G4) Multiplicar arreglos unidimensionales

Multiplicar los elementos de dos arreglos A y B para obtener un tercero P: A


En A[1] A[2]

A[ i ]

....

A[n-1]

A[n]

pseudocodigo

1
B[1]

2
B[2]

i
B[ i ] ....
B[n-1]

n
B[n]

En

pseudocodigo

1
A[1] * B[1]

2
A[2] * B[2]

i
A[i]*B[i]

n-1

n
A[n] * B[n]

En

pseudocodigo

n-1

P[i]=A[i]*B[i]
// a cada elemento A[i] se le multiplica por su respectivo elemento B[i]

Programas en C++ para multiplicar arreglos unidimensionales entre si y por un escalar

MULTIPLICA POR ESCALAR void main() { const int N=20;


// Declaracin de Variables

MULTIPLICA ARREGLOS void main() { const int N=20;


// Declaracin de Variables

int i; double A[N],C[N], k ; ........ // Leer o inicializar Arreglo A ....... // Leer o inicializar Arreglo B ....... // Leer o inicializar k
// Recorrido del Array A

int i; double A[N], B[N], P[N]; ........ // Leer o inicializar Arreglo A ....... // Leer o inicializar Arreglo B
// Recorrido del Array A

for ( i= 0 ; i < N ; i =i+1 ) { // suma elemento por elemento C[ i ] = k * A [ i ] ; } .... // Muestra arreglo A }

for ( i= 0 ; i < N ; i =i+1 ) { // Multiplica elmento por elemento P [ i ] = A [ i ] * B[i] ; } ...... // Muestra arreglo M }

G5) Mezcla o intercalacin

Combinar dos listas en una sola.

Vectores Originales: A B C
1 2 3 4 5 6 7 8 9 10 11 12 3 1 -5 1 4 2 0 2 7 3 4 3 19 4 13 4 17 5 19 6 90 7 95 8

Ver proceso de mezcla_algoritmos


Vectores Mezclados:

3 1

4 2

7 3

19 4 r vara desde j=7 hasta 8

-5

13

17

19

90

95

2 0 2

3 3 3

4 4 4

5 7 5

6 13 6

7 17 7

8 19 8 90 9 95 10 11 12

k = k+1=9 k = k+1=10

-5 1

Ver proceso de mezcla_c++

Programas en algoritmos y en C++ para la mezcla de los vectores A y B, se obtiene el vector mezcla C

ALGORITMO INICIO INICIO

PROGRAMA C++

constante entero M=4,N=8


// Declaracin de Variables

const int M=4,N=8;


// Declaracin de Variables

entero i , j , k , r real A[M],B[N],C[M+N] ; ........ // Leer o inicializar Arreglo A ....... // Leer o inicializar Arreglo B
COM: Inicializa i , j ,k

int i , j , k , r double A[M],B[N],C[M+N] ; ........ // Leer o inicializar Arreglo A ....... // Leer o inicializar Arreglo B
// Inicializa i , j ,k

i=1, j=1, k=0 Mientras ((i<=M) y (j<=N)) { k=k+1 si (A[ i ] < B[ j ]) { C[ k ] = A[ i ] i = i +1 } sino { C[ k ] = B[ j ] j = j +1 } } si (i<=M) { para(r=i hasta M, r=r+1) { k=k+1 C[ k ] = A[ r ] } } sino { para(r=j hasta N, r=r+1) { k=k+1

i =1; j =1; k = 0; while (( i < M ) && ( j< N )) { k=k+1; if ( A[ i ] < B[ j ] ) { C[ k ] = A[ i ]; i = i +1; } else { C[ k ] = B[ j ]; if (A[ i ] == B[ j ]) { i=i+1; j=j+1;} j = j +1; } } if ( i < M) { for(r= i ;r< M; r=r+1) { k = k+1; C[ k ] = A[ r ]; } } else { for (r= j ;r< N; r=r+1)

C[ k ] = B[ r ] } }
COM: Muestra arreglo C intercalado o mezclado

{ k = k +1; C[ k ] = B[ r ]; } }
// Muestra arreglo C intercalado o mezclado

para(i=1, hasta k, i=i+1) { cout<< C[ k ]<<" "; } FIN }

for (i=0; i<= k, i=i+1) { cout<< C[ k ]<<" "; } cout<<endl;getch();

Ejemplo - Aplicacin: El administrador de una embotelladora utiliza los arreglos UVMan y UVTar para almacenar las unidades vendidas (cajas) en la maana y tarde respectivamente y en el arreglo PreUni se almacena el precio de venta de cada unidad (cajas) de producto. Hacer un algoritmo y su programa respectivo en C++ para calcular las unidades vendidas en todo el dia y a cuanto asciende la venta en soles por cada producto. Se comercializan 10 variedades de productos. ALGORITMO Ventas INICIO
COM: declaracion de variables

PROGRAMA Ventas { entero UVDia[10],


// declaracion de variables

entero UVMan[10], UVTar[10]; o VenTotD real PreUni[10], VentaD[10]


COM: Lectura del arreglo UVMan

UVMan[10], UVTar[10]; o int int UVDia[10], VenTotD; double PreUni[10], VentaD[10];


/ Lectura del arreglo UVMan

para ( i= 1 hasta 120 ,i=i+1 ) { LEER UVMan [ i ] }

for ( i= 0 ; i<10 ; i=i+1 ) { cin>> UVMan [ i ]; }

COM: Lectura del arreglo UVTar

// Lectura del arreglo UVTar

para ( i= 1, hasta 120, ,i=i+1 ) { LEER UVTar [ i ] }


COM: Lectura del arreglo PreUni

for ( i= 0; i <10 ; i=i+1 ) { cin>> UVTar [ i ]; }


// Lectura del arreglo PreUni

para ( i= 1 hasta 120 ,i=i+1 ) { LEER PreUni [ i ] }


COM: Calculo del arreglo UVDia que almacena las unidades vendidas en el dia

for ( i= 0; i <10 ; i=i+1 ) { cin>> PreUni [ i ]; }


COM: Calculo del arreglo UVDia que almacena las unidades vendidas en el dia

para ( i= 1 hasta 120 ,i=i+1 ) { // Visita cada uno de los elemento de los arreglos UVDia[i] = UVMan[ i ]+UVTar[i]; }
COM: Calculo dle arreglo VentaDia que almacena la venta del dia en soles en c/u de los productos.

for ( i= 0; i <10 ; i=i+1 ) { // Visita cada uno de los elemento de los arreglos UVDia [ i ] = UVMan [ i ] + UVTar [ i ]; }
// Calculo dle arreglo VentaDia que almacena la venta del dia en soles en c/u de los productos.

para ( i= 1, hasta 10 ,i=i+1 ) { // Visita cada elemento i VentaD[i]=UVDia[i] * PreUni[i]


COM: Calculo de la VentaTotal del dia en soles VenTotDia

for ( i= 0; i <10 ; i=i+1 ) { // Visita cada elemento i VentaD[i]= UVDia[i]*PreUni[i];


// Calculo de la VentaTotal del dia en soles VenTotDia

VenTotD= 0 para ( i= 1 hasta 10 ,i=i+1 ) { // Visita al elemento , acumula VenTotD =VenTotD +VentaD[ i] } Mostrar VenTotD FIN }

VenTotD= 0 for ( i= 0; i <10 ; i=i+1 ) { // Visita al elemento , acumula VenTotD =VenTotD + VentaD[ i ]; } cout<< VenTotD<<endl;

Los arreglos paralelos son arreglos unidimensionales de igual tamao donde los elementos de igual indice estan relacionados entre si. Es decir, permite almacenar informacin de diferente tipo relacionado. Por ejemplo si queremos mostrar los nombres, sexo, edad, telefono y direccion de los empleados de una empresa.
Indices en C++ / Algoritmo 0 1 .... .... n-2 n-1 1 2 .... .... n1 n Nombres "Edgar F. C." "Miura F. G" Edad 40 12 Sexo 'M' 'F' Telefono 807-4567 456-7890

"Andr F. G" "Gladys G". "Herminia V".

16 40 56

'M' 'F' 'F'

567-8090 345-6780 245-7809

Sin embargo la mayoria de los lenguajes de programacin indorporan estructura tipo registro dentro del lenguaje, que facilita la manipulacin de datos como el mencionado. El C++ tiene la estructura de dato struct que permite aquello.

Definir un arreglo bidimensional. Saber declarar un arreglo bidimensional de cualquier tipo.

Demostrar como accesar un arreglo unidimensional.


Conocer, citar y utilizar las reglas que definen un arreglo bidimensional.

Operaciones:

Citar los diferentes tipos de operaciones que se pueden realizar sobre los arreglos bidimensonales. Saber inicializar arreglos bidimensionales de diversos tipos.

Saber asignar o dar valores a los elementos de un arreglo bidimensional. Saber leer y mostrar todo un arreglo bidimensional. Identificar los procesos para solucionar un problema que requiera de recorrido, visitado o barrido de un arreglo bidimensional(ejm contar) Conocer y aplicar los algoritmos para calcular el mximo y el minimo valor de un arreglo bidimensional.
Disear el desarrollo de problemas que requieran sumar o restar arreglos bidimensionales. Disear el desarrollo de problemas que requiera multiplicar un arreglo bidimensional por un escalar y multiplicar 2 arreglos bdimensionales. Saber sumar filas para obtener el vector vertical a partir de una matriz Saber sumar columnas para obtener el vector horizontal a partir de una matriz

Convertir algoritmos que utilizan arreglos bidimensionales en programas C++.


Identificar problemas de la vida real donde se puedan utilizar arreglos bidimensionales.

Demostrar como usar arreglos bidimensionales en algoritmos y en C++. Reconocer situaciones en la solucin de problemas que requieran del concepto de arreglos bidimensionales. Desarrollar algoritmos en problemas que requieran de arreglos.
Crear sus propias aplicaciones a casos de la vida real, en donde se utilicen matrices.

... Piense en algunos ejemplos de arreglos bidimensionales

Fig. 4.7. Ejemplos de arreglos bidimensionales

Se puede considerar como un vector de vectores. Por tanto es un conjunto de elementos todos del mismo tipo en el que se utilizan dos subndices para especificar un elemento. Ejm Una cadena de tiendas est formada por 10 sucursales y cada uno consta de 5 secciones (Lacteos/Bebidas/... /carnes). En la siguiente tabla o matriz (matemtico) se representan las ventas mensuales en soles.

VENTAS
Sucursales

0 1

1 2

Secciones .... ...

3 4

4 5

01 12
Los indices en psuedocodigo y en C++

2400 1800 ... ...

3600 5120 ... ... 3460 3450

5600 3490 ... ... 5671 6740

7200 5690 ... ... 4567 4356

3100 5670 ... ... 5423 3210

45 56

3490 1780

En un array bidimensional cada elemento del array se referencia a travs de dos ndices. En pseudocodigo : En C++ VENTAS [1] [2] =3600 VENTAS [0] [1] =3600 VENTAS [2][4] = 5690 VENTAS [1][3] = 5690

EJEMPLO DE DECLARACION DE ARREGLOS BIDIMENSIONALES


EN ALGORITMOS (seudocdigo) y en C++ (cdigo) respectivamente real nota[25][4] double nota[25][4]; real Peso[20][12] double Peso [20][12]; declara nota, las 4 notas de cada uno de los 25 alumnos. Reserva celdas de memoria.para 100 datos double declara Peso, los pesos promedios de 30 deportistas en cada uno de los 12 meses del 2001. Reserva celdas de memoria para 240 datos double.

entero DocCasacas[3][30] int DocCasacas[3][30]; entero unidInsumo[5][12] int unidInsumo[5][12]; caracter Rpta[45][10] char Rpta[45][10];

declara DocCasacas, las docenas de casacas de 3 tallas ('S', 'M','L') confeccionadas en cada uno de los 30 dias del mes de Junio. Reserva celdas de memoria para 90 datos iint. declara unidInsumo, las unidades de 5 variedades de insumo comprados en cada uno de los 12 meses del 2000 Reserva celdas de memoria para 60 datos int declara Rpta, las respuestas de 45 alumnos a 10 preguntas de opcion muiltiple ('a',...'e'). Reserva celdas de memoria para 450 datos char.

A) Inicializacin de Matrices

Al igual que con las variables simples (no estructurados) y los vectores, las matrices se pueden inicializar al momento de declararse. Ejm:

Ejemplos de declaracin e inicializacin de arreglos bidimensionales en algoritmos (pseudocdigo) y en C++


real nota[25][4] = { {12.5, 5.5, 7,14}, {10,16,17,10,5), ...., {15,17,19,19.5} } real nota[25][4]={ 12.5, 5.5, 7,14, 10,16,17,10,5, ...., 15,17,19,19.5 } real nota[ ][4]={ {12.5, 5.5, 7,14}, {10,16,17,10,5), ...., {15,17,19,19.5} } double nota[25][4] = { {12.5, 5.5, 7,14}, {10,16,17,10,5), ...., {15,17,19,19.5} } double nota[25][4]={ {12.5, 5.5, 7,14}, {10,16,17,10,5), ...., {15,17,19,19.5} } double nota[ ][4]={ {12.5, 5.5, 7,14}, {10,16,17,10,5), ...., {15,17,19,19.5} }

nota declara e inicializa las 4 notas de cada uno de los 25 alumnos.(total 100 notas, agrupadas de 4) Puede omitirse el tamao de la primera dimension pero no la segunda. Total 100 datos reales.

real Peso[20][12] = { {50.5, 70,80,80.6,90,67.5,45.7, 78.5, 90,110,56.7,89}, ...., {.....} }

double Peso[20][12] = { {50.5, 70,80,80.6,90,67.5,45.7, 78.5, 90,110,56.7,89}, ...., {.....} } double Peso[20][12] = { 50.5, 70,80,80.6,90,67.5,45.7, 78.5, 90,110,56.7,89}, ...., ..... } double Peso[ ][12] = { {50.5, 70,80,80.6,90,67.5,45.7, 78.5, 90,110,56.7,89}, ...., {.....} }

real Peso[20][12] = { 50.5, 70,80,80.6,90,67.5,45.7, 78.5, 90,110,56.7,89}, ...., ..... }

real Peso[ ][12] = { {50.5, 70,80,80.6,90,67.5,45.7, 78.5, 90,110,56.7,89}, ...., {.....} }

Peso declara e incializa los pesos promedios de 30 deportistas en cada uno de los 12 meses del 2001.(total 240 pesos agrupados de 12 en 12). Total 240 datos reales

entero DocCasacas[3][4]= {{20,40,35,80}, {25,70,50,36}, {48,36,64,24}}

int DocCasacas[3][4]={{20,40,35,80}, {25,70,50,36}, {48,36,64,24}}; int DocCasacas[3][4]={20,40,35,80, 25,70,50,36, 48,36,64,24}; int DocCasacas[ ][4]={{20,40,35,80}, {25,70,50,36}, {48,36,64,24}};

entero DocCasacas[3][4]={20,40,35,80,25,70,50,36, 48,36,64,24}

entero DocCasacas [ ][4] ={{20,40,35,80},{25,70,50,36}, {48,36,64,24}}

declara e incializa DocCasacas, las docenas de casacas de 3 tallas ('S', 'M','L') confeccionadas en cada una de los 4 semanas del mes de Junio2002

caracter Rpta[3][4]= { {'a','e','c','d'}, {'e','c','d','a'}, {'c','c','d','c'} } caracter Rpta[3][4]={'a','e','c','d','e','c','d','a', 'c','c','d','c' }

char Rpta[5][4]= { {'a','e','c','d'}, {'e','c','d','a'}, {'c','c','d','c'} }; char Rpta[5][4]={'a','e','c','d','e','c','d','a', 'c','c','d','c' };

caracter Rpta[ ][4]={'a','e','c','d', 'e','c','d','a', 'c','c','d','c' }

char Rpta[ ][4]={'a','e','c','d', 'e','c','d','a', 'c','c','d','c' };

declara e inicializa Rpta, las respuestas de 3 alumnos a 4preguntas de opcion muiltiple ('a',...'e'). Reserva celdas de memoria para 12 datos char. Total de 12 datos 3 grupos agrupados de 4 en 4. entero A[2][4] = {{1,2},{3,4}} es igual a: entero A[2][4] = {{1,2,0,0},{3,4,0,0}} A Declara e inicializa un arreglo A con 8 elementos, int A[2][4] = {{1,2},{3,4}}; es igual a: int A[2][4] = {{1,2,0,0},{3,4,0,0}} ;

B) Asignacin Permite dar valor a uno o varios elementos de un vector.


Asignacin de valores a los elementos de un vector. En algoritmos (pseudocdigo) y en C++ entero A[15][30]; caracter Rpta [50] [10]; A[10] [20] = 45 int A[15][30]; char Rpta [50][10]; A[10] [20] = 45;

Asigna el valor 45 al elemento de la fila 10 y columna 20 del arreglo bidimensional A.

Rpta [2][5] = 'c' Asigna 'c' al elemento de la fila 2 y columna 5 del arreglo Rpta

Rpta [2][5] = 'c';

C) Operaciones de Entrada/Salida

Lectura/Escritura .- Permite dar valor (leer o ingresar por teclado) o mostrar (en pantalla) el valor de los elementos de un arreglo bidimensional Ejm:
Lectura / Escritura de elementos de un arreglo bidimensional en pseudocdigo y en C++ respectivamente Leer V[3][5] cin>> V[3] [5] ; Permite Leer el elemento de la fila 3 y columna 5 del arreglo bidimensional V

Mostrar V[3][5] cout<< V[3] [5];

Permite Mostrar el elemento de la fila 3 y columna 5 del arreglo bidimensional V

Lectura / Escritura de los elementos de un arreglo por grupos en pseudocdigo y en C++ respectivamente constante entera M = 10, N=12; entero V[10][12] real Peso[M][N] para (i = 1 ; hasta i <= M ; con i=i+1) { para (j=1 hasta j <=N ; con j=j+1) { Leer V [ i ][ j ]; } } for (i = 0 ; i < M ; i=i+1) { for ( j = 0 ; j < N ; j=j+1) { cin>> V [ i ][ j ]; } } const int M=10, N=12; int V[10][12]; double Peso[M][N]; Lee los elementos de la matriz V cuyo indice i varia desde 1 hasta M, y j varia desde 1 hasta N. Nota: M y N deben ser conocidos.

En C++: Lee los elementos de la matriz V cuyo indice i varia desde 0 hasta M-1 y j varia desde 1 hasta N-1. Nota M y N debe ser conocido.

para (i = 1 ; hasta i<= M ; con i=i+1) { para (j=1 hasta j <=N ; con j=j+1) { Mostrar Peso [ i ][ j ]; } } for (i = 0 ; i< n ; i = i+1) { for (j = 0 ; j< n ; j = j+1) { cout<< Peso [ i ][ j ]; } } Ejemplo: entero V[5][3] real Peso[5][3] para (i = 0 ; i< 5 ; i = i+1) { para ( j = 0 ; j< 3 ; j = j+1) { Leer V [ i ][ j ]; } }

Muestra los elementos de la matriz V cuyo indice i varia desde 1 hasta M, y j varia desde 1 hasta N. Nota: M y N deben ser conocidos.

En C++: Muestra los elementos de la matriz V cuyo indice i varia desde 0 hasta M-1 y j varia desde 1 hasta N-1. Nota M y N debe ser conocido. Ejemplo: int V[5[13]; double Peso[5][3];

Permite ingresar por teclado los valores para cada elemento del arreglo V: V[0][0], V[0][1], V[0][2], V[1][0] , V[1][1], V[1][2], V[2][0], V[2][1], V[2][2], V[3][0], V[3][1], V[3][2], V[4][1], V[4][2], V[4][3]

for (i = 0 ; i< 5 ; i = i+1) { for ( j = 0 ; j< 3 ; j = j+1) { cin>> V [ i ][ j ]; } } Ejemplo para (i = 1 ; Hasta i<= 5 ; con i=i+1) { para (j = 1;hasta j<= 3 ; con j=j+1) { Mostrar Peso [ i ][ j ]; } }

Permite ingresar por teclado los valores para cada elemento del arreglo V: V[0][0], V[0][1], V[0][2], V[1][0] , V[1][1], V[1][2], V[2][0], V[2][1], V[2][2], V[3][0], V[3][1], V[3][2], V[4][1], V[4][2], V[4][3] Ejemplo Muestra en pantalla los valores almacenados en cada elemento del arreglo: Peso[1][1], Peso[1][2] Peso[1][3], Peso[2][1], Peso[2][2], Peso[2][3] ,Peso[3][1] Peso[3][2], Peso[3][3], Peso[4][1], Peso[4][2] Peso[4][3], Peso[5][1], Peso[5][2], Peso[5][3]

for (i = 0 ; i< 5 ; i = i+1) { for ( j = 0 ; j< 3 ; j = j+1) { cout >> Peso [ i ][ j ]; } }

Muestra en pantalla los valores almacenados en cada elemento del arreglo: Peso[0][0], Peso[0][1] Peso[0][2], Peso[1][0], Peso[1][1], Peso[1][2] ,Peso[2][0] Peso[2][1], Peso[2][2], Peso[3][0], Peso[3][1] Peso[3][2], Peso[4][0], Peso[4][1], Peso[4][2]

D) Operaciones de acceso a los arreglos D1) Recorrido ( barrido o visitado ) .- Procesamiento que permite el acceso a todos y cada uno de los elementos del arreglo bidimensional.. Asi se puede recorrer todo un arreglo bidimensional para los procesos de:

Crear o leer o asignar valores a todos los elementos del arreglo. Mostrar o visualizar en pantalla todos los elementos del arreglo.
Sumar todos los elementos del arreglo. Averiguar por una determinada caracteristica de los elementos del arreglo. Como por ejemplo que numeros de productos y en que almacen tienen inventario.

Ejm: generico de Recorrido : Recorrido del arreglo bidimensional A con M filas y N columnas valores conocidos (ingresados por teclado o
asignados). El algoritmo recorre al arreglo realizando la operacin PROCESO a cada uno de los elementos del arreglo. a) Use estructura repetitiva para.

a) Recorrido usando la estructura repetitiva para

Algoritmo RECORRIDO INICIO


COM: Declaracin de Variables

Programa RECORRIDO C++ {


// Declaracin de Variables

constante entero M = 10, N=6 entero i, j real A [M][N]


COM: Recorrido del Array A

const int M = 10, N=6; int i, j; double A [M][N] ;


// Recorrido del Array A

para ( i= 1 ; hasta M ; i =i+1) { Para (j=1; hasta N;j=j+1) { COM: Visita cada elemento A[i][j] PROCESA a A [ i ][j] } } FIN

for ( i= 0 ; i < M ; i =i+1 ) { for (j=0; j < N ; j=j+1) { // Visita al elemento A[i] PROCESA a A [ i ] [j] } } }

Nota procesa cambia de acuerdo a los requerimientos del problema. Haga clic alli. PROCESA puede ser :

Leer (cin>>) cada elemento del arreglo bidimensional. Mostrar (cout<<) cada elemento del arreglo bidimensional Acumular los elementos A[i][ j ] Si es igual a algun valor contar o mostrar el elemento A[] [j] Calcular el minimo y el maximo valor del arreglo bidimensional A

E) Operaciones entre arreglos Bidimensionales

E1) Sumar Matrices:

Sean las matrices A y B, representadas en matemticas as: :

Observacin: para la suma y resta de matrices, el rango de las matrices A y B deben ser iguales, es decir m xn

A
1 A11 1 2 A21 2 A12 A22

Columnas

B
j
A1j A2j n A1n A2n 1 B11 B21

Columnas 2 B12 B22

j
B1j B2j

n B1n B2n

i
m1 m Ai1 Am-11 Am1 Ai2 Am-12 Am2

Aij
Am-1j Amj

Ain Am-1n Amn

Bi1 Bm-11 Bm1

Bi2 Bm-12 Bm2

Bij
Bm-1j Bmj

Bin Bm-1n Bmn

La matriz suma ser:

S
1 2

Columnas 1 A11+ B11 A21+ A21 2 A12+ B12 A22+ B22 ... ...

j
A1j+ B1j A2j+ B2j ... ...

n A1n+ B1n A2n+ B2n

i m1 m

Ai1+ Bi1 Am-11+ Bm-11 Am1+ Bm1

Ai2+ Bi2 Am-12+ Bm-12 Am2+ Bm2

... ... ...

Aij+Bij
Am-1j+ Bm-1j Amj+ Bmj

.. ... ...

Ain+ Bin Am-1n+ Bm-1n Amn+ Bmn

La instruccin representativa para cada elemento de la matriz suma S, ser: En Matemticas: En algoritmos y en C++ Sij = Aij + Bij S [ i ] [ j ] = A[ i ] [ j ] + B[ i ] [ j ]

Se repite para cada elemento de la matriz S

E2) Restar Matrices:

La matriz Resta ser :

R
1 2

Columnas 1 A11-B11 A21-A21 2 A12-B12 A22-B22

j
A1j-B1j A2j-B2j

n A1n -B1n A2n-B2n

m1 m

Ai1-Bi1 Am-11-Bm-11 Am1-Bm1

Ai2-Bi2 Am-12-Bm-12 Am2-Bm2

Aij-Bij
Am-1j-Bm-1j Amj-Bmj

Ain-Bin Am-1n-Bm-1n Amn-Bmn

La instruccin representativa para cada elemento de la matriz resta R ser: En Matemticas: En algoritmos y en C++ Rij = Aij + Bij R [ i ] [ j ] = A[ i ] [ j ] - B[ i ] [ j ] Se repite para cada elemento de la matriz R

Programas en C++ para sumar y restar arreglos Bidimensionales SUMA ARREGLOS void main() { const int M=4, N=5;
// Declaracin de Variables

RESTA ARREGLOS void main() { const int M=4, N=5;


// Declaracin de Variables

int i; int A[M][N], B[M][N], S[M][N]; ........ // Leer o inicializar Arreglo A ....... // Leer o inicializar Arreglo B
// Recorrido del Array A

int i; int A[M][N], B[M][N], R[M][N]; ........ // Leer o inicializar Arreglo A ....... // Leer o inicializar Arreglo B
// Recorrido del Array A

for ( i= 0 ; i < M ; i =i+1 ) { for (j=0 ; j < N ; j=j+1)

for ( i= 0 ; i < M ; i =i+1 ) { for (j=0 ; j < N ; j=j+1)

{ // suma elemento por elemento S[i] = A [ i ] + B[i] ; } } .... }


// Muestra arreglo S

{ // suma elemento por elemento R[i] = A [ i ] - B[i] ; } } .... }


// Muestra arreglo S

E3) Multiplicar escalar por Matriz:

C
1 2

Columnas 1 k*A11 k*A21 2 k*A12 k*A22

j
k*A1j k*A2j

n k*A1n k*A2n

i
m1 m k*Ai1 k*Am-11 k*Am1 k*Ai2 k*Am-12 k*Am2

k*Aij
k*Am-1 k*Amj

k*Ain k*Am-1n k*Amn

La instruccin representativa para cada elemento de la matriz C, ser : En Matemticas: Cij = k * Aij

En algoritmos y en C++

C [ i ] [ j ] = k * A[ i ] [ j ] Se repite para cada elemento de la matriz C

E4) Multiplicar Matrices:

Las caractersticas de la matriz A y B deben ser : Rango de la matriz A : m x p Rango de la matriz B : p x n Rango de la matriz producto P : m x n

A
1 1 2 A11 A21

Columnas 2 A12 A22

B
k
A1k A2k p A1p A2p 1 2 1 B11 B21

Columnas 2 B12 B22

j
B1J B2J

n B1n B2n

i
m1 m Ai1 Am-11 Ai2 Am-12

*
Aik
Am-1k Aip Am-1p

Bk1 Bp-11

Bk2 Bp-12

Bkj
Bp-1j

Bkn Bp-1n

Am1

Am2

Amk

Amp

Bp1

Bp2

Bpj

Bpn

Aqu : Rij se obtiene multiplicando la fila i de la matriz A por la columna j de la matriz B


Es decir Rij ser En matemticas:

R ij = Ai1*B1j+Ai2*B2j+ ... +Aip*Bpj


R ij = Aik *B kj

Se repite para cada elemento de la matriz P

R
1 2

Columnas 1 R11 R21 2 R12 R22

j
R1j R2j

n R1n R2n

i
m1 m Ri1 Rm-1 1 Ri2 Rm-1 2

Ai1*B1j+Ai2*B2j+...+Aip*Bpj
Rm-1 j

Pin Rm-1 n

Rm 1

Rm 2

Rm

Rm n

La instruccin representativa para cada elemento de la matriz R, ser : R[i][j] =0 para ( k = 1, hasta p, k=k+1) { R [ i ] [ j ] = R [ i ] [ j ] + A[ i ] [ k ] * B[ k ] [ j ] } R [ i ] [ j ] = 0; for ( k = 0; k < p ; k=k+1) { R [ i ] [ j ] = R [ i ] [ j ] + A[ i ] [ k ] * B[ k ] [ j ]; }

En algoritmos

En C++

Esto se repite para cada uno de los elementos de la matriz P: Es decir: i varia desde 1 hasta m, mientras j varia desde 1 hasta n (en algoritmos) i varia desde 0 hasta m-1, mientras j varia desde 0 hasta n-1 (en C++)

Programas en C++ para Multiplicar arreglos Bidimensionales ESCALAR POR MATRIZ void main() { const int M=4, N=5;
// Declaracin de Variables

PRODUCTO DE MATRICES void main() { const int M=4, N=5,P=3;


// Declaracin de Variables

int i; int A[M][N], k, C[M][N]; ........ // Leer o inicializar Arreglo A ....... // Leer o inicializar Arreglo B

int i; int A[M][P], B[P][N], R[M][N]; ........ // Leer o inicializar Arreglo A ....... // Leer o inicializar Arreglo B

// Recorrido del Array A

// Recorrido del Array A

for ( i= 0 ; i < M ; i =i+1 ) { for (j=0 ; j < N ; j=j+1) { // multiplica elemento por elemento C[i][j] = k * A[i][j] ; } } .... // Muestra arreglo S }

for ( i= 0 ; i < M ; i =i+1 ) { for ( j=0 ; j < N ; j=j+1) { R[i][j] = 0; for ( k=0 ; k < P ; k=k+1) {// acumula elemento por elemento R[i][j] = R[i][j] + A[i][k]*B[k][j] ; } } } .... // Muestra arreglo S }

F) Operaciones de suma de filas y columnas de una matriz

F1) Sumar filas - Vector Vertical Columnas 1 A[1][1] A[2][1] 2 A[1][2] A[2][2] ... ... A[1][j] A[2][j]

A
1 2

j
... ...

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

A[i][1]

A[i][2]

...

A[i][j]

..

A[i][n]

V[ i

i
A[m-1][1] m1 m A[m][1] A[m-1][2] Am2 ... ... A[m-1][j] A[m][j] ... ... A[m-1][n] A[m][n]

H[ j ]
STot

Para obtener V[i] que es un acumulador de la toda la fila i, donde j varia de 1 a N (algoritmos) V[i] = 0
for (j=0 ; j < N ; j=j+1) { // multiplica elemento por elemento V[i] = V[i] + A[ i ][ j ] ; } Pero para el calculo del vector V, i varia de 1 a M: for ( i= 0 ; i < M ; i =i+1 ) { V[i] = 0; for (j=0 ; j < N ; j=j+1) { // multiplica elemento por elemento V[i] = V[i] + A[ i ][ j ] ; } }

F2) Sumar Columnas - Vector Horizontal

De manera similar para el calculo de H[j]: Para obtener H[j] que es un acumulador de la toda la columna j, donde i varia de 1 a M (algoritmos)
for ( i=0 ; i < M ; i=i+1) { // acumula elemento por elemento H [ j ] = H [ j ] + A [ i ][ j ] ; } Pero para el calculo del vector V, i varia de 1 a M: for ( j= 0 ; j < N ; j = j+1 ) { H[ j ] = 0; for (i=0 ; i < M ; i= i+1) { // multiplica elemento por elemento H[ j ] = H[ j ] + A [ i ][ j ] ; } }

Programas en C++ Calculos de Vectores Horizontal y vertical a partir de arreglo Bidimensional CALCULO DEL VECTOR VERTICAL void main() { const int M=4, N=5;
// Declaracin de Variables

CALCULO DEL VECTOR HORIZONTAL void main() { const int M=4, N=5;
// Declaracin de Variables

int i; int A[M][N], k, V[M]; ........ // Leer o inicializar Arreglo A ....... // Leer o inicializar Arreglo B
// Recorrido del Array A

int i; int A[M][N], H[N]; ........ // Leer o inicializar Arreglo A ....... // Leer o inicializar Arreglo B
// Recorrido del Array A

for ( i= 0 ; i < M ; i =i+1 ) { V[i] = 0; for (j=0 ; j < N ; j=j+1) { // multiplica elemento por elemento V[i] = V[i] + A[ i ][ j ] ; } } .... // Muestra arreglo V[] } }

for ( j=0 ; j < N ; j=j+1) { H [ j ] = 0; for ( i=0 ; i < M ; i=i+1) {// acumula elemento por elemento H [ j ] = H [ j ] + A [ i ][ j ]; } } } .... // Muestra arreglo H[]

You might also like