PROG-2 logo
Neprihlásený používateľ

Špecifikácia zadania

Cieľom zadania je napísať konzolovú aplikáciu v jazyku C, ktorá bude rozšírením zadania č. 4. Rozšírenie bude spočívať v pridaní textových súborov, z ktorých sa načítajú predmety a bojové jednotky. Predmety sa načítajú z JSON súboru. Bojové jednotky v armáde sa načítajú z TXT súborov. Počas načítania bude dôraz kladený na odhaľovanie rôznych chybových situácií. V tomto zadaní si precvičíte prácu s command-line argumentmi a súbormi.

Workflow

Vaša konzolová aplikácia napísaná v jazyku C bude fungovať v týchto krokoch:

  1. Spustenie skompilovaného programu v termináli.
  2. Detekcia chyby ERR_CMD.
  3. Načítanie predmetov z JSON súboru.
    • Detekcia chyby ERR_FILE.
    • Detekcia chyby ERR_MISSING_ATTRIBUTE.
    • Detekcia chyby ERR_MISSING_VALUE.
    • Detekcia chyby ERR_BAD_VALUE.
  4. Koľko CMD argumentov zadal používateľ?
    • Ak zadal 0 argumentov:
      • Výpis predmetov.
    • Ak zadal 2 argumenty:
      • Načítanie oboch armád z TXT súborov.
        • Detekcia chyby ERR_FILE
        • Detekcia chyby ERR_UNIT_COUNT
        • Detekcia chyby ERR_ITEM_COUNT
        • Detekcia chyby ERR_WRONG_ITEM
        • Detekcia chyby ERR_SLOTS
      • Výpis armád.


Obrázok 1: Workflow diagram programu (veľký obrázok).


Spustenie programu

Existujú 2 možnosti spustenia programu:

  • Bez CMD argumentov.
  • Zadajú sa 2 CMD argumenty, ktoré predstavujú cestu k TXT súborom pre načítanie armád.

Spustenie bez CMD argumentov

V tomto prípade program postupuje nasledovne:

  1. Načítanie predmetov z JSON súboru a detekcia súvisiacich chýb. Cesta k JSON súboru je určená makrom ITEMS_FILE, ktoré sa nachádza v dodanom hlavičkovom súbore data.h.
  2. Výpis predmetov (na stdout).

Spustenie programu bez CMD argumentov:

z5.exe

Spustenie s CMD argumentmi

Používateľ zadá 2 CMD argumenty, ktoré predstavujú cestu k TXT súborom pre načítanie armád. V tomto prípade program postupuje nasledovne:

  1. Načítanie predmetov z JSON súboru a detekcia súvisiacich chýb. Cesta k JSON súboru je určená makrom ITEMS_FILE, ktoré sa nachádza v dodanom hlavičkovom súbore data.h.
  2. Načítanie armád z TXT súborov a detekcia súvisiacich chýb.
  3. Výpis armád (na stdout).

Spustenie programu s 2 CMD argumentmi:

z5.exe txt/army1.txt txt/army2.txt

Chyba ERR_CMD

Nastane v prípade, že používateľ zadá nesprávny počet CMD argumentov. Správny počet argumentov je 0 (argc=1) alebo 2 (argc=3). Pri odhalení chyby sa vypíše chybové hlásenie ERR_CMD na štandardný chybový výstup (stderr). Následne program skončí s návratovou hodnotou 0.

Príklady spustenia programu, kedy nastane chyba ERR_CMD:

z5.exe txt/army1.txt

Poznámka: v tomto prípade používateľ zadal iba 1 CMD argument, ktorý predstavuje cestu k TXT súboru s 1. armádou. Chýba zadanie cesty k súboru s 2. armádou.

z5.exe txt/army1.txt txt/army2.txt txt/army3.txt

Poznámka: v tomto prípade používateľ zadal viac ako 2 cesty (bojujú proti sebe len 2 armády).

Načítanie predmetov

Predmety sa načítajú z JSON súboru. Cesta k tomuto súboru je určená makrom ITEMS_FILE, ktoré sa nachádza v dodanom hlavičkovom súbore data.h. JSON súbor môže obsahovať premenlivý počet predmetov. Z toho dôvodu je ideálne načítavanie implementovať pomocou dynamického poľa. Počas načítavania môžu nastať rôzne chybové situácie, ktoré je potrebné odhaliť.

JSON

JSON je štruktúrovaný formát súboru na uchovávanie údajov. JSON môže obsahovať:

  • Reťazec (vždy v úvodzovkách)
  • Číslo
  • Bool hodnota (true/false)
  • Objekt (je zložený z tzv. key-value párov)
  • Pole (je to postupnosť hodnôt)

