Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2008, 15:32   #1
Катуха
 
Регистрация: 14.12.2008
Сообщений: 9
По умолчанию Обратная польская запись

Помогите пожалуйста составить программу на PASCAL для перевода арифметических выражений в обратную польскую запись. Уже все облазила,но именно на Pascal нигде нету(((
Катуха вне форума Ответить с цитированием
Старый 23.12.2008, 20:14   #2
Катуха
 
Регистрация: 14.12.2008
Сообщений: 9
По умолчанию

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

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);write ln(so);
end.
Катуха вне форума Ответить с цитированием
Старый 24.12.2008, 00:25   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

что значит - "не идёт" ?!?? под TurboPascal идёт.
вводится строка выражения:
Код:
-1.2-(-1*3.14+1/(a/b+cab*9))
преобразуется и выдаётся в обратной польской записи как строка:
Код:
 1.2 (-) 1 3.14* (-) 1 a b/ cab 9*+/+-
принцип обратной польской записи очень хорошо знаком всем тем, кому довелось столкнуться с калькулятором MK-52 :-)
вкратце - для того, чтобы сделать действия с двумя числами (операндами) нужно ввести первое число. поместить его в стек. потом ввести второе число. а потом указать действие, которое вы хотите выполнить над тем числом, которое у вас "на рабочем столе" и тем, которое находится в стеке. результат выполнения помещается в стек...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.12.2008, 13:42   #4
Катуха
 
Регистрация: 14.12.2008
Сообщений: 9
По умолчанию

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

Код:
while (p<=length(si))and(si[p] in [' ',#9]) do inc(p)
на месте do пишет,что type mismatch. Что нужно сделать? Подскажите.
Катуха вне форума Ответить с цитированием
Старый 26.12.2008, 19:48   #5
Катуха
 
Регистрация: 14.12.2008
Сообщений: 9
По умолчанию

Паскаль выдает ошибку 39 в [' ',#9]). Что делать не знаю,подскажите пож-а,может паскаль другой скачать(скажите где и какой лучше). Уже 2 паскаля скачивала,на них все равно не идет. Очень срочно.
Катуха вне форума Ответить с цитированием
Старый 26.12.2008, 21:04   #6
Катуха
 
Регистрация: 14.12.2008
Сообщений: 9
По умолчанию

Убрала запятую,теперь выдает ошибку 26 вот здесь: else a:=' ';
Катуха вне форума Ответить с цитированием
Старый 27.12.2008, 10:23   #7
Катуха
 
Регистрация: 14.12.2008
Сообщений: 9
По умолчанию

Выкладываю окнчательный вариант программы,может кому пригодится:

Цитата:
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.
Катуха вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обратная польская нотация Sexy Fox Помощь студентам 9 22.09.2011 14:57
Обратная польская запись Роман Радер Общие вопросы Delphi 0 09.12.2008 18:18
CreateFile - считывание дискеты в файл и обратная запись на нее... kalexi Win Api 1 01.10.2007 19:56
Обратная польская нотация Sexy Fox Помощь студентам 2 22.06.2007 13:27
Обратная связь Oliany PHP 1 06.05.2007 23:40