AnteriorPosterior

12. Contacto con los arrays

Por: Nacho Cabanes
Actualizado: 07-07-2019 20:15
Tiempo de lectura estimado: 8 min.

 

Versión en video (12:30 min):

Pascal

12. Arrays

12.1. Arrays de una dimensión

Manejar datos repetitivos con lo que que conocemos hasta ahora puede resultar muy tedioso. Por ejemplo, incluso si tenemos sólo 5 datos, un programa que pida esos 5 datos y los muestre en orden inverso sería algo como

program EjemploSinArrays;

var
  dato1, dato2, dato3, dato4, dato5: integer;

begin
  write('Dime el dato 1: ');
  readln(dato1);
  write('Dime el dato 2: ');
  readln(dato2);
  write('Dime el dato 3: ');
  readln(dato3);
  write('Dime el dato 4: ');
  readln(dato4);
  write('Dime el dato 5: ');
  readln(dato5);

  write('Los datos al reves: ');
  write(dato5, ' ', dato4, ' ', dato3, ' ', dato2, ' ', dato1);
end.

Es terriblemente repetitivo, a pesar de que son sólo 5 datos. Si se tratara de 100 datos, o de 1000, o de más aún, sería totalmente impensable plantearlo así.

Como alternativa, podemos crear un único bloque de datos, un "array" (o vector, o matriz, que algunos autores traducen como "arreglo"), formado por 5 (o más) datos del mismo tipo:

var
  datos: array[1..5] of integer;

En este caso, nuestro array va a contener números enteros ("array of integer"), en concreto 5 datos, que irán desde la posición 1 hasta la 5 ("[1..5]"). También podríamos empezar a contar desde 0 (habitual en otros lenguajes, como C y sus derivados) o tener valores inferior y superior "menos naturales" pero que parecieran adecuados para un problema concreto, como "[10..20]".

En este caso, podríamos pedir el primer dato al usuario con

write('Dime el dato 1: ');
readln(dato[1]);

Pero la ganancia real de usar arrays llega cuando empleamos un bucle "for" para mostrar los datos:

for i := 1 to 5 do
begin
  write('Dime el dato ', i, ': ');
  readln(datos[i]);
end;

(En cuanto al nombre, hay quien prefiere usar nombres en plural, por eso de que es un "conjunto de datos", mientras que hay quien prefiere un nombre en singular porque le resulta más natural que "dato[1]" sea el primero de los datos).

Para mostrar los datos al revés usaríamos un "for" descendente:

write('Los datos al reves son: ');
for i := 5 downto 1 do
  write(datos[i], ' ');

De modo que el programa completo quedaría:

program EjemploConArrays;

var
  i: integer;
  datos: array[1..5] of integer;

begin
  for i := 1 to 5 do
  begin
    write('Dime el dato ', i, ': ');
    readln(datos[i]);
  end;

  write('Los datos al reves son: ');
  for i := 5 downto 1 do
    write(datos[i], ' ');
end.

Insisto: lo importante no es sólo que ESTE programa concreto sea algo más corto que el programa anterior, sino que sería casi idéntico en el caso de 100 datos, o de 1000 datos, que serían imposibles de hacer de forma "artesanal".

Hay muchas operaciones habituales. En la próxima entrega veremos cómo hallar el máximo o el mínimo, como buscar un cierto elemento, etc. Pero vamos a pensar ya cómo se podrían sumar los elementos de un array.

La idea básica es recorrer todos los elementos con un "for", acumulando sus valores en una variable que, por ejemplo, se podría llamar "suma":

  for i := 1 to 5 do
    suma := suma + datos[i];
end.

Un detalle importante adicional es que debemos recordar dar un valor inicial a esa variable. De lo contrario, puede ocurrir que obtengamos un error de compilación, o peor aún, que si valor inicial sea "basura", lo que hubiera en la posición de memoria que le asigne el compilador, lo que daría lugar a resultados inesperados (e incorrectos):

suma := 0;
for i := 1 to 5 do
  suma := suma + datos[i];
write(suma);

De modo que el programa completo sería:

program SumaDeArray;

var
  i, suma: integer;
  datos: array[1..5] of integer;

begin
  for i := 1 to 5 do
  begin
    write('Dime el dato ', i, ': ');
    readln(datos[i]);
  end;

  write('Su suma es: ');
  suma := 0;
  for i := 1 to 5 do
    suma := suma + datos[i];
  write(suma);
end.

Ej.12.01: Crea un programa que reserve espacio para un Array de 3 números enteros, que asigne a sus elementos los valores 3, 5 y 8, y que después muestre en pantalla la suma de los valores de sus 3 elementos.

Ej.12.02: Crea un programa que pida al usuario cinco números enteros, los guarde en un array y luego muestre el primero y el último.

Ej.12.03: Crea un programa que pida al usuario diez números enteros, los guarde en un array y luego muestre los que se encuentran en posiciones impares (1, 3, 5, 7, 9).

Ej.12.04: Crea un programa que pida al usuario diez números enteros, los guarde en un array y luego muestre los que son impares.

Ej.12.05: Crea un programa que sume dos vectores, cuyos componentes indicará el usuario. Por ejemplo, la suma de (1,2,3) y (7,11,-1) sería (8,13,2).

Ej.12.06: Crea un programa que halle el producto escalar dos vectores, cuyos componentes indicará el usuario.

656 visitas desde el 07-07-2019

AnteriorPosterior