14 - Vectores estáticos: paralelos

Este concepto se da cuando hay una relación entre las componentes de igual subíndice (misma posición) de un vector y otro.

Ejemplo:

vectores paralelos Delphi/Pascal

Si tenemos dos vectores de 5 elementos cada uno. En uno se almacenan los nombres de personas en el otro las edades de dichas personas.
Decimos que el vector Nombres es paralelo al vector Edades si en la componente 1 de cada vector se almacena información relacionada a una persona (Juan - 12 años).

Es decir hay una relación entre cada componente de los dos vectores.

Esta relación la conoce únicamente el programador y se hace para facilitar el desarrollo de algoritmos que procesen los datos almacenados en las estructuras de datos.

Si quiero imprimir el nombre y edad de Laura imprimo:

WriteLn (Nombres[5]);
WriteLn (Edades[5]);

La cantidad de vectores paralelos pueden ser más de 2.

Nombres - Edades - Sueldos

Problema 1

Desarrollar un programa que permita cargar 5 nombres de personas y sus edades respectivas. Luego de realizar la carga por teclado de todos los datos imprimir los nombres de las personas mayores de edad (mayores o iguales a 21 años).

Diagrama de flujo:

diagrama flujo vectores paralelos pascal/delphi

Con la primera estructura repetitiva hacemos la carga de los nombres y edades de las personas.
Es conveniente realizar la carga en un mismo for, esto debido que al operador le será más fácil cargar el nombre de la persona y seguidamente la edad de la misma. Sería mucho más engorroso realizar la carga de todos los nombres y luego de todas las edades teniendo en cuenta que hay una relación entre cada componente de los vectores.

Cuando imprimimos analizamos cada componente del vector Edades y si verificamos que si su contenido es mayor o igual a 21 imprimimos dicha componente que está en la misma posición (f) en el vector paralelo Nombres.

Proyecto65

program Proyecto65;

{$APPTYPE CONSOLE}

{$R *.res}

type
  TNombres = array[1..5] of String;
  TEdades = array[1..5] of Integer;

var
  Nombres: TNombres;
  Edades: TEdades;
  f: Integer;

begin
 for f:=1 to 5 do
  begin
    Write('Ingrese Nombre:');
    ReadLn(Nombres[f]);
    Write('Ingrese Edad:');
    ReadLn(Edades[f]);
    WriteLn;
  end;
  WriteLn('Personas Mayores de Edad');
  WriteLn('-------- ------- -- ----');
  for f:=1 to 5 do
  begin
    if Edades[f] >= 21 then
    begin
      WriteLn(Nombres[f]);
    end;
  end;
  ReadLn;
end.

El WriteLn vacío dentro del primer for tiene por objetivo dejar una línea en blanco en pantalla para una carga de datos más ordenada (es opcional el WriteLn).

Debemos declarar dos tipos de datos distintos TNombres y TEdades porque a pesar que los dos vectores tienen el mismo tamaño son de distinto tipo, uno Integer y otro String.

En el primer for se hace la carga de los 5 nombres y sus respectivas edades. En el segundo for se analiza cada edad para ver si es mayor de edad, en caso de resultar verdadero imprimimos la componente del vector Nombres de la misma posición de Edades[f].

Problemas propuestos

  • Ingresar el nombre de 5 productos en un vector de tipo String y sus respectivos precios en un vector paralelo de tipo Double.
    Mostrar cuantos productos tienen un precio mayor al primer producto ingresado (se debe contar)
  • En un curso de 4 alumnos se registraron las notas de sus exámenes y se deben procesar de acuerdo a lo siguiente:
    a) Ingresar Nombre y Nota de cada alumno (almacenar los datos en estructuras paralelas)
    b) Realizar un listado que muestre los nombres, notas y condición del alumno. En la condición, colocar "Muy Bueno" si la nota es mayor o igual a 8, "Bueno" si la nota está entre 4 y 7, y colocar "Insuficiente" si la nota es inferior a 4.
    c) Imprimir cuantos alumnos tienen la leyenda “Muy Bueno”.
Solución
program Proyecto66;

{$APPTYPE CONSOLE}

type
  TProductos = array[1..5] of String;
  TPrecios = array[1..5] of Double;

var
  Productos: TProductos;
  Precios: TPrecios;
  f: Integer;
  cant: Integer;

begin
  for f:=1 to 5 do
  begin
    Write('Ingrese el nombre del producto:');
    ReadLn(productos[f]);
    Write('Ingrese el precio del producto:');
    ReadLn(precios[f]);
  end;
  cant := 0;
  for f:=2 to 5 do
  begin
    if productos[f] > productos[1] then
    begin
      cant := cant + 1;
    end;
  end;
  WriteLn('Cantidad de productos con un precio mayor al primero:', cant);
  ReadLn;
end.




program Proyecto67;

{$APPTYPE CONSOLE}

type
  TNombres = array[1..5] of String;
  TNotas = array[1..5] of Integer;

var
  Nombres: TNombres;
  Notas: TNotas;
  f: Integer;
  cant: Integer;

begin
  for f:=1 to 5 do
  begin
    Write('Ingrese nombre del alumno:');
    ReadLn(Nombres[f]);
    Write('Ingrese su nota:');
    ReadLn(Notas[f]);
  end;
  cant := 0;
  WriteLn('Estado de los alumnos.');
  for f:=1 to 5 do
  begin
    Write(Nombres[f],' ',Notas[f], ' ');
    if Notas[f] >= 8 then
    begin
      WriteLn('muy bueno');
      cant := cant + 1;
    end
    else
    begin
      if Notas[f] >= 4 then
      begin
        WriteLn('bueno');
      end
      else
      begin
        WriteLn('Insuficiente');
      end;
    end;
  end;
  WriteLn;
  WriteLn('Cantidad de alumnos muy buenos:', cant);
  ReadLn;
end.