Реферат на тему:
Уточнення алгоритму обчислення виразу
Напишемо функцію 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 (S2 в
S1). Наприклад, значеннями виразів [1..3]=[1, 2, 3] та [1, 2]=[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 тощо.
Нашли опечатку? Выделите и нажмите CTRL+Enter