Перейти к основному содержимому

Pascal / Free Pascal — типовые программы


Для кого эта статья

Подборка готовых программ на Free Pascal (FPC) с подробным разбором каждой строки — «что написано» и «зачем так». Материал рассчитан на:

  • школьников — лабораторные, PascalABC.NET, подготовка к ЕГЭ и олимпиадам в регионах, где дают Паскаль;
  • студентов — первый курс «Основы программирования», консольные задачи в Lazarus;
  • самоучек — когда в Google ищут «pascal readln массив», «сумма элементов массива pascal», «сортировка пузырьком pascal», «fizzbuzz pascal», «файл text pascal»;
  • тех, кто уже решал алгоритмы на Python или Java и хочет те же приёмы на Pascal.

Как пользоваться страницей: найдите задачу в таблице запросов → скопируйте код → запустите → сверьте с блоком «Вход / Выход» → прочитайте разбор построчно, если что-то непонятно.

Примеры рассчитаны на Free Pascal 3.x и Lazarus (Windows, Linux, macOS). В школе на PascalABC.NET синтаксис почти совпадает; отличия отмечены в callout ниже.

Каждый фрагмент — один файл task.pas. Алгоритм работы:

  1. Скопировать код в Lazarus → Project → New Project → Simple Program (или в любой .pas-файл).
  2. Скомпилировать (F9 или Run).
  3. Сверить вывод с блоком «Вход / Выход».

Lazarus (Windows): File → New → Project → Simple Program → вставить код → Run (F9).

Командная строка (если FPC в PATH):

fpc task.pas
task.exe

Проверка на файле (удобно перед сдачей на Stepik или ЕГЭ):

task.exe < input.txt

Файл input.txt лежит в той же папке, что и task.exe (после компиляции — обычно project1.exe или имя проекта).

Сначала теория

Учебный курс — Pascal — о разделе, установка и первая программа — глава 7, синтаксис по диалектам — справочник. Школьная среда Windows — PascalABC.NET. Те же алгоритмы на Python — ЕГЭ и олимпиадка, на C++ — олимпиадные шаблоны.

PascalABC.NET и FPC

В PascalABC.NET можно опускать program и писать код сразу в теле; для ЕГЭ и олимпиад привыкайте к полному каркасу с program ... ; begin ... end. Динамические массивы array of integer и SetLength — расширение Object Pascal (FPC, Delphi, PascalABC); в чистом ISO Pascal массив фиксирован: array[1..100] of integer.


Что ищут в Google — быстрый переход

Типичный запросКуда на странице
pascal hello world, program begin endОбязательный каркас
pascal readln пример, read readln разницаRead и ReadLn
pascal сумма двух чиселСумма двух чисел
сумма элементов массива pascal, pascal массив readlnШаблон B
найти максимум в массиве pascalМаксимум в массиве
fizzbuzz pascalFizzBuzz
факториал pascal, factorial pascalФакториал
fibonacci pascal, числа фибоначчи pascalФибоначчи
сортировка пузырьком pascal, bubble sort pascalПузырёк
палиндром pascal, строка палиндром pascalПалиндром
НОД pascal, алгоритм евклида pascalНОД
простое число pascal, решето эратосфена pascalРешето
файл text pascal, readln из файла pascalФайлы
procedure function pascal примерПроцедуры и функции
pascal ошибка end, end. или end;Частые ошибки
количество цифр в числе pascalКоличество цифр
линейный поиск pascal, найти элемент в массивеЛинейный поиск

Краткий указатель по разделам

РазделТипичный запрос
Что ищут в Googleбыстрый переход по запросам
Read и ReadLnразница, типичная ловушка
Каркас программыprogram begin end, writeln pascal
Шаблоны ввода-выводаreadln pascal, массив из n чисел
Стартовые задачисумма, максимум, FizzBuzz, факториал
1. Массивыarray of integer, SetLength
2. Процедуры и функцииprocedure, function, var параметр
3. Сортировка и поискпузырёк, линейный и бинарный поиск
4. СтрокиLength, Copy, Pos, палиндром
5. ЧислаНОД, простое число, числа Фибоначчи
6. Записи и множестваrecord, set of
7. Файлыtext, Assign, Reset, Rewrite
8. Меню и цикл программыrepeat until, case
9. Шпаргалкаформат вывода, несколько тестов
10. Популярные запросысумма массива, цифры, поиск, min
Частые ошибкиend. vs end;, типы в readln

Основы решения задач на Pascal

На контрольной, ЕГЭ и олимпиаде программа почти всегда устроена одинаково:

  1. Объявить переменные в разделе var (и при необходимости const, type).
  2. Прочитать вход через Read, ReadLn или из файла.
  3. Посчитать ответ — цикл, массив, процедура, сортировка.
  4. Вывести ровно то, что просят — через Write / WriteLn, без лишних подписей.

Стандартной библиотеки FPC достаточно для большинства школьных задач: массивы, строки, text, Math (корень, тригонометрия).

Четыре шага любой задачи на контрольной:

ШагЧто делаетеТипичный код
1Объявляете переменныеvar n, i: integer;
2Читаете входReadLn(n);
3Считаете ответfor, if, массив, функция
4Печатаете только ответWriteLn(sum); — без «Ответ:»

Read и ReadLn — главная ловушка новичка

В Pascal два способа читать с клавиатуры. Путаница между ними — самая частая причина «программа читает не то».

Read(x) / Read(a, b)ReadLn(x)
ЧитаетЧисло (или несколько через пробел)То же
Перевод строки после числаОставляет в буфереСъедает до конца строки
Когда братьНесколько чисел подряд в одной строкеОдно число, или строка текста
После цикла ReadНужен ReadLn; «вхолостую»Не нужен

Пример ловушки — программа «прочитала 0» или «зависла»:

var
n: integer;
s: string;
begin
Read(n); { прочитали 5, но Enter остался в буфере }
ReadLn(s); { сразу читает ПУСТУЮ строку — s = '' }
end.

Исправление: после Read(n) добавить ReadLn; или сразу писать ReadLn(n).

Правило для ЕГЭ

Если в условии «первая строка — n, вторая — n чисел», схема почти всегда такая: ReadLn(n) → цикл Read(a[i])ReadLn; в конце. Так вы не «проглотите» начало следующего блока ввода.


Обязательный каркас

Любая консольная программа на Free Pascal — это заголовок, объявления и тело. Точка после финального end обязательна: без неё компилятор ждёт продолжение файла.

Анатомия файла:

program Имя; ← имя программы (в Lazarus = имя проекта)
const ... ← необязательно: MAXN = 100000
type ... ← необязательно: record, массивы-типы
var ... ← переменные — ОБЯЗАТЕЛЬНО до begin
procedure ... ← необязательно: подпрограммы
function ...
begin ← с этого места идут команды
...
end. ← точка! не точка с запятой
program Task;

var
n: integer;

begin
ReadLn(n);
WriteLn(n * 2);
end.

Разбор построчно:

СтрокаСмысл
program Task;Объявляет имя программы. В Lazarus должно совпадать с именем .lpr/проекта.
varНачало раздела переменных. В Pascal нельзя писать var n: integer внутри begin — только здесь.
n: integerЦелое 32 бита (−2·10⁹ … 2·10⁹). Для больших сумм берите int64.
beginСтарт исполняемых команд.
ReadLn(n)Ждёт ввод пользователя (или строку из input.txt при < input.txt), кладёт число в n.
WriteLn(n * 2)Печатает результат и перевод строки. Проверяющая система на ЕГЭ смотрит сюда.
end.Конец программы. end. — с точкой; end; — только у вложенных блоков (if, for).

Hello World — минимум для проверки среды:

program Hello;

begin
WriteLn('Hello, Pascal!');
end.
СтрокаЧто происходит
WriteLn('...')Вывод строки + перевод курсора на новую строку.
Write(...)Вывод без перевода строки — следующий Write продолжит ту же строку.
'Hello, Pascal!'Строковый литерал в одинарных кавычках.
'' внутри строкиДва апострофа подряд = один символ '. Пример: 'it''s ok'.

Пример:

Запуск: hello.exe
Выход: Hello, Pascal!

Присваивание в Pascal — :=, не =:

СимволГде
:=Присвоить значение переменной: sum := sum + x
=Сравнение в if: if x = 0 then

Шаблоны ввода-вывода

Пять шаблонов покрывают большинство школьных и курсовых задач. Первый шаг после чтения условия — посмотреть, как оформлен вход, и выбрать строку из таблицы:

Формат входа в условииШаблон
Одно числоA
Сначала n, потом n чисел (часто на второй строке)B
Числа в одной строке через пробел, без nE
n неизвестно заранее / очень большой массивC
В начале t — число тестовD

Шаблон A — одно число

Запрос в Google: pascal readln integer, удвоить число pascal.

Формулировка из учебника: «Дано целое n. Выведите удвоенное значение».

program DoubleNumber;

var
n: integer;

begin
ReadLn(n);
WriteLn(n * 2);
end.

Пример:

Вход: 7
Выход: 14

Разбор построчно:

СтрокаСмысл
ReadLn(n)Читает целое и перевод строки после него. Безопасно, если дальше читаете строку текста.
WriteLn(n * 2)Одна строка ответа — ровно то, что ждёт автопроверка.

Смысл шаблона: «прочитал → посчитал → вывел». Основа для «квадрат числа», «чётное или нечётное одного числа», «факториал одного n».


Шаблон B — массив из n чисел

Шаблон B — массив из n чисел

