Что представляет собой инструкция начинающаяся со слова while

 

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

Каждый цикл состоит из

  • блока проверки условия повторения цикла
  • тела цикла
 

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

В языке Си следующие виды циклов:

  • while — цикл с предусловием;
  • do…while — цикл с постусловием;
  • for — параметрический цикл (цикл с заданным числом повторений).

Общая форма записи

while (Условие)
{
  БлокОпераций;
}

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

Пример на Си: Посчитать сумму чисел от 1 до введенного k

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
int main() {
  int k;  // объявляем целую переменную key
  int i = 1;
  int sum = 0; // начальное значение суммы равно 0
  printf(«k = «);
  scanf(«%d», &k);   // вводим значение переменной k
  while (i <= k)     // пока i меньше или равно k
  {
    sum = sum + i; // добавляем значение i к сумме
    i++;           // увеличиваем i на 1
  }
  printf(«sum = %d\n», sum); // вывод значения суммы
  getchar(); getchar();
  return 0;
}

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

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

1
2
3
4

while (1)
{
  БлокОпераций;
}

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

Например, если в приведенном выше коде программы ввести k=-1, то получим результат
Цикл while может не выполниться ни разу

Цикл с постусловием do…while

Общая форма записи

do {
  БлокОпераций;
while (Условие);

Цикл do…while — это цикл с постусловием, где истинность выражения, проверяющего Условие проверяется после выполнения Блока Операций, заключенного в фигурные скобки. Тело цикла выполняется до тех пор, пока выражение, проверяющее Условие, не станет ложным, то есть тело цикла с постусловием выполнится хотя бы один раз.

Использовать цикл do…while лучше в тех случаях, когда должна быть выполнена хотя бы одна итерация, либо когда инициализация объектов, участвующих в проверке условия, происходит внутри тела цикла.

Пример на Си. Проверка, что пользователь ввел число от 0 до 10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
#include <stdlib.h> // для использования функции system()
int main() {
  int num;             // объявляем целую переменную для числа
  system(«chcp 1251»); // переходим на русский язык в консоли
  system(«cls»);       // очищаем экран
  do {
    printf(«Введите число от 0 до 10: «); // приглашение пользователю
    scanf(«%d», &num); // ввод числа
  } while ((num < 0) || (num > 10)); // повторяем цикл пока num<0 или num>10
  printf(«Вы ввели число %d», num); // выводим введенное значение num — от 0 до 10
  getchar(); getchar();
  return 0;
}

Результат выполнения:
Цикл do...while

Параметрический цикл for

Общая форма записи

for (Инициализация; Условие; Модификация)
{
  БлокОпераций;
}

for — параметрический цикл (цикл с фиксированным числом повторений). Для организации такого цикла необходимо осуществить три операции:

  • Инициализация — присваивание параметру цикла начального значения;
  • Условие — проверка условия повторения цикла, чаще всего — сравнение величины параметра с некоторым граничным значением;
  • Модификация — изменение значения параметра для следующего прохождения тела цикла.
 

Эти три операции записываются в скобках и разделяются точкой с запятой ;;. Как правило, параметром цикла является целочисленная переменная.
Инициализация параметра осуществляется только один раз — когда цикл for начинает выполняться.
Проверка Условия повторения цикла осуществляется перед каждым возможным выполнением тела цикла. Когда выражение, проверяющее Условие становится ложным (равным нулю), цикл завершается. Модификация параметра осуществляется в конце каждого выполнения тела цикла. Параметр может как увеличиваться, так и уменьшаться.

Пример на Си: Посчитать сумму чисел от 1 до введенного k

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
int main() {
  int k;  // объявляем целую переменную key
  int sum = 0; // начальное значение суммы равно 0
  printf(«k = «);
  scanf(«%d», &k);   // вводим значение переменной k
  for(int i=1; i<=k; i++) // цикл для переменной i от 1 до k с шагом 1
  {
    sum = sum + i; // добавляем значение i к сумме
  }
  printf(«sum = %d\n», sum); // вывод значения суммы
  getchar(); getchar();
  return 0;
}

Результат выполнения
Цикл while
В записи цикла for можно опустить одно или несколько выражений, но нельзя опускать точку с запятой, разделяющие три составляющие цикла.
Код предыдущего примера можно представить в виде

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
int main() {
  int k;  // объявляем целую переменную key
  int sum = 0; // начальное значение суммы равно 0
  printf(«k = «);
  scanf(«%d», &k);   // вводим значение переменной k
  int i=1;
  for(; i<=k; i++) // цикл для переменной i от 1 до k с шагом 1
  {
    sum = sum + i; // добавляем значение i к сумме
  }
  printf(«sum = %d\n», sum); // вывод значения суммы
  getchar(); getchar();
  return 0;
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
int main() {
  int k;  // объявляем целую переменную key
  int sum = 0; // начальное значение суммы равно 0
  printf(«k = «);
  scanf(«%d», &k);   // вводим значение переменной k
  for(int i=1; i<=k; ) // цикл для переменной i от 1 до k с шагом 1
  {
    sum = sum + i; // добавляем значение i к сумме
    i++;           // добавляем 1 к значению i

  }
  printf(«sum = %d\n», sum); // вывод значения суммы
  getchar(); getchar();
  return 0;
}

В цикле for может использоваться операция запятая, — для разделения нескольких выражений. Это позволяет включить в спецификацию цикла несколько инициализирующих или корректирующих выражений. Выражения, к которым применяется операция запятая, будут вычисляться слева направо.

Пример на Си:

1
2
3
4
5
6
7
8
9
10
11
12
13

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
int main() {
  int k;  // объявляем целую переменную key
  printf(«k = «);
  scanf(«%d», &k);   // вводим значение переменной k
  for(int i=1, j=2; i<=k; i++, j+=2) // цикл для переменных
  {                                  // (i от 1 до k с шагом 1) и (j от 2 с шагом 2)
    printf(«i = %d   j = %d\n», i, j); // выводим значения i и j
  }
  getchar(); getchar();
  return 0;
}

Результат выполнения
Цикл for

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

В Си допускаются вложенные циклы, то есть когда один цикл находится внутри другого:

for (i = 0; i<n; i++)  // внешний цикл — Цикл1
{     
  for (j = 0; j<n; j++)   // вложенный цикл — Цикл2
  {
    ;        // блок операций Цикла2
  }
  // блок операций Цикла1;
}

Пример: Вывести числа от 0 до 99, по 10 в каждой строке

1
2
3
4
5
6
7
8
9
10
11
12
13
14

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
int main() {
  for(int i=0; i<10; i++) // цикл для десятков
  {                                  
    for (int j = 0; j < 10; j++) // цикл для единиц
    {
      printf(«%2d «, i * 10 + j); // выводим вычисленное число (2 знакоместа) и пробел
    }
    printf(«\n»); // во внешнем цикле переводим строку
  }
  getchar(); // scanf() не использовался,
  return 0;  // поэтому консоль можно удержать одним вызовом getchar()
}

Результат выполнения
Вложенные циклы: вывод чисел от 0 до 99

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

При выборе цикла необходимо оценить необходимость проверки условия при входе в цикл или по завершении прохождения цикла.
Цикл с постусловием удобно применять в случаях, когда для проверки условия требуется вычислить значение выражения, которое затем будет размещено в теле цикла (см. выше пример ввода числа от 0 до 10).
Цикл c предусловием используется в случае если все переменные, участвующие в выражении, проверяющем условие, проинициализированы заранее, но точное число повторений цикла неизвестно или предполагается сложная модификация переменных, участвующих в формировании условия повторения цикла.
Если цикл ориентирован на работу с параметром, для которого заранее известно число повторений и шаг изменения, то более предпочтительным является параметрический цикл. Очень удобно использовать параметрический цикл при работе с массивами для перебора элементов.

Операторы прерывания и продолжения цикла break и continue

В теле любого цикла можно использовать операторы прерывания цикла — break и продолжения цикла — continue.

Оператор break позволяет выйти из цикла, не завершая его.
Оператор continue позволяет пропустить часть операторов тела цикла и начать новую итерацию.

Пример на Си: Вывести числа от 0 до 99 ниже главной диагонали

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
int main() {
  for(int i=0; i<10; i++) // цикл для десятков
  {                                  
    for (int j = 0; j < 10; j++) // цикл для единиц
    {
      if (j > i) // если число единиц больше числа десятков в числе
        break// выходим из вложенного цикла и переходим к новой строке
      printf(«%2d «, i * 10 + j); // выводим вычисленное число (2 знакоместа) и пробел
    }
    printf(«\n»); // во внешнем цикле переводим строку
  }
  getchar(); // scanf() не использовался,
  return 0;  // поэтому консоль можно удержать одним вызовом getchar()
}

Результат выполнения
Оператор break

Пример на Си: Вывести числа от 0 до 99 исключая числа, оканчивающиеся на 5 или 8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
int main() {
  for(int i=0; i<10; i++) // цикл для десятков
  {                                  
    for (int j = 0; j < 10; j++) // цикл для единиц
    {
      if ((j == 5) || (j == 8)) // если число единиц в числе равно 5 или 8,
        continue;             // переходим к следующей итерации цикла
      printf(«%2d «, i * 10 + j); // выводим вычисленное число (2 знакоместа) и пробел
    }
    printf(«\n»); // во внешнем цикле переводим строку
  }
  getchar(); // scanf() не использовался,
  return 0;  // поэтому консоль можно удержать одним вызовом getchar()
}

Результат выполнения
Оператор continue

При вложенных циклах действия операторов break и continue распространяется только на самую внутреннюю структуру, в которой они содержатся.

Оператор безусловного перехода goto

Общая форма записи

goto Метка;
. . .
Метка : Операция;

Выполнение оператора goto вызывает передачу управления в программе операции, помеченной Меткой. По сути Метка является идентификатором адреса операции, которой должно быть передано управление. Для отделения Метки от Операции используется двоеточие — :.
Метка может располагаться в программе как до оператора goto, так и после него. Имена Меток образуются по тем же правилам, что и имена переменных.

Пример на Си: Вывести все целые числа от 5 до 0.

1
2
3
4
5
6
7
8
9
10
11
12

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
int main() {
  int k = 5;
M1: if (k < 0) // если k<0,
    goto M2;   // переходим на метку M2 (выходим из программы)
  printf(«%d «, k); // выводим значение k
  k—;              // уменьшаем k на 1
  goto M1;          // переходим на метку M1 (повторяем операции выше)
M2: getchar();
  return 0;
}

Результат выполнения
Оператор goto

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

Назад: Язык Си

В прошлой статье мы изучали цикл for – он
используется в тех случаях, когда заранее известно количество итераций,
совершаемых в цикле. Число исполнений цикла for определяется функцией range() или размером коллекции. Если диапазон значений не
известен заранее, необходимо использовать другой цикл – while: он выполняется, пока не наступит
определенное событие (или не выполнится необходимое условие). По этой причине
цикл while называют условным. Вот пример простейшего цикла while – он выполняется, пока пользователь
не введет 0:

        n = int(input())
while n != 0:
    print(n + 5)
    n = int(input())

    

Цикл while также часто называют бесконечным, поскольку он может
выполняться до тех пор, пока пользователь не остановит его нажатием
определенной клавиши. Бесконечные циклы можно создавать намеренно – для
выполнения фонового скрипта, игры, прикладной программы. Но иногда цикл while может
стать бесконечным из-за ошибки. Например, если в приведенном выше коде не
указать ввод новой переменной n = int(input()) в теле цикла, while будет
бесконечно выводить одно и то же значение, пока пользователь не остановит выполнение программы нажатием Ctrl + C.

Управление бесконечным циклом while в Питоне

Самый простой способ управления бесконечным циклом –
использование оператора break.
В приведенном ниже коде список lst генерируется случайным образом, и до начала цикла его длина
неизвестна. Однако выполнение цикла можно оставить, как только список опустеет
в результате многократного выполнения операции pop():

        import random
lst = [i for i in range(random.randint(5, 500))]
while True:
    if not lst:
        break
    print(lst.pop())

    

Если выполнение цикла не остановить сразу же, как только список опустеет, появится ошибка:

        IndexError: pop from empty list
    

Оператор break также помогает сократить количество итераций и прекратить выполнение программы, как только нужное решение найдено. Например, таким образом можно найти наименьший делитель числа n, отличный от 1:

        n = int(input())
i = 2
while True:
    if n % i == 0:
        break
    i += 1
print(i)

    

Помимо break,
управлять бесконечным циклом можно с помощью флагов (сигнальных меток). В
приведенном ниже примере программа бесконечно запрашивает у пользователя ввод
любого слова, пока пользователь не введет exit. Это событие меняет статус цикла на False, и работа программы завершается:

        text = 'Введите любое слово: '
text += '\nИли введите exit для выхода: '

active = True
while active:
    message = input(text)
    if message == 'exit':
        active = False
    else: 
        print(message)

    

Пропуск итераций в цикле while

Оператор continue
можно использовать для пропуска операций, если элементы не соответствуют
заданным критериям. Этот код работает, пока не будет сформирован список из 5
элементов – при этом в список не включаются числа в диапазоне между 90 и 120, а
также число 50:

        sp = []
while len(sp) < 5:
    num = int(input())
    if num == 50 or 90 <= num <= 120:
        continue
    sp.append(num)  
print(sp)

    

Если пользователь введет набор цифр 45 50 121 119
95 105 3 4 7
, в список будут добавлены только числа, соответствующие
критериям:

        [45, 121, 3, 4, 7]
    

Особенности цикла while

1. В цикле while можно использовать опциональный параметр else. В этом примере процедура pop() выполняется, пока
список не опустеет, после чего выводится сообщение Список пуст:

        import random
lst = [i for i in range(random.randint(5, 500))]
while len(lst) > 1:
    print(lst.pop())
else:
    print('Список пуст')

    

2. В цикле while можно использовать любое количество условий и условных
операторов and, or, иnot:

        n = int(input())
while True:
    if n == 0:
        break
    elif n > 50 or n <= -50:
        break
    elif n % 2 == 0:
        break
    print(n / 5)
    n = int(input())

    

3. Цикл while может быть вложенным. Этот код выводит простые числа из
диапазона от 2 до 100:

        i = 2
while(i < 100):
   j = 2
   while j <= i / j:
      if not i % j:
          break
      j = j + 1
   if j > i / j:
       print(f'{i} - простое число')
   i = i + 1

    

4. В качестве вложенных циклов while могут включать в себя циклы for. Этот код, к примеру,
будет бесконечно печатать цифры в диапазоне от 0 до 5:

        while True:
    for i in range(5):
        print(i)

    

5. Любой цикл for можно заменить циклом while, но обратное возможно только в том случае, когда количество итераций можно определить до начала цикла. К примеру, эти циклы while и for равнозначны – оба печатают цифры от 0 до 9:

        i = 0
while i < 10:
    print(i)
    i += 1

for i in range(10):
    print(i)

    

А этот цикл while заменить циклом for невозможно – программа будет бесконечно
возводить в квадрат все введенные пользователем числа, пока не получит 0:

        n = int(input())
while True:
    if n == 0:
        break
    print(n ** 2)
    n = int(input())

    

Практика

Задание 1

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

Пример ввода:

        4
5
6
0

    

Вывод:

        15
    

Решение:

        summa = 0
while True:
    n = int(input())
    summa += n
    if n == 0:
        break
print(summa)

    

Задание 2

Напишите программу, которая получает от пользователя число n > 100, и вычисляет (без
использования методов строк) произведение цифр, из которых n состоит.

Пример ввода:

        335
    

Вывод:

        45
    

Решение:

        n = int(input())
prod = 1

while n:
    prod *= n % 10
    n //= 10
print(prod)

    

Задание 3

Напишите программу, которая получает на вход два числа a и b, и находит наименьшее число c, которое без остатка
делится на a и b.

Пример ввода:

        7
12
    

Вывод:

        84
    

Решение:

        a, b = int(input()), int(input())
c = a
while c % b:
    c += a
print(c)

    

Задание 4

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

Пример ввода:

        о
бойся
Бармаглота
сын
он
так
свиреп
и
дик
а
в глуще
рымит

    

Вывод:

        бойся Бармаглота сын так свиреп дик в глуще рымит
    

Решение:

        st = ''
while len(st) < 50:
    word = input()
    if word[0] in 'аиеёоуыэюя':
        continue
    st += ' ' + word
print(st)

    

Задание 5

Напишите программу для конвертации числа из десятичного системы
в двоичную без использования функции bin().

Пример ввода:

        25
    

Вывод:

        11001
    

Решение:

        n = int(input())
result = ''
while n > 0:
    result = str(n % 2) + result
    n = n // 2
print(result)

    

Задание 6

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

Пример ввода:

        176435
    

Вывод:

        534671
    

Решение:

        n = int(input())
rev = 0
while n!= 0:
    r = n % 10
    rev = rev * 10 + r
    n = n // 10
print(rev)

    

Задание 7

Напишите программу для вычисления факториала числа n без использования функции math.factorial().

Пример ввода:

        7
    

Вывод:

        5040
    

Решение:

        n = int(input())
fact = 1

while n > 1:
    fact *= n 
    n -= 1
print(fact)

    

Задание 8

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

Пример ввода:

        60
    

Вывод:

        60 делится на 2
60 делится на 3
60 делится на 4
60 делится на 5
60 делится на 6
60 делится на 10
60 делится на 12
60 делится на 15
60 делится на 20
60 делится на 30
Таким образом, 60 не является простым числом

    

Решение:

        n = int(input())
flag = False
i = 2
while i < n:
    if n % i ==0:
        flag = True
        print(f'{n} делится на {i}')
    i += 1   
if flag:
    print(f'Таким образом, {n} не является простым числом')
else:
    print(f'{n} - простое число')

    

Задание 9

Напишите программу, использующую вложенный цикл while для вывода треугольника
размером n x n х n, состоящего из символов*.

Пример ввода:

        6
    

Вывод:

        *
**
***
****
*****
******

    

Решение:

        n = int(input())
i, j = 0, 0
while i < n:
    while j <= i:
        print('*', end='')
        j += 1
    j = 0
    i += 1
    print('')

    

Задание 10

Напишите программу для запоминания английских названий месяцев:

1. Русские названия месяцев выводятся в случайном порядке с
помощью метода random.shuffle().

2. Пользователь получает три попытки для написания правильного
названия на английском.

3. После трех неверных попыток программа переходит к другому
слову.

Пример ввода:

        Месяц март по-английски называется: march
Месяц январь по-английски называется: January
Месяц август по-английски называется: august
Месяц май по-английски называется: may
Месяц апрель по-английски называется: aprile
Неверно! Осталось попыток: 2
Месяц апрель по-английски называется: aprill
Неверно! Осталось попыток: 1
Месяц апрель по-английски называется: appril
Неверно! Осталось попыток: 0
Попытки исчерпаны!
Месяц июль по-английски называется: july
Месяц сентябрь по-английски называется: september
Месяц июнь по-английски называется: june
Месяц октябрь по-английски называется: october
Месяц ноябрь по-английски называется: november
Месяц декабрь по-английски называется: december
Месяц февраль по-английски называется: february

    

Вывод:

        Конец игры
Количество правильных ответов: 11
Число ошибок: 3

    

Решение:

        import random
correct, wrong, attempts = 0, 0, 3
months = {'январь': 'January', 'февраль': 'February', 'март': 'March',
          'апрель': 'April', 'май': 'May', 'июнь': 'June',
           'июль': 'July', 'август': 'August', 'сентябрь': 'September',
          'октябрь': 'October', 'ноябрь': 'November', 'декабрь': 'December'}
rand_keys = list(months.keys())
random.shuffle(rand_keys)
for key in rand_keys:
    counter = 0
    while counter < attempts:
        spelling = input(f'Месяц {key} по-английски называется: ')
        if spelling.title() == months[key]:
            correct += 1
            break
        else:
            counter += 1
            wrong += 1
            print(f'Неверно! Осталось попыток: {attempts - counter}')
    else:
        print(f'Попытки исчерпаны!')
        
print('Конец игры')
print(f'Количество правильных ответов: {correct}')
print(f'Число ошибок: {wrong}')

    

Подведем итоги

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

В следующей статье приступим к изучению функций.

***

Содержание самоучителя

  1. Особенности, сферы применения, установка, онлайн IDE
  2. Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
  3. Типы данных: преобразование и базовые операции
  4. Методы работы со строками
  5. Методы работы со списками и списковыми включениями
  6. Методы работы со словарями и генераторами словарей
  7. Методы работы с кортежами
  8. Методы работы со множествами
  9. Особенности цикла for
  10. Условный цикл while
  11. Функции с позиционными и именованными аргументами
  12. Анонимные функции
  13. Рекурсивные функции
  14. Функции высшего порядка, замыкания и декораторы
  15. Методы работы с файлами и файловой системой
  16. Регулярные выражения
  17. Основы скрапинга и парсинга
  18. Основы ООП: инкапсуляция и наследование
  19. Основы ООП – абстракция и полиморфизм
  20. Графический интерфейс на Tkinter
  21. Основы разработки игр на Pygame
  22. Основы работы с SQLite
  23. Основы веб-разработки на Flask
  24. Основы работы с NumPy
  25. Основы анализа данных с Pandas

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

Цикл while

«While» переводится с английского как «пока». Но не в смысле «до свидания», а в смысле «пока имеем это, делаем то».

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

while логическое_выражение {
    выражение 1;
    …
    выражение n;
}

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

В случае while, после того как его тело выполнено, поток возвращается к заголовку цикла и снова проверяет условие. Если логическое выражение возвращает истину, то тело снова выполняется. Потом снова возвращаемся к заголовку и так далее.

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

Рассмотрите блок-схему цикла while.

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

С циклом while возможны две исключительные ситуации:

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

  • Если логическое выражение в заголовке while никогда не возвращает False, а всегда остается равным True, то цикл никогда не завершится, если только в его теле нет оператора принудительного выхода из цикла (break) или вызовов функций выхода из программы – quit(), exit() в случае Python. Если цикл повторяется и повторяется бесконечное количество раз, то в программе происходит зацикливание. В это время она зависает и самостоятельно завершиться не может.

Вспомним наш пример из урока про исключения. Пользователь должен ввести целое число. Поскольку функция input() возвращает строку, то программный код должен преобразовать введенное к целочисленному типу с помощью функции int(). Однако, если были введены символы, не являющиеся цифрами, то возникает исключение ValueError, которое обрабатывается веткой except. На этом программа завершается.

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

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

n = input("Введите целое число: ")
 
while type(n) != int:
    try:
        n = int(n)
    except ValueError:
        print("Неправильно ввели!")
        n = input("Введите целое число: ")
 
if n % 2 == 0:
    print("Четное")
else:
    print("Нечетное")

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

Примечание 2. В выражении type(n) != int с помощью функции type() проверяется тип переменной n. Если он не равен int, то есть значение n не является целым числом, а является в данном случае строкой, то выражение возвращает истину. Если же тип n равен int, то данное логическое выражение возвращает ложь.

Примечание 3. Оператор % в языке Python используется для нахождения остатка от деления. Так, если число четное, то оно без остатка делится на 2, то есть остаток будет равен нулю. Если число нечетное, то остаток будет равен единице.

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

Здесь в ветке try совершается попытка преобразования строки к целочисленному типу. Если она была удачной, то ветка except пропускается, и поток выполнения снова возвращается к заголовку while.

Теперь n связана с целым числом, следовательно, ее тип int, который не может быть не равен int. Он ему равен. Таким образом логическое выражение type(n) != int возвращает False, и весь цикл завершает свою работу. Далее поток выполнения переходит к оператору if-else, находящемуся в основной ветке программы. Здесь могло бы находиться что угодно, не обязательно условный оператор.

Вернемся назад. Если в теле try попытка преобразования к числу была неудачной, и было выброшено исключение ValueError, то поток выполнения программы отправляется в ветку except и выполняет находящиеся здесь выражения, последнее из которых просит пользователя снова ввести данные. Переменная n теперь имеет новое значение.

После завершения except снова проверяется логическое выражение в заголовке цикла. Оно даст True, так как значение n по-прежнему строка.

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

Рассмотрим следующий пример:

total = 100
 
i = 0
while i < 5:
    n = int(input())
    total = total - n
    i = i + 1
 
print("Осталось", total)

Сколько раз «прокрутится» цикл в этой программе, то есть сколько итераций он сделает? Ответ: 5.

  1. Сначала переменная i равна 0. В заголовке цикла проверяется условие i < 5, и оно истинно. Тело цикла выполняется. В нем меняется значение i, путем добавления к нему единицы.

  2. Теперь переменная i равна 1. Это меньше пяти, и тело цикла выполняется второй раз. В нем i меняется, ее новое значение 2.

  3. Два меньше пяти. Тело цикла выполняется третий раз. Значение i становится равным трем.

  4. Три меньше пяти. На этой итерации i присваивается 4.

  5. Четыре по прежнему меньше пяти. К i добавляется единица, и теперь ее значение равно пяти.

Далее начинается шестая итерация цикла. Происходит проверка условия i < 5. Но поскольку теперь оно возвращает ложь, то выполнение цикла прерывается, и его тело не выполняется.

«Смысловая нагрузка» данного цикла – это последовательное вычитание из переменной total вводимых чисел. Переменная i в данном случае играет только роль счетчика итераций цикла. В других языках программирования для таких случаев предусмотрен цикл for, который так и называется: «цикл со счетчиком». Его преимущество заключается в том, что в теле цикла не надо изменять переменную-счетчик, ее значение меняется автоматически в заголовке for.

В языке Python тоже есть цикл for. Но это не цикл со счетчиком. В Питоне он предназначен для перебора элементов последовательностей и других сложных объектов. Данный цикл и последовательности будут изучены в последующих уроках.

Для while наличие счетчика не обязательно. Представим, что надо вводить числа, пока переменная total больше нуля. Тогда код будет выглядеть так:

total = 100
 
while total > 0:
    n = int(input())
    total = total - n
 
print("Ресурс исчерпан")

Сколько раз здесь выполнится цикл? Неизвестно, все зависит от вводимых значений. Поэтому у цикла со счетчиком известно количество итераций, а у цикла без счетчика – нет.

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

Примечание 1. Не обязательно в выражениях total = total - n и i = i + 1 повторять одну и ту же переменную. В Python допустим сокращенный способ записи подобных выражений: total -= n и i += 1.

Примечание 2. При использовании счетчика он не обязательно должен увеличиваться на единицу, а может изменяться в любую сторону на любое значение. Например, если надо вывести числа кратные пяти от 100 до 0, то изменение счетчика будет таким i = i - 5, или i -= 5.

Примечание 3. Для счетчика не обязательно использовать переменную с идентификатором i. Можно назвать переменную-счетчик как угодно. Однако так принято в программировании, что счетчики обозначают именами i и j (иногда одновременно требуются два счетчика).

Практическая работа

  1. Измените последний код из урока так, чтобы переменная total не могла уйти в минус. Например, после предыдущих вычитаний ее значение стало равным 25. Пользователь вводит число 30. Однако программа не выполняет вычитание, а выводит сообщение о недопустимости операции, после чего осуществляет выход из цикла.

  2. Используя цикл while, выведите на экран для числа 2 его степени от 0 до 20. Возведение в степень в Python обозначается как **. Фрагмент вывода:

    ...
      32
      64
     128
     256
     512
    1024
    ...

Примеры решения и дополнительные уроки в pdf-версии

курса

Назад в начало

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

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

i = 0 # объявление переменной i для условия цикла

while i < 5: # ключевое слово ‘while’ и условие выполнение цикла

    # тело цикла

    print(i) # вывод значения переменной i

    i += 1 # увеличение значения переменной i на единицу

# Вывод:

>> 0

>> 1

>> 2

>> 3

>> 4

Цикл while может быть бесконечным.

i = 0

while True: # условие всегда истинно

    print(i)

    i += 1

# Вывод:

>> 0

>> 1

>> 2

>> 3

>> 4



>> 999



# Это может продолжаться долго…

Выполнение цикла можно прерывать с помощью оператора break.

i = 0

while 1: # условие всегда истинно

    if i == 3: # если i равно 3, то вызываем оператор break

        break # оператор break прерывает выполнение цикла

    print(i)

    i += 1

# Вывод:

>> 0

>> 1

>> 2

Оператор continue начинает повторение цикла заново.

i = 0

while i < 5:

    i += 1 #

    if i % 2 == 1: # если значение i нечетно, то вызываем оператор continue

        continue # оператор continue начинает повторение цикла заново

    # в случае вызова continue код ниже не выполнится

    print(i)

# Вывод:

>> 0

>> 2

>> 4

Как и для цикла for, для цикла while мы можем записать конструкцию else.

x = 1

while x < 5:

    print(x)

    x += 1

else:

    print(‘Цикл завершен’)

# Вывод:

>> 1

>> 2

>> 3

>> 4

>> Цикл завершен

Примеры

1. Числа от A до B

# Пользователь вводит числа A и B (A > B). Выведите все числа от A до B включительно.


A = int(input(‘Введите число: ‘))

B = int(input(‘Введите число: ‘))

while A >= B:

    print(A)

    A -= 1

# Ввод:

>> 12

>> 7

# Вывод:

>> 12

>> 11

>> 10

>> 9

>> 8

>> 7

# Ввод:

>> 5

>> 2

# Вывод:

>> 5

>> 4

>> 3

>> 2

2. Много чисел

# Пользователь вводит числа до тех пор, пока не введет 0.

# Выведите количество введенных чисел (0 считать не нужно).


n = int(input(‘Введите число: ‘))

counter = 0 # счетчик введенных чисел

while n: # n неявно преобразуется в тип bool

    # если n равно 0, то выполнение цикла прервется

    n = int(input(‘Введите число: ‘)) # вводим очередное число

    counter += 1 # увеличиваем счетчик


print(f‘Количество чисел {counter})

# Ввод:

>> 1

>> 10

>> 100

>> 1000

>> 0

# Вывод:

>> Количество чисел 4

3. Наименьший делитель

# Пользователь вводит число N (N > 1). Выведите его наименьший делитель.

N = int(input(‘Введите число: ‘))

div = 2

while N % div != 0:

    div += 1

print(f‘Наименьший делитель равен {div})

# Ввод:

>> 10

# Вывод:

>> Наименьший делитель равен 2

# Ввод:

>> 15

# Вывод:

>> Наименьший делитель равен 3

# Ввод:

>> 17

# Вывод:

>> Наименьший делитель равен 17

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

1. Четные от A до B

Пользователь вводит числа A и B (A > B). Выведите четные числа от A до B включительно.

# Ввод:

>> 10

>> 1

# Вывод:

>> 10

>> 8

>> 6

>> 4

>> 2

2. От A до B на три

Пользователь вводит числа A и B (A < B, A меньше B). Выведите числа от A до B включительно, которые делятся на три.

# Ввод:

>> 1

>> 15

# Вывод:

>> 3

>> 6

>> 9

>> 12

>> 15

3. Сумма чисел

Пользователь вводит числа до тех пор, пока не введет 0. Выведите сумму введенных чисел (0 считать не нужно).

# Ввод:

>> 1

>> 15

>> 10

>> 11

>> 2

>> 0

# Вывод:

>> Сумма равна: 39

4. Максимум

Пользователь вводит числа до тех пор, пока не введет 0. Выведите максимальное введенное число (0 считать не нужно).

# Ввод:


>> 1

>> 15

>> 10

>> 11

>> 2

>> 0

# Вывод:

>> Максимум равен: 15

5. Минимум

Пользователь вводит числа до тех пор, пока не введет 0. Выведите минимальное введенное число (0 считать не нужно).

# Ввод:

>> 1

>> 15

>> 10

>> 11

>> 2

>> 0 # 0 не входит в последовательность

# Вывод:

>> Минимум равен: 1

6. Факториал

Пользователь вводит число N. Выведите факториал число N. Факториал числа N — это произведение всех чисел от 1 до N включительно. Например, факториал числа 5 равен 120.

# Ввод:

>> 5

# Вывод:

>> 120

# Ввод:

>> 3

# Вывод:

>> 6

# Ввод:

>> 4

# Вывод:

>> 24

7. Фибоначчи (финальный босс)

Пользователь вводит число N. Выведите N-ное по счету число Фибоначчи. Последовательность чисел Фибоначчи рассчитывается по такой формуле: F(1) = 1, F(2) = 1, F(K) = F(K-2) + F(K-1). Идея такая: каждое следующее число равно сумму двух предыдущих.

Первые 10 чисел последовательности: 1 1 2 3 5 8 13 21 34 55 …

# Ввод:

>> 5

# Вывод:

>> 5

# Ввод:

>> 10

# Вывод:

>> 55

# Ввод:

>> 8

# Вывод:

>> 21

Добавлено 29 мая 2021 в 13:05

Введение в циклы

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

Например, предположим, что вы хотите вывести все числа от 1 до 10. Без циклов вы можете попробовать что-то вроде этого:

#include <iostream>
 
int main()
{
    std::cout << "1 2 3 4 5 6 7 8 9 10";
    std::cout << " done!";
    return 0;
}

Хотя это выполнимо, но всё усложняется, когда вы хотите напечатать больше чисел: что, если вы хотите напечатать все числа от 1 до 1000? А это совсем немного! Но такую программу возможно написать, потому что во время компиляции мы знаем, сколько чисел мы хотим напечатать.

Теперь давайте немного изменим требования. Что, если бы мы хотели попросить пользователя ввести число, а затем распечатать все числа от 1 до числа, введенного пользователем? Число, которое введет пользователь, неизвестно во время компиляции. Итак, как мы можем решить эту проблему?

Инструкции while

Инструкция while (также называемая циклом while) является самым простым из трех типов циклов, предоставляемых C++, и имеет определение, очень похожее на определение оператора if:

while (условие)
    инструкция;

Инструкция while объявляется с помощью ключевого слова while. При выполнении инструкции while вычисляется условие. Если условие истинно, выполняется связанная инструкция.

Однако, в отличие от оператора if, после завершения выполнения инструкции управление возвращается в начало оператора while, и процесс повторяется. Это означает, что оператор while будет продолжать цикл до тех пор, пока условие будет истинным.

Давайте посмотрим на простой цикл while, который выводит все числа от 1 до 10:

#include <iostream>
 
int main()
{
    int count{ 1 };
    while (count <= 10)
    {
        std::cout << count << ' ';
        ++count;
    }
 
    std::cout << "done!";
 
    return 0;
}

Эта программа выводит:

1 2 3 4 5 6 7 8 9 10 done!

Давайте подробнее рассмотрим, что делает эта программа. Сначала счетчик count инициализируется значением 1, которое является первым числом, которое мы напечатаем. Условие count <= 10 истинно, поэтому инструкция выполняется. В этом случае наша инструкция – это блок, поэтому все инструкции в этом блоке будут выполнены. Первая инструкция в блоке печатает 1 и пробел, а вторая увеличивает count до 2. Теперь управление возвращается к началу оператора while, и снова вычисляется условие. 2 <= 10 вычисляется как true, поэтому блок кода выполняется снова. Цикл будет повторяться до тех пор, пока count не станет равен 11, после чего значение 11 <= 10 будет ложным, и инструкция, связанная с циклом, будет пропущена. На этом выполнение цикла заканчивается.

Хотя эта программа представляет собой немного больше кода, чем набор всех чисел от 1 до 10, подумайте, насколько легко было бы изменить эту программу для печати всех чисел от 1 до 1000: всё, что вам нужно сделать, это изменить count <= 10 на count <= 1000.

Инструкции while, которые изначально вычисляются как ложные

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

#include <iostream>
 
int main()
{
    int count{ 15 };
    while (count <= 10)
    {
        std::cout << count << ' ';
        ++count;
    }
 
    std::cout << "done!";
 
    return 0;
}

Условие 15 <= 10 вычисляется как false, поэтому связанная инструкция пропускается. Программа продолжается, и единственное, что будет напечатано – это «done!».

Бесконечные циклы

И наоборот, если условное выражение всегда истинно, цикл while будет выполняться вечно. Это называется бесконечным циклом. Вот пример бесконечного цикла:

#include <iostream>
 
int main()
{
    int count{ 1 };
    while (count <= 10) // это условие никогда не будет ложным
    {
        std::cout << count << ' '; // поэтому эта строка будет выполняться многократно
    }
 
    return 0; // эта строка никогда не будет выполнена
}

Поскольку в этой программе count никогда не увеличивается, условие count <= 10 всегда будет истинным. Следовательно, цикл никогда не завершится, и программа будет печатать «1 1 1 1 1» … всегда.

Преднамеренные бесконечные циклы

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

while (true)
{
  // этот цикл будет выполняться вечно
}

Единственный способ выйти из бесконечного цикла – использовать инструкцию return, инструкцию break, инструкцию exit, инструкцию goto, сгенерировать исключение, или пользователю убить программу.

Вот глупый пример, демонстрирующий это:

#include <iostream>
 
int main()
{
 
    while (true) // бесконечный цикл
    {
        std::cout << "Loop again (y/n)? ";
        char c{};
        std::cin >> c;
 
        if (c == 'n')
            return 0;
    }
 
    return 0;
}

Эта программа будет непрерывно повторяться до тех пор, пока пользователь не введет n в качестве входных данных, после чего оператор if вычислит значение true,и связанный с ним return 0; вызовет выход из функции main(), завершив программу.

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

Лучшая практика


Для преднамеренных бесконечных циклов используйте while (true).

Переменные цикла

Часто нам нужно, чтобы цикл выполнялся определенное количество раз. Для этого обычно используется переменная цикла, часто называемая счетчиком. Переменная цикла – это целочисленное значение, которое используется для подсчета количества выполнений цикла. В приведенных выше примерах переменной цикла является переменная count.

Переменным цикла часто дают простые имена, такие как i, j или k. Однако если вы хотите знать, где в вашей программе используется переменная цикла, и вы используете функцию поиска по i, j или k, функция поиска вернет половину вашей программы! По этой причине некоторые разработчики предпочитают использовать такие имена переменных цикла, как iii, jjj или kkk. Поскольку эти имена более уникальны, это значительно упрощает поиск переменных цикла и помогает им выделяться как переменные цикла. Еще лучше – использовать «настоящие» имена переменных, такие как count, или имя, которое дает более подробную информацию о том, что вы подсчитываете (например, userCount).

Переменные цикла должны быть со знаком

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

#include <iostream>
 
int main()
{
    unsigned int count{ 10 };
 
    // счетчик от 10 до 0
    while (count >= 0)
    {
        if (count == 0)
        {
            std::cout << "blastoff!";
        }
        else
        {
            std::cout << count << ' ';
        }
        --count;
    }
 
    return 0;
}

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

Оказывается, эта программа представляет собой бесконечный цикл. Она начинается, как и предполагалось, с печати 10 9 8 7 6 5 4 3 2 1 blastoff!, но затем сходит с рельсов и начинает обратный отсчет с 4294967295. Почему? Потому что условие цикла count >= 0 никогда не будет ложным! Когда count равен 0, условие 0 >= 0 истинно. Затем выполняется --count, и count переходит к 4294967295 (предполагается, что int занимает 32 бита). И поскольку 4294967295 >= 0 истинно, программа продолжается. Поскольку count не имеет знака, он никогда не может быть отрицательным, а поскольку он никогда не может быть отрицательным, цикл не завершится.

Лучшая практика


Переменные цикла должны иметь тип (signed) int.

Выполнение чего-то при каждой N-ой итерации

Каждый раз, когда цикл выполняется, это называется итерацией.

Часто мы хотим делать что-то на каждой 2-й, 3-й или 4-й итерации, например, выводить символ новой строки. Это легко сделать с помощью оператора взятия остатка от деления для нашего счетчика:

#include <iostream>
 
// Перебираем все числа от 1 до 50
int main()
{
    int count{ 1 };
    while (count <= 50)
    {
        // выводим число (для форматирования добавляем 0 перед числами меньше 10)
        if (count < 10)
        {
            std::cout << '0';
        }
 
        std::cout << count << ' ';
 
        // если переменная цикла делится на 10, печатаем символ новой строки
        if (count % 10 == 0)
        {
            std::cout << '\n';
        }
            
        // увеличиваем счетчик цикла
        ++count;
    }
 
    return 0;
}

Эта программа дает следующий результат:

01 02 03 04 05 06 07 08 09 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50

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

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

#include <iostream>
 
// Цикл от 1 до 5
int main()
{
    int outer{ 1 };
    while (outer <= 5)
    {
        // цикл от 1 до outer
        int inner{ 1 };
        while (inner <= outer)
        {
            std::cout << inner << ' ';
            ++inner;
        }
 
        // выводим символ новой строки в конце каждой строки
        std::cout << '\n';
        ++outer;
    }
 
    return 0;
}

Эта программа печатает:

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Небольшой тест

Вопрос 1

Почему в приведенной выше программе переменная inner объявляется внутри блока while, а не сразу после объявления outer?

Ответ

Переменная inner объявляется внутри блока while, поэтому она создается (и повторно инициализируется значением 1) каждый раз при выполнении внешнего цикла. Если бы переменная inner была объявлена перед внешним циклом while, ее значение никогда не было бы сброшено до 1, или нам пришлось бы делать это с помощью оператора присваивания. Кроме того, поскольку переменная inner используется только внутри блока внешнего цикла while, имеет смысл объявить ее там. Помните, что мы объявляем переменные в минимально возможной области видимости!


Вопрос 2

Напишите программу, которая печатает буквы от a до z вместе с их кодами ASCII.

Подсказка

Чтобы напечатать символы как целые числа, вы должны использовать static_cast.

Ответ

#include <iostream>
 
int main()
{
    char myChar{ 'a' };
    while (myChar <= 'z')
    {
        std::cout << myChar << ' ' << static_cast<int>(myChar) << '\n';
        ++myChar;
    }
 
    return 0;
}

Вопрос 3

Инвертируйте пример вложенных циклов, чтобы он напечатал следующее:

5 4 3 2 1
4 3 2 1
3 2 1
2 1
1

Ответ

#include <iostream>
 
// Цикл от 5 до 1
int main()
{
	int outer{ 5 };
	while (outer >= 1)
	{
		// цикл от inner до 1
		int inner{ outer };
		while (inner >= 1)
        {
			std::cout << inner-- << ' ';
        }
 
		// выводим символ новой строки в конце каждой строки
		std::cout << '\n';
		--outer;
	}
 
	return 0;
}

Вопрос 4

Теперь напечатайте числа так:

        1
      2 1
    3 2 1
  4 3 2 1
5 4 3 2 1

Подсказка: сначала выясните, как печатать вот так:

X X X X 1
X X X 2 1
X X 3 2 1
X 4 3 2 1
5 4 3 2 1

Ответ

#include <iostream>
 
int main()
{
	// Есть 5 строк, мы можем выполнять цикл от 1 до 5
	int outer{ 1 };
 
	while (outer <= 5)
	{
		// Элементы строки отображаются в порядке убывания, поэтому начинаем с 5 и идем к 1
		int inner{ 5 };
 
		while (inner >= 1)
		{
			// Первое число в любой строке совпадает с номером строки
            // Значит, число должно быть напечатано, только если оно <= номеру строки,
            // в противном случае - пробел
			if (inner <= outer)
				std::cout << inner << ' ';
			else
				std::cout << "  "; // дополнительные пробелы исключительно для форматирования
 
			--inner;
		}
 
		// Строка напечатана, перейти к следующей строке
		std::cout << '\n';
 
		++outer;
	}
 
	return 0;
}

Теги

C++ / CppLearnCppwhileДля начинающихОбучениеПрограммированиеЦикл

Понравилась статья? Поделить с друзьями:
  • Что означает процедура банкротства физического лица пошаговая инструкция
  • Что представляет собой должностная инструкция
  • Что означает после еды в инструкции по применению
  • Что построить из лего классик без инструкции идеи
  • Что отражается в должностной инструкции