Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Вычисление значения выражения в суффиксной записи





Порядок выполнения операций в суффиксной записи определён порядком следования операндов и операций в выражении.

Алгоритм вычисления значения выражения можно описать так:

1. Просматриваем запись выражения слева направо. При условии, что не все операции выполнены над соответствующими операндами, идём на шаг 2, иначе на шаг 3.

2. Если встретится одноместная операция и предшествующий ей операнд, то применяем эту операцию к операнду и заменяем последовательность «операнд – операция» их значением, т.е. операндом. Если встретится двуместная операция и предшествующие ей два операнда, то применяем операцию к операндам и заменяем последовательность «операнд – операнд – операция» их значением, т.е. операндом. Далее переходим к шагу 1.

3. Значение выражения найдено, процесс вычисления закончите.

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

Задача. Создайте компьютерную модель процесса преобразования алгебраического выражения, записанного в традиционной инфиксной форме, в запись этого выражения в польской (бесскобочной) суффиксной форме.

Решение

Разработаем алгоритм преобразования алгебраического выражения, записанного в традиционной инфиксной форме, в польскую бесскобочную суффиксную форму.

Алгоритм:

1. Организуйте ввод алгебраического выражения, записанного в традиционной инфиксной форме. Запись выражения закончите знаком «=».

2. Для реализации процесса преобразования организуйте два стека: стек X, стек Y.

3. Пока не встретите символ «=», выполняйте шаги алгоритма 4, 4.1, 4.2.

4. Выбирайте последовательно, по одному символу слева направо, символы из исходного выражения. Операнды складывайте в стек X, а операции и левые скобки – в стек Y.

4.1. Если встретите правую скобку, то все символы стека Y до первой левой скобки последовательно выталкивайте из стека Y и складывайте в стек X. Далее выталкивайте левую скобку из стека Y. Вытолкнутую из стека Y левую скобку и просматриваемую правую скобку в стеки не помещайте.

4.2. Выбрав из исходного выражения очередную операцию, помещайте её в стек Y, если приоритет очередной выбранной операции меньше или равен приоритету операции, лежащей в вершине стека. В противном случае выталкивайте элементы из стека Y и помещайте их в стек X, до тех пор, пока не встретится левая скобка или дно стека.

Компьютерная модель1 процесса преобразования алгебраического выражения, записанного в традиционной инфиксной форме, в польскую суффиксную форму. Компьютерная модель реализована в системе Turbo Pascal с использованием указателей и динамических переменных. Алгебраическое выражение посимвольно вводится с клавиатуры в процессе работы с моделью, последний символ выражения «=».

program exspression;

type

tptr=^item;

item=record inf:char; next:tptr; end;

tfile=file of char;

var x,y,tmp,tmp1:tptr; ch,ch1:char; fl:boolean;f,f1:tfile;

procedure instek(var head:tptr; ch:char); {процедура занесения элемента сh в стек, на который указывает указатель Head (стек Х или стек Y или TMP1)}

var tmp:tptr;

begin

new(tmp); tmp^.inf:=ch; tmp^.next:=head; head:=tmp;

end;

procedure fromstek(var head:tptr; var ch:char);

{процедура чтения элемента из стека, определяемого указателем Head}

var tmp:tptr;

begin

tmp:=head; ch:=head^.inf; head:=head^.next;

end;

function priorit(ch:char):byte;

{функция задания приоритетов выполняемых операций}

begin

case ch of

'*','/': priorit:=3;

'+','-': priorit:=2;

'(': priorit:=1;

'=': priorit:=0;

end; end;

procedure print1(x1:tptr);

var ch3:char;

begin {вывод на экран элементов стеков X или Y или TMP1}

while x1<>Nil do

begin {запись элементов стека X1 (X или Y или TMP1)в стек tmp }

fromstek(x1,ch); instek(tmp,ch);

end;

while tmp<>Nil do

begin {вывод на экран элементов стека X1 }

fromstek(tmp,ch); write(ch,' ');

end;

writeLn;

end;

Begin {начало основной программы}

x:=Nil; y:=Nil; tmp1:=Nil;

repeat

write('Введите символ: '); readln(ch);instek(tmp1,ch);{ занесение элемента ch в стек tmp1, стек хранит запись введённого выражения в инфиксной форме)

{далее введённый символ записывается либо в стек X, либо в стек Y. Стек X – стек для первоначального занесения операндов и по определенным правилам знаков операций из стека Y; стек, в котором хранится суффиксная форма записи выражения, записанная в обратном порядке. Стек Y – стек, в который заносятся по определенным правилам знаки операций и левые скобки, а затем переписываются в стек X}

if ch in ['a'..'z'] then instek(x,ch);{занесение элемента в стек X}

if ch ='(' then instek(y,ch);{ занесение элемента в стекY}

if ch=')' then { блок, реализующий запись операций из стека Y в стек X до символа '('}

begin

while (y^.inf<>'(') do

begin fromstek(y,ch); instek(x,ch); end;

fromstek(y,ch);

end;

