DMarlon Studio

Lección 14 · 14 de 20

Funciones y Result · Pascal

Escriba funciones en Pascal que devuelven un valor con Result: grados Celsius a Fahrenheit, el precio con IVA y si un año es bisiesto.

Pascal · Funciones y Result en DMarlon Studio: el código del ejemplo y su salida en la terminal

Una función es como un procedimiento, pero devuelve un valor. Se declara con `function`, sus parámetros y, tras los dos puntos, el tipo del resultado: function CelsiusToF(c: Double): Double.

El valor se devuelve con la variable especial `Result`: lo que contenga al terminar la función es lo que recibe quien la llama. Se puede asignar varias veces y leer dentro de la función, como cualquier otra variable.

WithVat tiene una constante local, Rate, con el 21 %. IsLeap devuelve un Boolean con la regla completa de los bisiestos: divisible entre 4 pero no entre 100, o divisible entre 400. Por eso 1900 no es bisiesto y 2000 sí.

Una llamada a una función va donde podría ir un valor: dentro de WriteLn, en una cuenta como 2 * WithVat(20) o seguida del formato :5:1. En el for, CelsiusToF(temp * 10) convierte 0, 10, 20 y 30 grados.

También se puede asignar el resultado al nombre de la función (CelsiusToF := ...), como en el Pascal clásico, pero Result es más claro y es lo habitual en Free Pascal (modo objfpc) y en Delphi.

Código · main.pas

program main;// A function returns a value: whatever is left in Result.function CelsiusToF(c: Double): Double;begin  Result := c * 9 / 5 + 32;end;function WithVat(price: Double): Double;const  Rate = 0.21;begin  Result := price * (1 + Rate);end;function IsLeap(year: Integer): Boolean;begin  Result := ((year mod 4 = 0) and (year mod 100 <> 0)) or (year mod 400 = 0);end;var  temp: Integer;begin  // A function call goes wherever a value can go.  for temp := 0 to 3 do    WriteLn(temp * 10:3, ' C = ', CelsiusToF(temp * 10):5:1, ' F');  WriteLn('A 20-euro shirt with VAT: ', WithVat(20):0:2);  WriteLn('Two shirts: ', 2 * WithVat(20):0:2);  WriteLn('2024 is a leap year? ', IsLeap(2024));  WriteLn('1900 is a leap year? ', IsLeap(1900));  WriteLn('2000 is a leap year? ', IsLeap(2000));end.

Salida · fpc main.pas && ./main

  0 C =  32.0 F
 10 C =  50.0 F
 20 C =  68.0 F
 30 C =  86.0 F
A 20-euro shirt with VAT: 24.20
Two shirts: 48.40
2024 is a leap year? TRUE
1900 is a leap year? FALSE
2000 is a leap year? TRUE

Para recordar

  • function Nombre(parámetros): Tipo; declara una función.
  • Lo que quede en Result es el valor devuelto.
  • Una función se usa dentro de expresiones, como un valor.
  • Las funciones pueden tener sus propias constantes y variables.

Ejercicio

Escriba una función Discount(price: Double; percent: Integer): Double que devuelva el precio rebajado y úsela para escribir el precio de una camiseta de 20 euros con un 15 % de descuento y con IVA.