際際滷

際際滷Share a Scribd company logo
Tema 2 PC - Prelucrare de fiiere HTML
                                             7.12.2012
Termen de predare: 16 decembrie 2012



Ce este HTML?
HyperText Markup Language este limbajul 樽n care sunt scrise paginile web pentru a fi afiate 樽n
browser. Elementele de sintax ale limbajului sunt reprezentate de:

       taguri: acestea se gsesc sub form de perechi (un tag de 樽nceput i unul de sf但rit - 樽n
        general), 樽ntre care avem coninutul propriu-zis. Tag-urile sunt delimitate de paranteze
        unghiulare (ex. <html> este un tag), iar tag-ul de sf但rit este marcat de prezena
        caracterului / (ex. </html> perechea lui).Exist 樽ns i elemente care nu au un tag
        separat de final, precum: img, input, br, hr (ex. <br />).
        Ex:
        <body>
              <img src=/AndreeaDusk/tema2-pc2012-v2/"smiley.gif" alt="Smiley face" height="42" width="42" />
              <br />
              <hr />
              <input type="reset" value="reset" />
              <p>Acesta este un paragraf.</p>
        </body>

     atribute: sunt definite 樽n interiorul tag-urilor i reprezint proprietile pe care le poate
      avea un element.
      Ex: <input type="submit" value="Trimite" />

     valori: reprezint valorile pe care le au atributele. Acestea sunt cuprinse 樽ntre ghilimele
      i urmeaz imediat dup numele atributului
      Ex: <input type="submit" value="Trimite" />

Numele tagurilor i a atributelor sunt scrise cu litere mici.

Mai multe detallii despre HTML gsii la urmtoarele link-uri:
      Ce este HTML?
      Sintaxa HTML
      Tutorial HTML
      Exemple HTML

n ciuda acestor specificaii, limbajul HTML nu este unul strict, de aceea este posibil s 樽nt但lnim
documente HTML care nu sunt bine formate (well-formed element).


                                                                                                 1
Pentru a fi mai lizibil codul, documentele HTML sunt indentate (la fiecare nou nivel de imbricare,
cresc但nd numrul de taburi).

Scopul acestei teme este de a transforma un document HTML astfel 樽nc但t s fie bine-format i
s fie indentat corect.


Cerine:

Fiierul surs se va numi formatHTML.c i va primi ca parametri 樽n linie de comand numele
fiierelor de intrare i de ieire.

Ex. de rulare:
       ./formatHTML test1_in.html test1_out.html

Va primi un singur fiier de intrare i un singur fiier de ieire.
Pentru a citi/scrie din/樽n fiier vei folosi instruciunea freopen sau lucrul cu fisiere text (fopen,
etc.)
OBSERVATII:
1. Sirul in care se va citi continutul fisierului va fi alocat si realocat dinamic! Alocare initiala 300,
apoi se va realoca exact atat cat este nevoie pentru a memora sirul curent!
2. Lungimea maxima a unei linii din fisier este 300!

Etapa I. Indentarea documentului HTML

(20p) I.1.Fiecare tag, textul coninut 樽ntre dou tag-uri i respectiv comentariile se vor gsi pe
cate o linie nou.

(20p) I.2.Nu trebuie s existe 樽n textul dintre taguri caractere whitespace (  , t, n, r ) la
樽nceput (leading whitespaces) sau la sf但rit (trailing whitespaces):
                <tag>__text__</tag>
        va fi modificat 樽n
                <tag>text</tag>
        (caracterul _ reprezint caracterul spaiu  ).

(20p) I.3. Elementele din pagin vor fi indentate astfel 樽nc但t la fiecare nivel de imbricare acestea
s se gseasc cu un tab mai la dreapta. Dimensiunea tabului va fi de 4 caractere.

Comentariile se vor indenta la fel ca restul coninutului de la acelai nivel.

Etapa II. Fiierul de intrare HTML trebuie prelucrat astfel 樽nc但t s respecte specificaiile HTML,
s fie bine format.




                                                                                                            2
(20p) II.1. Valorile atributelor trebuie s fie cuprinse 樽ntre ghilimele. Verificai dac valorile
atributelor sunt 樽ncadrate corespunztor, 樽n caz contrar 樽nchidei-le corect.
Valoarea unui atribut este formata dintr-un singur cuvant delimitat de white-spaces. Se
garanteaza faptul ca dupa o valoare de atribut va urma un spatiu, inclusiv daca este ultima
valoare din tag.

