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

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

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2009, 16:05   #1
SynEnergizer
Пользователь
 
Регистрация: 14.07.2009
Сообщений: 51
По умолчанию Алгоритм по настройкам пользователя

Hello, world!

Тема достаточно общая и была бы возможность (может и есть но лень искать) создать новую категорию я бы так и сделал. Поэтому публикую тему в С/С++, т.к. тут должны быть самые толковые люди (шутка).

Проблема такая: пускай нужно разработать алгоритм реализации решения какой-то задачи. Ход решения зависит от настроек пользователя.
Например, где-то в недрах форума кто-то постил задачу лабораторки типа
найти и заменить в текстовом файле подстроки и заменить их на новые причем:
  1. Поиск регистрозависимый или нет
  2. Искать только целые слова или все
  3. Направление поиска
    и т.д.


Такая ситуация не раз уже появлялась в моей практике и хотелось бы разработать общий подход.

Пускай v=(,,...) - вектор настроек пользователя.
Тогда может быть составлять отдельный алгоритм для каждого различного набора в v.
Можно как-то запрячь детерминированый автомат с состояниями v или что-то в этом духе?



Кто-то уже думал над таким вопросом. Кто как подходит к решению проблемы?

P.S. Не смотрел я, можно-ли создать новый раздел. Если нет, то предлагаю модераторам создать раздел типа "Вопросы алгоритмики" и перенести тему в новый раздел.

Последний раз редактировалось SynEnergizer; 29.07.2009 в 16:12.
SynEnergizer вне форума Ответить с цитированием
Старый 29.07.2009, 16:12   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Ход решения зависит от настроек пользователя.
В этом случае лучше сделать так: Если брать поиск, по для каждой строки вызывать процедуру-событие, которую сам пользователь (программист) и описывает не касаясь механизма выборки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.07.2009, 16:44   #3
SynEnergizer
Пользователь
 
Регистрация: 14.07.2009
Сообщений: 51
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
В этом случае лучше сделать так: Если брать поиск, по для каждой строки вызывать процедуру-событие, которую сам пользователь (программист) и описывает не касаясь механизма выборки.
А как же быть с направлением поиска?
SynEnergizer вне форума Ответить с цитированием
Старый 29.07.2009, 16:51   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А как же быть с направлением поиска?
ВСЕ!!! Включая это можно описать в событии, не затрагивая систему.
Просто система будет вызывать обработчик передавая ему параметр - строка которая взята на выборку, а код в обработчике уже будет решать как ему эту строку оперировать. Например так действуют Callback в Win API. Или OnFilterRecord в DB компонентах.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.07.2009, 18:34   #5
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Короче, Stilet предлагает создать интерфейс (API).
Levsha100 вне форума Ответить с цитированием
Старый 29.07.2009, 19:34   #6
SynEnergizer
Пользователь
 
Регистрация: 14.07.2009
Сообщений: 51
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
ВСЕ!!! Включая это можно описать в событии, не затрагивая систему.
Просто система будет вызывать обработчик передавая ему параметр - строка которая взята на выборку, а код в обработчике уже будет решать как ему эту строку оперировать. Например так действуют Callback в Win API. Или OnFilterRecord в DB компонентах.
Это понятно. Так вот интересен сам принцип написания кода обработчика,
избегая множественных вложеных if блоков.
SynEnergizer вне форума Ответить с цитированием
Старый 29.07.2009, 20:28   #7
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от SynEnergizer Посмотреть сообщение
найти и заменить в текстовом файле подстроки и заменить их на новые причем:
  1. Поиск регистрозависимый или нет
  2. Искать только целые слова или все
  3. Направление поиска
    и т.д.
как подобное реализую я:
в таких случаях настройки дефолтные пишутся в файл или в бд, после установки юзверем своих конфигов, создается новый файл/запись в бд с которого в последствии читается. на время работы конфиги пишутся в переменную для быстроты доступа.
описывается каждый алгоритм, когда юзверь выбирает действие, просматривается конфиг и выбирается нужный алгоритм.

про регистр элементарно - все на стандартных функциях

про целые слова не понял, может быть "целую фразу или по словам"?
- если целую фразу - элементарно, если по словам, то тут прогонять поиск по каждому слову (подгонку до фразы описывать не буду - лень печатать)

направление поиска можно сделать используя буферы с метками.
поиск в низ элементарен
обратный поиск - создавать зеркальное отражение буфера (реверсивную копию), реверсировать искомые слова и идти по реверсивному буферу в низ(вверх по обычному т.е.)
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