if ch in ['*','/','+','-','='] then {блок анализа элементов стека Y для соответствующей процедуры занесения знака операции в стек Y или переноса знаков операций из стека Y в стек X перед вталкиванием прочитанной операции в стек Y}

begin

repeat

fl:=true;

if y<>Nil then

if priorit(ch)<=priorit(y^.inf) then

begin fromstek(y,ch1); instek(x,ch1); fl:=false; end

until fl;

instek(y,ch);

end;

write('x - '); print1(x);{ вывод элементов стека X на экран после выполнения операции записи или перезаписи}

write('y - '); print1(y);{ вывод элементов стека Y на экран после выполнения операции записи или перезаписи}

write('tmp1 - '); print1(tmp1); {вывод элементов стека TMP1 на экран после выполнения операции записи}

WriteLn('********************');

until ch='=';

WriteLn ('Инфиксная запись выражения');

print1(tmp1);

WriteLn('Суффиксная запись выражения');

print1(x);

End.

 

Компьютерная модель 2 процесса преобразования алгебраического выражения, записанного в традиционной инфиксной форме, в польскую суффиксную форму. Компьютерная модель реализована в системе Turbo Pascal с использованием указателей и динамических переменных. Алгебраическое выражение, записанное в обычной форме, последний символ выражения ‘=’, посимвольно вводится из текстового файла, полное имя которого вы должны ввести с клавиатуры в процессе работы с моделью.

program exspression1;

label met;

type

tptr=^item;

item=record inf:char; next:tptr; end;

tfile=file of char;

var x,y,tmp,tmp1:tptr; ch,ch1:char; fl:boolean;

f:text; name:string;

procedure instek(var head:tptr; ch:char); {процедура занесения элемента сh в стек, на который указывает указатель Head (стек Х или стек Y или TMP1)}

var tmp:tptr;

begin

new(tmp); tmp^.inf:=ch; tmp^.next:=head; head:=tmp;

end;

procedure fromstek(var head:tptr; var ch:char);

{процедура чтения элемента из стека, определяемого указателем Head}

var tmp:tptr;

begin

tmp:=head; ch:=head^.inf; head:=head^.next;

end;

function priorit(ch:char):byte;

{функция задания приоритетов выполняемых операций}

begin

case ch of

'*','/': priorit:=3;

'+','-': priorit:=2;

'(': priorit:=1;

'=': priorit:=0;

end; end;

procedure print1(x1:tptr);

var ch3:char;

begin {вывод на экран элементов стеков X или Y или TMP1}

while x1<>Nil do

begin {запись элементов стека X1 (X или Y или TMP1) в стек tmp }

fromstek(x1,ch); instek(tmp,ch); {стек TMP - стек дополнительный,

используется для вывода элементов стека X1 в привычной форме}

end;

while tmp<>Nil do

begin {вывод на экран элементов стека X1 }

fromstek(tmp,ch); write(ch,' ');

end;

writeLn;

end;

Begin {начало основной программы}

x:=Nil; y:=Nil; tmp1:=Nil;

write ('введите имя исходного текстового файла '); readln (name);

assign (f,name); reset(f);

Repeat

Repeat

Read(f,ch); if ch=' ' then goto met;{ чтение символа ch выражения из файла f в ОЗУ}

instek(tmp1,ch);{ занесение элемента ch в стек TMP1,

стек TMP1 хранит инфиксную запись введённого выражения}

{введённый символ записывается либо в стек X, либо в стек Y. Стек X – стек для первоначального занесения операндов и по определенным правилам знаков операций из стека Y; стек в котором хранится суффиксная форма за-писи выражения, записанная в обратном порядке. Стек Y – стек, в который заносятся по определенным правилам знаки операций и левые скобки, а затем переписываются в стек X}

if ch in ['a'..'z'] then instek(x,ch);{занесение элемента в стек X}

if ch ='(' then instek(y,ch);{ занесение элемента в стекY}

if ch=')' then { блок, реализующий запись операций из стека Y в стек X до символа '('}

begin

while (y^.inf<>'(') do

begin fromstek(y,ch); instek(x,ch); end; fromstek(y,ch);

end;

if ch in ['*','/','+','-','='] then {блок анализа элементов стека Y для соответствующей процедуры занесения знака операции в стек Y или переноса знаков операций из стека Y в стек X перед вталкиванием прочитанной операции в стек Y}

begin

repeat

fl:=true;

if y<>Nil then

if priorit(ch)<=priorit(y^.inf) then

begin fromstek(y,ch1); instek(x,ch1); fl:=false; end

until fl;

instek(y,ch);

end;

write('x - '); print1(x);{ вывод элементов стека X на экран после выполнения операции записи или перезаписи}

write('y - '); print1(y);{ вывод элементов стека Y на экран после выполнения операции записи или перезаписи}

write('tmp1 - '); print1(tmp1); {вывод элементов стека TMP1 на экран после выполнения операции записи}

writeLn('********************');

met:Until eoln(f);

Readln(f); { чтение метки конца строки}

until (ch='=')or (eof(f));

close(f);

WriteLn ('Инфиксная запись выражения'); print1(tmp1);

