{{indexmenu_n>13}} ====== 13 - Konzultace k bonusovým úkolům ====== * pro vyučující: [[courses:b0b36prp:internal:tutorialinstruction:13|]] ===== 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.