Циклы в python: как работают и какие бывают

Информатика

Введение

Актуальность исследования.

В информатике, а точнее в программирование есть общее для всех языков программирования – это циклы.

Циклы нужно знать всем тем, что желает связать свою жизнь с программированием. Так как, надо:

  • Знать виды циклов, то есть знать и понимать теоретический материал по данной теме;
  • Надо уметь их применять при написании программ;
  • А так же уметь определиться с выбором цикла в определенной ситуации.

Основное назначение циклов — это экономия памяти отводимой под программные инструкции при необходимости повторять одни и те же действия много раз.

Так же циклы применяются в алгоритмах в которых неизвестно заранее сколько раз придется повторить действие. Но иногда, в специфических случаях, для выигрыша в скорости выполнения, циклы наоборот «разворачивают» — избавляются от затрат времени на ведение счетчика и на команду перехода в начало цикла.

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

Целью курсовой работы является циклов.

Для достижения данной цели необходимо решение следующих задач:

  • Дать определения понятия цикл;
  • Описать и привести пример следующих циклов While, Repeat, For и Loop;
  • Определить вложенный цикл.

Объектом исследования данной курсовой работы циклы. Предметом исследования выступают циклы.

Работа состоит из введения, двух глав («Циклические структуры», «Вложенные циклы»), заключения и списка использованной литературы.

Линейный алгоритм (последовательный)

Определение

Линейный алгоритм – алгоритм, состоящий из инструкций (действий, команд), которые выполняются одна за другой в строгом порядке.

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

  1. нанести зубную пасту на зубную щетку
  2. использовать зубную щетку для чистки зубов
  3. прополоскать зубную щетку

Каждый шаг — это инструкция, которую нужно выполнить. Последовательность – это порядок, в котором выполняются шаги.

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

Предположим, что шаги алгоритма чистки зубов были в такой последовательности:

  1. использовать зубную щетку для чистки зубов
  2. нанесите зубную пасту на зубную щетку
  3. прополоскать зубную щетку

Зубная щетка по-прежнему будет использоваться для чистки зубов, а зубная паста будет по-прежнему наноситься на щетку. Но из-за того, что шаги 1 и 2 выполняются в неправильной последовательности, зубная паста не очистит зубы, и зубная паста будет потрачена впустую.

Человек поймет, что забыл добавить зубную пасту в начале процесса, но компьютер не узнает, что что-то не так.

Для составления линейного алгоритма необходимо:

  • Определить тип алгоритма и присвоить имена переменным;
  • Определить тип конечного результата, присваивая имя этой переменной;
  • Определить и обозначьте связь между входными переменными и результирующей переменной;
  • При необходимости ввести промежуточные переменные, определить их тип, присвоить имена, указать связь с
    исходными переменными и результирующей переменной;
  • Написать алгоритм, отражающий ввод данных, расчет, вывод конечного результата;
  • Протестируйте полученный алгоритм на правильность его функционирования.

Важно. Компьютер может делать только то, на что он запрограммирован

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

Цикл с заданным числом повторений (цикл-ДЛЯ, цикл с параметром)

Логика работы этой конструкции описывается схемой, показанной на рис. 2.12.

На алгоритмическом языке эта конструкция записывается так:

В цикле-ДЛЯ всегда есть параметр цикла — величина целого типа, изменяющаяся в ходе выполнения цикла от своего начального значения il до конечного значения i2 с шагом R.

Выполняется цикл-ДЛЯ следующим образом: 1) параметру цикла присваивается начальное значение; 2) параметр цикла сравнивается с конечным значением; если параметр цикла не превышает конечное значение, то выполняется тело цикла, увеличивается значение параметра цикла на шаг и снова осуществляется проверка параметра цикла; если же параметр цикла превышает конечное значение, то выполнение цикла заканчивается.

Если величина шага в цикле с параметром равна единице, то шаг не указывают. Мы ограничимся рассмотрением именно таких циклов.

В отличие от двух предыдущих конструкций (цикл-ПОКА, цикл-ДО) цикл-ДЛЯ имеет строго фиксированное число повторений, что позволяет избежать зацикливания, т. е. ситуации, когда тело цикла выполняется бесконечно.

Пример 7 

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

Пример 8

Составим алгоритм вычисления степени с натуральным показателем n для любого вещественного числа а.

По определению:

При составлении алгоритма воспользуемся единой формулой, в которой число умножений равно показателю степени:

Исполним этот алгоритм для а = 4 и n = 3.

Пример 9

Для исполнителя Робот цикл с известным числом повторений реализуется с помощью следующей конструкции:

Так, если правее Робота не встретится препятствий, то, выполнив приведённый ниже алгоритм, он переместится на пять клеток вправо и закрасит эти клетки:

