Раздел «Язык Си».PythonTurtleBreak:

Сумма чисел

Пример 1: найти сумму яблок в одном ряду

В ряду растет несколько (N > 0) яблонь. На каждой яблоне Ni яблок. Сколько всего яблок на всех яблонях?

Входные данные (дано, input): натуральные числа через пробел, например

3 10 2 5

Выходные данные (найти, output):

20

Пусть работник собирает яблоки в корзину. По очереди с каждого дерева.

Объявим переменные.

Напишем таблицу значений переменных x и total для данных из примера:

номер дерева x total
3 3
1 10 13
2 2 15
3 5 20

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

По этим формулам напишем код:

def sum_row(trees):
    total = 0               # сначала в корзине ничего не было
    for x in trees:
        total = total + x   # к старому значению яблок в корзине (total) 
                            # добавили яблоки, снятые с дерева (x)
        print(x, total)     # печатаем х и total, значения должны быть как в таблице
    return total            # возвращаем посчитанную сумму

a = map(int, input().split())          # читаем входные данные
res = sum_row(a)                       # вычисляем результат
print(f'Всего собрали {res} яблок')    # печатаем ответ

Запускаем и получаем результат:

3 3
10 13
2 15
5 20
Всего собрали 20 яблок

Задача 2. Вороны крадут яблоки

В саду живут вороны. Каждая ворона может украсть из корзины 1 яблоко. Если на дереве живут вороны, то у дерева пишем отрицательное число - количество ворон на этом дереве.

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

Подготовим тестовые данные. Пусть входные данные будут такими:

3 -10 2 5

Получим таблицу:

номер дерева x total пояснение
3 3  
1 -10 нельзя просто сложить 3+(-10), вороны не могут оставить в корзине отрицательное число яблок! Они украдут все яблоки.
2 2 2  
3 5 7  

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

Пример 3. break - трусливый работник

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

Картинка, где нарисованы яблони, подписаны яблоки, вороны, стрелочками показан путь от дерева к дереву и стрелочка "убегание" подписана break

Входные данные:

3 10 -2 5

Получим таблицу:

номер дерева x total пояснение
3 3  
1 10 13  
2 -2 13 Ворона! Убегаем из ряда. Не даем воронам украсть яблоки. Дальше в ряду не собираем. Уже убежали.

Напишем код, который считает, сколько яблок собрал такой работник:

break - управление передается сразу ЗА конец цикла.

def sum_row(trees):
    total = 0               
    for x in trees:
        if x < 0:           # если на дереве вороны
            print('break - Убегаем от ворон')
            break           # убегаем из ряда яблонь
        total = total + x   # к старому значению яблок в корзине (total)
                            # добавили яблоки, снятые с дерева (x)
        print(x, total)     # печатаем х и total, значения должны быть как в таблице

                            # после окончания цикла (все деревья закончились)
    # break будет убегать сюда, сразу после конца цикла
    return total            # возвращаем посчитанную сумму

a = map(int, input().split())          # читаем входные данные
res = sum_row(a)                       # вычисляем результат
print(f'Всего собрали {res} яблок')    # печатаем ответ

Напечатает:

3 3
10 13
break - Убегаем от ворон
Всего собрали 13 яблок 

QUESTION? Можно ли в этом примере вместо break использовать return?

REFACTOR Задача: изменить код так, чтобы вороны, когда работник убегает, отнимали яблоки.

номер дерева x total пояснение
3 3  
1 10 13  
2 -2 11 Вороны крадут яблоки! Убегаем из ряда. Дальше в ряду не собираем.

Пример 4: continue - храбрый работник

Работник может быть умным и пропускать дерево с воронами. Он идет к следующему дереву.

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

3 -10 2 5

Получим таблицу:

номер дерева x total пояснение
3 3  
1 -10 3 Пропускаем дерево, количество собранных яблок не изменяется.
2 2 5  
3 5 10  

continue - перейти к следующей итерации цикла.

def sum_row(trees):
    total = 0               # сначала в корзине ничего не было
    for x in trees:
        if x < 0:           # если на дереве вороны
            print('Пропускаем дерево')
            continue        # переходим к следующему дереву

        # этот код в случае continue НЕ выполняется
        total = total + x    
        print(x, total)

    return total

a = map(int, input().split())          # читаем входные данные
res = sum_row(a)                       # вычисляем результат
print(f'Всего собрали {res} яблок')    # печатаем ответ 

3 3
Пропускаем дерево
2 5
5 10
Всего собрали 10 яблок

QUESTION? Попробуйте переписать цикл без continue.

Картинка - симбиоз предыдущих. Стрелочка break и стрелочки continue.

Цикл в цикле

