Логическая функция
От: Аноним  
Дата: 15.08.11 11:20
Оценка:
Этюд из жизни.
Есть четыре булевых переменных.
Требуется написать функцию, возвращающую TRUE в случае, если две или больше из них равны TRUE (иначе — FALSE).
Re: Логическая функция
От: K13 http://akvis.com
Дата: 15.08.11 11:29
Оценка: +1
А>Этюд из жизни.
А>Есть четыре булевых переменных.
А>Требуется написать функцию, возвращающую TRUE в случае, если две или больше из них равны TRUE (иначе — FALSE).

В реальном коде на C/C++? сложить и сравнить сумму.
Re: Логическая функция
От: Аноним  
Дата: 15.08.11 11:49
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Есть четыре булевых переменных.

А>Требуется написать функцию, возвращающую TRUE в случае, если две или больше из них равны TRUE (иначе — FALSE).

Самый простой вариант — построить таблицу истинности функции, а по ней построить дизъюнктивную нормальную форму функции.
Re: Логическая функция
От: Аноним  
Дата: 15.08.11 11:55
Оценка: +1
В лоб:

return (b1 && b2) || (b1 && b3) || (b1 && b4) || (b2 && b3) || (b2 && b4) || (b3 && b4);
Re: Логическая функция
От: DOOM Россия  
Дата: 15.08.11 11:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Требуется написать функцию, возвращающую TRUE в случае, если две или больше из них равны TRUE (иначе — FALSE).

Тебе поможет дизъюнктивная нормальная форма.
Re[2]: Логическая функция
От: icWasya  
Дата: 15.08.11 13:16
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>В лоб:

А>return (b1 && b2) || (b1 && b3) || (b1 && b4) || (b2 && b3) || (b2 && b4) || (b3 && b4);

или полбу
return (b1 && (b2 || b3 || b4)) || (b2 && (b3 || b4)) || (b3 && b4);
Re: Логическая функция
От: wildwind Россия  
Дата: 15.08.11 13:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть четыре булевых переменных.

А>Требуется написать функцию, возвращающую TRUE в случае, если две или больше из них равны TRUE (иначе — FALSE).

x1 & x2 | x1 & x3 | x1 & x4 | x2 & x3 | x2 & x4 | x3 & x4
Re: Логическая функция
От: Lloyd Россия  
Дата: 15.08.11 13:36
Оценка: 3 (2)
Здравствуйте, Аноним, Вы писали:

А>Этюд из жизни.

А>Есть четыре булевых переменных.
А>Требуется написать функцию, возвращающую TRUE в случае, если две или больше из них равны TRUE (иначе — FALSE).

return ((b1 ? 1 : 0) + (b2 ? 1 : 0) + (b3 ? 1 : 0) + (b4 ? 1 : 0)) >= 2;
Re[2]: Логическая функция
От: Аноним  
Дата: 15.08.11 14:05
Оценка:
Здравствуйте, K13, Вы писали:

А>>Этюд из жизни.

А>>Есть четыре булевых переменных.
А>>Требуется написать функцию, возвращающую TRUE в случае, если две или больше из них равны TRUE (иначе — FALSE).

K13>В реальном коде на C/C++? сложить и сравнить сумму.


Уже так и сделал. Но хочется поизвращаться.
Re: Логическая функция
От: snoɯʎuouɐ  
Дата: 15.08.11 14:49
Оценка: 4 (1)
Здравствуйте, Аноним, Вы писали:

А>Требуется написать функцию, возвращающую TRUE в случае, если две или больше из них равны TRUE (иначе — FALSE).


http://goo.gl/gYYsX
Re: Логическая функция
От: Аноним  
Дата: 15.08.11 17:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Этюд из жизни.

А>Есть четыре булевых переменных.
А>Требуется написать функцию, возвращающую TRUE в случае, если две или больше из них равны TRUE (иначе — FALSE).

Какие операции булевой алгебры разрешается использовать?
Re[2]: Логическая функция
От: andy1618 Россия  
Дата: 15.08.11 17:38
Оценка:
Здравствуйте, snoɯʎuouɐ, Вы писали:

ɯʎɐ>Здравствуйте, Аноним, Вы писали:


А>>Требуется написать функцию, возвращающую TRUE в случае, если две или больше из них равны TRUE (иначе — FALSE).


ɯʎɐ>http://goo.gl/gYYsX


