Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 11:17

Количество слов в строке

Автор artm81, 29 апр 2012, 20:22

0 Пользователей и 1 гость просматривают эту тему.

дфтын

все верно:) для послденего слова нужно делать после цикла прибавление если было оное.
я как бы дал основу то что делал, у меня гдето есть в запасниках полностью с условиями и прочие.
если же мы говорим о том, что и не знаем какое количество пробелов в разделителе я бы делал - поиск первого НЕ пробела, от этого отталкиваемся
Помог? Нажми - Спасибо :)
skype: Soprov1C

sergejK74

artm81, это задача из жизни или какой-то академический пример?
Неужели в Почта-Телефон-Телеграф отправку телеграмм автоматизируешь?
Кто знает, как быть если разделитель между словами не пробел, а запятая, тире, дефис? Игнорировать? Сделать массив символов разделителей? Выгрузить в Word и там посчитать?
Что лучше поиск первого НЕ пробела или СтрЗаменить?
Кто сталкивался, подскажите, плиз.

Кнопочка Спасибо - слева!

Dethmontt

Перем МассивРазделителей;

Процедура КнопкаВыполнитьНажатие(Кнопка)

Строка = "Другой не надо.Давай уж универсальный. Что должно быть между Если и КонецЕсли?"; //Сделаем ошибку "надо.Давай"
ПодготовленнаяСтрока = ПодготовитьСтроку(Строка);
УбратьИзСтрокиПовторяющиесяБробелы(ПодготовленнаяСтрока);
МассивПодстрок = РазложитьСтрокуВМассив(ПодготовленнаяСтрока," ",Истина);
Сообщить("Всего слов: <"+МассивПодстрок.Количество()+">");

КонецПроцедуры

Процедура ИнициализироватьМассив(КоллекцияРазделителей=Неопределено)

МассивРазделителей = Новый Массив;
МассивРазделителей.Добавить("."); //Заполним разделителями по умолчанию
МассивРазделителей.Добавить(",");
МассивРазделителей.Добавить("!");
МассивРазделителей.Добавить("?");
МассивРазделителей.Добавить(":");
МассивРазделителей.Добавить(";");
Если Не КоллекцияРазделителей = Неопределено Тогда
Если ТипЗнч(КоллекцияРазделителей) = Тип("Массив") Тогда
Для Каждого Зн Из КоллекцияРазделителей Цикл
МассивРазделителей.Добавить(Зн);
КонецЦикла;
//Можно передавать и другие коллекции но мне лень это описывать
КонецЕсли;
КонецЕсли;

//Свернем массив от повторяющихся элементов
СвернутьМассив();

КонецПроцедуры

Процедура СвернутьМассив()

Структура = Новый Соответствие;
Для Каждого Зн Из МассивРазделителей Цикл
Структура.Вставить(Зн);
КонецЦикла;
МассивРазделителей.Очистить();
Для Каждого КлИЗн Из Структура Цикл
МассивРазделителей.Добавить(КлИЗн.Ключ);
КонецЦикла;

КонецПроцедуры

Процедура ПриОткрытии()

//Это внешняя обработка поэтому я особо не заморачиваюсь в вызовом инициализации
ИнициализироватьМассив();

КонецПроцедуры

Функция ПодготовитьСтроку(Знач Стр)

Длинна = СтрДлина(Стр);
МассивБукв = Новый Массив;
Для Сч = 1 По Длинна Цикл
Симвл = Сред(Стр,Сч,1);
Если МассивРазделителей.Найти(Симвл) <> Неопределено Тогда
СледСимв = Сред(Стр,Сч+1,1);
Если Не СледСимв = " " Или Не МассивРазделителей.Найти(СледСимв) = Неопределено Тогда
Симвл = Симвл + " ";
КонецЕсли;
КонецЕсли;
МассивБукв.Добавить(Симвл);
КонецЦикла;

Стр = "";
Для Каждого ЗнЧ Из МассивБукв Цикл
Стр = Стр + ЗнЧ;
КонецЦикла;
Возврат Стр;

КонецФункции

Процедура УбратьИзСтрокиПовторяющиесяБробелы(Строка)

Поз = Найти(Строка,"  ");
Пока Поз > 0 Цикл
Строка = СтрЗаменить(Строка,"  "," ");
Поз = Найти(Строка,"  ");
КонецЦикла;

КонецПроцедуры

Функция РазложитьСтрокуВМассив(Знач Строка, Знач Разделитель = " ", Знач ПропускатьПустые = Неопределено)

Результат = Новый Массив;

Если ПропускатьПустые = Неопределено Тогда
ПропускатьПустые = ?(Разделитель = " ", Истина, Ложь);
Если ПустаяСтрока(Строка) Тогда
Если Разделитель = " " Тогда
Результат.Добавить("");
КонецЕсли;
Возврат Результат;
КонецЕсли;
КонецЕсли;

Позиция = Найти(Строка, Разделитель);
Пока Позиция > 0 Цикл
Подстрока = Лев(Строка, Позиция - 1);
Если Не ПропускатьПустые Или Не ПустаяСтрока(Подстрока) Тогда
Результат.Добавить(Подстрока);
КонецЕсли;
Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
Позиция = Найти(Строка, Разделитель);
КонецЦикла;

Если Не ПропускатьПустые Или Не ПустаяСтрока(Строка) Тогда
Результат.Добавить(Строка);
КонецЕсли;

Возврат Результат;

КонецФункции // РазложитьСтрокуВМассив()
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

дфтын

хы:) ну да. вот элегантное решение через массив разделителей. хотя при первом приближении я там вижу ошибку
Помог? Нажми - Спасибо :)
skype: Soprov1C

sergejK74

Впечатляет. Хотел придраться с тире, но вовремя промолчал. Лично поленился бы сделать половину из этого.
дфтын, смотри как надо помогать людям, а не критиковать за то, что им всего лишь подсказали название функции в общем модуле!
В любом коде длинее 2 байт есть ошибка, не придирайся.
Кнопочка Спасибо - слева!

Dethmontt

Ну этот код я даже не отлаживал, поэтому за ошибки извините.
В целом должен быть рабочий код (даже не пробовал его запускать =))))
Кому нужно тот подправит ошибки...
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск