22 - Procedimientos: parámetros por valor

En el concepto anterior vimos como dividir un algoritmo en pequeños algoritmos que resuelven una parte del problema.

Una situación común es que un procedimiento requiera recibir datos desde el bloque principal o desde otro procedimiento.

Para que un procedimiento reciba datos se deben definir parámetros por valor. Un parámetro por valor tiene por objetivo recibir un dato que luego es utilizado dentro del procedimiento.

Los parámetros se definen entre paréntesis luego del nombre del procedimiento:

procedure [nombre del procedimiento]([parámetros]);
begin
 [Instrucciones]
end;

Problema 1

Confeccionar una aplicación que muestre una presentación en pantalla del programa. Solicite la carga de dos valores y nos muestre la suma. Mostrar finalmente un mensaje de despedida del programa.

Proyecto87

program Proyecto87;

{$APPTYPE CONSOLE}

procedure MostrarMensaje(mensaje: String);
begin
  WriteLn('*****************************************************************');
  WriteLn(mensaje);
  WriteLn('*****************************************************************');
end;

procedure CargaSuma;
var
  valor1: Integer;
  valor2: Integer;
  suma: Integer;
begin
  Write('Ingrese el primer valor:');
  ReadLn(valor1);
  Write('Ingrese el segundo valor:');
  ReadLn(valor2);
  suma := valor1 + valor2;
  WriteLn('La sumade los dos valores es:', suma);
end;

begin
  MostrarMensaje('El programa calcula la suma de dos valores ingresados por teclado');
  CargaSuma;
  MostrarMensaje('Gracias por utilizar este programa');
  ReadLn;
end.

Ahora para resolver este pequeño problema hemos planteado un procedimiento llamada "MostrarMensaje" que recibe como parámetro un String (cadena de caracteres) y lo muestra en pantalla.

Los parámetros van seguidos del nombre del procedimiento encerrados entre paréntesis (y en el caso de tener más de un parámetro los mismos deben ir separados por punto y coma)

procedure MostrarMensaje(mensaje: String);
begin
  WriteLn('*****************************************************************');
  WriteLn(mensaje);
  WriteLn('*****************************************************************');
end;

Un parámetro podemos imaginarlo como una variable que solo se puede utilizar dentro del procedimiento y se carga su valor cuando lo llamamos.

Cuando llamamos al procedimiento "MostrarMensaje" desde el bloque principal de nuestro programa debemos pasar una variable String o un valor de tipo String:

  MostrarMensaje('El programa calcula la suma de dos valores ingresados por teclado');

El String que le pasamos: 'El programa calcula la suma de dos valores ingresados por teclado' lo recibe el parámetro del procedimiento.

Un procedimiento con parámetros nos hace más flexible el mismo para utilizarlo en distintas circunstancias. En nuestro problema al procedimiento "MostrarMensaje" lo utilizamos tanto para la presentación inicial de nuestro programa como para mostrar el mensaje de despedida. Si no existieran los parámetros estaríamos obligados a implementar dos procedimientos como el concepto anterior.

Problema 2

Confeccionar un procedimiento que reciba tres enteros y nos muestre el mayor de ellos. La carga de los valores hacerlo por teclado en el bloque principal del programa.

Proyecto88

program Proyecto88;

{$APPTYPE CONSOLE}

procedure MostrarMayor(v1: Integer; v2: Integer; v3: Integer);
begin
  Write('El valor mayor de los tres números es:');
  if (v1 > v2) and (v1 > v3) then
  begin
    Write(v1);
  end
  else
  begin
    if v2 > v3 then
    begin
      Write(v2);
    end
    else
    begin
      Write(v3);
    end;
  end;
end;


var
  valor1: Integer;
  valor2: Integer;
  valor3: Integer;

begin
  Write('Ingrese el primer valor:');
  ReadLn(valor1);
  Write('Ingrese el segundo valor:');
  ReadLn(valor2);
  Write('Ingrese el tercer valor:');
  ReadLn(valor3);
  MostrarMayor(valor1, valor2, valor3);
  ReadLn;
end.

En el bloque principal del programa Delphi/Pascal se solicita el ingreso de tres enteros por teclado y llama al procedimiento MostrarMayor y se le pasa a sus parámetros las tres variable enteras valor1, valor2 y valor3:

  MostrarMayor(valor1, valor2, valor3);

El procedimiento "MostrarMayor" recibe en sus parámetros v1, v2 y v3 los valores cargados en las variables valor1, valor2 y valor3:

procedure MostrarMayor(v1: Integer; v2: Integer; v3: Integer);

Es obligatorio cuando se llame al procedimiento "MostrarMayor" pasar tres valores o variables Integer, en el caso que le pasemos una cantidad distinto se produce un error cuando compilamos el programa.

Dentro del procedimiento "MostrarMayor" no podemos acceder a las variable valor1, valor2 y valor3.

Otra sintaxis que se puede emplear en Delphi/Pascal en la definición de los procedimientos es agrupar varios parámetros del mismo tipo:

