Skip to content

Latest commit

 

History

History
executable file
·
169 lines (114 loc) · 9.57 KB

02_Boolean_algebra_control_structures.md

File metadata and controls

executable file
·
169 lines (114 loc) · 9.57 KB

Урок 2. Булева алгебра и управляющие конструкции

Мы уже знакомились на прошлом уроке с булевым типом данных. Переменная типа bool может содержать только два значения: true или false, при чем это не строки, не числа, а именно понятия ложь и истина.

$bool1 = true;
$bool2 = false;

Для работы с булевыми переменными существует булева алгебра.

Булева алгебра (логические операторы)

Существуют следующие логические операторы:

  • && - И
  • || - ИЛИ
  • xor - Исключающее ИЛИ
  • ! - НЕ

not означает НЕ, и, будучи поставленным перед типом bool, меняет его значение на обратное, т.е. not True становится False,not False становится True

Далее приведена таблица, демонстрирующая работу операторов:

0 to 0 0 to 1 1 to 0 1 to 1
&& 0 0 0 1
|| 0 1 1 1
xor 0 1 1 0

Управляющие конструкции

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

  • операторы условия
  • операторы цикла
  • операторы подключения других файлов
  • операторы для вмешательства в работу цикла или функции прочие операторы Полный список

Оператор условия if

Существуют следующие операторы условия:

  • if -> elseif ->else
  • ?: (тернарный оператор)
  • switch->case->break

Рассмотрим каждый подробнее на примере конкретного кода:

<?php

echo "Give it to me!\n";
$handle = fopen ("php://stdin","r");
$number = fgets($handle);

if ($number > 100) {
    echo "Thanks, man!";
} elseif (($number > 10) && ($number < 100)) {
    echo "OK :(";
} else echo "WHAAAAT????";

echo "\n";
if ($number > 1000) echo "\n!!!!WOOOOWWWW!!!\n";

Обратите внимание, мы впервые сталкиваемся с блоком операторов. Так же будет и у циклов, и у функций, и у классов, и у их методов, и так далее. блок операторов начинается со своего инициатора (например, сейчас это блок оператора if), после инициатора ставится фигурная скобка, затем все действия, которые программист хочет выполнять в рамках этого блока, он должен выполнять после одного дополнительного отступа. Если отступа не будет, php сработает, ошибки не будет, но отступы нужны программисту и его коллегам, чтобы визуально понимать, к какому блоку относится строка кода.

Как видно из листинга, есть возможность применять оператор if в нескольких вариантах. Ниже приведен список всех вариантов:

  • if (условие) действие
  • if (условие) {блок действий в несколько строк}
  • if (условие) {блок действий в несколько строк} else действие
  • if (условие) {блок действий в несколько строк} else {блок действий в несколько строк}
  • if (условие) {блок действий в несколько строк} elseif(условие) {блок действий в несколько строк} else действие
  • if (условие) {блок действий в несколько строк} elseif(условие) {блок действий в несколько строк} else {блок действий в несколько строк}

Между if и else может быть сколько угодно elseif.

Оператор выбора switch

Оператор switch в основном используется в тех случаях, когда в зависимости от содержимого переменной необходимо выполнить более двух вариантов действий, и является альтернативой конструкции if-elseif-elseif....else.:

<?php
echo "Give me the mark!\n";
$handle = fopen ("php://stdin","r");
$mark = fgets($handle);

switch ($mark) {
    case 2:
        echo "I am better!!";
        break;
    case 3:
        echo "OK :(";
        break;
    case 4:
        echo "I am good :)";
        break;
    case 5:
        echo "YeeeeWhaaaa!!!!";
        break;
} 

echo "\n";

Тернарный оператор

Тернарные операторы часто применяются, когда варианта всего два, так как такая запись короче аналогичного действия с if. Однако, к сожалению, можно встретить связку if и тернарных операторов, которую совершенно невозможно прочесть. Другими словами, это не необходимая вещь в языке и она может стать причиной нечитаемого текста.

Ниже приведен пример тернарного оператора:

<?php

echo "If you are a man, press 1!\n";
$handle = fopen ("php://stdin","r");
$input = fgets($handle);

echo ($input == 1) ? "MAAAN!" : "Hey, girl!"; 

echo "\n";

Особенности сравнения и проверки объектов

В свете того, что php является языком с нестрогой динамической типизацией, ему присущи довольно оригинальные выводы, когда дело касается определения, является ли содержимое скобок какого-либо условия правдой или ложью. PHP считает, что если объект не пуст, он True, а не False. False - это собственно сам False, 0, пустая строка, пустой массив, null и даже строка, в которой записан '0'.

Полный список всех вариантов можно посмотреть по ссылке: таблицы сравнения типов

Как извлечь из этого выгоду и как этим пользоваться? Если нам необходимо сравнить строку с пустой строкой, или число с нулем, а так же узнать, является ли пустым тот или иной объект, вместо того, чтобы писать условия в стиле старых языков:

if ($s !='') echo $s;
    
if (9 % 2 != 0) echo 'not zero!';

можно слегка их сократить:

if ($s) echo $s;
    
if (9 % 2) echo 'not zero!';

Это значительно сокращает и упрощает код.

Практика по операторам условия, fizz-buzz!

Задача fizz-buzz:

У вас есть три числа, они вводятся из консоли (использовать функцию fopen). Первое число называется fizz, второе называется buzz. До третьего необходимо досчитать от единицы. Считая, надо выводить число. Если число кратно fizz - надо выводить F вместо числа. Если число кратно buzz - надо выводить B вместо числа. Если число кратно и fizz и buzz, надо выводить FB. И так - пока не будет достигнуто третье введенное число.

Пример условия и результата:
Введены числа 2, 5, 18
Вывод должен быть таким:
1 F 3 F B F 7 F 9 FB 11 F 13 F B F 17 F

Полезные ссылки

Домашнее задание

Третий Урок