{{indexmenu_n>13}}
====== 13 - Konzultace k bonusovým úkolům ======
* [[courses:b0b36prp:internal:tutorialinstruction:13|pro vyučující]]
===== Cíle cvičení =====
- Seznámit se jak vytvářet dynamickou knihovnou a využívat ji ve složitějších projektech.
- Konzultovat možnosti řešení bonusových úloh [[courses:b0b36prp:hw:hw04|HW 04]] a [[courses:b0b36prp:hw:hw06|HW 06]].
===== Zadání =====
Začneme s kódy projektu ''calc'' {{ :courses:b0b36prp:labs:prp-lab13-calc.zip |prp-lab13-calc.zip}}.
Vytváříme binární kalkulačku, která dokáže sčítat, odečítat, násobit a dělit čísla zadaná ve dvojkové soustavě. Jednotlivé číslo je uloženo ve struktuře.
#define NUMBER_LENGTH 50
typedef struct {
bool number[NUMBER_LENGTH];
char operator;
} number_t;
Položka ''number'' představuje vlastní číslo. Nultý bit čísla ukládáme na pozici ''NUMBER_LENGTH - 1'', první bit na pozici ''NUMBER_LENGTH - 2'' atd. Položka ''operator'' složí pro uložení operátoru ('+', ' -', '*', '/'), který za daným číslem případně následuje ve výrazu.
Celý výraz je uložen ve struktuře ''expression_t'', která obsahuje pole ukazatelů na jednotlivá čísla výrazu.
typedef struct {
number_t** numbers;
size_t expr_size;
} expression_t;
Knihovna ''read_calc'' obsahuje implementaci funkcí pro čtení binárních čísel i celých výrazů ze zadaných řetězců. Implementovány jsou rovněž funkce pro uvolnění čísla a výrazu.
===== Úkoly =====
==== Sdílené knihovny ====
* Seznamte se se strukturou binárních výrazů a knihovnou ''read_calc''. Sestavte z implementace ''read_calc.c'' dynamickou knihovnu. Postupujte podle [[https://cw.fel.cvut.cz/wiki/courses/b0b36prp/tutorials/testing#testovani_implementace_v_dynamicky_linkovane_knihovne | návodu]].
* Projděte si hlavní program v souboru ''main.c''. Slinkujte jej s dynamickou knihovnou ''read_calc'' a ověřte jeho funkčnost.
Rozhraní pro práci s binárními výrazy je předepsáno v ''calc.h''.
* Implementujte metodu ''print_number'', která vytiskne binární číslo typu ''number_t''.
* Z implementace ''calc.c'' sestavte opět dynamickou knihovnu.
* Upravte hlavní program a slinkujte ho s oběmi knihovnami a program otestujte.
* Příkazem ''ldd'' otestujte, že vytvořený program hledá dynamické knohihovny v aktuálním adresáři.
==== Konzultace k bonusovým úkolům ====
Pro další práci s dynamickými knihovnami můžete využít přiložený ''Makefile'', který můžete zobecnit dle [[courses:b0b36prp:lectures:start#Stromy|lec10]] slide 33.
* Konzultujte možnosti práce s dlouhými binárními čísly. Začněte implementací funkce ''is_equal'' pro porovnání dvou binárních čísel. Implementaci otestujte.
* Postupně implementujte funkce pro jednotlivé operátory - sčítání, odčítání, násobení a dělení.
Implementace realizujte ve dvojkové soustavě. Čísla do desítkové soustavy nepřevádějte!
* Konzultujte možnosti vyhodnocení výrazu uloženého ve struktuře ''expression_t''. Navrhněte postup vyhodnocení, který zachová prioritu aritmetických operací. Svůj návrh implementujte.