CompleteTextAligner

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:

  1. Pe prima linie descriptorul de format :<?xml version=”1.0″?>
  2. Pe următoarea linie tagul root <align>
  3. 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

  1. 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 [\frac{nr\_caractere-x}{2} ]+(nr\_caractere-x)%2, unde [] este parte întreagă inferioară.
  • după caracterele din textul inițial se vor pune [\frac{nr\_caractere-x}{2}], 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