Задание:

Приведите пример циклического алгоритма:

а) из повседневной жизни;б) из литературного произведения;в) из любой предметной области, изучаемой в школе.

Записать в тетрадь и отправить фото в VK

Практические задания будут на следующем уроке!

Понятие циклического алгоритма

В жизни людей очень часто встречаются циклы. Будь то жизнь маленького ребёнка или взрослого человека, а то и пожилых людей. Эти циклы можно расписать как выполнение одних и тех же действий, пока выполняется определённое условие. К примеру, взрослый человек находится на работе до момента, когда наступит время его ухода. И так изо дня в день, однако, есть и исключения в виде выходных. В жизни детей можно привести такой пример, как обязанность каждый день ходить в школу до момента, когда наступят выходные или каникулы.

Циклические алгоритмы – это алгоритмы, в которых некоторая часть операций повторяется многократно.

Цикл – конструкция с оператором, который повторяется определённое или неопределённое заранее количество раз. Действия, выполняющиеся последовательно внутри цикла, называют телом цикла.

В разных средах программирования циклические конструкции могут быть реализованы по-разному, но неизменным остается главный признак, отличающий циклы от линейных операций и ветвлений – возможность перемещения по программе не только «сверху-вниз», но и «снизу-вверх», для возврата к уже выполненным ранее действиям.

Циклы разделяют на три типа в зависимости от метода организации повторений:

  • Цикл, в котором задано условие окончания работы;
  • Когда известно условие продолжения работы цикла;
  • Когда известно число повторений цикла.

Вложенные циклы

Циклы могут быть вложены один в другой. При использовании вложенных циклов необходимо составлять программу таким образом, чтобы внутренний цикл полностью укладывался в циклическую часть внешнего цикла. Рассмотрим на примере структуру вложенных циклов.

    Пример: Вычислить значение переменной Y=2K+N при всех значениях переменных   N=1, 2, 3  и    K=2, 4, 6, 8.

Обратите внимание на то, что если перебирать все значения N и K получим 12 значений Y. Составить программу можно следующим образом: N —  параметр внешнего цикла, K —  параметр внутреннего цикла

Тогда при одном значении N переменная K будет принимать значения 2, 4, 6, 8. Предполагается, что все переменные N, K, Y целого типа. 

Составить программу можно следующим образом: N —  параметр внешнего цикла, K —  параметр внутреннего цикла. Тогда при одном значении N переменная K будет принимать значения 2, 4, 6, 8. Предполагается, что все переменные N, K, Y целого типа. 

Фрагмент циклической части программы имеет вид:  

PROGRAM  PR;

   VAR  N,K,Y: INTEGER;

BEGIN

    FOR  N:=1  TO  3  DO

         BEGIN

             K:=2;

             WHILE   K<=8  DO

                  BEGIN

                      Y:=2*K+N;

                      WRITELN (N:4, Y:4);

                      K:=K+2

                   END

            END

END.

Здесь  внешний цикл организован с использованием оператора  FOR, а внутренний  — с использованием оператора  WHILE.

В процессе выполнения вложенных циклов переменные получат следующие значения:

 N  …………  1        1        1        1        2        2        2         2           3           3          3         3

K  …………  2        4        6        8        2        4        6         8           2           4          6         8

Y   ………… 5         9      13      17        6      10       14      18          7           11       15       19

Свойства алгоритмов

  • Дискретность. Алгоритм должен быть разделен на простейшие (элементарные) шаги.
  • Понятность. Выполняемые действия должны быть понятны исполнителю алгоритма, то есть входить в систему команд исполнителя (СКИ).
  • Определенность. Каждое действие должно быть сформулировано так, чтобы не оставалось возможности для произвольных дополнительных рассуждений или вопросов. В результате алгоритм может выполняться механически.
  • Результативность. Исполнение алгоритма обязательно должно приводить к конечному результату, соответствующему поставленной цели.
  • Массовость (универсальность). Одно из наиболее важных свойств, указывающее на то, что алгоритм должен быть применим к решению некоторого класса задач, различающихся лишь исходными данными.
  • Выполнимость. Результат должен быть достигнут за конечное количество шагов.

Проверь себя

Задание 1.Что подразумевает алгоритм с ветвлением? 

  1. Строго последовательное выполнение команд.
  2. Наличие команды или набора команд, которые будут выполняться неоднократно.
  3. Наличие условия, в зависимости от выполнения которого будет выполнена та или иная команда, или набор команд.

Задание 2.Выберите верные утверждения:

  1. Алгоритму не обязательно иметь конечный результат работы.
  2. В алгоритме важен порядок операций.
  3. В алгоритме невозможно многократное выполнение команды.
  4. При выполнении условия «ДА» в условном алгоритме не будет выполнена команда из линии условия «НЕТ».

Задание 3.Исполнитель Робот не может:

  1. Пройти сквозь стену.
  2. Проверить наличие стены рядом с ним.
  3. Обойти стену.
  4. Сдвинуться вверх.
  5. Сдвинуться по диагонали.

Задание 4. Исполнитель Чертёжник может:

  1. Сдвинуться четко вниз.
  2. Вернуться в исходное положение после нескольких шагов.
  3. Выполнять циклические алгоритмы.
  4. Все вышеперечисленное.

Ответы: 1. —  3; 2. — 2, 4; 3. — 1,5; 4. — 4.

Вложенные циклы

В Python можно из одного цикла вызывать другой цикл. В таком случае код усложняется, но это полезно во многих задачах. К примеру, надо пройтись по всем значениям таблицы. Одним циклом перебираем значения ячеек в строке, а вторым — переключаемся на новую строку. Общая запись вложенных циклов выглядит так:

for условие:
    блок_кода
    for условие:
        блок_кода

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

for i in range(1, 3):
    for j in range(1, 5):
        print(f'Ячейка {i}:{j}')

>>> Ячейка 1:1
>>> Ячейка 1:2
>>> Ячейка 1:3
>>> Ячейка 1:4
>>> Ячейка 2:1
>>> Ячейка 2:2
>>> Ячейка 2:3
>>> Ячейка 2:4

Оператор прерывания в Python

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

Прерывание обычно используется в тех случаях, когда нам нужно прервать цикл при заданном условии.

Синтаксис прерывания приведен ниже.

Пример:

Вывод:

Пример:

Вывод:

Пример: оператор break с циклом while

Вывод:

Пример

Вывод:

For, или цикл с параметром

For — это  цикл, в котором тело выполняется заданное количество раз.

Существует две формы записи этого цикла:

Первая форма

for <счетчик1> := <значение1> to <конечное_значение> do <оператор1>;

После каждой итерации значение <счетчик1> будет увеличиваться на 1.

<значение1> — это начальное значение счетчика. Это может быть переменная или число. <конечное_значение> : как только значение <счетчик1> станет больше <конечное_значение>, выполнение цикла прекратится.

Если требуется написать несколько операторов в теле цикла, используем begin и end.

И <счетчик1>, и <конечное_значение>, и <значение1> —  переменные целого типа.

Чаще всего в качестве счетчика используется переменная i.

Вторая форма

for <счетчик2> := <значение2> downto <конечное_значение> do <оператор1>;

После каждой итерации значение <счетчик2> будет уменьшатся на 1.

<значение2> — это начальное значение счетчика. <конечное_значение> : как только значение <счетчик2> станет меньше <конечное_значение>, выполнение цикла прекратится.

Два важных примечания:

  1. Цикл повторяется, пока значение значение счетчика лежит в отрезке .
  2. Изменять значение счетчика внутри тела нельзя!  Вот что выводит компилятор:

Решение задачи:

 
program example_for;

var
  i, N: integer;

begin
  read(N); {предположим, что мы ввели 10}
  for i := 1 to N do write(i, ' '); {количество итераций - 10 - 1 + 1 = 10}
end.

Согласитесь,  данный код проще и лаконичнее, чем все предыдущие. И цикл for — не совсем обычный цикл, в нем нет логического условия. Поэтому цикл с параметром в программировании называют синтаксическим сахаром. Синтаксический сахар — это дополнения синтаксиса языка программирования, которые не добавляют новых возможностей, а делают использование языка более удобным для человека.

Давайте решим пару задач.

For1. Даны целые числа K и N  (N > 0). Вывести N раз число K.

Организовываем простой цикл от 1 до требуемого числа.

program for1;

var
  K, N, i: integer;

begin
  read(K, N);
  for i := 1 to N do write(K, ' '); {Пишем К через пробел }
end.

For2. Даны два целых числа A и B (A < B). Вывести в порядке возрастания все целые числа, расположенные между A и B (включая сами числа A и B), а также количество N этих чисел.

Так как A < B, то цикл должен будет выводить все числа от А до B. Чтобы сосчитать количество чисел, используем формулу: <конечное_значение> — <начальное_значение> + 1.

program for2;

var
  A, B, i, count: integer;

begin
  read(A, B);
  for i := A to B do write(i, ' '); {выписываем числа от меньшего к большему}
  count := B - A + 1; {считаем количество чисел}
  writeln;
  write( 'Количество чисел - ', count);
end.

For9. Даны два целых числа A и B (A < B). Найти сумму квадратов всех целых чисел от A до B включительно.

Организовываем такой же цикл, как и в предыдущей задаче, но одновременно суммируем квадраты всех чисел. Чтобы высчитать квадрат, используем функцию Sqr.

