Уточнення алгоритму обчислення виразу

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Реферат на тему:

Уточнення алгоритму обчислення виразу

Напишемо функцію llxval обчислення значення виразу за його ЗПЗ, що подається послідовністю лексем. У цій функції використовуються засоби з модуля SLlx:

- функція перевірки вичерпання послідовності лексем із заголовком

function isemllx ( Llx : Sqlx ) : boolean;

-процедура добування й вилучення першого елемента послідовності лексем із заголовком

procedure get ( var Llx : Sqlx; var lx : Tlx ).

Крім того, використовуються підпрограми обробки магазина лексем, про які сказано в попередньому підрозділі.

function llxval ( var Llx : Sqlx ) : real;

var Slx : Stlx; lx, lx1, lx2 : Tlx; ok : boolean;

begin

inits( Slx ); ok := true;

while not isemllx( Llx ) and ok do

begin

get( Llx, lx);

case lx.stl of

con : push( Slx, lx );

ops : begin

pop( Slx, lx2 ); pop( Slx, lx1 );

case lx.sig of

'+' : lx1.numb := lx1.numb + lx2.numb;

'-' : lx1.numb := lx1.numb - lx2.numb;

'*' : lx1.numb := lx1.numb * lx2.numb;

'/' : if lx2.numb <> 0 then

lx1.numb := lx1.numb / lx2.numb

else ok := false

end;

if ok then push( Slx, lx1 )

end;

nam : begin

pop( Slx, lx1 );

if lx.name = 'sin' then

lx1.numb := sin( lx1.numb ) else

if lx.name = 'cos' then

lx1.numb := cos( lx1.numb );

push( Slx, lx1 )

end

end { case lx.stl }

end; { while }

if ok then

begin pop( Slx, lx1); llxval := lx1.numb end

else

begin

writeln( '***zerodivide***' ); llxval := 0

end

end;

Множини в мові Паскаль

У підпрограмах розроблюваного модуля читання лексем доведеться мати справу з множинами символів. Подання та обробку множин символів та значень інших перелічуваних типів у мові Паскаль зручно задавати з використанням спеціальних типів множин.

Стала-множина задається в дужках [] переліком елементів або діапазонів. Наприклад, множина чисел {1, 2, 3, 5} подається як [1, 2, 3, 5] або [1..3, 5], порожня множина – як [], множина символів {'a', 'i', 'j', 'k', 'l', 'm', 'n'} – як ['a', 'i'..'n'].

Якщо T задає перелічуваний тип, то вираз set of T означає множинний тип. Елементами його носія є підмножини носія типу T. Наприклад, носій типу set of Boolean складається з 4-х множин бульових значень: [], [false], [true], [false, true]; носій типу set of 'a'..'z' – з 226 підмножин малих латинських літер. Тип T називається базовим для типу set of T.

В історії розвитку мови Паскаль склалося так, що носій базового типу не може мати більше 256 елементів. Наприклад, вираз set of 1..512 недопустимий. У внутрішньому зображенні множини кожному елементу носія базового типу відповідає 1 біт і дані множинних типів займають не більше 256/8 = 32 байтів.

Найпростішими виразами типу множина є сталі, тобто списки виразів і діапазонів базового типу в квадратних дужках []. Інші вирази будуються з однотипних множинних сталих і змінних та знаків бінарних операцій '+', '*', '-', що позначають відповідно об'єднання, перетин і різницю множин.

Приклад 1. Нехай за дії означення var v : set of 0..9 виконано оператор присвоювання v:=[1..3]. Тоді вираз v+[2..4] має значення [1..4], v*[2..4] – значення [2..3], v-[2..4] – значення [1].

Бульові вирази вигляду S1 = S2 (S1 <> S2) задають перевірку на рівність (нерівність) значень однотипних множинних виразів S1 і S2. Аналогічно вирази S1 <= S2 (S1 >= S2) задають перевірку включення S1 у S2 (S2 в S1). Наприклад, значеннями виразів [1..3]=[1, 2, 3] та [1, 2]<=[1..3] є true, а виразів [1]>=[1..2] та [1, 2]<>[2, 1] – false.

Булів вираз вигляду e in S, де тип виразу e є базовим для множинного типу виразу S, задає перевірку належності значення e множині S.

Вирази типу множина можна присвоювати змінним того ж самого типу.

Приклад 2. Нехай діє означення типів рядків Str і множин символів SS = set of char. Тоді:

1) процедура Symset задає побудову множини SS символів рядка A:

procedure Symset ( A : Str; var S : SS );

var i : integer;

begin

S := [];

for i:= 1 to length(A) do S := S + [ A[i] ]

end;

2) функція EqSS задає перевірку рівності множин символів двох рядків:

function EqSS ( A, B : Str ) : boolean;

var S1, S2 : SS;

begin

Symset (A, S1);

Symset (B, S2);

EqSS := (S1 = S2)

end;

3) функція SettoStr задає побудову рядка з символів-елементів множини в порядку їхнього кодування:

function SettoStr ( S : SS) : Str;

var A : Str; c : char;

begin

A := '';

for c := chr(0) to chr(255) do

if c in S then A := A + c;

SettoStr := A

end.

атні 2, потім кратні 3 тощо.

Додати в блог або на сайт

Цей текст може містити помилки.

Астрономія | Реферат
24.6кб. | скачати


Схожі роботи:
Алгоритм обчислення виразу за його ЗПЗ Записи з варіантами
Розробка алгоритму і програми для обчислення коефіцієнта оперативної готовності системи
Знаходження мінімального остовом дерева Порівняння алгоритму Прима і алгоритму Крускала
Читання лексем виразу
Уточнення вивчення і відновлення тексту
Уточнення закону всесвітнього тяжіння
Досвід уточнення несучої здатності бурових паль
Уточнення простий теорії МО ЛКАО Базисна АТ Ефективний заряд показник експоненти
Уточнення простий теорії МО ЛКАО Базисна АТ Ефективний заряд-показник експоненти
© Усі права захищені
написати до нас