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

Урок 3. Ввод, вывод и арифметика

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

Программа, которая всегда считает одно и то же, мало полезна. В этом уроке программа научится спрашивать числа у человека, считать с ними и красиво выводить результат.

Ввод: readln

readln(x) ждёт, пока человек наберёт значение и нажмёт Enter, и кладёт его в переменную x. Можно прочитать сразу несколько значений: их набирают через пробел в одной строке.

Pascal
program SumTwo;
var
  a, b: integer;
begin
  writeln('Введите два числа через пробел:');
  readln(a, b);
  writeln('Сумма: ', a + b);
end.
Ввод
7 5
Вывод
Введите два числа через пробел:
Сумма: 12
человек набирает 7 пробел 5 Enter ввод закончен readln(a, b) раскладывает значения по порядку a 7 b 5
Человек набирает 7, пробел, 5 и нажимает Enter, а readln(a, b) раскладывает значения по порядку: 7 попадает в a, 5 — в b.

Блок «Ввод» — то, что набирает человек, блок «Вывод» — то, что печатает программа. Набранные цифры тоже видны на экране — их показывает сама консоль. Строка с подсказкой («Введите…») не обязательна, но с ней понятно, чего программа ждёт.

В PascalABC.NET, когда программа ждёт ввода, внизу появляется поле «Ввод данных»: наберите значения там и нажмите Enter или кнопку «Ввести».

Есть и read(x): он читает значение, но не переходит к следующей строке ввода. read удобен, когда числа идут через пробел и их нужно читать по одному в цикле — так будет в уроке о массивах. В остальных случаях берите readln.

Дробные числа вводят через точку: 2.5, а не 2,5. С запятой Free Pascal остановит программу с ошибкой, а PascalABC.NET может молча прочитать 2,5 как 25: запятую он считает разделителем разрядов. Буквы там, где программа ждёт число, останавливают программу в обеих средах.

Арифметика

ЗнакДействиеПримерРезультат
+сложение7 + 29
-вычитание7 - 25
*умножение7 * 214
/деление7 / 23.5
divцелая часть от деления7 div 23
modостаток от деления7 mod 21

Главное отличие от школьной математики — деление. Знак / всегда даёт дробное число (real), даже если делится нацело: 6 / 2 — это 3.0, и записать его в переменную integer нельзя. Для целых чисел есть div (сколько раз помещается) и mod (что осталось). Подробно — в справке Чем отличаются div, mod и /.

Pascal
program Arithmetic;
var
  a, b: integer;
begin
  a := 17;
  b := 5;
  writeln(a, ' + ', b, ' = ', a + b);
  writeln(a, ' - ', b, ' = ', a - b);
  writeln(a, ' * ', b, ' = ', a * b);
  writeln(a, ' / ', b, ' = ', (a / b):0:2);
  writeln(a, ' div ', b, ' = ', a div b);
  writeln(a, ' mod ', b, ' = ', a mod b);
end.
Вывод
17 + 5 = 22
17 - 5 = 12
17 * 5 = 85
17 / 5 = 3.40
17 div 5 = 3
17 mod 5 = 2
17 предметов раскладываем по 5 17 div 5 = 3 сколько полных групп 17 mod 5 = 2 остаток 17 / 5 = 3.4 6 / 2 = 3.0 знак / всегда даёт real
Если разложить 17 предметов по 5, получится 3 полные группы — это 17 div 5 — и 2 в остатке — это 17 mod 5, а деление через / всегда даёт дробное число: 17 / 5 = 3.4, 6 / 2 = 3.0.

Порядок действий — как в математике: сначала *, /, div, mod, потом + и -, действия одного уровня — слева направо. Скобки меняют порядок: (2 + 3) * 4 — это 20, а 2 + 3 * 4 — 14.

Вывод дробных чисел

Запись x:0:2 после значения в writeln — это формат: вывести дробное число с двумя знаками после точки. Первое число — ширина поля (0 — сколько понадобится), второе — сколько знаков после точки. Число при выводе округляется, а сама переменная не меняется.

Без формата среды выводят дробные числа по-разному: PascalABC.NET — обычной десятичной записью с множеством знаков, Free Pascal — в научной записи с буквой E. Поэтому дробные числа выводите с форматом всегда. Подробно — в справке Как вывести число с двумя знаками после запятой.

Формат работает и для целых: writeln(n:5) выводит число в поле шириной 5 символов, дополняя пробелами слева. Так удобно выравнивать столбцы.

Математические функции

ФункцияЧто делаетПримерРезультат
abs(x)модуль числаabs(-15)15
sqr(x)квадратsqr(12)144
sqrt(x)квадратный корень, всегда realsqrt(81)9.0
round(x)округлить до целогоround(7.8)8
trunc(x)отбросить дробную частьtrunc(7.8)7
piчисло πpi3.14159…

Пример — площадь круга по радиусу:

Pascal
program CircleArea;
var
  r, s: real;
begin
  readln(r);
  s := pi * r * r;
  writeln('Площадь круга: ', s:0:2);
end.
Ввод
2
Вывод
Площадь круга: 12.57

round и trunc превращают дробное число в целое, и только так real можно записать в integer:

Pascal
program Rounding;
var
  x: real;
  n: integer;
begin
  x := 7.8;
  n := round(x);
  writeln(n);
  n := trunc(x);
  writeln(n);
  writeln(round(-2.3));
  writeln(sqrt(81):0:1);
end.
Вывод
8
7
-2
9.0

У чисел ровно посередине, вроде 2.5, round в PascalABC.NET и Free Pascal округляет к чётному: round(2.5) даёт 2, а round(3.5) — 4. Так устроено банковское округление, это не ошибка.

ближайшее целое round(7.8) = 8 7 8 7.8 trunc(7.8) = 7 дробная часть отбрасывается ровно посередине — к чётному round(2.5) = 2 round(3.5) = 4 2 2.5 3 3.5 4
trunc(7.8) отбрасывает дробную часть и даёт 7, round(7.8) берёт ближайшее целое 8, а числа ровно посередине round округляет к чётному: 2.5 — до 2, 3.5 — до 4.

Пример: сдача в магазине

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

Pascal
program Change;
var
  price, paid, rest: longint;
begin
  writeln('Цена и оплата в копейках:');
  readln(price, paid);
  rest := paid - price;
  writeln('Сдача: ', rest div 100, ' руб. ', rest mod 100, ' коп.');
end.
Ввод
1745 2000
Вывод
Цена и оплата в копейках:
Сдача: 2 руб. 55 коп.

255 div 100 — это 2 рубля, 255 mod 100 — 55 копеек. Тип longint взят с запасом: в Free Pascal integer не вместил бы сумму больше 327 рублей 67 копеек.

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

Коротко

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

1. Чему равно 17 mod 5?
2. Переменная n описана как integer. Какая строка не скомпилируется?
3. Что выведет writeln(3.14159:0:2)?
4. Как ввести дробное число 2,5, когда программа выполняет readln(x) для x: real?