======== HW 01 - Standardní vstup/výstup v C++ ======== ^ Termín odevzdání | 21.3.2021 23:59 CEST | ^ Možný bodový zisk | až 8b (3+3+2) | ^ Počet uploadů | 10 | Napište program, který načte formátovaný text ze standardního vstupu, zpracuje jej a výsledek vytiskne na standardní výstup. ===== Zadání a kritéria ===== - Načítaná data jsou rozdělena na konfiguraci a data oddělena rovná se ''='' na samostatném řádku - Konfigurace začíná klíčovým slovem ''config'' a může nabývat těchto vlastností přes tečkovou notaci, viz. příklad níže - **min** je min. hodnota, která se může vyskytnou v načítaných datech - **max** je max. hodnota, která se může vyskytnou v načítaných datech - **width** který označuje počet znaků buňky na výstupu a min. hodnota je 1. - **align** zarovnává čísla v buňkách vlevo když příkaz nabývá hodnoty //left// nebo vpravo při hodnotě //right// - Čísla na vstupu jsou celá, v rozsahu ''config.min'' - ''config.max'' včetně krajních hodnot. - Počet řádků není omezen. - Jednotlivé sloupce jsou označeny ''A'' - ''Z''. - Jednotlivé řádky jsou označeny čísly ''1'' - ''n'', kde n je poslední řádek - V případě nezadání konfiguračních parametrů na vstupu (viz dále) budou použity defaultní hodnoty a uživatel o tom bude informován. - **min=-99**, na standardní výstup se vypíše ''config.min=-99'' - **max=100**, na standardní výstup se vypíše ''config.max=100'' - **width=3**, na standardní výstup se vypíše ''config.width=3''. - **align=left**, na standardní výstup se vypíše ''config.align=left'' - Buňky jsou vždy odděleny vždy středníkem '';'' a řádek končí znakem ''\n'' - V načítaných datech se může vyskytnou příkaz ''SUM(od:do)'', který bude sčítat hodnoty na daném řádku podle rozsahu ''od:do''. Do příslušné buňky poté uloží výsledek - Pokud řádek bude kratší, vypíše se prázdná buňka - Vypsání parametrů a vykreslení tabulky bude následující - Každý řádek má na konci znak nového řádku ''\n'' - Nejprve se vypíšou všechny parametry v pořadí, které jsou uvedeny v bodu 2 - Parametry a tabulka jsou odděleny novým řádkem - Každá buňka je ohraničena ''+'' v jejím rohu - Sloupce jsou oddělený pomocí svislítka ''|'' - Řádky jsou odděleny pomocí pomlček ''-'' - První a poslední znak v buňce bude vždy mezera - V případě splnění všech kritérií, návratová hodnota bude ''0'' ===== Chybová hlášení ===== - Na vstupu bude číslo mimo rozsah ''config.min'' a ''config.max'', na chybový výstup se vypíše ''Out of range'' a návratová hodnota bude ''100'' - Na vstupu se objeví místo čísla písmeno nebo textový řetězec vyjma příkazu SUM(od:do), na chybový výstup se vypíše ''Invalid input'' a návratová hodnota bude ''101''. Tato chybová hláška se také vypíše, když interval v příkazu SUM() bude rozsah, který program nemůže spočítat (např. existují buňky A-C a program bude chtít spočítat A-G). - Hodnota vstupních parametrů bude mimo povolené hodnoty, na chybový výstup se vypíše ''Invalid configuration'' a návratová hodnota bude ''102''. Toto platí i v případě min>max. - Šířka buňky bude moc úzká na vypsání čísla, na chybový výstup se vypíše ''Cell is too short'' a návratová hodnota bude ''103'' ===== Bonusové zadání a kritéria ===== K základnímu zadání přibydou ještě tato následující kritéria, zbytek zůstává ze základního zadání - Konfigurace ''config'' bude rozšířena o následující parametry - **stretch** parametr udává, zda-li se buňka má roztahovat podle největšího čísla, v případě, že se do buňky nevejde (''stretch=1'') nebo se místo čísla vypíše ''n'' //x// ''#'' (tj. buńka bude vyplněna znaky ''#''), kde ''n'' je šířka buňky (''stretch=0'') - **header** vypíše hlavičku jednotlivých sloupců a řádků když ''header=1'', jinak ji vypisovat nebude ''header=0'' - V případě nezadání bonusových konfiguračních parametrů na vstupu, se bude uvažovat, že se tyto parametry nezadaly a do standardního výstupu se nebudou vypisovat ===== Chybová hlášení pro bonus ===== - Chybová hlášení zůstávají stejná vyjma posledního bodu, který je řešením bonusového zadání. Pokud není parametr ''stretch'' zadaný, na chybový výstup se vypíše ''Cell is too short'' a návratová hodnota bude ''103''. ===== Implementace načítacích funkcí ===== Pokud chcete získat další 2 body, je třeba implementovat vlastní řešení načítání konfigurace a sumy. V souborech parse.cpp/hpp je uvedeno jedno z možných řešení jak načítání řešit. V případě vlastního řešení načítacích funkcí je třeba informovat cvičícího, který rozhodne jestli body přidělit nebo nepřidělit. Brute bohužel toto neumí rozpoznat a je třeba manuálního řešení. ===== Příklady ===== ^ Standardní vstup (cin) ^ Očekávaný výstup (cout) ^ Očekávaný chybový výstup (cerr) ^ Návratová hodnota ^ | config.min=-99 config.max=150 config.width=3 config.align=left = 10;20;20;SUM(A:C) -10;-20;-30;-40;-50 | config.min=-99 config.max=150 config.width=3 config.align=left +-----+-----+-----+-----+-----+-----+ | | A | B | C | D | E | +-----+-----+-----+-----+-----+-----+ | 1 | 10 | 20 | 20 | 50 | | +-----+-----+-----+-----+-----+-----+ | 2 | -10 | -20 | -30 | -40 | -50 | +-----+-----+-----+-----+-----+-----+ | | 0 | | config.width=3 config.align=right = 10;20;30;SUM(A:C) -40;-50;-60;-70 90;80;-20;-30 | config.min=-99 config.max=100 config.width=3 config.align=right +-----+-----+-----+-----+-----+ | | A | B | C | D | +-----+-----+-----+-----+-----+ | 1 | 10 | 20 | 30 | 60 | +-----+-----+-----+-----+-----+ | 2 | -40 | -50 | -60 | -70 | +-----+-----+-----+-----+-----+ | 3 | 90 | 80 | -20 | -30 | +-----+-----+-----+-----+-----+ | | 0 | | config.min=0 config.max=10 = 10;20;30;SUM(A:C) 60;20;70 | | Out of range | 100 | | config.min=0 config.max=1000 = a;b;c;400;500;SUM(A:E) 60;20;30;40;50;60;70 | | Invalid input | 101 | | config.min=0 config.max=1000 config.width=-5 = 100;200;300;400;500;SUM(A:E) 60;20;30;40;50;60;70 | | Invalid configuration | 102 | | config.min=0 config.max=1000 config.width=2 = 100;200;300;400;500;SUM(A:E) 60;20;30;40;50;60;70 | | Cell is too short | 103 | | config.min=-5000 config.max=5000 config.width=3 config.align=left config.stretch=0 = 3300;4400;20;SUM(A:C) -40;-50;-60 | config.min=-5000 config.max=5000 config.width=3 config.align=left config.stretch=0 +-----+-----+-----+-----+-----+ | | A | B | C | D | +-----+-----+-----+-----+-----+ | 1 | ### | ### | 20 | ### | +-----+-----+-----+-----+-----+ | 2 | -40 | -50 | -60 | | +-----+-----+-----+-----+-----+ | | 0 | | config.min=-5000 config.max=5000 config.width=3 config.align=left config.stretch=1 = 3300;4400;20;SUM(A:C) -40;-50;-60 | config.min=-5000 config.max=5000 config.width=4 config.align=left config.stretch=1 +------+------+------+------+------+ | | A | B | C | D | +------+------+------+------+------+ | 1 | 3300 | 4400 | 20 | 7720 | +------+------+------+------+------+ | 2 | -40 | -50 | -60 | | +------+------+------+------+------+ | | 0 | | config.min=-99 config.max=100 config.width=4 config.align=left config.header=0 = 33;44;20;SUM(A:C) -40;-50;SUM(A:B);SUM(A:C) 3;14;15;92 | config.min=-99 config.max=100 config.width=4 config.align=left config.header=0 +------+------+------+------+ | 33 | 44 | 20 | 97 | +------+------+------+------+ | -40 | -50 | -90 | -180 | +------+------+------+------+ | 3 | 14 | 15 | 92 | +------+------+------+------+ | | 0 | ====== Odevzdání ====== Do systému BRUTE odevzdejte zabalený archiv s *.cpp a případně *.hpp soubory s libovolným jménem. Všechny soubory musí být v kořenovém adresáři archivu. Visual Studio Code nepodporuje jednoduchou správu projektů složených z více zdrojových souborů. Doporučujeme proto připravit si makefile a make spouštět z příkazového řádku. Veřejné příklady + Template: {{ :courses:b2b99ppc:hw:hw01.zip |HW01.zip}} ([[https://gitlab.fel.cvut.cz/viteks/ppc/-/tree/master/homeworks/hw01|gitlab]]) ^ ^ Povinné i bonusové zadání ^ ^ Název v BRUTE | HW01 | ^ Soubor/y | jakékoliv množství *.cpp/*.hpp souborů | ^ Argumenty při spuštění | žádné | ^ Kompilace pomocí | g++ -pedantic -Wall -Werror -std=c++17 | ^ Procvičované oblasti | standardní vstup a výstup v C++ |