Напишем программу, которая позволит человеку в магазине совершить покупку и выдаст об этом чек. Так как эта программа достаточно сложна, я написал инструкцию о том, как наша программа будет работать. Во-первых, для хранения информации о товарах нам потребуется несколько списков. Нам надо запомнить: сколько каждого конкретного наименования купил человек, по какой цене он купил всю партию, и как она называется. Мы будем использовать три разных списка. Чтобы купить товары, мы пройдем по списку покупок, проверим, покупали ли мы уже такой товар, и если покупали, то увеличим количество товара на единицу, если не покупали, то нам будет нужно добавить во все три списка с помощью трех применений метода "append" информацию о названии, о том, сколько товара мы купили и по какой цене. Наконец, в тот момент, когда человек купит последний товар, и мы начнем печатать наш чек, мы заведем переменную, в которой будем считать общую стоимость заказа, пройдем по списку всех купленных товаров, напечатаем строчку с информацией о покупке (мы уже печатали такую строчку в разговоре о книжном магазине на прошлой неделе) и увеличим переменную с общей стоимостью на стоимость покупки партии товара. В конце выведем общую стоимость. Давайте приступим к написанию такой сложной программы. Для начала, как и было указано, заведем три изначально пустых списка для покупок: список с названиями, список с ценами и список с количеством. После этого создадим вечный цикл, который будет работать до тех пор, пока человек не скажет, что он купил последний товар и не введет слово "конец". Спросим, что же человек хочет купить. Если вдруг он уже все купил, закончим наш цикл покупок и перейдем к печати чека. Но пока продолжим писать нашу чудесную программу. Мы можем узнать, покупал ли человек уже этот товар. Сделать это очень просто. Если название товара есть в списке названий товаров, которые уже были куплены, то мы можем просто найти индекс этого товара и увеличить количество купленных товаров соответствующего наименования. Для этого мы можем обратиться по нашему индексу к списку количеств купленного товара и увеличить его на единицу. Если же мы такой товар еще не покупали, то есть если название товара отсутствует в списке названий товаров, которые человек уже купил, то мы должны добавить это название во все три списка. Так как в списке информация добавляется всегда в порядке очередности, мы знаем, что во всех трех списках товар будет иметь одинаковый индекс. Добавим название товара в список наименований, в список количеств, добавим единичку, указав, что товар пока куплен в единственном экземпляре; и наконец, для того, чтобы добавить товар в список цен, нам надо узнать цену на товар. Цена является числом, поэтому мы сразу превратим цену в целое число и не забудем попросить компьютер спросить у человека цену. После того как мы написали программу, позволяющую добавлять покупки в корзину, мы можем написать кусок программы, который проходит по трем, теперь уже заполненным, спискам и выводит информацию чека на экран. Добавим название магазина, абстрактные "Продукты", добавим номер кассы. Пусть это будет первая касса, чтобы как-то разграничить для нас в интерфейсе текст, где мы указывали, что покупает наш клиент, и текст, где мы выдаем итоговый чек с итоговой стоимостью. Создадим переменную для хранения общего счета, назовем ее "total", а затем попросим компьютер перебрать все индексы списка наименований купленного товара. Для каждого из товаров мы напечатаем название товара, и с новой строки напечатаем, на сколько товар был куплен, в каком количестве. Соответственно, мы попросим компьютер подставить соответствующую переменную из списка цен, соответствующую переменную из списка количеств, посчитать произведение цены на количество купленного товара и подставить результат в нашу вторую строчку. И самое важное, не забыть, что переменную "total", где мы считаем, сколько денег всего человек потратил на нашу покупку, мы тоже должны увеличить на общую стоимость купленного товара. После этого, после того как мы написали все команды для обработки каждого конкретного товара, мы можем напечатать в конце строчку с общей стоимостью покупки, куда мы попросим компьютер подставить значение переменной "total". Что ж, посмотрим, как работает наша программа. Я хочу купить молоко за 86 рублей, я хочу купить еще раз молоко за 86 рублей, я теперь неожиданно покупаю что-то с названием "86" за 86 рублей; предположим, я хочу купить еще хлеб за 40 рублей, и на этом мой список покупок закончился, я указываю слово "конец". Компьютер напечатал отбивку про то, что это магазин продуктов какой-то, что это какая-то касса номер один, указал, что я купил молоко дважды, за 86 рублей, и всего 176 рублей за все молоко; нечто мистическое с названием "86" я купил один раз за 86 рублей; хлеб я купил тоже один раз, и общая стоимость оказалась 298 рублей. Вот примерно так работают кассы в магазинах. Там все, конечно, гораздо сложнее, но общий смысл примерно похож.