Запрос: сумма элементов массива pascal, pascal readln массив, массив из n элементов pascal.

Формулировка: «Первая строка — n. Вторая — n целых чисел. Выведите сумму».

program ArraySum;

var
n, i: integer;
sum: int64;
x: integer;

begin
ReadLn(n);
sum := 0;
for i := 1 to n do
begin
Read(x);
sum := sum + x;
end;
ReadLn;
WriteLn(sum);
end.

Пример:

Вход:
5
3 1 4 1 5

Выход:
14

Разбор по шагам:

  1. ReadLn(n) — читает 5 с первой строки.
  2. sum: int64 и sum := 0 — накопитель. Тип int64, не integer: сумма многих больших чисел переполняет 32 бита (максимум ≈ 2·10⁹).
  3. for i := 1 to n do — ровно n итераций. В Pascal for всегда считает от меньшего к большему (или downto наоборот).
  4. Read(x) — каждое следующее число из второй строки; пробелы пропускаются автоматически.
  5. sum := sum + x — то же, что «прибавить x к sum»; += в Pascal нет.
  6. ReadLn; — съедает перевод строки после последнего числа (см. Read и ReadLn).
  7. WriteLn(sum) — одна строка ответа.

Почему без массива? Если нужна только сумма, хранить все элементы не обязательно — экономите память. Если потом понадобится a[i] — см. вариант ниже.

Вариант с массивом (когда элементы нужны повторно — сортировка, поиск, разворот):

program ArraySum2;

const
MAXN = 100000;

var
n, i: integer;
a: array[1..MAXN] of integer;
sum: int64;

begin
ReadLn(n);
for i := 1 to n do
Read(a[i]);
ReadLn;
sum := 0;
for i := 1 to n do
sum := sum + a[i];
WriteLn(sum);
end.
СтрокаЗачем
const MAXN = 100000В Pascal размер array[1..MAXN] задаётся константой при компиляции. Берите с запасом из условия (n ≤ 10⁵).
a: array[1..MAXN] of integerСтатический массив; индексы с 1 — привычно в школьных задачах.
Второй цикл for i := 1 to nОтдельно читаем, отдельно считаем — так проще отлаживать на лабораторной.

Шаблон C — динамический массив (SetLength)

Когда n заранее неизвестно или больше константы MAXN:

program DynamicArray;

var
n, i: integer;
a: array of integer;

begin
ReadLn(n);
SetLength(a, n);
for i := 0 to n - 1 do
Read(a[i]);
ReadLn;
{ работа с a[0]..a[n-1] }
end.

Разбор:

КонструкцияСмысл
array of integerДинамический массив — длина не фиксирована в var.
SetLength(a, n)Выделяет память под n элементов перед использованием.
for i := 0 to n - 1В FPC динамические массивы по умолчанию с индекса 0.

В школьных задачах чаще проще array[1..MAXN] и цикл 1..n — меньше путаницы с нулём.


Шаблон D — несколько тестов (t в условии)

program ManyTests;

var
t, n, i, caseNum: integer;

begin
ReadLn(t);
for caseNum := 1 to t do
begin
ReadLn(n);
WriteLn('Case ', caseNum, ': ', n * 2);
end;
end.

На ЕГЭ формат с t тестов редок; на Codeforces, informatics — частый.


Шаблон E — числа в одной строке без n

Запрос: pascal максимум в строке, найти max из чисел в строке pascal.

Формулировка: «В одной строке через пробел записаны целые числа. Выведите максимум» (количество заранее неизвестно — читаем до конца строки).

program LineMax;

var
maxVal, x: integer;
first: boolean;

begin
first := true;
while not Eof do
begin
Read(x);
if first then
begin
maxVal := x;
first := false;
end
else if x > maxVal then
maxVal := x;
end;
ReadLn;
WriteLn(maxVal);
end.

Пример:

Вход: 3 1 4 1 5
Выход: 5

Разбор:

СтрокаСмысл
while not Eof doEof без параметра — конец стандартного ввода (строки). Пока есть числа — читаем.
firstПервое число сразу становится maxVal — не с чем сравнивать.
ReadLn;Завершить строку ввода.

Альтернатива проще: если в условии всё же есть n — всегда берите шаблон B.


Стартовые задачи

Короткие программы из первых лабораторных — каждая с формулировкой, примером ввода-вывода и разбором.

Сумма двух чисел

Запрос: pascal сумма двух чисел, readln a b pascal.

Формулировка: «Даны два целых. Выведите их сумму».

program SumTwo;

var
a, b: integer;

begin
ReadLn(a, b);
WriteLn(a + b);
end.

Пример:

Вход: 10 25
Выход: 35
СтрокаСмысл
ReadLn(a, b)Читает два числа подряд — через пробел или с новой строки.
WriteLn(a + b)Сумма — без текста «Сумма =».

Максимум в массиве

