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

Уважаемый 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 в принципе можно выкинуть…

Очень хотелось бы узнать Ваше мнение по моему коду.
JOHN_16
остаток действительно нужно упразднить - так как вы его нигде более не использовали.
В целом нормально, если не считать что вы ничего в функции не возвращаете, а в коде присваиваете этот результат переменной a, значение которой ожидаемо всегда будет None
underground
Спасибо Вам огромное!!!
Удачи Вам во всем!!!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB