Оператор while

Оператор while


Содержание


1. Назначение оператора while. Общая форма оператора while

Оператор while предназначен для организации циклического процесса в программе. В языке программирования Python оператор while используется в случаях, если количество повторений цикла заранее неизвестно (в отличие от оператора for). В операторе while следующий шаг итерации цикла определяется на основе истинности некоторого условия.

Общая форма оператора while имеет вид

while условие:
    инструкции

здесь

  • условие – условие выполнения строки (строк) инструкции;
  • инструкции – один оператор или набор операторов, которые выполняются если значение условие=True. Если значение условие становится равным False, то происходит завершение выполнения оператора цикла while.

   

2. Примеры решения задач на оператор while
2.1. Вычисление суммы элементов списка

Условие задачи. Задан некоторый список A содержащий целые числа. Используя инструкцию while разработать программу, которая вычисляет сумму элементов списка.

# сформировать список и инициализировать значениями переменные
A=[1,3,5,8,-3,10]
i=0
summ=0 # искомая сумма

# цикл вычисления суммы
while i<len(A):
    summ=summ+A[i]
    i=i+1
print("summ = ", summ) # summ = 24

Для определения количества элементов списка A используется функция len(A).

В результате выполнения вышеприведенного кода будет получен результат

summ = 24

   

2.2. Создать список заданной длины и записать в него заданное число

В примере, с помощью цикла while, формируются два списка A и B разными способами.

# создать список элементов
A=[]
n=10
i=0

while i<n: # в цикле формируется список [0,1,2,3,4,5,6,7,8,9]
    A=A+[i]
    i=i+1

# сформировать новый список
B=[]
k=5 # число, которое записывается в список B
n=4 # количество чисел

# цикл while
i=0
while i<n: # формируется список [5,5,5,5]
    B = B + [k]
    i=i+1

# вывести список A
i=0
print("Список A:")
while i<len(A):
    print(A[i])
    i=i+1

# вывести список B
i=0
print("Список B:")
while i<len(B):
    print(B[i])
    i=i+1

В результате выполнения вышеприведенного кода будет получен следующий результат

Список A:
0
1
2
3
4
5
6
7
8
9
Список B:
5
5
5
5

   

2.3. Создание списка чисел по условию

Условие задачи. Задано число a (1<a<1.5). Из чисел 1+1/2, 1+1/3, 1+1/4 …, напечатать те, которые не меньше a.

Решение.

a=1.08
print("Число a = ", a)
n=2
t=1+1/n
print("Числа, которые не меньше a:")
while t>a:
    print(t)
    n=n+1
    t=1+1/n
print("-----------------------")

В результате выполнения вышеприведенного кода будет выведен следующий результат

Число a = 1.08
Числа, которые не меньше a:
1.5
1.3333333333333333
1.25
1.2
1.1666666666666667
1.1428571428571428
1.125
1.1111111111111112
1.1
1.0909090909090908
1.0833333333333333
-----------------------

   

3. Понятие вложенной инструкции (оператора) while

Инструкция while может иметь несколько уровней вложения. Она может быть внешней для других инструкций, например, for, if, while. Также инструкция while может размещаться внутри других инструкций (for, if, while). Количество уровней (глубина) вложений неограничено.



   

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

В цикле while используется вложенная инструкция if.

# Подсчет количества вхождений заданной строки в списке строк
# Входные данные
LIST = [ 'abc', 'bcd', 'xvm', 'abc', 'abd', 'bcd', 'abc' ]
ITEM = str(input('Введите строку: '))

# вычисление
i=0
k=0
while i<len(LIST):
    if LIST[i]==ITEM:
        k=k+1
    i=i+1
print ("k = ", k)

В результате выполнения вышеприведенного кода будет получен результат

Задайте строку: bcd
k = 2

   

4.2. Определение месяца, числа и дня недели по номеру дня в году

Задано целое число k (1<k<365). Написать фрагмент кода, который определяет:

  • каким будет k-й день года: выходной (суббота, воскресенье);
  • какая будет дата (месяц и число).

В программе использовать цикл while.

Текст программы следующий:

# входные данные
print("Входные данные: ")
k = int(input('Номер дня в году: '))
first_day=3 # первый день года, 3 - среда
print("Первый день недели в году: ", first_day)

# вспомогательный список - количество дней в месяцах года
MONTHS=[31,28,31,30,31,30,31,31,30,31,30,31]

# начальная инициализация перед вычислением
tk=1 # текущее значение дня
tday=first_day # текущий день недели
tmonth=1 # текущий номер месяца
tday2=1 # текущий номер дня в месяце tmonth

# цикл while - вычисление
while tk<k:
    # перейти на следующий день
    tday=tday+1
    tday2=tday2+1
    tk=tk+1

    # скорректировать день недели
    if tday>7:
        tday=1

    # скорректировать день месяца и номер месяца
    if tday2>MONTHS[tmonth-1]:
        tday2=1
        tmonth=tmonth+1 # перейти на следующий месяц
print("--------------------")
print("Результат: ")
print("День недели: ", tday)
print("Номер месяца: ", tmonth)
print("Число: ", tday2)