WriteLn('Суффиксная запись выражения'); print1(x);

End.

Таблица 2.

x - a y - tmp1 - a **************** x - a y - + tmp1 - a + **************** x - a b y - + tmp1 - a + b **************** x - a b y - + * tmp1 - a + b * **************** x - a b y - + * ( tmp1 - a + b * ( **************** x - a b c y - + * ( tmp1 - a + b * (c **************** x - a b c y - + * (- tmp1 - a + b * (c - **************** x - a b c d y - + * (- tmp1 - a + b * (c - d **************** x - a b c d - y - + * tmp1 - a + b * (c - d) **************** x - a b c d - * y - + / tmp1 - a + b * (c - d) / **************** x - a b c d - * k y - + / tmp1 - a + b * (c - d) / k **************** x - a b c d - * k / + y - = tmp1 - a + b * (c - d) / k = **************** Инфиксная запись выражения a + b * (c - d) / k = Суффиксная запись выражения a b c d - * k / +  

Результат исполнения программы, полученной в окне ввода-вывод системы PABC

Компьютерная модель 3 процесса преобразования алгебраического выражения, записанного в традиционной инфиксной форме, в польскую суффиксную форму. Компьютерная модель реализована в системе Turbo Delphi с использованием указателей и динамических переменных. Алгебраическое выражение посимвольно вводится с клавиатуры, последний символ выражения «=».

type

tptr=^item; item=record

inf:string; next:tptr; end;

var x,y,x1:tptr; ch,ch1,ch3:string;

fl:boolean; j:longint

A:array[1..26] of string; z:'a'..'z';

procedure instek(var head:tptr; ch:string);

{процедура занесения элемента сh в стек, на который указывает указатель Head (стек х или стек y)}

var tmp:tptr;

begin

new(tmp);

tmp^.inf:=ch;

tmp^.next:=head;

head:=tmp;

end;

procedure fromstek(var head:tptr; var ch:string);

{процедура чтения элемента из стека, определяемого указателем Head}

var tmp:tptr;

begin

tmp:=head; ch:=head^.inf; head:=head^.next;

end;

function priorit(ch:string):byte;

{функция задания приоритетов выполняемых операций}

begin

if (ch='*') or (ch='/') then priorit:=3; if (ch='+') or (ch='-') then priorit:=2;

if (ch='(') then priorit:=1; if (ch='=') then priorit:=0;

end;

procedure TForm1.Button1Click(Sender: TObject);

var s:string;i:byte; flag:boolean;

begin

x:=Nil; y:=Nil; j:=1;

Label1.Caption:='='; Label4.Caption:=''; Label5.Caption:='';

{формирование массива терминальных символов}

for z:='a' to 'z' do

begin

A[j]:=z; j:=j+1;

end;

i:=0; s:=edit1.Text;

repeat

{стек х – стек для первоначального занесения операндов и по определенным правилам знаков операций из стека y; стек, в котором хранится суффиксная форма записи, записанная в обратном порядке.

стек y – стек, в который заносятся по определенным правилам знаки операций и левые скобки, а затем переписываются в стек х}

{занесение элемента в стек х}

i:=i+1;

ch:=s[i];

showmessage('Обрабатываем символ '+ch);

flag:=false;

for j:=1 to 26 do

if ch=A[j] then flag:=true;

if flag then instek(x,ch);

if ch='(' then instek(y,ch);{занесение элемента в стек y}

if ch=')' then {блок, реализующий запись операций из стека y в стек х до символа '('}

begin

while y^.inf<>'(' do

begin

fromstek(y,ch); instek(x,ch);

end;

fromstek(y,ch);

end;

if (ch='*') or (ch='/') or (ch='+') or (ch='-') or (ch='=') then {блок выбора стека х или стека y для соответствующей процедуры: занесения знака операции в стек y или переноса знаков операций из стека y в стек х}

begin

repeat

fl:=true;

if y<>Nil then

if priorit(ch)<=priorit(y^.inf) then

begin

fromstek(y,ch1); instek(x,ch1); fl:=false;

end;

until fl;

instek(y,ch);

end;

x1:=x;

Label4.Caption:='';

while x1<>Nil do

begin

ch3:=x1^.inf; x1:=x1^.next;

Label4.caption:= Label4.caption+#13+ch3;

end;

Application.ProcessMessages;

for j:=1 to 50000000 do;

x1:=y;

Label5.Caption:='';

while x1<>Nil do

begin

ch3:=x1.inf; x1:=x1.next;

Label5.caption:= Label5.caption+#13+ch3;

end;

Application.ProcessMessages;

for j:=1 to 50000000 do;

until ch='=';

Label5.Caption:='';

while x<>Nil do

begin {блок записи элементов стека х в пустой стек y }

fromstek(x,ch); label1.Caption:=label1.Caption+ch; instek(y,ch);

end;

Label1.Caption:='=';

while y<>Nil do

begin {блок вывода суффиксной записи выражения на экран}

fromstek(y,ch);

if ch<>'=' then label1.Caption:=label1.Caption+ch;

end;

end;

end.

Date: 2015-07-17; view: 415; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию