You are on page 1of 9

ndice siguiente | anterior |

Programacin 1-2010

Arreglos
Un arreglo es un tipo de datos que contiene varios elementos de un mismo tipo. Cada elemento tiene asociado un ndice, y puede ser tratado como si fuera una variable. La cantidad de elementos que tiene un arreglo es fija, y no puede cambiar durante la ejecucin del programa. La sintaxis para declarar un arreglo es:
{nombre}: Array[{indices}] of {tipo de los elementos} ;

La sintaxis para referirse al elemento de ndice i de un arreglo x es:


x[i]

Por ejemplo, el siguiente programa utiliza un arreglo para guardar cinco notas ingresadas por el usuario y luego calcular el promedio:
1 2 3 4 5 6 7 8 9 10 11 12 program Promedio; var x: Array [1..5] of Integer; begin Write('Ingrese sus cinco notas: '); Read(x[1]); Read(x[2]); Read(x[3]); Read(x[4]); Read(x[5]); WriteLn('Su promedio es ', (x[1] + x[2] + x[3] + x[4] + x[5]) div 5);

13

end.

En este programa, se ha declarado un arreglo de enteros de tamao 5, cuyos elementos estn indexados desde el 1 hasta el 5. El ejemplo podra perfectamente estar escrito usando cinco variables a,
b, c, d y e para guardar las notas. La ventaja de usar arreglos es que se

puede usar ciclos para recorrer todos los elementos. A continuacin reescribiremos el ejemplo para aprovechar esta ventaja. Adems, renombraremos el arreglo como notas, para reflejar mejor su utilidad, y definiremos el nmero de notas como una constante:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 program PromedioCiclo; const nroNotas = 5; var notas: Array[1..nroNotas] of Integer; i: Integer; suma: Integer; begin Write('Ingrese sus ', nroNotas, ' notas: '); for i := 1 to nroNotas do Read(notas[i]); suma := 0; for i := 1 to nroNotas do suma := suma + notas[i]; WriteLn('Su promedio es ', suma div nroNotas); end.

Otra ventaja de usar arreglos es que el mismo programa puede ser utilizado para conjuntos de datos de cualquier tamao sin requerir mayores modificaciones. El programa para promediar cinco notas es exactamente igual al que se usara para promediar treinta notas. Slo basta con modificar el valor de la constante nroNotas.

Como el nmero de elementos de un arreglo est fijo, si queremos guardar un nmero arbitrario de elementos debemos crear un arreglo lo suficientemente grande y llevar la cuenta de cuntos elementos hemos asignado. La siguiente versin de nuestro ejemplo pide al usuario que ingrese un conjunto de notas, y que indique el final de la secuencia ingresando el valor -1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 program PromedioSecuencia; const maxNotas = 100; var notas: Array[1..maxNotas] of Integer; i, n: Integer; suma: Integer; begin WriteLn('Ingrese una secuencia de notas.'); WriteLn('Para terminar, ingrese -1:'); n := 0; repeat n := n + 1; Read(notas[n]); until (notas[n] = -1) or (n = maxNotas); if notas[n] = -1 then n := n - 1; suma := 0; for i := 1 to n do suma := suma + notas[i]; WriteLn('El promedio es ', suma div n); end.

La parte donde se calcula el promedio es igual que en la versin anterior. El cambio est en la parte de la entrada, ya que hay que llevar la cuenta de cuntos datos se ha ingresado, y adems hay que tener cuidado de no pasarse en la capacidad del arreglo. Si el usuario termina

la secuencia con -1, hay que restar uno a la cantidad de elementos, ya que este valor no debe ser considerado para el clculo del promedio. A continuacin, otro ejemplo. El siguiente programa le pide al usuario que ingrese 10 nmeros reales, y a continuacin los escribe en el orden inverso:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 program OrdenInverso; const n = 10; var datos: Array[1..n] of Integer; i: Integer; begin WriteLn('Ingrese ', n, ' valores: '); for i := 1 to n do Read(datos[i]); WriteLn('Los datos en orden inverso son: '); for i := n downto 1 do WriteLn(datos[i]); end.

Generalmente, los ndices son nmeros enteros que van desde uno hasta la capacidad del arreglo. Tambin es posible usar ndices con otros rangos (por ejemplo, partiendo desde cero), e incluso usando otros tipos de datos ordinales. El siguiente ejemplo muestra algunas declaraciones vlidas e invlidas de arreglos:
var {vlidas} a: Array[False..True] of Real; b: Array['a'..'z'] of Real; c: Array[0..9] of Real; d: Array[100..200] of Real; {invlidas} e: Array[1000..1] of Real;

