logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zaprojektować algorytm automatu z resztą i brakami produktów?

fuutro 17 Lis 2005 16:42 10264 12
  • #1 1999315
    fuutro
    Poziom 43  
    Posty: 9921
    Pomógł: 1450
    Ocena: 837
    Witam.
    Niewiem czy dobrze trafilem, ale...
    Dostałem takie zadanie:

    "Automat powinien dysponować kilkoma rodzajami produktów. Urzytkownik uiszcza opłatę za pomocą monet o nominałach nie mniejszych niż 10gr. Określona kwota umożliwia użytkownikowi zamówienie odpowiedniego produktu. W przypadku, gdy uiszczona kwota jest większa od ceny produktu - automat wydaje resztę - a gdy za mała - rząda dopłaty z ewentualnym wydaniem reszty. Należy przewidzieć zachowanie automatu w przypadku braku produktów lub/i braku możliwości wydania reszty."

    Problem w tym, że na wykładzie najbardziej rozbudowanym zadaniem było rozwiązanie funkcji kwadratowej, a tu nagle gościu wyskoczył z takim zadaniem. Proszę o pomoc (może nawet rozwiązanie?) w rozwiązaniu problemu, nakierowanie na właściwy tor myślenia. Z góry dzięki!!!
  • #2 1999500
    vibrasphere
    Poziom 15  
    Posty: 134
    Pomógł: 11
    Ocena: 1
    Czy to ma być wykonane jako automat synchnoniczny np Moora?
  • #3 1999516
    ghost666
    Tłumacz Redaktor
    Posty: 11961
    Pomógł: 157
    Ocena: 10267
    To ma być skonstruowane urzadzenie czy napisany program? jesli program to w czym(jakim języku)?
  • #4 2000635
    stepowicz
    Poziom 17  
    Posty: 160
    Pomógł: 18
    Myślę, że powinieneś to podzielic na trzy stany:

    1) wybór produktu, wrzucanie monent
    2) wyznaczenie czy jest mozliwe wydanie reszty
    3) wydawanie produktu i reszty

    Jeśli stan pierwszy zakończy sie sukcesem czyli jest zamawiany produkt w automacie oraz wrzucona kwota bedzie większa, równa kwocie wybranego napoju oraz gdy stan drugi zakończy sie sukcesem czyli jest odpowiednia ilosc monet do wydania reszty to automat powinen wydac napoj oraz reszte (stan III).
    Pod każdym ze stanów rozrysuj sobie mniejsze decyzje związane z każdym stanem.
  • #5 2001058
    fuutro
    Poziom 43  
    Posty: 9921
    Pomógł: 1450
    Ocena: 837
    Tylko jak to zrobić w Magicznych Bloczkach, aby było w "miarę" prosto?
  • #6 2001378
    frohme
    Poziom 21  
    Posty: 421
    Pomógł: 25
    Ocena: 15
    Pewnie na początku wykładu było jaki kształt bloczku do jakiej czynności. Prostokąt to jakieś działanie logiczne typu: włącz silnik, poziomy romb to decyzja wyboru przy spełnieniu warunku podanego w środku - jedna droga to jak tak, druga jak nie. O podprogramie na razie nie mówmy.
    Proponowałbym taki ciąg na początek. Owal (stadion) z napisem START, romb z warunkiem jest produkt A?, na drodze TAK prostokąt "Sygnalizuj - jest A", a po nim zbiegają się dwie ścieżki - ta od prostokąta i od rombu z drogą NIE. Powtórz to samo dla produktu B, potem dla C no i początek zrobiony. Analogicznie działaj dla zliczarki pieniędzy i wydawania reszty.
  • #7 2001413
    fuutro
    Poziom 43  
    Posty: 9921
    Pomógł: 1450
    Ocena: 837
    Zasadnicze funkcje bloczków to tam jeszcze znam, problemen było ułożenie zasady działania programu- głównie rozpoznania pieniędzy i wyboru produktu.
  • #8 2003047
    frohme
    Poziom 21  
    Posty: 421
    Pomógł: 25
    Ocena: 15
    Dokładnie tak samo jak poprzedni ciąg logiczny, czyli dla pieniążków wrzucanych w przepastną gardziel automatu: 1) sumę ustaw na zero 2)czy to co wpadło to 10gr jak tak to dodaj do sumy jak nie to sprawdzaj czy może 20 gr itd. W tym przypadku cały czas jest aktualna suma do dyspozycji i jeżeli klient decyduje się na produkt to tylko sprawdzić czy suma jest wystarczająca, wydać towar albo i nie jak kasa za mała, i odwrotnym ciągiem logicznym wydać należną resztę albo zwrócić całą sumę gdy nie ma wydawania produktu.
  • #9 2015455
    _kamil
    Poziom 12  
    Posty: 41
    Hej fuutro czyżby PŚ w Gliwicach :>

    mam podobny problem tylko ja mam troche inne zadanie i nie wiem ajks ie do tego ugryźc
    bo kompletnie sie nei znam na tym programowaniu moze mi ktos pomoże oto treść:
    Cytat:
    Automat w pierwszej kokjenosci zlicza liczbe i nominał monet. Przyjmowanie są monety o nominałach 10 gr i więcej. Po wprowadzeniu określonej kwoty automat realizuje zlecenie wydania jednego z 3 możliwych rodzajów biletu. W przypadku gdy uiszczona kwota jest jest wieksza od ceny biletu - automat wydaje resztę gdy kwota jest mniejsza żąda dopłaty (może wydac później resztę) Nalezy przewidzieć zachowanie automatu w przypadku braku biletów i/lub braku możliwości wydania reszty.

    Jkaby ktoś mi pomógł w tej sprawie byłbym bardzo wzdzieczny
  • #10 2016258
    Paweł Es.
    VIP Zasłużony dla elektroda
    Posty: 6981
    Pomógł: 1236
    Ocena: 693
    Można spróbować coś takiego:

    automat zlicza:

    - sumę wrzuconych monet
    - liczbę monet każdego nominału
    - ma liczniki ilości sztuk danego produktu (ustawiane na N w momencie ładowania automatu i zmniejszane co jeden przy wydawaniu

    wydanie jest możliwe jeżeli:

    - jest przynajmniej jedna sztuka danego produktu
    i
    - można wydać resztę

    Przy wrzucaniu monety są segregowane i zwiększane są liczniki monet (i suma monet),
    przy wydawaniu reszty są one odpowiednio zmniejszane (suma monet jest zmniejszona o cenę produktu).


    
    
    Start:
    
    suma:=0; {Suma wrzuconych monet w groszach}
    repeat
        if kasa=0 then Wyświetl("Brak reszty");
        if m10 then suma:=suma+10; {Tu powinny być także zwiększane liczniki monet danego nominału i kasa }
        if m20 then suma:=suma+20;
        if m50 then suma:=suma+50;
        if m100 then suma:=suma+100;
        if m200 then suma:=suma+200;
        if m500 then suma:=suma+500;
    
        Wyświetl(suma); {Wyświetla sumę wrzuconych monet}
    
        if zwrot then Zwrot(suma); {Wciśnęto przycisk zwrot}
    
        if ((przycisk_prod1) and (licz_prod1>0)) then
          begin {Wciśnięto przycisk prod1 i jest produkt 1)
            if suma>=cena1 then
              begin {Wrzucono wystarczająco}
                 If TestReszty(suma-cena1) then
                   begin; {Da się wydać resztę}
    
                      Wydaj(produkt1) {Wydawanie produktu 1}
                      licz_prod:=licz_prod-1; {zmniejszenie liczby
                                                           sztuk produktu 1}
                      suma:=suma-cena1;    {obliczenie reszty}
                      WydajReszta(suma);    {Wydanie reszty}
                      suma:=0;
                   end
                 else
                   begin
                      Wyświetl('Brak reszty');
                      Oddaj(suma);
                   end;
               end;
            end;
    
          {tu wpisujemy podobne testy dla pozostałych produktów }
    
    until false;     
    
    


    TestReszty - sprawdza czy można wydać resztę z różnicy
    muszą być liczniki poszczególnych typów monet (na podstawie tego automat może obliczyć kasę i sprawdzić czy po pierwsze ma sumę do wydania i po drugie czy przy pomocy monet posiadanych jest w stanie to zrobić.

    Sprawdzenie reszty przez kolejne odejmowanie od wartości reszty wartości monet od najstarszej. Jeżeli po pełnym cyklu odejmowania monet reszta jest wciąż > 0 to znaczy, że nie mozna wydać reszty i nie można kupić (w rzeczywistych automatach, mozna kupić ale klient decyduje czy sobie odpuści resztę).
  • #11 2017302
    fuutro
    Poziom 43  
    Posty: 9921
    Pomógł: 1450
    Ocena: 837
    Faktycznie jestem na PŚ w Gliwicach.
    Dzięki za pomoc, ale czy pomysł Pawła Es nie pasuje bardziej do C niż Magicznych Bloczków?
    Zauważyłem, że posiadane przezemnie Magiczne bloczki działają trochę inaczej niż te na uczelni (inaczej reagują na kilka warunków jednocześnie) mimo tej samej konfiguracji, jak to jest?
  • #12 2018729
    _kamil
    Poziom 12  
    Posty: 41
    @paweł Es.: wszsytkie fajnie ale jak mam to napisać w Magocznych Bloczkach?
  • #13 2019095
    fuutro
    Poziom 43  
    Posty: 9921
    Pomógł: 1450
    Ocena: 837
    Powiedzmy, że "doszedłem" do czegoś takiego jak w załączniku. Jak rozwiązać błąd zawarty w pliku??
    Załączniki:
    • Automat-bloczki.rar (518 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.

Podsumowanie tematu

✨ Dyskusja dotyczy zaprojektowania algorytmu automatu vendingowego obsługującego kilka rodzajów produktów oraz operującego monetami o nominałach nie mniejszych niż 10 groszy. Automat ma umożliwiać wybór produktu, przyjmować wpłaty, wydawać resztę lub żądać dopłaty, a także obsługiwać sytuacje braku produktów lub braku możliwości wydania reszty. Proponowane podejście to podział działania na trzy główne stany: wybór produktu i wrzucanie monet, sprawdzenie możliwości wydania reszty, oraz wydanie produktu i reszty. Wskazano na konieczność rozrysowania decyzji w formie schematu blokowego (tzw. Magiczne Bloczki), gdzie prostokąty reprezentują działania, a romby decyzje warunkowe. Sugerowano implementację liczenia sumy wrzuconych monet, segregowanie ich według nominałów, oraz prowadzenie liczników ilości monet i produktów. Wydanie produktu jest możliwe, gdy jest dostępny w automacie i można wydać resztę. W przypadku braku reszty lub produktu automat powinien odpowiednio zasygnalizować problem lub zwrócić wpłaconą kwotę. Dyskusja porusza także kwestie techniczne związane z implementacją w środowisku Magicznych Bloczków oraz różnice w ich działaniu na różnych konfiguracjach. Przykładowy pseudokod ilustruje sposób zliczania monet i obsługi stanów automatu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA