Lawful Evil #5 – instrukcja retum

Nie byłem pewien, czy dodawać tę historię, ponieważ nie zakończyła się ona pełnym sukcesem, ale uznałem, że rozwiązanie na to zasługuje. Historia zaczęła się pewnego pięknego środowego popołudnia:

Hej koledzy z #programowanie #cpp Potrzebuje pilnej pomocy ! place jak za króla ;D Pisze własne kolosa mam czas do okooło 18:30 jest do drugi termin 🙁 Tresc zadania
1.Napisac program wykorzystujacy stos, ktory sprawdza czy w danym wyrazeniu nawiasy sa prawidlowo zagniezdzone. Przetestowac dzialanie na wyrazeniu ” [ [ ] [ [ ] [ [ ] ”

2.Opracowac rekurnecyjny algorytm pozwalajacy zamienic liczbe dziesietna na liczbe w systemie trojkowym. Sprawdzic dla liczby 123

Liczy na was 5 osob

Rozwiązałem tylko zadanie drugie – na pierwsze zabrakło czasu i pomysłu.

Przede wszystkim, zacznijmy od definicji awangardowej instrukcji retum:

#define retum throw

Teraz można zabrać się za implementację. Warto trochę pogeneralizować, i utworzyć funkcję pozwalającą ustalać podstawę rozwinięcia:

template<int Base>
string to_base(int value)
try
{
    to_base_impl<Base>(value);
    return {};
}
catch(return_value rv)
{
    return rv.val;
}

W funkcji to_base_impl można już użyć tercetu try, catch i retum:

template<int Base>
void to_base_impl(int value)
{
    try {
        if(value/Base)
            to_base_impl<Base>(value/Base);
        else
            retum return_value{};
    } catch(return_value rv) {
        rv.val += to_string(value % Base);
        retum rv;
    }
}

retum wymaga specjalnego typu zwracanego:

struct return_value : exception
{
    std::string val;
    char const* what() const noexcept override {
        return val.c_str();
    }
};

Czyli składając to wszystko do kupy:

#define retum throw
 
struct return_value : exception
{
    std::string val;
    char const* what() const noexcept override {
        return val.c_str();
    }
};
 
template<int Base>
void to_base_impl(int value)
{
    try {
        if(value/Base)
            to_base_impl<Base>(value/Base);
        else
            retum return_value{};
    } catch(return_value rv) {
        rv.val += to_string(value % Base);
        retum rv;
    }
}
 
template<int Base>
string to_base(int value)
try
{
    to_base_impl<Base>(value);
    return {};
}
catch(return_value rv)
{
    return rv.val;
}
 
int main()
{
    DBG(to_base<3>(1));
    DBG(to_base<3>(2));
    DBG(to_base<3>(3));
    DBG(to_base<3>(123));
}

[link]

17 thoughts on “Lawful Evil #5 – instrukcja retum

  1. Zadanie z nawiasami to klasyka informatyki na studiach 😀 Przy otwarciu nawiasu pushujemy na stos, a przy zamknieciu popujemy. Jezeli po zakonczeniu dzialania mamy pusty stos, a w trakcie nie probowalismy pobrac z niego wiecej niz bylo to znaczy, ze wszystko bylo w porzadku 😉

    1. Takie zadania otwarte są dziwne, nie wiadomo jak mają się zakończyć, zrobisz po swojemu, a potem się dowiesz że miało być inaczej tylko nie wiadomo jak, często na rozmowach rekrutacyjnych to stosują, mówię o tym 1 i do tego robisz na czas np: 15 – 20 minut, to z nawiasami jest łatwiejsze to pewnie 5 minut 😉 i nie wiem co to ma udowodnić.

  2. Nie wiem czemu wykładowcy to masochiści i babrają się w tym z C++ jak jest dużo lepszych rozwiązań xD

    1. Nie ma wielu lepszych rozwiązań od C++. Jest po prostu wiele osób, którym nie chce się zagłębić w możliwości jakie daje ten wspaniały język programowania. ; ) Choć porównanie dwóch zbiorów i zwrócenie wszystkich wspólnych elementów prościej jest wykonać skryptem *.py, używając kwargs…

  3. 463271 10409magnificent post, extremely informative. I wonder why the other specialists of this sector do not notice this. You must continue your writing. Im positive, youve a fantastic readers base already! 876379

  4. 320552 118829Hiya! awesome weblog! I happen to be a every day visitor to your internet site (somewhat a lot more like addict ) of this web site. Just wanted to say I appreciate your blogs and am searching forward for more to come! 822097

  5. 317773 234075This sort of in search of get the enhancements produced on this special lifestyle and diet, begin your L . a . Shifting the pounds diet answer is really a huge procedure into accesing which usually hope. weight loss 17493

  6. 182484 833629You produced some decent points there. I looked on-line towards the issue and discovered most individuals will go along with along together with your internet web site. 435064

  7. 712202 738942Nice post. It does shed some light on the issue. By the for those interested in binary options can get an exclusive binary options bonus. 464590

  8. 419027 132047Its truly a good and useful piece of info. Im glad that you just shared this valuable information with us. Please maintain us informed like this. Thanks for sharing. 275461

Leave a Reply

Your email address will not be published.