Итак сегодня мы узнаем ещё один тип данных - логический. С ним вы вообщем-то уже знакомы. Однако всё по порядку. Имя у этого типа - boolean. Переменная может принемать только два значения - true (истина) и false (ложь). Помните сколько будет 2*2=4 ? будет trUE ! При этом для этих значений справедливо следующее:
ord (false) = 0
ord (true) = 1
false < true
вот и выходит, что правда (то биш истина) сильнее :)
В Паскале определены следующие логические операции:
- not - логическое НЕ
- and - логическое И
- or -логическое ИЛИ
- xor - исключающее ИЛИ
страшные имена :) синтаксис этих операций таков, кроме not:
операнд1 ОПЕРАЦИЯ операнд2
Для not:
not операнд
Эти операции применяются к целым и логическим переменным. Результат соответсвенно тоже целый или логический.
Вначале рассмотрим целые числа. Помните двоичную систему счисления... так вот биты результата формируются по следующим правилам:
|
AND |
OR |
XOR |
NOT |
| операнд 1 |
0101 |
0101 |
0101 |
0101 |
| операнд 2 |
0011 |
0011 |
0011 |
|
| Результат: |
0001 |
0111 |
0110 |
1010 |
Для простоты мы предположили, что в числе у нас 4 бита (4 двоичных разряда). А теперь те же правила, но в текстовом варианте:
- AND - если оба сравниваемых бита раны 1, то результат равен 1, в остальных случаях 0
- OR - если хотя бы один из сравниваемых битов равен 1, то результат равен 1, если оба 0, то результат - 0
- XOR - если один из сравниваемых битов равен 0, а другой еденице, то результат равен 1, в других случаях (оба 0 или оба 1) результат - 0
- NOT - устанавливает обратное значение битов: 0 становится 1, а 1 - 0.
Вот такие дела! Рассмотрим вечный пример:
var
a, b : integer;
begin
a := 31;
b := a xor a;
writeLn (b)
end.
Что же выведет такая программа ? думаем.... думаем ... смотрим на описание xor .... думаем ... думаем ..... придумали! А ведь она выведет 0 !!! Почему ? Да потому, что xor даёт 0, если оба сравниваемых бита равны! А в числах а и а биты равны :)
Тепрь для логических переменных
|
AND |
OR |
XOR |
NOT |
| операнд 1 |
false | true | false | true |
false | true | false | true |
false | true | false | true |
false | true |
| операнд 2 |
false | false | true | true |
false | false | true | true |
false | false | true | true |
|
|
|
| Результат: |
false | false | false | true |
false | true | true | true |
false | true | true | false |
true | false |
Таблица получилась конечно запутанная, но смысл тот же - если заменить true на 1, а false на 0.
Так вот к чему мы всё это... при проверке условия (например в if или while) мы можем проверить сразу несколько условий. Например, следующее выражение будет истинно при а = b и c = d:
(a = b) and (c = d)
а что нам мешает сделать так:
if (a = b) and (c = d) then
это выполняется когда оба условия истинны, т.е. a=b и c=d одновременно!
else
это выполняется, когда хотя бы одно из условий ложно.
или так:
if (a = b) or (c = d) then
это выполняется когда хотя бы одно из условий истинно, т.е. a=b или (и) c=d
else
это выполняется, когда оба условия ложны.
или в конце-концов так:
if (a = b) xor (c = d) then
это выполняется когда одно условие истинно, а второе ложно, т.е. a=b или c=d
else
это выполняется, когда оба условия истинны или оба ложны.
Конечно можно соединять и пять и десять условий... главное не попутайтесь, раставляя скобки!
Программа
Сегодня мы напишем программу, которая преобразует строку строчных букв к строке с заглавными буквами. Данный алгоритм будет работать только для латиницы!
Итак мы помним (в чём я сомваюсь :)) что английские буквы распологаются в таблице символов следующим образом: заглавные буквы (A-Z) имеют коды 41h - 5Ah, строчные (a-z) соответственно 61h-7A. Поэтому нам сначала нужно прозаботится о проверке попадания буквы в нужный диапазон.
Давайте рассмотрим двоичное представление чисел 41h (буква А) и 61h (буква а).
| Биты |
76543210 |
| Буква А: |
01000001 |
| Баква а: |
01100001 |
Думается вы заметили, что разница в 5-ом бите. Пэтому нам просто нужно его изменить и сделать из 1 равным 0. Каким образом? Давайте посморим на таблицу .... смотрим .... смотрим ..... ещё раз .... ещё два .... хватит. Что предложите использовать ? Я лично and, где вторым операндом будет страннное число 11011111b .... давайте убедимся, что всё произойдёт так как я и обещал:
AND
| Буква а: |
01100001 |
|
11011111 |
| Буква А: |
01000001 |
убедились ? Я да!
program up;
var
i : integer;
str : string;
begin
str := 'I''m world-best Pascal programmer :)';
writeLn (str);
for i := 1 to ord (str[0]) do
begin
if (str[i] >= 'a') and (str[i] <= 'z') then
str[i] := chr ( ord(str[i]) and 223)
end;
writeLn (str)
end.
обратите внимание на эту конструкцию: chr ( ord(str[i]) and 223) - сначала мы преобразовываем символ str[i] к целому числу (функция ord), потом выполняем and, потом преобразуем целое число к символу (функция chr).
Рад приветствовать! =) Начнем мы с истории данного сайта. Изначально он разрабатывался как типично авторский проект, не неся в себе особых целей.
Я лишь хотел освоить азы html верстки и опробывать свои силы в разработке web-сайтов. Тематика "программирование на Паскале" была
выбрана не случайно, до этого я долго изучал этот ЯП и всё это вылилось в написание собственного самоучителя по Паскалю. Сейчас это всё вспоминается
с некоторой долей иронии и улыбкой на лице. В нынешнее время я полностью занимаюсь web-разработками и отошел от прикладного программирования, но данный проект решил
всё же не забрасывать и вдохнуть в него новую жизнь, освежив дизайн и контент.
С уважением, Евгений Злобин
|