Расширим задачу. Пусть дано N рядов яблонь. Сколько всего на этих яблонях яблок?

Сначала дано натуральное число N. Потом по 1 ряду на строку.

Например:

3
3 10 2 5
6 1 8
1 1 4 2 1

Работник идет с корзиной по 1 ряду, собирает яблоки в корзину (переменная total). Это функция sum_row. Она возвращает значение total, сколько собрали яблок в 1 ряду.

Во всех рядах (в саду) яблоки считает функция sum_all. Все яблоки собирают в большую корзину (переменная res_all). После каждого ряда работник из корзины (res) добавляет яблоки в большую корзину (res_all).

Напишем код, который суммирует количество яблок (ворон пока нет).

# считает количество яблок в 1 ряду trees
def sum_row(trees):
    total = 0               # сначала в корзине ничего не было
    for x in trees:
        total = total + x   # к старому значению яблок в корзине (total)
                            # добавили яблоки, снятые с дерева (x)
        print(x, total)     # печатаем х и total, значения должны быть как в таблице
    return total            # возвращаем посчитанную сумму

# читает и считает количество яблок во всем саду.
def sum_all():
    n = int(input())        # прочитать количество рядов
    res_all = 0             # сначала яблок нет
    for i in range(n):      # для каждого ряда данных
        a = map(int, input().split())      # читаем 1 строку данных
        res = sum_row(a)                   # вычисляем результат для 1 ряда деревьев
        res_all += res                     # вычисляем промежуточный результат
        print(f'В ряду собрали {res} яблок, всего {res_all} яблок')

    return res_all


total_all = sum_all()
print(f'Итого {total_all} яблок')

break по внешнему циклу (убегаем из сада)

На некоторых деревьях сидят вороны.

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

Картинка со стрелочками по саду. Стрелка в ряду return и стрелка из начала ряда в конец сада break.

Функция в языке Python может возвращать несколько значений. Будем возвращать сколько яблок собрали в 1 ряду и есть ли в ряду вороны.

# считает количество яблок в 1 ряду trees
# убегает из ряда, если встретил ворон
# возвращает сколько собрали яблок в 1 ряду и были ли в саду вороны
def sum_row(trees):
    total = 0               # сначала в корзине ничего не было
    for x in trees:
        if x < 0:           # ВОРОНЫ!!!
            print('Вороны')
            return total, True   # уже собрали total яблок, в саду были вороны
        total = total + x   # к старому значению яблок в корзине (total)
                            # добавили яблоки, снятые с дерева (x)
        print(x, total)     # печатаем х и total, значения должны быть как в таблице
    return total, False     # возвращаем посчитанную сумму, в ряду ворон не было

Теперь после каждого ряда будем проверять, были ли в ряду вороны

# читает и считает количество яблок во всем саду.
def sum_all():
    n = int(input())        # прочитать количество рядов
    res_all = 0             # сначала яблок нет
    for i in range(n):      # для каждого ряда данных
        a = map(int, input().split())      # читаем 1 строку данных
        res, vorona = sum_row(a)           # вычисляем результат для 1 ряда деревьев
        if vorona:
             break
        res_all += res                     # вычисляем промежуточный результат
        print(f'В ряду собрали {res} яблок, всего {res_all} яблок')

    return res_all

total_all = sum_all()
print(f'Итого {total_all} яблок')

Перепишите и запустите программу. Добавьте ворон в несколько рядов.

QUESTION? Если в ряду была ворона и в этом ряду собрали 7 яблок, эти яблоки потеряли или положили в большую корзину (res_all)?

REFACTOR Напишите программу, которая собранные в ряду яблоки кладет в большую корзину. Для этого сада должны получить 26 = (3+10+2+5) + (6). После 2 ряда убегаем из сада.

3
3 10 2 5
6 -1 8
1 1 -4 2 1

REFACTOR Измените программу так, чтобы в ряду собирали все яблоки (и не отдавали воронам ничего). Но после ряда с воронами устали и дальше не собираем. Для этого сада должны получить 34 = (3+10+2+5) + (6 + 8). После 2 ряда убегаем из сада.

Картинка со стрелочками по саду. Стрелки в ряду без подписи continue, но ее рисуем как для continue. Стрелка из начала ряда в конец сада break.

REFACTOR Измените программу так, чтобы в ряду собирали все яблоки до первой вороны (и не отдавали воронам ничего). После ряда с воронами продолжали собирать яблоки в следующем ряду. Для этого сада должны получить 28 = (3+10+2+5) + (6) + (1+1). После 2 ряда идем на следующий ряд.

Картинка со стрелочками.

-- TatyanaDerbysheva - 01 Jun 2019