Софтуерно Инженерство
Loading...
+ Нов въпрос
deltanov avatar deltanov 5 Точки

Loops - Part 2 - Exercise: 03. Vacation

Здравейте!

Опитвам се да реша 3та задача по следния начин, но не се получава и не мога да си открия грешката:

 

# • Пари, нужни за екскурзията - реално число;
# •    Налични пари - реално число.
# След това многократно се четат по два реда:
# •    Вид действие – текст с две възможности: "spend" или "save";
# •    Сумата, която ще спести/похарчи - реално число.

needed_money=float(input())
available_money=float(input())
days_spent=0
can_save=True
saving_days=0


while available_money<=needed_money:
    action=input()
    amount_money=float(input())
    saving_days += 1
    last_action=action
    if action=='save':
        available_money += amount_money
    elif action=='spend':
        available_money -= amount_money

        if last_action=='spend':
            days_spent +=1
            if days_spent>=5:
                can_save=False
                break

if can_save==True:
    print(f"You saved the money for {saving_days} days.")
else:
    print("You can't save the money.")
    print(f"{days_spent}")

 

Благодаря ви за помощта.

Тагове:
1
Programming Basics
MartinBG avatar MartinBG 2103 Точки
Best Answer

За откриване на 5 поредни "spend" дни, ще Ви е по-лесно, ако използвате направо days_spent, като го нулирате при всеки "save" и го увеличавае при всеки "spend".

Изпускате условието, че не може да се изхарчат повече пари, от наличните, т.е. при налични 1000 и команда spend 1200, наличните пари трябва да станат 0, а не -200.

При принтирането на крайният резултат, трябва да изпишете общия брой дни:

print(f"{days_spent}") -> print(f"{saving_days }")

 

Ето един вариант с горните промени:

needed_money = float(input())
available_money = float(input())
days_spent = 0
saving_days = 0
can_save = True

while available_money < needed_money:
    action = input()
    amount_money = float(input())
    saving_days += 1
    if action == 'save':
        available_money += amount_money
        days_spent = 0
    elif action == 'spend':
        available_money -= amount_money
        if available_money < 0:
            available_money = 0
        days_spent += 1
        if days_spent >= 5:
            can_save = False
            break

if can_save:
    print(f"You saved the money for {saving_days} days.")
else:
    print("You can't save the money.")
    print(f"{saving_days}")

 

0
22/05/2020 18:13:01
deltanov avatar deltanov 5 Точки

Страхотно! Благодаря - не се сетих за нулирането на брояча. А това изречение съм го пропуснал от условието: "Ако иска да похарчи повече от наличните си пари, то тя ще похарчи колкото има и ще ѝ останат 0 лева"

1
Poddy avatar Poddy 3 Точки

Ако запазим твоя формат:

https://pastebin.com/4EmWird1

Като цяло, трябва да въртиш цикъла докато параите са по-малко от нужното, а не равни, ако парите станат равни на нужното за екскурзията тя отива и няма нужда от поредното действие. Също така станат ли 5 дни с харчене - не може да събере парите, не трябва да е >=
Трябва да нулираш, ако иска да похарчи повече пари отколкото има. Прегледай кода надявам се да ти е от полза.

0
MartinBG avatar MartinBG 2103 Точки

@Poddy

Също така станат ли 5 дни с харчене - не може да събере парите, не трябва да е >=

Причината, поради която броячите не се проверяват за равенство (==) се крие в четимостта и устойчивостта на кода.

Когато някой види сравнение за равенство на брояч, ще му се наложи да провери всички места, на които този брояч се модифицира, за да е сигурен, че няма как да прескочи точната стойност, докато използването на >, <, >=, <= гарантира, че логиката в if-a ще сработи. За кратка програма като тази може да не изглежда обосновано - наистина, губят се само няколко секунди, но при работа в голям проект, тези секунди стават минути и лесно може да се обърнат в часове, ако се гони някой бъг.

Под устойчивост на кода имам предвид, че ако - примерно - постъпи ново изискване при "spend" на сума над наличната, броячът да се увеличи с 2, кодът с равенство вече няма да работи и - което е още по-лошо - няма да работи само в някои случаи, а това са възможно най-трудните за откриване бъгове.

Ефектът от подобни промени (и проблемите. които могат да предизвикат) нарства заедно с обема на проекта и за да се избегнат, конвенцията във всички езици е броячите да не се проверяват за равенство, а за големина (за пример вижте как се използват в for циклите)

 

 

0
22/05/2020 19:05:33
deltanov avatar deltanov 5 Точки

Много благодаря за помощта.

0