Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

HW 01 - Standardní vstup/výstup v C++

Termín odevzdání 26.3.2023 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

  1. Načítaná data jsou rozdělena na konfiguraci a data oddělena rovná se = na samostatném řádku
  2. 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
    1. min je min. hodnota, která se může vyskytnou v načítaných datech
    2. max je max. hodnota, která se může vyskytnou v načítaných datech
    3. width který označuje počet znaků buňky na výstupu a min. hodnota je 1.
    4. align zarovnává čísla v buňkách vlevo když příkaz nabývá hodnoty left nebo vpravo při hodnotě right
  3. Čísla na vstupu jsou celá, v rozsahu config.min - config.max včetně krajních hodnot.
  4. Počet řádků není omezen.
  5. Jednotlivé sloupce jsou označeny A - Z.
  6. Jednotlivé řádky jsou označeny čísly 1 - n, kde n je poslední řádek
  7. 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.
    1. min=-99, na standardní výstup se vypíše config.min=-99
    2. max=100, na standardní výstup se vypíše config.max=100
    3. width=3, na standardní výstup se vypíše config.width=3.
    4. align=left, na standardní výstup se vypíše config.align=left
  8. Buňky jsou vždy odděleny vždy středníkem ; a řádek končí znakem \n
  9. 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
  10. Pokud řádek bude kratší, vypíše se prázdná buňka
  11. Vypsání parametrů a vykreslení tabulky bude následující
    1. Každý řádek má na konci znak nového řádku \n
    2. Nejprve se vypíšou všechny parametry v pořadí, které jsou uvedeny v bodu 2
    3. Parametry a tabulka jsou odděleny novým řádkem
    4. Každá buňka je ohraničena + v jejím rohu
    5. Sloupce jsou oddělený pomocí svislítka |
    6. Řádky jsou odděleny pomocí pomlček -
    7. První a poslední znak v buňce bude vždy mezera
    8. V případě splnění všech kritérií, návratová hodnota bude 0

Chybová hlášení

  1. 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
  2. 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).
  3. 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.
  4. Šíř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í

  1. Konfigurace config bude rozšířena o následující parametry
    1. 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)
    2. header vypíše hlavičku jednotlivých sloupců a řádků když header=1, jinak ji vypisovat nebude header=0
  2. 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

  1. 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: HW01.zip (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++
courses/b2b99ppc/hw/hw01.txt · Last modified: 2023/02/21 13:22 by nentvond