Uvádzame príklad JSON súboru, ktorý obsahuje pole objektov s osobami. Každý objekt má key-value páry definujúce jednotlivé atribúty objektu.

[
  {
    "name": "Alice Johnson",
    "age": 30,
    "email": "alice@example.com"
  },
  {
    "name": "Bob Smith",
    "age": 25,
    "email": "bob@example.com"
  },
  {
    "name": "Charlie Brown",
    "age": 40,
    "email": "charlie@example.com"
  }
]

Pravidlá pre JSON

  • Pole
    • Pole je definované zátvorkami [...].
    • Prvky poľa sú vzájomne oddelené čiarkou.
    • Za posledným prvkom poľa nie je čiarka.
  • Objekt
    • Objekt je definovaný zátvorkami {...}.
    • Objekt sa skladá z key-value párov.
    • Key-value páry sú oddelené čiarkami.
    • Za posledným key-value párom nie je čiarka.
    • Kľúč musí byť vždy reťazec v úvodzovkách.
    • Hodnotou môže byť číslo, reťazec, objekt alebo pole.
    • Kľúč je od hodnoty oddelený dvojbodkou (znak :).

Na overenie, či je JSON súbor platný môžete použiť JSON Lint.

Príklad JSON súboru s predmetmi

Uvádzame príklad JSON súboru, ktorý bude obsahovať databázu predmetov. JSON obsahuje pole predmetov. Každý predmet je reprezentovaný ako objekt. Každý predmet má svoje atribúty vyjadrené pomocou key-value párov. Atribúty každého predmetu sú vždy v nasledovnom poradí: name, att, def, slots, range a radius.

[
	{
		"name":"wand",
		"att":12,
		"def":4,
		"slots":1,
		"range":4,
		"radius":2
	},
	{
		"name":"fireball",
		"att":11,
		"def":0,
		"slots":1,
		"range":3,
		"radius":3
	},
	{
		"name":"sword",
		"att":9,
		"def":2,
		"slots":1,
		"range":0,
		"radius":0
	},
	{
		"name":"spear",
		"att":6,
		"def":1,
		"slots":1,
		"range":1,
		"radius":1
	},
	{
		"name":"dagger",
		"att":4,
		"def":0,
		"slots":1,
		"range":0,
		"radius":0
	},
	{
		"name":"rock",
		"att":3,
		"def":0,
		"slots":1,
		"range":2,
		"radius":1
	},
	{
		"name":"armor",
		"att":2,
		"def":7,
		"slots":1,
		"range":0,
		"radius":0
	},
	{
		"name":"shield",
		"att":2,
		"def":6,
		"slots":1,
		"range":0,
		"radius":0
	},
	{
		"name":"gloves",
		"att":1,
		"def":4,
		"slots":1,
		"range":0,
		"radius":0
	},
	{
		"name":"helmet",
		"att":1,
		"def":5,
		"slots":1,
		"range":0,
		"radius":0
	},
	{
		"name":"aura",
		"att":0,
		"def":8,
		"slots":1,
		"range":0,
		"radius":0
	},
	{
		"name":"cannon",
		"att":12,
		"def":0,
		"slots":2,
		"range":4,
		"radius":4
	},
	{
		"name":"axe",
		"att":10,
		"def":2,
		"slots":2,
		"range":1,
		"radius":1
	},
	{
		"name":"hammer",
		"att":8,
		"def":2,
		"slots":2,
		"range":1,
		"radius":2
	},
	{
		"name":"crossbow",
		"att":5,
		"def":1,
		"slots":2,
		"range":3,
		"radius":0
	},
	{
		"name":"slingshot",
		"att":2,
		"def":0,
		"slots":2,
		"range":2,
		"radius":1
	}
]

Pokyny k formátu

Uvádzame pokyny k formátu JSON súboru, ktorý obsahuje databázu predmetov. Treba si tieto pokyny riadne naštudovať, aby ste vedeli, na čo si treba dať počas načítania pozor.

  • Každý riadok môže mať ľubovoľné horizontálne odsadenie a ľubovoľný počet medzier medzi hodnotami v riadku. Tester bude skúšať formátované aj neformátované vstupy.
  • JSON súbor nebude obsahovať prázdne riadky.
  • Čo netreba ošetrovať počas načítavania?
    • Zátvorky nebudú obsahovať chyby (vždy sa použije správny typ zátvoriek a budú spárované).
    • Za koncovou zátvorkou predmetu } bude vždy nasledovať čiarka ešte v tom istom riadku. Za posledným predmetom čiarka nebude.
    • Kľúč a hodnota budú oddelené znakom :
    • Každý kľúč bude mať svoju hodnotu okrem situácií, kedy nastane chyba ERR_MISSING_VALUE.
    • Reťazce budú vždy v úvodzovkách okrem situácií, kedy nastane chyba ERR_BAD_VALUE.
    • Key-value páry budú od seba oddelené čiarkami (za posledným čiarka nebude).

