Головна » Статті » Інформатика | [ Додати статтю ] |
Уточнення алгоритму обчислення виразу
Напишемо функцію 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 тощо. | |
Переглядів: 485 | |
Всього коментарів: 0 | |