Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование выражения в бесскобочный вид, Глагол 
:(
    Опции темы
Сый
Дата 27.11.2006, 20:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Пытаюсь написать программу, выполняющую преобразование выражение в бесскобочный вид (обратная польская нотация). Всё, вроде бы, работает, но при обработке выражения "(А+Б)*(В+Г)-Д" пропадает минус, который в результате должен оказаться в конце. Подскажите, где ошибка?
Код
ОТДЕЛ ОПЗ+; 
ИСПОЛЬЗУЕТ Знак ИЗ "...\Отделы\Иное\", Вывод ИЗ "...\Отделы\Обмен\"; 

ПЕР 
  Стек: РЯД 20H ИЗ ЗНАК; 
  р1, р2: РЯД 16 ИЗ ЗНАК; 

ЗАДАЧА Преимущество(зн: ЗНАК): ЦЕЛ; 
УКАЗ 
  ВЫБРАТЬ зн ИЗ 
    '*', '/': ВОЗВРАТ 3 
  | '-', '+': ВОЗВРАТ 2 
  | '(', ')': ВОЗВРАТ 1 
  ИНАЧЕ ВОЗВРАТ 0 КОН 
КОН Преимущество; 

ЗАДАЧА Добавить(зн: ЗНАК); 
УКАЗ 
  ЕСЛИ ДЛИНА(Стек) = РАЗМЕР(Стек) ТО Вывод.Цепь("Ошибка: стек переполнен."); СТОП(0) КОН; 
  Стек[ДЛИНА(Стек)] := зн 
КОН Добавить; 

ЗАДАЧА Удалить(): ЗНАК; 
ПЕР 
  зн: ЗНАК; 
УКАЗ 
  ЕСЛИ ДЛИНА(Стек) = 0 ТО Вывод.Цепь("Ошибка: стек пуст."); СТОП(0) КОН; 
  зн := Стек[ДЛИНА(Стек)-1]; 
  Стек[ДЛИНА(Стек)-1] := 0X; 
  ВОЗВРАТ зн 
КОН Удалить; 

ЗАДАЧА Перевести(вход-, выход+: РЯД ИЗ ЗНАК); 
ПЕР 
  сч1, сч2: УЗКЦЕЛ; 
  зн: ЗНАК; 
УКАЗ 
  зн := 0X; сч2 := 0; 
  ОТ сч1 := 0 ДО ДЛИНА(вход)-1 ВЫП 
    ЕСЛИ вход[сч1] = ")" ТО 
      ПОКА Стек[ДЛИНА(Стек)-1] # "(" ВЫП 
        выход[сч2] := Удалить(); 
        УВЕЛИЧИТЬ(сч2) 
      КОН; 
      зн := Удалить() 
    АЕСЛИ Знак.Буква(вход[сч1]) ТО 
      выход[сч2] := вход[сч1]; 
      УВЕЛИЧИТЬ(сч2) 
    АЕСЛИ вход[сч1] = "(" ТО 
      Добавить(вход[сч1]) 
    АЕСЛИ (вход[сч1] = "+") ИЛИ (вход[сч1] = "-") ИЛИ (вход[сч1] = "/") ИЛИ (вход[сч1] = "*") ТО 
      ЕСЛИ ДЛИНА(Стек) = 0 ТО Добавить(вход[сч1]) ИНАЧЕ 
        ЕСЛИ Преимущество(вход[сч1]) > Преимущество(Стек[ДЛИНА(Стек)-1]) ТО 
          Добавить(вход[сч1]) 
        ИНАЧЕ 
          ПОКА (ДЛИНА(Стек) # 0) И (Преимущество(вход[сч1]) <= Преимущество(Стек[ДЛИНА(Стек)-1])) ВЫП 
            выход[сч2] := Удалить(); УВЕЛИЧИТЬ(сч2) 
          КОН; 
          Добавить(выход[сч1]) 
        КОН 
      КОН 
    КОН 
  КОН; 
  ПОКА ДЛИНА(Стек) # 0 ВЫП 
    выход[сч2] := Удалить(); 
    УВЕЛИЧИТЬ(сч2) 
  КОН 
КОН Перевести; 

УКАЗ 
  р1 := "(А+Б)*(В+Г)-Д"; 
  Перевести(р1, р2); 
  Вывод.Цепь(р2) 

КОН ОПЗ.

--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
popovda
Дата 29.12.2006, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 9.6.2006
Где: Москва

Репутация: 1
Всего: 6



 smile Задача ясна, но она относится к АЛГОРИТМАМ!


--------------------
С уважением, Попов Д.А.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0670 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.