This shows you the differences between two versions of the page.
programare:teme_2022:tema3_2022_cbd [2022/12/13 23:18] costin.carabas created |
programare:teme_2022:tema3_2022_cbd [2023/01/09 10:26] (current) costin.carabas [Trimitere temă] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Tema 2. Avioane ===== | + | ====== 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==== |
+ | Dacă aveți nelămuriri, puteți să ne contactați pe forumul dedicat [[https://curs.upb.ro/2022/mod/forum/view.php?id=105243|temei de casă nr. 3]]. | ||
+ | ===== 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 și împărțire. |
+ | 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 date. Practic, dându-se un șir de biți, procesorul decodifică instrucțiunea, iar ulterior o execută. | ||
- | ==== Resurse ==== | + | Î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. | ||
- | ==== Trimitere temă ==== | + | O instrucțiune are următorul format: |
- | 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]]. | + | {{:programare:teme_2021:untitled_diagram.png?500|}} |
- | 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)**. | + | Unde: |
- | În meniul //sidebar//, din partea stângă a paginii, selectați tema pentru care veți face submisia. | + | |
- | Arhiva temei se va încărca pe checker folosind formularul de submisie din tabul **Trimitere solutii**. | + | - **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. |
- | Rezultatele vor fi disponibile în tabul **Rezultate**.\\ | + | - **Op** reprezintă codul unei instructiuni și se reprezintă pe 2 biți. **Op** poate fi **+**, **-**, * sau / conform tabelului de mai jos: |
- | **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**. | + | ^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> | ||
+ | ./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)**. \\ | ||
+ | |||
+ | |||
+ | |||
+ | 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ţi | + | de Makefile în arhiva voastra: asta va duce la recursivitate infinita pe vmchecker. Puteți să folosiți |
- | 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ţi | + | În cazul în care testele vă trec local, însă pică pe vmchecker cel mai probabil aveți |
- | 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ă. | ||
- | * O temă care nu compilează și nu a rulat pe **vmchecker** nu va fi luată în considerare | + | * o temă care nu compilează și nu a rulat pe **vmchecker** nu va fi luată în considerare |
- | * O temă care nu rezolvă cerința și trece testele prin alte mijloace nu va fi luată în considerare | + | * o 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ă | |
- | ==== Întrebări ==== | + | * [-10.0]: variabile globale |
- | ---- | + | * [-25.0]: Daca se folosesc vectori pentru stocarea bitilor |
- | 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]]. | + | * [-100.0]: TOT punctajul, în cazul în care se încearcă "obținerea" punctajului pe temă folosind alte metode decât cele normale |
- | La orice întrebare vom răspunde în maxim 24 de ore. | + | * î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. |
- | **Nu** se acceptă întrebări în ultimele 24 de ore înainte de deadline. | + | |
- | + | ||
- | https://www.geeksforgeeks.org/huffman-coding-greedy-algo-3/ |