Formátovaný JSON súbor

[
	{
		"name":"slingshot",
		"att":2,
		"def":0,
		"slots":2,
		"range":2,
		"radius":1
	},
	{
		"name":"spear",
		"att":6,
		"def":1,
		"slots":1,
		"range":1,
		"radius":1
	},
	{
		"name":"armor",
		"att":2,
		"def":7,
		"slots":1,
		"range":0,
		"radius":0
	},
	{
		"name":"shield",
		"att":2,
		"def":6,
		"slots":1,
		"range":0,
		"radius":0
	},
	{
		"name":"aura",
		"att":0,
		"def":8,
		"slots":1,
		"range":0,
		"radius":0
	},
	{
		"name":"hammer",
		"att":8,
		"def":2,
		"slots":2,
		"range":1,
		"radius":2
	},
	{
		"name":"crossbow",
		"att":5,
		"def":1,
		"slots":2,
		"range":3,
		"radius":0
	},
	{
		"name":"fireball",
		"att":11,
		"def":0,
		"slots":1,
		"range":3,
		"radius":3
	},
	{
		"name":"sword",
		"att":9,
		"def":2,
		"slots":1,
		"range":0,
		"radius":0
	}
]

Neformátovaný JSON súbor

[
	{
"name":"slingshot",
"att":2  ,
"def":0,
"slots"    :2,
"range":2,
"radius":1
	},
	{
		"name":"spear",
		"att":6  ,
		"def":1,
		"slots":1  ,
		"range":1 ,
		"radius":1
	},
	{
				"name":"armor",
				"att":2,
				"def":7,
				"slots":1   ,
				"range":0,
				"radius":0
	},
	{
		"name":   "shield",
		"att":   2,
		"def":6,
		"slots":1,
		"range":0   ,
		"radius":0
	},
	{
		"name":"aura",
		"att":   0,
		"def":8,
		"slots":   1,
		"range":0,
		"radius":0
	},
{
		"name":"hammer",
		"att":8,
"def":2,
		"slots":2,
		"range":1   ,
		"radius":2
						},
	{
		"name":"crossbow",
		"att":5,
		  "def":1,
		"slots":2,
				"range" :   3,
		"radius":  0
	},
	{
		"name"  :   "fireball",
		"att":  11  ,
		"def":   0,
		"slots":1,
		"range":3  ,
		"radius":3
	},
{
		"name":"sword",
		"att":9,
		"def":2,
		"slots":1,
		"range":0,
		"radius":0
}
		]

Chyby

Počas načítavania predmetov môžu nastať nasledovné chyby, ktoré je potrebné odhaliť, vypísať príslušné chybové hlásenie na stderr (štandardný chybový výstup) a následne ukončiť program s návratovou hodnotou 0. Chyby sa nebudú vzájomne kombinovať.

ERR_FILE

Nastane ak sa JSON súbor nedá otvoriť (t.j. súbor daný makrom ITEMS_FILE neexistuje). V danom prípade sa na stderr vypíše chybové hlásenie ERR_FILE a program skončí s návratovou hodnotou 0.

ERR_MISSING_ATTRIBUTE

Ak v JSON súbore chýba niektorý atribút predmetu (t.j. chýba príslušný key-value pár). V danom prípade sa na stderr vypíše chybové hlásenie ERR_MISSING_ATTRIBUTE a program skončí s návratovou hodnotou 0.

Príklad

{
    "att":9,
    "def":2,
    "slots":1,
    "range":0,
    "radius":0
}

Poznámka: predmet nemá zadaný atribút name.

ERR_MISSING_VALUE

Ak v JSON súbore chýba niektorému kľúču jeho povinná hodnota. V danom prípade sa na stderr vypíše chybové hlásenie ERR_MISSING_VALUE a program skončí s návratovou hodnotou 0.

Príklad

{
    "name":"aura",
    "att":0,
    "def":,
    "slots":1,
    "range":0,
    "radius":0
}

Poznámka: kľúč def nemá zadanú hodnotu.

ERR_BAD_VALUE

Ak má kľúč v JSON súbore neplatnú hodnotu. Napríklad očakáva sa číslo a bol zadaný reťazec písmen. Testovať sa budú len numerické atribúty, t.j. att, def, slots, range a radius (t.j. či bola pre tieto atribúty zadaná numerická hodnota). V danom prípade sa na stderr vypíše chybové hlásenie ERR_BAD_VALUE a program skončí s návratovou hodnotou 0.

