Язык программирования Pascal (Delphi)

Несмотря на то что большинство школьников сейчас пишет программы на Pascal / Delphi, у них возникают различные вопросы связанные с использованием языка программирования.

Записи и оператор with

Записи используются для создания своих типов данных

{ Обьявление записи - свой тип "Точка" }  
type 
  TPoint = Record 
    x,y : double;
  end;
  
{ Расстояние между точками }   
function dist( A,B : TPoint ):double;
begin
  dist := sqrt( (A.x - B.x)*(A.x - B.x) + (A.y - B.y)*(A.y - B.y) );
end;

{ Использование записей }
var A,B : TPoint;
begin
  { Инициализируем координаты точек }
  A.x := 1; A.y := 2;
  B.x := 10; B.y := 11;
  writeln( dist(A,B) );   
end.

Использование with:

{ Обьявление записи - тип "Персонаж в игре" }
type 
  TUnit = Record 
    x,y : integer; { Координаты клетки где стоит персонаж }  
    name : string; { Имя персонажа }
  end;

var Unit1 : TUnit;

{ Инициализация без with }
Unit1.x := 2; 
Unit1.y := 3;
Unit1.name := 'SUPER-HERO';

{ Инициализация с with }
with Unit1 do begin
  x := 2; 
  y := 3;
  name := 'SUPER-HERO';
end;  

Реализация Стека и Очереди на базе массива

Стек (англ. stack — стопка) — структура данных с методом доступа к элементам LIFO (англ. Last In — First Out, «последним пришёл — первым вышел»). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.

Очередь

 

const QSize = 10000; { Размер очереди (сколько в неё можно положить элементов) }
var
  Q : array [1..QSize] of Integer; { Массив для хранения очереди }
  Q_Start : Integer = 1; { Указывает на голову очереди }
  Q_End : Integer = 1; { Указывает на элемент, который заполнится, когда в очередь войдёт новый элемент }

{ = Операции с очередью = }

{ Очередь пуста? }
function isEmpty : Boolean;
begin
  isEmpty := Q_Start = Q_End;
end;

{ Положить значение в конец очереди }
procedure Put( Value : Integer );
begin
  Q[Q_End] := Value;
  Dec(Q_End);
  { Поддержка закольцованности очереди }
  if Q_End < 1 then Q_End := QSize;
end;

{ Забрать значение с начала очереди }
function Get : Integer;
begin
  assert( not isEmpty, 'В очереди ничего нет!');
  Get := Q[Q_Start];
  Dec(Q_Start);
  { Поддержка закольцованности очереди }
  if Q_Start < 1 then Q_Start := QSize;
end;

begin
  Writeln(isEmpty); { Выводит "TRUE" - очередь пуста }
  Put(2); { В очереди: 2 }
  Writeln(isEmpty); { Выводит "FALSE" - очередь не пуста }
  Put(5); { В очереди: 5, 2 }
  Writeln(Get); { Выводит "2", в очереди: 5 }
  Writeln(Get); { Выводит "5", в очереди пусто }
end.

Hello world!

program Project1; { Project1 - название проекта }

{$APPTYPE CONSOLE} { Это консольное приложение Delphi }

uses SysUtils; { Подключаем библиотеку SysUtils }

begin
  Writeln('Hello world!'); { Выводим Hello world на экран (в консоль) }
  Readln;
end.

Сложение A+B

{$APPTYPE CONSOLE}

uses SysUtils;

var A,B : integer; { A и B целые }
begin
  Write('A = '); Readln(A);
  Write('B = '); Readln(B);
  Writeln('A+B = ',A+B);
  Write('Press Enter!'); Readln; { Чтобы программа закрылась надо нажать Enter }
end.

Решение квадратного уравнения

Уравнение: $ax^2+bx+c=0$, где $a, b, c$ - коэффициенты.
Дискриминант: $D = b^2 - 4ac$
Корни уравнения: $X_{1,2} = \frac{-b\pm\sqrt{D}}{2a}$

{$APPTYPE CONSOLE}

uses SysUtils;

var A,B,C,D,X,R,X1,X2,R1,R2 : double;
begin
  { Вводим коэффициенты квадратного уравнения }
  Write('A = '); Readln(A);
  Write('B = '); Readln(B);
  Write('C = '); Readln(C);
  D := B*B - 4*A*C; { Дискриминант }
  if D < 0 then
    Writeln('No roots')
  else if D = 0 then begin
    X := (-B / (2*A));
    R := A*X*X + B*X + C; { Подставляем полученный X обратно в уравнение для проверки }
    Writeln('X = ',X:0:2,' R = ',R:0:2);
  end else begin
    X1 := ((-B + sqrt(D)) / (2*A));
    X2 := ((-B - sqrt(D)) / (2*A));
    R1 := A*X1*X1 + B*X1 + C;
    R2 := A*X2*X2 + B*X2 + C;
    Writeln('X1 = ',X1:0:2,' R1 = ',R1:0:2);
    Writeln('X2 = ',X2:0:2,' R2 = ',R2:0:2);
  end;
  Readln;
end.

Числа Фибоначчи

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, ... - каждое последующее число равно сумме двух предыдущих чисел. Название по имени средневекового математика Леонардо Пизанского (известного как Фибоначчи).

$F_0 = 0,\qquad F_1 = 1,\qquad F_{n} = F_{n-1} + F_{n-2}, \quad n\geqslant 2.$

{$APPTYPE CONSOLE}
{$R+} { Range checking - проверка границ массива }
{$O+} { Overflow checking - проверка переполнения }

uses SysUtils;

var A : array [0..100] of int64; { int64 = 64-битное целое, в Borland Pascal его нет, используйте LongInt }
  N,i : integer;
begin
  Write('N = '); Readln(N); { До какого числа (по номеру) вывести }
  A[0] := 0;
  A[1] := 1;
  for i:=2 to N do
    A[i] := A[i-1] + A[i-2];
  for i:=1 to N do
    Write(A[i],' ');
  Writeln;
  Readln;
end.

Реализация без массива:

{$APPTYPE CONSOLE}
uses SysUtils;

var A,B,C : int64; { 64-битное целое }
  N,i : integer;
begin
  Write('N = '); Readln(N); { До какого числа (по номеру) вывести }
  A := 0;
  B := 1;
  Write(A,' ',B,' ');
  for i:=2 to N do begin
    C := A + B;
    A := B;
    B := C;
    Write(B,' ');
  end;
  Writeln;
  Readln;
end.