Имя: Пароль:
IT
 
Помогите с простеньким кодом
0 demmix
 
26.04.13
00:31
Простенький алгоритм,есть форма,в ней строка и кнопка,в строку вообиться уравнение,по кнопке осуществляется проверка уравнения на правильность написания скобок (все ли закрываються). Проблема в том что некорректно строка преобразуеться в массив(сам криворукий и только учусь,сильно не пинайте)

&НаКлиенте
Процедура Кнопка(Команда)
   
   Мас = Новый Массив;
   
   Для  Стр=0 по СтрДлина(Строка) цикл
       Мас.Добавить( Сред(Строка, стр, 1));
       Стр = Стр + 1;
   КонецЦикла;
   
       
   
   Сообщение = Новый СообщениеПользователю;
   а=0;
   

   Для  Ст = 0 по мас.Количество()-1 Цикл
       
   Если Мас[Ст] = "(" Тогда
       а= а+1 ;
       ИначеЕсли Мас[Ст] = ")" Тогда
           а = а -1;
       
           Если а<0 Тогда
               Сообщение.Текст = "Неверно";
               Сообщение.Сообщить();
           КонецЕсли;
       
       КонецЕсли;
       
   Ст = Ст + 1;
   
   КонецЦикла;
Если а =0 Тогда
       Сообщение.Текст = "Верно";
       Сообщение.Сообщить();
Иначе
       Сообщение.Текст = "Неверно";
       Сообщение.Сообщить();
   
КонецЕсли;
Мас.Очистить();
Ст= 0;
Стр = 0;
а=0;
КонецПроцедуры ;
1 Ёпрст
 
26.04.13
00:56
(0)
СтрЧислоВхождений пользуй..
2 Ёпрст
 
26.04.13
00:56
достаточно сравнить
СтрЧислоВхождений(строкатвоя,"(") с СтрЧислоВхождений(строкатвоя,")")
3 sanja26
 
26.04.13
01:01
// Функция "расщепляет" строку на подстроки, используя заданный
//        разделитель. Разделитель может иметь любую длину.
//        Если в качестве разделителя задан пробел, рядом стоящие пробелы
//        считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
//        игнорируются.
//        Например,
//        РазложитьСтрокуВМассивПодстрок(",строка 1,,,строка 2", ",") возвратит массив значений из пяти элементов,
//        три из которых - пустые строки, а
//        РазложитьСтрокуВМассивПодстрок(" строка1   строка 2", " ") возвратит массив значений из двух элементов
//
//    Параметры:
//        Стр -            строка, которую необходимо разложить на подстроки.
//                        Параметр передается по значению.
//        Разделитель -    строка-разделитель, по умолчанию - запятая.
//
//
//    Возвращаемое значение:
//        массив значений, элементы которого - подстроки
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
   
   МассивСтрок = Новый Массив();
   Если Разделитель = " " Тогда
       Стр = СокрЛП(Стр);
       Пока Истина Цикл
           Поз = Найти(Стр,Разделитель);
           Если Поз=0 Тогда
               МассивСтрок.Добавить(Стр);
               Возврат МассивСтрок;
           КонецЕсли;
           МассивСтрок.Добавить(Лев(Стр,Поз-1));
           Стр = СокрЛ(Сред(Стр,Поз));
       КонецЦикла;
   Иначе
       ДлинаРазделителя = СтрДлина(Разделитель);
       Пока Истина Цикл
           Поз = Найти(Стр,Разделитель);
           Если Поз=0 Тогда
               МассивСтрок.Добавить(Стр);
               Возврат МассивСтрок;
           КонецЕсли;
           МассивСтрок.Добавить(Лев(Стр,Поз-1));
           Стр = Сред(Стр,Поз+ДлинаРазделителя);
       КонецЦикла;
   КонецЕсли;
   
КонецФункции
4 sanja26
 
26.04.13
01:05
я недавно через это решал)..

// функция определяет есть ли хотя бы одна не цифра в строке
Функция ЕстьНеЦифрыВСтроке(Знач СтрокаПроверки) Экспорт
   
   Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
       КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1));
       Если НЕ (КодСимвола >= 48 И КодСимвола <= 57) Тогда
           Возврат Истина;
       КонецЕсли;
   КонецЦикла;

   Возврат Ложь;
   
КонецФункции
5 Kookish
 
26.04.13
01:08
А зачем вообще разбивать строку на массив? Может, достаточно просто перебирать символы. И счетчик: "(" - +1, ")" - -1. В начале 0, в конце выходим на 0. Если в процессе пошли в минус - ошибка, если в конце не 0 - ошибка.
Это если решать то, что ТС написал, а не то, что подразумевал.
6 sanja26
 
26.04.13
01:09
Определяешь кодСимвола через КодСимвола(")") и КодСимвола("(")

СчетчикЛевыхСкобок = 0)
СчетчикПравыхСкобок = 0;
 Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
       Если КодСимвола(а) = КодЛевойСкобки тогда
СчетчикЛевыхСкобок = СчетчикЛевыхСкобок + 1;
Иначе
.....
   КонецЦикла;

в общем задачка раз плюнуть...
7 GANR
 
26.04.13
01:10
(2) "()))строка моя((()"
8 sanja26
 
26.04.13
01:12
если СчетчикПравыхСкобок > СчетчикЛевыхСкобок выражение неправильное
9 demmix
 
26.04.13
10:12
Спасибо,помогли)
10 Simod
 
26.04.13
10:21
А что, Сред(Строка, стр, 1) при стр = 0 что-то возвращает?
11 zak555
 
26.04.13
10:59
в польскую запись перевёл ?