Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];

Вниз

HELP!   Найти похожие ветки 

 
Driverrr   (2002-12-17 20:21) [0]

Доброго времени суток!
Мастера, у меня к Вам 2 вопроса:

1) В string строке имеются круглые, квадратные и фигурные скобки. Как проверить, правильно ли они расставлены?

2) Какая формула существует для переведения шестнадцатиричной системы счисления в десятичную?


 
VictorT   (2002-12-17 20:29) [1]

1) Используй конечные автоматы (если не ясно, обьясню подробнее).
2) Влом писать, не придумал, как коротко сформулировать, кто-то ответит :)


 
Anatoly Podgoretsky   (2002-12-17 20:42) [2]

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

Вот такой простой адгоритм

Второй вопрос с твоей стороны требует расшифровки, но в общем тоже просто, переводим в двоичную форму (StrToInt) затем из двоичной в десятичную (IntToStr) это если речь про текстовое представление чисел, если про другое то уточни.


 
MsGuns   (2002-12-17 20:52) [3]

>Anatoly Podgoretsky © (17.12.02 20:42)

А если ")" больше, чем "(" ?
А я бы просто тупо считал и записывал в переменные QPrOpened, QPrClosed, а затем просто if not (QPrOpened=QPrClosed) then ..
По времени то же самое, только никаких тебе стеков (его еще надо на паскале организовать)


 
Anatoly Podgoretsky   (2002-12-17 21:03) [4]

Если больше то я указал, при появлении закрывающей скобки проверка на пустоту стека. "или сте пуст то ошика"

В качестве стека удобно использовать обычную строку. Length(S) показывает и на верхушку стека и на количество открывающих скобок. Изначально стек пуст


 
VictorT   (2002-12-17 21:14) [5]


> А я бы просто тупо считал и записывал в переменные QPrOpened,
> QPrClosed, а затем просто if not (QPrOpened=QPrClosed) then
> ..

Ещё проще, просто на открывающююся скобку делаешь инкремент переменной, на закрывающуюся - декремент, а потом сравнение с нулём (это я и имел в виду, когда упомянул конечные автоматы).


 
Anatoly Podgoretsky   (2002-12-17 21:18) [6]

VictorT © (17.12.02 21:14)
Так нельзя, вот примеры

(][) ошибка
([)] ошибка
{[]} норма

Это упрощенные примеры


 
TTCustomDelphiMaster   (2002-12-17 21:23) [7]

MsGuns
Хорошо тогда для вашего алгоритма я буду ставить скобки так )что то в скобках(.

Если встретишь "(" скобку прибавляй единицу, если ")" отнимай. В конце должен получится 0. Причем число не должно стать отрицательным.


 
TTCustomDelphiMaster   (2002-12-17 21:32) [8]

Не заметил что в строке могрут быть разнотипные скобки. Тогда делай как говорит Anatoly Podgoretsky.


 
Jeer   (2002-12-17 22:23) [9]

На самом деле вариантов больше, т.к. могут возникать ситуации
[)
(]
и тп
Поэтому имеет смысл составить для Вашей задачи список допустимых
символов открытия и закрытия "скобок".
Проверять можно по разному:))
В конце концов, это действительно конечный автомат.


 
Ich Hasse   (2002-12-17 22:31) [10]

1A(h)

1*16^1+10=26 (d)

25B(h)

2*16^2+5*16^1+11=603 (d)


 
Anatoly Podgoretsky   (2002-12-17 22:46) [11]

Соответствие простое это парность скобок
При сканировании строки проверяется два сножества, одно для открывающих ["(","[","{"], другое для закрывающих [")","]","}"], спислк дегко может быть расширен и простой case.
Вложенность скобок обеспечивает стек.

ClearStack;
Error := FALSE;
for I := 1 to Length(S) do begin
if S[I] in OpenBrackets then
Push(S[I])
else if S[I] in CloseBrackets then
begin
if StackSize = 0 then
Error := TRUE
else begin
Ch := Pop;
case Ch of
"}": if Ch <> "(" then Error := TRUE;
"]": if Ch <> "[" then Error := TRUE;
"}": if Ch <> "{" then Error := TRUE;
end;
end;
end;
if Error then Break;
end;

Вот здесь в переменной Error результат проверки. Стек проще всего сдалеть с помощью строки;


 
Anatoly Podgoretsky   (2002-12-17 22:51) [12]

Пропустил последнюю проверку после последнешл end
if StackSize <> 0 then Error := TRUE;



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.037 c
14-15238
Marser
2002-12-09 23:19
2003.01.06
Почин!


1-15106
Rorik
2002-12-21 14:49
2003.01.06
Я только начинающий...


3-14903
Алексей Кривеня
2002-12-12 12:00
2003.01.06
sql запрос к paradox


14-15269
4D man
2002-12-16 19:13
2003.01.06
Калькуляторы


3-14908
satron
2002-12-13 11:55
2003.01.06
Help me





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский