Преобразование символов в числа

Рассмотрим строку цифр длиной N:

c1, c2, …, cN-1, cN

Соответствие между строкой и числом, которое она представляет, задается формулой:

где B – основание системы исчисления, а c – численное значение i -го символа в строке.

Для числа 0101 получаем следующие десятичные значения в выбранных системах исчисления:

01012 = 0x23 + 1x22 + 0x21+1x20 = 0 + 4 + 0 + 1 = 510

01018 = 0x83 + 1x82 + 0x81+1x80 = 0 + 64 + 0 + 1 = 6510

010110 = 0x103 + 1x102 + 0x101+1x100 = 0 +100 + 0 + 1 = 10110

010116 = 0x163 + 1x162 + 0x161+1x160 x= 0 + 256 + 0 + 1 = 25710

Цифры систем счисления больше 10 обычно представляются буквами, например цифры шестнадцатиричной системы исчисления следующие:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

Лучшая стратегия поиска десятичного значения выражения в системе исчисления с основанием B:

c1 x BN-1 + c2 x BN-2 + … + cN x B0

умножать его, используя правило Хорнера (Horner’s rule)

(…(c1 x B + c2) x B + c3) … x B + cN

Процедура StringToInt преобразовывает строки символов в системе счисления представленной Base в целочисленные значения в Result, используя правило Хорнера.

DP 1

PROCEDURE StringToInt (VAR F: TEXT; VAR Base, Result: INTEGER);

{F=<,x#y, R>, где x – строка цифр, Base – целое число,

2 <= Base <= 16, задающее их систему исчисления -->

F, Result:= <x#, y, R>, N(x), где N – целое значение,

имеющее символьное представление x}

VAR<

Ch: CHAR;

Digit: INTEGER;

BEGIN {StringToInt}

Result:= 0;

READ(F, Ch);

WRITE(Ch);

WHILE(Ch <> ‘#’) AND (Ch <> ‘ ’)

DO

BEGIN

{Digit:= число, соотвествующее Ch в Base}

Result:= Result * Base + Digit;

READ(F, Ch);

WRITE(Ch)

END

END. {StringToInt}

Код для нахождения целого, соответствующего Ch простой, но длинный, поэтому он оформлен в виде процедуры.

DP 1.1.

PROCEDURE CharToDigit (VAR Ch: CHAR; VAR Result: INTEGER);

{(‘0’ <= Ch <= ‘9’ OR ‘A’ <= Ch <= ‘F’ -->

Result:= число соответствующее Ch) |

(NOT (‘0’ <= Ch <= ‘9’ OR ‘A’ <= Ch <= ‘F’) -->

Result:= 0)}

BEGIN { CharToDigit}

IF Ch = ‘0’ THEN Result:= 0 ELSE

IF Ch = ‘1’ THEN Result:= 1 ELSE

IF Ch = ‘2’ THEN Result:= 2 ELSE

IF Ch = ‘3’ THEN Result:= 3 ELSE

IF Ch = ‘4’ THEN Result:= 4 ELSE

IF Ch = ‘5’ THEN Result:= 5 ELSE

IF Ch = ‘6’ THEN Result:= 6 ELSE

IF Ch = ‘7’ THEN Result:= 7 ELSE

IF Ch = ‘8’ THEN Result:= 8 ELSE

IF Ch = ‘9’ THEN Result:= 9 ELSE

IF Ch = ‘A’ THEN Result:= 10 ELSE

IF Ch = ‘B’ THEN Result:= 11 ELSE

IF Ch = ‘C’ THEN Result:= 12 ELSE

IF Ch = ‘D’ THEN Result:= 13 ELSE

IF Ch = ‘E’ THEN Result:= 14 ELSE

IF Ch = ‘F’ THEN Result:= 15

ELSE

BEGIN

Result:= 0

END

END. { CharToDigit}

Для тестирования этого проекта он помещается в программу, которая сначала считывает основание системы счисления в десятичном формате, в котором должна быть интерпретирована следующая строка.

PROGRAM Convert (INPUT, OUTPUT);

VAR

Base, Number: INTEGER;

{Включить PROCEDURE StringToInt

(VAR F: TEXT; VAR Base, Result: INTEGER);

F=<,x#y, R>, где x – строка цифр, Base – целое число,

2 <= Base <= 16, задающее их систему исчисления -->

F, Result:= <x#, y, R>, N(x), где N – целое значение,

имеющее символьное представление x}

BEGIN {Convert}

READ(Base);

StringToInt(INPUT, Base, Number);

WRITELN;

WRITELN(‘Десятичное значение:’, Number)

END. {Convert}

Выполнение:

INPUT: 8 0101#

OUTPUT: 8 0101#

Десятичное значение: 65

INPUT: 16 1F#

OUTPUT: 16 1F#

Десятичное значение: 31


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: