| #0E А сила - она, брат, в правде. |
|
|
Вступление
Добрый день!
Сегодня мне пришла в голову мысль (вот уж не знаю счастливая или нет). Так вот мысль - нумеровать выпуски в двоичной системе счисления :) т.е. этот выпуск не #14, а #1110 :)
шутка :) Просто сегодня что бы понять некоторые моменты, нужно вспомнить про двоичную систему счисления.
Ещё извиняюсь, что не в состоянии поддерживать периодичность рассылки - нет времени :( Пока буду стараться выпускать по два выпуска в неделю. Дней через 10 ситуация изменится (я надеюсь в лучшую сторону :)
|
Теория
Итак сегодня мы узнаем ещё один тип данных - логический. С ним вы вообщем-то уже знакомы. Однако всё по порядку. Имя у этого типа - 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).
Домашнее задание #3 будет таким: написать программку, которая используя логические операции будет преобразовывать строку из заглавных к строчным (т.е. PASCAL -> pascal).
|
Д/З
Возвращаясь к прошлому заданию: я был не прав :) в чём каюсь и раскаюваюсь.
Слово, которое читается справа на лево и слева на право, называется не полиномом, а полиндромом. Ответов пришло много, я не считал... Однако из-за нехватки времени мы поговорим об этой программе только в следующий раз.
От одного из читателей пришло интересное предложение:
цитата Александр 21.11.2002
Хочется еще спросить: а что вы будете делать с программами, которые
наверняка придут еще от кого-нибудь (ну не единственный же я!)? В
смысле - может быть, стоит разместить их на вашем сайте, дабы каждый
интересующийся автор мог посмотреть, как другие справились с этим
заданием.
мы решили воспользоваться мудрым советом и власть данной нам открыть страничку на сайте посвященную домашним заданиям. Поэтому просьба всех, кто отсылал нам исходники выслать подтверждающее письмо, что они не против публикации их решений. Теперь при посылке решения просьба соблюдать следующее соглашение: писать можно ли публиковать на сайте и нужно ли указывать ваш e-mail.
|
Послесловие
следующий выпуск будет чисто практическим, мы рассмотрим решение некоторых важных задач.
|
[ Назад ] [ содержание ] [ дальшЕ ]
Если, что надо - мыльте ibp7@yandex.ru. © 2002 Использование материалов без согласия авторов запрещено.
http://www.ibp7.narod.ru |
|