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

Arreglos y Subrangos

Programacin 1
InCo - FING

Contents
1 Tipo subrango

1.1

Subrangos de enteros . . . . . . . . . . . . . . . . . . . . . . . . .

1.2

Subrangos de caracteres . . . . . . . . . . . . . . . . . . . . . . .

1.3

Operaciones con subrangos . . . . . . . . . . . . . . . . . . . . .

1.4

Subrangos en general . . . . . . . . . . . . . . . . . . . . . . . . .

2 Arreglos

2.1

Tipos estructurados . . . . . . . . . . . . . . . . . . . . . . . . .

2.2

Motivacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3

Declaracin de un arreglo . . . . . . . . . . . . . . . . . . . . . .

2.4

Ejemplos de arreglos . . . . . . . . . . . . . . . . . . . . . . . . .

2.5

Tipos Annimos . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.6

Representacin de un arreglo en la memoria . . . . . . . . . . . .

2.7

Accediendo un arreglo . . . . . . . . . . . . . . . . . . . . . . . .

2.8

Inicializacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.9

Recorridas de arreglos . . . . . . . . . . . . . . . . . . . . . . . .

2.10 Bsqueda en un arreglo . . . . . . . . . . . . . . . . . . . . . . .

2.11 Bsqueda (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.12 Bsqueda (3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.13 Bsqueda (4) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.14 Evaluacin de booleanos . . . . . . . . . . . . . . . . . . . . . . .

2.15 Booleanos con circuito corto . . . . . . . . . . . . . . . . . . . . .

2.16 Bsqueda con circuito corto . . . . . . . . . . . . . . . . . . . . .

2.17 Bsqueda (5) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.18 Bsqueda (6) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.19 Bsqueda contextual . . . . . . . . . . . . . . . . . . . . . . . . .

10

2.20 Otro ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

2.21 Arreglos Multidimensionales . . . . . . . . . . . . . . . . . . . . .

10

Tipo subrango

1.1

Subrangos de enteros

Se puede restringir el tipo de los enteros de forma de acotar los valores en un


rango especificado:
type
(* tipos definidos por el programador *)
natural
= 0..MaxInt;
decimal
= 0..9;
mes
= 1..12;
dia
= 1..31;
otro
= 1000..13890;

1.2

Subrangos de caracteres
type
letra = A..Z;
digito = 0..9;
decimal
= 0..9;

Los subrangos de caracteres se basan en el orden predefinido en el tipo


CHAR (en Free Pascal la tabla ASCII).
Notar la diferencia entre los tipos digito y decimal

1.3

Operaciones con subrangos

Constantes, expresiones, variables de un tipo subrango se comportan como


el tipo base que lo contiene.
Si una variable de un tipo subrango toma un valor fuera del rango especificado se produce un error en tiempo de ejecucin.
El compilador Free Pascal requiere ser configurado para que se haga
la verificacin de rango.
Puede dar un error de compilacin si es posible advertir una violacin del
rango.

1.4

Subrangos en general

La declaracin de un tipo subrango tiene esta forma:


type identificador = C1 .. C2;
donde C1 y C2 deben ser constantes del mismo tipo ordinal.
Es posible definir subrangos de cualquier tipo ordinal:
integer, char, boolean, enumerado
(Tipos enumerados se ven ms adelante)
(A los tipos ordinales tambin se les llama escalares)

Arreglos

2.1

Tipos estructurados

Cada elemento del tipo est formado por un conjunto de valores (una estructura)
Tipos estructurados de Pascal:
Arreglos (array)
Registros (record)
Conjuntos (set)

2.2

Motivacin

Almacenar un conjunto de valores bajo un mismo nombre de variable.


Cada uno de los valores se puede acceder independientemente utilizando
un ndice (generalmente un subrango)
Est inspirado en la notacin habitual en matemticas para secuencias
finitas:
a1 , a2 , ..., an
donde a sera el nombre genrico de todos los valores y el subndice es
utilizado para identificar un valor en particular.

2.3

Declaracin de un arreglo

Los tipos arreglo se declaran en la seccin type del programa:


type nombre = array [tipo_indice] of tipo_base;
donde:
tipo_indice debe ser un tipo ordinal, generalmente es un subrango de
enteros.
tipo_base es cualquier tipo de Pascal.

2.4

Ejemplos de arreglos

type
rango = 33..90;
arr1 = array [char] of integer; (* 256 celdas *)
arr2 = array [33..90] of real;
arr3 = array [integer] of char; (* demasiado grande! *)
arr4 = array [0..9] of arr3;(* matriz *)
arr5 = array [rango] of boolean;

2.5

Tipos Annimos

Son tipos que se utilizan sin asignarles un nombre.

type
(* indice anonimo *)
arreglo = array [0..9] of real;
var
(* arreglo anonimo *)
a : array [A..Z] of boolean;
Los tipos annimos se utilizan comnmente cuando un tipo slo aparece una vez.

2.6

Representacin de un arreglo en la memoria

Un arreglo ocupa tantas celdas de memoria como el cardinal de su tipo ndice:


const
MaxArreglo = 9;
type
RangoArreglo = 1..MaxArreglo;
Arreglo1
= array [RangoArreglo] of integer;
var
a : Arreglo1; (* ocupa 9 celdas *)
La variable a ocupa 9 celdas:
*------*------*------*------*-----*-----*-----*-----*-----*
| 23 | 34 | 0
| -12 | 6 | 9 | 11 | -2 | 34 |
*------*------*------*------*-----*-----*-----*-----*-----*
1
2
3
4
5
6
7
8
9

2.7

Accediendo un arreglo

Cada celda del arreglo se puede acceder como una variable independiente.
Suponemos a del tipo array [1..10] of integer
(* asignaciones *)
a[1]:= 12;
a[10]:= 90;
....
a[i]:= i+1; (* i en el intervalo [1,10]
*)
a[i+4]:= 20; (* i+4 en el intervalo [1,10] *)
a[200]:= 23; (* error, fuera de rango *)
a:= 0;

(* error *)

2.8

Inicializacin

Para inicializar un arreglo es necesario asignar cada celda por separado:


(* todas las celdas en cero *)
for i:= 1 to 10 do
a[i]:= 0;
(* 2,4,6,...,20 *)
for i:= 1 to 10 do
a[i]:= 2 * i;
(* desde la entrada *)
for i:= 1 to 10 do
ReadLn(a[i]);

2.9

Recorridas de arreglos

La estructura de control for es la adecuada para recorrer completamente un


arreglo
(* hallar la suma de todos los elementos *)
suma:= 0;
for i:= 1 to M do
suma:= suma + a[i];
(* hallar el maximo *)
max:= a[1];
for i:= 2 to M do
if a[i] > max then
max:= a[i];
(* desplegar un arreglo *)
for i:= 1 to M do
WriteLn(a[i]);
(* desplegar separados por comas *)
write(a[1]);
for i:= 2 to M do
write(,,a[i]);

2.10

Bsqueda en un arreglo

Buscar un elemento que sea igual a X.


i:= 1;
repeat
exito:= (a[i] = X);
i:= i+1;
until (i > M) or exito;

if exito then
WriteLn(exito)
else
WriteLn(fracaso)

2.11

Bsqueda (2)

Usando while
i:= 1;
exito:= false;
while (i<=M) and not exito do
begin
exito:= (a[i] = X);
i:= i+1;
end;
if exito then
WriteLn(exito)
else
WriteLn(fracaso)

2.12

Bsqueda (3)

No es correcto utilizar for (aunque anda).


(* INCORRECTO! *)
exito:= false;
for i:= 1 to M do
if (a[i] = X) then
exito:= true;
if exito then
WriteLn(exito)
else
WriteLn(fracaso)

2.13

Bsqueda (4)

Por qu usar la bandera exito?

exito:= false;
while (i<=M) and not exito do
begin
exito:= (a[i] = X);
i:= i+1;
end;
Se podra escribir directo la condicin
(i <= M) and (a[i] <> X) ?
Respuesta: Depende de cmo se evalen las expresiones booleanas.

2.14

Evaluacin de booleanos

Pascal estndar: Circuito completo


Para evaluar (E1 and E2)
1. Se evala E1. Sea v1 su valor.
2. Se evala E2. Sea v2 su valor.
3. Se evala (v1 and v2).
Anlogamente para el or.

2.15

Booleanos con circuito corto

Free Pascal con circuito corto:


Para evaluar (E1 and E2)
1.
2.
3.
4.

Se evala E1. Sea v1 su valor.


Si v1 es false no se evala E2 y el resultado es false.
Si v1 es true se evala E2. Sea v2 su valor.
El resultado es v2.

Anlogamente para la evaluacin del or.


La mayora de los lenguajes de programacin evalan por circuito corto.

2.16

Bsqueda con circuito corto

En este curso consideramos que disponemos de evaluacin de expresiones


booleanas por circuito corto.

i:= 1;
(* circuito corto *)
while (i <= M) and (a[i] <> A) do
i:= i+1;
if i<=M then
WriteLn(exito)
else
WriteLn(fracaso);
Free Pascal evala siempre con circuito corto.
Cuando i toma el valor M+1, no se accede a a[i]

2.17

Bsqueda (5)

El siguiente cdigo funciona an sin circuito corto (por qu?):


i:=1;
while (i < M) and (a[i]<>A) do
i:= i+1;
if a[i] = A then
WriteLn(exito)
else
WriteLn(fracaso)

2.18

Bsqueda (6)

El siguiente cdigo no funciona an con circuito corto (por qu?).


(* INCORRECTO! *)
i:= 1;
while (a[i] <> A) AND (i<=M) do
i:= i+1;
if i <= M then
WriteLn(exito)
else
WriteLn(fracaso);

2.19

Bsqueda contextual

Encontrar un elemento tal que el inmediato siguiente sea A.


i:=1;
(* circuito corto *)
while (i < M) and (a[i+1] <> A) do
i:= i+1;
if i < M then
WriteLn(exito: , a[i])
else
WriteLn(fracaso)

2.20

Otro ejemplo

Verificar si todos los elementos son pares.


i:=1;
(* circuito corto *)
while (i <= M) and (a[i] mod 2 = 0) do
i:= i+1;
if i > M then
WriteLn(Son todos pares)
else
WriteLn(No todos son pares);
La solucin con for es incorrecta.

2.21

Arreglos Multidimensionales

Pueden considerarse como arreglos de arreglos o como arreglos con un ndice


mltiple:
type
nombre = array [1..20, 1..15] of char;
datos = array [0..9, 1..10] of integer;
tabla = array [-10..10, 1..15] of char;
Para acceder a una celda de un arreglo a bidimensional se utiliza alguna de las
siguientes formas:

10

a[i][j]
a[i,j]
La segunda es la ms utilizada.
Mas sobre arreglos multidimensionales: Seccin 9.3 de Konvalina*

11

Вам также может понравиться