program for9;

var
  A, B, i, S: integer;

begin
  read(A, B);
  S := 0; {PascalABC делает это автоматически, но если у вас другой компилятор советуем обнулять переменные вручную}
  for i := A to B do S := S + Sqr(i);  {складываем все квадраты}
  writeln;
  write( 'Сумма квадратов - ', S);
end.

For13°. Дано целое число N (> 0). Найти значение выражения 1.1 – 1.2 + 1.3 – … (N слагаемых, знаки чередуются). Условный оператор не использовать.

Для того, чтобы поменять знак, каждую итерацию цикла меняем значение специальной переменной на противоположное.

program for13;

var
  N, A, i: integer;
  S: real;

begin
  Write('N = ');
  readln(N); 
  S := 1.1; 
  A := 1; {Сначала положительное}
  for i := 2 to N do {первую итерацию цикла мы уже произвели, поэтому начинаем отсчет с 2}
  begin 
   A := -A; {Теперь отрицательное}
   S := S + A * (1 + i / 10);  {Складываем}
  end;
  Writeln(S:5:1); {Отдадим под дробную часть одно знакоместо}
end.

While1°. Даны положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти длину незанятой части отрезка A.

Каждый раз вычитаем B из А, пока А — В  >= 0.

program while1;

var
  A, B: integer;

begin
  readln(A, B);
  while (A - B) >=  0 do A := A - B; {Пока разница положительная, вычитаем. Необходимо предусмотреть вариант с кратностью А и B, поэтому >=}
  write(A);
end.

While4°. Дано целое число N (> 0). Если оно является степенью числа 3, то вывести True, если не является — вывести False.

Действуем следующим образом: пока N делится нацело на три, делим N нацело. Затем, если N = 1 — число является степенью тройки; если N <> 1, тогда число — не степень тройки. Для того чтобы решить эту задачу, требуется знать, что такое div и   mod,  и как работают логические выражения.

program while4;

var
  N: integer;

begin
  readln(N);
  while N mod 3 = 0 do N := N div 3; {Пока остаток от деления на три равен нулю, делим N нацело } 
  writeln(N = 1); {логическое выражение}
end.

Цикл for

Одним из самых используемых является цикл со счётчиком for. Его синтаксис

for (<инициализация>; <условие продолжения>; <изменение счётчика>){
	<тело цикла>
}

Например, выведем квадраты первых ста чисел.

int i;
for (i = 1; i < 101; i++) {
	printf("%d ", i*i);
}

Одним из замечательных моментов цикла for является то, что он может работать не только с целыми числами.

float num;
for (num = 5.3f; num > 0f; num -= 0.2) {
	printf("%.2f ", num);
}

Этот цикл выведет числа от 5.3 до 0.1.
Цикл for может не иметь некоторых «блоков» кода, например, может отсутствовать инициализация, проверка (тогда цикл становится бесконечным) или изменение счётчика.
Вот пример с интегралом, реализованный с применением счётчика for

#include<conio.h>
#include<stdio.h>

int main() {
	double sum = 0.0;
	double a = 0.0;
	double b = 1.0;
	double h = 0.01;
	double x;
	
	for (x = a; x < b; x += h) {
		sum += x*x * h;
	}
	
	printf("%.3f", sum);
	getch();
}

Давайте рассмотрим кусок кода

double x ;

for (x = a; x < b; x += h) {
	sum += x*x * h;
}

Его можно изменить так

double x = a;

for (; x < b; x+=h) {
	sum += x*x*h;
}

Более того, используя оператор break, можно убрать условие и написать

double x;
for (x = a;; x += h){
	if (x>b){
		break;
	}
	sum += x*x*h;
}

или так

double x = a;
for (;;){
	if (x > b){
		break;
	}
	sum += x*x*h;
	x += h;
}

кроме того, используя оператор «,», можно часть действий перенести

double x ;
for (x = a; x < b; x += h, sum += x*x*h) ;

ЗАМЕЧАНИЕ: несмотря на то, что так можно делать, пожалуйста, не делайте так! Это ухудшает читаемость кода и приводит к трудноуловимым ошибкам.

Давайте решим какую-нибудь практическую задачу посложнее.
Пусть у нас имеется функция f(x). Найдём максимум её производной на отрезке.
Как найти производную функции численно? Очевидно, по определению). Производная функции в точке — это тангенс угла наклона касательной.

Рис. 5 Численное дифференцирование функцииf&ApplyFunction;x′=dxdy

Возьмём точку на кривой с координатами (x; f(x)), сдвинемся на шаг h вперёд, получим точку (x+h, f(x+h)), тогда производная будет

dxdy=f&ApplyFunction;(x+h)-f&ApplyFunction;x(x+h-x)=tg&ApplyFunction;α

