Сделай Сам Свою Работу на 5

Синтаксис целочисленных выражений.





 

Дополненный синтаксис для целочисленнных выражений Паскаля приведен ниже.

 

<выражение> ::= <простое выражение>

| <простое выражение><оператор сравнения><простое выражение>

<простое выражение> ::= <простое выражение> <аддитивный оператор> <терм>

| <терм> | <знак> <терм>

<терм> ::= <терм> <мультипликативный оператор> <множитель> | <множитель>

<множитель> ::= <переменная> | <беззнаковая константа> | (выражение) | NOT <множитель>

<оператор сравнения> ::= = | <> | < | <= | > | >=

<знак> ::= + | -

<аддитивный оператор> ::= + | - | OR

<мультипликативный оператор> ::= * | DIV | MOD | AND

<переменная> ::= <идентификатор переменной>

<беззнаковая константа> ::= <беззнаковое число> | <идентификатор константы>

| <строка символов>

<беззнаковое число> ::= <беззнаковое целое>

 

Значение целочисленных выражений.

 

Значение целочисленных выражений дается в виде следующего рекурсивного определения для состояния выполнения S:

 

E1 = E2(S) = (E1(S) = E2(S))

E1 <> E2(S) = (E1(S) ¹ E2(S))

E1 < E2(S) = (E1(S) < E2(S))

E1 <= E2(S) = (E1(S) ≤ E2(S))



E1 > E2(S) = (E1(S) > E2(S))

E1 >= E2(S) = (E1(S) ≥ E2(S))

E1 + E2(S) = (E1(S) + E2(S)) (возможно переполнение)

E1 - E2(S) = (E1(S) - E2(S)) (возможно переполнение)

E1 * E2(S) = (E1(S) x E2(S)) (возможно переполнение)

E1 DIV E2(S) = (E1(S) / E2(S))

E1 MOD E2(S) = (E1(S) – (E1(S) / E2(S)xE2(S)))

+E (S) = E (S)

-E (S) = - E (S)

(E) (S) = E (S)

 

Это определение дает значение каждого оператора. Для выражения с более чем одним оператором, значение вычисляется терм за термом, в соответствии с правилами синтаксиса Паскаля, задающими предшествование и ассоциативность.

 

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

 

Рассмотрим строку цифр длиной 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

 

Тип диапазон.

 

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

 

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

 

<тип диапазон> ::= <константа> .. <константа>

<константа> ::= <знак> <беззнаковое число> | <беззнаковое число>

| <идентификатор константы> | <строка символов>

 

Рассмотрим следующее объявление:

 

TYPE

Letter = ‘A’ .. ‘Z’;

SmallInt = 0 .. 100;

SmallerInt = 1 .. 10;

VAR

L: Letter;

X: SmallInt;

Y: SmallerInt;

 

Тип, которому принадлежат константы, задающие диапазон, называется владеющим типом (host type). Все операции владеющего типа могут быть применены к операндам его поддиапазона. В примере выше владеющим типом для Letter является CHAR, а для SmallInt и SmallerInt – INTEGER. Таким образом, символьные операции могут быть применены к L, а целочисленные к SmallInt и SmallerInt.

 

BEGIN

...

IF L = ‘A’ {сравниваем Letter и CHAR}

THEN

...

WRITE(X+Y); {складываем целые значения}

...

END

 

После определения перечислимого типа, его константы могут быть использованы для определения диапазонов, владеющим типом которых является перечислимых тип. Объявление таких новых типов не ведут к дублированию идентификаторов, использованых при определении диапазона.

 

TYPE

DayOfWeek = (Monday, Tuesday, Wednesday, Thursday,

Friday, Saturday, Sunday);

WeekDay = Monday .. Friday;

WeekEndDay = Saturday, Sunday;

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.