procedure MostrarMayor(v1, v2, v3: Integer);

Problema 3

Desarrollar un programa que permita ingresar el lado de un cuadrado. Luego preguntar al operador si quiere calcular y mostrar su perímetro o su superficie.

Proyecto89

program Proyecto89;

{$APPTYPE CONSOLE}

procedure MostrarPerimetro(lado: Integer);
var
  per: Integer;
begin
  per := lado * 4;
  WriteLn('El perímetro es:', per);
end;

procedure MostrarSuperficie(lado: Integer);
var
  sup: Integer;
begin
  sup := lado * lado;
  WriteLn('La superficie es:', sup);
end;


var
  la: Integer;
  respuesta: String;

begin
  Write('Ingrese el valor del lado de un cuadrado:');
  ReadLn(la);
  Write('¿Qué desea calcular[ingresar texto: perimetro/superficie]?');
  ReadLn(respuesta);
  if respuesta = 'perimetro' then
  begin
    MostrarPerimetro(la);
  end;
  if respuesta = 'superficie' then
  begin
    MostrarSuperficie(la);
  end;
  ReadLn;
end.

Definimos dos procedimientos que calculan y muestran el perimetro por un lado y por otro la superficie recibiendo como parámetro el lado del cuadrado:

procedure MostrarPerimetro(lado: Integer);
var
  per: Integer;
begin
  per := lado * 4;
  WriteLn('El perímetro es:', per);
end;

procedure MostrarSuperficie(lado: Integer);
var
  sup: Integer;
begin
  sup := lado * lado;
  WriteLn('La superficie es:', sup);
end;

En el bloque principal del programa se carga el lado de un cuadrado e ingresar un String que indica que cálculo deseamos realizar si obtener el perímetro o la superficie. Una vez que se ingresó la variable respuesta procedemos a llamar al procedimiento que efectúa el calculo respectivo pasando como dato la variable "la" que almacena el valor del lado del cuadrado:

var
  la: Integer;
  respuesta: String;

begin
  Write('Ingrese el valor del lado de un cuadrado:');
  ReadLn(la);
  Write('¿Qué desea calcular[ingresar texto: perimetro/superficie]?');
  ReadLn(respuesta);
  if respuesta = 'perimetro' then
  begin
    MostrarPerimetro(la);
  end;
  if respuesta = 'superficie' then
  begin
    MostrarSuperficie(la);
  end;
  ReadLn;
end.

Problemas propuestos

  • Confeccionar un procedimiento llamado "CalcularSueldo" que reciba como parámetros el pago por hora (Double) y la cantidad de horas trabajadas (Integer)

    El procedimiento debe calcular y mostrar el sueldo.

    En el bloque principal realizar la carga del pago por hora y cantidad de horas trabajadas de 5 empleados. Llamar al procedimiento para su calculo e impresión.

  • Confeccionar un procedimiento que reciba tres enteros y los muestre ordenados de menor a mayor. En el bloque principal solicitar la carga de 3 enteros por teclado y proceder a llamar al procedimiento.
Solución
program Proyecto90;

{$APPTYPE CONSOLE}

procedure CalcularSueldo(pagohora: Double; canthoras: Integer);
var
  sueldo: Double;
begin
  sueldo := pagohora * canthoras;
  WriteLn('Sueldo:', sueldo:0:2);
end;


var
  pagohora: Double;
  canthoras: Integer;
  f: Integer;

begin
  for f:=1 to 5 do
  begin
    Write('Ingrese cuanto se paga al operario por hora:');
    ReadLn(pagohora);
    Write('Cuantas horas trabajó:');
    ReadLn(canthoras);
    CalcularSueldo(pagohora, canthoras);
  end;
  ReadLn;
end.




program Proyecto91;

{$APPTYPE CONSOLE}

procedure OrdenarImprimir(v1, v2, v3: Integer);
begin
  if (v1<v2) and (v1<v3) then
  begin
    if v2 < v3 then
    begin
      WriteLn(v1,' ', v2, ' ', v3);
    end
    else
    begin
      WriteLn(v1, ' ', v3, ' ', v2);
    end;
  end
  else
  begin
    if v2 < v3 then
    begin
      if (v1<v3) then
      begin
        WriteLn(v2, ' ', v1, ' ', v3);
      end
      else
      begin
        WriteLn(v2, ' ', v3, ' ', v1);
      end
    end
    else
    begin
      if (v1<v2) then
      begin
        WriteLn(v3, ' ', v1, ' ', v2);
      end
      else
      begin
        WriteLn(v3, ' ', v2, ' ', v1);
      end;
    end;
  end;
end;


var
  valor1: Integer;
  valor2: Integer;
  valor3: Integer;

begin
  Write('Ingrese el primer valor:');
  ReadLn(valor1);
  Write('Ingrese el segundo valor:');
  ReadLn(valor2);
  Write('Ingrese el tercer valor:');
  ReadLn(valor3);
  OrdenarImprimir(valor1, valor2, valor3);
  ReadLn;
end.