Differences

This shows you the differences between two versions of the page.

Link to this comparison view

programare:teme_2022:tema3_2022_cbd [2022/12/13 23:44]
costin.carabas
programare:teme_2022:tema3_2022_cbd [2023/01/09 10:26] (current)
costin.carabas [Trimitere temă]
Line 1: Line 1:
-===== Tema 3. Arhivare ​=====+====== Tema 3 - Miniprocesor ======
  
-==== Responsabili ==== +==== Responsabili==== 
-  * Costin ​Carabaș+  * Costin ​Carabas
  
 +Termen de predare:
 +  * Deadline soft: **16 Ianuarie 2023**
 +  * Deadline hard: **20 Ianuarie 2023**
  
-==== 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.
-  * Deadline soft: **TODO** +
-  * Deadline ​hard: **TODO**+
  
-==== Introducere ​==== +====Întrebări==== 
-În ultima vreme ați observat că spațiul de stocare în cloud (Google DriveiCloud, One Drive) este limitat iar aceste servicii devin din ce în ce mai scumpe. +Dacă aveți nelămuririputeți să ne contactați pe forumul dedicat [[https://​curs.upb.ro/​2022/​mod/​forum/​view.php?​id=105243|temei de casă nr3]].
-Doriți să rezolvați această problemă folosind algoritmi de comprimare a fișierelorAstfel, spațiul ocupat în cloud se va micșora, iar voi veți folosi mai eficient aceste servicii.+
  
  
 +===== Cerință =====
  
-==== Cerinţe ==== +Să se implementeze ​un interpretor de biti similar unui procesor. Acesta va avea capacitatea de a decodifica si executa instructiuni simple de adunare, scădereînmulțire șîmpărțire.
-Sarcina voastră este să implementaţi ​un program care să comprime / decomprime un fişier arbitraraplicând algoritmul [[https://​www.programiz.com/​dsa/​huffman-coding|Huffman]]. +
-Puteți folosi un [[https://​huffman.ooz.ie/​|generator online]] de arbore Huffmann pentru a avea o reprezentare vizuală.+
  
-Pentru această temă folosiți [[https://​huffman.ooz.ie/?​text=Notiunea+de+informatie+poate+fi+privita+din+mai+multe+puncte+de+vedere,​+precum+cel+lexicografic+(ce+se+refera+la+notiuni+si+fapte),​+sau+filosofic.+In+inginerie,+totusi,​+informatia+are+o+definitie+matematica+riguroasa.+Ea+reprezinta+o+inlaturare+a+incertitudinii,​+si+este+o+marime+a+carei+unitate+de+masura+este+bitul.+Astfel+pentru+reprezentarea+unei+informatii,​+vom+avea+nevoie+de+un+anumit+numar+de+biti+de+informatie+(nu+neaparat+intreg,+dupa+cum+vom+vedea+mai+jos!).+Intuitiv,+ne+putem+gandi+ca+odata+ce+avem+mai+multi+biti+de+informatie,​+stim+mai+multe+despre+entitatea+respectiva,​+deci+incertitudinea+este+mai+bine+inlaturata.+De+exemplu,​+un+numar+real+este+mai+bine+reprezentat+de+tipul+double+(pe+64+de+biti),​+decat+de+tipul+float+(pe+32+de+biti),​+iar+precizia+calculelor+este+mai+buna.+Deci+putem+spune+ca+tipul+double+contine+mai+multa+informatie+decat+tipul+float.+(Ca+un+fapt+divers,​+pentru+a+inlatura+in+intregime+incertitudinea,​+am+avea+nevoie+de+un+numar+infinit+de+biti+pentru+un+numar+real+oarecare.)|acest arborele Huffman]]El va fi +La nivelul cel mai de bază, informația este stocată sub forma de biți. Pentru un procesor aceasta informație se repartizează în 2 categorii: instrucțiuni și datePracticdându-se ​un șir de bițiprocesorul decodifică instrucțiunea, iar ulterior o execută.
  
-Scheletul ​de cod conține crearea unui arbore ​de tip Huffmann.+În aceasta tema, vom implementa un procesor ​de baza care decodifică un sir de biți și ulterior îl execută.
  
 +===== Task 1 - Decodificare instructiune (50p) =====
  
-==== Resurse ====+Dându-se o instrucțiune în format binar, decodificați instrucțiunea.
  
 +O instrucțiune are următorul format:
  
 +{{:​programare:​teme_2021:​untitled_diagram.png?​500|}}
  
-==== Trimitere temă ==== +Unde:
-Tema va fi trimisă folosind [[https://​vmchecker.cs.pub.ro/​ui/#​PCCB|vmchecker]],​ cursul **Programarea Calculatoarelor (CB & CD)**. \\+
  
-Toate temele sunt testate în mod automat ​pe [[https://​vmchecker.cs.pub.ro/​ui/​|VMChecker]]. +- **N** reprezintă numărul de instrucțiuni ce vor fi executate; acesta este reprezentat ​pe 3 biți și se obtine prin convertirea valorii celor mai semnificativi 3 biți din binar în decimal ​și adunarea cu 1. Astfel, pentru **000** vom avea de executat o instrucțiune,​ pentru **010** vom avea de executat 3 instrucituni. Numărul maxim de instrucțiuni de executat este 8.
-Autentificarea ​se face folosind numele de utilizator ​și parola ​de pe moodle / Teams.+
  
-Din meniul ​//drop-down// selectați cursul corespunzător; în cazul de față: **Programarea Calculatoarelor ​(CB CD)**. +- **Op** reprezintă codul unei instructiuni și se reprezintă pe 2 biți. **Op** poate fi **+**, **-**, * sau conform tabelului de mai jos: 
-În meniul ​//sidebar//, din partea stângă a paginiiselectați tema pentru ​care veți face submisia.+ 
 +^Cod ^Operatie ^ 
 +| 00     | +        | 
 +| 01     ​| ​       | 
 +| 10     | *        | 
 +| 11     ​| ​       | 
 + 
 +In sirul de input, cei 3 biți care desemnează numărul ​de operații sunt urmați de număr de N*2 biți care desemnează operațiile ce urmează a fi executate. 
 + 
 +- **Dim** reprezintă dimensiunea unui operand și se reprezintă pe 4 biti. **Dim** se calculează similar cu **N** prin transformarea celor mai puțini semnificativi 4 biți în valoarea zecimală și adunarea cu 1. Astfel, dimensiunea operanzilor poate lua valori din intervalul [1, 16]. 
 + 
 +În cadrul acestui exercițiu, veți citi de la intrarea standard un numar de tipul **unsigned int** ce contine instructiunea si o veti decodifica. Astfel, la iesirea standard veti afisa N, operatorii si dimensiunea operanzilor,​ toate separate printr-un spatiu. 
 + 
 +<​note>​ 
 +Exemplu: 
 + 
 +Input: 1675493376 -> Output: 4 + - / 16 
 + 
 +Input: 2483421184 -> Output: 5 * + + + 13 
 +</​note>​ 
 + 
 +Precizări:​ 
 + 
 +- dimensiunea totala a unei instructiunie nu poate depasi 3 + 8*2 + 4 = 23 biti, asadar ar trebui sa incapa intr-un unsigned int. 
 + 
 +- citirea de la tastatura se va face folosind functia scanf: **scanf("​%u", ​&inst)** 
 + 
 +- formatul de afisare este: **N op1 op2 .. opN Dim ** 
 + 
 +- rezolvarea acestui task se va afla in fisierul **task1.c** 
 + 
 +===== Task 2 - Executare instructiune (50p) ===== 
 + 
 +În cadrul acestui exercițiu vom continua task-ul anterior prin: 
 + 
 +1. **Citirea operanzilor**. Plecând de la programul anterior, adăugați o sectiune de cod care interpretează (N+1) operanzi de la intrarea standard. Pentru acest task, dimensiunea operanzilor (**Dim**) este un numar putere a lui 2 din intervalul [1, 16]. Adică valorile posibile sunt: 1, 2, 4, 8, 16. Operanzii vor fi cititi sub forma unor numere **unsigned short** (dimensiune 16) de la intrarea standard. Numărul de operanzi citiți de la tastatură se va descompune în mai multe de numere **unsigned short**, folosind formula: ((N+1)*Dim)/16, la care adaugam +1 in cazul in care rezultatul are vreun rest. 
 +Astfel, se vor citi de la tastatură ((N+1)*Dim)/16 numere și vor fi descompune în (N+1) operanzi. 
 + 
 +<​note>​ 
 +Exemplu: 
 + 
 +Pentru N = 3 si Dim = 4, folosim instrucțiunea ''​1410859008'',​ output-ul de la Task 1 va fi ''​3 * * + 4''​. 
 +Conform formulei de mai sus ''​((N+1)*Dim)/16'',​ vom citi un singur **unsigned short** de la tastatura (((3+1)*4)/16 = 1). Presupunem că vom citi 54999. Valoarea acestuia in binar este: **1101 0110 1101 0111**. Practicprimul operand va fi 13, al doilea 6, al treila 13, iar al patrulea 7. 
 + 
 +Daca N = 4 si Dim = 8, folosim instrucțiunea ''​1947074560'',​ output-uul de la Task 1 va fi ''​4 * * + + 8''​. 
 +Rezulta ca vom citi  3 **unsigned short** de la tastatura (((4+1)*8)/​16 = 2,5). Presupunem ca vom citi 54998 (**11010110 11010110**),​ 64041 (**11111010 00101001**) si 42752 (**10100111 00000000**). Practic, primul operand va fi 214, al doilea tot 214, al treilea 250, al patrulea 41, iar al cincilea 167, urmat de bitii de padding. 
 +</​note>​ 
 + 
 + 
 + 
 +2. **Executarea instructiunii**: ​din moment ce avem atât operațiile cât si operanzii, nu ne mai ramane decât să calculăm rezultatul. 
 +Calcularea rezultatului se va face in ordinea primirii operatiilor si nu conform prioritatii operatorilor (adica* nu are precedenta fata de +). 
 + 
 +<​note>​ 
 +Exemplu: 
 + 
 +In cazul in care avem operatiile + - * + si operanzii 1 2 3 4 5 se va valcula 1 + 2 - 3 * 4 + 5 = 5 (1 + 2 = 3 - 3 = 0 * 4 = 0 + 5 = 5) 
 +</​note>​ 
 + 
 +Pentru acest task, se vor citi de la tastatura instructiunea si operanzii si se va afiza rezultatul:​ 
 + 
 +<​note>​ 
 +Exemplu utilizare:​ 
 +<​code>​ 
 +./task1 
 +1410859008 
 +3 * * + 4 
 +Numere de introdus = 1 
 +Introduceți număr: 54999 
 +Operanzii: 13 6 13 7 
 +Rezultat: 1021 
 +</​code>​ 
 + 
 +sau  
 + 
 +<​code>​ 
 +./task1 
 +1947074560 
 +4 * * + + 8 
 +Numere de introdus = 3 
 +Introduceți număr: 54998 
 +64041 
 +42752 
 +Operanzii:​214 214 250 41 167 0 0 0 0 0 
 +Rezultat: 11449208 
 +</​code>​ 
 + 
 +</​note>​ 
 + 
 +**Precizari:​** 
 + 
 +- rezolvarea acestui exercițiu se va afla in fisierul task2.c 
 + 
 +- va recomandăm mai intai sa rezolvati taskul 1 **și apoi sa faceti copy-paste codului in fisierul task2.c** și să porniti rezolvarea de acolo 
 + 
 +- numerele citite de la tastatura sunt considerate pozitive, insa rezultatul poate fi negativ asa ca folositi o variabila de tip **int** ​pentru ​a salva rezultatul executarii instrucțiunii. 
 + 
 +- afișați doar numărul rezultat, altfel checker-ul nu va lua in considerare testul 
 + 
 +===== Bonus 1 - Operanzi cu dimensiuni ciudate (20p) ===== 
 + 
 +In cadrul acestui task vom extinde implementarea de la Task 2 pentru a executa instrucțuni ale căror operanzi pot avea **orice** dimensiune din intervalul [1, 16]. În continuare, operanzii for fi citiți de la intrarea standard sub forma **unsigned short**, însă un operand ar putea să se întindă pe 2 citiri succesive. 
 + 
 +<​note>​ 
 +Exemplu: 
 + 
 +**N = 1**, **Dim = 11**. (1+1)*11/16 = 1,375 => se citesc 2 numere de tipul **unsigned short**. Sa presupunem ca acestea sunt 37444 (**10010010010 00100**) si 33792 (**100001 0000000000**). Va trebuie sa facem o operație intre 1170 (**10010010010**) si 289 (**00100 100001**) 
 +</​note>​ 
 + 
 +**Precizări:​** 
 + 
 +- Acest task se va rezolva in fisierul task3.c 
 + 
 +- Pentru acest task veti copia continutul fisierul task2.c in fisierul task3.c si veti extinde functionalitatea acestuia. 
 + 
 +- Pentru acest task, veti afisa doar rezultatul final. 
 + 
 + 
 +===== Bonus 2 - Precedenta operatorilor (20p) ===== 
 + 
 +Implementati precedenta operatilor, astfel incat * si / au precedenta egala intre ei, insa precdenta mai mai mare ca + si -. 
 + 
 +<​note>​ 
 +Exemplu: 
 + 
 +Pentru + * - / si 1 2 3 4 5 vom avea 1 + 2*3 - 4/5 = 1 + 6 - 0 = 7 
 +</​note>​ 
 + 
 +**Precizari**:​ 
 + 
 +- Acest task se va rezolva in fisierul task4.c. 
 + 
 +- Veti afisa doar rezultatul final. 
 + 
 + 
 +==== Trimitere temă ==== 
 + 
 +Tema va fi trimisă folosind [[https://​vmchecker.cs.pub.ro/​ui/#​PCCB|vmchecker]],​ cursul **Programarea Calculatoarelor (CB & CD)**\\
  
-Arhiva temei se va încărca pe checker folosind formularul de submisie din tabul **Trimitere solutii**. 
  
-Rezultatele vor fi disponibile în tabul **Rezultate**.\\ 
-**Citiți cu atenție** informațiile afișate în **Rezultate** pentru a vă asigura că tema a fost rulată cu succes; o eroare comună este dată de faptul că conținutul arhivei nu respectă structura dorită (ex. fișierele sunt într-un alt director).\\ 
  
-**Punctajul final al temei** este afișat la finalul informațiilor afișate în **Rezultate**.+Formatul arhivei va fi următorul:​ 
 + - {task1.c task2.c task3.c task4.c Makefile} 
 + - Un fișier [[https://​en.wikipedia.org/​wiki/​README|README]] în care vă descrieți rezolvarea taskurilor.
  
-Conținutul arhivei va fi următorul: 
- - Fișierele **task1.c**,​ **task2.c**,​ **task3.c**,​ **task4.c**,​ **task5.c**,​ **utils.h** care conține implementarea temei. 
- - Fișierul **Makefile**. 
- - Un fișier [[https://​en.wikipedia.org/​wiki/​README|README]] în care descrieți rezolvarea temei. 
  
 <note warning> <note warning>
   - Arhiva trebuie să fie de tipul **zip**.   - Arhiva trebuie să fie de tipul **zip**.
-  - Puteți utiliza regula **zip** din fișierul **Makefile** pentru a vă genera arhiva zip. Aceasta va adăuga fișierele Makefile, README ​și orice fișierele **task1.c**, **task2.c**,​ **task3.c**,​ **task4.c**,​ **task5.c**,​ **utils.h** din directorul curent. +  - Makefile-ul și testele vor fi cele din aceasta arhiva: {{:​programare:​teme_2022:​miniprocesor.zip|miniprocesor.zip}}
-  <​code>​ +
-  make zip +
-  </​code>​+
 </​note>​ </​note>​
  
 <note warning> <note warning>
-Nu includeţi ​fisierele checkerului în arhiva voastră. **Nu folosiţi Makefile.checker** pe post +Nu includeti ​fisierele checkerului în arhiva voastră. **Nu folosiți Makefile.checker** pe post 
-de Makefile în arhiva ​voastră: asta va duce la recursivitate infinita pe vmchecker. ​Puteti sa folosiţ+de Makefile în arhiva ​voastra: asta va duce la recursivitate infinita pe vmchecker. ​Puteți să folosiț
-direct makefile-ul prezent ​în arhivă ​(**Makefile,​ nu Makefile.checker**).+direct makefile-ul prezent ​in arhiva ​(**Makefile,​ nu Makefile.checker**).
 </​note>​ </​note>​
  
 <note warning> <note warning>
-În cazul în care testele vă trec local, însă pică pe vmchecker cel mai probabil aveţ+În cazul în care testele vă trec local, însă pică pe vmchecker cel mai probabil aveț
-o sursă de "//​undefined behavior in cod//"​. Pentru a vă asigura ​că scăpați ​de aceste probleme, +o sursă de "//​undefined behavior in cod//"​. Pentru a va asigura ​ca scapati ​de aceste probleme, 
-compilaţi ​cu flagul de compilare `-Wall` și rezolvaţi ​toate warning-urile.+compilati ​cu flagul de compilare `-Wall` și rezolvati ​toate warning-urile.
 </​note>​ </​note>​
  
 === Listă depunctări === === Listă depunctări ===
 Lista nu este exhaustivă. Lista nu este exhaustivă.
-  * temă care nu compilează și nu a rulat pe **vmchecker** nu va fi luată în considerare +  * temă care nu compilează și nu a rulat pe **vmchecker** nu va fi luată în considerare 
-  * temă care nu rezolvă cerința și trece testele prin alte mijloace nu va fi luată în considerare +  * temă care nu rezolvă cerința și trece testele prin alte mijloace nu va fi luată în considerare 
-  * **NU acceptăm teme copiate**. În cazul unei teme copiate ​se scade punctajul aferent temei din punctajul total. ​ +  * [-1.0]: numele variabilelor nu sunt sugestive 
-  * [-20.0]: Nerezolvarea tuturor erorilor ​și warningurilor ​de coding style+  ​[-1.0]: linii mai lungi de 80 de caractere 
 +  ​[-5.0]: abordare ineficientă 
 +  ​[-10.0]: variabile globale 
 +  ​[-25.0]: Daca se folosesc vectori pentru stocarea bitilor ​ 
 +  * [-100.0]: TOT punctajul, în cazul în care se încearcă "​obținerea"​ punctajului pe temă folosind alte metode decât cele normale  
 +    * în cadrul cursului de programare nu avem ca obiectiv rezolvarea în cel mai eficient mod posibil a programelor;​ totuși, ne dorim ca abordarea să nu fie una ineficientă, ​de genul să nu folosiți instrucțiuni repetitive acolo unde clar nu era cazul, etc.
  
-==== Întrebări ==== 
----- 
-Dacă aveți nelămuriri,​ puteți să ne contactați pe [[https://​curs.upb.ro/​2022/​mod/​forum/​view.php?​id=90444|forum tema 2]] sau pe canalul [[https://​teams.microsoft.com/​l/​channel/​19%3aebc23d84f35d4b8f9b42a1688b229051%40thread.tacv2/​Tema%25202?​groupId=6105be57-b728-4078-9f4a-00dc43e83e70&​tenantId=2d8cc8ba-8dda-4334-9e5c-fac2092e9bac|Tema 2]].  
-La orice întrebare vom răspunde în maxim 24 de ore. 
-**Nu** se acceptă întrebări în ultimele 24 de ore înainte de deadline. 
programare/teme_2022/tema3_2022_cbd.1670967857.txt.gz · Last modified: 2022/12/13 23:44 by costin.carabas
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