Роботландский Университет © А.А.Дуванов

# ЗНАКОМСТВО С ЯЗЫКОМ

i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | ?

урок 2 | зачет | задания | дополнения | урок 4

## урок 3: ветвления

Функция `alert` предназначена для передачи информации пользователю. А как пользователь может передать информацию в документ?

### ввод информации

Для ввода информации можно использовать функцию `prompt`:

    prompt("надпись", "значение ввода по умолчанию");

Функция работает так. На экран выводится панель с двумя кнопками:

Пользователь записывает сообщение в строке ввода и нажимает кнопку Ok. Окно убирается с экрана, а введенный текст становится значением функции `prompt`. Это значение можно, например, присвоить переменной и использовать затем в скрипте. Если пользователь нажимает кнопку Отмена (Cancel), функция prompt возвращает специальное значение null (это не строка `"null"`, не пустая строка `""`, а значение специального служебного типа данных).

#### пример

    var str=prompt("Сколько будет 2x2?", "5");
    if(str=="4") alert("Гениально! Ответ и правда 4!");
    else         alert("Шутка хороша, когда ее понимают!");

### условная команда

общий вид |  | пример
--- | --- | ---
    if(условие) команда1;
    else        команда2;
    if(a > b) c = a;
    else      c = b;

Условная команда работает как обычно:

1. Проверяется `условие`.
2. Если `условие` истинно, выполняется `команда1`, иначе — `команда2`.

Команды `команда1` и `команда2` никогда не выполняются вместе — работает только одна из них. После выполнения условной команды управление передается на команду, которая следует за условной.

После выполнения кода:

    x = 1;
    if(x == 1) y = 10;
    else       y = 20;
    x += y;

переменная `x` получит значение 11. А после выполнения кода:

    x = 1;
    if(x != 1) y = 10;
    else       y = 20;
    x += y;

переменная `x` получит значение 21.

Разрешается записывать условную команду без ветви `else`:

общий вид |  | пример
--- | --- | ---
    if(условие) команда1;
    if(x < 0) x = -x;

Работает эта конструкция так:

1. Проверяется `условие`.
2. Если `условие` истинно, выполняется `команда1`.

После выполнения кода:

    x = 1;
    y = 10;
    if(x == 1) y += 10;
    x += y;

переменная `x` получит значение 21. А после выполнения кода:

    x = 1;
    y = 10;
    if(x != 1) y += 10;
    x += y;

переменная `x` получит значение 11.

Конструкции `команда1` и `команда2` могут быть любыми командами языка, в том числе и снова условными.

### переключатель

Часто используются конструкции следующего вида (переключатели):

общий вид |  | пример
--- | --- | ---
    if      (условие1) команда1;
    else if (условие2) команда2;
    else if (условие3) команда3;
    ...........................
    else               командаN;
    if      (Day==1) NameDay="понедельник";
    else if (Day==2) NameDay="вторник";
    else if (Day==3) NameDay="среда";
    else if (Day==4) NameDay="четверг";
    else if (Day==5) NameDay="пятница";
    else if (Day==6) NameDay="суббота";
    else if (Day==7) NameDay="воскресенье";
    else             NameDay="ошибка";

##### пример

    var str=prompt("Сколько будет 2x2?", "5");
    if      (str==null) alert("Не стали вычислять?..Зря!");
    else if (str=="4")  alert("Гениально! Ответ и правда 4!");
    else                alert("Шутка хороша, когда ее понимают!");

Разработчики JavaScript добавили в язык специальную конструкцию `switch`, которую “понимают” браузеры Netscape и Internet Explorer, начиная с четвертых версий. Работает эта структура аналогично подобной конструкции в языках C и Java:

общий вид |  | пример
--- | --- | ---
    switch(выражение)
    {
      case вариант1:
        команды
        break;
      case вариант2:
        команды
        break;
      ...
      default:
        команды
    }
    switch(Day)
    {
      case 1:
        NameDay="понедельник";
        break;
      case 2:
        NameDay="вторник";
        break;
      case 3:
        NameDay="среда";
        break;
      case 4:
        NameDay="четверг";
        break;
      case 5:
        NameDay="пятница";
        break;
      case 6:
        NameDay="суббота";
        break;
      case 7:
        NameDay="воскресенье";
        break;
      default:
        NameDay="ошибка";
    }