Запрос: найти максимум в массиве pascal, max array pascal.

Формулировка: «Первая строка — n. Вторая — n чисел. Выведите максимальный элемент».

program ArrayMax;

var
n, i, x, maxVal: integer;

begin
ReadLn(n);
Read(maxVal);
for i := 2 to n do
begin
Read(x);
if x > maxVal then
maxVal := x;
end;
ReadLn;
WriteLn(maxVal);
end.

Пример:

Вход:
4
3 9 1 5

Выход:
9

Разбор алгоритма:

  1. Первое число сразу кладём в maxVal — это «текущий лидер».
  2. Цикл с i := 2 — оставшиеся n−1 чисел сравниваем с лидером.
  3. if x > maxVal then maxVal := x — обновляем максимум, если нашли больше.

Почему не maxVal := 0? Если все числа отрицательные, ноль даст неверный ответ. Первый элемент массива — надёжная инициализация.


Чётные числа от 1 до n

Запрос: вывести четные числа pascal, pascal mod 2.

Формулировка: «Дано n. Выведите все чётные от 2 до n через пробел».

program Evens;

var
n, i: integer;

begin
ReadLn(n);
for i := 2 to n do
if i mod 2 = 0 then
Write(i, ' ');
WriteLn;
end.

Пример:

Вход: 10
Выход: 2 4 6 8 10
СтрокаСмысл
for i := 2 to nСразу стартуем с 2 — не проверяем 1.
i mod 2 = 0mod — остаток от деления; чётное = делится на 2 без остатка.
Write(i, ' ')Пробел между числами; WriteLn в конце — перевод строки после последнего.

FizzBuzz до n

Запрос: fizzbuzz pascal, fizz buzz программа pascal.

Формулировка: «Для каждого числа от 1 до n: если делится на 15 — FizzBuzz, на 3 — Fizz, на 5 — Buzz, иначе само число».

program FizzBuzz;

var
n, i: integer;

begin
ReadLn(n);
for i := 1 to n do
begin
if (i mod 15 = 0) then
WriteLn('FizzBuzz')
else if (i mod 3 = 0) then
WriteLn('Fizz')
else if (i mod 5 = 0) then
WriteLn('Buzz')
else
WriteLn(i);
end;
end.

Пример (фрагмент):

Вход: 15
Выход:
1
2
Fizz
...
FizzBuzz

Почему порядок if важен: число 15 делится и на 3, и на 5. Проверка mod 15 первая — иначе сработает только «Fizz» или только «Buzz».


Факториал

Запрос: факториал pascal, factorial pascal program.

Формулировка: «Дано неотрицательное n. Выведите n!».

program Factorial;

var
n, i: integer;
fact: int64;

begin
ReadLn(n);
fact := 1;
for i := 2 to n do
fact := fact * i;
WriteLn(fact);
end.

Пример:

Вход: 5
Выход: 120
Шагfacti
старт1
i=222
i=363
i=4244
i=51205

Граничный случай: n = 0 → цикл не выполняется, fact остаётся 1 (по определению 0! = 1).

Для n > 20 результат не помещается в int64 — в условии обычно маленькие n или просят остаток по модулю.


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

Запрос: fibonacci pascal, n-ое число фибоначчи pascal.

Формулировка (вариант A): «Дано n (n ≥ 1). Выведите n-е число Фибоначчи: 1, 1, 2, 3, 5, …».

program Fibonacci;

var
n, i: integer;
a, b, c: int64;

begin
ReadLn(n);
if n <= 0 then
WriteLn(0)
else if n <= 2 then
WriteLn(1)
else
begin
a := 1;
b := 1;
for i := 3 to n do
begin
c := a + b;
a := b;
b := c;
end;
WriteLn(b);
end;
end.

Пример:

Вход: 7
Выход: 13

Таблица итераций (F(1)=1, F(2)=1, …):

iabc = a+b → новое b
3112
4123
5235
6358
75813 ← ответ

Смысл: два переменных хранят «два последних» числа — без рекурсии (рекурсия на больших n медленная и может переполнить стек).

Формулировка (вариант B): «Выведите первые n чисел через пробел» — см. первые n чисел Фибоначчи.


Типовые программы по темам

1. Массивы

1.1. Подсчёт положительных элементов

Запрос: подсчитать положительные элементы массива pascal.

program CountPositive;

var
n, i, x, cnt: integer;

begin
ReadLn(n);
cnt := 0;
for i := 1 to n do
begin
Read(x);
if x > 0 then
cnt := cnt + 1;
end;
ReadLn;
WriteLn(cnt);
end.

Пример:

Вход:
5
-1 0 3 4 -2

Выход:
2
СтрокаСмысл
cnt := 0Счётчик до цикла — классический паттерн «накопитель».
if x > 0Ноль не положительный; если в условии «неотрицательные» — x >= 0.

1.2. Разворот массива

