Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 17.12.2008, 18:36   #1 (permalink)
Катуха
Member
 
Регистрация: 17.12.2008
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Обратная польская запись

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

Старый 17.12.2008, 18:36
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Темы которые подобны вашей уже были на нашем форуме

Запись видеоролика
Запись на CD

Старый 23.12.2008, 20:56   #2 (permalink)
Катуха
Member
 
Регистрация: 17.12.2008
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

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   #3 (permalink)
Катуха
Member
 
Регистрация: 17.12.2008
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

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

на месте do пишет,что type mismatch. Что нужно сделать? Подскажите.
Катуха вне форума   Ответить с цитированием
Старый 25.12.2008, 16:23   #4 (permalink)
Le}{a
Специалист
 
Аватар для Le}{a
 
Регистрация: 06.03.2007
Сообщений: 2,743
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 608
По умолчанию

переменной p поменять тип
Le}{a вне форума   Ответить с цитированием
Старый 25.12.2008, 16:36   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 25.12.2008, 17:06   #6 (permalink)
Катуха
Member
 
Регистрация: 17.12.2008
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо большое! Сейчас попробую все. Может это Pascal брыкается.
Катуха вне форума   Ответить с цитированием
Старый 26.12.2008, 20:45   #7 (permalink)
Катуха
Member
 
Регистрация: 17.12.2008
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Паскаль выдает ошибку 39 в [' ',#9]). Что делать не знаю,подскажите пож-а,может паскаль другой скачать(скажите где и какой лучше). Уже 2 паскаля скачивала,на них все равно не идет. Очень срочно.
Катуха вне форума   Ответить с цитированием
Старый 26.12.2008, 22:03   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

P.S. Я тут поисследовал проблему, и кажется установил, почему у меня программа идет, а у Катухи - нет. Дело в том, что я пользуюсь DOS-Паскалями (ну или уж Delphi), и надо же - именно девятый символ под DOS и WINDOWS выдает разное! Остальные - одно и то же. Под DOS выдается несколько пробелов, а под WINDOWS - символ "○".
Vladimir_S вне форума   Ответить с цитированием
Старый 26.12.2008, 22:04   #9 (permalink)
Катуха
Member
 
Регистрация: 17.12.2008
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Убрала запятую,теперь выдает ошибку 26 вот здесь: else a:=' ';
Катуха вне форума   Ответить с цитированием
Старый 26.12.2008, 22:10   #10 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Катуха Посмотреть сообщение
Убрала запятую,теперь выдает ошибку 26 вот здесь: else a:=' ';
А вот этого не надо - наугад курочить программу! Между прочим, ошибка скорее всего возникает не в операторе присваивания, а в предшествующем обращении к покалеченной процедуре getsym.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.