Інший бік справи - програмне забезпечення

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

Напишемо функцію 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 lengthA 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:= chr0 To chr255 Do

If c in S Then A:= A + c;

SettoStr:= A

End.

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



Головне меню