Termen de predare:
Pentru fiecare zi (24 de ore) de întârziere, se vor scădea 10 puncte din nota acordată, până la atingerea deadline-ului hard.
Dacă aveți nelămuriri, puteți să ne contactați pe forumul dedicat temei de casă nr. 1 sau pe canalul Temei 1.
La orice întrebare vom răspunde în maxim 24 de ore.
Nu se acceptă întrebări în ultimele 24 de ore înainte de deadline.
Tema va fi împărțiță în 3 părți independente, iar fiecare parte are diferite sarcini. Punctajul total pe teste este 90p, iar 10p se vor obține pe README.
Spock a fost trimis pe planeta Torothan datorită unei defecțiuni a teleportatorului. Acesta nu are echipamentul asupra sa și va trebui să folosească orice găsește prin deșert pentru a realiza un comunicator.
Pentru aceasta, ne cere ajutorul pentru a implementa câteva lucruri simple.
Codul pentru acest task trebuie scris în fișierul src/gates.c.
Având în vedere că Spock nu a mai lucrat de ceva timp cu biți, prima cerință este să implementăm următoarele operații pentru a-și reaminti
Pentru mai multe detalii verificați TODO-urile din fișierul gates.c marcate cu Task 1.
În urma ajutorului primit de la cerința anterioară, acesta și-a amintit cum să construiască o poartă nand. Din păcatate acesta mai are nevoie și de alte porți logice pentru a realiza comunicatorul.
Pentru mai multe detalii verificați TODO-urile din fișierul gates.c marcate cu Task 2.
Utilizând doar nand-uri și porțile deja definite, trebuie să construim următoarele tipuri de porți: and, not, or si xor.
Pentru a realiza ultima parte din comunicator, Spock are nevoie de noi pentru a realiza un sumator pe biți. Vom implementa ceea ce se numește un Ripple Carry Adder.
Pentru a construi sumatorul vom avea nevoie de o componentă auxiliară 1 Bit Full Adder care primește 3 biți la intrare și scrie 2 biți la ieșire, un bit de sumă și un bit de carry.
Pentru codificarea biților de sumă și carry avem la dispoziție 8 biți pe care îi putem seta cum dorim.
Trebuie folosite porțile definite la task-ul anterior pentru a completa acest task
Într-un final, pentru realizarea componentei finale (Ripple Carry Adder) vom utiliza 1 Bit Full Adder ca în schema de mai jos.
Pentru mai multe detalii verificați TODO-urile din fișierul gates.c marcate cu Task 3.
Rick a fost capturat de federația galactică. Deoarece și-a uitat teleportatorul, Rick îl contactează pe Morty pentru a-i oferi un set de instrucțiuni pentru trimiterea dispozitivului. Deoarece Morty nu prea se pricepe la programare, acesta apelează la noi pentru decodificarea mesajelor trimise de Rick.
fprintf(stdout, ...)
Codul pentru acest task trebuie scris în src/communication.c.
Rick i-a lăsat lui Morty 2 mecanisme prin care acesta poate primi și trimite un mesaj send_squanch, recv_squanch. Ambele primitive funcționează la nivel de octet:
Pentru primul task, Morty ne cere să îl ajutăm să verifice dacă poate comunica cu Rick prin intermediul acestor 2 mecanisme. Un caracter este codificat prin numere de la 1 la 26: 1 este A, 2 este B, …, 26 este Z.
Pentru mai multe detalii verificați TODO-urile din fișierul communication.c marcate cu Task 1.
Dupa ce ne-am obișnuit cu mecanimele de trimitere/primire de caractere, urmează să primim și să trimitem mesaje. Înainte de a primi/trimite mesajul trebuie să știm lungimea acestuia (numărul de caractere care vor fi trimise). Vom folosi send_squanch/recv_squanch (aceleași funcții) pentru a-l ajuta pe Morty să comunice cu Rick.
Lungimea mesajului va fi codificată pe un octet ca în imaginea de mai jos:
Atenție! BitX din imaginea de mai sus poate fi activ sau nu (nu trebuie luat în considerare).
Pentru mai multe detalii verificați TODO-urile din fișierul communication.c marcate cu Task 2.
Rick nu are mult timp la dispoziție pentru a trimite mesajul la Morty. El și-a dat seama că mesajul pe care dorește să îl transmită conține doar caractere de la A (codificat 1) la O (codificat 15). Din acest motiv se hotărăște să codifice 2 caractere pe un octet - 4 biți fiind suficienți pentru a codifica un caracter.
Rick decide să codifice caracterele în felul următor - folosind send_squanch2:
Pentru decodificare mesajului, vom extrage cele 2 caractere și le vom concatena - folosind recv_squanch2:
Pentru mai multe detalii verificați TODO-urile din fișierul communication.c marcate cu Task 3.
În această parte îl vom urmări pe Geralt din Rivia și îl vom ajuta să își ducă la capăt quest-urile.
Codul pentru acest task trebuie scris în src/hunt.c.
Geralt s-a întâlnit cu Yennefer, iar aceasta i-a cerut ajutorul. Yennefer trebuie să revitalizeze o pădure care a fost pângărită de surorile Crones, însă pentru a face lucrul acesta trebuie să afle vraja de spargere a blestemului.
Una dintre vrăjitoare cunoaște vraja - este criptată, iar o altă vrăjitoare cunoaște cheia de decriptare.
Geralt s-a întâlnit cu o serie de inamici mergând prin pădurea Brokilon. Deoarece witcher-ul nostru nu are timp de așa ceva, va încerca să ii doboare doar dintr-o lovitură.
Geralt ține mereu 2 săbii cu el, una de argint pentru monștri și una de oțel pentru oameni. Fiecare personaj negativ care îl atacă pe Geralt are diferite puncte slabe. Pentru acest task trebuie să îl ajutăm pe Geralt să aleagă atât sabia corectă, cât și să impregneze un set de caracteristici sabiei alese.
Pentru a ajunge un “witcher” o persoană trebuie să treacă prin mai multe etape. Aceste procese sunt defașurate în diferite “școli pentru witcheri”, unde dintre acestea fiind Școala Lupului - aflată la Kaer Morhen.
Pentru acest task va trebui să oferim ajutorul nostru unui recrut pentru a trece prin aceste procese.
Tema va fi trimisă folosind vmchecker, cursul Programarea Calculatoarelor (CB & CD).
Găsiți arhiva cu checker-ul si makefile-ul aici.
Formatul arhivei va fi următorul:
Lista nu este exhaustivă.