Логические выражения и операции. Булевый тип данных
Для того, чтобы программа была не линейной (т.е. в зависимости от ситуации выполнялись разные инструкции) в языках программирования используются логические выражения, результат которых может быть либо правдой ( true ), либо ложью ( false ). Результат логических выражений обычно используют для определения пути выполнения программы.
Простые логические выражения являются результатом операций отношения между двумя операндами (значениями). В примерах ниже операндами являются значения переменных x и y . Операндами могут быть числа, символы и другие типы данных. Все что можно сравнивать между собой. Однако не рекомендуют сравнивать вещественные числа из-за особенностей их хранения в памяти компьютера.
В Паскале предусмотрены следующие операторы отношений:
- меньше: x < y
- больше: x > y
- равно: x = y
- не равно: x <> y
- меньше или равно: x
- больше или равно: x >= y
Булевы типы
Результатом логического выражения всегда является булево (логическое) значение. Булев тип данных ( boolean ) может принимать только два значения: true (истина) или false (ложь). Эти величины упорядочены следующим образом: false < true .
var x, y: boolean; begin x := true; y := false; writeln('x = ', x); writeln('y = ', y); writeln('x < y = ', x < y); end.
x = TRUE y = FALSE x < y = FALSE
Операции and , or , not (применяемые к булевским операндам) дают булевские значения.
Это значит, что данные булевого типа являются не только результатом операций отношения, но и могут выступать в роли операндов операции отношения. Также к ним можно применять функции ord , succ , pred , процедуры inc и dec .
Значение типа boolean занимает в памяти 1 байт.
В примере шести булевым переменным присваиваются значения простых логических выражений. Значения, хранимые в таких переменных, затем выводятся на экран.
Кроме типа boolean в Pascal введены еще три булевых типа — bytebool (занимает 1 байт), wordbool (занимает 2 байта) и longbool (занимает 4 байта).
Для всех булевых типов значению false соответствует 0, а значению true — любое ненулевое значение. Логические переменные, принадлежащие разным булевым типам, ведут себя по-разному при выполнении над ними операций. Ниже приводится пример, реализованный на языке FreePascal (в комментариях отображается результат).
var b:boolean; wb:wordbool; begin b:= false; b:= pred(b); writeln(b,' ',ord(b)); // TRUE 255 writeln(b=true); // TRUE wb:= false; wb:= pred(wb); writeln(wb,' ',ord(wb)); // TRUE -1 b:= true; b:= succ(b); writeln(b,' ',ord(b)); // TRUE 2 wb:= true; wb:= succ(wb); writeln(wb,' ',ord(wb)); // FALSE 0 end.
Логические операции
С помощью логических операторов можно формировать сложные логические выражения. Логические операторы часто применяются по отношению к простым логическим выражениям.
В языке программирования Pascal предусмотрены следующие логические операции:
-
Конъюнкция (логическое умножение, пересечение) - and . Выражение a and b дает значение true только в том случае, если a и b имеют значение true . Во всех остальных случаях значения выражения a and b дает false .
true and true = true true and false = false false and true = false false and false = false
true or true = true true or false = true false or true = true false or false = false
not true = false not false = true
true xor true = false true xor false = true false xor true = true false xor false = false
Последовательность выполнения логических операторов: not, and, or.
В языке Паскаль сначала выполняются логические операторы ( and , or , xor , not ), а уже потом операторы отношений ( > , >= , < , , = ), поэтому не нужно забывать расставлять скобки в сложных логических выражениях.

Сложные булевы выражения могут не обрабатываться до конца, если продолжение вычислений не изменит результат. Если булево выражение в обязательном порядке нужно обрабатывать до конца, то это обеспечивается включением директивы компиляции .
Стандартные функции, возвращающие булевые значения
- odd(x) = true, если x нечетный ( x целый);
- eoln(x) = true, если встретился конец строки текстового файла x ;
- eof(x) = true, если встретился конец файла x .
В остальных случаях эти функции принимают значение false .
8.Данные логического типа в языке Pascal.(Boolean)

Булевскому типу данных соответствует идентификатор Boolean. Переменные булевского типа имеют размер 1 байт и могут содержать значения TRUE или FALSE.
Значению FALSE соответствует 0, любое число отличное от нуля считается TRUE.
Var knopka, flag : boolean;
9.Данные символьного типа в языке Pascal.
Символьному типу соответствует стандартный идентификатор Char.
Символьный тип (char) определяет упорядоченную совокупность символов, допустимых в данных DBM.
Переменные символьного типа могут принимать значения одного из символов с кодами от #0 до #255, т. е. допускаются буквы русского алфавита и символы псевдографики. Символы с кодами от #0 до #31 (управляющие) в тексте воспринимаются как пробел, а в операторах вывода как символ или команда.
Значение символа переменной const – это один символ из набора символов. Const может быть записана ‘a’, или кодом #k; k – код символа.
- Ord(‘c’) – выводит код символа
- Chr(k) – по коду символа выводит символ
- upCase – переводит в верхний регистр для a..z
Из маленького ‘c’ получить ’C’:
Символьный тип, а также целые и булевские типы относят к, так называемым, порядковым типам.
10.Строки в языке Pascal.
Строки символов представляют собой последовательности символов и аналогичны массивам с типом CHAR. Их отличием является то, что число символов или длина строки, может меняться в интервале от нуля до заданного верхнего значения. Объявление строки символов осуществляется с помощью зарезервированного слова STRING:
String[максимальная длина строки]; длина строки – целочисленная константа в интервале 1-255.
Var St1: string[30]; s:string;- в данном случае длина строки будет равна максимальной 255 символов. Примеры объявлений:
Type Фамилия = string[15];
Для хранения каждого символа строки обычно требуется 1 байт. Число в нулевом байте определяет в данный момент времени длину строки. Как и к массиву, к отдельным символам строки можно обратится с помощью индексов в квадратных скобках: F[3]; Нулевой индекс определяет позицию в которой содержится длина строки.
Работа со строками.
1. Присваивание: St:=’Pascal’; s:= ‘Дима’;
2. Оператор сцепления (склеивания) + : результатом является строка, длина которой равна сумме длин строк операндов.
4. Определение длины строки: n: = length(st); где st – типа string, n – целого типа.
for i:=1 to length(st) do
If st[1]=’a’ then K:=k+1;
5. Копия – выделение подстроки длиной n из строки st, начиная с позиции pos:
st1:=copy(st, pos, n);
Write(st1); результат : sc
6. Определение позиции символа: n: = Pos(st1,st) – определяет позицию начала вхождения строки st1 в строку st.
n: = Pos(’a’, st,); результат : n=2.
7. Удаление подстроки: Delete (st,pos,n), где pos указывает, начиная с какой позиции удаляется n символов.
delete (st,6,1); результат : Форма.
8. Вставка подстроки: Insert (st1,st,pos), где st1 – строка, которая вставляется, st – строка, в которую вставляется подстрока st1, pos – позиция с которой вставляется подстрока.
9. Преобразование числа в сроку: Str (IBR,st)- преобразование числового значения IBR и помещение результата в строку st.
10. Перевод строки в число: Val(St,IBR,Cod) – преобразует значение St в величину целочисленного или вещественного типа и помещает результат в IBR. Cod – целочисленная переменная содержит 0, если преобразование прошло без ошибки, или номер позиции первого символа, на котором произошла ошибка.
Как уже отмечалось, переменная строкового типа (String) может рассматриваться как массив элементов символьного типа (Char). Например, если в программе определены переменные S: string; C: char; и задано S:='Москва', то S[1]='М', S[2]='о' и т. д. и возможно присвоение, например: C:= S[1]; Таким образом строка может рассматриваться как линейный массив символов. Элементы массива, составляющие строку можно переставлять местами и получать новые слова, применять функции работы с символами, например:
for i:= 1 to N div 2 do begin C:= S[i]; S[i]:= S[N-i+1]; S[N-i+1]:= C end; Writeln(S);
Здесь N:= ord(S[0]); - число символов в переменной "S" хранится в переменной S[0]. Функция "ord" преобразует символьный тип в целый. N div 2 - количество перестановок для слова из "N" символов. В переменной "C" запоминается значение i-го элемента, который меняется с элементом, симметричным относительно середины строки.
Можно производить поиск и замену заданного символа в строке, например:
for i:=1 to N do if S[i]=' ' then writeln('найден символ пробел');
Заменяя или переставляя символы в строке по определенной схеме (закону) можно зашифровать строку. Для дешифровки используется, как правило, схема обратной перестановки или замены символов. Например:
for i:=1 to N do S[i]:= chr(ord(S[i])+2);
Напомним, что все используемые в MS-DOS символы имеют ASCII коды от 0 до 255.
Здесь удобно также использовать функции Pred(C); и Succ(C).
Pascal-Паскаль
Программирование. Логические типы данных Pascal-Паскаль
- Скачено бесплатно: 26886
- Куплено: 414
- Pascal-Паскаль->Программирование. Логические типы данных Pascal-Паскаль
Программирование. Логические типы данных Pascal-Паскаль
Логические типы данных Pascal-Паскаль
В Турбо Паскале логический тип данных носит название BOOLEAN. Значением логического типа может быть одна из двух констант FALSE (ложь) или TRUE (истина). Для них справедливы правила:
Ord(false)=0
Ord(true)=1
False Succ(false)=true
Pred(true)=false
Все реализации языка Pascal, в том числе и Turbo Pascal, вплоть до версии 6.0 содержали только один логический тип данных Boolean, элементы которого могут принимать лишь два логических значения: True (истина) и False (ложь). В Turbo Pascal версии 7.0 добавлены еще три логических типа данныхByteBool, WordBool и LongBool.
| Название логического типа данных | Значению False соответствует | Значению True соответствует | Размер памяти для логического типа данных |
|---|---|---|---|
| Boolean | Число 0 | 1 | 1 байт |
| ByteBool | Число 0 | Любое число, отличное от 0 | 1 байт |
| WordBool | Число 0 в обоих байтах | 2 байта | |
| LongBool | Число 0 во всех байтах | 4 байта |
Отметим, что новые логические типы данных были введены для обеспечения совместимости разрабатываемых программ с Windows, в которой значению False соответствует 0, а значению True – любое, отличное от 0, число.
Логические переменные должны быть описаны предложением:
Var <имя_переменной>: boolean;имя_переменной>
Величины логического типа данных можно присваивать, выводить, но нельзя вводить процедурой read.
Пример переменных с булевым значением
Логические выражения
Логические выражения (условия) – это выражения, которые могут принимать лишь одно из двух значений: true (истина) или false (ложь). Для построения логических выражений используются операции отношения, которые обозначаются знаками: = (отношение на равенство), <> (отношение на неравенство), < (отношение меньше), >(отношение больше), = (отношение больше или равно).
Сложные условия составляются из простых с помощью логических операций: and (логическое «И»), or (логическое «ИЛИ») и not (логическое «НЕ»). При составлении сложных условий операнды логического выражения берутся в скобки (это важно!).
Пример логических выражений:
При вычислении логических выражений операции выполняются в следующем порядке: not, and, or, операции отношения, арифметические операции. Если порядок выполнения операций нужно изменить, то применяют скобки.
Программирование
Исходники Pascal (127)
Справочник
Справочник по паскалю: директивы, функции, процедуры, операторы и модули по алфавиту
Счетчики
2008—2023 © pascal.helpov.net | All Rights Reserved
Условный оператор
Проверьте истинность второго отношения при подстановке следующих значений:
Определение. Выражение, о котором после подстановки в него значений переменных можно сказать, истинно (верно) оно или ложно (неверно), называется булевым (логическим) выражением.
Примечание. Название “булевы” произошло от имени математика Джорджа Буля, разработавшего в XIX веке булеву логику и алгебру логики.
Определение. Переменная, которая может принимать одно из двух значений: True (правда) или False (ложь), называется булевой (логической) переменной. Например,
| К:=True; Flag:=False; Second:=a+sqr(x)>t |
Задача. Вычислить значение модуля и квадратного корня из выражения (х-у).
Для решения этой задачи нужны уже знакомые нам стандартные функции нахождения квадратного корня - Sqr и модуля - Abs. Поэтому Вы уже можете записать следующие операторы присваивания:
| Koren:=Sqrt(x-y); Modul:=Abs(x-y) |
В этом случае программа будет иметь вид:
| Program Znachenia; Uses Crt; Var x, y : integer; Koren, Modul : real; Begin ClrScr; write ('Введите значения переменных х и у через пробел '); readln (x, y); Koren:=Sqrt(x-y); Modul:=Abs(x-y); write ('Значение квадратного корня из выражения (х-у) равно ', Koren); write ('Значение модуля выражения (х-у) равно ', Modul); readln; End. |
Казалось бы, задача решена. Но мы не учли области допустимых значений для нахождения квадратного корня и модуля. Из курса математики Вы должны знать, что можно найти модуль любого числа, а вот значение подкоренного выражения должно быть неотрицательно (больше или равно нулю).
Поэтому наша программа имеет свою допустимую область исходных данных. Найдем эту область. Для этого запишем неравенство х-у>=0, то есть х>=у. Значит, если пользователем нашей программы будут введены такие числа, что при подстановке значение этого неравенства будет равно True, то квадратный корень из выражения (х-у) извлечь можно. А если значение неравенства будет равно False, то выполнение программы закончится аварийно.
Задание. Наберите текст программы. Протестируйте программу со следующими значениями переменных и сделайте вывод.
- х=23, у=5;
- х=-5, у=15;
- х=8, у=8.
Каждая программа, насколько это возможно, должна осуществлять контроль за допустимостью величин, участвующих в вычислениях. Здесь мы сталкиваемся с разветвлением нашего алгоритма в зависимости от условия. Для реализации таких условных переходов в языке Паскаль используют операторы If и Case, а также оператор безусловного перехода Goto.
Рассмотрим оператор If.
Для нашей задачи нужно выполнить следующий алгоритм:
если х>=у,
то вычислить значение квадратного корня,
иначе выдать на экран сообщение об ошибочном введении данных.
Запишем его с помощью оператора If. Это будет выглядеть так.
| if x>=y then Koren:=Sqr(x-y) else write ('Введены недопустимые значения переменных'); |
Теперь в зависимости от введенных значений переменных х и у, вычисление квадратного корня может выполняться или не выполняться.
В общем случае полная форма конструкции условного оператора имеет вид:
Условный оператор работает по следующему алгоритму.
Сначала вычисляется значение логического выражения, расположенного за служебным словом IF. Если его результат истина, выполняется , расположенный после слова THEN, а действия после ELSE пропускаются; если результат ложь, то, наоборот, действия после слова THEN пропускаются, а после ELSE выполняется .
Управляющая структура if может показаться негибкой, так как выполняемые действия могут быть описаны только одним оператором. Иногда может потребоваться выполнение последовательности операторов. В этом случае хотелось бы заключить всю последовательность в воображаемые скобки. В Паскале предусмотрен этот случай.
Если в качестве оператора должна выполниться серия операторов, то они заключаются в операторные скобки begin-end. Конструкция Begin . End называется составным оператором.
| if then begin оператор 1; оператор 2; . end else begin оператор 1; оператор 2; . end; |
Определение. Составной оператор - объединение нескольких операторов в одну группу. Группа операторов внутри составного оператора заключается в операторные скобки (begin-end).
| begin оператор 1; оператор 2; end; |
С учетом полученных знаний преобразуем нашу программу.
| Program Znachenia; Uses Crt; Var x, y : integer; Koren, Modul : real; Begin ClrScr; write ('Введите значения переменных х и у через пробел '); read (x, y); if x>=y then begin Koren:=Sqr(x-y); Modul:=Abs(x-y); write ('Значение квадратного корня из выражения (х-у) равно ', Koren); write ('Значение модуля выражения (х-у) равно ', Modul); end else write ('Введены недопустимые значения переменных'); readln; End. |
Составным оператором является и такой оператор
| begin S:=0; end. |
Cимвол “;” в данном случае разделяет оператор присваивания S:=0 и пустой оператор.
Пустой оператор не влечет никаких действий и в записи программы никак не обозначается.
Например, составной оператор
включает лишь один пустой оператор.
Если Вы обратили внимание, программа на языке Паскаль всегда содержит один составной оператор - раздел операторов программы.
Внимание! Перед служебным словом Else разделитель (точка с запятой) не ставится.
Отметим, что большинство операторов в программах на языке Паскаль заканчиваются точкой с запятой, но после некоторых операторов точка с запятой не ставится. Сформулируем общие правила употребления точки с запятой:
-
Каждое описание переменной и определение константы заканчиваются точкой с запятой.
Рассмотрим еще один пример.
Задача. Вывести на экран большее из двух данных чисел.
| Program Example1; Var x, y : integer; Begin writeln('Введите 2 числа '); readln(x,y); if x>y then writeln (x) else writeln (y); readln; End. |
Можно также использовать и сокращенную (неполную) форму записи условного оператора. Эта форма используется тогда, когда в случае невыполнения условия ничего делать не надо.
Неполная форма условного оператора имеет следующий вид.
Тогда если выражение, расположенное за служебным словом IF. в результате дает истину, выполняются действия после слова THEN, в противном случае эти действия пропускаются.
Задача. Составить программу, которая, если введенное число отрицательное, меняет его на противоположное.
| Program Chisla; Var x : integer; Begin writeln('Введите число '); readln(x); if x then x:=-x; writeln (x); readln; End. |
