правильное скобочное выражение

Тема в разделе "WASM.BEGINNERS", создана пользователем triam, 19 янв 2007.

  1. triam

    triam New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    12
    К примеру дано выражение:
    (((5+2)*3+4)-7)
    Правильным скобочным выражением называется
    примерно следующее, если выкинуть все числа и арифметические знаки получаем
    ((()))

    Задание является следующим:
    Определить является ли введенное выражение правильным скобочным...

    На мой взгляд алгоритм прост кол-ву скобок (
    должно соотвествовать кол-ву )

    1 можете подсказать коды клавиш ( и )
    2 и может быть какие-н сопутствующие команды в помощь подскажете...
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    )( - тоже правильно?
     
  3. triam

    triam New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    12
    n0name вполне с тобой согласен
    для начала прога ищет ( и ) в выражении а потом их сравнивает,
    как примерно организовать данный поиск?
     
  4. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    хех, задача на первом курсе по программингу...
    если в результате надо выдать, правильное выражение или не правильное, то
    вроде так можно

    Код (Text):
    1. cnt:=0
    2. For i:=1 to length(s) do
    3. begin
    4.   If s[i] = '(' then inc(cnt);
    5.   If s[i] = ')' then dec(cnt); 
    6. end;
    7. If (cnt = 0) then Good
    8.   else Bad
     
  5. Kmet

    Kmet New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2006
    Сообщения:
    28
    Адрес:
    Belarus
    Если в выражении могут встречатся различные скобки (), {}. [] используем стек. Встретили открывающую скобку запихнули в стек, открывающую-> извлекаем, проверяем на парность.
     
  6. hamper

    hamper Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    37
    Адрес:
    Russia
    Hellspawn
    в каждой итерации цикла надо проверять условие cnt>=0, а то для такого кода )( будет всё-таки правильным.
     
  7. darkness

    darkness New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2006
    Сообщения:
    14
    А может вот так?
    Код (Text):
    1. .model small
    2. .stack 100h
    3.  
    4. .data
    5.  
    6.  
    7. x1  db 0
    8. x2  db 0
    9. .code
    10. start:
    11. ;xor ax, ax
    12. ;mov ds, offset mes
    13. ;mov ah, 09h
    14. ;int 21h
    15.  
    16. mov CX, 0Dh
    17. vvod:
    18.      xor al,al
    19.      mov ah, 01h
    20.      int 21h
    21.      cmp al, 28h
    22.      je uvel1
    23.      cmp al, 29h
    24.      je uvel2
    25. con_loop:
    26.      loop vvod
    27. uvel1:
    28.        inc x1
    29.       ; jmp vvod
    30.        ret
    31. uvel2:
    32.      inc x2
    33.       ;jmp vvod
    34.       ret
    35. mov ax, 4C00h
    36. int 21h
    37. end start
    Здесь единственное что проблема немного с циклом... Если кто подскажет как можно испправить буду благодарен...
    И в конце проге сравнить x1 и x2
     
  8. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    darkness
    Зачем два счетчика, когда можно обойтись одним (Hellspawn)?
    Плюс проверка, о которой сказал hamper.
     
  9. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
  10. darkness

    darkness New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2006
    Сообщения:
    14
    crypto,
    тоже вариант...
    Какая разница? у меня проверяет каждый введённый байт ....

    Другое дело (уже стало самому интересно) с циклом не могу разобраться
    Подскажите в этом моменте. Почему при
    Код (Text):
    1. uvel1:
    2.        inc x1
    3.        jmp con_loop
    4.        ret
    У меня получается бесконечный цикл..... такое ощущение что в CX каждый раз прибаляютсят значения а не уменьшаются......
     
  11. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    darkness
    Ты видимо не понял, о какой проверке идет речь - о том что на каждом шагу цикла мы проверяем условие, что содержимое счетчика >= 0. Если оно < 0, значит уже нарушен баланс скобок.
     
  12. darkness

    darkness New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2006
    Сообщения:
    14
    crypto
    Точно!!! не в ту степь ушёл :)
    а что по поводу моего цикла можешь сказать?
     
  13. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    darkness
    Попробуй так
    Код (Text):
    1. mov CX, 0Dh
    2. vvod:
    3.      xor al,al
    4.      mov ah, 01h
    5.      int 21h
    6.      cmp al, '('
    7.      jne @1
    8.      inc x1
    9.      jmp con_loop
    10. @1:
    11.      cmp al, ')'
    12.      jne con_loop
    13.      inc x2
    14. con_loop:
    15.      loop vvod
    16.      mov ax, 4C00h
    17.      int 21h
     
  14. darkness

    darkness New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2006
    Сообщения:
    14
    crypto
    ага!!! ты прав!!! ПАСИБ!!!!!
     
  15. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Слушай, triam, ты тоже в олимпе учавствуешь, да?
    Если да, то пиши.