[МУЗЫКА] [МУЗЫКА] Теперь посмотрим несколько примеров сложных задач. Они на самом деле не очень сложные, но, тем не менее, какие-то подходы к их решению мы изучим. Пусть у нас есть такая задача: есть два товара, первый из них стоит a рублей b копеек, второй стоит c рублей d копеек. Нужно узнать, сколько рублей и копеек они стоят в сумме. Как я говорил, названия переменных должны быть осмысленны, но если нам в условии задачи сказали какие-то буковки отдельные, то давайте будем придерживаться того правила, что как в условии, так и в программе, чтобы не было путаницы. В первую очередь нам предстоит считать четыре числа. Пока что это мы будем делать вот таким вот рабоче-крестьянским методом: каждым отдельным input будем получать отдельное число. Ну вот я скопировал значения. Теперь поменяю названия переменных, просто чтобы не тратить время. Вообще, конечно, потом мы научимся, как этого избежать, но пока у нас нет выбора. Всё. У нас есть переменные a, b, c и d — то, что нам дается. Теперь можем думать о решении задачи. Часто задачи на деньги или на время, где есть разные единицы измерения, можно решать таким способом: все переводим в наименьшую единицу измерения, производим необходимые действия и переводим обратно. Потому что если мы сейчас начнем с рублями, с копейками, с переполнениями этих копеек, если их получилось больше 100, то нужно добавить рубли, если мы начнем сейчас обо всем этом думать, то мы запутаемся и задачу не решим. Поэтому, мы все переведем в копейки, произведем необходимые действия — в нашем случае это сложение, и потом разделим обратно на рубли и копейки. Итак, давайте посчитаем стоимость первого товара в копейках — это количество рублей, умноженное на 100, плюс количество копеек. Полностью аналогично для второго товара: теперь уже c * 100 + d. Еще немного о наименовании переменных. Иногда требуется назвать переменную двумя какими-то словами. Можно использовать стандартные сокращения или просто сокращать как-то слова, чтобы название переменной не было слишком длинным. Оно должно отражать смысл, но если вы будете каждый раз очень долго набирать какую-то длинную фразу, то это будет не очень эффективным с точки зрения потраченного времени. То есть если у вас какая-то простая переменная состоит из 30 букв, то вы будете очень долго мучиться с этим, и, скорее, эффект будет негативный. Хотя, конечно, такое название будет понятно, если люди не поленятся дочитать его до конца. Ну вот, например, сейчас мы хотим суммарную стоимость посчитать. Можно назвать totalCost. Есть несколько подходов к стилю именования переменных. Я использовал так называемый camel typing: если слов несколько, то каждое новое слово начинают с большой буквы. Иногда их разделяют подчеркиваниями, но в Python так не принято. А иногда просто не используют большие буквы, всё пишут маленькими буквами. Первая буква в названии должна быть обязательно маленькой. Конечно, у вас программа будет работать, даже если она большая, но потом мы выясним, для чего используются первые большие буквы. Пока что просто есть такое правило. Итак, суммарная стоимость в копейках. Вот мы ее сохранили. Можно было не создавать эту переменную, а как-то обойтись без нее, каждый раз писать арифметическое выражение, но почему бы и не создать, если мы можем. Так программа становится понятнее. У нас нет цели написать самую-самую короткую программу. У нас есть цель написать самую понятную для людей программу. Немножко поленимся и не будем создавать новую переменную для рублей, для копеек, а сразу выведем то, что нам нужно. То есть стоимость в копейках, деленная нацело на 100, — это будет целое количество рублей, и остаток от деления на опять же 100 — это будут копейки, которые не вошли в рубли. Посмотрим, как оно у нас работает. В каждой задаче у вас есть примеры, на которых обязательно нужно проверить вашу программу, то есть запустить и сверить ответ, что получается такой же, как в примере. Кроме этого, иногда нужно придумывать свои тесты, чтобы проверить правильность работы программы. Ну, у нас примера нет, так что мы будем все придумывать из головы, и здесь есть явно два случая: когда копейки не переполнились, и когда копеек в сумме больше 100 оказалось. И вот оба эти случая нужно проверить. Сначала пусть копейки не образуют целого рубля. Ну, например, первый товар стоит 1 рубль 10, а второй товар стоит 2,20. Должно получиться 3,30. Да, действительно, в этом случае работает. Но мы продолжаем тестирование. Хотим убедиться, что мы пользователю даем хорошую программу. Запускаем. Смотрим, что у нас получается. Например, первый товар стоит 1 рубль 99, сейчас очень любят делать такие цены в магазинах. Ага! Вот смотрите, что произошло: я ввел через пробел, и у меня все сломалось. Она попыталась вот эту строку — один пробел 99 — преобразовать в число, и у нее не получилось. Программа правильная, это я ввел неправильные данные. Перезапустим и сделаем все правильно. Не пугайтесь, если у вас произошло такое, теперь вы знаете, что делать: вводить все красиво. Итак, первый товар стоит 1 рубль 99, второй — ну, например, 2 рубля и 1 копейку. В сумме должно получится ровно 4. Работает. И давайте уж финальный штрих, чтобы совсем быть уверенными, что мы молодцы — 1 рубль 99 и 2,99 = 4 рубля 98 копеек. Отлично! Мы прогнали достаточно большое количество тестов и можем надеяться, что наша программа работает правильно. В тестирующей системе ваша программа проверяется на заранее подготовленном наборе тестов. То есть мы заранее нашли входные данные, которые смогут проверить вашу программу, и подготовили ответы для них, и сверяем ответы вашей программы с нашими ответами. Если все работает правильно, значит, задача засчитывается. Конечно, иногда вы можете сделать что-то, что мы не учли в своих тестах, но мы старались сделать их хорошими. Посмотрим еще одну задачу, которая очень похожа, на самом деле, на задачу про часы. Когда-то давным-давно была такая игровая приставка Dendy, и многие другие игровые приставки, которые были 8-битными, а это значит, что они могли хранить в своих переменных только числа от 0 до 255, например. Конечно, там могли быть и больше переменные, но пусть у нас будет 8-битная переменная. В Python такой проблемы нет. Так вот, в одной из игр, насколько я помню, это была игра про Марио, можно было получать жизни дополнительные, как-то зарабатывать очки или еще как-то, и счетчик жизни, естественно, был 8-битным. И когда у игрока становилось 255 жизней и он получал новую, то счетчик обнулялся, превращался в 0. Собственно, задача состоит в том, чтобы по числу n заданному — это сколько жизней заработал игрок, сказать, что у него сейчас отображается на счетчике в этой игре. Считываем наше число. Переменную называем, как в условии, и вспоминаем, как же мы умели решать похожие задачи. Как я уже говорил, можно представить себе часы, только теперь у нас там не 24 часа в сутках, а 256 жизней — от 0 до 255. И вот у нас по этому кругу наше число отсчитывается. Это остаток от деления. То есть, на самом деле, решение задачи очень-очень простое. Нам нужно для числа n посчитать остаток от деления на 256. Запустим и посмотрим. Ну, допустим, игрок набрал десять жизней. На счетчике будет отображаться 10. Почему? Потому что так и должно быть. А вот если он набрал больше 255 жизней, то что произойдет? Допустим, вот у него было 255 жизней, он получил еще одну — в сумме 256, на счетчике должен появиться 0. И действительно, остаток от деления нашего введенного числа на 256 = 0. [БЕЗ_ЗВУКА] И еще какой-нибудь тест. Ну, например, там 500 жизней он набрал. У нас получился результат 244. 244 + 256 как раз даст нам 500. Таким образом, очень простое решение получилось у задачи. Просто одна арифметическая операция, и такие задачи вам тоже предстоит решить. Так что не придумывайте чего-то очень сложного. Сначала хорошенько подумайте, может быть, эта задача действительно простая и решается примерно таким способом. [МУЗЫКА] [МУЗЫКА]