То есть, отношение малого приращения функции к малому приращению аргумента.
Внимательный читатель может задать вопрос, почему мы двигаемся вперёд по функции, а не назад. Ну пойдёмте назад

dxdy=f&ApplyFunction;x-f&ApplyFunction;(x-h)h=tg&ApplyFunction;β

Возьмём среднее от этих двух значений, получим

f&ApplyFunction;(x+h)-f&ApplyFunction;(x-h)2h

В общем-то теперь задача становится тривиальной: идём от точки a до точки b и находим минимальное значение производной, а также точку, в которой производная принимает это значение.
Для решения нам понадобятся, как и в задаче с интегралом, переменные для границ области поиска a и b, текущее значение x и шаг h.
Кроме того, необходимо максимальное значение maxVal и координата maxX этого максимального значения.
Для работы возьмём функцию
x•sin&ApplyFunction;x

#include<conio.h>
#include<math.h>
#include<stdio.h>

int main() {
	double a      = 0;
	double b      = 3.0;
	double h      = 0.001;
	double h2     = h * 2.0;
	double maxVal = a*sin(a);
	double maxX   = a;
	double curVal;
	double x;

	// Проходим по всей области от a до b
	// и ищем максимум первой производной
	// Используем функцию x*sin(x)
	for (x = a; x < b; x += h) {
		curVal = ( (x+h)*sin(x+h)-(x-h)*sin(x-h) )/h2;
		if (curVal > maxVal) {
			maxVal = curVal;
			maxX = x;
		}
	}

	printf("max value = %.3f at %.3f", maxVal, maxX);
	getch();
}

На выходе программа выдаёт
max value = 1.391 at 1.077

Рис. 6 График производной функции x*sin(x)

Численное решение даёт такие же (с точностью до погрешности) результаты, что и наша программа.

Вложенные циклы

Пример: Дано целое число K > 0, а также K наборов ненулевых целых чисел. Признак завершения каждого набора — число . Для каждого набора вывести количество его элементов. Вывести также общее количество элементов во всех наборах.
  Пример:

Введите число: 3   
7 8 6 0 
4 5 4 3 1 0 
4 5 6 9 0   
Кол-во элементов для каждого: 3 5 4  
Всего элементов: 12 

Решение: 

begin
  var k=ReadInteger('Введите число');
  assert(k>);
  var st='';
  assert(k>);
  var c=;
  for var i=1 to k do
  begin
    var count=;
    var x=ReadInteger;
    while x<> do
    begin
      count+=1;
      read(x);
    end;
    st+=count.ToString+' ';
    c+=count;
  end;
  Println('Кол-во элементов для каждого =',st);
  println('Всего элементов',c);
end.

Задание 15: Даны целые числа K > 0, N ≥ 0, а также K наборов целых чисел по N элементов в каждом наборе. Найти количество наборов, содержащих число 2. Если таких наборов нет, то вывести .
 Пример:

K = 3, N = 5;
набор 1:  6 4 2 -3  2
набор 2: -1 5 6  3 49
набор 3: 31 7 7 -8 12
...
Правильный ответ: 1 набор.

Табулирование функции двух переменных

Пример: На интервале xn≤x≤xk с шагом Δх, для каждого у из интервала уn≤y≤yk с шагом Δу вычислить значение функции .Например:

если 
xn = 2; xk = 3
уn = -1; yk = 1
шаг Δх = 1, шаг Δy = 0.5

то f1 = 22+ln|-1| = 4
f2 = 22+ln|-0.5|= 3.30685281944005
...

Результат:

x= 2 y= -1 f= 4
x= 2 y= -0.5 f= 3.30685281944005
x= 2 y= 0 f= -∞
x= 2 y= 0.5 f= 3.30685281944005
x= 2 y= 1 f= 4
x= 3 y= -1 f= 9
x= 3 y= -0.5 f= 8.30685281944005
x= 3 y= 0 f= -∞
x= 3 y= 0.5 f= 8.30685281944005
x= 3 y= 1 f= 9

Решение: 

begin
  var (xn, xk) = readreal2('отрезок для x от ... и до ...');
  var(yn, yk) = readreal2('отрезок для y от ... и до ...');
  var hx = readreal('шаг для x');
  var hy = readreal('шаг для y');
  var x = xn;
  var y = yn;
  while x <= xk do
  begin
    while y <= yk do
    begin
      var f = sqr(x) + ln(abs(y));
      print($'x = {x} y = {y} f = {f}');
      y = y + hy;
    end;
    x = x + hx;
    y = yn;
  end
end.

Задача:
Вычислить значение функции:

z(x, у) = sin x + cos y