Príklad

{
    "name":"fireball",
    "att":abcd,
    "def":0,
    "slots":1,
    "range":3,
    "radius":3
}

Poznámka: Kľúč att má namiesto čísla zadaný reťazec abcd.

Predmety sa vypíšu v takom poradí, v akom sú uložené v JSON súbore. Každému predmetu sa vypíšu všetky atribúty.

JSON súbor s predmetmi

[
	{
		"name":"slingshot",
		"att":2,
		"def":0,
		"slots":2,
		"range":2,
		"radius":1
	},
	{
		"name":"spear",
		"att":6,
		"def":1,
		"slots":1,
		"range":1,
		"radius":1
	},
	{
		"name":"armor",
		"att":2,
		"def":7,
		"slots":1,
		"range":0,
		"radius":0
	},
	{
		"name":"shield",
		"att":2,
		"def":6,
		"slots":1,
		"range":0,
		"radius":0
	},
	{
		"name":"aura",
		"att":0,
		"def":8,
		"slots":1,
		"range":0,
		"radius":0
	},
	{
		"name":"hammer",
		"att":8,
		"def":2,
		"slots":2,
		"range":1,
		"radius":2
	},
	{
		"name":"crossbow",
		"att":5,
		"def":1,
		"slots":2,
		"range":3,
		"radius":0
	},
	{
		"name":"fireball",
		"att":11,
		"def":0,
		"slots":1,
		"range":3,
		"radius":3
	},
	{
		"name":"sword",
		"att":9,
		"def":2,
		"slots":1,
		"range":0,
		"radius":0
	}
]

Výpis predmetov

Name: slingshot
Attack: 2
Defense: 0
Slots: 2
Range: 2
Radius: 1

Name: spear
Attack: 6
Defense: 1
Slots: 1
Range: 1
Radius: 1

Name: armor
Attack: 2
Defense: 7
Slots: 1
Range: 0
Radius: 0

Name: shield
Attack: 2
Defense: 6
Slots: 1
Range: 0
Radius: 0

Name: aura
Attack: 0
Defense: 8
Slots: 1
Range: 0
Radius: 0

Name: hammer
Attack: 8
Defense: 2
Slots: 2
Range: 1
Radius: 2

Name: crossbow
Attack: 5
Defense: 1
Slots: 2
Range: 3
Radius: 0

Name: fireball
Attack: 11
Defense: 0
Slots: 1
Range: 3
Radius: 3

Name: sword
Attack: 9
Defense: 2
Slots: 1
Range: 0
Radius: 0

Pre výpis predmetov budú platiť nasledovné pravidlá.

  • Tester bude tolerovať ľubovoľný počet prázdnych riadkov.
  • Každý riadok môže mať ľubovoľné horizontálne odsadenie a ľubovoľný počet medzier medzi hodnotami v riadku.
  • Reťazce sa nevypisujú v úvodzovkách.
  • Netolerujú sa preklepy. Treba použiť presne stanovené menovky Name, Attack, Defense, Slots, Range a Radius.

Očakávaný výstup

Name: slingshot
Attack: 2
Defense: 0
Slots: 2
Range: 2
Radius: 1

Name: spear
Attack: 6
Defense: 1
Slots: 1
Range: 1
Radius: 1

Name: armor
Attack: 2
Defense: 7
Slots: 1
Range: 0
Radius: 0

Name: shield
Attack: 2
Defense: 6
Slots: 1
Range: 0
Radius: 0

Name: aura
Attack: 0
Defense: 8
Slots: 1
Range: 0
Radius: 0

Name: hammer
Attack: 8
Defense: 2
Slots: 2
Range: 1
Radius: 2

Name: crossbow
Attack: 5
Defense: 1
Slots: 2
Range: 3
Radius: 0

Name: fireball
Attack: 11
Defense: 0
Slots: 1
Range: 3
Radius: 3

Name: sword
Attack: 9
Defense: 2
Slots: 1
Range: 0
Radius: 0

Tolerovaný výstup

    Name:   slingshot
Attack: 2
        Defense:    0
        Slots: 2
        Range: 2
Radius: 1

    Name: spear
    Attack: 6
Defense: 1
Slots: 1
Range:      1
Radius: 1

    Name: armor
    Attack: 2
    Defense: 7
Slots: 1
Range: 0
        Radius: 0


Name: shield
Attack: 2
Defense: 6
    Slots:          1
Range: 0
Radius: 0


        Name: aura
        Attack: 0
        Defense: 8
        Slots: 1
        Range: 0
        Radius: 0

Name:       hammer
Attack: 8
Defense: 2
Slots: 2
Range: 1
Radius: 2

Name: crossbow
Attack:    5
    Defense: 1
Slots:         2
Range: 3
Radius: 0


Name: fireball
Attack: 11
Defense: 0
    Slots: 1
    Range: 3
    Radius: 3

Name: sword
        Attack: 9
        Defense: 2
    Slots: 1
    Range: 0
Radius: 0

Načítanie armád

Bojové jednotky jednej armády sú uložené v TXT súbore (cesta k tomuto súboru je zadaná ako CMD argument). Formát TXT súboru je rovnaký ako v zadaní 4.

Príklad TXT súboru, ktorý obsahuje bojové jednotky armády.

5
Lukas gloves
Tomas spear dagger
Robo rock
Patrik axe
Juro aura wand

Pokyny k formátu

Uvádzame pokyny k formátu, ktorý bude platiť pre TXT súbor s armádou. Tester môže počas testovania skúšať TXT súbory s rôznym formátovaním v rámci platných pravidiel.

  • V súbore sa nebudú vyskytovať prázdne riadky.
  • Každý riadok môže mať ľubovoľné horizontálne odsadenie a ľubovoľný počet medzier medzi hodnotami v riadku.
  • Hodnoty v riadku budú od seba vždy oddelené aspoň 1 medzerou.
  • Meno jednotky bude vždy zadané a zložené z písmen.

Formátovaný TXT súbor

3
Neil hammer
Nick rock helmet
Buck axe

Neformátovaný TXT súbor

  3
       Neil   hammer
Nick rock         helmet
   Buck    axe

Chyby

Počas načítavania armád môžu nastať nasledovné chyby, ktoré je potrebné odhaliť, vypísať príslušné chybové hlásenie na stderr (štandardný chybový výstup) a následne ukončiť program s návratovou hodnotou 0. Chyby sa nebudú vzájomne kombinovať.

ERR_FILE

Zadaný TXT súbor s aramádou sa nedá otvoriť (napr. neplatná cesta). V danom prípade sa na stderr vypíše chybové hlásenie ERR_FILE a program skončí s návratovou hodnotou 0.

Príklad

z5.exe txt/army1.txt bad/path/to/file.txt

Poznámka: v tomto prípade používateľ zadal 2 CMD argumenty, pričom druhý CMD argument predstavuje neplatnú cestu k súboru (taký súbor neexistuje).

ERR_UNIT_COUNT

Nesprávny počet jednotiek v armáde. Platia tu rovnaké pravidlá ako v zadaní 4. V danom prípade sa na stderr vypíše chybové hlásenie ERR_UNIT_COUNT a program skončí s návratovou hodnotou 0.

Príklad

armyA.txt

6
Tom dagger
Paul sword shield
Miko rock
Rago shield
Finto cannon
Lepto spear helmet

armyB.txt

4
Adam rock aura
Miro crossbow
Jano dagger dagger
Jozo wand
z5.exe armyA.txt armyB.txt

Poznámka: v súbore armyA.txt je zadaných až 6 bojových jednotiek.

ERR_ITEM_COUNT

Nesprávny počet predmetov v inventári. Platia tu rovnaké pravidlá ako v zadaní 4. V danom prípade sa na stderr vypíše chybové hlásenie ERR_ITEM_COUNT a program skončí s návratovou hodnotou 0.

Príklad

armyA.txt

1
Mike slingshot

armyB.txt

2
Hell shield gloves
Bill rock rock dagger
z5.exe armyA.txt armyB.txt

Poznámka: v súbore armyB.txt má jednotka s menom Bill zadané až 3 predmety.

ERR_WRONG_ITEM

Neznámy predmet v inventári. Platia tu rovnaké pravidlá ako v zadaní 4. V danom prípade sa na stderr vypíše chybové hlásenie ERR_WRONG_ITEM a program skončí s návratovou hodnotou 0.

Príklad

armyA.txt

1
Tobby dagger paper

armyB.txt

2
Tom dagger
Paul sword shield
z5.exe armyA.txt armyB.txt

Poznámka: v súbore armyA.txt má jednotka s menom Tobby zadaný neplatný predmet s názvom paper (nenachádza sa v databáze items.json).

ERR_SLOTS

Počet slotov bol prekročený. Platia tu rovnaké pravidlá ako v zadaní 4. V danom prípade sa na stderr vypíše chybové hlásenie ERR_SLOTS a program skončí s návratovou hodnotou 0.

Príklad

armyA.txt

5
Lukas gloves
Tomas spear dagger
Robo rock
Patrik axe
Juro aura wand

armyB.txt

3
Shu dagger
Pho hammer gloves
Rhi sword sword
z5.exe armyA.txt armyB.txt