f: Array[2,3,5,7,11] of Real; g: Array[0.5..9.5] of Real;

Arreglos multidimensionales
Un arreglo multidimensional es un arreglo cuyos elementos tienen ms de un ndice. El caso ms simple son los arreglos bidimensionales, que tienen dos ndices, y son tiles para representar datos con formato tabular, como tablas y matrices. Tanto en la declaracin como en el uso del arreglo, los ndices se ponen separados por comas. Por ejemplo, el siguiente cdigo permite ingresar datos numricos en una tabla de 5 3 y luego mostrarla por pantalla:
program LlenarTabla; const nroFilas = 5; nroColumnas = 3; var tabla: Array[1..nroFilas, 1..nroColumnas] of Integer; i, j: Integer; begin {llenar} for i := 1 to nroFilas do for j := 1 to nroColumnas do Read(tabla[i, j]); {mostrar} for i := 1 to nroFilas do begin for j := 1 to nroColumnas do Write(tabla[i, j], ' '); WriteLn;

end; end.

Inicializacin de arreglos
A veces un programa necesita tener un arreglo cuyos valores estn dados de antemano, por lo que no corresponde que los ingrese el usuario. Para estos casos, es posible inicializar el arreglo durante la declaracin. Por ejemplo, la siguiente declaracion inicializa un arreglo con la cantidad de das que tienen los meses del ao:
var diasMes: Array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

Tambin se puede hacer lo mismo con un arreglo multidimensional:


var matriz: Array[1..3, 1..3] of Integer = (( 5, 1, 4), (-1, 0, 7), ( 3, -2, -9));

Ejemplos vistos en clases


Estos son los programas desarrollados en la clase del lunes 3 de mayo. Recuerden que ms importante que el cdigo final es entender el proceso para entender el problema y disear la solucin, que fue lo que hicimos en la clase. Clculo de la desviacin estndar:
1 2 program DesviacionEstandar;

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

const maxDatos = 100; var x: Array [1..maxDatos] of Real; n: integer; i: Integer; suma, promedio, sumaCuadrados, desviacion: Real; begin {entrada} Write('Cuantos datos va a ingresar? '); Read(n); if n > maxDatos then n := maxDatos; for i := 1 to n do begin Write('Dato ', i, ': '); Read(x[i]) end; {calculo del promedio} suma := 0.0; for i := 1 to n do suma := suma + x[i]; promedio := suma / n; {calculo de la suma de cuadrados de las diferencias} sumaCuadrados := 0.0; for i := 1 to n do sumaCuadrados := sumaCuadrados + Sqr(x[i] - promedio); {calculo de la desviacion estandar} desviacion := Sqrt(sumaCuadrados / n); {salida} WriteLn('La desviacion estandar es ', desviacion:5:2); end.

Determinacin de la moda:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

program ModaDatos; const maxDatos = 100; var x: Array [1..maxDatos] of Real; cuenta: Array[1..maxDatos] of Integer; n: Integer; i, j: Integer; cuentaMayor, indiceMayor: Integer; moda: Real; begin {entrada} Write('Cuantos datos va a ingresar? '); Read(n); if n > maxDatos then n := maxDatos; for i := 1 to n do begin Write('Dato ', i, ': '); Read(x[i]) end; {llenar el arreglo "cuenta" con las frecuencias parciales} for i := 1 to n do begin cuenta[i] := 1; {ver si x[i] ya ha aparecido antes} for j := i - 1 downto 1 do if x[j] = x[i] then begin cuenta[i] := cuenta[j] + 1; break; end; end; {buscar la cuenta mayor y su indice} cuentaMayor := 0; indiceMayor := 0; for i := 1 to n do

41 42 43 44 45 46 47 48 49 50 51 end.

if cuenta[i] > cuentaMayor then begin cuentaMayor := cuenta[i]; indiceMayor := i; end; {determinar la moda} moda := x[indiceMayor]; {salida} WriteLn('La moda es ', moda:5:2);

ndice siguiente | anterior |

Programacin 1-2010
Bonvallet usando Sphinx 0.6.6.

Contenido bajo licencia Creative Commons BY-NC-SA creado por Roberto

You might also like