при всех х, изменяющихся на интервале с шагом Δх = 0.2, и у, изменяющихся на интервале с шагом Δу = 0.1.Результат:

 x=-1.00 y=0.00 z=0.16
 x=-1.00 y=0.10 z=0.15
 x=-1.00 y=0.20 z=0.14
 x=-1.00 y=0.30 z=0.11
 x=-1.00 y=0.40 z=0.08
 x=-1.00 y=0.50 z=0.04
 x=-1.00 y=0.60 z=-0.02
 x=-1.00 y=0.70 z=-0.08
 x=-1.00 y=0.80 z=-0.14
 x=-1.00 y=0.90 z=-0.22
 x=-1.00 y=1.00 z=-0.30

 x=-0.80 y=0.00 z=0.28
...

Метки для break/continue

Бывает, нужно выйти одновременно из нескольких уровней цикла сразу.

Например, в коде ниже мы проходимся циклами по и , запрашивая с помощью координаты с до :

Нам нужен способ остановить выполнение, если пользователь отменит ввод.

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

Метка имеет вид идентификатора с двоеточием перед циклом:

Вызов в цикле ниже ищет ближайший внешний цикл с такой меткой и переходит в его конец.

В примере выше это означает, что вызовом будет разорван внешний цикл до метки с именем .

Таким образом управление перейдёт со строки, помеченной , к .

Можно размещать метку на отдельной строке:

Директива также может быть использована с меткой. В этом случае управление перейдёт на следующую итерацию цикла с меткой.

Метки не позволяют «прыгнуть» куда угодно

Метки не дают возможности передавать управление в произвольное место кода.

Например, нет возможности сделать следующее:

Директива должна находиться внутри блока кода. Технически, подойдет любой маркированный блок кода, например:

…Хотя в 99.9% случаев используется внутри циклов, как мы видели в примерах выше.

К слову, возможно только внутри цикла.

Алгоритмы

Алгоритм – точная конечная последовательность команд, приводящая от исходных данных к искомому результату за конечное число шагов. (Слово происходит от имени великого математика IX в. Мухаммеда ибн Мусы аль-Хорезми.)

Поскольку каждый шаг алгоритма представляет собой действие (команду, которую нужно выполнить), он обязательно должен содержать командное слово – глагол. Существует ничем не оправданное мнение, что описание каждого шага должно начинаться именно с глагола. Такой подход возможен только для линейного алгоритма, а в более сложных случаях он может нанести непоправимый ущерб семантике построения фразы, а, значит, и понятности алгоритма.

Цикл с постусловием (Оператор do … while)

По
поведению он очень похож на предыдущий
цикл while()
,
за тем исключением, что условие проверяется
после выполнения тела цикла. Если условие
окажется ложным, цикл на этом заканчивается,
в противном случае – выполняется
очередная итерация цикла. Этот тип цикла
используется в тех случаях, когда
необходимо выполнить тело цикла хотя
бы один раз. Формат оператора имеет
следующий вид: do

тело цикла while

(выражение);

Блок-схема
цикла с постусловием.

Чтобы
прервать выполнение цикла до того, как
условие станет ложным, можно использовать
оператор break
.
Напечатаем значения х

от
до 9

с использованием цикла do
… while

int
x
=0;

{
printf(«%d\n», x);

}
while (x

printf(«The
end»);

Пример:
Этот цикл выполнится один раз, прежде
чем определит, что х

равно нулю.

int
x=0;

printf(»
х
=%d\n»,
x);

}
while

(
x
!=0);

Произвольный шаг в цикле for

Пример:

Выполнить: Выведите все двухзначные нечетные числа от 11 до 21.

Примерный результат:

11  13  15  17  19  21

Алгоритм:

  • Решение 1. С циклом

Решение 2. С циклом loop

Задание 9 (step):Выполнить: Выведите последовательность 3 5 7 9 … 21 (от 3 до 21 с шагом = 2). Выполнить дважды: с циклом и циклом .

Фрагмент программы:

begin
println('результат с циклом loop');
var ...;
loop ...;
  ...
println('результат с циклом FOR');
for var ...
  ...
end.

Задание 10:Выполнить: Вывести последовательность: 20 18 16 … 2 (от 20 до 2 с шагом = 2). Выполнить дважды: с циклом и циклом .

Функция z(x)

Пример 2:

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

Примерный результат:

1*1*1 = 1   3*3*3 = 27   5*5*5 = 125   7*7*7 = 343

Алгоритм:

Задание 11:Выполнить: Посчитать значение функции для всех на промежутке с шагом = 3. Выполнить дважды: с циклом и циклом .

>Примерный результат:

3*3 = 9   6*6 = 36   9*9 = 81   12*12 = 144

Задание 12:Выполнить: Посчитать значение функции для всех на промежутке с шагом = 5. Выполнить дважды: с циклом и циклом .

