Урок 11. Флаги в JavaScript
Теория
Флаг - это переменная, которая может принимать только 2 значения true или false. С помощью флагов можно решать задачи, проверяющие отсутствие чего-либо. Например, можно проверить, что в массиве нет элемента с определенным значением.
Дан массив, нужно проверить, есть ли в нем элемент со значением 'c' или нет. Если есть, выведем 'есть', если нет, выведем 'нет'.
Для начала давайте попробуем вывести 'есть'. Для этого перебрать все элементы массива и ифом спросить, равен ли текущий элемент значению 'c'. Если равен, вывести 'есть':
a=['a','b','c','d','e'];for(i=0;i<a.length;i++){if(a[i]=='c'){document.write('Есть')}}
Решение не очень хорошо, ведь если в массиве будет не 1 значение 'c', а несколько, то выведется несколько раз. Исправим массив (сделаем 2 элемента с 'c') и убедимся в этом:
a=['a','b','c','c'];for(i=0;i<a.length;i++){if(a[i]=='c'){document.write('Есть')/*Выведет несколько раз*/}}
Поправим проблему: оборвем цикл с помощью break, если элемент уже найден:
a=['a','b','c','c'];for(i=0;i<a.length;i++){if(a[i]=='c'){document.write('Есть');break/*Оборвем цикл*/}}
Сделать так, чтобы, если в массиве вообще нет элементов со значением 'c', выводилось 'нет'. Распространенным заблуждением будет добавить else к ифу. В этом случае 'нет' будет выводиться на все элементы, не являющимися 'c':
a=['a','b','c','c'];for(i=0;i<a.length;i++){if(a[i]=='c'){document.write('Есть')}else{document.write('Нет')/*Выведет на 'a','b','d'*/}}
Добавить else - плохая идея, не рабочая. Для решения задач подобного типа используют так называемые флаги.
Как работать с флагами
Сделаем переменную f с таким значением: если она = true, то в массиве есть элемент 'c', а если false, то такого элемента нет.
Изначально поставим переменную f в значение false, т.е. будем считать, что элемента 'c' в массиве нет:
a=['a','b','c','c'],f=false;/*Считаем, что элемента 'c' нет в массиве. Затем запустим цикл с ифом так, как мы делали это раньше. Если цикл обнаружит, что в массиве есть элемент 'c', то поставим переменную f в значение true (и выйдем из цикла с помощью break)*/for(i=0;i<a.length;i++){if(a[i]=='c'){f=true;/*Элемент есть, переопределим переменную f*/break}}document.write(f)
Сократим код:
a=['a','b','c','c'],f=false;for(i=0;i<a.length;i++){if(a[i]=='c'){f=true;break}}document.write(f)
Далее ответ на вопрос, если в массиве 'c' или нет, можем дать только после цикла. И этот ответ у нас уже есть: после цикла переменная f могла остаться false или могла сменить свое значение на true, если цикл обнаружил в массиве 'c':
var a=['a','b','c','c'],f=false;/*Считаем, что элемента 'c' нет в массиве*/for(i=0;i<a.length;i++){if(a[i]=='c'){f=true;/*Элемент есть, переопределим переменную f*/break}}/*Тут переменная f = или true, или false*/document.write(f)
Сократим код:
a=['a','b','c','c'],f=false;for(i=0;i<a.length;i++){if(a[i]=='c'){f=true;break}}document.write(f)
Теперь после цикла мы можем сделать иф, который посмотрит на переменную f и выведет на экран 'есть' или 'нет':
a=['a','b','c','c'],f=false;/*Считаем, что элемента 'c' нет в массиве*/for(i=0;i<a.length;i++){if(a[i]=='c'){f=true;/*Элемент есть, переопределим переменную f*/break}}if(f===true){document.write('Есть')}else{document.write('Нет')}
Сократим код:
a=['a','b','c','c'],f=false;for(i=0;i<a.length;i++){if(a[i]=='c'){f=true;break}}if(f===true){document.write('Есть')}else{document.write('Нет')}
a=['a','b','d','e'],f=false;for(i=0;i<a.length;i++){if(a[i]=='c'){f=true;break}}if(f===true){document.write('Есть')}else{document.write('Нет')}
Так работают флаги.
Флаги в функции
Когда работают с пользовательскими функциями, флаги тоже можно и нужно использовать, но работа с ними упрощается. Решить ту же задачу на 'c', но таким образом: необходимо создать функцию b, которая параметром будет принимать массив и возвращать true, если 'c' есть в массиве, и false, если нет:
Ерунда какая-то обрезанная!
a=['a','b','c','c'];document.write(b(a))//Выведет true или false
Реализовать функцию b. В этом случае переменная f и команда break нам не понадобится - вместо них все сделает команда return.
Как это будет: внутри функции запускаем наш цикл с ифом и, если попали в иф, делаем return true, тем самым выходя из цикла и из функции. А если цикл прокрутился, но выхода из функции не случилось, после цикла делаем return false:
function b(a){for(i=0;i<a.length;i++){if(a[i]=='c'){return true}}return false;/*Элемент 'c' не найден*/};a=['a','b','c','c'];document.write(b(a))
Сократим код:
function b(a){for(i=0;i<a.length;i++){if(a[i]=='c'){return true}}return false};a=['a','b','c','c'];document.write(b(a))
Итак, как это работает: если в массиве найдется элемент со значением 'c', выйдем из функции с помощью return. Если в массиве не найдется элемент 'c', выхода из функции не произойдет и выполнение дойдет до команды return false и получится, что функция вернет false в знак того, что элемент 'c' не найден в массиве.
Практика
Дан массив с числами. Проверьте, что в этом массиве есть число 8. Если есть, вывести 'да', а если нет, вывести 'нет'.
a=[1,2,8];function b(a){for(i=0;i<a.length;i++){if(a[i]==8){return true}}return false}if(b(a)==true){document.write('да')}else{document.write('нет')}
a=[1,2,3];function b(a){for(i=0;i<a.length;i++){if(a[i]==8){return true}}return false}if(b(a)==true){document.write('да')}else{document.write('нет')}
Дано число 31. Проверить, что это число не делится ни на 1 другое число кроме себя самого и единицы. Т.е. в нашем случае нужно проверить, что число 31 не делится на все числа от 2 до 30. Если число не делится, вывести 'false', а если делится, вывести 'true'.
Доделать!
ввести число q
создать переменную j
создать массив m от 2 до q-1
сделать цикл i от m[0] до m[последнее число]
разделить q на m[i], это будет число c
округлить c до целого числа, это будет число d
найти разницу между c и d, это будет число e
проверить e=0, если да, то j+1
перейти на следущий шаг цикла
при выходе из цикла проверить j=0, если да, то вывести: "число q простое", иначе вывести: "число q не является простым"
Дан массив с числами. Проверьте, есть ли в нем 2 одинаковых числа подряд. Если есть, вывести 'да', а если нет, вывести 'нет'.