Tema 1: Depot Manager 2014

Responsabili

Deadline soft: 23 martie, ora 23:55

Depunctare întârziere după depășirea deadline-ului soft: -10p/zi

Deadline hard: 26 martie, ora 23:55

Modificări și actualizări

  • 4 martie adăugat clarificare legată de cum se descarcă trenul în depou
  • 5 martie adăugat clarificare legată de comportamentul liniilor de depou
  • 7 martie actualizat arhiva de teste
  • 9 martie actualizat test.sh din arhiva de teste
  • 11 martie actualizat test.sh din arhiva de teste

Obiective

În urma realizării acestei teme:

  • veți învǎţa să definiți și să folosiți tipuri de date proprii
  • veți fi capabili să implementați o stivă generică
  • vă veți acomoda cu sintaxa de C++

Ne propunem să simulăm funcționalitatea unui depou feroviar, pentru a face CFR să dea faliment.

Cum funcționează

Avem un depou feroviar cu N linii în care pot intra vagoane de trenuri, ca în figura de mai jos. Maxim M vagoane (presupuse de dimensiune identică) pot încăpea pe fiecare linie.

Trenurile sunt, în general, eterogene (pot conține vagoane de tipuri diferite), dar trebuie să permitem intrarea lor în depou, ceea ce presupune descompunerea lor în vagoanele constituente și inserarea vagoanelor pe liniile corespunzătoare. De asemenea, trebuie să permitem compunerea de noi trenuri din vagoanele disponibile și punerea lor în circulație. În caz de imposibilitate a oricărei operații, vom semnala o eroare.

 Diagramă

Trebuie să suportăm două mari operații posibile:

  • intrarea unui tren în depou și descompunerea lui în vagoane (operația 0)
  • compunerea unui tren din mai multe tipuri de vagoane cunoscute, disponibile pe liniile depoului nostru (operația 1)

Aceste operații se realizează astfel:

  • Golirea trenului la intrarea în depou
    • vagoanele se vor descărca fiecare pe câte o linie, începând cu linia 0. Astfel, vagonul de la coada trenului ajunge pe linia 0, următorul pe linia 1 ș.a.m.d
    • dacă se ajunge la ultima linie, se va reîncepe cu linia 0 (= sistem circular)
    • dacă linia pe care trebuie sa ajungă vagonul curent este plină (liniile au o capacitate finită), acesta se va descărca pe linia imediat următoare, x+1
      • iterația merge până când este găsită o linie în care vagonul curent are loc
      • circularitatea de la punctul precedent se păstrează
    • (4 martie) trenurile vor intra cu spatele în depou; astfel, locomotiva/vagonul din față va fi ultimul vagon descărcat
    • dacă depoul nu are capacitatea necesară inserării trenului, se va semnala eroare, fără a modifica structura anterioară a depoului (adică ori intră toate vagoanele, ori nu intră niciunul)
  • Compunerea unui tren nou
    • se știu dinainte vagoanele cu care trebuie alcătuit trenul și ordinea lor
    • în ordine, se caută fiecare tip de vagon, astfel (presupunem că se dorește găsiea unui vagon de tip x):
      • se ia fiecare linie, incepând de la 0, și se caută un vagon x în respectiva linie
      • în cazul în care pe linia la care ne uităm se găsește într-adevăr un vagon x, există 2 cazuri:
        1. vagonul x este primul vagon accesibil, atunci este scos fără nicio problemă
        2. vagonul x nu este accesibil direct - atunci vor trebui scoase vagoanele din fața lui x și puse pe liniile următoare (cu circularitatea de rigoare), unul câte unul (ca la golire)
    • dacă depoul nu are toate vagoanele necesare creării trenului cerut, se va semnala eroare, fără a modifica structura anterioară a depoului
    • Atenție! Există cazuri excepționale în care problema creării unui tren nu are soluție. De exemplu, considerați că aveți o singură linie de depou cu două vagoane, unul de tipul 1 și unul de tipul 0. Dacă există o cerere de creare a unui tren cu vagoanele în ordine inversă decât cea de pe stivă, ea nu poate fi satisfăcută fără o structură auxiliară. Pentru scopul acestei teme, nu ne vom ocupa de problema aceasta (vom garanta corectitudinea testelor).

Cerințe

Implementați, folosind cunoștințele pe care le-ați dobândit la cursul de Programare și in primele 3 laboratoare de SD, scenariul descris mai sus.

Veți citi dintr-un fișier de intrare (primit ca parametru în linia de comandă) parametrii scenariului și fiecare operație în parte, urmând ca voi să scrieți la consolă (sandard out) configurațiile depoului după fiecare operație.

Formatul datelor de intrare

Veți citi pe rând:

  • pe prima linie: numărul de linii din depou, capacitatea unei linii de depou (numărul maxim de vagoane pe care le poate acomoda) și numărul de operații, nOp
  • apoi, pe următoarele nOp linii:
    • tipul operației (0 = acomodare tren, 1 = compunere tren nou)
    • lungimea trenului
    • apoi, foarte important, compoziția trenului, organizată pe grupuri de vagoane, în formatul nrVag tipVag
      • de exemplu: 0 3 1 0 1 1 1 2 - va intra un tren de lungime 3, care are în ordine, un vagon tip 0 (locomotiva), un vagon tip 1 și un vagon tip 2
      • alt exemplu: 1 10 1 0 4 1 5 2 - se va construi un tren nou cu lungimea 10, cu vagoanele, în ordine: un vagon 0, 4 vagoane tip 1 și 5 vagoane tip 2

Nu e nevoie să faceți validări ale datelor, fișierele vor respecta constrângerile care intervin (de tipul: suma valorilor nrVag din descrierea unui tren va da tot timpul lungimea trenului)

Formatul datelor de ieșire

Veți afișa, după fiecare operație pe care o faceți, configurația depoului și eventual mesajele de eroare.

Configurația depoului va arăta astfel:

  • pe câte o linie, ordinea vagoanelor de pe fiecare linie de depou, scrisă astfel:
    • indicele liniei de depou (se începe de la 0)
    • caracterul :, apoi caracterul (spațiu)
    • numărul de vagoane de pe linia respectivă, apoi (spațiu)
    • apoi, în ordine, începând de la baza (capătul liniei), vagoanele, în același stil grupat ca la compoziția trenurilor
    • Exemple:
      • 2: 0 - linia 2 este goală
      • 0: 5 1 0 4 1 - linia 0 are 5 vagoane, unul de tip 0 și 4 de tip 1

Dacă operația curentă este imposibilă, veți afișa mesaje de eroare specifice, înainte de a afișa și configurația depoului. Mesajele sunt:

  • Dock error! pentru imposibilitatea acomodării unui tren în depou
  • Train error! dacă trenul cerut nu poate fi construit

În caz de operație imposibilă, veți afișa mesajul de eroare, iar începând cu linia imediat următoare configurația depoului.

Cum vom implementa

Vom modela fiecare componentă importantă a scenariului nostru printr-o clasă C++. Astfel, vom avea nevoie de vagoane, trenuri și depou ca tipuri separate de obiecte.

Atât trenurile, cât și liniile în care vor intra vagoanele, vor folosi stive generice (veți folosi, deci template-uri). Ne gândim la o implementare simplă pentru stive, utilizând vectori alocați dinamic. Un tren va fi asemănat cu o stivă în care locomotiva este primul vagon de la bază, iar liniile de depou mărginite la un capăt au o structură în mod natural similară stivelor. Vă puteți imagina depoul ca un vector de astfel de linii.

Tipurile diferite de vagoane se vor diferenția printr-un id întreg. Chiar dacă acest număr este singura informație utilizată curent în cadrul vagoanelor, veți considera vagonul ca o clasă de sine stătătoare, din considerente de design extensibil (dacă, de exemplu, adăugăm și informații legate de tipul de marfă, capacitate de transport etc, utilizarea clasei pentru vagoane este mult mai facilă).

De asemenea, stiva voastră generică trebuie să suporte operațiile de bază specifice, anume

  • push - adăugare pe stivă
  • pop - scoatere de pe stivă
  • top - elementul din vârful stivei
  • isEmpty - determină dacă stiva este vidă

În rest, este la latitudinea voastră cum vă organizați funcționalitățile (clase/metode/funcții auxiliare etc.).

(5 martie) În secțiunea de comportament am menționat faptul că atunci când ne dorim un tren nou, ne uităm pe fiecare linie și căutăm vagoanele necesare. Chiar dacă liniile se comportă ca stive, aveți voie să vă uitați la conținutul lor, dar nu aveți voie să modificați structura lor decât prin mecanisme specifice stivelor.

Teste publice

Aveți la dispoziție o arhivă ce conține o suită de teste publice (singurele cu care va fi testată tema) și un script de testare automată a temei. Scriptul este de bash(Linux).

Atenție! Pentru ca testarea sa mearga, executabilul generat de tema voastră trebuie să fie în același director cu scriptul test.sh, respectiv cu directoarele input și ref din arhiva de mai jos.

Arhiva de testare

Reguli pentru trimitere

Temele vor trebui trimise pe vmchecker. Atenție! Temele trebuie trimise în secțiunea Structuri de Date (CA).

Arhiva trebuie să conțină:

  • surse
  • fișier Makefile cu două reguli:
    • regula build: în urma căreia se generează un executabil numit tema1
    • regula clean care şterge executabilul
  • fisier README care să conțină detalii despre implementarea temei

Punctaj

  • 80 puncte obținute pe testele de pe vmchecker
  • 10 puncte: coding style
  • 10 puncte: README + alte eventuale penalizări
  • Bonus 10 puncte pentru soluțiile ce nu au memory leak-uri.
  • TOTAL: 100 puncte (+10 bonus)

Coding style-ul trebuie sa fie consistent și ușor de citit. Ca ghid vă recomandăm:

sau

Atenție! Tema valorează 1 punct din nota finală. Citiți cu atenție Regulamentul General de Trimitere a Temelor.

Nu copiați! Toate soluțiile vor fi verificate folosind o unealtă de detectare a plagiatului. În cazul detectării unui astfel de caz, atât plagiatorul cât și autorul original (nu contează cine care e) vor primi punctaj 0 pe toate temele!

De aceea, vă sfătuim să nu vă lăsați rezolvări ale temelor pe calculatoare partajate (la laborator etc), pe mail/liste de discuții/grupuri etc.

FAQ

Q: Se poate folosi STL?

A: Nu puteți folosi structurile gata implementate în STL. Obiectivul principal al cursului de structuri de date este acela ca voi să implementați structurile respective.

Resurse

sd-ca/2014/teme/teme-01.txt · Last modified: 2015/02/18 14:05 by alexandru.olteanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0