Как поставить не равно в паскале
Операция "И" (логическое умножение)

Операция "ИЛИ" (логическое сложение)

Операция "исключающее ИЛИ"
Операция NOT применима к одному логическому выражению (является унарной). Ее результат равен true , если выражение ложно и наоборот.
Например, выражение NOT ( sin ( x )>1) всегда даст значение true .
Операция AND связывает не менее двух логических выражения (является бинарной). Ее результат равен true , если все выражения истинны или false , если хотя бы одно из выражений ложно.
В качестве примера распишем выражение . Т. к. операции принадлежности в Паскале нет, используем операцию AND и операции отношения: ( x >= a ) and ( x <= b ) .
Математическое выражение a , b , c >0 (одновременно) будет иметь вид ( a >0) and ( b >0) and ( c >0) .
Операция OR также связывает не менее двух логических выражений. Ее результат равен true , если хотя бы одно выражение истинно и false , если все выражения ложны.
Распишем выражение . На Паскале оно будет иметь вид ( x < a ) or ( x > b ) . Другой способ связан с применением операции NOT : not (( x >= a ) and ( x <= b )) .
Условие "хотя бы одно из значений a , b , c положительно" может быть записано в виде ( a >0) or ( b >0) or ( c >0) .
Условие "только одно из значений a , b , c положительно" потребует объединения возможностей операций AND и OR :
( a <=0) and ( b <=0) and ( c >0) .
Операция XOR , в отличие от OR , возвращает значение "ложь" ( false ) и в том случае, когда все связанные ей логические выражения истинны. Чтобы лучше уяснить это отличие, составим так называемую таблицу истинности двух логических операций (табл. 7.2). Для краткости значение false обозначим нулем, а true — единицей. Для двух логических аргументов возможно всего 4 комбинации значений 0 и 1.
Табл. 7.2. Таблица истинности операций OR и XOR
В качестве примера использования операции XOR запишем условие "только одно из значений a,b положительно":
К сожалению, записать условие "только одно из значений a,b,c положительно" в напрашивающемся виде ( a >0) xor ( b >0) xor ( c >0) нельзя — результат этого выражения будет равен true и в случае, когда все три значения положительны. Связано это с тем, что при последовательном расчете логических выражений слева направо (1 xor 1) xor 1 будет равно 0 xor 1 = 1 .
С помощью xor удобно организовывать различного рода переключатели, которые последовательно должны принимать одно из двух состояний:
x := x xor true; writeln (‘x=’, x);
x := x xor true; writeln (‘x=’, x);
Независимо от начального значения логической переменной x , второе выведенное на экран значение будет логическим отрицанием первого. В реальной практике конструкции подобные x := x xor true ; не дублируются в коде многократно, а применяются внутри цикла (см. гл. 9).
Приоритет логических операций следующий: самая старшая операция — not , затем and , следующие по приоритету — or и xor (равноправны между собой), самый низкий приоритет имеют операции отношения. Последнее служит причиной того, что в составных условиях отдельные отношения необходимо заключать в круглые скобки, как и сделано во всех примерах раздела.
7.4. Короткий условный оператор
Это первый вид условного оператора, позволяющий программе выполнить или пропустить некоторый блок вычислений. Общий вид короткого условного оператора следующий:
if логическое_выражение then оператор1;
Сначала вычисляется логическое выражение, если оно имеет значение true , то выполняется оператор1 , иначе оператор1 игнорируется. Блок-схема соответствующего вычислительного процесса представлена на рис. 7.1.

