• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

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

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Обратная польская запись

Катуха

Новые
Регистрация
17 Дек 2008
Сообщения
14
Реакции
0
Баллы
0
Обратная польская запись

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

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.
 
Программа выдает ошибку в строчке

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

на месте do пишет,что type mismatch. Что нужно сделать? Подскажите.
 
переменной p поменять тип
 
А вообще-то странно - у меня транслируется и не ругается. И запускается. И даже что-то выдает. (Я только в самом конце пустой ReadLn пририсовал, чтобы остановилась).
А что касается типа переменной р - можно, конечно, попробовать изменить на Byte (формат возврата функции Length) но чуднО это...
 
Спасибо большое! Сейчас попробую все. Может это Pascal брыкается.
 
Паскаль выдает ошибку 39 в [' ',#9]). Что делать не знаю,подскажите пож-а,может паскаль другой скачать(скажите где и какой лучше). Уже 2 паскаля скачивала,на них все равно не идет. Очень срочно.
 
Попробуйте в проблемной строке выражение в скобках после and заменить на
(si[p]=' ') (между кавычками - один пробел). Т.е. строка будет такой:
while (p<=length(si))and(si[p]=' ') do inc(p)
Должно пойти.

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

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

Ох, это Free Pascal, причем не последняя версия, а аж 2000 года. Это и вообще-то продукт полусырой, но вот эта оказалась более или менее. Катуха, а Вы не пропустили рекомендацию в моем посте #8? Попробуйте.
 
Выкладываю окнчательный вариант программы,может кому пригодится:

Progpam OPZ;
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 [#32, #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+#32;
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:=#32;
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:=#32;
p:=1;
getsym;
expression;
writeln(si);
writeln(so);
readln;
end.
 
Назад
Сверху