Professional Documents
Culture Documents
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
38 39
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?
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
Estndar
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 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
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
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
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
Ejm: Estados (libre u ocupado) de las 10 aulas en cada uno de los 4 pisos de los 5 pabellones. Tamao 10x4x5
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 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.
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.
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];
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.
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.
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.
talla[2] = 1.56;
nombre[2] = "Andre Fernandez G." Asigna Andre Fernandez G. al elemento de indice 2 del arreglo nombre
vocales[3] = 'E';
CopiaCadena(Apell[2], "Garcia") Asigna el apellido Garcia al elemento de indice 2 del arreglo Apell.
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
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]
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.
Algoritmo RECORRIDO
INICIO
COM: Declaracin de Variables
{
// Declaracin de Variables
LI = 1 LS = 20;
COM Inicializa el contador
LI = 0 ; LS = 19;
// Inicializa 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[]
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.
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.
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 */
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
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.
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 :
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]
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]
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.
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
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.
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.
if (A [ i ] == ElemB )
} FIN
} }
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();
FIN
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
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
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
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]
.......
.......
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
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]
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 }
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
3 1
4 2
7 3
-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
Programas en algoritmos y en C++ para la mezcla de los vectores A y B, se obtiene el vector mezcla C
PROGRAMA C++
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
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
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.
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
16 40 56
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.
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
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.
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
3 4
4 5
01 12
Los indices en psuedocodigo y en C++
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
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:
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.
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}, ...., {.....} }
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
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}};
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
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}} ;
Rpta [2][5] = 'c' Asigna 'c' al elemento de la fila 2 y columna 5 del arreglo Rpta
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
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]
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.
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
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
j
B1j B2j
n B1n B2n
i
m1 m Ai1 Am-11 Am1 Ai2 Am-12 Am2
Aij
Am-1j Amj
Bij
Bm-1j Bmj
S
1 2
Columnas 1 A11+ B11 A21+ A21 2 A12+ B12 A22+ B22 ... ...
j
A1j+ B1j A2j+ B2j ... ...
i m1 m
Aij+Bij
Am-1j+ Bm-1j Amj+ Bmj
.. ... ...
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 ]
R
1 2
j
A1j-B1j A2j-B2j
m1 m
Aij-Bij
Am-1j-Bm-1j Amj-Bmj
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
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
C
1 2
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
La instruccin representativa para cada elemento de la matriz C, ser : En Matemticas: Cij = k * Aij
En algoritmos y en C++
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
B
k
A1k A2k p A1p A2p 1 2 1 B11 B21
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
R
1 2
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
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
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 }
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 ] ; } }
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[]