Poznámka: v súbore armyB.txt má jednotka s menom Pho prekročený počet slotov, pretože predmety hammer a gloves zaberajú dokopy 3 sloty (použila sa databáza items.json).

Pre výpis armád platia rovnaké pravidlá ako v zadaní 4. V každej armáde sa vypíšu všetky jednotky a ich atribúty.

Súbor army4.txt

4
Adam rock aura
Miro crossbow
Jano dagger dagger
Jozo wand

Súbor army1.txt

1
Mike slingshot

Spustenie programu

z5.exe army4.txt army1.txt

Výpis armád

Army 1
    Unit: 0
    Name: Adam
    HP: 100
    Item 1: rock,3,0,1,2,1
    Item 2: aura,0,8,1,0,0

    Unit: 1
    Name: Miro
    HP: 100
    Item 1: crossbow,5,1,2,3,0

    Unit: 2
    Name: Jano
    HP: 100
    Item 1: dagger,4,0,1,0,0
    Item 2: dagger,4,0,1,0,0

    Unit: 3
    Name: Jozo
    HP: 100
    Item 1: wand,12,4,1,4,2

Army 2
    Unit: 0
    Name: Mike
    HP: 100
    Item 1: slingshot,2,0,2,2,1

Poznámka: použila sa databáza items.json

Pre výpis armád budú platiť nasledovné pravidlá.

  • Tester bude tolerovať ľubovoľný počet prázdnych riadkov.
  • Každý riadok môže mať ľubovoľné horizontálne odsadenie a ľubovoľný počet medzier medzi hodnotami v riadku.
  • Netolerujú sa preklepy. Treba použiť presne stanovené menovky Army, Unit:, Name:, HP:, Item 1: a Item 2:.

Očakávaný výstup

Army 1
    Unit: 0
    Name: Mike
    HP: 100
    Item 1: slingshot,2,0,2,2,1

Army 2
    Unit: 0
    Name: Tom
    HP: 100
    Item 1: dagger,4,0,1,0,0

    Unit: 1
    Name: Paul
    HP: 100
    Item 1: sword,9,2,1,0,0
    Item 2: shield,2,6,1,0,0

Tolerovaný výstup


Army 1
Unit: 0
Name:    Mike
   HP:   100
Item 1: slingshot, 2, 0, 2,   2,   1


        Army 2
    Unit: 0
           Name: Tom
    HP: 100
    Item 1: dagger,4,0,1,0,0



        Unit:   1
Name:   Paul
        HP: 100
             Item 1: sword,9,2,1,0,     0
        Item 2: shield,      2,6,1,0,0


Dodané súbory

K zadaniu sú k dispozícii na stiahnutie nasledovné súbory.

Zdrojové/hlavičkové súbory

Z webstránky zadania si môžete stiahnuť dodané zdrojové/hlavičkové súbory.

Hlavičkový súbor data.h

/*
 *  Makra a struktury
 */

#ifndef DATA_H
#define DATA_H

#define ITEMS_FILE "items.json"   // fixne dana cesta k JSON suboru s predmetmi ... NEMENIT !!!
#define MAX_LINE 1000       // maximalna dlzka riadku v TXT/JSON subore
#define MAX_FILENAME 500    // maximalna dlzka cesty k suboru
#define MAX_NAME 100        // maximalna dlzka nazvu/mena predmetu/jednotky
#define MIN_ARMY 1          // minimalny pocet bojovych jednotiek v armade
#define MAX_ARMY 5          // maximalny pocet bojovych jednotiek v armade

// chyby vznikajuce pocas nacitania predmetov z JSON suboru
#define ERR_MISSING_ATTRIBUTE "ERR_MISSING_ATTRIBUTE"   // chybajuci atribut predmetu
#define ERR_MISSING_VALUE "ERR_MISSING_VALUE"           // chybajuca hodnota kluca
#define ERR_BAD_VALUE "ERR_BAD_VALUE"                   // zla hodnota kluca

// chyby vznikajuce pocas nacitania armady z TXT suboru
#define ERR_UNIT_COUNT "ERR_UNIT_COUNT"                 // nespravny pocet jednotiek
#define ERR_ITEM_COUNT "ERR_ITEM_COUNT"                 // nepovoleny pocet predmetov v inventari
#define ERR_WRONG_ITEM "ERR_WRONG_ITEM"                 // neznamy predmet v inventari
#define ERR_SLOTS "ERR_SLOTS"                           // pocet slotov prekroceny

// dalsie chyby
#define ERR_FILE "ERR_FILE"                             // subor sa neda otvorit (plati pre JSON aj TXT subor)
#define ERR_CMD "ERR_CMD"                               // zly pocet CMD argumentov

// Struktura pre predmet v inventari
typedef struct item {
    char name[MAX_NAME + 1];        // nazov predmetu
    int att;                        // utok
    int def;                        // obrana
    int slots;                      // pocet slotov, ktore zabera predmet v inventari
    int range;                      // utocny dosah/dostrel predmetu
    int radius;                     // sirka zasahu (alebo damage radius)
} ITEM;

// Struktura pre bojovu jednotku
typedef struct unit {
    char name[MAX_NAME + 1];    // meno jednotky
    const ITEM *item1;          // prvy predmet v inventari (ukazuje do pola 'items')
    const ITEM *item2;          // druhy predmet v inventari (ukazuje do pola 'items')
    int hp;                     // zdravie (z angl. hit points)
} UNIT;

#endif //DATA_H

Zdrojový súbor z5.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// NEMENIT, inak vas kod neprejde testom !!!
#include "data.h"

int main(const int argc, char *argv[]) {
	return 0;
}

JSON/TXT súbory

Z webstránky zadania si môžete stiahnuť dodané JSON/TXT súbory. Tieto súbory sa používajú na načítanie predmetov a armád.

Štruktúra a obsah archívu json_txt.zip

  • Priečinok json obsahuje JSON súbory potrebné pre načítanie databázy predmetov.
  • Priečinok txt obsahuje TXT súbory potrebné pre načítanie armád.
  • V každom priečinku je súbor readme.txt s popisom.
json_txt.zip
├── json/
│   ├── err_bad_value1.json
│   ├── err_bad_value2.json
│   ├── err_bad_value3.json
│   ├── err_missing_attribute1.json
│   ├── err_missing_attribute2.json
│   ├── err_missing_attribute3.json
│   ├── err_missing_value1.json
│   ├── err_missing_value2.json
│   ├── err_missing_value3.json
│   ├── items1.json
│   ├── items1_noformat.json
│   ├── items2.json
│   ├── items2_noformat.json
│   ├── items3.json
│   ├── items3_noformat.json
│   └── readme.txt
└── txt/
    ├── army_noformat.txt
    ├── army1.txt
    ├── army2.txt
    ├── army3.txt
    ├── army4.txt
    ├── army5.txt
    ├── army6.txt
    ├── army7.txt
    ├── army8.txt
    ├── army9.txt
    ├── err_item_count.txt
    ├── err_slots.txt
    ├── err_unit_count.txt
    ├── err_wrong_item.txt
    └── readme.txt

Dôležitá poznámka:

Program vždy načítava predmety zo súboru, ktorý je daný makrom ITEMS_FILE v súbore data.h. Toto makro je fixne nastavené cestu items.json. Z toho dôvodu je nutné vždy premenovať testovaný JSON súbor z priečinku json na názov items.json. Taktiež je nutné, aby bol daný JSON súbor v rovnakom adresári ako spúšťaný program resp. sa nachádzal v pracovnom adresári programu.

Testovacie príklady

Z webstránky zadania si môžete stiahnuť dodané testovacie súbory.

Štruktúra a obsah archívu z5_testing.zip

  • Priečinok cmd obsahuje textové súbory s návodom ako spustiť program v jednotlivých scenároch. Daný textový súbor obsahuje príkaz akým je nutné spustiť program v príkazovom riadku a informáciu o tom, ktorý JSON súbor bol použitý na testovanie.
  • Priečinok output obsahuje textové súbory s výstupom programu v jednotlivých scenároch. V prípade scenárov, kde sú testované chybové situácie sa jedná o štandardný chybový výstup (stderr) a v prípade ostatných scenárov sa jedná o štandardný výstup (stdout).