Рис. 7.1. Блок-схема короткого условного оператора
Если по условию требуется выполнить несколько операторов, их необходимо заключить в операторные скобки begin . end ; , образуя единый составной оператор:
if d>0 then begin
Здесь по условию d >0 выполняется 3 оператора, первые два из которых вычисляют корни x 1 и x 2 квадратного уравнения, а последний выводит на экран найденные значения корней.
Следующий пример иллюстрирует поиск значения y = max ( a , b , c ). Поскольку стандартной функции для нахождения максимума в Паскале нет, применим 2 коротких условных оператора:
Вообще, для условной обработки N значений требуется N-1 короткий условный оператор.
7.5. Полный условный оператор
Эта форма условного оператора позволяет запрограммировать 2 ветви вычислений. Общий вид полного условного оператора следующий:
if логическое_выражение then оператор1
Оператор работает следующим образом: если логическое выражение имеет значение true , то выполняется оператор1 , иначе выполняется оператор2 . Всегда выполняется только один из двух операторов. Перед ключевым словом else ("иначе") точка с запятой не ставится, т.к. if — then — else — единый оператор.
Вычислим значение m = min ( x , y ) с помощью полного условного оператора:
if x<y then m:=x else m:=y;
В следующем примере выполним обработку двух переменных: если значения a и b одного знака, найти их произведение, иначе заменить нулями.
if a*b>0 then c:=a*b
Из примера видно, что к ветви алгоритма после ключевого слова else , состоящей более чем из одного оператора, также применяются операторные скобки.
7.6. Составной условный оператор
Эта форма условного оператора применяется, когда есть более 2 вариантов расчета. Общий вид составного оператора может включать произвольное число условий и ветвей расчета:
if логическое_выражение1 then оператор1
else if логическое_выражение2 then оператор2
else if логическое_выражение N then оператор N
При использовании оператора последовательно проверяются логические выражения 1 , 2 , . , N , если некоторое выражение истинно, то выполняется соответствующий оператор и управление передается на оператор, следующий за условным. Если все условия ложны, выполняется оператор0 (если он задан). Число ветвей N неограниченно, ветви else оператор0; может и не быть.
Существенно то, что если выполняется более одного условия из N , обработано все равно будет только первое истинное условие. В показанной ниже программе составной условный оператор неверен, если ее разработчик хотел отдельно учесть значения x , меньшие единицы по модулю:
write (‘ Введите x:’); readln (x);
if x<0 then writeln (‘ Отрицательный ‘)
else if x=0 then writeln (‘ Ноль ‘)
else if abs(x)<1 then
writeln (‘ По модулю меньше 1’)
else writeln (‘ Больше 1’);
Условие x <0 сработает, например, для значения x =-0.5 , что не позволит программе проверить условие abs(x)<1 .
Еще одну распространенную ошибку работы с составным условным оператором показывает произведенный ниже расчет знака n переменной a :
Применение одного короткого и одного полного условных операторов является здесь грубой ошибкой — ведь после завершения короткого условного оператора для всех ненулевых значений a будет выполнено присваивание n :=1 . Правильных вариантов этого расчета, по меньше мере, два:
if a <0 then n :=-1;
— с помощью 3 коротких условных операторов, вариант не очень хорош тем, что проверяет лишние условия даже тогда, когда знак уже найден.
else if a>0 then n:=1;
— с помощью составного условного оператора, этот вариант лучше. На практике следует помнить, что для вещественных значений сравнение с нулем может быть проблематично.
Можно сделать вывод, что при программировании многовариантных расчетов следует соблюдать осторожность, чтобы не допустить "потерянных" или неверно срабатывающих ветвей алгоритма.
В качестве еще одного примера рассчитаем значение функции, заданной графически (рис. 7.2).

Рис. 7.2. Функция, заданная графически
Перепишем функцию в аналитическом виде:
Одним из вариантов запрограммировать вычисление y ( x ) мог бы быть следующий:
if abs(x)>1 then y:=0
else if x<0 then y:=x+1
Возможна и последовательная проверка условий слева направо, которая породит немного избыточный, но легче воспринимающийся код:
else if x<0 then y:=x+1
else if x<1 then y:=1-x
7.7. Вложенные условные операторы
Когда после ключевых слов then или else вновь используются условные операторы, они называются вложенными. Число вложений может быть произвольно, при этом действует правило: else всегда относится к ближайшему оператору if , для которого ветка else еще не указана. Часто вложением условных операторов можно заменить использование составного.
В качестве примера рассмотрим программу для определения номера координатной четверти p , в которой находится точка с координатами ( x , y ) . Для простоты примем, что точка не лежит на осях координат. Без использования вложений основная часть программы может иметь следующий вид:
if (x>0) and (y>0) then p:=1
else if (x<0) and (y>0) then p:=2
else if (x<0) and (y<0) then p:=3
Однако использование такого количества условий представляется явно избыточным. Перепишем программу, используя тот факт, что по каждое из условий x >0 , x <0 оставляет в качестве значения p только по 2 возможных четверти из 4:
if x>0 then begin
В первом фрагменте программе проверяется от 2 до 6 условий, во втором — всегда только 2 условия. Здесь использование вложений дало существенный выигрыш в производительности.
Рассмотренный в п. 7.6 пример с определением знака числа может быть переписан и с использованием вложения:
Однако, как эти операторы, так и составной условный оператор из п. 7.6 проверяют не более 2 условий, так что способы примерно равноценны.
7.8. Оператор выбора
Для случаев, когда требуется выбор одного значения из конечного набора вариантов, оператор if удобнее заменять оператором выбора (переключателем) case :
case выражение of
список N : оператор N ;
Оператор выполняется так же, как составной условный оператор.
Выражение должно иметь порядковый тип (целый или символьный). Элементы списка перечисляются через запятую, ими могут быть константы и диапазоны значений того же типа, что тип выражения. Диапазоны указываются в виде:
Оператор диапазона записывается как два рядом стоящих символа точки. В диапазон входят все значения от минимального до максимального включительно.
В качестве примера по номеру месяца m определим число дней d в нем:
Следующий оператор по заданному символу c определяет, к какой группе символов он относится:
writeln (‘ Латинская буква ‘);
writeln (‘Русская буква’);
else writeln (‘Другой символ’);
Здесь отдельные диапазоны для русских букв от "а" до "п" и от "р" до "я" связаны с тем, что между "п" и "р" в кодовой таблице DOS находится ряд не-буквенных символов (см. Приложение 1).
Если по ветви оператора case нужно выполнить несколько операторов, действует то же правило, что для оператора if , т. е. ветвь алгоритма заключается в операторные скобки begin . end ; .
7.9. Примеры программ с условным оператором
Приведем несколько примеров законченных программ, использующих РВП.
1. Проверить, может ли быть построен прямоугольный треугольник по длинам сторон a , b , c .
Проблема с решением этой задачи — не в проверке условия теоремы Пифагора, а в том, что в условии не сказано, какая из сторон может быть гипотенузой. Подходов возможно несколько — запрашивать у пользователя ввод данных по возрастанию длины сторон, проверять все три возможных условия теоремы Пифагора и т. п. Используем наиболее естественное решение — перед проверкой условия теоремы Пифагора упорядочим величины a , b , c так, чтобы выполнялись соотношения a ≤ b ≤ c . Для этого применим прием с обменом значений переменных из п. 4.1.
write (‘Введите длину 1 стороны:’);
write (‘Введите длину 2 стороны:’);
write (‘Введите длину 3 стороны:’);
if (a>b) then begin
if (a>c) then begin
if (b>c) then begin
s := b ; b := c ; c := s ;
if abs(a*a+b*b-c*c)<1e-8 then writeln
‘может быть построен!’)
else writeln (‘Прямоугольный треугольник ‘,
‘не может быть построен!’)
2. Определить, попадает ли точка плоскости, заданная координатами ( a , b ) в прямоугольник, заданный координатами двух углов ( x 1 , y 1 ) и ( x 2 , y 2 ).
Как и в предыдущей задаче, было бы не совсем корректно требовать от пользователя вводить данные в определенном порядке — гораздо лучше при необходимости поменять x — и y -координаты прямоугольника так, чтобы пара переменных ( x 1 , y 1 ) содержала координаты левого нижнего угла прямоугольника, а ( x 2 , y 2 ) — правого верхнего.
writeln (‘Введите координаты 1 угла:’);
writeln (‘Введите координаты 2 угла:’);
if x1>x2 then begin
if y1>y2 then begin
writeln (‘Введите координаты точки:’);
and (y1<=b) and (b<=y2) then writeln
(‘Точка попадает в прямоугольник’)
(‘Точка не попадает в прямоугольник’);
3. Вводится денежная сумма в рублях и копейках. Программа печатает введенную сумму с правильной формой слов "рубли" и "копейки", например, "123 рубля 15 копеек".
Окончание, используемое для слов "рубли" и "копейки", зависит от последней цифры суммы, которую можно получить, взяв остаток от деления на 10 (1058 рублей, 38 рублей и т.д.). Исключения — суммы с последними двумя цифрами от 11 до 19 включительно, которые всегда произносятся "рублей" и "копеек" (511 рублей, но 51 рубль). Используя эту информацию, составим программу.
Логические выражения и логические операции. Булевый тип данных
Для того, чтобы программа была не линейной (т.е. в зависимости от ситуации выполнялись разные инструкции) в языках программирования используются логические выражения, результат которых может быть либо правдой (true), либо ложью (false). Результат логических выражений обычно используют для определения пути выполнения программы.
Простые логические выражения являются результатом операций отношения между двумя операндами (значениями). В примерах ниже операндами являются значения переменных x и y. Операндами могут быть числа, символы и другие типы данных. Все что можно сравнивать между собой. Однако не рекомендуют сравнивать вещественные числа из-за особенностей их хранения в памяти компьютера.
В Паскале предусмотрены следующие операторы отношений:
- меньше: x < y
- больше: x > y
- равно: x = y
- не равно: x <> y
- меньше или равно: x <= y
- больше или равно: x >= y
Булевы типы
Результатом логического выражения всегда является булево (логическое) значение. Булев тип данных (boolean) может принимать только два значения: true (истина) или false (ложь). Эти величины упорядочены следующим образом: false < true .
Операции and, or, not (применяемые к булевским операндам) дают булевские значения.
Это значит, что данные булевого типа являются не только результатом операций отношения, но и могут выступать в роли операндов операции отношения. Также к ним можно применять функции ord, succ, pred, процедуры inc и dec.
Значение типа boolean занимает в памяти 1 байт.
В примере шести булевым переменным присваиваются значения простых логических выражений. Значения, хранимые в таких переменных, затем выводятся на экран.

Кроме типа boolean в Pascal введены еще три булевых типа — bytebool (занимает 1 байт), wordbool (занимает 2 байта) и longbool (занимает 4 байта).
Для всех булевых типов значению false соответствует 0, а значению true — любое ненулевое значение. Логические переменные, принадлежащие разным булевым типам, ведут себя по-разному при выполнении над ними операций. Ниже приводится пример, реализованный на языке FreePascal (в комментариях отображается результат).
Логические операции
С помощью логических операторов можно формировать сложные логические выражения. Логические операторы часто применяются по отношению к простым логическим выражениям.
В языке программирования Pascal предусмотрены следующие логические операции:
-
Конъюнкция (логическое умножение, пересечение) — and. Выражение a and b дает значение true только в том случае, если a и b имеют значение true. Во всех остальных случаях значения выражения a and b дает false.
Последовательность выполнения логических операторов: not, and, or.
В языке Паскаль сначала выполняются логические операторы (and, or, xor, not), а уже потом операторы отношений (>, >=, <, <=, <>, =), поэтому не нужно забывать расставлять скобки в сложных логических выражениях.

Сложные булевы выражения могут не обрабатываться до конца, если продолжение вычислений не изменит результат. Если булево выражение в обязательном порядке нужно обрабатывать до конца, то это обеспечивается включением директивы компиляции .
Операции сравнения
Ещё один из самых распространённых типов операций — это операции сравнения. Эти операции постоянно используются в программах, потому что программы не только выполняют какие-то вычисления, но и проделывают массу других штучек. В частности, выполняют операции сравнения, то есть сравнивают что-то с чем-то.
Давайте вспомним пример программы из предыдущего урока. там мы создали простой калькулятор, который выполнял три действия над двумя числами: сложение, вычитание и умножение.
Однако я намеренно не включил сюда операцию деления. Как вы думаете, почему? Кто-то, быть может, решит, что причиной является использование целых чисел. Ведь в Паскале они не делятся обычным способом. Но на самом деле причина не в этом.
Я не стал использовать операцию деления, потому что пользователь в качестве делителя может ввести число 0. А на ноль, как известно, делить нельзя. Поэтому программа завершится с ошибкой, и пользователь будет очень недоволен.
Как быть? Напрашивается простое решение — проверить значение второго числа, которое вводит пользователь. И если это число равно нулю, то не выполнять операцию деления.
Как сделать такую проверку программно? Да очень просто — выполнить операцию сравнения. То есть сравнить число с нулём.
В таблице 15.3 приведены операции сравнения, которые допускается использовать в языке Free Pascal.
Таблица 15.3. Операторы сравнения Free Pascal.
| Оператор | Операция |
| = | Равно |
| <> | Не равно |
| < | Меньше чем |
| > | Больше чем |
| <= | Меньше или равно |
| >= | Больше или равно |
| in | Входит в |
Все эти операции сравнения известны вам из школьного курса математики. Только некоторые операторы в Паскале обозначаются немного иначе. Единственный непонятный для вас оператор — это оператор in. Но о нём мы пока забудем. И вспомним, когда будем изучать сложные типы данных.
как в программе использовать операторы сравнения?
Более подробно мы будем изучать это в следующих уроках. А сегодня я расскажу вам только об одной языковой конструкции Паскаля
Если вы знаете английский язык, то вы уже должны догадаться, что сие значит. Ну а если нет, то я поясню по-русски. Итак, эта конструкция работает так:
А теперь попробуем доработать программу из предыдущего урока и добавить в неё операцию целого деления. Добавленный код будет выглядеть так:
Здесь мы сначала проверяем значение переменной у. Если это значение равно нулю, то мы выводим сообщение об ошибке. Иначе, то есть если переменная у имеет любое другое значение (не ноль), мы выполняем операцию целого деления и выводим результат.
Домашнее задание:
Доработайте программу из предыдущего урока. Добавьте в неё операцию целого деления. проверьте работоспособность программы.
замените оператор = на оператор <>. Посмотрите, что получится, если ввести в качестве второго числа 0. Доработайте программу таким образом, чтобы она правильно работала с выражением