![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 16.12.2010
Сообщений: 5
|
![]()
Написать программу, вычисления значения выражения представленного в виде польской записи (постфиксной записи). Выражение состоит из цифр от 1 до 9 и знаков операций.
Написал программу. Программа работает и переводит выражение ( к примеру (a+b)*c в выражение ab+c* ) Подскажите как реализовать процедуру которая выводила бы после польской записи значение полученного результата? Код HTML:
program perevod; uses crt; var Stack:array[1..100] of char; Prior:array[1..100] of integer; i,j,t,flag,m,tpr:integer; nz,pz:string; per:char; procedure Prioritet(a,b,c:integer; tp:array of char;ip:array of integer); begin {ne dopusk nulevogo indeksa} if i>2 then begin t:=m-1; if tpr<=prior[t] then begin flag:=0; repeat per:=stack[t]; stack[t]:=stack[t+1]; stack[t+1]:=per; {ne dopusk nulevogo indeksa pri t} if t>1 then begin t:=t-1; {proverka prioritetov} if tpr<=prior[t] then flag:=0 else flag:=1 {flag vyhoda iz tsikla} end else flag:=1 until flag<>0; pz:=pz+stack[m]; m:=m-1; end else stack[m]:=nz[i]; end else stack[m]:=nz[i]; end; Begin clrscr; write('vvedite vyrazhenie <100 simvolov '); read(nz); pz:=' '; j:=0; i:=1; m:=1; for i:=1 to length(nz) do begin if (nz[i]=('(')) or (nz[i]=(')')) then j:=j+1; end; if j mod 2=0 then begin for i:=1 to length(nz) do begin j:=m; {esli otkryv. skobka (} if nz[i]=('(') then begin m:=m+1; stack[m]:=('('); prior[m]:=0; end else {esli znaki + ili -} if (nz[i]=('+')) or (nz[i]=('-')) then begin tpr:=1; prior[m]:=1; stack[m]:=nz[i]; prioritet (t,flag,tpr,stack,prior); end else {esli znaki * ili /} if (nz[i]=('*')) or (nz[i]=('/')) then begin tpr:=2 ; prior[m]:=2; stack[m]:=nz[i]; prioritet(t,flag,tpr,stack,prior); end else {esli zakryv. skobka )} if nz[i]=(')') then begin {izvlechenie vseh simvolov s kontsa steka} repeat pz:=pz+stack[j-1]; j:=j-1; m:=m-1; until stack[j-1]=('('); m:=m-1; end else begin pz:=pz+nz[i]; if i>1 then m:=m+1 else m:=m; end; end; {prpverka na ostavshiesya simvoly v steke} j:=1; {j=1 esli vyrazhenie bez skobok} if nz[1]=('(') then j:=2; {dobavlenie ostavshihsya simvolov iz kontsa steka} for i:=m-1 downto j do pz:=pz+stack[i]; write (pz); end else write ('zapis nekorrektna') ; readkey end. |
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 15.05.2009
Сообщений: 1,222
|
![]()
недавно делала подобное, могу кинуть исходник
Единственное, что ограничивает полет мысли программиста-компилятор
|
![]() |
![]() |
![]() |
#3 |
Регистрация: 16.12.2010
Сообщений: 5
|
![]()
Очень поможешь, если не трудно, кинь исходник, пожалуйста.
Какой день уже втыкаюсь ![]() Последний раз редактировалось Бунтарь; 16.12.2010 в 19:57. |
![]() |
![]() |
![]() |
#4 |
Участник клуба
Регистрация: 15.05.2009
Сообщений: 1,222
|
![]()
вот исходник на delphi
Единственное, что ограничивает полет мысли программиста-компилятор
|
![]() |
![]() |
![]() |
#5 |
Регистрация: 16.12.2010
Сообщений: 5
|
![]() |
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 23.11.2010
Сообщений: 530
|
![]()
ну дак ты вычисляй до преобразований... а потом просто выводи результат
|
![]() |
![]() |
![]() |
#7 |
Участник клуба
Регистрация: 15.05.2009
Сообщений: 1,222
|
![]()
дак а что у меня этого нет? Пробегаете по свое польской записи еще раз, встретили число засунули его в стек, встретили операцию выполнили ее над значениями в стеке и записали в стек ее результат. У меня все это сделано в процедуре calc
Единственное, что ограничивает полет мысли программиста-компилятор
|
![]() |
![]() |
![]() |
#8 |
Регистрация: 16.12.2010
Сообщений: 5
|
![]() |
![]() |
![]() |
![]() |
#9 |
Регистрация: 16.12.2010
Сообщений: 5
|
![]()
Исходное условие задачи (решить на паскале реализовать в ДИНАМИКЕ)
Написать программу, вычисления значения выражения представленного в виде польской записи (постфиксной записи). Выражение состоит из цифр от 1 до 9 и знаков операций.(к примеру (a+b)*c в выражение ab+c*). Просматривая строку, анализируем очередной символ, если это: - цифра, то записываем её в стек; - то читаем 2 элемента из стека, выполняем математическую операцию, определяемую этим знаком, и заносим результат в стек. После просмотра всей строки в стеке должен оставаться один элемент, он и является решением задачи. (Процедура Val (s,x,k) преобразует символьное представление цифры s в соответствующее числовое значение. При этом k=0, если такое преобразование возможно, в противном случаи k>0) Никак не могу вникнуть( хоть убей... |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Обратная польская запись | alexobenikov | Общие вопросы C/C++ | 12 | 25.11.2010 23:03 |
Польская запись | tatu_cat_69 | Общие вопросы .NET | 0 | 15.04.2010 19:03 |
Польская запись | azl-8 | Помощь студентам | 0 | 06.05.2009 20:19 |
Обратная польская запись | Катуха | Помощь студентам | 6 | 27.12.2008 10:23 |