Последний раз редактировалось alexinspir; 29.07.2009 в 20:34.
alexinspir вне форума Ответить с цитированием
Старый 29.07.2009, 20:37   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Разделить поиск на несколько независимых частей:
- вырезание следующего куска текста для поиска (что-то типа парсера) (например, для поиска вверх будет браться предыдущая строка, а для поиска вниз - следующая. В общем сюда можно воткнуть реализацию конкретного направления поиска)
- подготовка для поиска (для регистрозависимого поиска ничего делать не надо, а вот для регистронезависимого - придется, вероятно, исходную строку привести к нижнему/верхнему регистру)
- сам поиск (ну тут будет разный код для поиска слов целиком и "частичного" поиска)
В общем поиск может выглядеть как-то так:
Код:
void поиск(исходный_текст, строка_для_поиска, парсер, подготовитель, поисковик)
{
  пока ничего не нашли и текст не обработали
  {
    кусок_текста = парсер(исходный текст);
    подготовитель(кусок_текста, строка_для_поиска);
    если (поисковик(кусок_текста, строка_для_поиска))
    {
      нашли_строку :)
    }
  }
}
парсер, поисковик и подготовитель - это могут быть как указатели на callback функции, так и интерфейсы, если больше нравится ООП. Ну и соответственно нужно будет реализовать два парсера (для поиска вверх и вниз соответственно), два поисковика и два подготовителя, чтобы избавиться от всех этих if'ов. Но при большом количестве параметров поиска так легко уже не разделить на этапы, да и зоопарк в списке параметров функции будет)
ЗЫ. У Александреску в книге "Современное проектирование на С++" было что-то про решение подобных задач, но там автор предлагает решать как-то хитро на шаблонах, если мне не изменяет память
pu4koff вне форума Ответить с цитированием
Старый 29.07.2009, 23:41   #9
SynEnergizer
Пользователь
 
Регистрация: 14.07.2009
Сообщений: 51
По умолчанию

Это все конечно хорошо, но тема тут несколько иная.
Задача с поиском в строке был лишь пример от которого нужно было абстрагироваться.

Попробую формализировать задачу.
Пускай необходимо вычислить функцию F(P,X1,X2,...,Xn), где P-вектор входных параметров (возможно пустой), а Xi, i=1,..n - настройки юзера.
(Ну в диалоге юзер натыкал флажков да переключателей, а ты теперь мучайся по какому пути делать че он(а) хочет).
К примеру, для лабораторки по поискам в строке X могла бы быть
(поиск назад, регистрозависимо,матчить слово только целиком).

Путей написания такой F(.) - множетсво (мы же программированием занимаемся, а не математикой, ой сори - вы занимаетесь, а кому там я нужен ).
Например так
F(P,X1,X2,...,Xn)
{
...
if (X1 & !X2 &X3 & ... &!Xn)
{
...
}
else if (!X & X2 & !X3 ... !Xn)
{
...
}
else
{
...
}
...
}

Что-то мне такой код не очень нравится, а вам?
Или же написать отдельную функцию на каждоый различный набор вектора X.

Критерий я пока сформировать затрудняюсь, ну пожалй только читабельность, но это такое дело...

Хотелось бы разработать такую технологию, которая была б унивирсальна.
Сегодня юзер тыкает галочки, потому что хочет со строками поиграться, а завтра юзеру нужна программа, где он удаленно настраивает азимут и чувствительность тарелки приема ТВ каналов. А у меня бы уже лежал шаблон F(P,X), хорошо написаный без всяких там
if (...)
{
if (...)
if (...)
{
и т.д.
SynEnergizer вне форума Ответить с цитированием
Старый 30.07.2009, 00:31   #10
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от SynEnergizer Посмотреть сообщение
много букв
разделяйте условия.

т.е.:

if(вниз?true:false)
{
/*тут вызовы функций поиска, по типу findThis(искомое,где ищем, как ищем)*/
}
else
{
/*тут подготавливаем текст для поиска вверх и далее тоже самое что и в случае true*/
}

далее определяете функцию findThis(), в которой возможно будут использоваться другие функции, например, findIgnoreCase() в которой уже используется findByWord() - разделение кода, в данной ситуации наиболее оправдано и позволит быстро и без особых проблем модифицировать нужные части оного.


вам бы лучше не разбираться в чужих идеях, а придумывать свои - как научитесь придумывать сами, то после этого лезьте в чужие/стандартные алгоритмы и на основе своей логики и имеющихся знаний все будет получаться
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
интерфейс пользователя в С++ Nadezhda Помощь студентам 0 08.04.2009 17:58
Идентификация пользователя Gorychev PHP 9 10.02.2009 08:56
Удаление пользователя треч О форуме и сайтах клуба 4 26.05.2008 21:38
Имя пользователя Albenous Win Api 3 20.01.2007 22:39