Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2011, 09:30   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Буду признателен, если напишите правильный способ...
дело в том, что задания типа 1.e и 2.e одни из самых "навороченных" в данном списке.
решение "в лоб":
Код:
e) if ((A<50) and (B>=50) and (C>=50))
       or ((A>=50) and (B<50) and (C>=50))
       or ((A>=50) and (B>=50) and (C<50)) 
then {...};
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2011, 09:32   #12
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

ну в лоб-то и я могу))) должнао же быть нормальное применение логики?
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 25.03.2011, 10:08   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
ну в лоб-то и я могу)))
тут же учебные задачи. Тут прямое, ясное, наглядное и, главное, ПРАВИЛЬНО РАБОТАЮЩЕЕ, решение и нужно!

Цитата:
должно же быть нормальное применение логики?
не исключено. но мне быстро не удалось найти красивое и правильное решение...
можно, конечно, написать так:
Код:
if (ord(A<50) + ord(B<50)  + ord(C<50)) = 1 then ...
но это уже хакерство!..
да и не думаю, что преподаватель зачтёт это (безусловно правильно работающее решение) как верное!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2011, 11:31   #14
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

так там вроде только один вариант не подходит, который и надо исключить:
Код:
R := (A xor B xor C) and not (A and B and C);
(A, B и C -- булевские переменные)
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 25.03.2011, 13:11   #15
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от veniside
так там вроде только один вариант не подходит, который и надо исключить:
Код:
R := (A xor B xor C) and not (A and B and C);
Ага. Точно. Вы правы!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2011, 13:39   #16
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Смотрите, про XOR.
Если нам требуется формализовать выражение
Цитата:
e) только одно из чисел Х, У и Z кратно пяти;
То это будет выглядеть так (кстати, оператор XOR здесь не нужен).

Пусть булевые переменные a,b,c означают: X,Y,Z кратно пяти соответственно.
Для обозначения отрицание переменном примем обозначение: a',b',c'.

То есть, если a означает X кратно 5, то a' (НЕ a) означает x не кратно 5.

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

(a И b' И с') ИЛИ (a' И b И с') ИЛИ (a' И b' И с)

// а вообще, в подобных вопросах дискретная математика (в частности булева алгебра) суть хорошее подспорье

Добавлено:

Спешу заметить, что XOR в данном случае не помогает:

давайте предположим, что все числа X,Y, Z кратны 5. (A = B = C = 1 (истина))
Таким образом:
A XOR B XOR C = 1 XOR 1 xor 1 = 0 XOR 1 = 1.
Результат неверен, поскольку на все числа, кратные пяти, формула ответила положительно, что идёт вразрез с заявленными требованиями.

Ещё добавлено:

Разумеется, можно свести написанной мной выражение к виду A (оператор) B (оператор) C.
Но:

1. Программисту, который впервые видит такое выражение, придётся разбираться, что же же оно делает (может даже придётся составить таблицу истинности, что, впрочем, совсем не сложно).
2. Придётся пошевелить мозгами (может, чуть-чуть), чтобы выполнить указанное мной выше преобразование.

А я за удобочитаемость и понятность кода.

Последний раз редактировалось Вадим Мошев; 25.03.2011 в 14:07.
Вадим Мошев вне форума Ответить с цитированием
Старый 25.03.2011, 15:32   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вадим Мошев, Вы всё правильно написали.

Но, обратите внимание, veniside в пост #14 написал решение именно через XOR)

для вашего примера
Цитата:
Пусть булевые переменные a,b,c означают: X,Y,Z кратно пяти соответственно.
Код:
результат := (a xor b xor c) and not (a and b and c);
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
логические операции yk92 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 28.10.2010 09:38
Логические операции AlexandraKr Помощь студентам 0 18.10.2010 15:20
логические функции JESSIE1000005 Помощь студентам 2 28.03.2009 19:26