This is an old revision of the document!
Tema constă într-o aplicație care simulează fluxul clienților pe la casele unui supermarket, și constă în 4 etape:
Așa cum se poate observa, ziua deadline-ului variază în funcție de semigrupa în care sunteți repartizați. Restanțierii care refac tema și nu refac laboratorul beneficiază de ultimul deadline (deci vor avea deadline-uri în zilele de 20.03, 27.03, 03.04, 10.04).
Rezolvările tuturor etapelor pot fi trimise până la ora 08:00 în ziua laboratorului 7, dar orice exercițiu trimis după deadline-ul soft și înainte de deadline-ul hard (care este dimineața zilei laboratorului 7) se punctează cu jumătate din punctaj. Orice exercițiu trimis după deadline-ul hard nu se mai punctează deloc. Nota finală pe etapă se calculează conform formulei: n = (n1 + n2) / 2 (n1 = nota obținută înainte de deadline-ul soft; n2 = nota obținută între deadline-ul soft și cel hard). Când toate submisiile sunt înainte de deadline-ul soft, nota pe ultima submisie este și nota finală (întrucât n1 = n2).
În fiecare etapă, veți folosi ce ați învățat în săptămâna anterioară pentru a perfecționa aplicația.
Pentru fiecare etapă veți primi un schelet de cod (dar rezolvarea se bazează în mare măsură pe rezolvările anterioare). Enunțul din această pagină este menit să descrie pe scurt aplicația și să ofere exemple de rulare a funcțiilor mai complexe. Dacă preferați, puteți rezolva tema utilizând doar indicațiile din schelet.
În această etapă presupunem că supermarket-ul are fix 4 case (“counters” în engleză): C1, C2, C3, C4.
Fiecare casă este reprezentată ca o structură:
(define-struct counter (index tt queue))
indexC1, 2 pentru C2, etc.)tttt unități de timp până să ajungă în față (pentru conveniență vom considera unitatea de timp ca fiind 1 minut, chiar dacă este nerealist)queue(nume . nr-produse), reprezentând persoanele așezate la coadă la această casă (fiecare persoană apare în pereche cu numărul de produse cumpărate)Deși nu am studiat structuri la curs sau laborator, utilizarea lor este simplă (și ne ajută să avem un cod mai lizibil). Aveți aici un tutorial foarte scurt cu tot ce vă trebuie pe partea de structuri și pattern matching.
Statutul caselor diferă astfel:
C2-C4 sunt deschise tuturor clienților C1 acceptă doar clienți care au cumpărat maxim ITEMS produse (ITEMS este o constantă definită în schelet)În această etapă, simulatorul trebuie să modeleze două situații:
Funcțiile principale pe care va trebui să le implementați sunt:
(min-tt counters)
counters care are tt minim, și întoarce perechea dintre indexul acestei case și valoarea tt-ului ei) (min-tt (list (counter 1 10 '()) (counter 2 12 '((ana . 12)))))
tt-ul minim este 10, la casa 1'(1 . 10)(add-to-counter C name n-items)
C persoana name cu n-items produse (ceea ce se adaugă este o pereche care conține ambele informații)(add-to-counter (counter 1 10 '((dan . 10))) 'ana 12)
'(ana . 12) la sfârșitul cozii (counter 1 22 '((dan . 10) (ana . 12)))(serve requests C1 C2 C3 C4)
Exemplu:
(serve '((ana 12) (delay 1 5) (mia 2)) C1 C2 C3 C4)
unde presupunem că C1-C4 sunt în prezent lipsite de clienți, iar ITEMS = 5:
C2, C3, C4C2 pentru că are index minimC1 trebuie să aștepte 5 minute până când cineva îl va lua în primireC1 este întârziată cu 5 minute (tt = 5), la C2 stă ana (tt = 12), C3 și C4 nu au nici clienți, nici întârzieri (tt = 0)C3 pentru că, dintre casele cu tt minim, C3 are index minim(list (counter 1 5 '()) (counter 2 12 '((ana . 12))) (counter 3 2 '((mia . 2))) (counter 4 0 '()))