Web #5 Циклы

Алгоритмы с повторениями

Рассмотрим задачу: пользователь вводит число от 1 до 9, а программа выводит в консоль часть таблицы умножения для этого числа.
Решение этой задачи такое:
let num = +prompt("Введите число",1);
console.log(num  + " x 1 = " + num*1);
console.log(num  + " x 2 = " + num*2);
console.log(num  + " x 3 = " + num*3);
console.log(num  + " x 4 = " + num*4);
console.log(num  + " x 5 = " + num*5);
console.log(num  + " x 6 = " + num*6);
console.log(num  + " x 7 = " + num*7);
console.log(num  + " x 8 = " + num*8);
console.log(num  + " x 9 = " + num*9);
Но такой способ не эффективный – представьте, что вам нужно вывести значения множителя не от 1 до 9, а от 1 до 1000? 100000? Код, прописанный выше я называю хардкодом.
Видите, что в нашем коде выше есть закономерность? Каждая строка с console.log() отличается друг от друга тем, что изменяется только цифры. И изменяется на единицу
1 способ: заменим все эти команды циклом с 9 повторениями:

2 способ: заменим все эти команды циклом с предусловием:
let i = 1;
while (i<=9) {
  console.log(num  + " x " + i +" = " + num*i);
   i = i + 1;
}
Таким образом, мы очень сократили количество кода.

Try it out

1. Начнём с самого простого – программа, которая выводит в консоль 20 милых смайликов с котиками =^.^=
1.1. Для начала, продумаем, как бы выглядел хардкод этой программы:
console.log("=^.^=");
console.log("=^.^=");
console.log("=^.^=");
// И так ещё 17 раз
1.2. Так, как в команде ничего не меняется и мы знаем точное количество повторов (20 раз), то используем цикл с параметром:
for (let i=1; i<=20; i = i + 1) {
  console.log("=^.^=");
}
1.3. Если мы запустим этот код, то увидим в консоли один смайлик =^.^= и цифру 20 слева от неё. Это происходит из-за того, что то, что повторяется, консоль повторно не выводится. Добавим к смайликам изменяющийся инкремент i:
for (let i=1; i<=20; i = i + 1) {
  console.log("=^.^="+i);
}
Запустите программу и посмотрите на изменения.

2. Теперь напишем программу, которая будет считать 20 овец и засыпать)
2.1. Для начала, продумаем, как бы выглядел хардкод этой программы:
console.log("Я насчитал овец: 1");
console.log("Я насчитал овец: 2");
console.log("Я насчитал овец: 3");
...
console.log("Я насчитал овец: 20");
console.log("Хххррррррррр-псссссссс.....");
2.2. Видим, что в командах изменяется количество овец и мы знаем точное количество повторов (20 раз). Можем использовать цикл с параметром:
for (let i=1; i<=20; i = i + 1) {
  console.log("Я насчитал овец: " + i);
}
console.log("Хххррррррррр-псссссссс.....");

3. Апгрейдим предыдущую программу. Давайте мы не будем знать, сколько овец надо посчитать, чтобы уснуть, а будем генерировать это число случайно!)
let randomNumber = Math.random()*20; // генерирует нецелое число от 0 до 20
let sheepsNumber = Math.round(randomNumber); // округлим число до целых
for (let i=1; i<=sheepsNumber ; i = i + 1) {
  console.log("Я насчитал овец: " + i);
}
console.log("Хххррррррррр-псссссссс.....");

4. Напишем программу для вывода части таблицы умножения не в консоль, а во всплывающем окне:
4.1. Вот наш код из примера
num = +prompt("Введите число",1);
for (let i=1; i<=9; i = i + 1) {
  console.log(num  + " x " + i +" = " + num*i);
}
4.2. Можно заменить все команды console.log() на alert(), но если вы попробуете так сделать, вы и ваш пользователь ощутит острую боль. Попробуйте так сделать.
4.3. Было бы хорошо каждую новую строку хранить в переменной и в конце вывести её одним всплывающим окном.
num = +prompt("Введите число",1);
let text = "";
for (let i=1; i<=9; i = i + 1) {
  text = text + num  + " x " + i +" = " + num*i;
}
alert(text);
4.4. Вся информация слилась в одну строку! Просто добавим символ переноса в конце каждой строки:
num = +prompt("Введите число",1);
let text = "";
for (let i=1; i<=9; i = i + 1) {
  text = text + num  + " x " + i +" = " + num*i + "\n";
}
alert(text);

5. Теперь напишем такую программу, которая будет считать от 1 до 9 степени введённого числа и всё это выводить одним всплывающим окном.
5.1. Для начала попросим пользователя ввести своё число, от которого и будет находиться степени:
let number = +prompt("Введите число",2); // Например, пользователь ввёл 2

5.2. Добавим переменную для хранения результата возведения в степень. Приравняем её к 1, ведь все числа в 0 степени равны единице:
let rezult = 1;

