Что такое сложное условие
Оформление сложных условий
Условный оператор в обычной своей форме источником проблем является сравнительно редко. Однако само условие порой оказывается достаточно сложным и встает на пути к мечте любого разработчика. Речь, конечно же, о красивом и читаемом коде.
Возможно, я не там искал, но ни разу в стандартах оформления кода не встречал упоминаний о том, как быть со сложными условиями. Разобраться с ними — и есть цель данной статьи.
Так как с высасыванием из пальца у меня проблемы, в качестве источника примеров взята часть исходников GCC 4.8.2, для авторов которых стандарты оформления — не пустой звук. Используя примеры, буду приводить файл и строку начала, чтобы желающие могли убедиться, что все честно. Сразу замечу, что, так как примеры реальные и брались из ограниченного источника, некоторые из них могут оказаться не самыми удачными.
В контексте данной статьи сложным будем считать условие, которое состоит из нескольких подусловий и не удовлетворяет требованиям при записи в одну строку. Подразумеваются требования, например, к длине строки или читаемости.
Читаемость, как обычно, определяется на глаз, ибо в одних случаях 3-4 подусловия выделяются при первом же взгляде на участок кода, а в других и с двумя черт ногу сломит. Так, например, использование функций, приведения типов, побитовых операций или вложенности значительно усложняет чтение условий.
Следующий пример находится где-то на грани.
Но порой даже простое условие заставляет на мгновение задуматься.
Естественно, если подобное будет частью условия, то его (результирующее условие) простым назвать трудно.
Примеры с директивами препроцессора внутри условий я намеренно не брал, так как это уже об еще более сложных условиях, выходящих за рамки статьи.
Для улучшения читаемости потребуется разбить условие на блоки. Так же придется поступить, если длина строки с условием превышает допустимую (часто оговаривается в стандартах). Принципы этого разбиения нас и интересуют по двум основным причинам. Во-первых, делать это надо так, чтобы не усугубить ситуацию. Во-вторых, нужно прийти к пусть негласному, но стандарту, ведь сам факт единообразия уже является плюсом к читаемости.
Первое, что приходит на ум, — использование вложенных условных операторов.
Если в первом случае не все так плохо, то во втором вложенное условие близко к тому, что и его необходимо будет дробить. А между тем растет вложенность кода. К тому же в случае с дизъюнкцией такой фокус не пройдет.
Более интересным вариантом являются многострочные условия. Такое решение для некоторых кажется неожиданным, хотя оно много где поддерживается (в тех же C, PHP, Python).
Идея разбиения заключается в том, что на каждой строке оставляется только одно подусловие.
Это условие читаемое и легко понимаемое. Но оно не соответствует ранее упомянутому правилу. Здесь всплывает польза однообразия. Если необходимость писать по одному подусловию в строку не оговорена, то анализ этого условия при чтении его усложняется. В обратном случае, даже встретив что-нибудь вроде libgcc/fp-bit.c — 1579 в качестве подусловия, заранее известно, что оно не является сложным.
Большинство многострочных условий в рассматриваемых исходниках все же соответствуют этой идее. Но не ограничиваться же только ею. Отступы в последнем примере подсказывают, что наглядно можно представить и вложенность условий при таком подходе. Единственное, что вызвало сомнение — все подобные условия были слишком уж однообразны, представляли из себя именно такую «лесенку», из-за чего появилась даже мысль о том, что это просто совпадение.
К счастью, нашелся целый один пример, который, без сомнения, подходит под мое определение красивого и понятного сложного условия.
Здесь и соблюден принцип одного подусловия на строку, и наглядно показана вложенность. Разбор такого условия прост, и этим приятен. Представьте его однострочным или в виде трех-четырех вложенных if’ов.
Естественно, совмещать подобное с вложенным условным оператором (как это сделано в libgcc/libgcc2.c — 1611 (примера в статье нет)) не стоит.
Мне на ум приходит еще один вариант реализации данного подхода, но он более громоздкий, и на практике я его не встречал. Что-то вроде следующего:
Это лишь один из вариантов. Идея заключается в вынесении закрывающих скобок на отдельную строку. Это избавляет от «скачущих» отступов, как, например, в следующем примере.
Ну а расстановка скобок аналогична расстановке всем привычных операторных скобок и потому очевидна и понятна. Скобки для выделения вложенных условий, конечно же, обязательны, так как позволяют избежать ошибок, связанных с приоритетом логических операций.
Думаю, выводы не нужны, каждый для себя сделает сам. Ну а если данный вопрос все же затрагивался в каких-то стандартах или литературе, то ссылки, названия, авторы не помешают (цитаты приветствуются).
UPD: еще один хороший вариант — выделение частей сложного условия в отдельные булевы переменные. Не попалось подходящего рабочего примера, потому не упомянул изначально. За показательный код спасибо lexasss.
При правильных группировке условий и именовании переменных такой подход несет еще и документирующую функцию.
Содержание урока
Сложные условия
Сложные условия
Предположим, что ООО «Слонопотам» набирает сотрудников, возраст которых от 25 до 40 лет включительно. Нужно написать программу, которая запрашивает возраст претендента и выдаёт ответ: подходит он или не подходит по этому признаку.
Какое же условие должно быть истинно для того, чтобы человека приняли на работу? Одного условия «возраст >= 25» недостаточно, это условие соблюдается и для людей старше 40 лет. Вместе с тем условия «возраст = 25» и «возраст =25 и v =25) and (v Операция И означает одновременное выполнение двух или нескольких условий.
Что будет выведено на экран после выполнения программы?
Предположим, что нам надо убедиться, что значение целой переменной а — трёхзначное число, которое делится на 7. Для этого нужно, чтобы одновременно выполнились три условия:
1) число не меньше 100 (> 99);
2) число меньше 1000;
3) число делится на 7, т. е. остаток от его деления на 7 равен нулю.
В условном операторе тогда нужно использовать две операции И, которые связывают три простых условия:
Вот решение на Паскале:
Если мы напишем условие d=6 и d=7, то это будет неверно, потому что тогда мы потребуем, чтобы значение переменной d было одновременно равно и 6, и 7. Такого быть не может, поэтому условие всегда будет ложно. Значит, операция И не подходит. Вместо неё нужно применить другую операцию — ИЛИ, которая требует выполнения хотя бы одного из набора условий.
Операция ИЛИ означает выполнение хотя бы одного из двух или нескольких условий.
Решение нашей задачи выглядит так:
В языке Паскаль операция ИЛИ обозначается словом or (в переводе с английского — «или»).
Напишите другой вариант решения последней задачи, использующий операцию И.
В обоих языках существует ещё одна операция, которую можно использовать в сложных условиях, — НЕ, в Паскале она обозначается словом not (в переводе с английского — «не»).
Операция НЕ означает обратное условие (противоположное исходному).
Например, решение задачи определения выходных дней можно было записать так:
Используя операцию НЕ, можно записывать условия по-разному, как нам удобнее в каждом случае. Например, условия а=b и не (а<>b) истинны для одних и тех же значений а и b, поэтому одно из них можно заменить на другое. Такие условия называются равносильными.
Запишите в тетради равносильные условия, не используя операцию НЕ:
Операции И, ИЛИ и НЕ — это логические операции, которые мы будем подробно изучать в 9 классе. Они работают с логическими значениями («да»/«нет», «истина»/«ложь»).
Если в сложном условии встречается несколько разных операций, они выполняются в следующем порядке (во всех случаях — слева направо):
1) операции в скобках;
2) операции НЕ;
3) операции И;
4) операции ИЛИ.
Изменить порядок действий можно с помощью круглых скобок.
Определите порядок операций при определении истинности условия. Алгоритмический язык:
не (а>10) или не(а 10) or not(а<10) and (a
Определите, истинно или ложно это выражение при а = 5, b = 10.
Для выражения в предыдущем задании запишите равносильное выражение без использования операции «НЕ». После этого расставьте одну пару скобок так, чтобы значение выражения при а = 5, b = 10 изменилось на обратное.
Следующая страница Логические переменные
Cкачать материалы урока
Сложные условия
Во многих случаях нужно одновременно проверять несколько условий. Например, перед расчетом площади треугольника по длинам сторон все три длины стороны a,b,c обязаны быть положительными числами, т.е. должно выполняться условие «a>0 и b>0 и c>0». Для записи сложных условий в Delphi предусмотрен набор логических операций над условиями (табл. 2). Обязательное требование – сами условия при этом записываются в скобках!
Поясним действие логических операций. Операция AND («и») возвращает значение «истина» только в том случае, если оба условия, которые она соединяет, истинны. Если хотя бы одно из условий не выполняется, AND вернет «ложь». Операция OR («или») не столь строга – она возвращает значение истина, если либо одно, либо другое, либо оба разу соединяемых условия истинны. Родственная операция XOR (исключающее «или») очень похожа на OR с той разницей, что она исключает случай, когда оба условия выполняются (или одно, или другое6 но не оба сразу). Наконец, операция NOT (отрицание) применяется не к двум, а к одному условию и просто «переворачивает» его: (a=b) есть то же самое, что NOT(a<>b).
Операция | a | b | Результат | Операция | a | b | Результат |
(a) AND (b) | true | true | true | NOT(a) | true | — | false |
true | false | false | false | — | true | ||
false | true | false | — | — | |||
false | false | false | — | — | |||
(a) OR (b) | true | true | true | (a) XOR (b) | true | true | false |
true | false | true | true | false | true | ||
false | true | true | false | true | true | ||
false | false | false | false | false | false |
Вот как может выглядеть запись проверки всех трех введенных сторон треугольника на положительность:
IF (a>0) AND (b>0) AND (c>0) THEN
Label1.Caption:=’Стороны должны быть больше нуля’;
Тот же пример можно записать и по-другому:
Edit2 – ввода номера дня недели
Label1, Label2 – вывода пояснительного текста о назначении полей ввода.
Label3 – вывода результата вычисления стоимости разговора
Button 1 – Активизации процедуры вычисления
Здесь и далее при описании формы приложения приводятся значения только тех свойств компонентов, которые используются в программе. Значения остальных свойств могут быть оставлены без изменения или изменены произвольным образом, естественно, в разумных пределах (очевидно, что размер командной кнопки может быть выбран произвольно).
Программа производит вычисления при щелчке на командной кнопкеВычислить. В этом случае возникает событие Ondick, процедура обработки которого приведена ниже.
procedure TForm1.Button1Click(Sender: TObject);
if (Day = 6) OR (Day = 7)
then Summa:=Summa* (100-DISCOUNT)/100;
label3.Caption:=’К оплате ‘ + FloatToStrf(Summa,ffgeneral,4,2)+’ руб.’;
Часто в программе необходимо реализовать выбор более чем из двух вариантов. Например, известно, что для каждого человека существует оптимальное значение веса, которое может быть вычислено по формуле: рост(см) – 100. Очевидно, что реальный вес может отличаться от оптимального: вес может быть меньше оптимального, равняться ему или превышать оптимальное значение.
Следующая программа (ее алгоритм приведен ниже на рис.) запрашивает вес и рост, вычисляет оптимальное значение, сравнивает его с реальным и выводит соответствующее сообщение.
Как и в предыдущей программе, вычисления выполняются при щелчке на кнопкеВычислить (ее имя Button1). Ниже приведена процедура обработки события OnClick для этой командной кнопки.
procedure TForm1.Button1Click(Sender: TObject);
сложные условия
Смотреть что такое «сложные условия» в других словарях:
сложные условия бурения — — [http://slovarionline.ru/anglo russkiy slovar neftegazovoy promyishlennosti/] Тематики нефтегазовая промышленность EN difficult drilling conditions … Справочник технического переводчика
УСЛОВИЯ ВТОРОГО ПОРЯДКА — (second order conditions) Достаточные условия для того, чтобы стационарное значение функции было максимальным или минимальным. Если y=f(x), то условием первого порядка для стационарного значения будет dy/dx=fx = 0. Если это условие удовлетворено … Экономический словарь
Сложные метеорологические условия — метеорологические условия, характеризующиеся видимостью 2000 м и менее и (или) высотой нижней границы облаков 200 м и ниже при их общем количестве более двух октантов;. Источник: Приказ Минтранса РФ от 17.07.2008 N 108 (ред. от 23.06.2009) Об… … Официальная терминология
сложные природные условия — Наличие специфических по составу и состоянию грунтов и (или) риска возникновения (развития) опасных природных процессов и явлений и (или) техногенных воздействий на территории, на которой будут осуществляться строительство, реконструкция и… … Справочник технического переводчика
УСЛОВИЯ РУДООТЛОЖЕНИЯ — условия, определяющие развитие процесса рудоотложения, его скорость, характер минер. парагенезисов, формы выделения руд и т. п. Рудоотложение обусловливается рядом физико хим. факторов, к которым относятся температура, давление, окислительно… … Геологическая энциклопедия
Сложные природные условия при строительстве и эксплуатации здания или сооружения — 22) сложные природные условия наличие специфических по составу и состоянию грунтов и (или) риска возникновения (развития) опасных природных процессов и явлений и (или) техногенных воздействий на территории, на которой будут осуществляться… … Официальная терминология
СЛОЖНЫЕ РЕАКЦИИ — Хим. р ция реализуется как совокупность множества дискретных актов хим. превращения, в каждом из к рых участвует лишь одна или небольшое число частиц (молекул, атомов, ионов). Если среди актов р ции имеются химически различающиеся, то р ция наз.… … Химическая энциклопедия
СЛОЖНЫЕ ПРИРОДНЫЕ УСЛОВИЯ — Наличие специфических по составу и состоянию грунтов и (или) риска возникновения (развития) опасных природных процессов и явлений и (или) техногенных воздействий на территории, на которой будут осуществляться строительство, реконструкция и… … Комплексное обеспечение безопасности и антитеррористической защищенности зданий и сооружений
Самые «сложные» аэропорты мира — Специалисты называют этот аэропорт «сложным». «Аэропорт Сочи один из самых сложных аэропортов Советского Союза, а теперь в России. Сложность в том, что заход только со стороны моря. И возможность уходить на второй круг… … Энциклопедия ньюсмейкеров
Метеорологические условия полетов — совокупность метеорологических элементов и явлений, наблюдаемых в районе или на маршруте полета, оказывающих влияние на выполнение полетного задания. В зависимости от степени сложности метеорологические условия подразделяются на простые и… … Официальная терминология
Сбербанк России — (Sberbank of Russia) Сбербанк России, история банка, деятельность банка Сбербанк России, история банка, деятельность банка, руководство банка Содержание Содержание Сберба́нк Росси́и Собственники и руководство Деятельность… … Энциклопедия инвестора
Урок 6. Задачи со сложным условием
Какие еще бывают условия в языке Си
36. Порядок записи операндов условия произволен, но лучше все-таки сохранять естественную нотацию. Сравним эквивалентную запись предыдущего выражения:
38. Операции логического И и логического ИЛИ можно также выразить одну через другую с помощью отрицания. В последнем примере условие можно записать:
49. Однако глядя на этот кирпич и отверстие, мы-то быстро сообразим, что так кирпич не пройдет и его надо повернуть «боком». Компьютер же этого не может видеть, и ему надо подробно разъяснить, как поворачивать этот самый кирпич. Точнее, поскольку порядок ввода значений переменных заранее неизвестен, в записи условия надо рассмотреть все варианты их сочетания. Полный вариант записи условия:
51. Скобки в записи этого условия необязательны, нужный порядок выполнения операций соблюден.
Резюме
53. В этом уроке вы узнали, как записывается сложное логическое условие, познакомились с порядком выполнения логических операций.
Вопросы для самопроверки
55. 1. Какие логические операции вы знаете?
2. Какая логическая операция используется для проверки принадлежности (непринадлежности) числа промежутку?
3. Как работает логическое отрицание?
4. Перечислите приоритет выполнения логических операций.
Задания для самостоятельной работы к уроку 6
1. Проверить, принадлежит ли число, введенное с клавиатуры, интервалу (-5.1, 3.6).
2. Известен рост трех человек. Определить, одинаков ли их рост? (вывести сообщение).
3. Даны три вещественных числа a, b, c. Проверить, выполняется ли неравенство a
==> 58 1.6
Ваш ИМТ=22.65625. У вас нормальная масса тела.