Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
public:column_print [2011/05/21 20:11]
Šimon Tóth [Poznámky:]
public:column_print [2018/02/24 19:10] (aktuální)
Řádek 1: Řádek 1:
 +====== Column Print ======
 +====== Zadání: ======
  
 +Implementujte speciální variantu funkce printf pro sloupcový výstup. Tato varianta bude pracovat se všemi daty, které je potřeba vypsat (tj. s několika řádky) a díky tomu, že má k dispozici všechny řádku, bude formátovat výstup do dokonalých sloupců.
 +
 +Šířka sloupce bude odvozena od nejdelší položky v sloupci (nebo od speciálního nastavení ve formátovacím řetězci), defaultně zarovnáváme doprava.
 +
 +====== Rozhraní: ======
 +
 +<code c>
 +/** Nastaveni locale k column print
 + *
 + * @param decimal_point Znak pouzity pro desetinnou carku (u @f i @C) i oddelovac tisicu (jen @C)
 + * @param default_decimals Pocet desetinnych znaku pokud neni vynuceno jinak
 + * @param currency Retezec pouzity jako mena (pozor, funkce ocekava perzistentni konstantu, pamet neuvolnuje ani nekopiruje)
 + * @param righttoleft 1 pokud se maji retezce bez explicitniho nastavení orezavat od konce retezce, 0 pokud od zacatku
 + *
 + * @return 0 pokud OK, 1 jinak
 + */
 +int set_locale(char decimal_point,​ int default_decimals,​ const char *currency, int righttoleft);​
 +
 +/** Column printf
 + *
 + * Funkce podle formatovaciho retezce naformatuje sloupce do hezky zformatovaneho vystupu.
 + *
 + * Jednotlive sloupce jsou zadavane jako null-terminated sekvence za formatovaci retezec.
 + *
 + */
 +int cprintf(const char *format,​...);​
 +
 +/** Column fprintf
 + *
 + * Funkce podle formatovaciho retezce naformatuje sloupce do hezky zformatovaneho vystupu do souboru.
 + *
 + * Jednotlive sloupce jsou zadavane jako null-terminated sekvence za formatovaci retezec.
 + *
 + */
 +int cfprintf(FILE *f, const char *format,​...);​
 +</​code>​
 +
 +====== Specifikace:​ ======
 +
 +Podporované formátovací značky:
 +  * ''​@c'',​ ''​@d'',​ ''​@u'',​ ''​@o'',​ ''​@x'',​ ''​@X''​ stejný význam jako u printf
 +  * modifikátory ''​l''​ a ''​L''​ stejný význam jako u printf (aplikovatelné na ''​d'',''​u'',''​o'',''​x'',''​X'',''​f''​)
 +  * ''​@@''​ vypíše ''​@''​
 +  * ''​@(^v)(pocet)s''​ ''​const char*''​ vypsaný na zvolený počet znaků, a to buďto od začátku řetězce když "''​^''"​ nebo od konce řetězce když "''​v''";​ počet znaků, pokud uveden, musí být > 0
 +  * ''​@(pocet)f''​ ''​float''​ vypsaný na zvolený počet desetinných míst. V sloupci zarovnáno vůči desetinné čárce (vypsán v decimal notaci - ne scientific).
 +
 +Bonusy:
 +  * **2 body** celá čísla budou podporovat omezení počtu cifer, pokud se číslo nevleze do omezení bude pokráceno a označeno příslušnou jednotkou (dekadické pro desítkovou soustavu, binární pro oktální a hexadecimální). Převádět se bude vždy na nejbližší jednotku (ořezáním),​ která se už vejde. Při převodu ale nesmí dojít k úplnému zabití hodnoty (999 nebo 999 999 se nebude při omezení na dva znaky převádět na 0k nebo 0M). Znak jednotky se počítá do počtu znaků.
 +    * Pokud budete implementovat toto rozšíření,​ zadefinujte v souboru ''​column.h''​ makro ''​BONUS_NUM_DIGITS''​
 +  * **2 body** ''​@(^v)(pocet)S''​ ''​const char*''​ vypsaný na zvolený počet znaků, a to buďto od začátku řetězce když "''​^''"​ nebo od konce řetězce když "''​v''",​ zarovnaný na celá slova. Při ořezání nesmí dojít k úplnému zabití hodnoty ("abc cda" se při omezení na 2 znaky ořeže na "​abc"​ nebo "​cda"​).
 +    * Pokud budete implementovat toto rozšíření,​ zadefinujte v souboru ''​column.h''​ makro ''​BONUS_WORDS''​
 +  * **2 bod** ''​@(<>​)(pocet)_''​ placeholder pro další položku, která bude mít rezervován minimálně ''​pocet''​ znaků s obsahem zarovnaným vlevo ''<''​ nebo vpravo ''>''​. Zarovnání se bude aplikovat pouze na položky u kterých to má smysl (ne currency nebo float). ​ ''​@_''​ nemůže obsahovat další zanořený ''​@_''​.
 +    * Pokud budete implementovat toto rozšíření,​ zadefinujte v souboru ''​column.h''​ makro ''​BONUS_PLACEHOLDER''​
 +  * **2 bod** ''​@C''​ currency ''​float''​ vypsaný na dvě desetinná místa (zaokrouhlený směrem nahoru na setiny) s postfixem dle locale. Tisíce jsou oddělené pomocí desetinné čárky (locale). Pokud vychází číslo celé, pak se píše místo desetinných míst --. Měna se bude vypisovat doprava, oddělená jednou mezerou (např.: 25,-- Kc)
 +    * Pokud budete implementovat toto rozšíření,​ zadefinujte v souboru ''​column.h''​ makro ''​BONUS_CURR''​
 +
 +Informace uvedené v závorkách jsou volitelné (formátovací značka je může i nemusí obsahovat). Proto například pro řetězce jsou všechny následující značky v pořádku: ''​@^10s'',​ ''​@s'',​ ''​@vs'',​ ''​@20s''​. Ale například ''​@3^s''​ nebo ''​@^vs''​ už v pořádku není.
 +
 +Parametry jsou funkci předávané jako NULL terminated sekvence - pole ukazatelů na požadovaný datový typ. Například pro znak je parametr typu ''​char∗∗''​ a pro řetězec ''​const char∗∗∗''​.
 +
 +Pokud nebyla zavolána set_locale, defaulty jsou jako ''​set_locale('​.',​ 3, “Kc“, 0)''​.
 +
 +====== Požadavky: ======
 +
 +Funkce nesmí modifikovat své parametry.
 +
 +Pokud při parsování dojde k nalezení špatné formátovací značky, nebo špatné kombinace (''​@_''​ za kterým hned nenásleduje jiná značka), funkce musí pouze vypsat na ''​stderr''​ informaci o této chybě. Funkce zároveň musí vrátit zápornou návratovou hodnotu.
 +
 +====== Poznámky: ======
 +
 +  * odevzdáváte soubory ''​column.c''​ a ''​column.h''​ do adresáře ext01
 +  * může se vám hodit:
 +    * funkce ''​modf()''​ a ''​log10()''​ z ''​math.h''​
 +    * funkce ''​assert()''​ z ''​assert.h''​ pro ošetření chyb s pamětí
 +    * vícenásobné volání funkce ''​va_start''​
 +  * Nedělejte si to složitější,​ než to je. Implementace tohoto příkladu může velice nepříjemně nabobtnat pokud si ji důkladně nepromyslíte.
 +  * autorem úkolu je [[toth@fi.muni.cz|Šimon Tóth]].
QR Code
QR Code public:column_print (generated for current page)