z5_testing.zip
├── cmd/
│   ├── s1/
│   │   ├── example1.txt
│   │   ├── example2.txt
│   │   ├── example3.txt
│   │   ├── example4.txt
│   │   ├── example5.txt
│   │   └── example6.txt
│   ├── s2/
│   │   ├── example1.txt
│   │   ├── example2.txt
│   │   └── example3.txt
│   ├── s3/
│   │   ├── example1.txt
│   │   ├── example2.txt
│   │   └── example3.txt
│   ├── s4/
│   │   ├── example1.txt
│   │   ├── example2.txt
│   │   └── example3.txt
│   ├── s5/
│   │   ├── example1.txt
│   │   ├── example2.txt
│   │   ├── example3.txt
│   │   ├── example4.txt
│   │   ├── example5.txt
│   │   ├── example6.txt
│   │   └── example7.txt
│   ├── s6/
│   │   ├── example1.txt
│   │   ├── example2.txt
│   │   ├── example3.txt
│   │   └── example4.txt
│   ├── s7/
│   │   ├── example1.txt
│   │   └── example2.txt
│   └── s8/
│       ├── example1.txt
│       └── example2.txt
└── output/
    ├── s1/
    │   ├── example1.txt
    │   ├── example2.txt
    │   ├── example3.txt
    │   ├── example4.txt
    │   ├── example5.txt
    │   └── example6.txt
    ├── s2/
    │   ├── example1.txt
    │   ├── example2.txt
    │   └── example3.txt
    ├── s3/
    │   ├── example1.txt
    │   ├── example2.txt
    │   └── example3.txt
    ├── s4/
    │   ├── example1.txt
    │   ├── example2.txt
    │   └── example3.txt
    ├── s5/
    │   ├── example1.txt
    │   ├── example2.txt
    │   ├── example3.txt
    │   ├── example4.txt
    │   ├── example5.txt
    │   ├── example6.txt
    │   └── example7.txt
    ├── s6/
    │   ├── example1.txt
    │   ├── example2.txt
    │   ├── example3.txt
    │   └── example4.txt
    ├── s7/
    │   ├── example1.txt
    │   └── example2.txt
    └── s8/
        ├── example1.txt
        └── example2.txt

Vstupný súbor z priečinku cmd

Textový súbor cmd/s5/example3.txt

Spustenie: z5.exe txt/army4.txt txt/army1.txt
Databaza predmetov: items1.json (treba premenovat na items.json)

Vysvetlenie:

Jedná sa o scenár 5 a testovací prípad 3. Skompilovaný program je potrebné spustiť príkazom z5.exe txt/army4.txt txt/army1.txt. Program treba umiestniť do správneho priečinku tak, aby boli uvedené cesty platné. Na testovanie sa použil JSON súbor s názvom items1.json. Tento súbor je potrebné premenovať na items.json a prekopírovať z adresára json do rovnakého priečinku, v ktorom sa nachádza spúšťaný program z5.exe.

Výstupný súbor z priečinku output

Textový súbor output/s5/example3.txt

Army 1
    Unit: 0
    Name: Adam
    HP: 100
    Item 1: rock,3,0,1,2,1
    Item 2: aura,0,8,1,0,0

    Unit: 1
    Name: Miro
    HP: 100
    Item 1: crossbow,5,1,2,3,0

    Unit: 2
    Name: Jano
    HP: 100
    Item 1: dagger,4,0,1,0,0
    Item 2: dagger,4,0,1,0,0

    Unit: 3
    Name: Jozo
    HP: 100
    Item 1: wand,12,4,1,4,2

Army 2
    Unit: 0
    Name: Mike
    HP: 100
    Item 1: slingshot,2,0,2,2,1

Vysvetlenie:

Tento výstup dostaneme po spustení programu podľa inštrukcií v súbore cmd/s5/example3.txt. Keďže sa nejednalo o chybový výstup, tak text bol vypísaný na stdout.

Hodnotenie zadania

Odovzdávací systém otestuje a vyhodnotí nasledovné oblasti funkcionality vášho programu. Na získanie bodov za konkrétny testovací scenár je nutné, aby testom prešli všetky testovacie prípady v danom scenári.

Testovacie scenáre
Scenár 1
Spustenie programu bez CMD argumentov + výpis predmetov
3,5 b
Scenár 2
Chyba ERR_MISSING_ATTRIBUTE
1,0 b
Scenár 3
Chyba ERR_MISSING_VALUE
1,0 b
Scenár 4
Chyba ERR_BAD_VALUE
1,0 b
Scenár 5
Spustenie programu s 2 CMD argumentmi + výpis armád.
2,0 b
Scenár 6
Chyby zo zadania 4 (ERR_UNIT_COUNT, ERR_ITEM_COUNT, ERR_WRONG_ITEM, ERR_SLOTS)
0,5 b
Scenár 7
Chyba ERR_FILE (JSON súbor s predmetmi alebo TXT súbor s armádou sa nedá otvoriť)
0,5 b
Scenár 8
Chyba ERR_CMD
0,5 b
Súčet 10,0 b

Zdroje

Nasledujúce zdroje vám môžu pomôcť pri programovaní zadania. Odporúčame si tieto zdroje preštudovať. Na prístup k niektorým zdrojom potrebujete byť prihlásení vo vašom univerzitnom Google STU konte.

Prednášky
Jazyk C
Zdroje použité pri tvorbe zadania a prezentácie
Copyright © 2025, Pavol Marák, ÚIM FEI STU.
Vyrobené pomocou Django a Spectre.css.
Regulárne výrazy testujeme pomocou Regular Expression 101.
Videá prehrávame pomocou Plyr prehrávača.
Animácie vytvárame pomocou Animate.css.