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:45]
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) =====
 +
 +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|}}
 +
 +Unde:
 +
 +- **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.
 +
 +- **Op** reprezintă codul unei instructiuni și se reprezintă pe 2 biți. **Op** poate fi **+**, **-**, * sau / conform tabelului de mai jos:
 +
 +^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**. Practic, primul 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>​ <​code>​
-$ make +./task1 
-gcc -Wall -Werror -c tema3.c +1410859008 
-gcc -Wall -Werror -c huff.c +3 * * + 
-gcc tema3.o huff.o -Wall -Werror -o tema3 +Numere de introdus = 1 
- Char | Huffman code  +Introducețnumăr: 54999 
--------------------- +Operanzii: 13 6 13 7 
-  ​  | 000000000 +Rezultat: 1021
-  ​6 ​  | 000000001 +
-  ​2 ​  | 000000010 +
-  3   | 000000011 +
-  )   | 0000001 +
-  b   | 000001 +
-  (   | 0000100 +
-  g   | 0000101 +
-  v   | 000011 +
-  u   | 0001 +
-  ​  | 001 +
-  ​  | 0100 +
-  ​l ​  | 01010 +
-  c   | 01011 +
-  e   | 011 +
-  p   | 10000 +
-  o   | 10001 +
-  n   | 1001 +
-  ,   | 101000 +
-  .   | 1010010 +
-  z   | 10100110 +
-  x   | 101001110 +
-  j   | 1010011110 +
-  1   | 1010011111 +
-  d   | 10101 +
-  f   | 101100 +
-  s   | 101101 +
-  m   | 10111 +
-      | 110 +
-  t   | 1110 +
-  ​a ​  | 1111+
 </​code>​ </​code>​
  
 +sau 
  
-==== Trimitere temă ==== +<​code>​ 
-Tema va fi trimisă folosind [[https://​vmchecker.cs.pub.ro/​ui/#​PCCB|vmchecker]],​ cursul **Programarea Calculatoarelor (CB & CD)**. \\+./task1 
 +1947074560 
 +4 * * + + 8 
 +Numere de introdus ​3 
 +Introduceți număr54998 
 +64041 
 +42752 
 +Operanzii:​214 214 250 41 167 0 0 0 0 0 
 +Rezultat: 11449208 
 +</code>
  
-Toate temele sunt testate în mod automat pe [[https://​vmchecker.cs.pub.ro/​ui/​|VMChecker]]. +</note>
-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)**. +**Precizari:​** 
-În meniul ​//sidebar//, din partea stângă a paginiiselectați tema pentru care veți face submisia.+ 
 +rezolvarea acestui exercițiu se va afla in fisierul task2.c 
 + 
 +- va recomandăm mai intai sa rezolvati taskul 1 **ș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.1670967941.txt.gz · Last modified: 2022/12/13 23:45 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