Выпуск 07: Условия 3...

 
     

Архив рассылки

Доброго времени суток!

Прежде всего хорошая новость. Нас становится всё больше!!! За последние 4 дня к нам присоединились ещё 205 подписчиков!!! :D

Для этих подписчиков повторю: сначала прочтите все предыдущие выпуски, которое можно найти в архиве.

Желающих изучать язык Си пока не появилось. Если вы этого хотите, пишите мне. Со следущего выпуска такой возможности не будет. Delphi - тоже очень хорошый выбор! :)

Теперь можно продолжить. Надеюсь вы поняли как пользоваться условным оператором и зачем он нужен. Сегодня мы усовершенствуем предыдущий код с помощью логических операторов.

Логические операторы

Долго думал как вам рассказать о них. Большинство предподователей, авторов книг и т.д. возвращаются к двоичной системе, т.е. к работе с битами. Я не думаю что это самый лучший выриант. Итак, вот список этих операторов:

 And
 Or
 Not
 Xor

Я просто переведу их с английского языка и станет всё гораздо понятнее.

 And - И
 Or - Или
 Not - Не (отрицание)
 Xor - Исключающий "Или"

Перед объяснением приведу пример:

var
 i, j, o: Integer;
begin
 ReadLn(i, j, o);
 If (i > j) and (j > o)
  Then
   WriteLn('''i'' bolse cem ''j''');
 ReadLn;
end.

Может кто-то сразу догадался в чём дело, а другим я объясню. Эта программа сравнивает числа, только на этот раз в условном операторе уже два условия, т.е. i > j и j > o. Запустите программу. Присвойте переменным значения 9, 5 и 1. Работает? Вроде да. А теперь пусть значения будут 5, 9, 2, или 9, 4, 6. Программа выполнятся не будет. Почему? Потому что мы вставили логический оператор And. Это значит, что программа будет выполнятся, когда будут истинными ова сравнения, т.е. когда i будет больше j И j будет больше o. Напишу это по русски:

Если (i > j) И (j > o)
 Тогда
  ...

Запомните! Всегда нужны скобки!

В первом варианте значения были 9, 5 и 1. Программа выполнилась, поскольку 9 действительно больше, чем 5, а также 5 больше, чем 1. Почему не действовал второй, или третий вариант? Посмотрим на второй. 5 меньше, чем 9, а в условии было написанно: i БОЛЬШЕ, чем j. Эти цифры не соответсвуют условию, значит программа не выполнится. Теперь третий вариант. 9 больше чем 4. Но почему не работает? Не забудьте, что есть и второе условие, которое гласит: j должно быть БОЛЬШЕ, чем o. А что у нас? 4 и 6. 4 МЕНЬШЕ, чем 6! А в условии сказанно, что И i БОЛЬШЕ, чем j, И j БОЛЬШЕ, чем o. Значит программа не выполнится. Теперь понятно что здесь происходит?

Теперь And замените на Or (или). Если вы поняли предыдущий пример и помните, что значит Or, то сразу поймёте, для чего он нужен.

 If (i > j) or (j > o)

По русски:

 Если (i > j) ИЛИ (j > o)...

Значит программа не выполнится только, когда i будет МЕНЬШЕ, чем j, и j будет МЕНЬШЕ, чем o. Поняли почему? В условии сказанно, что программа выполнится только, когда ХОТЯ БЫ (это значит, что программа будет выполнятся и тогда, когда оба результата будут истинными) одно выражение будет истинным. Должно быть i БОЛЬШЕ, чем j ИЛИ / И j БОЛЬШЕ, чем o. Если испытать варианты, которые мы проверяли с оператором And, они бы все действовали. А если ввсети 1, 5 и 9, программа выполнятся не будет.

Следущий оператор - Исключающий "Или" (Xor). Это тоже очень полезный оператор. Чем он отличается от Or? Сейчас объясню. Or - это And и Xor вместе! Т.е. когда стоит Or, то программа выполнится, когда i > j И j > o (свойство And), а также когда i > j ИЛИ j > o (свойство Xor). Значит, когда стоит оператор Xor, программа не выполнится когда результат будет i > j И j > o, потому что это свойство оператора And, а Xor его в себя не включает (не так, как Or). Чтобы выполнилась Xor программа, то должно быть строго: i > j ИЛИ j > o, т.е. только одно выражение должно быть истинным. Работать будут только второй и третий выриант (из тех, которые мы использовали с And и Or). Во втором варианте 9 больше, чем 2, но 5 меньше, чем 9. В третьем варианте 9 больше, чем 4, но 4 меньше, чем 6. Надеюсь вы поняли :)

Переходим к последнему, самому лёгкому оператору - Not. Он отрицает сравнение, т.е. его "переворачивает" на оборот. Вот примерчик:

 If not(i > j)
  Then
   WriteLn('''i'' mense cem ''j''');

По русски :)

Если НЕ (i > j)
 То
  ...

Было условие i > j, но Not его превратил в i <= j, т.е. дал противоположное значение (как минус с цифрами, т.е. -5 противоположный 5). В этом случае программа выполнится, когда i будет НЕ БОЛЬШЕ, чем j. Не запутайтесь! Слову "больше" противоположный будет "не больше", а не "меньше". Т.е. программа также выполнится, если обы числа будут одинаковыми. Главное, чтобы i не было бы больше, чем j.

Ну, я старался объяснить, но если вы всё ещё не поняли, то может следущий пример поможет. Это на самом деле очень легко и удобно. Но, если и тогда не поймёте, пишите мне письмо.

Вернёмся к программе, которую мы начали в прошлом выпуске:

procedure TForm1.Button1Click(Sender: TObject); begin

(*--------------------------------
  Проверяется, помечены ли переключатели
---------------------------------*)

 If (RadioButton1.Checked = False)
  Then
   If (RadioButton2.Checked = False)
    Then
     If (RadioButton3.Checked = False)
      Then
       ShowMessage('Пожалуйста выберите вариант ответа.');

(*--------------------------------
  Проверяется вариант ответа
---------------------------------*)

 if (RadioButton1.Checked = True)
  Then
   begin
    ShowMessage('Ответ не правильный!');
    RadioButton1.Enabled:= False;
   end;

 if (RadioButton2.Checked = True)
  Then
   begin
    ShowMessage('Ответ не правильный!');
    RadioButton2.Enabled:= False;
   end;

 if (RadioButton3.Checked = True)
  Then
   ShowMessage('Наверное просто угадали! :)');

end;

Работать будем с первой частью:

 If (RadioButton1.Checked = False)
  Then
   If (RadioButton2.Checked = False)
    Then
     If (RadioButton3.Checked = False)
      Then
       ShowMessage('Пожалуйста выберите вариант ответа.');

Надо код зделать более копактным. Поскольку в этом примере все условия должны быть истинными, значит надо использовать строго And. Вот так программа будет выглядить после модификации:

 If (RadioButton1.Checked = False) and
    (RadioButton2.Checked = False) and
    (RadioButton3.Checked = False)
  Then
   ShowMessage('Пожалуйста выберите вариант ответа.');

Думаю, так на много удобнее. А как вам? Конечно, если хочется печатать много кода - можете обойтись и без этих операторов (но и это не всегда).

Вы также можете использовать сразу несколько логических операторов, например:

 if (a > b) and ((c = d) or (d <> e))
  Then
   ...

Сначала выполнится Or, а потом и And (с полученным новым результатом сравнения Or).

Задание #6: напишите программу-тест, в которой могут быть несколько вариантов ответа. Используйте компонент CheckBox.

Подпрограммы

Помните, я вам говорил, что все команды должны быть где-то описанны? В этом выпуске вы научитесь сами описывать (создавать) разные команды, называемые подпрограммами, а также понимать их записи в модулях, чтоб могли сами найти то, что вам требуется.

Я всё говорю "команды" да "команды". На самом деле я говорю не правильно! Это всё называется не так, и вы забудьте это слово :) А говорил так только потому, чтобы не забивать вам головы новым материалом, до которого ещё надо дойти. Наконец-то вы дошли :)

Подпрограммы делятся на две групы: функции и процедуры. Начнём с самого лёгкого - процедур.

Что делает процедура? Она тупо выполняет какие-либо действия. Как выглядит процедура? Пример вам всегда был перед глазами :) Обработчик нажатия кнопки на самом деле является процедурой, которая выполняет то, что вы ей "сказали" :) В предыдущих примерах она делала разные сравнения и показывала табличку. Как отличить процедуру? Перед ней всегда стоит слово Procedure, которое является зарезервированным (т.е. его больше нигде нельзя использовать). Давайте сразу перейдём к практике.

Для начала создадим простую процедуру (в консольном приложении):

{$APPTYPE CONSOLE}

procedure Useless;
begin

end;

begin

end.

Сначала стоит директива компилятора, потом созданна (описанна) процедура. Далее следует основной блок программы. Процедура должна быть созданна перед основным блоком! Теперь пора вызвать нашу первую, совершенно бесполезную процедуру :)

procedure Useless;
begin

end;

begin
 Useless;
end;

Как видите хватает всего указать её название. Просто, не так ли? :)

Зачем нужны подпрограммы? Не все это знают :) Они нужны для многократного использования разных действий (чтобы не пришлось их постоянно переписывать). Они также помогают быстрее найти ошибку в программе. Таким способом программа просто разбивается на несколько блоков. Ведь легче работать с отдельными блоками, чем с целой кучай кода! :) Я уверен, что вы полюбите их :) Кстати, подпрограммы также называются методами.

Добавьте к коду ReadLn; и можно запускать программу. А можно и не запускать, потому что она ничего не будет делать. Как я и говорил, абсолютно бесполезная! :) Но не на долго. Поработаем чуть-чуть с ней.

procedure Useless;
begin
 WriteLn('Hello, World! :) Ispolzuem procedury...');
end.

Теперь она уже что-то делает и не является совсем бесполезной. Но всё равно никому не нужна. Суть, конечно, не в этом.

Что здесь происходит? Ничего особенного. Мы создали процедуру и указали, что она должна делать (я уже говорил, что они тупо выполняют какие-либо действия и больше ничего не делают). Эта процедура должна показать надпись. Когда мы в главном блоке программы вызываем эту процедуру, мы на самом деле её "включаем". Она сама ничего не может зделать. В главном блоке мы её заставляем выполнить действия, которые записанны в процедуре. Это всё и называется вызовом процедуры. В процедуре можно делать всё, что и в главном блоке программы, т.е. создавать переменные, вызывать другие процедуры.

{$APPTYPE CONSOLE}

procedure Useless;
var
  s: String;
begin
 s:= 'Hello, World! :) Ispolzuem procedury...';
 WriteLn(s);
end;

procedure Linker;
begin
 Useless;
 ReadLn;
end;

begin
 Linker;
end.

Обратите внимание! Процедура, которая вызывает вторую процедуру, должна быть ниже её! Иначе Дельфи не поймёт к чему вы обращаетесь. Исполнение всей программы идёт сверху вниз.

Подпрограммы - вещь не сложная. На этом выпуск я и закончу. Хорошо выучите логические операторы. В следущим выпуске мы продолжим тему с подпрограммами.
 

2005-10-15

Автор, ведущий и дизайнер рассылки: Евгений Нарышкин (spider3d@yandex.ru)

OpenGL для начинающих (under construction): http://spider3d.narod.ru/

Хостинг от uCoz