Vasilică este pasionat de scriere de documente text, dar mai ales de alinierea corectă a acestora. Din păcate prietenul nostru are o mare problemă: nu găsește un editor de texte care să alinieze un text ținând cont de numărul de caractere dorite pe linii.
Vasilică vă provoacă pe voi să aliniați textele primite ca input la stânga, dreapta, centrate și justify ținând cont de numărul de caractere pe linii. Pentru că este un fan XML, lui Vasilică îi este foarte ușor să livreze textele de input ca niște fișiere de tip XML. Chiar dacă Vasilică vă dă textele de input ca fișier, voi nu trebuie să citiți din fișiere utilizând funcțiile din C specifice. Textele de input se vor da utilizând redirectări în linia de comandă:
./executabil <input >output
–input este un fișier unde există date de intrare,
–output este un fișier unde se vor scrie datele de ieșire.
De asemenea Vasilică mai pune o condiție pentru output: pentru că textele pe care le scrie el sunt referitoare la limbajul C, vă cere ca cele mai importante cuvinte cheie din C sa fie scrise cu litere mari.
Descrierea XML
XML este un acronim pentru eXtensible Markup Language. Acesta este un limbaj “de marcare” (markup language – ca și HTML-ul bunăoară). Principala sa funcție este însă descrierea informației, fiind conceput să fie auto-descriptiv. Astfel, XML nu FACE în sine nimic, ci e doar un mijloc de structurare și stocare a informației (care prezintă o serie de avantaje). Un fișier XML este un fișier text cu o structură specială. Acesta conține o serie de tag-uri încadrate de paranteze angulare (ca și fișierele HTML de exemplu); spre deosebire de HTML însă acestea nu sunt predefinite. Ele pot fi definite de utilizator în totalitate, cu respectarea următoarelor reguli:
- tag-urile sunt case-sensitive
- orice tag trebuie să se închidă
- tag-urile trebuie să fie îmbricate în mod corect
- un document XML are un tag rădăcină (sau top-level) și numai unul
- un tag poate avea mai multe atribute
- toate atributele sunt puse între ‘ ” ‘ sau ‘ ‘ ‘ (ghilimele sau apostrof). Acestea pot fi alternate în cadrul unui document dar nu în cadrul unui atribut
Prietenul nostru folosește următoarea structură pentru fișierele XML:
- Pe prima linie descriptorul de format :<?xml version=”1.0″?>
- Pe următoarea linie tagul root <align>
- Pe următoarele linii taguri de forma
a)
<tip_aliniere chars=nr_caractere>cuvinte</tip_aliniere>
Unde tip_aliniere poate fi : center, left, right sau justify, iar nr_caractere va fi un întreg care specifică numărul maxim de caractere dorite pe linie.
b)
<tip_aliniere>cuvinte</tip_aliniere>
În acest caz, nr_caractere se consideră 80
- Pe ultima linie tagul de închidere a tagului root : </align>
Între începutul unui rând și începutul unui tag pot exista oricâte caractere albe sau caractere tabulatoare.
Explicare aliniere
În toate exemplele de mai jos, caracterul spațiu ‘ ‘ a fost înlocuit cu caracterul ‘_’ pentru o lizibilitate mai bună. La toate tipurile de aliniere se vor păstra doar caracterele spațiu din textul original care se află între cuvintele de pe o linie.
Exemplu:
Intrare
<left chars=8>gigi are mere și ana i le cere</left>
Ieșire
gigi_are mere_și_ ana_i_le cere____
Explicație
După “are” în textul original era un spațiu, dar pentru că exact după are s-a terminat linia, linia următoare va începe exact de la mere și nu de la spațiul alb dintre are și mere. De asemenea, la toate tipurile de aliniere, pe o linie vor exista maxim nr_caractere din textul inițial, iar caracterul de pe poziția nr_caractere+1 va fi intotdeuna ‘\n’.
Left
Pe o linie vor exista x caractere, unde x<=nr_caractere din textul inițial. Următoarele nr_caractere-x vor fi spații albe.
Exemplu:
Intrare
<left chars=10>gigi are mere și ana i le cere</left>
Ieșire
gigi_are__ mere_și___ ana_i_le__ cere______
Explicație
Prima linie din textul original are 8 caractere și s-au pus în plus la final 2 caractere. A doua linie are 7 caractere și s-au pus în plus la final 3 caractere. A treia linie are 8 caractere și s-au pus în plus la final 2 caractere. Ultima linie are 4 caractere și s-au pus în plus la final 6 caractere.
Right
Pe o linie vor exista x caractere, unde x<=nr_caractere din textul inițial. Primele nr_caractere-x vor fi spații albe.
Exemplu:
Intrare
<right chars=10>gigi are mere și ana i le cere</left>
Ieșire
__gigi_are ___mere_și __ana_i_le ______cere
Explicație
Prima linie din textul original are 8 caractere și s-au pus în plus la început 2 caractere. A doua linie are 7 caractere și s-au pus în plus la început 3 caractere. A treia linie are 8 caractere și s-au pus în plus la început 2 caractere. Ultima linie are 4 caractere și s-au pus în plus la început 6 caractere.
Justify
Pe o linie vor exista x caractere, unde x<=nr_caractere din textul inițial. Caracterele albe care se vor pune în plus vor fi distribuite în mod egal între cuvintele din textul inițial.
Exemplu:
Intrare
<justify chars=10>gigi are mere și ana i le cere</justify>
Ieșire
gigi___are mere____și ana__i__le cere______
Explicație
Prima linie din textul original are 8 caractere și 2 cuvinte și s-au pus în plus între cele 2 cuvinte 2 spații. A doua linie are 7 caractere și 2 cuvinte și s-au pus în plus 2 cuvinte 3 spații. A treia linie are 8 caractere și 3 cuvinte. Între primele 2 cuvinte s-a pus un spațiu și la fel între ultimele 2 cuvinte. Ultima linie are 4 caractere și un cuvânt. După primul cuvânt s-au pus 6 spații.
Center
Pe o linie vor exista x caractere, unde x<=nr_caractere din textul inițial. Caracterele albe care se vor pune în plus vor fi distribuite astfel:
- înaintea caracterelor din textul inițial se vor pune , unde [] este parte întreagă inferioară.
- după caracterele din textul inițial se vor pune , unde [] este parte întreagă inferioară.
Exemplu:
Intrare
< center chars=10>gigi are mere și ana i le cere</center>
Ieșire
_gigi_are_ __mere_și_ _ana_i_le_ ___cere___
Explicație
Prima linie din textul original are 8 caractere și s-au pus în plus la început 1 caracter și la final 1 caracter. A doua linie are 7 caractere și s-au pus în plus la început 2 caractere și la final 1 caracter. A treia linie are 8 caractere și s-au pus în plus la început 1 caracter și la final 1 caracter. Ultima linie are 4 caractere și s-au pus în plus la început 3 caractere și la final 3 caractere.
Restricții
- Caracterele ‘ <’, ‘>’, ‘ ‘(spațiu) nu pot exista în cadrul cuvintelor.
- Cuvintele au maxim lungimea nr_caractere, astfel încât nu este necesară spargerea cuvintelor pe linii diferite.
- Între 2 cuvinte de la input există un singur caracter de tip spațiu. De asemenea nu pot exista alte caractere despărțitoare
- Pot exista oricâte cuvinte între tagurile de început de aliniere și sfârșit de aliniere.
- Într-un fișier pot exista oricâte taguri de aliniere.
- Cuvintele cheie care trebuie transformate astfel încât să fie formate doar din litere mari sunt: “for”, “while”, “default”, “switch”, “case”, “return”, “if”, “else”.
- Singura restricție de corectudine vizează chiar existența descriptorului de format. Dacă acesta există, atunci fișierul este corect, dacă acesta nu este prezent atunci se va scrie la ieșirea standard mesajul “Fisier XML incorect”.La sfârșitul mesajului trebuie să existe o linie nouă.
Exemplu
Intrare
<?xml version="1.0"?> <align> <left chars="10">gigi are mere și ana i le cere</left> <right chars="10">gigi are mere și ana i le cere</right> < center chars="10">gigi are mere și ana i le cere</center> <justify>gigi are mere și ana i le cere</justify> </align>
Ieșire
gigi_are__ mere_și___ ana_i_le__ cere______ __gigi_are ___mere_și __ana_i_le ______cere _gigi_are_ __mere_și_ _ana_i_le_ ___cere___ gigi_________are________mere________și________ana________i________le________cere
Explicații
Între începutul rândului și începutul primului tag de tip <left> există un caracter tabulator care se ignoră. Ultimul tag, de tip justify, nu are atributul “chars”, așa că nr_caractere se consideră 80. De aceea ultimul rând din output are 80 de caractere, iar caracterul de pe pozișia 81 este ‘\n’.
Autor: Octavian Rânciog
Data: 28.11.2009