Есть опросник состоящий из вопросов с вариантами ответа. В обычном режиме заполняется последовательно, но пользователь может прервать заполнение и продолжить, например, на следующий день (есть система регистрации в системе которая позволяет это), причем частично изменив уже введенные ранее ответы (скажем, 1-2 вопроса). Сложность в том, что ответ на некоторые вопросы определяет то какие вопросы будут заданы за ними (в типичном "сценарии" задается менее половины вопросов). Т.е. у нас "дерево вопросов".
Без возможности изменения ответов это легко реализовать перебором вариантов на каждом шаге. А как поступить в случае произвольного изменения введенных ответов? При этом после смены ответа на ключевой вопрос те вопросы ответ на который не требуется менять не должны задаваться повторно. В любой момент у нас должна быть информация о том заполнена анкета до конца или нет, смена ответа на ключевой вопрос должна аннулировать состояние заполненности. Интересен алгоритм реализации этой проблемы на php-подобном языке и javascript (хотя бы общая идея), а также ваше мнение о его сложности. Возможно применение ajax.
Здравствуйте, dancing.sphinx, Вы писали:
DS>Есть опросник состоящий из вопросов с вариантами ответа. В обычном режиме заполняется последовательно, но пользователь может прервать заполнение и продолжить, например, на следующий день (есть система регистрации в системе которая позволяет это), причем частично изменив уже введенные ранее ответы (скажем, 1-2 вопроса). Сложность в том, что ответ на некоторые вопросы определяет то какие вопросы будут заданы за ними (в типичном "сценарии" задается менее половины вопросов). Т.е. у нас "дерево вопросов".
DS>Без возможности изменения ответов это легко реализовать перебором вариантов на каждом шаге. А как поступить в случае произвольного изменения введенных ответов? При этом после смены ответа на ключевой вопрос те вопросы ответ на который не требуется менять не должны задаваться повторно. В любой момент у нас должна быть информация о том заполнена анкета до конца или нет, смена ответа на ключевой вопрос должна аннулировать состояние заполненности. Интересен алгоритм реализации этой проблемы на php-подобном языке и javascript (хотя бы общая идея), а также ваше мнение о его сложности. Возможно применение ajax.
Изначально
— имеем набор всех возможных вопросов
— и функции-условия видимости каждого из них
Этот набор упорядочен по зависимости условий.
Во время опроса
— создаём бланк ответов на все вопросы (а не только на видимые)
— пользователь имеет право перемещаться по списку видимых вопросов от самого первого до первого неотвеченного
— все ответы запоминаются, включая те, которые стали невидимыми.
Как только все видимые вопросы стали отвеченными, тест завершён.
Как всё это красиво закодировать... Чёрт его знает.
Упростим себе задачу, ограничившись только последовательной навигацией.
Тогда обозначим N — число всех вопросов (вопросы нумеруются [0..N-1])
С позиции K можно перейти
— назад — к ближайшему видимому вопросу из [K-1,K-2..0] — последовательно проверяя признаки их видимости
— вперёд — к ближайшему видимому из [K+1..N-1]; но при единственном условии: данный вопрос был отвечен.
Чтобы не проверять видимость каждый раз — можно завести кэш, и сбрасывать его хвост после изменения того или иного ответа.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>