Примерный результат:

sqrt(5) = 2.23606797749979   sqrt(10) = 3.16227766016838    
sqrt(15) = 3.87298334620742   sqrt(20) = 4.47213595499958  sqrt(25) = 5

Пример 3:Выполнить: Вывести последовательность: 1.0    1.1   1.2    1.3   1.4    1.5   1.6    1.7  1.8    1.9   2.0.

Алгоритм:

  • Решение 1. С циклом

Решение 2. С циклом

Задание 13:Выполнить: Вывести последовательность 0.1   0.3  0.5   0.7  0.9   1.1. Выполнить дважды: с циклом и циклом .

Примерный результат:

0.1   0.3   0.5   0.7   0.9   1.1

Что такое основы алгоритмизации

Для успешного решения задач на компьютере полезно знать основы алгоритмизации и программирования.

Алгоритмизацией называют раздел информатики, изучающий методы и приёмы построения алгоритмов.

Существуют разные способы отображения алгоритмов. Самым наглядным способом является графический. В нем этапы алгоритма задаются с помощью графических элементов, которые соединяются в блок-схемы и иллюстрируют порядок выполнения задания.

Все блоки соединяют друг с другом в порядке выполнения этапов алгоритма с помощью стрелок, указывающих направление следования по элементам блок-схемы.

Блок-схемы следует чертить по определенным правилам, собранным в ГОСТ 19.701-90 ЕСПД. «Схемы алгоритмов, программ, данных и систем. Обозначения условные и правила выполнения». Блок-схему можно начертить в специальных программах для черчения, которые имеют библиотеки готовых стандартизированных графических элементов.

Резюмируем

  • Циклы — один из основных инструментов любого Python-разработчика. С их помощью всего за пару строчек кода можно совершить сразу множество повторяющихся действий.
  • Циклы состоят из условия и тела. Код в теле выполняется только до тех пор, пока соблюдено условие.
  • В Python есть два вида циклов: while и for. В while условие задаётся явным образом. В for перебирается каждый элемент коллекции.
  • К обоим видам можно применять разные операторы: break для прерывания, continue для пропуска части тела, else для совершения последнего действия перед выходом из цикла.
  • Циклы можно делать бесконечными (тогда программа никогда не завершится или завершится только при выполнении определённого условия) и вкладывать друг в друга.

Больше интересного про код в нашем телеграм-канале. Подписывайтесь!

Циклический алгоритм

Определение

Цикл – это процесс повторения шагов (действий).

Иногда алгоритму необходимо повторять определенные шаги, пока не будет сообщено об остановке или пока не будет достигнуто определенное значение.

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

  1. положить хлопья в миску
  2. добавить молоко в хлопья
  3. ложка хлопьев и молока в рот
  4. повторяйте шаг 3, пока все хлопья и молоко не будут съедены
  5. помыть миску и ложку

Почему важна цикличность? Цикличность позволяет упростить алгоритмы, заявляя, что определенные шаги будут повторяться до тех пор, пока не будет указано обратное. Это делает разработку алгоритмов быстрее и проще, поскольку в них не нужно включать множество ненужных шагов.

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

  1. нанесите зубную пасту на зубную щетку
  2. используйте зубную щетку для чистки зуба 1
  3. используйте зубную щетку, чтобы почистить зуб 2
  4. используйте зубную щетку для чистки зуба 3
  5. используйте зубную щетку для чистки зуба 4
  6. используйте зубную щетку для чистки зуба 5
  7. используйте зубную щетку для чистки зуба 6
  8. используйте зубную щетку для чистки зуба 7
  9. используйте зубную щетку для чистки зуба 8
  10. используйте зубную щетку для чистки зуба 9
  11. используйте зубную щетку для чистки зуба 10
  12. прополоскать зубную щетку

Шаги со 2-го по 11-й, по сути, повторяют один и тот же шаг, просто каждый раз чистят другой зуб. Цикличность может быть использована для значительного упрощения алгоритма. Посмотрите на эту альтернативу:

  1. нанесите зубную пасту на зубную щетку
  2. использовать зубную щетку для чистки зубов
  3. перейти к следующему зубу
  4. повторяйте шаги 2 и 3, пока все зубы не будут чистыми
  5. прополоскать зубную щетку

Этот алгоритм намного проще.

Для составления циклического алгоритма необходимо:

  • Определить, какая из последовательностей операций должна быть положена в основу цикла;
  • Определить входные данные о количестве повторений тела цикла до начала цикла.
  • На основании этих данных определить, какой из видов цикла целесообразнее использовать: цикл с
    параметром, постусловием или предусловием;
  • Установить конечное условие выполнения указанного цикла;
  • Установить входные переменные;
  • Написать алгоритм, отражающий ввод данных, расчет, вывод конечного результата;
  • Протестируйте полученный алгоритм на правильность его функционирования.