Управление передается на команды, расположенные за первым по порядку `case`, в котором значение варианта совпадает со значением выражения, записанного в заголовке `switch(выражение)`.

Команда `break` передает управление на первую команду, следующую за конструкцией `switch`. Если команда `break` отсутствует, проверка вариантов продолжается.

Вариант `default` (он может отсутствовать) срабатывает тогда, когда значение выражения не соответствует ни одному из вариантов `case`.

##### пример

    var str;
    switch(prompt("Введите 1, 2 или 3", "1"))
    {
      case "1":
        str = "one";
        break;
      case "2":
        str = "two";
        break;
      case "3":
        str = "three";
        break;
      default:
        str = "ошибка";
    }
    alert(str);

### логические операции

В качестве условия можно записывать логические выражения. При этом разрешается использовать следующие знаки логических операций:

обозначение | назначение | пример
--- | --- | ---
`==` | равно | `x+1 == 8`
`!=` | не равно | `str != "да"`
`>` | больше | `x*y > 5+(x++)`
`>=` | больше или равно | `d >= 0`
`<` | меньше | `num < 10`
`<=` | меньше или равно | `bonus <= 5`
`&&` | логическое “и” | `1 < x && x < 10`
`||` | логическое “или” | `x == 0 || x == 1`
`!` | логическое отрицание | `!(1 < x && x < 10)`

### блок

Цепочка команд, заключенная в фигурные скобки

    {команда1; команда2; ...}

рассматривается как одна команда. Такая сложная команда называется составной или блоком. Символ “`;`” за скобкой “`}`”, закрывающей блок, не ставится. Условная команда с использованием блока может выглядеть так:

возможный общий вид |  | пример
--- | --- | ---
    if (условие)
    {
      ...
      команды
      ...
    }
    else
    {
      ...
      команды
      ...
    }
    if (d > 0)
    {
      x1 = - (b+Math.sqrt(d))/(2*a);
      x2 = - (b-Math.sqrt(d))/(2*a);
      mes = "два корня";
    }
    else if (d == 0)
    {
      x1 = -b/(2*a);
      mes = "один корень"
    }
    else mes = "нет корней";

### конструируем небольшой экзамен

Экзамен состоит из пяти вопросов. За каждый верный ответ начисляется один балл. В итоге выставляется оценка от 2 до 5 по правилу:

- оценка равна 2, если верных ответов меньше 3;
- оценка равна числу верных ответов в противном случае.

Программа экзамена

Экзамен

### арифметические и строковые выражения как условия

В качестве условия в команде `if` можно записывать не только логические, но и арифметические, и даже строковые выражения. При этом считается, что условие ложно, если значение выражения равно 0 или пустой строке "" и истинно в противном случае.

##### примеры

    var x = 20;
    if (20-x) x++;
| Условие ложно, значение `x` не изменится.
    var x = 20;
    if (2*x) x++;
| Условие истинно, значение `x` увеличится на 1.
    var x = "";
    if (x) x += "киса";
| Условие ложно, значение `x` не изменится.
    var x = "";
    if (x+"?") x += "киса";
| Условие истинно, и `x` получит значение `"киса"`.
    var x = "";
    if (!x) x += "киса";
| Условие истинно, и `x` получит значение `"киса"`.

### значения логического типа

В языке JavaScript переменная может принимать значение логического типа. Этот тип имеет две константы, обозначаемые как `true` и `false`.

#### примеры

    var x = true;
    var y = 2;
    if (x) y++;
| После выполнения команд значение y равно 3
    var x = true;
    var y = 2;
    if (!x) y++;
| После выполнения команд значение y равно 2
    var x = true;
    var y = 2;
    if (x || !x) y++;
| После выполнения команд значение y равно 3
    var x = true;
    var y = 2;
    if (x && !x) y++;
| После выполнения команд значение y равно 2

### трудные условия

Условия, в состав которых входят арифметические и строковые выражения, на первых порах вызывают трудности. Рецепт их преодоления очень прост. Нужно помнить, что арифметические и строковые выражения, входящие в состав условия, сначала вычисляются, а затем их значения сопоставляются с логическими значениями `true` и `false`.

