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

Vacation - while цикъл

Здравейте, judge ми дава 90 точки на моето решение и не мога да намеря какво пропускам. Толкова много го гледах, че вече зациклих жестоко и се налага да потърся помощ :) Предварително благодаря!

Джеси е решила да събира пари за екскурзия и иска от вас да ѝ помогнете да разбере дали ще успее да събере необходимата сума. Тя спестява или харчи част от парите си всеки ден. Ако иска да похарчи повече от наличните си пари, то тя ще похарчи колкото има и ще ѝ останат 0 лева.

Вход

От конзолата се четат:

  • Пари нужни за екскурзията - реално число в интервала [1.00.. .25000.00]
  • Налични пари - реално число в интервала [0.00... 25000.00]

След това многократно се четат по два реда:

  • Вид действие – текст с възможности "spend" и "save".
    • Сумата, която ще спести/похарчи - реално число в интервала [0.01… 25000.00]

Изход

Програмата трябва да приключи при следните случаи:

  • Ако 5 последователни дни Джеси само харчи, на конзолата да се изпише:
  • "You can't save the money."
  • "{Общ брой изминали дни}"
  • Ако Джеси събере парите за почивката на конзолата се изписва:

"You saved the money for {общ брой изминали дни} days."

 

 

#include <iostream>
#include <string>

using namespace std;

int main() {

    double vacationPrice, currentlySaved;
    cin >> vacationPrice >> currentlySaved;
    int daysToSpent = 0;
    int days = 0;

    while (currentlySaved < vacationPrice && daysToSpent < 5) {
        string action;
        double amount;
        cin >> action >> amount;
        if (action == "spend") {
            if (currentlySaved <= amount) {
                currentlySaved = 0;
                daysToSpent++;
            } else if (currentlySaved > amount) {
                currentlySaved -= amount;
                daysToSpent++;
            }
        } else if (action == "save") {
            currentlySaved += amount;
            daysToSpent = 0;
        }
        days++;
    }
    if (daysToSpent == 5) {
        cout << "You can't save the money." << endl;
        cout << days << endl;
    } else if (currentlySaved >= vacationPrice) {
        cout << "You saved the money for " << days << " days." << endl;
    }

    return 0;
}

0
Programming Basics with C++
spasimira25 avatar spasimira25 25 Точки
Best Answer

Ако Джеси има 150 лв, а екскурзията 100лв - никога няма да се влезе в While цикъла.
тоест:  currentlySaved (150) < vacationPrice (100)  не е вярно и не се влиза в цикъла.
Програмата просто увисва.
Ако направиш цикъла do-while, задължително ще го извъртиш поне веднъж. 

На различните линкове тестовите проверки са различни.  Поради тази причина на едното място ти дава 100/100 а на другото 90/100

1
05/07/2019 11:11:15
dmartinov avatar dmartinov 36 Точки

Мдааааа, знаех си, че някъде, нещо в логиката ми съм пропуснал. Благодаря!

Направих го с do-while и нещата заспаха - 100/100 :) 

1
TodorKMitov avatar TodorKMitov 0 Точки

Здравейте! Бихте ли публикували решението с do - while?

0
dmartinov avatar dmartinov 36 Точки

Естествено, но понеже съм от телефона в момента, не мога да го копи-пейстна като хората. Виж дали може да го отвориш директно от линка, ако не, пиши отново и ще видя какво мога да направя 

https://judge.softuni.bg/Contests/Submissions/View/11818898

0
dmartinov avatar dmartinov 36 Точки

Да, действително даде 100 точки, но откъде идва проблема?
Линка в който аз го пусках е този който ми е даден в doc файла със задачите за домашно. Този лнинк който даваш откъде е и бори ли ми домашното за предадено?

0
RuNNeR4142 avatar RuNNeR4142 394 Точки

Линкът който посочих е за всички задачи на всички езици. Предполагам че ти имаш този линк 
https://judge.softuni.bg/Contests/Compete/Index/1174#0 който приема само C++ и там кода дава 90.
Възможно е да има малък проблем в judge. Попитай колеги от групата или се обърни към някой главен.

0
Yordan.Vachev avatar Yordan.Vachev 2 Точки

трябва да си е на този адрес, иначе не я отчита като предадена.

Възможно е проблема да ти е, както при мен в Old Book, там ми дадоха следните насоки

"

kolioi 563 Точки

Две неща трябва да направиш:

1. Стрингове (в случая имената на книгите) винаги се четат с getline(). Иначе, ако четеш с cin, ще прочетеш само първата дума, защото спейса е стандартен разделител и cin спира четенето когато стигне до спейс (интервал).

2. Не бива да се смесват cin и getline(). Ако се налага обаче, след всяко четене с cin и преди следващо четене с getline() трябва да викаш cin.ignore(). Причината е, че въвъ входния буфер остава знака за край на ред \n и getline го прочита.

Иначе логиката ти е ОК, направи само тези промени и ще вземеш 100 точки.

П.П. Тези неща

"

0
aldraganov avatar aldraganov 3 Точки

Аз също имах проблем и получавах 90/100 точки. Стигнах до извода, че при input на парите нужни за екскурзия и наличните могат да бъдат еднакви числа и currentlySaved < vacationPrice условие да не бъде удовлетворено и да не ти влезе в while() цикъла, което като последствие не ти инкрементира дните(days++;) и като output получаваш 0 дни, а judge иска да бъде 1 ден. Разбира се може да не съм прав тука, но това ми беше единственото обяснение да не приема задачата.

Успях да реша задачта, като използвах do while() цикъл, който винаги се изпълнява поне един път.

2
dmartinov avatar dmartinov 36 Точки

Да, това си помислих и аз по едно време и също си направих застраховка. Решението с do-while е готино, но аз реших да сложа нещо, което все пак е влизало в лекциите до момента и сложих един елементарен if преди while цикъла, тоест стана ето така: 

#include <iostream>
#include <string>

using namespace std;

int main() {

    double vacationPrice, currentlySaved;
    cin >> vacationPrice >> currentlySaved;
    int daysToSpent = 0;
    int days = 0;

    if (currentlySaved == vacationPrice) {
        days++;
    } else {
        while (currentlySaved < vacationPrice && daysToSpent < 5) {
            string action;
            double amount;
            cin >> action >> amount;
            if (action == "spend") {
                if (currentlySaved <= amount) {
                    currentlySaved = 0;
                    daysToSpent++;
                } else if (currentlySaved > amount) {
                    currentlySaved -= amount;
                    daysToSpent++;
                }
            } else if (action == "save") {
                currentlySaved += amount;
                daysToSpent = 0;
            }
            days++;
        }
    }
    if (daysToSpent == 5) {
        cout << "You can't save the money." << endl;
        cout << days << endl;
    } else if (currentlySaved >= vacationPrice) {
        cout << "You saved the money for " << days << " days." << endl;
    }

    return 0;
}
 

НО и това решение дава същите 90 точки. Би ли показал твоят вариант с do-while, за да направя сравнение на логиките ни. Може би някъде там бъркам нещо

0