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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2012, 14:31   #1
Cheat
Пользователь
 
Регистрация: 16.08.2011
Сообщений: 27
По умолчанию Проверить правильность скобок (С++)

Привет всем!
Задали задачку: проверить правильность закрывания кавычек и скобок. Т.е, например, такая последовательность правильная: "()", а такая - неправильная: (')'
Никак не могу сообразить алгоритм, по которому можно проверить правильность. Подскажите, пожалуйста.
Только очень большая просьба - не пишите сюда код. Просто помогите, плизз, с алгоритмом.
Cheat вне форума Ответить с цитированием
Старый 01.09.2012, 14:48   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Стек, булевый флажок, идем по строчке, когда видим ( запихиваем в стек, когда видим ' смотрим флажок, если флажок не установлен, суем ' в стек и устанавливаем флажок, если флажок уже установлен смотрим что на вершине стека (долнжа быть ') сбрасываем флажок и удаляем из стека. Когда видим ) почти то же самое, только без флажка - просто проверяем что на вершине стека - должно быть ( - удаляем из стека и так на каждый символ в строчке. Если на вершине стека не то, что нам надо, тогда выдаем ошибку и прекращаем работу.
waleri вне форума Ответить с цитированием
Старый 01.09.2012, 14:58   #3
Cheat
Пользователь
 
Регистрация: 16.08.2011
Сообщений: 27
По умолчанию

Хм, интересно... Спасибо, буду пробовать
Cheat вне форума Ответить с цитированием
Старый 01.09.2012, 16:08   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Начните с того, что опишите алгоритм пронумероваными шагами, с описанием что делать на каждом шагу. Старайтес разбивать на простенькие шаги, которые дальше уже распадаются на совсем примитивные операции (например шаг 25 - увеличить указатель на единицу или шаг 17 если указаталеь указывает на ноль, значит заканчиваем работу)
waleri вне форума Ответить с цитированием
Старый 01.09.2012, 16:26   #5
Cheat
Пользователь
 
Регистрация: 16.08.2011
Сообщений: 27
По умолчанию

Спасибо за совет. Такой подход действительно способствует пониманию .
Сейчас напишем...
Cheat вне форума Ответить с цитированием
Старый 01.09.2012, 18:15   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Могу предложить поискать в разделе "Паскаль":
"Искать в этом разделе" - ищем текст "Правильность скобок"
Это конечно не Си, но там описаны алгоритмы и есть ссылка на литературу.
Да и с Паскаля перевести - интерес для сравнительного изучения языков

Как то так ....
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 01.09.2012, 21:44   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

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

как то так:
Код:
int c = 0;
while( *s ) {
    switch( *s ) {
        case '(' : ++c; break;
        case ')'  --c; break;
    }
    if( c < 0 ) break;
}
printf( ( 0 == c ? "true" : "false" ) );
rrrFer вне форума Ответить с цитированием
Старый 01.09.2012, 21:54   #8
Cheat
Пользователь
 
Регистрация: 16.08.2011
Сообщений: 27
По умолчанию

ViktorR, вариант интересный, но времени у меня всего лишь до понедельника . Хотя надо будет этим заняться чуть позже.

rrrFer, да, спасибо, я это уже пробовал. но вот в таком варианте все равно программа отработает некорректно:
((())))(
и плюс я (виноват!) не совсем точно описал суть задачи: мне еще нужно учитывать и кавычки.
хотя с кавычками я разберусь, основные трудности у меня возникают как раз со скобками
Cheat вне форума Ответить с цитированием
Старый 01.09.2012, 22:44   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а вы при уходе в минус скобок сразу трубите об ошибке.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.09.2012, 23:08   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а вы при уходе в минус скобок сразу трубите об ошибке.
Теперь бы еще и кавычки прикрутить...
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверить правильность расстановки круглых и квадратных скобок в выражениях tarasman11 Паскаль, Turbo Pascal, PascalABC.NET 13 06.07.2012 11:50
Программа, которая определяет правильность расстановок скобок (, [, {, ), }, ] sidestep Общие вопросы C/C++ 14 04.04.2012 15:36
Проверить на правильность задачу sam5213 Паскаль, Turbo Pascal, PascalABC.NET 0 23.12.2010 18:28
Нужно проверить на правильность программу Killdgedan Помощь студентам 3 26.05.2009 00:45
Проверить равенство числа открывающих и закрывающих круглых скобок 010 Паскаль, Turbo Pascal, PascalABC.NET 6 18.05.2008 00:27