Как делить в паскале
Перейти к содержимому

Как делить в паскале

Язык программирования Pascal

Целочисленная арифметика языка Паскаль (например, в версии Turbo Pascal 7.0) основана на использовании пяти стандартных целых типов: Byte, Word, ShortInt, Integer, LongInt.

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

Cо всеми целыми типами связан набор из пяти основных арифметических операций: +, -, *, div, mod.

Первые три, из перечисленных операций, имеют обычный смысл сложения, вычитания и умножения, соответственно, а последние две определяются так: A div B — частное от деления нацело, A mod B — остаток от деления нацело двух целых чисел A и B.

При этом, для неотрицательных А и В (В‡0), частное A div B показывает, сколько раз делитель — число B, содержится в делимом — числе A; в то же время, остаток A mod B показывает, сколько останется, если из делимого — числа А, вычесть все вхождения в него делителя — числа В.

15 div 6 = 2 (здесь 2 — частное. Оно показывает, сколько раз делитель — число 6, содержится в делимом — числе 15).

15 mod 6 = 3 (здесь 3 — остаток. Он показывает, сколько останется, если из числа 15, вычесть все вхождения в него числа 6).

В общем случае, когда А и В — произвольные целые (которые могут быть и отрицательными), при определении операций div и mod, как указано выше, рассматриваются их модули, а знак результата учитывается отдельно.

В Паскале принято, что знак частного от целочисленного деления (А div В) определяется как и при обычном алгебраическом делении, а знак остатка (A mod B) — совпадает со знаком А.

В дальнейшем, для краткости, в данной статье, ограничимся рассмотрением только неотрицательных целых.

Для целых, неотрицательных A и B, операции div и mod (не путать их!) связаны простым соотношением: A mod B =A — (A div B)*B.

В качестве полезного для усвоения div и mod упражнения, проверьте это соотношение, например, на следующих парах чисел (А, В): (13, 5), (40,2), (40,6), (6,40), (1,1).

При этом, обычно используется несколько стандартных фактов и приёмов которые, для успешного решения таких задач, необходимо твёрдо усвоить:
(А mod B=0) — условие делимости целого A на целое B;
(A mod 2 =0) — условие чётности целого A (впрочем, в Паскале, это же условие правильней задать выражением not odd(A), которое может вычисляться быстрее);
(A mod 10) — значение последней цифры в десятичной записи целого А (например, 1234 mod 10 =4);
(A div 10) — число, десятичная запись которого получится отбрасыванием последней цифры в десятичной записи целого числа А (например, 1234 div 10 =123);

При рассмотрении выше перечисленных фактов и приёмов, важно их изучить, понять их внутренний смысл, а не просто заучить.

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

Задача1. Дано трёхзначное в десятичной записи натуральное число. Составить Паскаль-программу, печатающую число, которое получается записью цифр исходного числа в обратном (реверсном) порядке.

//Решение 1. Выделяем цифры и печатаем их в обратном порядке
program Revers1;
var a, sotni,desiatki,edinici: Byte;
begin
a:=154; // пример исходного значения
edinici:=a mod 10; //4
desiatki:=(a div 10) mod 10; //5
sotni:=a div 100; //1
Writeln('Исходное число: ', a); //154
Writeln('Полученное число: ', edinici,desiatki,sotni) //451
end.

//Решение 2. Выделяем цифры, составляем из них новое число и печатаем
program Revers2;
var a, b, sotni,desiatki,edinici: Byte;
begin
a:=154;
edinici:=a mod 10; //4
desiatki:=(a div 10) mod 10; //5
sotni:=a div 100; //1
b:= edinici*100 + desiatki*10 + sotni; //451
Writeln('Исходное число: ', a); //154
Writeln('Полученное число: ', b) //451
end.

В приведённых выше решениях, переменная a получает начальное значение в результате выполения оператора присваивания (a:=154 ), а не оператора ввода ( Readln(a) ), что было бы реалистичней. Это сделано только для того,чтобы Вам было удобней проследить за изменением значений переменных по мере выполнения соответствующих программ.

Задача2. Дано однозначное в десятичной записи натуральное число. Составить Паскаль-программу, печатающую двоичное его представление.

Предварительное замечание. Т.к. наибольшее удовлетворяющее условию задачи исходное число 9 содержит в двоичном представлении 4 цифры (910=10012), результирующее число так же будем считать четырёхзначным.

С учётом этого замечания, можно записать следующую программу.

//Выделяем дв. циф. и собираем в обратном порядке в 10-тичн. число
program DesToDv;
var A, B,C: Word;
begin
А:=5; // здесь мог бы быть оператор Readln(A)
Writeln('Исходное число в десятичном представлении: ', A); //5
С:=1; // 1
B:=0;
B:= B + C*(A mod 2); // 1
A:= A div 2; // 2
C:= C*10; // 10
B:= B + C*(A mod 2); // 01
A:= A div 2; // 1
C:= C*10; // 100
B:= B + C*(A mod 2); // 101
A:= A div 2; // 0
C:= C*10; // 1000
B:= B + C*(A mod 2); // 0101
Writeln('Его двоичная запись: ', B) // 0101
end.

Задача3. Дано четырёхзначное в двоичной записи натуральное число. Составить Паскаль-программу, печатающую его десятичное представление.

Эта задача является обратной к предыдущей и состоит в переводе небольшого натурального числа из двоичной системы счисления в десятичную.

Исходное число, хотя по смыслу и является двоичным, будет нами представляться в десятичной системе счисления, но при этом с использованием только цифр 0 и 1. Например, вместо (невозможного в Паскале) ввода числа восемь в виде 10002 будем вводить идентичное требуемому, по форме записи, десятичное число 1000 (тысяча).

Заметьте, что проблема визуализации двоичных выходных данных в предыдущей задаче здесь теперь стала проблемой визуализации двоичных входных данных. И решаются эти проблемы одинаково.

//Выделяем "дв. цифры" и, умножая на степени двойки, складываем
program DvToDes;
var A, B: Word;
begin
А:=1011; // здесь мог бы быть оператор Readln(A)
Writeln('Исходное число в двоичном представлении: ', A);
stpn2:=1; // нулевая степень двойки
B:=0; //начальная сумма
B:= B + (A mod 10)*stpn2; // учли в сумме последн. разряд
A:= A div 10; // отрезали, получив 101
stpn2:= stpn2*2; // первая степень двойки
B:= B + (A mod 10)*stpn2; // учли предпоследний разряд
A:= A div 10; // отрезали, получив 10
stpn2:= stpn2*2; // вторая степень двойки
B:= B + (A mod 10)*stpn2; // учли разряд 0
A:= A div 10; // отрезали, получив 1
stpn2:= stpn2*2; // третья степень двойки
B:= B + (A mod 10)*stpn2; //учли перв. разряд исходного числа
Writeln('Его двоичная запись: ', B) // 13
end.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *