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. Алгоритм работы:
- Скопировать код в Lazarus → Project → New Project → Simple Program (или в любой
.pas-файл). - Скомпилировать (F9 или Run).
- Сверить вывод с блоком «Вход / Выход».
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 можно опускать 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 pascal | FizzBuzz |
факториал 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
На контрольной, ЕГЭ и олимпиаде программа почти всегда устроена одинаково:
- Объявить переменные в разделе
var(и при необходимостиconst,type). - Прочитать вход через
Read,ReadLnили из файла. - Посчитать ответ — цикл, массив, процедура, сортировка.
- Вывести ровно то, что просят — через
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 |
Числа в одной строке через пробел, без n | E |
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
Разбор по шагам:
ReadLn(n)— читает5с первой строки.sum: int64иsum := 0— накопитель. Типint64, неinteger: сумма многих больших чисел переполняет 32 бита (максимум ≈ 2·10⁹).for i := 1 to n do— ровноnитераций. В Pascalforвсегда считает от меньшего к большему (илиdowntoнаоборот).Read(x)— каждое следующее число из второй строки; пробелы пропускаются автоматически.sum := sum + x— то же, что «прибавить x к sum»;+=в Pascal нет.ReadLn;— съедает перевод строки после последнего числа (см. Read и ReadLn).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 do | Eof без параметра — конец стандартного ввода (строки). Пока есть числа — читаем. |
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
Разбор алгоритма:
- Первое число сразу кладём в
maxVal— это «текущий лидер». - Цикл с
i := 2— оставшиесяn−1чисел сравниваем с лидером. 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 = 0 | mod — остаток от деления; чётное = делится на 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
| Шаг | fact | i |
|---|---|---|
| старт | 1 | — |
| i=2 | 2 | 2 |
| i=3 | 6 | 3 |
| i=4 | 24 | 4 |
| i=5 | 120 | 5 |
Граничный случай: 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, …):
| i | a | b | c = a+b → новое b |
|---|---|---|---|
| 3 | 1 | 1 | 2 |
| 4 | 1 | 2 | 3 |
| 5 | 2 | 3 | 5 |
| 6 | 3 | 5 | 8 |
| 7 | 5 | 8 | 13 ← ответ |
Смысл: два переменных хранят «два последних» числа — без рекурсии (рекурсия на больших 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 | сравниваем | меняем? | массив |
|---|---|---|---|
| 1 | 5 и 1 | да | 1 5 4 2 3 |
| 2 | 5 и 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:
| шаг | a | b | t = a mod b |
|---|---|---|---|
| 1 | 48 | 18 | 12 |
| 2 | 18 | 12 | 6 |
| 3 | 12 | 6 | 0 |
| 4 | 6 | 0 | — → ответ 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 читает пустую строку | После серии Read → ReadLn; (подробнее) |
Переполнение integer | Верный алгоритм, неверный ответ | int64 для сумм, факториалов, Фибоначчи |
| Индекс с 1 и с 0 | Range check error | Статический массив — цикл 1..n; динамический FPC — часто 0..n-1 |
| Лишний текст в выводе | Автопроверка: 0 баллов | Только число/строка из условия — без «Ответ:» |
| Файл не найден | Runtime error 2 | input.txt рядом с .exe или полный путь в Assign |
Неправильно vs правильно — end:
{ ОШИБКА — нет точки }
begin
WriteLn(1);
end
{ ВЕРНО }
begin
WriteLn(1);
end.
Неправильно vs правильно — вывод на ЕГЭ:
Условие: вывести сумму → 14
Плохо: Сумма = 14
Плохо: «14 » с пробелом в конце строки
Хорошо: 14
Формат вывода должен буквально совпадать с условием — пробелы, переводы строк, регистр YES/NO. На ЕГЭ проверяют автоматически. Перед сдачей прогоните примеры из условия и граничные случаи: n = 0, n = 1, отрицательные числа (если допустимы).
На большинстве экзаменов и олимпиад сегодня удобнее Python или C++ — меньше возни с типами и форматом. Pascal остаётся актуален там, где его требует программа школы, в legacy на Delphi/FPC и для дисциплины строгой типизации. Сравнение диалектов — в справочнике.
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Практическая карта типовых IT-задач: термины, пошаговое внедрение, проверка качества и типичные ошибки. Простой консольный чат на C# — учебное приложение с сокетами: TCP между клиентом и сервером, многопоточность и обмен сообщениями в консоли. Примеры вёрстки на HTML и CSS с разбором: центрирование, Flexbox, Grid, формы, шапка, подвал и адаптив для учебы и портфолио. Перед началом работы обязательно изучите главу Turtle . Галерея 3D-фигур на Panda3D — карточки, куб, пирамида, сфера, сетки и составные сцены; код для локального запуска. Готовые docker-compose.yml с разбором каждой строки — nginx, PostgreSQL, Redis, WordPress, MongoDB. Примеры для школьников и студентов: postgres example, поднять базу локально, app + db. Примеры nginx.conf для статики, reverse proxy, React/Vue SPA, PHP, SSL и балансировки — построчный разбор директив, проверка curl и типичные ошибки для лабораторных и VPS. dockerfile example — 10 готовых Dockerfile с построчным разбором: node, python, golang, react nginx, spring boot, php, dotnet. Для студентов, лабораторных и docker build с нуля. PromQL example — готовые запросы Prometheus и Grafana с построчным разбором: up, rate, node_exporter cpu, memory, disk, http_requests_total, histogram_quantile p99, алерты. Для студентов, лабораторных и devops docker compose. Готовые манифесты Kubernetes с разбором каждой строки — Pod, Deployment, Service, ConfigMap, Secret, Ingress. Примеры для Minikube, kind и kubectl apply. Примеры графиков Matplotlib на Python для школьников и студентов — sin, cos, парабола, столбцы, scatter, гистограмма, подграфики; код с подробным разбором. Примеры pandas на Python для школьников и студентов — DataFrame, фильтрация, groupby, очистка, merge, сводные таблицы и экспорт; код с подробным разбором каждой строки.Готовые решения
Простой консольный чат на CSharp
HTML + CSS — готовые макеты
Примеры фигур Turtle на Python
Примеры фигур Panda3D на Python
Docker Compose — готовые стеки
Nginx — конфиги под задачу
Dockerfile — 10 типовых образов
Prometheus + Grafana — запросы
Kubernetes YAML — минимальные манифесты
Matplotlib — графики
Pandas — типовые операции