Vaším úkolem je ze souborů, jejich jména dostanete z příkazové řádky přepsat hodnoty zadaných a uspořádaných „proměných“ do výstupního souboru, jehož jméno také dostanete z příkazové řádky. Opakované definice, předefinují za současného oznámení na chybový výstup. Postupujte takticky a systematicky, abyste toho udělali co nejvíce než na se na něčem zdržíte (například: nejdříve čtení ze souboru, pak parsing, vytvoření člena spojového seznamu, „změnění na velká“ atd.). Zadání si důkladně přečtěte.

  • Program se bude zadávat z příkazové řádky se jmény souborů nebudou-li alespoň dva soubory, program skončí s patřičným oznamem do chybového výstupu nepůjd[e|ou]-li soubor[|y] otevřít, program opět vypíše patřičný oznam do chybového výstupu.
  • Poslední soubor bude výstupní, předcházející bud[e|ou] vstupní.
  • Řádky vstupní[ho|ch] soubor[u|ů] bud[e|ou] mít délku nejvýše 120 znaků (ascii).
  • Ve vstupní[m|ch] soubor[u|ech] bud[e|ou] „přiřazení“ oddělená středníky (bodkočárkami) - znaky ';' poslední „přiřazení“ na řádku bude na onom řádku celé a za ním bude středník (bodkočárka) - znak ';'.
  • Parsing řádky na jednotlivá „přiřazení“ bude dělat funkce „parseLine“.
  • „přiřazení“ se bude skládat ze jména (pojmenování) (znakový řetězec - string) položky a její hodnoty (opět znakový řetězec - string) vzájemně oddělené rovnítkem - znakem '='.
  • Znaky klasifikované funkcí isspace (mající po její aplikací nenulovou hodnotu) kolem znaků ';' a '=' se pomíjí.
  • Parsing „přiřazení“ na jméno (pojmenování) a hodnotu bude dělat funkce „parseItem“.
  • Člen spojového seznamu bude obsahovat jméno (pojmenování) položky - znakový řetěze, ale nikoli paměťový prostor delší, hodnotu položky - znakový řetězec, ale nikoli paměťový prostor delší, a ukazatel (pointer) na následníka - následujícího člena spojového seznamu.
  • Vytvoření člena spojového seznamu bude ze zadaných parametrů dělat funkce „createItem“: vracet bude ukazatel na onoho nově vytvořeného člena spojového seznamu.
  • Funkce toUpperName dostane jako svůj parametr (argument) ukazatel na člena spojového seznamu a malá písmena položky jméno (pojmenování) změní na velká.
  • Následně program bude tyto členy spojového seznamu vzestupně zatřiďovat do spojového seznamu podle jména (pojmenování) a výsledku funkce „strcmp“, bude-li ve spojovém seznamu již člen se stejným jménem (pojmenováním), bude nahrazen novým, starý se uvolní a do chybového výstupu se zapíše oznámení o předefinování: „Value “[old value]„ of item with name “[jméno]„ was redefined by new value “[new value]„.“.
    (Hranaté závorky ('[' a ']') se netisknou ale značí, že se tiskne přílušný obsah).
  • To zatřídění vykoná funkce „insertIntoList“.
  • Do výstupního souboru se spojový seznam vypíše následujícím způsobem: pořadí zůstane zachováno vzestupné
    • na řádku bude jen jedna dvojice jméno (pojmenování), hodnota v tomto pořadí
    • hodnota bude od jména (pojmenování) oddělena právě jednou dvojtečkou - znakem ':' a právě jednou mezerou - znakem ' '.
  • Onen zápis opakovaně vykoná funkce „writeItem“.
    • Příklad vstupu:
          jmeno = Karel;   prijmeni=Varel;Adresa a PSC        =      Brno, Nova 13, 602 99   ;
          kolo = od vozu;
    • Příklad odpovídajícího výstupu:
          ADRESA A PSC: Brno, Nova 13, 602 99
          JMENO: Karel
          KOLO: od vozu
          PRIJMENI: Varel

  • Vstupní soubory, pokud budou, budou korektní: délka řádku nejvýše 120 znaků (ascii) a poslední „přiřazení“ na něm bude celé a za ním bude středník (bodkočárka) - znak ';'.

Soubory na testování

1.datadef
jmeno  =   Karel;prijmeni=     Varel; Rodne prijmeni    =Zakel;
Adresa a PSC    = Brno, Nova 13, 602 99; znameni zverokruhu = krab;
2.datadef
kolo  =  od vozu;
Adresa a PSC      =   Brno, Stara 31, 602 99; Datum Narozeni = 13. cervna 2013;
QR Code
QR Code public:zapapi (generated for current page)