Олег Деревенец - Песни о Паскале
- Название:Песни о Паскале
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Олег Деревенец - Песни о Паскале краткое содержание
Песни о Паскале - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Табл. 11 – Изображения чисел в различных системах счисления
Десятичная | Двоичная | 16-ричная | Десятичная | Двоичная | 16-ричная |
0 | 0000 | 0 | 8 | 1000 | 8 |
1 | 0001 | 1 | 9 | 1001 | 9 |
2 | 0010 | 2 | 10 | 1010 | A |
3 | 0011 | 3 | 11 | 1011 | B |
4 | 0100 | 4 | 12 | 1100 | C |
5 | 0101 | 5 | 13 | 1101 | D |
6 | 0110 | 6 | 14 | 1110 | E |
7 | 0111 | 7 | 15 | 1111 | F |
Итак, мы познакомились с тремя позиционными системами счислений: десятичной, двоичной и шестнадцатеричной. Существуют ли другие системы? Конечно! Во всех позиционных системах вес цифры определяется её положением в числе, сравните.
2048 = 2• 10 3+ 0• 10 2+ 4• 10 1+ 8• 10 0- десятичная;
12 = 1100 2= 1• 2 3+ 1• 2 2+ 0• 2 1+ 0• 1 0- двоичная;
4000 = $FA0 = F• 16 2+ A• 16 1+ 0• 16 0- шестнадцатеричная.
Число, на котором построена система, называют её основанием. Можно выдумать столько систем счисления, сколько существует чисел, то есть, бесконечно много. Пока нам достаточно тех, что придуманы. А если с других планет прилетят существа с семью пальцами на руках? Для них, вероятно, «родной» будет семеричная система, и мы должны быть готовы к этому!
Так мы подошли к задаче по настоящему серьезной: изобразить число в некоторой системе счисления (основания систем ограничим числами от 2 до 16).
Преобразуя числа в десятичную систему, мы «отгрызали» цифры, начиная с младших разрядов, операциями деления и получения остатка. Точно так же преобразуют числа и в другие системы, только откалывают куски иного размера. Поскольку в двоичной системе есть только две цифры, то для неё младшая цифра отсекается операцией MOD 2, а старшая часть – операцией DIV 2. Для шестнадцатеричной системы – соответственно операциями MOD 16 и DIV 16. Отсюда следует правило: для преобразования числа в N–ричную систему счисления младшую цифру отделяют операцией MOD N, а старшую часть числа – операцией DIV N.
В программе «P_47_1» функция ConvertFromNumber – «преобразовать из числа» – делает именно то, о чем сказано выше. Обратите внимание на строковую константу.
const CDigits : string = '0123456789ABCDEF';
Она служит для изящного преобразования чисел 0–15 в шестнадцатеричные цифры «0»–«F». Константы, для которых явно указан тип, называют типизированными, – это пример такой константы.
{ P_47_1 – Преобразование в произвольную систему счисления }
{ Функция преобразования десятичного числа в другие системы счисления }
function ConvertFromNumber(aBase, aNumber : integer): string;
const CDigits : string = '0123456789ABCDEF';
var n : integer; c : char; S : string;
begin
S:=''; { Накопитель цифр }
repeat
n:= aNumber mod aBase; { остаток от деления на основание }
aNumber:= aNumber div aBase; { частное от деления на основание }
c:= CDigits[1+n]; { выбираем цифру из строки }
S:= c + S; { вставляем цифру в результат }
until aNumber=0;
ConvertFromNumber:= S; { готово! }
end;
var B, N : integer; { B – основание системы, N – число }
begin {=== Главная программа ===}
repeat
Write('Основание системы= '); Readln(B);
if B in [2..16] then begin
Write('Преобразуемое число= '); Readln(N);
Writeln(ConvertFromNumber(B, N));
end
until not (B in [2..16]);
end.
Эта простая программа подарит вам счастье наблюдать знакомые десятичные числа в экзотических системах счисления, например, в троичной или пятеричной.
Теперь займемся обратной задачей: пусть дана строка символов, изображающая некое число в известной системе счисления; требуется преобразовать эту строку в число и напечатать в десятичной системе.
Сборка числа из десятичных цифр нами освоена. Она выполнялась умножением накопленной суммы на десять с прибавлением очередной цифры, начиная со старшей. Надо ли объяснять, что сборка в других системах выполняется точно так же? Только умножать будем не на десять, а на основание системы счисления. В следующей ниже программе сборка выполняется функцией ConvertToNumber – «преобразовать в число».
{ P_47_2 – Преобразование из других систем счисления }
function ConvertToNumber(aBase: integer; aNumber: string): integer;
var i,n, Sum : integer;
c : char;
begin
Sum:=0; { Накопитель результата }
for i:=1 to Length(aNumber) do begin
c:= Upcase (aNumber[i]);
if c in ['0'..'9']
then n:= Ord(c)-Ord('0') {0..9}
else n:= 10+Ord(c)-Ord('A') ; {10..15}
Sum:= aBase*Sum + n; { Накопление суммы }
end;
ConvertToNumber:= Sum; { готово! }
end;
var B : integer; { Основание системы }
N : string; { Изображение числа в виде строки }
begin {=== Главная программа ===}
repeat
Write('Основание системы= '); Readln(B);
if B in [2..16] then begin
Write('Преобразуемое число= '); Readln(N);
Writeln(ConvertToNumber(B, N));
end
until not (B in [2..16]);
end.
Как обычно, здесь выделены операторы, стоящие внимания. Функция UpCase преобразует строчные латинские буквы в заглавные. Ведь шестнадцатеричные цифры от «A» до «F» могут быть введены пользователем в любом регистре, а последующие операторы преобразования цифры в число предполагают заглавные буквы – вот потому и понадобилась функция UpCase.
Теперь о превращении символов в числа. Цифры от «0» до «9» преобразуются вычитанием из кода цифры кода символа «0». Для цифр от «A» до «F» после вычитания кода буквы «A» к разности прибавляем число 10. Все сказанное относится к следующему условному оператору.
if c in ['0'..'9']
then n:= Ord(c)- Ord('0') {0..9}
else n:= 10 + Ord(c)- Ord('A'); {10..15}
Вот, пожалуй, и вся премудрость. Испытание этой программы убедит вас в том, что волшебства случаются не только в сказках!
• Способ изображения чисел посредством знаков называется системой счисления.
• Одно и то же число может быть изображено в разных системах счисления.
• Все современные системы счисления – позиционные. Это значит, что вес цифры определяется позицией в числе.
Читать дальшеИнтервал:
Закладка: