Язык программирования 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.