Урок 3. Ввод, вывод и арифметика
Программа, которая всегда считает одно и то же, мало полезна. В этом уроке программа научится спрашивать числа у человека, считать с ними и красиво выводить результат.
Ввод: readln
readln(x) ждёт, пока человек наберёт значение и нажмёт Enter, и кладёт его в переменную x. Можно прочитать сразу несколько значений: их набирают через пробел в одной строке.
program SumTwo;
var
a, b: integer;
begin
writeln('Введите два числа через пробел:');
readln(a, b);
writeln('Сумма: ', a + b);
end.7 5Введите два числа через пробел:
Сумма: 12Блок «Ввод» — то, что набирает человек, блок «Вывод» — то, что печатает программа. Набранные цифры тоже видны на экране — их показывает сама консоль. Строка с подсказкой («Введите…») не обязательна, но с ней понятно, чего программа ждёт.
В PascalABC.NET, когда программа ждёт ввода, внизу появляется поле «Ввод данных»: наберите значения там и нажмите Enter или кнопку «Ввести».
Есть и read(x): он читает значение, но не переходит к следующей строке ввода. read удобен, когда числа идут через пробел и их нужно читать по одному в цикле — так будет в уроке о массивах. В остальных случаях берите readln.
Дробные числа вводят через точку: 2.5, а не 2,5. С запятой Free Pascal остановит программу с ошибкой, а PascalABC.NET может молча прочитать 2,5 как 25: запятую он считает разделителем разрядов. Буквы там, где программа ждёт число, останавливают программу в обеих средах.
Арифметика
| Знак | Действие | Пример | Результат |
|---|---|---|---|
+ | сложение | 7 + 2 | 9 |
- | вычитание | 7 - 2 | 5 |
* | умножение | 7 * 2 | 14 |
/ | деление | 7 / 2 | 3.5 |
div | целая часть от деления | 7 div 2 | 3 |
mod | остаток от деления | 7 mod 2 | 1 |
Главное отличие от школьной математики — деление. Знак / всегда даёт дробное число (real), даже если делится нацело: 6 / 2 — это 3.0, и записать его в переменную integer нельзя. Для целых чисел есть div (сколько раз помещается) и mod (что осталось). Подробно — в справке Чем отличаются div, mod и /.
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Порядок действий — как в математике: сначала *, /, 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) | квадратный корень, всегда real | sqrt(81) | 9.0 |
round(x) | округлить до целого | round(7.8) | 8 |
trunc(x) | отбросить дробную часть | trunc(7.8) | 7 |
pi | число π | pi | 3.14159… |
Пример — площадь круга по радиусу:
program CircleArea;
var
r, s: real;
begin
readln(r);
s := pi * r * r;
writeln('Площадь круга: ', s:0:2);
end.2Площадь круга: 12.57round и trunc превращают дробное число в целое, и только так real можно записать в integer:
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. Так устроено банковское округление, это не ошибка.
Пример: сдача в магазине
Программа читает цену товара и сумму, которую дал покупатель, и считает сдачу в рублях и копейках. Чтобы не мучиться с дробями, всё считается в копейках — целыми числами:
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 копеек.
Частые ошибки
/вместоdiv.n := a / bприn: integerне скомпилируется: результат/— дробный.- Деление на ноль.
a div 0иa mod 0останавливают программу с ошибкой. Проверяйте делитель заранее. - Ввод через запятую.
2,5вместо2.5— ошибка ввода или совсем другое число. - Вывод дробного без формата. Результат выглядит непривычно и по-разному в разных средах — добавляйте
:0:2.
Коротко
readln(a, b)читает значения с клавиатуры, набирают их через пробел./всегда даётreal; для целых —div(целая часть) иmod(остаток).- Дробные числа выводят с форматом:
writeln(x:0:2)— два знака после точки. roundиtruncпереводятrealв целое;sqrtвсегда возвращаетreal.- Деньги удобно считать в копейках, целыми числами.