В вышеприведенном коде для вычисления используются дополнительные внутренние переменные (объекты) tk, tday, tmonth, td2 и список MONTHS, содержащий количество дней в любом месяце года. В примере цикл while содержит несколько вложенных инструкций присваивания и две инструкции if.

В результате выполнения вышеприведенного кода будет получен следующий результат:

Входные данные:
Номер дня в году: 256
Первый день недели в году: 3
--------------------
Результат:
День недели: 6
Номер месяца: 9
Число: 13

Как можно увидеть, 256-й день в невисокосном году попадает на 13 сентября, который соответствует Дню программиста (а что еще может быть?).

   

4.3. Подсчет количества вхождений заданного символа в строке

Задан список строк. В каждой строке подсчитать количество вхождений заданного символа

Программный код на языке Python будет следующий

# количество вхождений символа в списке строк
ListStr=['text', 'file', 'notepad', 'windows', 'hello']
c='t' # символ 't'
List=[] # количество вхождений
i=0
while i<5:
    j=0
    k=0
    while j<len(ListStr[i]):
        if c==ListStr[i][j]:
            k=k+1
        j=j+1
    ListK=ListK+[k]
    i=i+1
print(ListK) # ListK = [2, 0, 1, 0, 0]

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

[2, 0, 1, 0, 0]

   

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

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

# задан некоторый список A размером 3*4
A=[ [1, 3, -2, -3], [0, 8, 1, -3], [2, 5, 3, 1]]

# обнуление списка A
# использование вложенного оператора while
i=0 # строки
while i<3:
    j=0
    while j<len(A[i]):
        A[i][j]=0
        j=j+1
    i=i+1

# вывод списка A
print("Список A:")
i=0
while i<3:
    j=0
    while j<len(A[i]):
        print("A[", i,"][",j,"] = ", A[i][j])
        j=j+1
    i=i+1
print("--------------------")

   

5.2. Задача о быках, коровах и телятах

Условие задачи. Имеется в наличии 100 рублей. Сколько быков, коров и телят можно купить на все эти деньги, если плата за быка — 10 рублей, плата за корову — 5 рублей, плата за теленка — 0.5 рублей. Обязательно нужно купить минимум по одному экземпляру каждого вида (один бык, одна корова, один теленок). Вывести все возможные варианты оплаты.

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

# задача о быках, коровах и телятах
x=1
while x<=9:
    y=1
    while y<=19:
        z=1
        while z<=198:
            cost=10*x+5*y+0.5*z
            if cost==100:
                print("x=", x,"; y=", y, "z=", z)
            z=z+1
        y=y+1
    x=x+1

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

   

6. Общая форма оператора while, предусматривающего использование инструкции break

Оператор while имеет и другую, более полную форму использования, которая предусматривает использование инструкции break. В этом случае общая форма оператора while следующая:

while <условие1>:
    <инструкции1>
    if <условие2>: break # выйти из цикла
    if <условие3>: continue # перейти в начало цикла до условие1
else:
    <инструкции2> # выполняется, если не была использована инструкция break

здесь

  • условие1 определяет, нужно ли выполнять следующую итерацию цикла. Если значение условие1 равно True (истинно), то выполняется следующая итерация цикла;
  • условие2 определяет, должен ли выполняться оператор break;
  • условие3 определяет, должен ли выполняться оператор continue;
  • инструкции1, инструкции2 – один или несколько операторов.

Вышеприведенная форма оператора цикла while работает по следующему принципу. Сначала проверяется условие1. Если условие1 истинно (равно True), то выполняются инструкции1.

В теле оператора цикла while также проверяются условия условие2, условие3. Если выполняется условие2, то происходит выход из цикла. Если выполняется условие3, то происходит переход к следующей итерации цикла до проверки условие1.

Если в теле цикла не выполнится оператор break, то это значит, что пройдены все возможные итерации. В этом случае определяются соответствующие инструкции в блоке else оператора while.

   

7. Пример использования оператора while, предусматривающего использование инструкции break

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

# задан список
List=[2,8,3,4,3,5,2,1,0,3,4,4,5,8,7,7,5]

print("Заданный список:", List)

# ввод искомого елемента
t = int(input("Элемент, который нужно найти: "))

# цикл
i=0
while i<len(List):
    if List[i]==t:
        print("Элемент ", t, " есть в списке")
        break
    i=i+1
else:
    print("Елемента ", t, " нету в списке")

В вышеприведенном цикле while условием выполнения циклического процесса есть проверка

i<len(List)

В теле цикла while проверяется, совпадает ли значение искомого элемента t со значением элемента List[i] списка

if List[i]==t:
    ...

Если совпадение найдено, то нету смысла продолжать дальнейший обход списка. Поэтому, в теле оператора if вызывается инструкция break.

Если пройден весь список и не найден ни один элемент, то это значит, что оператор break не был выполнен ни разу. В этом случае вызывается блок else оператора while:

...
else:
    print("Елемента ", t, " нет в списке")

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

Заданный список: [2, 8, 3, 4, 3, 5, 2, 1, 0, 3, 4, 4, 5, 8, 7, 7, 5]
Элемент, который нужно найти: 4
Элемент 4 есть в списке

   


Связанные темы