Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 539

/ вопрос решён /

Здравствуйте!
Сейчас работаю над экспертной системой в Delphi.
Вот тут в вопросе подробнее:
https://expert.delphi-int.ru/question/6531/

Столкнулась с проблемой при вычислении результата
Есть таблица с правильными ответами (как нужно ответить на вопрос, чтобы получить данный результат):

результат - вопрос1- вопрос2 - и т.д.
1 - 1 - 2 -
2 - 3 - 1 -

И есть таблица с вариантами ответов пользователя:

вопрос - ответ
1 - 1
2 - 3
и т.д.

Еще есть таблица с коэффициентами вопроса:

вопрос - коэффициент
1 - 40
2 - 10
и т.д.

Скажите, пожалуйста, возможно ли реализовать сравнение ответов пользователя с каждой строчкой из первой таблицы, и если они совпали, то коэффициенты сложить и в итоге вывести каждый результат с суммарным итогом коэффициентов, т.е.:

результат 1 : ответ пользователя 1 и он совпал с ответом для результата, значит коэффициент 40
на второй вопрос пользователь ответил - 3, а ответ для результата - 2, не совпало, значит коэффициент 0
суммарный коэффициент для результата 1 = 40 + 0 = 40

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

Подскажите, пожалуйста, это вообще реально сделать? Или может есть какой-то более легкий путь?

Цирцея Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задала: Цирцея (статус: Посетитель)
Вопрос отправлен: 5 июня 2014, 20:56
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: ANBsoft

Здравствуйте, Цирцея!
Сложно обрабатывать столбцы стандартными средставми SQL
Если изменить первую таблицу примерно так:
"Результат" "Номер вопроса" "Правильный ответ"
Лада 1 2
Лада 2 1
БМВ 1 1
БМВ 2 2
В таком случае можно будет вычислить число набранных каждым результатом баллов:

SELECT P."Результат", SUM(K."Коэффициент")
FROM Otvet O, PravilniyOtvet P, Koefficient K
WHERE (O."Номер вопроса"=P."Номер вопроса") and (O."Ответ"=P."Правильный ответ") and (P."Номер вопроса"=K."Номер вопроса")
GROUP BY P."Результат"

или вывести список подходящих критерием по каждому результату:

SELECT O."Номер вопроса", P."Результат", K."Коэффициент"
LEFT JOIN PravilniyOtvet P ON (O."Номер вопроса"=P."Номер вопроса") and (O."Ответ"=P."Правильный ответ")
LEFT JOIN Koefficient K ON (O."Номер вопроса"=K."Номер вопроса")

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

Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 5 июня 2014, 22:36
Оценка за ответ: 5

Комментарий к оценке: Спасибо огромное, очень выручили

Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 5 июня 2014, 23:01; участников в обсуждении: 2.
ANBsoft

ANBsoft (статус: Студент), 5 июня 2014, 21:47 [#1]:

Более понятно описывайте таблицы.
В первой таблице непонятно что и как хранится.
Что такое результат?
К примеру вторая таблица:
"Номер вопроса" "Ответ"
1 1
2 3
К третяя таблица:
"Номер вопроса" "Коэффициент"
1 40
2 10
ANBsoft

ANBsoft (статус: Студент), 5 июня 2014, 22:05 [#2]:

Логичнее будет хранить правильные ответы в отдельных строках, тогда можно будет все вычислять простым запросом, если же правильные ответы будут в столбцах, то получатся многоэтажные запросы, зависящие от количества вопросов в тесте
Цирцея

Цирцея (статус: Посетитель), 5 июня 2014, 22:07 [#3]:

К примеру, экспертная система по выбору машины, возьмем условно:

Вопрос 1: Что вы цените в машине?
1. Безопасность
2. Комфорт

Вопрос 2: Сколько подушек безопасности должно быть:
1. две
2. четыре

Таблица с правильными ответами:

результат - вопрос1- вопрос2 - и т.д.
Лада - 2 - 1
БМВ - 1 - 2

т.е., чтобы получить "БМВ" , пользователю на первый вопрос нужно ответить 1, а на второй - 2

И есть таблица с вариантами ответов пользователя:

вопрос - ответ
вопрос1 - 1
вопрос2 - 1
и т.д.

т.е. на первый вопрос он ответил 1, на второй тоже 1

Таблица с коэффициентами вопроса:

вопрос - коэффициент
1 - 40
2 - 10
и т.д.

коэффициенты нужны, чтобы обозначить "важность" вопроса, т.е. в данном случае вопрос 1 важнее, чем вопрос 2
Это сделано для того чтобы, вопросы важные вопросы, например, как первый(Что вы цените в машине?) не был равноценен вопросу, например о цвете машины

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

вроде более понятно описала
Самый страшный вирус всегда сидит перед компьютером.
Цирцея

Цирцея (статус: Посетитель), 5 июня 2014, 22:14 [#4]:

ANBsoft, правильные ответы в строках хранятся, а ответы пользователя лучше переделать вот так:

вопрос1 - вопрос2 - и т.д.
1 - 1

я правильно Вас поняла?
Самый страшный вирус всегда сидит перед компьютером.
Цирцея

Цирцея (статус: Посетитель), 5 июня 2014, 22:46 [#5]:

ANBsoft, спасибо за ответ
а если считать проценты вот тут:

SELECT P."Результат", SUM(K."Коэффициент")
FROM Otvet O, PravilniyOtvet P, Koefficient K
WHERE (O."Номер вопроса"=P."Номер вопроса") and (O."Ответ"=P."Правильный ответ") and (P."Номер вопроса"=K."Номер вопроса")
GROUP BY P."Результат"

то вместо SUM(K."Коэффициент") можно написать:

SUM AS (SUM(K."Коэффициент")*100/Х)

где, Х - максимальный коэффициент (посчитать его до этого запроса)
можно ведь так сделать?
Самый страшный вирус всегда сидит перед компьютером.
ANBsoft

ANBsoft (статус: Студент), 5 июня 2014, 22:53 [#6]:

SELECT P."Результат", SUM(K."Коэффициент"*100/X)-если X известен заранее
или
SELECT P."Результат", SUM(K."Коэффициент"*100/(SELECT SUM("Коэффициент") FROM Koefficient))
если неизвестен или коэффициенты могут меняться
Цирцея

Цирцея (статус: Посетитель), 5 июня 2014, 23:01 [#7]:

Ой, точно. Спасибо огромное.
Я сейчас буду делать тогда.
Завтра отпишусь, получилось или нет.
Вы сможете зайти и посмотреть, на случай, если вдруг что-то не получится? Это очень важно для меня.
Спасибо.
Самый страшный вирус всегда сидит перед компьютером.

6 июня 2014, 18:24: Статус вопроса изменён на решённый (изменил автор вопроса — Цирцея)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:47
Выполнено за 0.02 сек.