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;
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.
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.
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.
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);
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.
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.
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.
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.