Группа: Пользователи
Сообщений: 27
Спасибо сказали: 0 раз
Рейтинг: 0
Ребят помогите решить задачу)) вот сама задача: 1. Скобки Составить обработку, которая проверяет корректность баланса скобок в арифметическом выражении, т.е. что скобки установлены верно и правильно их вхождение, то есть если скобки так расположены [({})] , то это правильное вхождение, а вот [([) - неверное. Входной параметр - Строка - арифметическое выражение; Выходной параметр - "Верно"\"Не верно". Использовать метод "Вычислить" нельзя
Вот как я решал!Но почему то не работает и ошибки нет
Группа: Местный
Сообщений: 1994
Из: Киева и окрестностей
Спасибо сказали: 406 раз
Рейтинг: 0
Цитата(Астахов @ 21.03.15, 12:24)
ч = Найти("({[", с);
Вот здесь Вы ищете подстроку, три скобки подряд и именно в таком поряке. В реальной формуле они могут быть разделены символами и еще и вложенность иметь. Но еще и сам алгоритм нерабочий. Нужно просто перебирать символ за символом и вести учет найденных скобок в списке значений. Открывающие - записывать, если скобка закрывающая и правильная по типу - вычеркивать. После перебора правильной формулы список значений будет пуст. ! Строки кода, удаляющие значение из списка запихнуть в ПопыткаИсключение. И не забудьте о знаке равенства, по нему нужно "подвести итоги" и начать с пустого СЗ.
// если количество символов (скобок) не четное то что-то не правильно Если КолСимволовВСтроке/2 > Цел(КолСимволовВСтроке/2) Тогда Сообщить("Не верно!"); Верно = Ложь; Иначе КолСимволов = 1;
// список значений - это список уже прочитаных и не закрытых скобок СписокСкобок = Новый СписокЗначений;
Пока КолСимволов <> КолСимволовВСтроке Цикл
л = Сред(лСтрока, КолСимволов, 1); // берем символ
НайденоЗнач = ТЗСкобки.Найти(л);
Если НайденоЗнач = Неопределено Тогда Сообщить("Не верно! В строке содержаться не только скобки!"); Верно = Ложь; Прервать; КонецЕсли;
Если НайденоЗнач.КакаяСкобка = "Закрывающая" и КолОткрывающихСкобок = 0 Тогда Сообщить("Не верно!"); Верно = Ложь; Прервать; КонецЕсли;
Если НайденоЗнач.КакаяСкобка = "Открывающая" Тогда КолОткрывающихСкобок = КолОткрывающихСкобок + 1; КонецЕсли;
Если КолОткрывающихСкобок > КолСимволовВСтроке/2 Тогда Сообщить("Не верно! В строке больше открывающих строк!"); Верно = Ложь; Прервать; КонецЕсли;
Если НайденоЗнач.КакаяСкобка = "Закрывающая" Тогда ПоследняяСкобка = СписокСкобок[СписокСкобок.Количество()-1];
// проверяем по параметрам () {} [] Если ПоследняяСкобка.Значение.Параметр <> НайденоЗнач.Параметр Тогда Сообщить("Не верно!"); Верно = Ложь; Иначе // удаляем открывающую скобку и закрывающую скобку не записываем СписокСкобок.Удалить(СписокСкобок[СписокСкобок.Количество()-1]); КонецЕсли; Иначе СписокСкобок.Добавить(НайденоЗнач); КонецЕсли;
КолСимволов = КолСимволов + 1; КонецЦикла;
Если Верно Тогда Сообщить("Верно!"); КонецЕсли; КонецЕсли;
1. Вариант просто пока есть в строке подстроки "[]","{}","()" заменеям их на "" 2. Разновидность алгоритма польской нотации с использованием строки вместо стека.
//Тупой вариант : ЕстьЭлементыИзМассиваШаблонов = Истина;
пока ЕстьЭлементыИзМассиваШаблонов цикл ЕстьЭлементыИзМассиваШаблонов = Ложь; Для каждого ТекШаблон Из МассивШаблонов Цикл Если Найти(Стр,ТекШаблон) Тогда ЕстьЭлементыИзМассиваШаблонов = Истина; Стр = СтрЗаменить(Стр,ТекШаблон,""); КонецЕсли; КонецЦикла; КонецЦикла; Сообщить(?(СтрДлина(Стр) = 0 ,"Все ок","You shall not pass!"));
//Типа умный КвоСимволов = СтрДлина(Стр); Стек = ""; ДлинаСтека = 0; Для Инд = 1 По КвоСимволов Цикл Символ = Сред(стр,инд,1); Стек = Стек + Символ; ДлинаСтека = ДлинаСтека + 1; ПоследниекДваСивола = Прав(Стек,2); Для каждого ТекШаблон Из МассивШаблонов Цикл Если ТекШаблон = ПоследниекДваСивола Тогда ДлинаСтека = ДлинаСтека - 2; Стек = Лев(Стек,ДлинаСтека); КонецЕсли; КонецЦикла; КонецЦикла; Сообщить(?(СтрДлина(Стек) = 0 ,"Все ок","You shall not pass!"));
Специалист : Технологическая платформа 8.х, Бухгалтерия для Украины, Управление торговлей для Украины, Зарплата и Управление Персоналом для Украины
Группа: Местный
Сообщений: 626
Спасибо сказали: 166 раз
Рейтинг: 130.8
Цитата(TipsyKID @ 30.06.15, 12:07)
1. Вариант просто пока есть в строке подстроки "[]","{}","()" заменеям их на "" 2. Разновидность алгоритма польской нотации с использованием строки вместо стека. ...
Насколько я понял из условия задачи, "арифметическое выражение" - нечто более сложное чем последовательность исключительно скобок. Автору темы не мешало бы показать примеры входных данных, чтобы не вводить народ в ненужные поиски.
#define private public enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day
Насколько я понял из условия задачи, "арифметическое выражение" - нечто более сложное чем последовательность исключительно скобок. Автору темы не мешало бы показать примеры входных данных, чтобы не вводить народ в ненужные поиски.
Это не играет значимой роли - почитайте об алгоритме "польской нотации" . Он просто разбрасывает по стеку операнды и знаки операции. Не важно, будет ли это сложное арифметическое выражение или просто скобки. Мухи с котлетами разделяются в два стека и поэтапно обрабатываются.
Специалист : Технологическая платформа 8.х, Бухгалтерия для Украины, Управление торговлей для Украины, Зарплата и Управление Персоналом для Украины
Группа: Местный
Сообщений: 626
Спасибо сказали: 166 раз
Рейтинг: 130.8
Цитата(TipsyKID @ 30.06.15, 20:45)
Это не играет значимой роли - почитайте об алгоритме "польской нотации" . Он просто разбрасывает по стеку операнды и знаки операции. Не важно, будет ли это сложное арифметическое выражение или просто скобки. Мухи с котлетами разделяются в два стека и поэтапно обрабатываются.
С "польскую нотацией" знаком. Я выразил сомнение, поймёт ли автор, что ваш пример - это возможно только часть решения.
#define private public enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!