Классный ресурс, но там не хватает оптимизаций — например, методом Карт Карно.
У меня получилось выражение из 8 членов:
((b1&b2)|b3|b4) & ((b3&b4)|b1|b2)
Re[2]: Логическая функция
От: Аноним  
Дата: 16.08.11 06:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Этюд из жизни.

А>>Есть четыре булевых переменных.
А>>Требуется написать функцию, возвращающую TRUE в случае, если две или больше из них равны TRUE (иначе — FALSE).

А>Какие операции булевой алгебры разрешается использовать?


Все, какие есть в обычном прикладном языке программирования (вроде С++ или Visual Basic).
Re[3]: Логическая функция
От: Аноним  
Дата: 16.08.11 12:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>Какие операции булевой алгебры разрешается использовать?

А>Все, какие есть в обычном прикладном языке программирования (вроде С++ или Visual Basic).

Ну это как посмотреть. Битовая операция ^ (исключающее "или") тоже булева функция, но в C++ за логическую не считается. И еще (bool)==(bool) и (bool)!=(bool) тоже булевы функции, их можно использовать?
Re: Логическая функция
От: MaximVK Россия  
Дата: 16.08.11 14:11
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Этюд из жизни.

А>Есть четыре булевых переменных.
А>Требуется написать функцию, возвращающую TRUE в случае, если две или больше из них равны TRUE (иначе — FALSE).

Только через Монте-Карло. Случайно выбираешь переменную и проверяешь ее на true и так много раз.
Через отношение экспериментов с true к общему числу экспериментов получаешь правильный ответ.
Re[2]: Логическая функция
От: andy1618 Россия  
Дата: 16.08.11 14:25
Оценка:
Здравствуйте, Lloyd, Вы писали:

А>>Этюд из жизни.

А>>Есть четыре булевых переменных.
А>>Требуется написать функцию, возвращающую TRUE в случае, если две или больше из них равны TRUE (иначе — FALSE).

L>return ((b1 ? 1 : 0) + (b2 ? 1 : 0) + (b3 ? 1 : 0) + (b4 ? 1 : 0)) >= 2;

L>

Кстати, в отличие от честных вариантов на логических функциях, этот вариант существенно понятнее
Re[3]: Логическая функция
От: Lloyd Россия  
Дата: 16.08.11 14:27
Оценка: +1
Здравствуйте, andy1618, Вы писали:

L>>return ((b1 ? 1 : 0) + (b2 ? 1 : 0) + (b3 ? 1 : 0) + (b4 ? 1 : 0)) >= 2;

L>>

A>Кстати, в отличие от честных вариантов на логических функциях, этот вариант существенно понятнее


Но и не без недостатков. В частности, тебует вычисления всех выражений, даже тогда, когда в этом нет необходимости.
Re[2]: Логическая функция
От: nen777w  
Дата: 20.08.11 13:34
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Аноним, Вы писали:


А>>Этюд из жизни.

А>>Есть четыре булевых переменных.
А>>Требуется написать функцию, возвращающую TRUE в случае, если две или больше из них равны TRUE (иначе — FALSE).

L>return ((b1 ? 1 : 0) + (b2 ? 1 : 0) + (b3 ? 1 : 0) + (b4 ? 1 : 0)) >= 2;

L>

зачем такие сложности со всеми этими ветвлениями, просто сложить интерпретировав как int
, для кодогенерации компилятора это всего лишь другая инструкция процессора, но это позволяет избежать ветвления и отложенных вычислений.
Re[3]: Логическая функция
От: Lloyd Россия  
Дата: 20.08.11 15:36
Оценка:
Здравствуйте, nen777w, Вы писали:

L>>return ((b1 ? 1 : 0) + (b2 ? 1 : 0) + (b3 ? 1 : 0) + (b4 ? 1 : 0)) >= 2;

L>>

N>зачем такие сложности со всеми этими ветвлениями, просто сложить интерпретировав как int

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

Если не изменяет память, то в С любое число отличное от 0 трактуется как TRUE, поэтому в b1 может прийти как 1, так и 10, 100, MAX_INT.
Re[4]: Логическая функция
От: Аноним  
Дата: 20.08.11 16:53
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, nen777w, Вы писали:


L>>>return ((b1 ? 1 : 0) + (b2 ? 1 : 0) + (b3 ? 1 : 0) + (b4 ? 1 : 0)) >= 2;

L>>>

N>>зачем такие сложности со всеми этими ветвлениями, просто сложить интерпретировав как int

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

L>Если не изменяет память, то в С любое число отличное от 0 трактуется как TRUE, поэтому в b1 может прийти как 1, так и 10, 100, MAX_INT.


(int)!!b
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.