Приведем пример использования стандартных процедур модуля DOS для вывода текущей даты и времени:
uses DOS;                                       { подключение модуля DOS }
Procedure Date_Time;
var y, m, d, d_w:word;  h, min, sec, hund: word;{локальные параметры }  
begin     
  GetDate(y,m,d,d_w); {вызов процедуры DOS,  возвращающей параметры даты }
  GetTime(h,min,sec,hund);  { процедура,  возвращающая параметры времени }
  writeln('сегодня: ' );
  writeln('_':10,   d, ' число');
  writeln('_':10,   m, ' месяц');
  writeln('_':10,   y, ' год'  );
  writeln('день недели: ', d_w );    { d_w= 0 - воскресенье,  и т. д. }
  writeln('Время: ' );
  writeln('_':6,   h, ' часов' );
  writeln('_':6,   min, ' минут' );
  writeln('_':6,   sec, ' секунд' ); readln
end;
Begin
  Date_Time     
end.
В практических задачах часто пишутся процедуры,  возвращающие значения элементов массивов.  Приведем пример процедуры расчета "N" значений функции,  например,  Y= 4*Sin(x)+7*Cos(x); в заданном диапазоне x1<=x<=x2,  при N<=100 и равномерной разбивке диапазона.
type r_1000= array[1. . 1000] of real;               { задается тип  r_1000 }
var Z: r_1000;  x1, x2: real;   n: word;
Procedure Mas_Y(var Y:r_1000; x1,x2:real; n:word); {Y - параметр-перемен-ная}
var i: word;   x,  dx: real;                          { локальные параметры }  
begin
    If (n>1000) or (n<2) then
      begin
        writeln('Длина массива >1 и не должна превышать 1000');    
        Readln;
        Halt
      end;
    i:=0;
    x:=x1;
    dx:=(x2-x1)/(n-1);     { dx - шаг изменения аргумента }  
    If dx<= 0 then
      begin
        writeln('x2 должно быть больше x1');
        Readln;
        Halt
      end;
  While xx1)');
  Readln(x1, x2);
  Writeln('Введите значение  1 
Здесь тип формального параметра "Y" задается в разделе описания типов внешней программы и совпадает с типом фактического параметра "Z",  значения элементов которого возвращаются во внешнюю программу. 
Оператор Halt прерывает выполнение всей программы,  даже если он используется внутри процедуры.  Применение оператора Exit внутри процедуры вызывает прерывание процедуры,  но не внешней программы. 
Приведем пример процедуры вывода массива чисел в файл:
Type M_30х30_r= array[1..30, 1..30] of real;  { задается тип  M_30х30_r }
var  x: M_30х30_r;
     i, j, n, m: byte;
{------------------------------------------------------------------------}
Procedure Wr_M(a: M_30х30_r;  name_f: string;  n, m: byte);
Var
  i, j: byte;                        { a - массив NxM,   n<=30,  m<=30 }
  f: text;                           { name_f - имя файла }
begin
  assign(f, name_f);
  rewrite(f);
  For i:= 1 to n do
    begin
      writeln(f);
      For j:= 1 to m do write(f, a[i,j]:6:2)
    end;
  close(f)     
end;
{------------------------------------------------------------------------}
Begin
  N:= 10;                        { создание симметричной матрицы }
  for i:= 1 to N do
    for j:= i to N do
      x[i, j]:= 0.5 + random(50); { заполнение верхней треугольной матрицы }
  for i:= 1 to N do
    for j:= i to N do
      x[j,i]:= x[i,j]; { заполнение нижней,  симметричной части матрицы }
End.
Для правильного считывания данных,  записанных в файл бесформатным выводом необходима запись пробела для разделения чисел.  
Приведем пример функции для расчета высоты треугольника по заданным значениям его сторон. 
Program TR;
Var a, b, c, ha, hb, hc: real;
{----------------------------------------------------------------------------}
Function  H_TR(a, b, c: real): real;        { a, b, c - Стороны треугольника }
Var p, s: real;
Begin
  If (a<0) or (b<0) or (c<0) Then
    begin  
      Writeln('Стороны треугольника >0 ?');
      readln;
      Halt
    end;
  If (a>(b+c)) or (b>(a+c)) or (c>(a+b)) Then
    begin  
      Writeln('a<(b+c),  b<(a+c),  c<(a+b) ?');   
      readln;
      Halt
    end;
  p:= (a+b+c)/2;                  { полупериметр }
  s:= Sqrt(p*(p-a)*(p-b)*(p-c));  { площадь }
  H_TR:= 2*s/a;                   { Присвоение функции значения }
End;
{----------------------------------------------------------------}
Begin
  Writeln('Введите значения сторон треугольника a,b,c');   
  Readln(a,b,c);
  ha:= H_TR(a, b, c);
  hb:= H_TR(b, a, c);
  hc:= H_TR(c, b, a); 
  Writeln('Высоты  треугольника:');
  Writeln('ha=',ha:-10:4, 'hb=',hb:-10:4, 'hc=',hc:-10:4);
  Readln
End.
В программе трижды вызывается функция расчета высоты треугольника для различных комбинаций фактических параметров,  что позволяет вычислить все высоты треугольника.  
Приведем пример использования функции для расчета суммы членов степенного ряда,  представляющего тригонометрическую функцию Y= Sin(x).
PROGRAM fun_sin;
var  y,  y1,  x1: real;
{-------------------------------------------------------------------------}
Function Sin_r( x: real): real;    
Var a,  k,  y: real;  i: longint;
begin
  if abs(x) > 2*Pi Then x:= 2*pi*Frac(x/(2*Pi));     {учет периодичности }
  if abs(x) > 2*Pi Then x:= x - 2*pi*Int(x/(2*Pi));            { функции }
  if abs(x) > Pi Then x:= Pi - ABS(x);         { учет асимметрии функции }
  i:= 0;  a:= x;  y:= a;
  while abs(a)>0.0000001 do
    begin
      i:=i+1;
      k:=-x*x/(2*i*(2*i+1));
      a:= a*k;
      y:= y + a
    end;
  Sin_r:= y;                      { присвоение функции ее значения }
end;
{-------------------------------------------------------------------------}
Begin
  write('Введите значение аргумента: x1= ');
  Readln(x1);
  Y:= Sin_r(x1);            { вызов функции,  разработанной программистом }
  Y1:= Sin(x1);             { вызов стандартной функции }
  writeln('значение аргумента: x1= ',  x1);
  writeln('расчетное значение функции: Sin_r(x1)= ',  y :-11:8);
  writeln('контрольный результат:     Sin(x1) =  ',  y1:-11:8);
  writeln('Нажмите Enter');
  readln;
end.
В описании функции обязателен оператор присвоения функции ее значения.  Изменение величины параметра-значения "x" в теле функции не отражается на его значении во внешней программе.  Функция возвращает значение,  которое во внешней программе присваивается переменной "y".