Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 7, 2017 08:57:54

underground
Зарегистрирован: 2015-12-17
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Ветвление if - elif - else

Уважаемый JOHN_16, Огромное СПАСИБО за Вашу помощь!!!
Вот что у меня получилось:

 def razmen (summa):
    if summa % 500 == 0:
        kol_vo_kupyr = summa // 500
        return kol_vo_kupyr
    if summa % 100 == 0:
        kol_vo_kupyr = summa // 100
        return kol_vo_kupyr
    if summa % 10 == 0:
        kol_vo_kupyr = summa // 10
        return kol_vo_kupyr
    if summa % 2 == 0:
        kol_vo_kupyr = summa // 2
        return kol_vo_kupyr
kupyri = {'k_500':0, 'k_100':0, 'k_10':0, 'k_2':0}
dengi = int(input('Введите сумму денег:'))
a = razmen(dengi)
print (a)
Пока просто вывожу результат через функцию print()…
Все равно чего-то я не могу додумать… Если вводить ровные суммы, то в принципе все работает:
——————–
Введите сумму денег:2000
4
>>>
Введите сумму денег:300
3
>>>
Введите сумму денег:20
2
>>>
——————–
А вот если ввести не круглую сумму:
——————–
Введите сумму денег:324
162
>>>
——————-
она начинает считать по самым маленьким купюрам…
Мне так кажется, что там при делении, на 500 должен фигурировать еще остаток, который должен переходить дальше по циклу… Но если делить на 500 с остатком, то тогда как отбирать купюры наибольшим номиналом?

Офлайн

#2 Июнь 7, 2017 22:58:43

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Ветвление if - elif - else

давайте для начала напишем простой не потимизированный код, но рабочий код.
Читаем вашу функцию razmen. Если сумма делится без остатка на 500, то возвращаем целочисленное деление суммы на 500 (количество купюр) и тд. А что если сума это 1 ? Ни одно из условий не будет выполнено. ПРоблема. Зачем вам условие что делится без остатка? Мы можешь сумму 1002 для начала определить как 2 по 500 и остаток 2 ? Можем. Давайте перепешите эту функцию так что бы она отдавала информацию о том каким количеством купюр максимального достоинства можно уложить в заданную сумму? Догадаетесь как надо оформить return?
Далее - весь ваш код выглядит остаточно повторяющимся - а если добавить сюда купюры 1000 и 5000 достоинством, вспомнить что еще есть монеты номиналами 5 и 1 рубль, и в перспективе появятся 2000 и 200 (я про рубли РФ) то ваша функцию разрастется еще больше, при этом основные действияостанутся теми же. В педагогических целях (да и более приближенный к реальной жизни случай) я рекомендую вам переписать логику - пусть внутри функции будет цикл по сортированным в обратном порядке номиналам купюрам. ПРи первом истинном результате деления - возвращать полученный результат.
Далее. ПОлученный вариант ранее складываем в словарь. ПРи этом от изначальной суммы нужно отнять ту сумму на которую был проиведен размен. ТАким образом делая это в цикле мы получим что либо сумму полностью разменены и итоговая сумма равна 0 либо чт омы не можем (по условию задачи, например 11) полностью произвести размен денег - и можно в таком случае возбудить исключение (ошибку). Даю подсказку что в цикле for тоже есть блок else но немного другого назначения - почитайте о нем, это вам поможет.
Перепишите код и посмотрим что у вас получится



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Июнь 8, 2017 09:24:48

underground
Зарегистрирован: 2015-12-17
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Ветвление if - elif - else


Уважаемый JOHN_16!
Я безмерно благодарен Вам за Вашу помощь, за то, что Вы тратите столько времени на меня!
Хочу показать Вам, что у меня получилось, следуя Вашим рекомендациям:
Сначала я написал линейный код, который, по-моему, работает так, как должен:

 summa = int(input('Введите сумму: '))
if summa >= 500:
    kol_vo_kupyr = summa // 500
    ostatok = summa % 500
    summa = ostatok
    print('Количество купюр по 500 рублей - ', kol_vo_kupyr)
if summa >= 100:
    kol_vo_kupyr = summa // 100
    ostatok = summa % 100
    summa = ostatok
    print('Количество купюр по 100 рублей - ', kol_vo_kupyr)
if summa >= 10:
    kol_vo_kupyr = summa // 10
    ostatok = summa % 10
    summa = ostatok
    print('Количество купюр по 10 рублей -  ', kol_vo_kupyr)
if summa >= 5:
    kol_vo_kupyr = summa // 5
    ostatok = summa % 5
    summa = ostatok
    print('Количество купюр по 5 рублей -   ', kol_vo_kupyr)
if summa >= 1:
    kol_vo_kupyr = summa // 1
    ostatok = summa % 1
    summa = ostatok
    print('Количество купюр по 1 рублю -    ', kol_vo_kupyr)

Затем я попытался все это представить в виде функции. И вот что у меня получилось:
 def razmen (summa):
    kupyri = [5000, 1000, 500, 100, 10, 5, 1]
    while summa !=0:
        for i in kupyri:
            if summa >= i:
                kol_vo_kupyr = summa // i
                summa_v_kupyrah = kol_vo_kupyr * i
                ostatok = summa % i
                summa -= summa_v_kupyrah
                print('Количество купюр достоинством',i,'рублей ---',kol_vo_kupyr)
dengi = int(input('Введите сумму денег: '))
a = razmen(dengi)
print (a)

Хотя строку ostatok = summa % i в принципе можно выкинуть…

Очень хотелось бы узнать Ваше мнение по моему коду.

Офлайн

#4 Июнь 8, 2017 10:31:15

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Ветвление if - elif - else

остаток действительно нужно упразднить - так как вы его нигде более не использовали.
В целом нормально, если не считать что вы ничего в функции не возвращаете, а в коде присваиваете этот результат переменной a, значение которой ожидаемо всегда будет None



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Июнь 8, 2017 12:53:41

underground
Зарегистрирован: 2015-12-17
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Ветвление if - elif - else

Спасибо Вам огромное!!!
Удачи Вам во всем!!!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version