создание и продвижение сайта (вбиваю в ТОП-10, как гвозди)Настройка и сопровождение платной рекламы яндекс.директ

Урок 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 одинаковых числа подряд. Если есть, вывести 'да', а если нет, вывести 'нет'.

Содержание

Отвечу на любые вопросы. С уважением, Дмитрий Владимирович.

Ваше письмо×
Free Web Hosting