Запрос: развернуть массив pascal, reverse array pascal.

program ReverseArray;

var
n, i, tmp: integer;
a: array[1..1000] of integer;

begin
ReadLn(n);
for i := 1 to n do
Read(a[i]);
ReadLn;
for i := 1 to n div 2 do
begin
tmp := a[i];
a[i] := a[n - i + 1];
a[n - i + 1] := tmp;
end;
for i := 1 to n do
Write(a[i], ' ');
WriteLn;
end.

Пример:

Вход:
4
10 20 30 40

Выход:
40 30 20 10

Как работает обмен:

i=1: меняем a[1] и a[4]
i=2: меняем a[2] и a[3]
(n div 2 = 2 — до середины, иначе перевернём дважды)
ВыражениеСмысл
n div 2Целочисленное деление — «половина длины» без дроби.
a[n - i + 1]Симметричный элемент с конца: при i=1 это a[n].
tmpТретья «коробка» — без неё потеряете значение при обмене.

1.3. Префиксные суммы

Запрос: префиксные суммы pascal, сумма на отрезке массива pascal.

Формулировка: «Дан массив. Постройте префиксы. На каждый запрос [l, r] выведите сумму a[l]+…+a[r] за O(1)».

program PrefixSum;

const
MAXN = 100000;

var
n, q, l, r, i: integer;
a, pref: array[1..MAXN] of int64;

begin
ReadLn(n);
for i := 1 to n do
Read(a[i]);
ReadLn;
pref[1] := a[1];
for i := 2 to n do
pref[i] := pref[i - 1] + a[i];
ReadLn(q);
for i := 1 to q do
begin
ReadLn(l, r);
if l = 1 then
WriteLn(pref[r])
else
WriteLn(pref[r] - pref[l - 1]);
end;
end.

Пример:

Вход:
5
2 4 1 3 5
2
1 3
2 5

Выход:
7
9

Идея: pref[i] = сумма первых i элементов. Тогда сумма на [l, r] = pref[r] - pref[l-1] (для l=1 просто pref[r]).

СтрокаСмысл
pref[1] := a[1]База рекурренции.
pref[i] := pref[i-1] + a[i]К каждому префиксу прибавляем следующий элемент.
pref[r] - pref[l-1]«Вся сумма до r» минус «сумма до l−1» = отрезок [l, r].

2. Процедуры и функции

Процедуры объявляют перед begin основной программы (или в отдельном unit).

2.1. Функция — простое ли число

Запрос: проверить простое число pascal, is prime pascal.

program IsPrime;

function IsPrime(x: integer): boolean;
var
d: integer;
begin
if x < 2 then
begin
IsPrime := false;
exit;
end;
IsPrime := true;
for d := 2 to trunc(sqrt(x)) do
if x mod d = 0 then
begin
IsPrime := false;
exit;
end;
end;

var
n: integer;

begin
ReadLn(n);
if IsPrime(n) then
WriteLn('YES')
else
WriteLn('NO');
end.

Пример:

Вход: 17
Выход: YES

Вход: 18
Выход: NO
ЭлементСмысл
function ... : booleanФункция возвращает true / false.
IsPrime := ...Результат функции — как return в Python/Java.
exitДосрочный выход — не проверяем делители дальше.
trunc(sqrt(x))Достаточно делителей до √x — если есть больший, есть и меньший.
x mod d = 0Делится без остатка → составное.

Граничные тесты: n = 0, 1 → NO; n = 2 → YES.


2.2. Процедура с параметром var (обмен значений)

program SwapDemo;

procedure Swap(var a, b: integer);
var
t: integer;
begin
t := a;
a := b;
b := t;
end;

var
x, y: integer;

begin
ReadLn(x, y);
Swap(x, y);
WriteLn(x, ' ', y);
end.

var перед параметром — передача по ссылке; процедура меняет переменные вызывающего кода.


2.3. Рекурсия — факториал

program FactRec;

function Fact(n: integer): int64;
begin
if n <= 1 then
Fact := 1
else
Fact := n * Fact(n - 1);
end;

var
n: integer;

begin
ReadLn(n);
WriteLn(Fact(n));
end.

На больших n рекурсия может переполнить стек — на олимпиадах предпочитают цикл.


3. Сортировка и поиск

3.1. Сортировка пузырьком

Запрос: сортировка пузырьком pascal, bubble sort pascal, sort array pascal.

program BubbleSort;

var
n, i, j, tmp: integer;
a: array[1..1000] of integer;

begin
ReadLn(n);
for i := 1 to n do
Read(a[i]);
ReadLn;
for i := 1 to n - 1 do
for j := 1 to n - i do
if a[j] > a[j + 1] then
begin
tmp := a[j];
a[j] := a[j + 1];
a[j + 1] := tmp;
end;
for i := 1 to n do
Write(a[i], ' ');
WriteLn;
end.

Пример:

Вход:
5
5 1 4 2 3

Выход:
1 2 3 4 5

Идея алгоритма: внешний цикл i — «сколько элементов уже встало на своё место с конца». Внутренний j сравнивает соседей; больший «всплывает» вправо как пузырь.

Один проход при n=5 (упрощённо):

jсравниваемменяем?массив
15 и 1да1 5 4 2 3
25 и 4да1 4 5 2 3
СтрокаСмысл
for j := 1 to n - iС каждым i последний элемент уже на месте — сравниваем на один пар меньше.
if a[j] > a[j + 1]Порядок возрастания; для убывания — <.

Для n > 10⁴ на контесте пузырёк получит TLE — там нужна быстрая сортировка; для лабораторной и понимания логики — идеален.


3.2. Бинарный поиск в отсортированном массиве

program BinarySearch;

function Find(a: array of integer; n, key: integer): integer;
var
lo, hi, mid: integer;
begin
lo := 0;
hi := n - 1;
while lo <= hi do
begin
mid := (lo + hi) div 2;
if a[mid] = key then
begin
Find := mid;
exit;
end;
if a[mid] < key then
lo := mid + 1
else
hi := mid - 1;
end;
Find := -1;
end;

var
n, i, key, pos: integer;
a: array of integer;

begin
ReadLn(n);
SetLength(a, n);
for i := 0 to n - 1 do
Read(a[i]);
ReadLn;
ReadLn(key);
pos := Find(a, n, key);
WriteLn(pos);
end.

4. Строки

В FPC тип string — длинная строка (аналог Delphi AnsiString / UnicodeString в зависимости от режима).

4.1. Палиндром

Запрос: палиндром pascal, проверить палиндром строка pascal, string palindrome pascal.

Формулировка: «Дана строка. YES, если читается одинаково слева направо и справа налево».

program Palindrome;

var
s: string;
i, n: integer;
ok: boolean;

begin
ReadLn(s);
n := Length(s);
ok := true;
for i := 1 to n div 2 do
if s[i] <> s[n - i + 1] then
ok := false;
if ok then
WriteLn('YES')
else
WriteLn('NO');
end.

Пример:

Вход: radar
Выход: YES

Вход: hello
Выход: NO

Разбор:

СтрокаСмысл
Length(s)Длина строки; индексы с 1, не с 0 — важно для Pascal.
s[i]i-й символ; <> — «не равно».
n div 2Сравниваем только до середины — вторую половину не дублируем.
ok := falseДостаточно одного несовпадения — можно было бы break, но для коротких строк цикл и так быстрый.

4.2. Подсчёт слов (упрощённо — по пробелам)

program WordCount;

var
s: string;
i, cnt: integer;
inWord: boolean;

begin
ReadLn(s);
cnt := 0;
inWord := false;
for i := 1 to Length(s) do
begin
if s[i] <> ' ' then
begin
if not inWord then
begin
cnt := cnt + 1;
inWord := true;
end;
end
else
inWord := false;
end;
WriteLn(cnt);
end.

4.3. Поиск подстроки (Pos)

program FindSub;

var
text, sub: string;
p: integer;

begin
ReadLn(text);
ReadLn(sub);
p := Pos(sub, text);
WriteLn(p);
end.

Pos возвращает 1-based индекс первого вхождения или 0, если подстроки нет.


5. Числа

5.1. НОД (алгоритм Евклида)

Запрос: НОД pascal, gcd pascal, алгоритм евклида pascal.

Формулировка: «Даны два натуральных числа. Выведите их наибольший общий делитель».

program Gcd;

function Gcd(a, b: integer): integer;
var
t: integer;
begin
while b <> 0 do
begin
t := a mod b;
a := b;
b := t;
end;
Gcd := a;
end;

var
x, y: integer;

begin
ReadLn(x, y);
WriteLn(Gcd(x, y));
end.

Пример:

Вход: 48 18
Выход: 6

Таблица шагов для 48 и 18:

шагabt = a mod b
1481812
218126
31260
460— → ответ a = 6
СтрокаСмысл
while b <> 0Пока делитель не ноль — продолжаем.
Gcd := aКогда b = 0, НОД — текущее a.

5.2. Решето Эратосфена (простые до n)

program Sieve;

const
MAXN = 1000000;

var
n, i, j: integer;
isPrime: array[1..MAXN] of boolean;

begin
ReadLn(n);
for i := 1 to n do
isPrime[i] := true;
isPrime[1] := false;
for i := 2 to trunc(sqrt(n)) do
if isPrime[i] then
for j := i * i to n do
isPrime[j] := false;
for i := 2 to n do
if isPrime[i] then
Write(i, ' ');
WriteLn;
end.

5.3. Быстрое возведение в степень по модулю

program ModPow;

function ModPow(a, n, modul: int64): int64;
var
res: int64;
begin
res := 1;
a := a mod modul;
while n > 0 do
begin
if n mod 2 = 1 then
res := (res * a) mod modul;
a := (a * a) mod modul;
n := n div 2;
end;
ModPow := res;
end;

var
a, n, m: integer;

begin
ReadLn(a, n, m);
WriteLn(ModPow(a, n, m));
end.

6. Записи и множества

6.1. Запись — ученик

program StudentRecord;

type
TStudent = record
name: string;
age: integer;
grade: real;
end;

var
st: TStudent;

begin
ReadLn(st.name);
ReadLn(st.age);
ReadLn(st.grade);
WriteLn(st.name, ', ', st.age, ' лет, средний балл ', st.grade:0:2);
end.

:0:2 — формат вещественного: 0 минимальной ширины, 2 знака после запятой.


6.2. Множество символов — гласные

program Vowels;

var
s: string;
i: integer;
vowels: set of char;

begin
vowels := ['a', 'e', 'i', 'o', 'u', 'y',
'A', 'E', 'I', 'O', 'U', 'Y'];
ReadLn(s);
for i := 1 to Length(s) do
if s[i] in vowels then
Write(s[i]);
WriteLn;
end.

7. Файлы

7.1. Чтение чисел из текстового файла

Запрос: pascal чтение из файла, assign reset pascal, read file text pascal.

program ReadFromFile;

var
f: text;
x: integer;
sum: int64;

begin
Assign(f, 'input.txt');
Reset(f);
sum := 0;
while not Eof(f) do
begin
Read(f, x);
sum := sum + x;
end;
Close(f);
WriteLn(sum);
end.

Файл input.txt:

10 20 30

Выход программы: 60

ОперацияСмысл
Assign(f, 'имя')Связать переменную f с файлом на диске.
Reset(f)Открыть для чтения (файл должен существовать).
Rewrite(f)Создать новый или перезаписать с нуля.
Read(f, x)Прочитать следующее число из файла — как Read, но из f.
Eof(f)true, если достигнут конец файла.
Close(f)Закрыть — иначе файл может остаться «занятым».

Файл кладут в папку с .exe (в Lazarus: Run → Run Parameters → Working directory или скопировать input.txt в project1.exe).


7.2. Запись таблицы в файл

program WriteTable;

var
f: text;
i: integer;

begin
Assign(f, 'output.txt');
Rewrite(f);
for i := 1 to 10 do
Writeln(f, '2 x ', i, ' = ', 2 * i);
Close(f);
WriteLn('Готово: output.txt');
end.

8. Интерактивное меню

program MenuLoop;

var
choice: integer;
a, b: integer;

begin
repeat
WriteLn('1 — сложить два числа');
WriteLn('2 — выход');
Write('Выбор: ');
ReadLn(choice);
case choice of
1:
begin
ReadLn(a, b);
WriteLn('Сумма = ', a + b);
end;
2: WriteLn('Пока!');
else
WriteLn('Нет такого пункта');
end;
until choice = 2;
end.

repeat ... until — тело выполняется минимум один раз, в отличие от while.


9. Полезные приёмы

Форматированный вывод

WriteLn(x:5); { целое, ширина поля 5 }
WriteLn(pi:8:4); { вещественное, 4 знака после запятой }
WriteLn('x=', x); { смешанный вывод }

Константа для размера массива

const
MAXN = 100000;
var
a: array[1..MAXN] of integer;

На олимпиаде MAXN берут с запасом из ограничения n в условии.


Подключение модуля Math

uses Math;

var
x: double;
begin
x := Sqrt(2);
WriteLn(x);
end.

Sqrt, Sin, Cos, Power — из Math.


Полный каркас для контрольной (копировать в начало)

program Solution;

const
MAXN = 200000;

var
n, i: integer;
{ ваши переменные }

begin
{ чтение }
ReadLn(n);
{ решение }
{ вывод }
end.

10. Популярные запросы из Google

Дополнительные формулировки, по которым часто приходят на эту страницу — с тем же стилем разбора, что в Java — консольные задачи.

10.1. Линейный поиск в массиве

Запрос: найти элемент в массиве pascal, linear search pascal, index of element array pascal.

Формулировка: «Даны n, массив и число key. Выведите индекс первого вхождения key (с 1) или −1, если нет».

program LinearSearch;

var
n, i, key, index: integer;
a: array[1..100000] of integer;

begin
ReadLn(n);
for i := 1 to n do
Read(a[i]);
ReadLn;
ReadLn(key);
index := -1;
for i := 1 to n do
if (index = -1) and (a[i] = key) then
index := i;
WriteLn(index);
end.

Пример:

Вход:
6
3 1 4 1 5 9
4

Выход:
3
СтрокаСмысл
index := -1Договорённость «не найдено» — часто в условии олимпиады.
(index = -1) and ...Берём первое совпадение; без этого найдём последнее.
СложностьO(n) — один проход. На отсортированном массиве быстрее бинарный поиск.

10.2. Первые n чисел Фибоначчи

Запрос: вывести fibonacci pascal, последовательность фибоначчи pascal.

Формулировка: «Дано n. Выведите первые n чисел Фибоначчи через пробел: 1 1 2 3 5 …».

program FibSequence;

var
n, i: integer;
a, b, nextVal: int64;

begin
ReadLn(n);
a := 1;
b := 1;
for i := 1 to n do
begin
if i > 1 then
Write(' ');
if i = 1 then
Write(a)
else if i = 2 then
Write(b)
else
begin
nextVal := a + b;
Write(nextVal);
a := b;
b := nextVal;
end;
end;
WriteLn;
end.

Пример:

Вход: 7
Выход: 1 1 2 3 5 8 13

Смысл: на каждом шаге печатаем текущее число и сдвигаем пару (a, b) — без хранения всего массива.


10.3. Количество цифр в числе

Запрос: количество цифр в числе pascal, count digits pascal.

Формулировка: «Дано неотрицательное целое. Сколько в нём цифр?»

program CountDigits;

var
n: int64;
cnt: integer;

begin
ReadLn(n);
if n = 0 then
WriteLn(1)
else
begin
cnt := 0;
while n > 0 do
begin
cnt := cnt + 1;
n := n div 10;
end;
WriteLn(cnt);
end;
end.

Пример:

Вход: 12045
Выход: 5
СтрокаСмысл
n = 0 → 1У нуля одна цифра — частый граничный тест.
n div 10Отбрасываем последнюю цифру (12045 → 1204 → …).
while n > 0Пока есть цифры — увеличиваем счётчик.

Альтернатива одной строкой: WriteLn(Length(IntToStr(n))); — короче, но на контрольной часто требуют цикл.


10.4. Сумма элементов массива (явное хранение)

Запрос: сумма элементов массива pascal — самый частый запрос по Pascal в учебниках.

Тот же код, что шаблон B, но с массивом — когда в следующей части задачи элементы нужны снова:

program SumArray;

const
MAXN = 100000;

var
n, i: integer;
a: array[1..MAXN] of integer;
sum: int64;

begin
ReadLn(n);
for i := 1 to n do
Read(a[i]);
ReadLn;
sum := 0;
for i := 1 to n do
sum := sum + a[i];
WriteLn(sum);
end.

Когда копировать этот вариант: после суммы нужна сортировка, поиск или вывод только чётных a[i].


10.5. Минимум в массиве

Запрос: найти минимум в массиве pascal, min array pascal.

Логика зеркальна максимуму: первый элемент — в minVal, цикл с i := 2, условие if x < minVal.

program ArrayMin;

var
n, i, x, minVal: integer;

begin
ReadLn(n);
Read(minVal);
for i := 2 to n do
begin
Read(x);
if x < minVal then
minVal := x;
end;
ReadLn;
WriteLn(minVal);
end.

Частые ошибки новичков

ОшибкаЧто происходитКак исправить
Забыли точку в end.Syntax error, компилятор ждёт продолжениеПоследний end программы — end.
Путаница end; и end.; после вложенных блоков, . только в конце файлаВнутри — end;, в конце — end.
Read без ReadLn после циклаСледующий ReadLn читает пустую строкуПосле серии ReadReadLn; (подробнее)
Переполнение integerВерный алгоритм, неверный ответint64 для сумм, факториалов, Фибоначчи
Индекс с 1 и с 0Range check errorСтатический массив — цикл 1..n; динамический FPC — часто 0..n-1
Лишний текст в выводеАвтопроверка: 0 балловТолько число/строка из условия — без «Ответ:»
Файл не найденRuntime error 2input.txt рядом с .exe или полный путь в Assign

Неправильно vs правильно — end:

{ ОШИБКА — нет точки }
begin
WriteLn(1);
end

{ ВЕРНО }
begin
WriteLn(1);
end.

Неправильно vs правильно — вывод на ЕГЭ:

Условие: вывести сумму → 14

Плохо: Сумма = 14
Плохо: «14 » с пробелом в конце строки
Хорошо: 14
ЕГЭ и олимпиада

Формат вывода должен буквально совпадать с условием — пробелы, переводы строк, регистр YES/NO. На ЕГЭ проверяют автоматически. Перед сдачей прогоните примеры из условия и граничные случаи: n = 0, n = 1, отрицательные числа (если допустимы).


Pascal или Python?

На большинстве экзаменов и олимпиад сегодня удобнее Python или C++ — меньше возни с типами и форматом. Pascal остаётся актуален там, где его требует программа школы, в legacy на Delphi/FPC и для дисциплины строгой типизации. Сравнение диалектов — в справочнике.


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").