Tema 1 - Now You See Me
Actualizări
Obiective
Introducere
“The closer you think you are, the less you'll actually see.”
Faimosul grup de iluzionisti pune la cale un nou show pentru care au nevoie de cei mai experimentați voluntari. Plictisiți de monotonia de la facultate și dornici să experimentați ceva nou, ați luat decizia să mergeți și voi la preselecții.
Pentru a putea lua parte la acest spectacol, veți fi supuși unor teste ce implică trucuri cu cărți. Scopul vostru este să demonstrați că sunteți capabili să impresionați membrii grupului și să vă câștigați locul în show.
Cerință
Veți primi de la unul din membrii grupului mai multe pachete de cărți pe care le veți ține într-o listă dublu înlănțuită. În cadrul fiecărui pachet, cărțile sunt ținute sub forma unei liste dublu înlănțuite.
Fiecare carte are două proprietăți: valoare (în intervalul [1, 14]) și simbol (HEART, CLUB, DIAMOND, SPADE).
Pentru a vă testa abilitățile, membrii grupului vă vor da, pe rând, diverse comenzi pe care va trebui să le executați asupra pachetelor. Aveți grijă însă, trebuie să realizați perfect trucurile pentru a îi convinge pe magicieni că vă meritați locul!
Comenzi posibile (30p)
ADD_DECK <număr_cărți>
adaugă un nou pachet de <număr_cărți> cărți la finalul listei de pachete.
comanda este urmată de cel puțin <număr_cărți> perechi {valoare, simbol}, dintre care se vor adăuga în pachet primele <număr_cărți> perechi valide.
în momentul în care pachetul construit ajunge la capacitatea <număr_cărți>, pachetul va fi inserat în lista de pachete.
dacă cartea introdusă este una invalidă, se va afișa eroarea INVALID_CARD (vezi secțiunea dedicată erorilor).
după adăugarea pachetului în lista de pachete se va afișa mesajul: “The deck was successfully created with <număr_cărți> cards.\n”.
DEL_DECK <index_pachet>
DEL_CARD <index_pachet> <index_carte>
șterge cartea <index_carte> din pachetul <index_pachet>
dacă în urma comenzii pachetul rămâne fără cărți, acesta este șters din lista de pachete.
după finalizarea comenzii se va afișa mesajul: “The card was successfully deleted from deck <index_pachet>.\n”.
ADD_CARDS <index_pachet> <număr_cărți>
adaugă în pachetul <index_pachet> <număr_cărți> cărți.
comanda este urmată de cel puțin <număr_cărți> perechi {valoare, simbol}, dintre care se vor adăuga la finalul pachetului <număr_cărți> perechi valide.
după adăugarea celor <număr_cărți> cărți se afișează mesajul: “The cards were successfully added to deck <index_pachet>.\n”.
DECK_NUMBER
DECK_LEN <index_pachet>
SHUFFLE_DECK <index_pachet>
inversează prima și a doua jumătate a pachetului <index_pachet>.
prima jumătate conține primele n/2 cărți, iar a doua jumătate contine n/2 cărți (n par) sau n/2 + 1 carti (n impar), unde n este numărul de cărți din pachet.
după finalizarea comenzii se va afișa mesajul: “The deck <index_pachet> was successfully shuffled.\n”.
Exemplu:
Pachet 0: 1, 2, 3, 4, 5
Rezultat: 3, 4, 5, 1, 2
Exemplu:
Pachet 0: 1, 2, 3, 4
Pachet 1: 4, 5, 6, 7, 11, 12, 13
Rezultat: 1, 4, 2, 5, 3, 6, 4, 7, 11, 12, 13
Pachet 0: 1, 2, 3, 4
Pachet 1: 7, 8, 9
Pachet 2: 12, 13, 14
SPLIT_DECK 0 2
Rezultate:
Pachet 1a: 1, 2
Pachet 1b: 3, 4
Pachet 2: 7, 8, 9
Pachet 3: 12, 13, 14
Tratarea erorilor (50p)
La primirea comenzilor de la tastatură pot apărea unele erori:
DECK_INDEX_OUT_OF_BOUNDS
CARD_INDEX_OUT_OF_BOUNDS
INVALID_CARD
această eroare apare dacă se încearcă introducerea unei cărți care nu are valoarea în intervalul [1, 14] sau simbolul in lista [“HEART”, “SPADE”, “CLUB”, “DIAMOND”].
mesajul afișat: “The provided card is not a valid one.\n”.
INVALID_COMMAND
Erorile de index aduc după sine suspendarea execuției restului comenzii!
Bonus (10p)
SORT_DECK <index_pachet>
sortează pachetul <index_pachet> după valoarea cărților de joc.
dacă au aceeași valoare, prioritatea simbolurilor va fi: {HEART, SPADE, DIAMOND, CLUB} (inima rosie va avea cea mai mare prioritate, iar trefla cea mai mica).
după finalizarea comenzii se va afișa mesajul: “The deck <index_pachet> was successfully sorted.\n”.
README (20p)
Coding Style (10p)
Mențiuni
Indexarea se face de la 0 pentru orice tip de listă.
Alocarea memoriei se va realiza dinamic. Alocarea statică a bufferelor a căror dimensiune nu se cunoaște la compile-time, atrage dupa ea depunctări.
Se cere ca structura de date folosită să fie generică. Pentru implementare lipsită de genericitate, se vor pierde 20p din totalul temei.
O structură de date generică are rolul de a nu duplica (pe cât posibil) cod permițând adăugarea în cadrul ei a oricărui tip de date. (hint: void*)
Exemplu: Vedeți în cadrul scheletului de lab unde a trebuit să implementați exact această situație. (hint: data_size)
Nu este indicată utilizarea variabilelor globale. Utilizarea acestora aduce pierderea a 20p din totalul temei.
Eliberarea memoriei se va verifica folosind utilitarul Valgrind. O temă ce conține memory leaks va atrage după sine punctaj de 0p pe testul respectiv.
Checker
Teste: 2022-tema1-check.zip.
Temele vor fi trimise pe vmchecker.
Atenție! Temele trebuie trimise în secțiunea Structuri de Date (CA).
Arhiva trebuie să conțină:
sursele .c și .h
fișier Makefile cu două reguli:
Compilarea trebuie sa se realizeze cu flagurile -Wall -Wextra -std=c99
fișier README care să conțină detalii despre implementarea temei