Inf 1141 Unidad 6 Arreglos Abiertos Sem 2 2015

Post on 30-Jan-2016

227 views 0 download

description

Arreglos Abiertos

Transcript of Inf 1141 Unidad 6 Arreglos Abiertos Sem 2 2015

FUNDAMENTOS DE ALGORITMOS

INF 1141

UNIDAD 6: CARACTERÍSTICAS AVANZADAS DE ARREGLOS EN SL

l.griffiths.m@gmail.com

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