Форум » » Число повторений символа » Ответить

Число повторений символа

kislez2015: Подскажите, а есть какая-то функция, которая выдает количество повторений до данной позиции в строке? Или что-то похожее? У меня известна позиция нужного мне символа, но нужно узнать сколько раз в этой строке он уже был? Спасибо

Ответов - 14

Вячеслав: Функции нет, но написать такую просто. Integer_Function NumRepeat(string search_string, string src_string) { integer pos,num_rep; pos=0; num_rep=0; while (find(search_string,src_string,pos+1)>0) { pos=find(search_string,src_string,pos+1); num_rep=num_rep+1; } Return(num_rep); } Потом можете использовать ее в теле программы: CHANGE RX { integer i; //Например в RX вход пришла строка "ABDFG RDAG" //Например Нужно найти количество вхождений символа D i=NumRepeat("D",RX); //по идее i должно стать равным 2. Отладка на вашей совести. }

Вячеслав: Если надо именно найти количество вхождений до данной позиции не включая ее саму то функцию можно немного изменить: Integer_Function NumRepeatAdv(string search_string, string src_string, integer to_position) { integer pos,num_rep; pos=0; num_rep=0; while (find(search_string,src_string,pos+1)>0) { pos=find(search_string,src_string,pos+1); if (pos<to_position){num_rep=num_rep+1;}else{break;} } Return(num_rep); } Потом можете использовать ее в теле программы: CHANGE RX { integer i; //Например в RX вход пришла строка "ABDFG RDAG" //Например Нужно найти количество вхождений символа D до 8 символа i=NumRepeatAdv("D",RX,8); //по идее i должно стать равным 1. Отладка опять на вашей совести. }

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


Вячеслав: kislez2015 пишет: просто у меня задача несколько сложнее - нужно формировать строку из имен людей нажавших кнопку запроса по порядку нажатия. и я вот хочу на вход элемента подать сигналы нажатия. и потом как-то из этой строки надо удалить имя отжавшего. буду формировать неныводимую строку индексов нажавших. а они все разделены символом перехода на сл строку. вот и буду считать эти символы)) Тут без "поллитра" уже ТЗ не пойму )

kislez2015: Вячеслав вот и я пока не на 100% проникся)) по кускам)

Вячеслав: На всякий случай функция модификации строки (удаляет пользователя из очереди, который выполнил отмену запроса) String_Function RemoveUserID(string User_ID, string queue_string) { integer pos,L; string str_out[500],str_temp[500],not_used$[500]; str_out=""; str_temp=queue_string; L=len(User_ID); while (find(User_ID,str_temp,1)>0) { pos=find(User_ID,str_temp,1); str_out=str_out+Left(str_temp,pos-1); not_used$=RemoveByLength(pos-1+L,str_temp); } str_out=str_out+str_temp; Return ("str_out"); } Далее используем её в программе: PUSH Request { integer k; k=GetLastModifiedArrayIndex();//подразумеваем что есть вход DIGITAL_INPUT Request[num_users] if (find(UserID$[k],Queue$)>0){Queue$=RemoveUserID(UserID$[k], Queue$);}//если есть в очереди, то удаляем else //иначе добавляем в конец очереди { Queue$=Queue$+UserID$[k]+"\x0D";//подразумеваем что где то определено значение UserID$[k] для пользователя с номером k. OutQ=Queue$; //т.к. Queue$ для компилятора не может быть STRING_OUTPUT, а будет лишь Global Variables типа string. Тут OutQ строковый выход модуля. } } Но тут есть одна засада. Длина выходной строки STRING_OUTPUT не может быть длиннее 255 символов. Вам придется искать какой то выход. Код в сообщениях выше немного исправил (нашел уже ошибки).

kislez2015: Вячеслав длина выходной строки из модуля симпл+ не может быть более 255? мне нужно около 1100...

Вячеслав: kislez2015 пишет: Вячеслав длина выходной строки из модуля симпл+ не может быть более 255? мне нужно около 1100.. Да не может, исключение TCP пакет, но это не ваш случай, вам то на интерфейсе рисовать. В любом случае 1100 символов это много места занимает. Разбейте на меньшие фрагменты создав массив из строк string QUEUE_ARRAY[19][255] //20 строк по 255 символов. Создайте входы DIGITAL_INPUT UP,DOWN; И выводите одну из строк массива. PUSH UP { if (current_line<19){current_line=current_line+1; OutQ=QUEUE_ARRAY[current_line];} } PUSH DOWN { if (current_line>0){current_line=current_line-1; OutQ=QUEUE_ARRAY[current_line];} } Для заполнения массива лучше функцию написать, которая будет вызываться при каждом изменении очереди. Она должна делить QUEUE$ на блоки длинной не более 255 чтоб каждый заканчивался на символе \x0D и заполнять ими строки массива. Для начала не забудьте почистить массив. Function Fill_ARRAY(string queue) { Это Вам домашнее задание, а я чур спать. } Возможно так же, что String_Function и ее строковые параметры тоже имеют ограничение в 255 (наверняка не могу сказать). В таком случае передавайте не через параметры, а через глобальные переменные string типа с любой длинной. И не используйте return(), а опять таки модифицируйте глобальную переменную. Тогда нужно String_Function RemoveUserID(string User_ID, string queue_string) заменить на не типизированную Function RemoveUserID()

kislez2015: Вячеслав я решил выпутаться выводом всего пяти имен, а остальные доставать из глобальной переменной по мере необходимости)) одна загвоздка - как найти позицию, например, 5ого появления символа \n в строке?

Вячеслав: kislez2015 пишет: Вячеслав я решил выпутаться выводом всего пяти имен, а остальные доставать из глобальной переменной по мере необходимости)) Одна загвоздка - как найти позицию, например, 5ого появления символа \n в строке? Ну так примеров написаний функций более чем достаточно я уже привел. Попробуйте теперь самостоятельно. Потом проверим. Никаких новых функций для реализации такого поиска не понадобится, все уже есть в примерах этой темы. Integer_Function FindPositionFive(string source_str) { дерзайте } Можно конечно перевести на ya деньги 50р и я сделаю эту функцию для Вас

kislez2015: Вячеслав мне просто все кажется, что есть встроенные функции))) если есть find что ищет первое упоминание строки, то почему нет поиск позиции желаемого по счету поврорения)) так то я функцию сделал

Вячеслав: Все не предусмотреть, главное есть базовые, на которых можно построить более сложные адаптированные к конкретной задаче. Так что проверять будем вашу функцию?

kislez2015: Вячеслав у меня тут частично программа переигралась, надо обдумать)) спасибо за помощь

kislez2015: Вячеслав добрался до процессора на работе, тестирую) не подскажите одну загвоздку - формирую список имен людей, которые подали запрос на то, чтобы сказать. все формируется верно, по строкам, но почему-то каждый человек добавляет на сл строку символ "*"? разделитель между именами \n



полная версия страницы