Типы циклических алгоритмов

  • Со счетчиком — в которых шаги выполняются определенное число раз;
  • С условием —   в которых тело цикла выполняется, в зависимости от условия.

2.4. Операторы повтора (цикла).

   При решении многих задач некоторую
последовательность действий приходится выполнять несколько раз. Например, чтобы
найти фамилию ученика в списке, надо проверить первую фамилию списка, затем
вторую, третью и т.д. до тех пор, пока не будет найдена нужная или не будет
достигнут конец списка. Такие повторяющиеся действия называются циклами и
реализуются в программе с использованием инструкций циклов.

   В Турбо Паскале различают три вида операторов
организации циклов:

  • while — оператор цикла с предварительным условием (цикл с
    предусловием);
  • repeat — оператор цикла с последующим условием (цикл с
    постусловием);
  • for — оператор цикла с управляющим параметром (цикл с
    параметром).

Упрощенный цикл LOOP

Для того, чтобы реализовать цикл с конкретным числом итераций, не используя счетчик цикла, возможен упрощенный вариант:
  Пример:

// Выводить 5 раз слово "Привет!"
loop 5 do 
  begin
    println('Привет!');
  end;
// ...

Обработка цифр числа

О том, как выделять из числа отдельные его разряды Вы ознакомились в предыдущем уроке.
Теперь рассмотрим более сложный вариант с обработкой цифр числа.

Пример: Дано натуральное число N — количество цифр и последовательность из N цифр. Сформировать положительное число, состоящее из этих цифр, начиная со старшего разряда.Пример:

кол-во; цифры     => результат
N = 3;  3,7,0     => M = 370
N = 1;  0         => M = 0
N = 5;  0,7,0,1,6 => M = 7016
N = 1;  2         => M = 2
N = 2;  0,2       => M = 2

Замечание: В решении должен использоваться один цикл, запрещено использовать математические функции наподобие или .

Решение: 

begin
  var n = readinteger('Введите количество цифр N:');
  var num = ;
  assert(n > );
  println('Введите цифры:');
  loop n do 
  begin
    var a = readinteger;
    num += a;
    num = num * 10;
  end;
  println(num div 10);
end.

Задание 7: Дано целое число. Найти количество его цифр и их сумму.
  Пример:

N = 1205 => Count = 4, Sum = 8
N = -111 => Count = 3, Sum = 3
N =  0   => Count = 1, Sum = 0

Замечание: В решении должен использоваться только один цикл, запрещено использовать математические функции наподобие или .

Пример: Задается целое число. Получить новое число, первый (старший) разряд которого равен последнему (младшему) разряду исходного числа, второй разряд равен предпоследнему разряду исходного числа и т.п.

Пример:

N = 1205 => M = 5021
N = -950 => M = -59
N =    0 => M = 0
N =   -4 => M = -4

Решение: 

begin
  println('Введите целое число:');
  var n = readinteger;
  var (newnum, sign) = (, sign(n));
  n = abs(n);
  while n >  do
  begin
    newnum += (n mod 10);
    newnum *= 10;
    n = n div 10;
  end;
  println(sign * (newnum div 10));
end.

Задание 8: Задаются два числа целого типа одинаковой разрядности. Получить из них новое положительное число, разряды которого — есть наибольшее из соответствующих разрядов исходных чисел.

Пример:

N1 =  29, N2 = -31 => M = 39
N1 = 111, N2 = 103 => M = 113
N1 = -50, N2 =  20 => M = 50

Синтаксис цикла while

В самом простом случае, цикл в python очень похож по своей структуре на условную конструкцию с

И в том и в другом случае, блок кода внутри (инструкция ) будет исполнен тогда и только тогда, когда условие будет иметь значение . Вот только в конструкции с , при успешной проверке, вывод на экран будет выполнен всего один раз, а в случае с фраза «I’m the loop» будет печататься бесконечно.

Такое явление называется бесконечным циклом. У них есть свои определенные смысл и польза, но их мы разберём чуть позже, поскольку чаще всего цикл всё-таки должен как-то заканчиваться. И вполне логично, что для его завершения нужно произвести определенные манипуляции с условием.

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

В Python есть и более сложные, составные условия. Они могут быть сколь угодно длинными, а в их записи используются логические операторы (, , ):

Как можно заметить, управляющая переменная вовсе не обязана являться счётчиком. Она может быть просто логической переменной, чье значение изменяется где-то в самом цикле:

Стоит иметь в виду, что использование неинициализированной переменной в качестве управляющей цикла обязательно приведёт к возникновению ошибки:

Понравилась статья? Поделиться с друзьями:
Грамматический портал
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: