Глиф Учебники

Урок 2. Переменные и типы данных

Курс «Pascal» · урок 2 из 9 · 4 минуты чтения

Программа из прошлого урока выводила готовый текст. Чтобы считать, программе нужно где-то хранить числа и слова — для этого есть переменные.

Что такое переменная

Переменная — именованное место в памяти, где лежит значение. У переменной есть имя (например, age) и тип — какие значения в ней могут храниться: целые числа, дробные, символы, строки.

В Pascal каждую переменную нужно описать до того, как ею пользоваться. Описания пишут в разделе var перед begin:

Pascal
program Variables;
var
  apples, pears, total: integer;
  price: real;
begin
  apples := 5;
  pears := 3;
  total := apples + pears;
  price := 1.25;
  writeln('Всего фруктов: ', total);
  writeln('Цена одного: ', price:0:2);
  writeln('Цена всех: ', (total * price):0:2);
end.
Вывод
Всего фруктов: 8
Цена одного: 1.25
Цена всех: 10.00

Строка apples, pears, total: integer; описывает сразу три переменные одного типа. Запись price:0:2 — формат вывода дробного числа с двумя знаками после точки, о нём подробно в следующем уроке.

var apples, pears, total: integer; price: real; apples := 5; pears := 3; total := apples + pears; price := 1.25; место, имя и тип значения память apples 5 integer pears 3 integer total 8 integer price 1.25 real
Раздел var отводит каждой переменной место в памяти с именем и типом, а присваивания кладут туда значения: в apples — 5, в pears — 3, в total — 8, в price — 1.25.

Присваивание

Знак := (двоеточие и равно, без пробела между ними) — присваивание: положить значение справа в переменную слева. total := apples + pears значит «посчитать сумму и записать её в total». Старое значение переменной при этом пропадает.

Одиночный знак = в Pascal — это сравнение («равно ли?»), он нужен в условиях. Перепутать := и = — одна из самых частых ошибок новичков.

Присваивание := total := apples + pears 5 + 3 8 total 0 8 старое значение 0 пропадает Сравнение = apples = pears 5 =? 3 false значения не меняются
total := apples + pears считает 5 + 3 и кладёт 8 в total вместо старого значения, а apples = pears только сравнивает 5 и 3 и даёт false, не меняя переменных.

Значение можно менять на основе старого: apples := apples + 1 увеличивает apples на единицу.

Основные типы

ТипЧто хранитПример значения
integerцелое число42, -7
longintцелое число от −2 147 483 648 до 2 147 483 6471500000
int64очень большое целое, до 9 223 372 036 854 775 80710000000000
realдробное число, около 15 значащих цифр3.14, -0.5
charодин символ'A', '7', ' '
stringстрока символов'Pascal'
booleanлогическое значениеtrue, false

Дробную часть числа отделяют точкой, а не запятой: 3.14. Символы и строки, как и в writeln, пишут в одинарных кавычках.

У integer есть важная особенность. В PascalABC.NET он хранит числа от −2 147 483 648 до 2 147 483 647, а в Free Pascal в обычном режиме и в Turbo Pascal — только от −32 768 до 32 767. Сумма, которая вышла за предел, получается неверной, часто без всякой ошибки. Если числа могут быть больше 32 767, описывайте переменную как longint. Подробно — в справке Диапазон integer.

число 50 000 integer Free Pascal в обычном режиме, Turbo Pascal −32 768 … 32 767 longint и integer в PascalABC.NET −2 147 483 648 … 2 147 483 647 int64 очень большие целые до 9 223 372 036 854 775 807
В Free Pascal в обычном режиме и в Turbo Pascal integer вмещает числа только от −32 768 до 32 767, и 50 000 в него не помещается, а longint, integer в PascalABC.NET и int64 такое число вмещают.

Символы, строки и логический тип

Pascal
program Types;
var
  letter: char;
  lang: string;
  age: integer;
  isAdult: boolean;
begin
  letter := 'P';
  lang := 'Pascal';
  age := 15;
  isAdult := age >= 18;
  writeln('Буква: ', letter);
  writeln('Язык: ', lang);
  writeln('Возраст: ', age);
  if isAdult then
    writeln('Уже есть 18')
  else
    writeln('Ещё нет 18');
end.
Вывод
Буква: P
Язык: Pascal
Возраст: 15
Ещё нет 18

В isAdult записывается результат сравнения age >= 18: true (истина) или false (ложь). Такие переменные удобны в условиях — оператор if разобран в уроке Условия.

Константы

Константа — имя для значения, которое не меняется во время работы программы. Её описывают в разделе const, перед var, и пишут знак =, а не :=:

Pascal
program Week;
const
  Rate = 3.2;
  Days = 7;
var
  total: real;
begin
  total := Rate * Days;
  writeln('За неделю: ', total:0:2);
end.
Вывод
За неделю: 22.40

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

Как называть переменные

Совместимость типов

Целое число можно положить в переменную типа real: price := 5 — это 5.0. Обратно нельзя: строка total := 2.5 при total: integer не скомпилируется, потому что дробную часть некуда деть. Дробное превращают в целое явно: round(x) округляет, trunc(x) отбрасывает дробную часть. Подробно — в справке Ошибка: несовместимые типы.

Строку нельзя просто присвоить числу и наоборот: '5' — это символ, а не число. Для перевода есть отдельные процедуры — в справке Как перевести число в строку и обратно.

Начальное значение

Переменные из раздела var программы и PascalABC.NET, и Free Pascal заполняют нулями. А переменные внутри процедур и функций (о них — в уроке Процедуры и функции) в Free Pascal и Turbo Pascal не обнуляются: там может лежать случайный «мусор». Поэтому всегда задавайте начальное значение перед использованием, например sum := 0 перед подсчётом суммы, — тогда программа работает одинаково в любой среде.

Частые ошибки

Коротко

Проверьте себя

1. Какая запись присваивает переменной x значение 10?
2. Какой тип подойдёт для хранения цены 2.75?
3. Почему сумму, которая может дойти до 100 000, лучше хранить в longint, а не в integer?
4. Где описывают переменные?