Exemplu:

        Greit: <input type=submit value="Trimite />
        Greit: <input type="submit value=Trimite" />
        Corect: <input type="submit" value="Trimite" />



(20p) II.2. Trebuie s verificai dac tag-urile sunt 樽nchise corect. n cazul 樽n care lipsete un tag
de final, atunci va trebui s 樽l adugai voi. Se garanteaz faptul c tagurile nu sunt imbricate
greit (adica, un tag copil nu este inchis dupa parintele sau in fisierul de intrare). Daca un tag
self-closing nu are caracterul / inainte de >, atunci trebuie sa-l adaugati.
Ex: <img src=/AndreeaDusk/tema2-pc2012-v2/o_cale >
     va trebui modificat 樽n
    <img src=/AndreeaDusk/tema2-pc2012-v2/o_cale />

Precizari:
        -樽n interiorul tagurilor nu apar caracterele < i >; de asemenea nici 樽n textul imbricat
       樽ntr-un tag
        - fiierele de input nu vor conine javascript i nici CSS. Pot, cel mult, s existe linkuri
       ctre fisiere externe de CSS (ex: <link rel="stylesheet" type="text/css" href="/
       css/plweb.css">) i atribute style 樽n interiorul tagurilor
        - tagul <html> este tagul rdcin al 樽ntregului document si este exista sigur in fisier
        - tagurile <body> i <head> se gsesc 樽n interiorul tag-ului <html>. A se vedea structura
unui fisier html de la exemple
        - un tag <h1>/.../<h6> nu include 樽n interior alte taguri <h1>...<h6>, <p>, <div>
        - un tag <p> nu include un tag <div>
        - nu tratm cazul listelor/tabelelor imbricate 樽n cadrul acestui exerciiu
        - 2 tag-uri identice(despre care nu am menionat nimic p但n acum) nu se pot cuprinde
reciproc, cu excepia tag-ului div
        - Un tag care nu a fost 樽nchis conform niciunei specificaii anterioare, va fi 樽nchis exact
樽nainte s se 樽nchid tagul printelui su.
Atenie la tagurile: br, hr, img, input care nu se gsesc 樽n perechi!

Putem avea:
<div>
        <div>
                Corect: Div imbricat 1
                <p>



                                                                                                    3
Paragraf
                </p>
        </div>
        <div>
                Corect: Div imbricat 2
        </div>
</div>
Sau:
<ol>
        <li>
                Hello from WebCodeGuide
        </li>
        <li>
                Nice list!
        </li>
        <li>
                Last list item!
        </li>
</ol>

ns nu putem avea:
<p>
        Paragraf
        <p>
              Incorect: paragraf imbricat
        </p>
</p>



Hint: pentru a ine evidena tagurilor deschise si 樽nchise putei folosi un vector care va avea
rolul unei stive. O stiv funcioneaz dup principiul Last In First Out (LIFO).

III. Bonus 1
      (5p) Toate whitespace-urile din textul dintre dou tag-uri vor fi transformate 樽n caracterul
        spaiu  :
                <tag>text_doartcunspatii</tag>
        va fi modificat 樽n
                <tag>text_doar_cu_spatii</tag>
      (5p) Mai multe whitespace-uri consecutive vor fi reduse la un singur caracter  :
                <tag>un_nntext___cantexemplu</tag>
        va fi modificat 樽n
                <tag>un_text_ca_exemplu</tag>
       (5p) Dac 樽n final rezult o linie goal (textul coninea doar caractere whitespace), nu
        este scris nimic 樽n fiierul de ieire.
       (5p) Eliminai din tag-uri doar whitespace-urile care se afl dup caracterul < sau
        樽nainte de caracterul >:
                <ntag atribut=valoare_>


                                                                                                 4
trebuie modificat 樽n
               <tag atribut=valoare>

Exemple:
1. Input
       <div>n
       </div>

! Oservai linia goal i whitespace-ul.

  Output corect
       <div>
       </div>

  Output greit
       <div>
               n
       </div>

2. Input
       <div>n
       n
       _un__text__</div>

! Caracterul _ reprezint un spaiu.

   Output corect
      <div>
             un_text
      </div>

Bonus 2(10p):
     ntre numele tag-ului i primul atribut, sau 樽ntre perechile atribut=valoare, trebuie s
       existe un singur caracter spaiu:
               <tag__atribut1=valoare1natribut2=valoare2>
       trebuie modificat 樽n
               <tag_atribut1=valoare1_atribut2=valoare2>
       ! Caracterul _ reprezint un spaiu.
     nainte de caracterul / trebuie s existe un singur caracter spaiu:
               <tag/>
       va trebui modificat 樽n
               <tag_/>
Bonus 3(5p):
Toate tagurile i atributele acestora vor fi scrise cu litere mici, cu excepia directivei de
樽nceput(<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">), care se gaseste pe prima linie a



                                                                                              5
fisierului.

Coninutul propriu-zis al tagurilor va fi lsat neschimbat, la fel si coninutul comentariilor.
Un comentariu se gsete 樽ntre semnele <!-- i -->. Comentariile HTML nu pot fi imbricate.



Precizri:

      Sursa se va numi formatHTML.c. Eventual, dac v e mai uor aa, pute釘i implementa
       segmente de program i 樽n alte fiiere C pe care le ve釘i include de asemenea 樽n arhiv,
       dar trebuie s specifica釘i acest lucru 樽n readme!
     ATENIE! Prelucrrile asupra stringurilor se vor face cu funcii din biblioteca
       string.h, cat de mult posibil, nu caracter cu caracter.
     Tema va con釘ine i un fiier Makefile 樽n care ve釘i introduce dou op釘iuni: build, care
       compileaz sursa i creaz executabilul i clean care terge fiierul executabil, i
       fiierele cu extensia *.html din directorul curent.
     Executabilul creat de comanda make build (definit 樽n Makefile) trebuie s se
       numeasc formatHTML!
      Ve釘i trimite o arhiv zip cu numele grupa_nume_prenume.zip (exemplu
       313CC_Popescu_Maria.zip) care va con釘ine
             fiierul formatHTML.c, iar dac este cazul, i alte fiiere C scrise de voi care
                sunt incluse 樽n formatHTML.c
             un fiier readme, 樽n care specificai cerin釘ele pe care le rezolv aplica釘ia i
                precizri de implementare acolo unde este cazul
             fiierul Makefile
             un fiier text feedback.txt in care trece釘i gradul de dificultate al temei, timpul
                alocat rezovrii i eventualele comentarii, dac este cazul.
     Aten釘ie la sintaxa de C! Nu folosi釘i func釘ii C++ sau alte construc釘ii specifice C++.
     Sursele vor fi compilate sub Linux, cu gcc.
     Nu uita釘i s elibera釘i memoria de care nu mai ave釘i memorie cu func釘ia free()! Ve釘i fi
       depuncta釘i 10p dac programul scris de voi are pierderi de memorie (numite i memory
       leaks), adic dac uita釘i s dezaloca釘i memoria alocat 樽n program. (Un program care
       are pierderi de memorie va umple 樽ncet-樽ncet 樽ntreg spa釘iul de memorie RAM pe care 樽l
       are la dispozi釘ie, va 樽ngreuna sistemul i 樽n cele din urm se va bloca). Pentru a v testa
       programul ca s fi釘i siguri c nu are pierderi de memorie 樽n Linux pute釘i folosi un utilitar
       numit Valgrind (instruc釘iuni de folosire se gsesc mai jos).
     Putei rezolva exerciiile 樽n ce ordine preferai voi.




Transmiterea de argumente 樽n linia de comand




                                                                                                  6
Programul scris de voi trebuie s poat fi folosit 樽n consol pentru a formata fiiere html.
Pentru aceasta, el va trebui s poat primi diveri parametri 樽n linia de comand. Un program
scris 樽n C poate accepta parametri din linia de comand prin modificarea sintaxei func釘iei main
astfel 樽nc但t aceasta s primeasc parametrii respectivi. Deoarece numrul de parametri care
vor fi transmii nu este cunocut dinainte (ne putem imagina, de exemplu, c un utilizator 樽n
necunotin釘 de cauz poate furniza orice op釘iuni programului), func釘ia main va accepta dou
argumente, dup cum urmeaz:

     argc de tip int reprezint numrul de argumente transmis programului din consol.
      Aten釘ie! Primul argument este 樽ntotdeauna numele fiierului executabil care este rulat.
      De aceea, argumentele propriu-zise sunt 樽n numr de argc-1.

     char *argv[] reprezint un ir de pointeri la caractere (stringuri) care constituie
        argumentele efective transmise programului. Dup cum am spus anterior, argv[0]
        reprezint numele executabilului rulat, deci parametrii propriu-zii 樽ncep de la elementul
        de pe pozi釘ia 1 i sunt mereu de tip iruri de caractere!
        Pentru a clarifica sintaxa, iat un exemplu de program care afieaz to釘i parametrii pe
care i-a primit 樽n linia de comand.

# include <stdio.h>
int main(int argc, char *argv[])
{
        printf("Numele executabilului rulat: %sn", argv[0]);
        printf("Numarul de parametri propriu-zisi: %dn", argc - 1);

       int i;
       for (i=1; i <= argc-1; i++)
               printf("Parametru cu numarul %d este: %sn", i, argv[i]);

       fflush(stdin);
       getchar();
       return 0;
}

      Copia釘i executabilul de mai sus 樽ntr-un fiier C i compila釘i-l folosind urmtoarele
comenzi:

       gcc fisier_sursa.c -o executabil1
       gcc fisier_sursa.c -o executabil2

Rula釘i pe r但nd urmtoarele comenzi i observa釘i func釘ionalitatea programului.

       ./executabil1 -optiune1 valoptiune1 -optiune2 valoptiune2
       ./executabil2 -optiune val1,val2,val3



                                                                                                   7
./executabil1 -optiune val1, val2, val3
        ./executabil1 -optiune val1 val2 val3
        ./executabil2 orice string este considerat dr3pt 4r9Um3n7
        ./executabil1 numerele 2 si 3 sunt considerate tot stringuri




GDB
GDB(The GNU Project Debugger) este un utilitar 樽n linie de comand pentru detectarea
problemelor care se produc 樽n timpul execuiei unui program. Un tutorial despre cum se
folosete gsii aici.




Valgrind
Valgrind este un instrument de debugging pentru Linux folosit pentru depistarea greelilor de
utilizare a memoriei: memory leak-uri, pointeri invalizi, folosirea unor variabile neiniializate, free-
uri invalide.
Pentru a folosi valgrind va trebui s instalai pachetul valgrind. De exemplu, pe distribuia
Ubuntu:
apt-get install valgrind
Pentru a rula programul 樽n Valgrind cu tool-ul pentru memcheck folosii:
valgrind --tool=memcheck ./formaHTML test_in.html test_out.html
Pentru afiare leak-urilor detaliat:
valgrind --tool=memcheck --leak-check=full ./formatHTML test_in.html
test_out.html




                                                                                                      8

More Related Content

Viewers also liked (13)

Short introduction to DRAFTFCB
Short introduction to DRAFTFCB Short introduction to DRAFTFCB
Short introduction to DRAFTFCB
DRAFTFCB MOSCOW
Web site changes
Web site changesWeb site changes
Web site changes
Goodwill/Easter Seals Minnesota
Corriere dell'universit job ottobre 2010
Corriere dell'universit job   ottobre 2010Corriere dell'universit job   ottobre 2010
Corriere dell'universit job ottobre 2010
Pasquale M
Midterms proj mr
Midterms proj mrMidterms proj mr
Midterms proj mr
Ladie Velasco
Jopr29
Jopr29Jopr29
Jopr29
Vivek 09885584163
Test
TestTest
Test
Thibaut Briere
Presentation vinod10.
Presentation vinod10.Presentation vinod10.
Presentation vinod10.
Vinodtejal
Dream act rumman
Dream act rummanDream act rumman
Dream act rumman
rhaq92
IssIss
Iss
jgvomnia
CPA presentation
CPA presentationCPA presentation
CPA presentation
Ellipsis Partners
Young People, New Media and Museum Learning: Breakout Session at #gem2011
Young People, New Media and Museum Learning: Breakout Session at #gem2011Young People, New Media and Museum Learning: Breakout Session at #gem2011
Young People, New Media and Museum Learning: Breakout Session at #gem2011
Nick Sherrard
RoR app for dummies
RoR app for dummiesRoR app for dummies
RoR app for dummies
Ashish Sharma
TICUA Chief Student Affairs Officers Meeting 2010
TICUA Chief Student Affairs Officers Meeting 2010TICUA Chief Student Affairs Officers Meeting 2010
TICUA Chief Student Affairs Officers Meeting 2010
KevinRDavis
Short introduction to DRAFTFCB
Short introduction to DRAFTFCB Short introduction to DRAFTFCB
Short introduction to DRAFTFCB
DRAFTFCB MOSCOW
Corriere dell'universit job ottobre 2010
Corriere dell'universit job   ottobre 2010Corriere dell'universit job   ottobre 2010
Corriere dell'universit job ottobre 2010
Pasquale M
Presentation vinod10.
Presentation vinod10.Presentation vinod10.
Presentation vinod10.
Vinodtejal
Dream act rumman
Dream act rummanDream act rumman
Dream act rumman
rhaq92
IssIss
Iss
jgvomnia
Young People, New Media and Museum Learning: Breakout Session at #gem2011
Young People, New Media and Museum Learning: Breakout Session at #gem2011Young People, New Media and Museum Learning: Breakout Session at #gem2011
Young People, New Media and Museum Learning: Breakout Session at #gem2011
Nick Sherrard
RoR app for dummies
RoR app for dummiesRoR app for dummies
RoR app for dummies
Ashish Sharma
TICUA Chief Student Affairs Officers Meeting 2010
TICUA Chief Student Affairs Officers Meeting 2010TICUA Chief Student Affairs Officers Meeting 2010
TICUA Chief Student Affairs Officers Meeting 2010
KevinRDavis

Similar to Tema2 pc2012 v2 (9)

Perechea_1 ro.pdf
Perechea_1 ro.pdfPerechea_1 ro.pdf
Perechea_1 ro.pdf
OxanaRabei1
Html
HtmlHtml
Html
ahaller
Info an 2 introducere in html
Info an 2  introducere in htmlInfo an 2  introducere in html
Info an 2 introducere in html
AndreiEduard
0html introducere
0html introducere0html introducere
0html introducere
Sima Sorin
Mandache Sorin
Mandache SorinMandache Sorin
Mandache Sorin
sorinmandache
Structura unei pagini web
Structura unei pagini webStructura unei pagini web
Structura unei pagini web
cttauto
Mandache sorin
Mandache sorinMandache sorin
Mandache sorin
sorinmandache
Perechea_1 ro.pdf
Perechea_1 ro.pdfPerechea_1 ro.pdf
Perechea_1 ro.pdf
OxanaRabei1
Info an 2 introducere in html
Info an 2  introducere in htmlInfo an 2  introducere in html
Info an 2 introducere in html
AndreiEduard
0html introducere
0html introducere0html introducere
0html introducere
Sima Sorin
Structura unei pagini web
Structura unei pagini webStructura unei pagini web
Structura unei pagini web
cttauto

Tema2 pc2012 v2

  • 1. Tema 2 PC - Prelucrare de fiiere HTML 7.12.2012 Termen de predare: 16 decembrie 2012 Ce este HTML? HyperText Markup Language este limbajul 樽n care sunt scrise paginile web pentru a fi afiate 樽n browser. Elementele de sintax ale limbajului sunt reprezentate de: taguri: acestea se gsesc sub form de perechi (un tag de 樽nceput i unul de sf但rit - 樽n general), 樽ntre care avem coninutul propriu-zis. Tag-urile sunt delimitate de paranteze unghiulare (ex. <html> este un tag), iar tag-ul de sf但rit este marcat de prezena caracterului / (ex. </html> perechea lui).Exist 樽ns i elemente care nu au un tag separat de final, precum: img, input, br, hr (ex. <br />). Ex: <body> <img src=/AndreeaDusk/tema2-pc2012-v2/"smiley.gif" alt="Smiley face" height="42" width="42" /> <br /> <hr /> <input type="reset" value="reset" /> <p>Acesta este un paragraf.</p> </body> atribute: sunt definite 樽n interiorul tag-urilor i reprezint proprietile pe care le poate avea un element. Ex: <input type="submit" value="Trimite" /> valori: reprezint valorile pe care le au atributele. Acestea sunt cuprinse 樽ntre ghilimele i urmeaz imediat dup numele atributului Ex: <input type="submit" value="Trimite" /> Numele tagurilor i a atributelor sunt scrise cu litere mici. Mai multe detallii despre HTML gsii la urmtoarele link-uri: Ce este HTML? Sintaxa HTML Tutorial HTML Exemple HTML n ciuda acestor specificaii, limbajul HTML nu este unul strict, de aceea este posibil s 樽nt但lnim documente HTML care nu sunt bine formate (well-formed element). 1
  • 2. Pentru a fi mai lizibil codul, documentele HTML sunt indentate (la fiecare nou nivel de imbricare, cresc但nd numrul de taburi). Scopul acestei teme este de a transforma un document HTML astfel 樽nc但t s fie bine-format i s fie indentat corect. Cerine: Fiierul surs se va numi formatHTML.c i va primi ca parametri 樽n linie de comand numele fiierelor de intrare i de ieire. Ex. de rulare: ./formatHTML test1_in.html test1_out.html Va primi un singur fiier de intrare i un singur fiier de ieire. Pentru a citi/scrie din/樽n fiier vei folosi instruciunea freopen sau lucrul cu fisiere text (fopen, etc.) OBSERVATII: 1. Sirul in care se va citi continutul fisierului va fi alocat si realocat dinamic! Alocare initiala 300, apoi se va realoca exact atat cat este nevoie pentru a memora sirul curent! 2. Lungimea maxima a unei linii din fisier este 300! Etapa I. Indentarea documentului HTML (20p) I.1.Fiecare tag, textul coninut 樽ntre dou tag-uri i respectiv comentariile se vor gsi pe cate o linie nou. (20p) I.2.Nu trebuie s existe 樽n textul dintre taguri caractere whitespace ( , t, n, r ) la 樽nceput (leading whitespaces) sau la sf但rit (trailing whitespaces): <tag>__text__</tag> va fi modificat 樽n <tag>text</tag> (caracterul _ reprezint caracterul spaiu ). (20p) I.3. Elementele din pagin vor fi indentate astfel 樽nc但t la fiecare nivel de imbricare acestea s se gseasc cu un tab mai la dreapta. Dimensiunea tabului va fi de 4 caractere. Comentariile se vor indenta la fel ca restul coninutului de la acelai nivel. Etapa II. Fiierul de intrare HTML trebuie prelucrat astfel 樽nc但t s respecte specificaiile HTML, s fie bine format. 2
  • 3. (20p) II.1. Valorile atributelor trebuie s fie cuprinse 樽ntre ghilimele. Verificai dac valorile atributelor sunt 樽ncadrate corespunztor, 樽n caz contrar 樽nchidei-le corect. Valoarea unui atribut este formata dintr-un singur cuvant delimitat de white-spaces. Se garanteaza faptul ca dupa o valoare de atribut va urma un spatiu, inclusiv daca este ultima valoare din tag. Exemplu: Greit: <input type=submit value="Trimite /> Greit: <input type="submit value=Trimite" /> Corect: <input type="submit" value="Trimite" /> (20p) II.2. Trebuie s verificai dac tag-urile sunt 樽nchise corect. n cazul 樽n care lipsete un tag de final, atunci va trebui s 樽l adugai voi. Se garanteaz faptul c tagurile nu sunt imbricate greit (adica, un tag copil nu este inchis dupa parintele sau in fisierul de intrare). Daca un tag self-closing nu are caracterul / inainte de >, atunci trebuie sa-l adaugati. Ex: <img src=/AndreeaDusk/tema2-pc2012-v2/o_cale > va trebui modificat 樽n <img src=/AndreeaDusk/tema2-pc2012-v2/o_cale /> Precizari: -樽n interiorul tagurilor nu apar caracterele < i >; de asemenea nici 樽n textul imbricat 樽ntr-un tag - fiierele de input nu vor conine javascript i nici CSS. Pot, cel mult, s existe linkuri ctre fisiere externe de CSS (ex: <link rel="stylesheet" type="text/css" href="/ css/plweb.css">) i atribute style 樽n interiorul tagurilor - tagul <html> este tagul rdcin al 樽ntregului document si este exista sigur in fisier - tagurile <body> i <head> se gsesc 樽n interiorul tag-ului <html>. A se vedea structura unui fisier html de la exemple - un tag <h1>/.../<h6> nu include 樽n interior alte taguri <h1>...<h6>, <p>, <div> - un tag <p> nu include un tag <div> - nu tratm cazul listelor/tabelelor imbricate 樽n cadrul acestui exerciiu - 2 tag-uri identice(despre care nu am menionat nimic p但n acum) nu se pot cuprinde reciproc, cu excepia tag-ului div - Un tag care nu a fost 樽nchis conform niciunei specificaii anterioare, va fi 樽nchis exact 樽nainte s se 樽nchid tagul printelui su. Atenie la tagurile: br, hr, img, input care nu se gsesc 樽n perechi! Putem avea: <div> <div> Corect: Div imbricat 1 <p> 3
  • 4. Paragraf </p> </div> <div> Corect: Div imbricat 2 </div> </div> Sau: <ol> <li> Hello from WebCodeGuide </li> <li> Nice list! </li> <li> Last list item! </li> </ol> ns nu putem avea: <p> Paragraf <p> Incorect: paragraf imbricat </p> </p> Hint: pentru a ine evidena tagurilor deschise si 樽nchise putei folosi un vector care va avea rolul unei stive. O stiv funcioneaz dup principiul Last In First Out (LIFO). III. Bonus 1 (5p) Toate whitespace-urile din textul dintre dou tag-uri vor fi transformate 樽n caracterul spaiu : <tag>text_doartcunspatii</tag> va fi modificat 樽n <tag>text_doar_cu_spatii</tag> (5p) Mai multe whitespace-uri consecutive vor fi reduse la un singur caracter : <tag>un_nntext___cantexemplu</tag> va fi modificat 樽n <tag>un_text_ca_exemplu</tag> (5p) Dac 樽n final rezult o linie goal (textul coninea doar caractere whitespace), nu este scris nimic 樽n fiierul de ieire. (5p) Eliminai din tag-uri doar whitespace-urile care se afl dup caracterul < sau 樽nainte de caracterul >: <ntag atribut=valoare_> 4
  • 5. trebuie modificat 樽n <tag atribut=valoare> Exemple: 1. Input <div>n </div> ! Oservai linia goal i whitespace-ul. Output corect <div> </div> Output greit <div> n </div> 2. Input <div>n n _un__text__</div> ! Caracterul _ reprezint un spaiu. Output corect <div> un_text </div> Bonus 2(10p): ntre numele tag-ului i primul atribut, sau 樽ntre perechile atribut=valoare, trebuie s existe un singur caracter spaiu: <tag__atribut1=valoare1natribut2=valoare2> trebuie modificat 樽n <tag_atribut1=valoare1_atribut2=valoare2> ! Caracterul _ reprezint un spaiu. nainte de caracterul / trebuie s existe un singur caracter spaiu: <tag/> va trebui modificat 樽n <tag_/> Bonus 3(5p): Toate tagurile i atributele acestora vor fi scrise cu litere mici, cu excepia directivei de 樽nceput(<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">), care se gaseste pe prima linie a 5
  • 6. fisierului. Coninutul propriu-zis al tagurilor va fi lsat neschimbat, la fel si coninutul comentariilor. Un comentariu se gsete 樽ntre semnele <!-- i -->. Comentariile HTML nu pot fi imbricate. Precizri: Sursa se va numi formatHTML.c. Eventual, dac v e mai uor aa, pute釘i implementa segmente de program i 樽n alte fiiere C pe care le ve釘i include de asemenea 樽n arhiv, dar trebuie s specifica釘i acest lucru 樽n readme! ATENIE! Prelucrrile asupra stringurilor se vor face cu funcii din biblioteca string.h, cat de mult posibil, nu caracter cu caracter. Tema va con釘ine i un fiier Makefile 樽n care ve釘i introduce dou op釘iuni: build, care compileaz sursa i creaz executabilul i clean care terge fiierul executabil, i fiierele cu extensia *.html din directorul curent. Executabilul creat de comanda make build (definit 樽n Makefile) trebuie s se numeasc formatHTML! Ve釘i trimite o arhiv zip cu numele grupa_nume_prenume.zip (exemplu 313CC_Popescu_Maria.zip) care va con釘ine fiierul formatHTML.c, iar dac este cazul, i alte fiiere C scrise de voi care sunt incluse 樽n formatHTML.c un fiier readme, 樽n care specificai cerin釘ele pe care le rezolv aplica釘ia i precizri de implementare acolo unde este cazul fiierul Makefile un fiier text feedback.txt in care trece釘i gradul de dificultate al temei, timpul alocat rezovrii i eventualele comentarii, dac este cazul. Aten釘ie la sintaxa de C! Nu folosi釘i func釘ii C++ sau alte construc釘ii specifice C++. Sursele vor fi compilate sub Linux, cu gcc. Nu uita釘i s elibera釘i memoria de care nu mai ave釘i memorie cu func釘ia free()! Ve釘i fi depuncta釘i 10p dac programul scris de voi are pierderi de memorie (numite i memory leaks), adic dac uita釘i s dezaloca釘i memoria alocat 樽n program. (Un program care are pierderi de memorie va umple 樽ncet-樽ncet 樽ntreg spa釘iul de memorie RAM pe care 樽l are la dispozi釘ie, va 樽ngreuna sistemul i 樽n cele din urm se va bloca). Pentru a v testa programul ca s fi釘i siguri c nu are pierderi de memorie 樽n Linux pute釘i folosi un utilitar numit Valgrind (instruc釘iuni de folosire se gsesc mai jos). Putei rezolva exerciiile 樽n ce ordine preferai voi. Transmiterea de argumente 樽n linia de comand 6
  • 7. Programul scris de voi trebuie s poat fi folosit 樽n consol pentru a formata fiiere html. Pentru aceasta, el va trebui s poat primi diveri parametri 樽n linia de comand. Un program scris 樽n C poate accepta parametri din linia de comand prin modificarea sintaxei func釘iei main astfel 樽nc但t aceasta s primeasc parametrii respectivi. Deoarece numrul de parametri care vor fi transmii nu este cunocut dinainte (ne putem imagina, de exemplu, c un utilizator 樽n necunotin釘 de cauz poate furniza orice op釘iuni programului), func釘ia main va accepta dou argumente, dup cum urmeaz: argc de tip int reprezint numrul de argumente transmis programului din consol. Aten釘ie! Primul argument este 樽ntotdeauna numele fiierului executabil care este rulat. De aceea, argumentele propriu-zise sunt 樽n numr de argc-1. char *argv[] reprezint un ir de pointeri la caractere (stringuri) care constituie argumentele efective transmise programului. Dup cum am spus anterior, argv[0] reprezint numele executabilului rulat, deci parametrii propriu-zii 樽ncep de la elementul de pe pozi釘ia 1 i sunt mereu de tip iruri de caractere! Pentru a clarifica sintaxa, iat un exemplu de program care afieaz to釘i parametrii pe care i-a primit 樽n linia de comand. # include <stdio.h> int main(int argc, char *argv[]) { printf("Numele executabilului rulat: %sn", argv[0]); printf("Numarul de parametri propriu-zisi: %dn", argc - 1); int i; for (i=1; i <= argc-1; i++) printf("Parametru cu numarul %d este: %sn", i, argv[i]); fflush(stdin); getchar(); return 0; } Copia釘i executabilul de mai sus 樽ntr-un fiier C i compila釘i-l folosind urmtoarele comenzi: gcc fisier_sursa.c -o executabil1 gcc fisier_sursa.c -o executabil2 Rula釘i pe r但nd urmtoarele comenzi i observa釘i func釘ionalitatea programului. ./executabil1 -optiune1 valoptiune1 -optiune2 valoptiune2 ./executabil2 -optiune val1,val2,val3 7
  • 8. ./executabil1 -optiune val1, val2, val3 ./executabil1 -optiune val1 val2 val3 ./executabil2 orice string este considerat dr3pt 4r9Um3n7 ./executabil1 numerele 2 si 3 sunt considerate tot stringuri GDB GDB(The GNU Project Debugger) este un utilitar 樽n linie de comand pentru detectarea problemelor care se produc 樽n timpul execuiei unui program. Un tutorial despre cum se folosete gsii aici. Valgrind Valgrind este un instrument de debugging pentru Linux folosit pentru depistarea greelilor de utilizare a memoriei: memory leak-uri, pointeri invalizi, folosirea unor variabile neiniializate, free- uri invalide. Pentru a folosi valgrind va trebui s instalai pachetul valgrind. De exemplu, pe distribuia Ubuntu: apt-get install valgrind Pentru a rula programul 樽n Valgrind cu tool-ul pentru memcheck folosii: valgrind --tool=memcheck ./formaHTML test_in.html test_out.html Pentru afiare leak-urilor detaliat: valgrind --tool=memcheck --leak-check=full ./formatHTML test_in.html test_out.html 8