Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Обратная польская запись (http://www.tehnari.ru/f43/t18538/)

Катуха 17.12.2008 18:36

Обратная польская запись
 
Помогите пожалуйста составить программу на PASCAL для перевода арифметических выражений в обратную польскую запись. Уже все облазила,но именно на Pascal нигде нету(((

Катуха 23.12.2008 20:56

Вот один из вариантов решения,но она не идет. Подскажите,в чем ошибка.

const oper1=['+','-'];
oper2=['*','/'];
symbol=['a'..'z','A'..'Z','0'..'9','.'];

var sym :char;
so,si :string;
p :word;

procedure getsym;
begin
while (p<=length(si))and(si[p] in [' ',#9]) do inc(p);
if p>length(si) then sym:=#0 else begin
sym:=si[p];inc(p)
end;
end;

procedure expression;forward;

procedure get_var;
begin
so:=so+' ';
while sym in symbol do begin so:=so+sym;getsym end
end;

procedure term;
var a:char;
begin
if sym='(' then begin getsym;expression;getsym end
else get_var;
while sym in oper2 do begin
a:=sym;getsym;term;so:=so+a
end
end;

procedure expression;
var a:char;
begin
if sym='+' then getsym else
if sym='-' then begin a:='-';getsym end else a:=' ';
term;
if a='-' then so:=so+' (-)';
while sym in oper1 do begin
a:=sym;getsym;term;so:=so+a
end
end;

begin
si:='-1.2-(-1*3.14+1/(a/b+cab*9))';so:='';p:=1;
getsym;expression;writeln(si);writeln(so);
end.

Катуха 25.12.2008 14:45

Программа выдает ошибку в строчке

while (p<=length(si))and(si[p] in [' ',#9]) do inc(p)

на месте do пишет,что type mismatch. Что нужно сделать? Подскажите.

Le}{a 25.12.2008 16:23

переменной p поменять тип

Vladimir_S 25.12.2008 16:36

А вообще-то странно - у меня транслируется и не ругается. И запускается. И даже что-то выдает. (Я только в самом конце пустой ReadLn пририсовал, чтобы остановилась).
А что касается типа переменной р - можно, конечно, попробовать изменить на Byte (формат возврата функции Length) но чуднО это...

Катуха 25.12.2008 17:06

Спасибо большое! Сейчас попробую все. Может это Pascal брыкается.

Катуха 26.12.2008 20:45

Паскаль выдает ошибку 39 в [' ',#9]). Что делать не знаю,подскажите пож-а,может паскаль другой скачать(скажите где и какой лучше). Уже 2 паскаля скачивала,на них все равно не идет. Очень срочно.

Vladimir_S 26.12.2008 22:03

Попробуйте в проблемной строке выражение в скобках после and заменить на
(si[p]=' ') (между кавычками - один пробел). Т.е. строка будет такой:
while (p<=length(si))and(si[p]=' ') do inc(p)
Должно пойти.

P.S. Я тут поисследовал проблему, и кажется установил, почему у меня программа идет, а у Катухи - нет. Дело в том, что я пользуюсь DOS-Паскалями (ну или уж Delphi), и надо же - именно девятый символ под DOS и WINDOWS выдает разное! Остальные - одно и то же. Под DOS выдается несколько пробелов, а под WINDOWS - символ "○".

Катуха 26.12.2008 22:04

Убрала запятую,теперь выдает ошибку 26 вот здесь: else a:=' ';

Vladimir_S 26.12.2008 22:10

Цитата:

Сообщение от Катуха (Сообщение 158526)
Убрала запятую,теперь выдает ошибку 26 вот здесь: else a:=' ';

А вот этого не надо - наугад курочить программу! Между прочим, ошибка скорее всего возникает не в операторе присваивания, а в предшествующем обращении к покалеченной процедуре getsym.


Часовой пояс GMT +4, время: 19:26.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.