Строковые константы `"волк"` и `"крокодил"`, а также числовые константы `25` и `3.14` эквивалентны одной и той же логической константе `true`. Следовательно, логические отрицания этих величин равны `false`.

    if("волк")      то же самое, что if(true)
    if("крокодил")  то же самое, что if(true)
    if(25)          то же самое, что if(true)
    if(3.14)        то же самое, что if(true)

    if(!"волк")     то же самое, что if(false)
    if(!"крокодил") то же самое, что if(false)
    if(!25)         то же самое, что if(false)
    if(!3.14)       то же самое, что if(false)

Несколько более сложных примеров:

    "волк" && 25         эквивалентно true  && true  равно true
    !"волк" && 25        эквивалентно !true && true  равно false
    !"волк" || 25        эквивалентно !true || true  равно true
    !"" || 22-22         эквивалентно true  || false равно true
    !(""+"кот") || 22-22 эквивалентно false || false равно false

Поясним последний пример цепочкой преобразований:

    !(""+"кот") || 22-22
    !"кот" || 0
    !true || false
    false || false
    false

### ввод альтернативы

Если нужно, чтобы пользователь выбрал один из двух вариантов ответа на вопрос, то можно воспользоваться функцией `prompt`:

Существует, однако, более простой и красивый способ узнать желание пользователя — функция `confirm`:

    confirm("надпись");

Функция работает так. На экран выводится панель с двумя кнопками:

Если пользователь нажимает на кнопку Ok, функция `confirm` возвращает значение `true`, если на кнопку Отмена (Cancel) — значение `false`. Пользователь может использовать эквивалентные клавиши Enter и Esc.

##### пример

    if (confirm("Хлеба и зрелищ?"))
         alert("Смотри сейчас, а кушай после!");
    else alert("И, словом, тот хотел арбуза,\n"+
               "А тот соленых огурцов.");

Дополнительный материал

Испытатель if

Нажмите кнопку Сброс, затем приступайте к решению.

Какое значение будет иметь переменная z после выполнения скрипта?

1. |
    var x = "каша";
    var y = "лот";
    var z = "акула";
    if (x) z = x+y;
2. |
    var x = "каша";
    var y = "лот";
    var z = "акула";
    if (!x) z = x+y;
3. |
    var x = "каша";
    var y = "лот";
    var z = "акула";
    if (x && y) z = x+y;
4. |
    var x = "каша";
    var y = "лот";
    var z = "акула";
    if (!x && y) z = x+y;
5. |
    var x = "каша";
    var y = "лот";
    var z = "акула";
    if (!x || y) z = x+y;
6. |
    var x = "каша";
    var y = "лот";
    var z = "акула";
    if (!(x || y)) z = x+y;
7. |
    var x = -10;
    var y = 10;
    var z = x+y;
    if (z) z = 20;
8. |
    var x = -10;
    var y = 10;
    var z = x+y;
    if (!z) z = y-x;
9. |
    var x = -10;
    var y = 10;
    var z = x+y;
    if (x > y) z = y-x;
10. |
    var x = -10;
    var y = 10;
    var z = x+y;
    if (x <= y) z = y-x;
11. |
    var x = -10;
    var y = 10;
    var z = x/y;
    if (x + y || x > 0) z = y-x;
12. |
    var x = -10;
    var y = 10;
    var z = x/y;
    if (x + y || x < 0) z = y-x;
13. |
    var x = -10;
    var y = 10;
    var z = x/y;
    if (x + y && x < 0) z = y-x;
14. |
    var x = -10;
    var y = 10;
    if (x + y && y < 0) z = y-x;
    else                z = x+y;
15. |
    var x = -10;
    var y = 10;
    if (x + y || y < 0) z = y-x;
    else                z = x+y;
16. |
    var x = -10;
    var y = 10;
    if (x+y==0 || y<0) z = y-x;
    else               z = x+y;

Чтобы увидеть результат работы, нажмите кнопку Оценка.

1. Создайте экзамен для проверки знаний по теме "условная команда". Среди заданий, возможны такие:
   1. `var x = 5; if (x!=5) x++;` Теперь `x` = ?
   2. `var x = 5; if (x==5) x++;` Теперь `x` = ?
   3. `var x = 5; var y = x++; if (y>x) x++;` Теперь `x` = ?
   4. `var x = 5; var y = ++x; if (y>x) x++;` Теперь `x` = ?
   5. `var x = 5; var y = x-5; if (y==0 || x>0) x++;` Теперь `x` = ?