Сумма чисел
Пример 1: найти сумму яблок в одном ряду
В ряду растет несколько (N > 0) яблонь. На каждой яблоне Ni яблок. Сколько всего яблок на всех яблонях?
Входные данные (дано, input): натуральные числа через пробел, например
Выходные данные (найти, output):
Пусть работник собирает яблоки в корзину. По очереди с каждого дерева.
Объявим переменные.
- total - сколько яблок в корзине.
- x - сколько яблок собрал работник с одной яблони.
Напишем таблицу значений переменных
x
и
total
для данных из примера:
Напишем формулы, как мы будем вычислять переменные для следующего дерева:
- x - взять следующее число яблок;
- total = total + x
По этим формулам напишем код:
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 яблоко. Если на дереве живут вороны, то у дерева пишем отрицательное число - количество ворон на этом дереве.
Нужно изменить код так, чтобы вороны считались правильно.
Подготовим тестовые данные. Пусть входные данные будут такими:
Получим таблицу:
номер дерева | x | total | пояснение |
| 3 | 3 | |
1 | -10 | | нельзя просто сложить 3+(-10), вороны не могут оставить в корзине отрицательное число яблок! Они украдут все яблоки. |
2 | 2 | 2 | |
3 | 5 | 7 | |
Измените код предыдущего примера, чтобы вороны учитывались правильно.
Пример 3. break - трусливый работник
Пусть работник боится ворон. И как только встречает ворон в ряду, перестает собирать и убегает с уже собранными яблоками.
Картинка, где нарисованы яблони, подписаны яблоки, вороны, стрелочками показан путь от дерева к дереву и стрелочка "убегание" подписана break
Входные данные:
Получим таблицу:
номер дерева | 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 яблок

Можно ли в этом примере вместо break использовать return?
Задача: изменить код так, чтобы вороны, когда работник убегает, отнимали яблоки.
Пример 4: continue - храбрый работник
Работник может быть умным и пропускать дерево с воронами. Он идет к следующему дереву.
Картинка, где нарисованы яблони, подписаны яблоки, вороны, стрелочками показан путь от дерева к дереву и огибающая ворон стрелочка подписана continue
Получим таблицу:
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 яблок

Попробуйте переписать цикл без 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} яблок')
Перепишите и запустите программу. Добавьте ворон в несколько рядов.

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

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

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

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