#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 falsetruefalsetrue falsetruefalsetrue falsetruefalsetrue falsetrue
операнд 2 falsefalsetruetrue falsefalsetruetrue falsefalsetruetrue                  

Результат: falsefalsefalsetrue falsetruetruetrue falsetruetruefalse truefalse
Таблица получилась конечно запутанная, но смысл тот же - если заменить 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.

Послесловие

следующий выпуск будет чисто практическим, мы рассмотрим решение некоторых важных задач.


[Назад] [Содержание] [Дальше]
Hosted by uCoz