Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi / песни о паскале.pdf
Скачиваний:
63
Добавлен:
26.03.2016
Размер:
5.16 Mб
Скачать

Глава 47 Системы счисления

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

Из тьмы веков

Когда явилась потребность в счете? — никто не помнит этого, но мудрецы всех времен упорно искали удобные способы изображения чисел. Поиск систем счисления — так их теперь называют — это захватывающая история! Трудно поверить, но античные математики ещё не знали десятичной системы! И как они решали свои замысловатые задачи?

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

Потребовались века, чтобы индийцы додумались до цифр. Их цифры были похожи на современные «1», «2», «3» и так далее. Но истинную революцию в арифметике содеяла цифра «0». Тот, кто её придумал, поставил всё на свои места, причем в буквальном смысле. Ведь ноль породил позиционную десятичную систему счисления, где «вес» цифры определяется её позицией внутри числа. Странно, что в просвещенной Европе удобная десятичная система приживалась непросто и вытеснила неудобную римскую только в 15-16 веках!

Наконец пробил час немецкого математика Лейбница, в голову которого пришла здравая мысль: «Зачем так много цифр? — изумился он, взглянув на циферблат своих часов, — когда вполне достаточно двух!». Так была изобретена двоичная система счисления, — «родная» для нынешних компьютеров.

Число и его изображение

Пора прояснить, что же такое системы счисления? Числа — это плод нашего воображения, в природе их никто не видел, они существуют лишь в наших головах. Не потому ли с числами связаны порой курьезные заблуждения? Иные полагают, что перевод числа из одной системы счисления в другую меняет это число. Вам смешно? Взгляните на рис. 103, где устроилась дюжина попугаев. Дюжина — это двенадцать, я написал это по-русски, а мог бы на другом языке. Или обозначил бы китайским иероглифом, — количество попугаев от этого не изменится. Как в поговорке: хоть горшком назови, только в печь не сажай!

358

Глава 47

Системы счисления

Двенадцать по-русски

Twelve по-английски

12 в десятичной системе

111111111111 в единичной системе

1100 в двоичной системе

0Сh в шестнадцатеричной системе

$0С в шестнадцатеричной системе на Паскале

Рис. 103 – Способы изображения числа 12

Итак, что ни скажи, но на картинке всё те же двенадцать попугаев. Это число изображено рядом в нескольких системах счисления: единичной, десятичной, двоичной и шестнадцатеричной. И, хотя изображения не схожи меж собой, все они относятся к двенадцати попугаям. Стало быть, число и его изображение — не одно и то же!

Мы изображаем числа строками символов — цифрами. Поручив процедуре Writeln напечатать число, мы не задумываемся, как она делает это, — число превращается в строку цифр неведомым нам образом. Допустим на минуту, что процедура Writeln этого не умеет, и тогда явится потребность сделать такое преобразование самим. Итак, ставим себе первую задачу: преобразовать число в строку, то есть получить символьное изображение числа.

Справившись с первой задачей, займемся обратным преобразованием — строки в число. Это умеет процедура Readln, но мы пока забудем об этом. Дело в том, что упомянутые стандартные процедуры понимают лишь десятичную систему счисления. Мы же добиваемся большего, — мы хотим изображать числа в любой системе счисления (двоичной, троичной и так далее). А начнем, разумеется, с родной десятичной системы.

359

Глава 47

Системы счисления

Десятичная система

Десятичную систему знает всякий: здесь крайняя правая цифра числа означает единицы, а последующие — десятки, сотни и так далее. Например, число 2048 представляется так.

2048 = 2 • 1000 + 0 • 100 + 4 • 10 + 8 • 1

Или так.

2048 = 2 • 103 + 0 • 102 + 4 • 101 + 8 • 100

То есть, позиция цифры в числе равна показателю степени при десятке, если счет позиций вести справа налево, начиная с нуля.

Повторю нашу цель: мы хотим превратить нечто цельное — число — в цепочку символов. Как это сделать? Есть мысли? Я предлагаю «откалывать» от числа цифру за цифрой, превращая их в символы и складывая в строку. Из опыта известно, что легче всего «отгрызть» от числа младшую цифру, вычисляя остаток от деления на десять, вот так.

младшая_цифра := число MOD 10

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

старшая_часть := число DIV 10

Так прояснилась схема дробления числа, показанная на рис. 104.

360

Глава 47

Системы счисления

 

2

0

4

8

 

N mod 10

N div 10

 

 

 

 

 

 

 

2

0

4

 

8

 

Старшая

 

 

 

 

 

Младшая

часть числа

2

0

 

 

4

 

 

 

цифра числа

 

 

 

 

 

 

2

 

0

 

 

 

0

 

2

 

 

 

Рис. 104 – Выделение отдельных цифр десятичного числа

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

var N : integer;

S : string;

 

begin

{ Преобразование числа в строку десятичных цифр }

Write('N= '); Readln(N);

 

S:='';

 

 

 

repeat

 

 

 

S:= Char((N mod 10)+Ord('0')) + S;

{ выделение очередной цифры }

N:= N div 10;

 

{ отделение старшей части }

until N=0;

 

 

Writeln(S); Readln;

 

end.

 

 

 

 

 

 

 

Теперь, когда мы смогли превратить число в строку, займемся обратным превращением — соберем число из символов строки. Откуда подступиться к этой сборке? Запишем разложение числа с помощью скобок следующим образом:

2048 = 2 • 1000 + 0 • 100 + 4 • 10 + 8 • 1 = (((0 •10+2) •10+0) •10+4) •10+8

Правила действий со скобками требуют начать вычисление с внутренних, самых глубоких скобок. Следовательно, сборку числа из отдельных цифр начнем со старших разрядов, последовательно умножая накопленную сумму на 10. Внутри

361

Глава 47

Системы счисления

самых глубоких скобок добавлено слагаемое 0•10. Не влияя на результат вычислений, оно придает общность алгоритму сборки, который показан на рис. 105.

 

 

Исходная строка

 

 

 

 

 

Исходная сумма N = 0

0

 

 

’ 2 0 4 8 ’

 

 

 

 

 

 

• 10

+2

 

2

+0

• 10

2

0

+4

 

 

 

• 10

+8

2 0 4

Результат N=2048

• 10

2

0

4

8

 

 

 

 

Рис. 105 – Сборка числа из строки десятичных цифр

Например, для числа 2048 сборка пойдет в таком порядке:

N = 0 - исходное значение

N = 0 • 10 + 2 = 2

N = 2 • 10 + 0 = 20

N = 20 • 10 + 4 = 204

N = 204 • 10 + 8 = 2048

А вот программа, работающая по этому алгоритму.

362

Соседние файлы в папке delphi