Диалог с компьютером
Остальное
- Содержание

Не так давно передо мной встала задача написать систему, которая опрашивает пользователя и в зависимости от его ответов задает различные вопросы. Такие системы могут помочь выбрать какой-либо товар или тариф.
Приведу пример.
Система спрашивает пользователя, какую часть компьютера он хочет купить. Получает в ответ - монитор. После этого вопросы о системном блоке задавать бесполезно. В лучшем случае это только отнимет время пользователя.
Если количество параметров отбора невелико и пользователю предлагается пара-другая вопросов, проблем возникнуть не должно. Иначе одними условиями уже не обойдешься.
Структура базы данных
Для создания системы нам понадобятся следующие таблицы базы данных:
CREATE TABLE `quests` ( `id` int(11) unsigned NOT NULL auto_increment, `text` varchar(255) NOT NULL, `type` int(2) unsigned NOT NULL default '0', `rules` varchar(50) NOT NULL, `param` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Это таблица с вопросами.
- text представляет собой сам вопрос.
- type - тип вопроса. Он определяет, в каком виде будут представляться ответы пользователю. Это может быть текстовое поле, выпадающий список, несколько радио-кнопок или любой другой элемент управления.
- rules - правила, которым должен удовлетворять ответ. К примеру ответ должен быть обязательным, представлять собой число, иметь определенную длину, ну и так далее.
- param - внутренний параметр, об этом мы поговорим дальше.
Таблица с ответами:
CREATE TABLE `answers` ( `id` int(11) unsigned NOT NULL auto_increment, `qid` int(11) unsigned NOT NULL default '0', `text` varchar(255) NOT NULL, `value` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
- qid - идентификатор соответствующего вопроса.
- text - текст вопроса.
- value - значение параметра.
Таким образом, после ответа на вопрос мы получаем связку параметр-значение param - value, которая содержит условие. В зависимости от него система определит, какие еще вопросы нужно задать пользователю. Эти правила содержатся в следующей таблице.
CREATE TABLE `rules` ( `id` int(11) unsigned NOT NULL auto_increment, `param` varchar(100) NOT NULL, `value` varchar(100) NOT NULL, `qid` int(11) unsigned NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Немножко расширим системы, позволив ей получать новые связки вопросов из исходных:
CREATE TABLE `combine_rules` ( `id` int(11) unsigned NOT NULL auto_increment, `param1` varchar(100) NOT NULL, `value1` varchar(100) NOT NULL, `operator` int(1) unsigned NOT NULL default '0', `param2` varchar(100) NOT NULL, `value2` varchar(100) NOT NULL, `param` varchar(100) NOT NULL, `value` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
- operator определяет логическое И, ИЛИ или отсутствие оператора.
Таблица output хранит условия выборки в зависимости от значений параметров.
CREATE TABLE `output` ( `id` int(11) unsigned NOT NULL auto_increment, `param` varchar(100) NOT NULL, `value` varchar(100) NOT NULL, `output` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Алгоритм
Такова структура базы данных. Теперь пару слов об алгоритме.
При запуске системы создаем два массива A и B.
Массив A содержит идентификаторы вопросов, которые необходимо задать. Начальные условия можно инициализировать по условию, к примеру start -> 1.
Массив B изначально пустой, он нам нужен для хранения вопросов, которые уже задавались. Чтоб не повторяться.
После того как вопрос задан, он из очереди A попадает в очередь B. И так до тех пор пока не кончатся вопросы.
Алгоритм опроса можно представить в виде блок схемы:
После того как пользователь ответил на все вопросы, по параметрам и значениям осуществляется выборка.
Пожалуй, это все. Если возникли вопросы, я постараюсь помочь.
Понравилась статья? Подпишись на RSS.

Комментарии
Здесь пока никто не писал.