inf 1141 unidad 6 arreglos abiertos sem 2 2015
DESCRIPTION
Arreglos AbiertosTRANSCRIPT
FUNDAMENTOS DE ALGORITMOS
INF 1141
UNIDAD 6: CARACTERÍSTICAS AVANZADAS DE ARREGLOS EN SL
2º Semestre 2015
Fundamentos de Algoritmos
¿Qué aprenderemos hoy?
Fundamentos de Algoritmos
1. Características avanzadas de los arreglos en SL
1. Arreglos Abiertos 2. Inicialización de Arreglos 3. Asignación de Arreglos
Fundamentos de Algoritmos
ARREGLOS ABIERTOS
Arreglos Dinámicos/Abiertos
Fundamentos de Algoritmos
Existen PROBLEMAS de la vida real en los que
NO es posible conocer o NO es conveniente establecer la
cantidad máxima de elementos que se almacenaran en un
arreglo en TIEMPO DE COMPILACIÓN
el valor máximo del número de elementos de un arreglo varía de
en el tiempo
Ejemplo
Fundamentos de Algoritmos
• Se desea almacenar las temperaturas máximas registradas en un período de n
días en la ciudad de Valparaíso, para luego determinar cual fue el promedio de temperaturas máximas durante ese período de días.
¿Cómo se declara un
Arreglo Abierto Unidimensional en SL?
Fundamentos de Algoritmos
• Para la declaración de un arreglo abierto unidimensional en vez del indicar el
tamaño físico escribimos un asterisco para indicar que ese valor aún no es conocido.
EJEMPLOS
A: vector [*] cadena
B: vector [*] numerico
C: vector [*] logico
¿Cómo dimensionamos en tiempo de ejecución el
tamaño del arreglo?
Fundamentos de Algoritmos
• Utilizando la subrutina predefinida dim() la que permite asignar la memoria
necesaria a un arreglo creado dinamicamente. Su prototipo es : dim(NombreArreglo,Dim1,Dim2,...DimN) EJEMPLO: B: vector [*] numerico leer (n) dim (B, n)
Veamos un Ejemplo
Fundamentos de Algoritmos
programa ejemplo var temperaturas : vector [*] numerico n : numerico inicio cls() repetir imprimir("Ingrese número de días : ") leer(n) hasta (n>0) dim(temperaturas , n) leerArreglo(temperaturas , n) imprimir(promedio (temperaturas , n) ) fin
Fundamentos de Algoritmos
sub leerArreglo (ref A:vector [*] numerico; max:numerico) var i:numerico inicio desde i=1 hasta max { imprimir("Ingrese temperatura día ",i," : ") leer(A[i]) } fin
sub promedio (A:vector [*] numerico; max:numerico) retorna numerico var i, suma, prom :numerico inicio suma=0 desde i=1 hasta max { suma=suma+A[i] } prom=suma/max retorna (prom) fin
¿Cómo se declara un
Arreglo Abierto Bidimensional en SL?
Fundamentos de Algoritmos
• Para la declaración de un arreglo abierto bidimensional en vez del indicar el
tamaño físico fila y columna escribimos un asterisco en su reemplazo para indicar que ese valor aún no es conocido.
EJEMPLOS
A: matriz [*,*] cadena
B: matriz [*,*] numerico
C: matriz [*,*] logico
¿Cómo dimensionamos en tiempo de ejecución el
tamaño del arreglo?
Fundamentos de Algoritmos
• Utilizando la subrutina predefinida dim() la que permite asignar la memoria
necesaria a un arreglo creado dinamicamente. Su prototipo es : dim(NombreArreglo,Dim1,Dim2,...DimN) EJEMPLO: B: matriz [*,*] numerico leer (m,n) dim (B, m,n)
Veamos un Ejemplo
Fundamentos de Algoritmos
programa ejemplo var A:matriz [*,*] numerico dimFila, dimCol :numerico inicio cls() repetir imprimir("Ingrese N° de filas de la Matriz : ") leer(dimFila) hasta (dimFila > 0) repetir imprimir("Ingrese N° de columnas de la Matriz : ") leer(dimCol) hasta (dimCol > 0) dim(A, dimFila, dimCol) leerMatriz (A, dimFila, dimCol) mostrarMatriz (A, dimFila, dimCol) fin
Fundamentos de Algoritmos
sub leerMatriz (ref A: matriz [*,*] numerico; dF, dC:numerico) var i, j:numerico inicio desde i=1 hasta dF { desde j=1 hasta dC { imprimir("Ingrese Numero Posicion ",i,",",j," : ") leer(A[i,j]) } } fin
Fundamentos de Algoritmos
sub mostrarMatriz (A:matriz [*,*] numerico; dF, dC:numerico) var i,j:numerico inicio desde i=1 hasta dF { desde j=1 hasta dC { imprimir(A[i,j]," ") } imprimir("\n") } fin
Fundamentos de Algoritmos
Inicialización de arreglos en SL
Ejemplo
Fundamentos de Algoritmos
• Se desea registrar la temperatura promedio entre enero y diciembre del año
2014 en la ciudad de Valparaíso. Al solicitar los datos de entrada queremos indicarle al usuario el nombre de cada mes.
¿Cómo inicializamos un arreglo en SL?
Fundamentos de Algoritmos
Veamos unos Ejemplos: var topeMeses : vector [12] numerico mesesAño : vector [12] cadena A: matriz [5, 3] numerico inicio topeMeses = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} mesesAño = {“enero”, “febrero”, “marzo”, “abril”, “mayo”, “junio”, “julio”, ”agosto”, ”septiembre”, ”octubre”, ”noviembre”, “diciembre”} A = { {1,2,3}, {4,5,6}, {7,8,9},{10,11,12},{13,14, 15} } :
Veamos un Ejemplo
Fundamentos de Algoritmos
programa ejemplo const MESES=12 var mesesAño: vector [MESES] cadena temperaturas: vector [MESES] numerico inicio cls() mesesAño = { “enero”, “febrero”, “marzo”, “abril”, “mayo”, “junio”, “julio”, ”agosto”, ”septiembre”, ”octubre”, ”noviembre”, “diciembre”} leerArreglo(temperaturas, mesesAño, MESES) fin
Veamos un Ejemplo
Fundamentos de Algoritmos
sub leerArreglo(ref A: vector [MESES] numerico; B: vector [MESES] cadena; m: numerico) var i:numerico inicio desde i=1 hasta m { imprimir(“Ingrese temperatura promedio de “,B[i],” 2014 : “) leer(A[i]) } fin
Fundamentos de Algoritmos
COPIA DE ARREGLOS EN SL
¿Cómo le asignamos el contenido de un arreglo en
SL a otro ?
Fundamentos de Algoritmos
Veamos unos Ejemplos: var mat1: matriz [5, 3] numerico mat2: matriz [*,*] numerico vec1: vector [3] numerico vec2: vector [*] numerico inicio mat1 = { {1,3,5},{2,4,6},{7, 8, 9},{10, 11,12},{ 13,14, 15}} mat2 = mat1 //se asignan todos los elementos de mat1 a mat2 vec1 = mat1 [2] // vec1 = {2, 4, 6} vec2 = mat1 [3] // vec2 = {7, 8, 9} vec2 = vec1 // vec2 = {2, 4, 6} :
Veamos un Ejemplo
Fundamentos de Algoritmos
programa ejemplo var A: matriz [5, 3] numerico V1: vector [3] numerico V2: vector [*] numerico //ABIERTO inicio cls() A = { {1,3,5},{2,4,6},{7, 8, 9},{10, 11,12},{ 13,14, 15}} V1 = Matriz [2] // {2, 4, 6} V2 = V1 // {2, 4, 6} mostrarArreglo(V1,3) mostrarArreglo(V2,3) fin
Fundamentos de Algoritmos
sub mostrarArreglo(A:vector [*] numerico; m:numerico) var i:numerico inicio imprimir("---------------------------------------------\n") imprimir("Arreglo = ") desde i=1 hasta m { imprimir(A[i]," ") } fin
INVESTIGUE
Fundamentos de Algoritmos
1. ¿Se puede obtener la cantidad de elementos de un arreglo con ALGUNA función?
2. ¿Puede un arreglo abierto volver al estado “no inicializado”?
3. ¿Es posible en una matriz que las filas tengan longitudes diferentes unas de otras?
Fundamentos de Algoritmos
La pequeña Lisa va frecuentemente a visitar a su abuelo Abraham. El abuelo tiene un gran jardín, que puede ser representado como un rectángulo de tamaño 1 × n, cuando se mira desde arriba. Este rectángulo está dividido en n secciones cuadradas iguales. El jardín es muy inusual, ya que cada una de las secciones cuadradas posee su propia altura y gracias a un novedoso sistema de riego el abuelo de Lisa puede crear lluvia artificial sobre cada sección. Pero crear lluvia artificial es una operación muy costosa. Por lo anterior, el abuelo de Lisa debe limitarse a crear lluvia sobre solo una sección, para que el agua de la sección seleccionada fluya a las secciones vecinas si su altura no supera la altura de dicha sección.
Fundamentos de Algoritmos
Por ejemplo: El jardín puede ser representado por un rectángulo de tamaño 1 × 5, donde las alturas de cada sección son 4, 2, 3, 3, 2. Entonces, si el abuelo de Lisa crea lluvia artificial sobre cualquiera de las secciones en la que la altura es 3, el agua fluirá a través de todas las secciones, excepto las que tiene altura 4. Lisa está decidida a encontrar una sección tal que si su abuelo crea lluvia artificial sobre ella, el número de secciones regadas sea la máxima. ¡Ayúdela a determinar el número máximo de secciones que es posible regar al seleccionar alguna sección!, escriba un programa en SL que resuelva el problema de Lisa.
¿ Cómo resolvería Usted este problema ?
FUNDAMENTOS DE PROGRAMACIÓN