Перейти к содержимому


Ветвление при вычислении результатов


Сообщений в теме: 2

#1 Гость_lenkov_*

  • Гости

Отправлено 05 Август 2016 - 19:53

Приветствую!

У меня есть задача в, которой по итогам теста,
1 суммируются две группы ответов на вопросы
2 эти сумму сравниваются
3 В итоге выдаваться результат скажем E или I.

Вопросы содержат два варианта ответа: А\Б. Балл приносит А.

Суммируются все ответы Б и все ответы А. И если ответов Б было меньше, чем ответов А, то значение 1 и результат “E” в остальных случаях значение 0 и результат “I”

Алгоритм выглядит так:
((((балл (корневая->группа вопрос1) <1) ? 1 : 0)+(( балл (корневая->группа вопрос2) <1) ? 1 : 0))<( балл (корневая->группа вопрос1) + балл (корневая->группа вопрос2)) ? 1 : 0

Первая сумма считает ответы Б, вторая сумма считает ответы А
Значение Результат
0 E
1 I

А теперь задача усложнилось, надо добавить еще одно значение в случае, если обе группы сумм ответов равны друг другу.
Значение Результат
0 E
1 I
3 E =I

Как я понимаю, мне нужен аналог оператора if else, который позволил бы добавить еще одно условие с равенством сумм. Подскажите можно ли это как то реализовать в вашем программном комплексе?

#2 Administrator

    Менеджер проекта

  • Администраторы
  • 1 109 сообщений

Отправлено 05 Август 2016 - 20:01

Здравствуйте!

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

1. У Вас есть несколько вопросов типа выбор одного варианта ответа из нескольких, в которых 2 варианта ответа А и Б. Так?
2. Нужно отдельно получить количество ответов А и Б. Так?
3. Потом нужно сравнить количество ответов и в зависимости от того sum(А) > sum(Б), sum(А) < sum(Б), sum(А) = sum(Б) выдать то или иное значение. Так?

Это все решается оператором (условие ? истина : ложь). Просто их придется вкладывать друг в друга.
Допустим за варианты А проставляем 1, а если вариант ответа Б проставляем 0 баллов.

Самое краткое решение задачи выглядит так:

Изображение

Здесь были использованы функции, чтобы не дублировать код сложения при вычислении второго вложенного условия. При вычислении функции B() используется восклицательный знак !x - это булева операция, которая превращает false в true, а true в false. Поскольку у нас работа с числами, то при применении булевой операции к числам, числа автоматически преобразуются к истина/ложь. Ложью равняется только 0, все остальное истина. Потом эти булевы значения обратно конвертируются в числа, т.к. используется оператор сложения +. Фактически мы получили более краткую запись того, как Вы расписывали (X<1 ? 1 : 0), хотя достаточно сделать просто !X. Тогда 0 баллов превратятся в 1, а 1 балл превратится в 0.

По сути A()>B() ? 0 : (A()<B() ? 1 : 2); мы получили аналог:

Если(A>Б) Результат = 0;
Иначе Если(A<Б) Результат = 1;
Иначе Результат = 2;

Файл теста прикладываю к сообщению.

Прикрепленные файлы



#3 Гость_lenkov_*

  • Гости

Отправлено 08 Август 2016 - 10:29

Доброго утра!

A()>B() ? 0 : (a()<b() ?1 : 2);

Да это именно то, что нужно.Вы абсолютно верно уловили суть вопроса! Решение !x тоже намного изящнее. Благодарю за пояснения!




Ответить



  


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных