This shows you the differences between two versions of the page.
sd-ca:laboratoare:laborator-09 [2015/04/27 15:15] cosmin_ioan.petrisor [Interviu] |
sd-ca:laboratoare:laborator-09 [2015/05/10 08:43] (current) mihai.neacsu2901 [Exerciții] Update tasks solution file name |
||
---|---|---|---|
Line 7: | Line 7: | ||
În urma parcurgerii laboratorului, studentul va fi capabil să: | În urma parcurgerii laboratorului, studentul va fi capabil să: | ||
- | *să înţeleagă noţiunea de arbore şi structura unui arbore binar | + | *înţeleagă noţiunea de arbore şi structura unui arbore binar |
- | *să construiască, în limbajul C++, un arbore binar | + | *construiască, în limbajul C++, un arbore binar |
- | *să realizeze o parcurgere a structurii de date prin mai multe moduri | + | *realizeze o parcurgere a structurii de date prin mai multe moduri |
- | *să citească o expresie matematică şi să-i construiască arborele binar asociat | + | *citească o expresie matematică şi să-i construiască arborele binar asociat |
- | *să evalueze o expresie matematică dată printr-un arbore binar. | + | *evalueze o expresie matematică dată printr-un arbore binar. |
===== Noțiuni teoretice ===== | ===== Noțiuni teoretice ===== | ||
Line 145: | Line 145: | ||
| | ||
// ... si combinam rezultatele aplicand operatorul | // ... si combinam rezultatele aplicand operatorul | ||
- | return AplicaOperator(nod->op, nod->left, nod->right); | + | return AplicaOperator(nod->op, res1, res2); |
} else { | } else { | ||
// Daca nodul terminal contine o variabila, atunci intoarcem valoarea variabilei | // Daca nodul terminal contine o variabila, atunci intoarcem valoarea variabilei | ||
Line 157: | Line 157: | ||
===== Exerciții ===== | ===== Exerciții ===== | ||
- | + | Acest laborator se va realiza pornind de la **{{:sd-ca:laboratoare:labbinarytree-tasks.zip|scheletul de cod}}**. | |
- | Acest laborator se va realiza pornind de la **{{sd-ca:laboratoare:lab08-tasks.zip}}** | + | |
În cadrul arhivei, aveți la dispoziție un parser pentru expresii logice sub **forma normal disjunctivă - DNF**: | În cadrul arhivei, aveți la dispoziție un parser pentru expresii logice sub **forma normal disjunctivă - DNF**: | ||
Line 182: | Line 181: | ||
Negarea este reținută direct în nodul literal, deci pentru a trata acest caz trebuie să verificați primul caracter al nodului.</note> | Negarea este reținută direct în nodul literal, deci pentru a trata acest caz trebuie să verificați primul caracter al nodului.</note> | ||
- | 1. [**5p**] Implementați (și **compilați!**) următoarele funcții pentru un arbore binar: | + | 1. [**4p**] Implementați (și **compilați!**) următoarele funcții pentru un arbore binar: |
*[**1p**] (BinaryTree.h) Constructor / Destructor (eliberați memorie doar dacă este cazul) (**TODO 1.1**) | *[**1p**] (BinaryTree.h) Constructor / Destructor (eliberați memorie doar dacă este cazul) (**TODO 1.1**) | ||
*[**1p**] (BinaryTree.h) Implementați metoda de a seta datele reținute de un nod, posibilitatea de a returna și a seta arborii. (**TODO 1.2**) | *[**1p**] (BinaryTree.h) Implementați metoda de a seta datele reținute de un nod, posibilitatea de a returna și a seta arborii. (**TODO 1.2**) | ||
*[**2p**] (BinaryTree.h) Implementați metodele de inserare recursivă într-un nod din arbore. Presupuneți că se înserează în subarborele stâng sau drept, în mod aleator. (**TODO 1.3**) | *[**2p**] (BinaryTree.h) Implementați metodele de inserare recursivă într-un nod din arbore. Presupuneți că se înserează în subarborele stâng sau drept, în mod aleator. (**TODO 1.3**) | ||
- | *[**1p**] (BinaryTree.h) Realizați o parcurgere în inordine în displayTree. Puteți să folosiți sau nu variabila de indentare care este dată ca argument. (**TODO 1.4**) | ||
- | 2. [**3p**] (main.cpp) Terminați de implementat parser-ul, actualizând și populând conținutul nodurilor din arbore. | + | 2. [**3p**] Implementaţi (şi **compilaţi!**) următoarele funcţii pentru un arbore binar: |
- | *[**1p**] Folosiți drept model parseExpression și terminați parseTerm (**TODO 2.1**) | + | *[**1p**] (BinaryTree.h) Realizați o parcurgere ''inordine'' în displayTree. Puteți să folosiți sau nu variabila de indentare care este dată ca argument. (**TODO 2.1**) |
- | *[**1p**] Folosiți drept model parseExpression și terminați parseLiteral (**TODO 2.2**) | + | *[**1p**] (BinaryTree.h) Calculaţi înălţimea arborelui în getTreeHeight. (**TODO 2.2**) |
- | *[**1p**] Verificați că expresia afișată este chiar cea pe care ați dat-o ca parametru (trebuie să faceți parcurgere în inordine și fără indentare) (**TODO 2.3**) | + | *[**1p**] (BinaryTree.h) Calculaţi numărul de noduri în getNumNodes. (**TODO 2.3**) |
+ | |||
+ | <note> | ||
+ | Folosiţi-vă de proprietăţile de bază ale unui arbore (datele pe care le puteţi obţine de la subarborele stâng / drept). | ||
+ | </note> | ||
<hidden> | <hidden> | ||
- | 3. [**4p**] (main.cpp) Implementați evaluarea unei expresii în evaluateAST() | + | 3. [**3p**] (main.cpp) Terminați de implementat parser-ul, actualizând și populând conținutul nodurilor din arbore. |
+ | *[**1p**] Folosiți drept model parseExpression și terminați parseTerm (**TODO 3.1**) | ||
+ | *[**1p**] Folosiți drept model parseExpression și terminați parseLiteral (**TODO 3.2**) | ||
+ | *[**1p**] Verificați că expresia afișată este chiar cea pe care ați dat-o ca parametru (trebuie să faceți parcurgere în inordine și fără indentare) (**TODO 3.3**) | ||
Pentru testarea acestui exercițiu, folosiți o expresie fără variabile, de exemplu: 0 & 1 | 1 & !0 | !1 | 1 & 1 & 1 | Pentru testarea acestui exercițiu, folosiți o expresie fără variabile, de exemplu: 0 & 1 | 1 & !0 | !1 | 1 & 1 & 1 | ||
- | 4. [**2p**] Folosiți un hashtable pentru a ține evidența valorilor variabilelor. Variabilele sunt declarate la început, folosind atribuiri ''variabila = valoare''. Pentru fiecare astfel de linie citită, parsați-o și introduceți variabila împreună cu valoarea ei într-un hashtable (puteți folosi clasa [[http://www.cplusplus.com/reference/unordered_map/unordered_map/ | unordered_map]] din STL. ) | + | 4. [**4p**] (main.cpp) Implementați evaluarea unei expresii în evaluateAST() |
+ | |||
+ | |||
+ | 5. [**2p**] Folosiți un hashtable pentru a ține evidența valorilor variabilelor. Variabilele sunt declarate la început, folosind atribuiri ''variabila = valoare''. Pentru fiecare astfel de linie citită, parsați-o și introduceți variabila împreună cu valoarea ei într-un hashtable (puteți folosi clasa [[http://www.cplusplus.com/reference/unordered_map/unordered_map/ | unordered_map]] din STL. ) | ||
Pentru evaluarea expresiei, de fiecare dată când intâlniți o variabilă, vedeți ce valoare îi este atribuită în hashtable și folosiți acea valoare pentru evaluarea expresiei. | Pentru evaluarea expresiei, de fiecare dată când intâlniți o variabilă, vedeți ce valoare îi este atribuită în hashtable și folosiți acea valoare pentru evaluarea expresiei. | ||
</hidden> | </hidden> | ||
+ | <note tip>**{{:sd-ca:laboratoare:labbinarytree-sol.zip|Soluție laborator}}** </note> | ||
===== Interviu ===== | ===== Interviu ===== | ||