5.2. Напишем, как бы выглядело решение этой задачи без циклов:
rezult = rezult*number; // = 1*2 = 2
console.log(number +" в 1 степени = "+ rezult);
rezult = rezult*number; // = 2*2 = 4
console.log(number +" в 2 степени = "+ rezult);
rezult = rezult*number; // = 4*2 = 8
console.log(number +" в 3 степени = "+ rezult);
...
console.log(number +" в 9 степени = "+ rezult);

5.3. Заменим всё это циклом:
for (let i=1;i<=9;i++) {
  rezult = rezult*number;
  console.log(number +" в " + i + " степени = "+ rezult);
}

5.4.  Теперь будем не в консоль выводить, а добавлять к тексту, который в итоге выведем после цикла:
let text = ""
for (let i=1;i<=9;i++) {
  rezult = rezult*number;
  console.log(number +" в " + i + " степени = "+ rezult);
  text = text + number +" в " + i + " степени = "+ rezult + "\n";
}
alert(text);

В конспект

Как искать циклы:
1) сначала прописать хардкодом
2) найти закономерность, заменить переменными
3) прописать цикл

Циклы с параметрами:
for (let i=1; i<=9; i = i + 1) {
  console.log(num  + " x " + "i = " + num*i);
}

Циклы с предусловиями:
let i = 1;
while (i<=9) {
  console.log(num  + " x " + i +" = " + num*i);
   i = i + 1;
}

Математические операции:
Math.random()  // выдаёт случайное дробное число от 0 до 1
Math.round()  // округление числа

Задачи

Внимание! Готовые скрипты для выполнения задач сохраняйте в отдельные файлы, отмеченные номером задачи, например: index1.html – для задачи №1, index2.html – для задачи №2.

Задача 5.1*. Выведите в консоль ваше имя 100 раз

Задача 5.2*. Пользователь вводит свой смайлик и он выводится alertaми 10 раз.

Задача 5.3*. Пользователь вводит своё имя. Затем он вводит своё любимое число. После этого программа выстреливает алертами с именем пользователя любимое число пользователя раз.

Задача 5.4*. Вывести квадраты чисел от 1 до 99

Задача 5.5*. Программа считает сумму чисел от 1 до 9 и выводит всплывающим окном.

Задача 5.6*. Пользователь вводит число a. Программа считает сумму чисел от 1 до a и выводит всплывающим окном.

Задача 5.7*. Пользователь вводит числа a и b. Программа считает сумму чисел от a до b и выводит всплывающим окном.

Дополнительные задачи

Доп. задача 5.1*. Пользователь вводит число n. Программа умножает числа от 1 до n и выводит всплывающим окном.

Доп. задача 5.2*. Пользователь вводит число a и b. Программа умножает числа от a до b и выводит всплывающим окном.

Доп. задача 5.3*. Выведите в консоль такую "лестницу" из символов:
#
##
###
####
#####
######
#######
########
#########
Доп. задача 5.4**. Дополните предыдущую задачку тем, что теперь пользователь может ввести количество рядов в лестнице, а программа выведет такую лестницу в консоль.
Пример
Ввод: 2
Вывод:
#
##

Доп. задача 5.1**. Пользователь вводит число max, программа берёт случайное целое от 1 до max, считает таблицу умножения от 1 до 100 на это число и выводит её одним сообщением во всплывающее окно.

Доп. задача 5.5**.  Пользователь вводит натуральное число n. Среди чисел 1, 2, , n найти все такие, запись которых совпадает с последними цифрами записи их квадрата.
Пример
Ввод: 6
Вывод: 
1
5
6

Доп. задача 5.6**. Программа печатает в консоль все степени 3, не превышающие 10000.
Доп. задача 5.7*.  Дополните задачу 8 тем, что максимальное число (10000) мог вводить теперь пользователь.
Доп. задача 5.8*.  Дополните предыдущую задачу 9 тем, что программа ещё и печатает число, показывающее, сколько есть таких степеней числа 3. Подсказка: так, как мы заранее не знаем, сколько таких чисел будет (всё зависит от числа пользователя), используем цикл while.
Пример:
Ввод: 20
Вывод: У числа существует 2 степени, не превышающие 20.
3 в 1 степени = 3
3 в 2 степени = 9

Доп. задача 5.9**. Написать программу поиска произведения последовательности чисел, вводимых с клавиатуры, предшествующих первому введенному нулю. Контрольный пример: 1,2,3,-4,5,-2,0.

Доп. задача 5.10**.  Остров Манхэттен был приобретен поселенцами за $24 в 1826 г. Каково было бы в настоящее время состояние их счета, если бы эти 24 доллара были помещены тогда в банк под 6% годового дохода?

Доп. задача 5.11**.  Найти все четырехзначные числа, у которых все цифры различны

Комментарии