Zadaci iz Osnova programiranja

3. tok - Duško Vitas

1. GRUPA ZADATAKA - karakterski skupovi: (1), (2), (4), (5)

2. GRUPA ZADATAKA - analiza etiketa: (3), (6), (7), (8), (9), (10)

3. GRUPA ZADATAKA - formati teksta: (12)

4. GRUPA ZADATAKA - prirodno-jezička svojstva: (7), (11)

5. GRUPA ZADATAKA - povezivanje tekstova: (13), (14), (15)


RASPODELA ZADATAKA JE ZAVRŠENA ZA ŠKOLSKU 2000/01.



Napomene

[1] Zajednička pretpostavka za zadatke iz ove grupe je da se imena ulazne i izlazne datoteke saopštavaju preusmeravanjem preko karakterske struje (engl. stream). Na primer, program čije je ime PROGRAM, koji analizira ulaznu datoteku PODACI, a rezultate upisuje u datoteku IZLAZ poziva se iz komandne linije na sledeći način:

C:> PROGRAM <PODACI >IZLAZ

[2] U sastavljanju teksta programa koristiti samo zaglavlje <stdio.h>. Sve ostale funkcije moraju biti napisane, oslanjajući se na gradivo iz 1. semestra.


  1. [a] Analizom Uputstva za obeležavanje tekstova koje je korišćeno za etiketiranje u 1. seminarskom radu, opisati sledeće azbuke S koje su upotrebljene u tekstu:

    • A1: azbuka dozvoljenih kontrolnih i grafičkih karaktera;
    • A2: azbuka dozvoljenih etiketa ograđenih zagradama < i >. Razdvojiti prazne etikete od nepraznih (Napomena: Pod praznom etiketom se podrazumeva etiketa koja ne mora biti zatvorena (kao što je npr. <BR>)
    • A3: azbuka atributa ograđenih zagradama [ i ];
    • A4: azbuka specijalnih karaktera ograđenih karakterima & i ; (npr. &emdash; ili &cy;)
    • A5: azbuka posebnih etiketa u komentarima (komentari iz zaglavlja i komentari za obeležavanje strane).

    [b] Opisati na podesan način svaku od ovih azbuka u HTML-u (kao skup tabela A1 - A5; kod tabele A1 navesti glif i njemu pridruženu vrednost u dekadnom i heksadecimalnom brojnom sistemu).

    [c] Za svaku od tabela sastaviti datoteku koja se sastoji od rezultata analize. Datoteka A1 treba da se sastoji od dozvoljenih karaketra u rastućem poretku ASCII-kolacione sekvencije ispisanih jedan za drugim. Datoteke A2 - A5 treba da sadrže etikete, svaka etiketa u zasebnom redu bez zagrada uređene u u rastućem poretku ASCII-kolacione sekvencije. Datoteku A2 razložiti i na datoteke A21 (složene etikete) i A22 (proste etikete). Datoteka A3 (dopušteni atributi) u svakom redu sadrži prvo atribut, a za njim odvojene tabulatorom etikete u kojima se javlja ovaj atribut.

    [d] Sa HTML-strane koja opisuje etikete, napraviti hiper-veze na datoteke A1 do A5 (omogućiti download)

    (dva studenta - datum objavljivanja: 30.01.2001.)




  2. Sastaviti u jeziku C sledeće funkcije:

    • funkcija sa imenom VadiRed (prototip char *VadiRed( void )) koja iz ulazne struje učitava red (red je ograničen Uputstvom na najviše sedamdeset karaktera). Povratna vrednost funkcije je niska koja sadrži pročitani red. Karakteri koji obeležavaju kraj reda mogu biti ili konstanta '\n' (kombinacija karaktera CR+LF) ili etikete <BR> ili </BR>.

      U slučaju da je red predugačak, funkcija treba samo jednom da javi poruku o grešci koju ispisuje preko stderr. Poruka treba da je oblika "Predugacak red n: niska" gde je n broj reda, a niska prva reč u redu. U takvom slučaju "preseći" red na prvom separatoru pre sedamdesetog karaktera, vratiti pročitani red, a sačuvati poziciju do koje se došlo u čitanju ulazne datoteke (razmotriti deklaraciju static). Niska koju funkcija vraća se završava sa '\0'.

      Funkcija treba da nastavi sa radom prilikom sledećeg poziva od pozicije u ulaznoj datoteci na kojoj je red bio prekinut.

    • funkcija sa imenom Kodovi (void Kodovi( char *red, int n[])) koja kao ulazni argument prima nisku red iz funkcije VadiRed, a u nizu n vraća broj različitih upotrebljenih karaktera u redu (Voditi računa da karakteri mogu biti između 0 i 255).

    • funkcija main, koja koristeći funkcije VadiRed i Kodovi, formira matricu mat[256][3] gde je za karakter i Î[0,255], mat[i][1] = broju pojavljivanja karaktera i u ulaznom tekstu.

      Vrednost mat[i][2] se popunjava na osnovu analize upotrebe karaktera iz 1. zadatka i imaće vrednosti:

             0, ako karakter i nije dozvoljen; 
            -1, ako je karakter i dozvoljen, ali "sumnjiv" 
               (npr. više otvorenih nego zatvorenih zagrada, i sl.); 
             1, ako je karakter i dozvoljen (bez ograničenja na način
                upotrebe, npr. alfabetski karakteri)
      

      Pretpostavke o izboru "sumnjivih" karaktera obuhvataju samo nužne veze koje proističu iz Uputstva (npr. mat[&][2] <= mat[;][2], itd). Ove pretpostavke se ne moraju iscrpno navesti! Kao vrednost mat[i][3] upisuje se kod uslova koji je određeni karakter načinio "sumnjivim". Uslove formirati samo na osnovu frekvencije pojedinačnih karaktera, ne ispitujući da li je "sumnja" opravana ili ne!

    • Rezultat rada programa ispisati u obliku tabele koja ima sledeće kolone za karaktere koji su se pojavili u tekstu:

      Redni
      broj
      Glif,
      ako ga ima
      Dekadna
      vrednost
      Broj
      pojaljivanja
      Status
      karaktera
      Razlog
      "sumnje"

    (dva studenta - datum objavljivanja: 30.01.2001.)



  3. Sastaviti u jeziku C program koji analizira komentare u zaglavlju teksta iz Uputstva, opisane u tački 2. i komentare za obeležavanje strane (oblika ). Program treba da štampa:

    • izveštaj o greškama (npr. "nekorektno ime datoteke", "nedostaje ime studenta", itd.);
    • "dokumentacioni list" sa sledećim informacijma:

      Ime i prezime
      studenta
      e-mail adresa Broj
      dosijea
      Naziv
      datoteke
      Početna
      strana
      Završna
      strana
      Dužina datoteke
      u broju karaktera
      Dužina datoteke
      u broju redova

    • Spisak brojeva strana iz komentara oblika (Strane ne moraju biti uzastopne!)

    Za proveru imena datoteke koristiti argumente komandne linije. Glavna funkcija se poziva sa

    main( int argc, char argv[] )
    gde argv[1] sadrži ime datoteke. Ime preusmerene datoteke nije u argv[1], tako da poziv programa treba da bude oblika

    zadatak3    <ime_datoteke    ime_datoteke

    (dva studenta - datum objavljivanja: 30.01.2001.)




  4. Prema tački 3. Uputstva, tekst treba da bude unet koristeći kodnu stranu ISO-8859-1 (Videti "Alphabet Soup"). Šta više, za unos teksta je dovoljan 7-bitni ASCII-kod. Ipak, izvestan broj tekstova je unet koristeći druge kodne šeme (npr. ISO-8859-2 [centralnoevropska latinica], ISO-8859-5 [ćirilice], CP-1250 [latinica] i CP-1251 [ćirilice], pa čak i Unicode [UTF]). Po pravilu, informacija o kodnoj šemi je eksplicitno data u zaglavlju datoteke preko META-etikete.

    Sastaviti program DEKODER.C koji će na osnovu META-etikete, identfikovati kodnu šemu dokumenta i izdati odgovarajuću poruku oblika


    "Tekst je kodiran prema šemi ..."

    Program zatim vrši prevođenje na format opisan Uputstvom (tj. zamenjuje neophodne karaktere na način opisan u Uputstvu. Rešavanje zadatka ograničiti na ISO-8859-2, ISO-8859-5, CP-1250 i CP-1251. U prilogu o formatima teksta su date potrebne informacije o kodnim tabelama. Organizovati prevođenje iz svake od ovih šema u ISO-8859-1 kao zasebnu funkciju sa imenom izvorne kodne šeme. Voditi računa o tome da su kod ćiriličnih kodnih šema HTML-etikete zapisane prema 7-bitnom ASCII-kodu ("donjih 128 karaktera") dok su ostali karakteri u "gornjem" skupu karaktera.

    Za potrebe testiranja programa ovde su dati uzorci tekstova u pojedinim kodnim šemama.

    (tri studenta - datum objavljivanja: 30.01.2001.)




  5. U tekstu koji je unet u skladu sa Uputstvom jednoznačno su kodirana slova azbuka koje koristi naš jezik (ćirilica ili latinica). Sastaviti funkcije iso8859_2 i iso8859_5 koje zamenjuju obeležja slova oblika &ss; (tačka 3. Uputstva) odgovarajućim kodovima prema kodnim rasporedima ISO-8859-2 i ISO-8859-5. Voditi računa o:

    • zamenom ne treba da budu obuhvaćene ni HTML-etikete, ni etikete između zagrada [ i ].
    • pri zameni ćiriličnih slova, izvršiti transliteraciju i svih ostalih karaktera koji nisu obuhvaćeni prethodnom tačkom.

    Sastaviti funkciju shema koja identifikuje meta-etiketu kojom je definisan kodni raspored i menja je na odgovarajući način

    Sastaviti glavnu funkciju koja prema datom argumentu komandne linije (videti 3. zadatak) vrši transliteraciju teksta. Argument komandne linije može biti L (za latinicu) i C (za ćirilicu). U slučaju greške, ispisati odgovarajući komentar i zaustaviti izvršavanje programa.

    (dva studenta - datum objavljivanja: 12.02.2001.)




  6. U tekstu Uputstva (tačka 5.) je naznačen sistem obeležavanja naslova. Ali, s obzirom na način raspodele tekstova, predložena konvencija nije mogla uvek da bude ispoštovana (npr. u slučaju kada je student imao nenaslovljeni nastavak teksta). Potrebno je sastaviti skup funkcija koje ispituju sledeća svojstva naslovljavanja u datom tekstu:

    • Funkcija VadiNaslov analizira ulaznu struju karakera i identifikuje naslove na osnovu H-etikete. Nisku karaktera, ne dužu od 200 karaktera, koja čini naslov (između etiketa <Hn> i </Hn>, uključujući i ove etikete) predaje funkciji main sa povratnom vrednošću 0, ako je naslov uspešno izdvojen, a sa kodom !=0 ako se pojavila greška. Greška je:

      1. = 1; ako je naslov predugačak (ima više od 200 karaktera)
      2. = -1; ako se naslov ne pojavljuje u tekstu


    • Za korektno izdvojeni naslov (povratni kod 0 iz prethodne funkcije), sastaviti funkciju Analiza koja preuzima nisku naslova i analizira njenu korektnost. Uslovi korektnosti su

      1. "Dubina naslova" (karakter n) mora biti između 2 i 6. Ostali karakteri su nedozvoljeni.
      2. "Dubine" moraju odgovarati logičkoj strukturi teksta. (Iza naslova dubine 2, sledi ili naslov dubine 2 ili dubine 3; iza naslova dubine 3 sledi naslov dubine 2, dubine 3 ili dubine 4; itd.)
      3. Naslovi koji zvezdicama (npr. ***) razdvajaju delove poglavlja su naslovi najveće dubine u datom tekstu.
      4. U numerisanim naslovima (tj. slučaj kada etiketa [broj] sledi neposredno iza otvorene H-etikete) sadržaj etikete broj mora biti zapisan alfabetskim znacima: npr. <H3>[Pet]Neki naslov</H3>

      Za svaki od uslova korektnosti sastaviti posebnu funkciju koja ispituje korektnost.

    • Na izlazu, program ispisuje rezultate analiza u vidu razumljivih komentara o greškama (ukoliko ih ima) i identifikovanu strukturu naslovljavanja u obliku uređene liste naslova poravnatih na odgovarajući način. Na primer:

             red = 0010    2 Uvod
             red = 0047    2 [Jedan] deo
             red = 0128        3 Legende 
             red = 0294        3 Mitovi 
             red = 0397             4 ***
             red = 0495             4 ***
             red = 0505        3 Snovi 
             red = 1000     2 [Dva] deo ...
         
    • (dva studenta - datum objavljivanja: 12.02.2001.)




  7. Sastaviti funkciju prevodilac koja kao ulazne argumente prima naslov označen brojem (videti 6. zadatak i tačku 5. Uputstva) i kôd koji određuje kako treba konvertovati nisku između uglastih zagrada. Vrednosti kôda mogu biti:

             A ili a, za arapske brojeve
             R ili r, za rimske brojeve
             D ili d, za doslovni prenos
    

    Ova funkcija vraća nisku koja predstavlja broj upotrebljen u naslovu pretvoren, prema vrednosti kôda, u odgovarajući zapis, kao i vrednost broja u promenljivoj tipa integer. Na primer, za naslov oblika<H3>[Pet] glava</H3>, funkcija prevodilac vraća:

    Kôd Povratna vrednost niske Vrednost broja
    A ili a <H3>5. glava </H3> 5 (u formatu %d)
    R ili r <H3>V glava </H3> 5 (u formatu %d)
    D ili d <H3>Pet# glava </H3> 5 (u formatu %d)

    Broj koji se koristi u naslovu je manji od 100! U slučaju da naslov čini samo oznaka broja, isključena je opcija D.
    Znak # za opciju D ukazuje na problem slaganja u rodu prepoznatog broja i teksta koji sledi (npr. "petA glava", "petU poglavlje", "petI deo",...). Kako bi se mogao rešiti ovaj problem?

    Sastaviti glavnu funkciju koja testira funkciju prevodilac. (Mogu se koristiti funkcije iz rešenja zadatka 6.). Konverziju niske u arapske ili rimske brojeve ili njen doslovni prenos organizovati u zasebnim funkcijama!

    (dva studenta - datum objavljivanja: 12.02.2001.)




  8. U nekim tekstovima, suprotno Uputstvu, pojavili su se atributi HTML-etiketa (boja pozadine, boja slova, poravnavanje, itd). Polazeći od analize iz zadatka 1. (azbuka A2), sastaviti funkciju koja ispituje da li je HTML-etiketa "opremljena" nedozvoljenim atributima i, ako jeste, briše atribute, ostavljajući samu etiketu.

    Voditi računa da su HTML-etikete samo u nekim tekstovima navedene korektno (između simbola < i >). U drugim tekstovima su načinjene "vidljivim": navedene su kao niske &lt; i &gt;. U ovakvom slučaju korigovati etikete u "nevidljivi" oblik.

    Sastaviti program za testiranje konstruisane funkcije.

    (dva studenta - datum objavljivanja: 12.02.2001.)




  9. Pretpostavimo da je tekst kodiran u skladu sa Uputstvom. Neprazne HTML-etikete (videti zadatak 1.) se ponašaju kao različite vrste zagrada. Polazeći od analize iz zadatka 1 (azbuka A2), sastaviti program koji ispisuje samo neprazne HTML-etikete iz ulaznog teksta na takav način da struktura "ograđivanja" bude pregledno prikazana.

    Pojednostavljeni primer iz W3C-validatora pokazuje okvirno kako bi trebao da izgleda izlaz. U ovaj primer je uključena i obrada praznih etiketa kao što su BR ili HR.

    Uputstvo: Formirati niz čiji su elementi niske koje čine etikete. Organizovati ga na takav način da se efikasno pretražuje. Svakoj etiketi pridružiti brojač koji se povećava za 1 prilikom otvaranja, a smanjuje za 1 prilikom zatvaranja etikete. U slučaju umetnutih etiketa, zatvara se prvo poslednja otvorena etiketa.

    (dva studenta - datum objavljivanja: 12.02.2001.)




  10. Sastaviti program koji proverava da li su ispunjeni uslovi iz tačke 4. Uputstva. Program treba da proveri važenje sledećih uslova:

    • Red se ne završava crticom (tačka 2. Uputstva)
    • Između dva alfabetska karaktera se ne pojavljuje separator
    • Iza oznake za početak pasusa sledi niz od 6 blanko-karaktera
    • Iza interpunkcijskih znakova obavezno sledi blanko-karakter (osim za polusloženice; npr. dan-i-noć)
    • Eventualnu pojavu etikete <BR> zameniti karakterom za novi red (U C-u: "\n", u DOS-u: CR+LF)

    Otkloniti one od navedenih grešaka koje se mogu automatski otkloniti. Za ostale greške, na standardnom izlazu izpisivati poruke oblika:

    Kôd greške --- Broj reda u tekstu: niska koja čini red
                                              ^^^
    
    gde je simbolom "^" obeležena pozicija na kojoj se pojavila greška.

    (dva studenta - datum objavljivanja: 12.02.2001.)




  11. Sastaviti program koji izračunava sledeće parametre teksta:

    • Frekvencija karaktera u tekstu (videti zadatak 2.)
    • Frekvencija dužine reči izražene brojem karaktera
    • Frekvencija dužine rečenice izražene brojem reči (korititi S-etiketu).

    Rezultate prikazati u obliku odgovarajućeg histograma (videti i zadatke 1-13 i 1-14 u K&R).

    (Napomena: Prema Oksfordskom rečniku računarstva, NOLIT, Beograd, 1990, histogram je dijagram (grafik) koji prikazuje relativne frekvencije s kojima neka merljiva veličina uzima vrednost u skupu susednih veličina. Dijagram se sastoji od pravougaonika čije su površine proporcionalne relativnim frekvencijama, a širine - klasi intervala.)

    (dva studenta - datum objavljivanja: 12.02.2001.)




  12. Jedan od osnovnih nedostataka HTML-a je što su logička i grafička struktura "izmešane": boje, veličina i oblik slova, itd, nisu od značaja za logički izgled dokumenta. Ovi nedostaci su otklonjeni u složenijim sistemima obeležavanja kao što su SGML ili XML. Deo HTML-etiketa je u Uputstvu bio upotrebljen da bi omogućio konverziju teksta u SGML-format. To su:

    • — … [QU] [SQ] iz tačke 3. Uputstva
    • etikete iz tačaka 8. i 9. Uputstva
    • etiketa [S] za rečenicu

    Cilj ovog zadatka je da se sastavi, oslanjajući se na rezultat rada programa iz zadatka 5, program koji formira "skromnu" HTML-reprezentaciju teksta tako što će biti izbrisane ili na odgovarajući način zamenjene gore navedene etikete. Na primer, etiketu — zameniti sa --, a zagrade <def> sa atributima izbrisati.

    Atributi etikete <BODY> (BGCOLOR, TEXT, LINK, ALINK, VLINK) se učitavaju tim redom kao parametri iz komandne linije (videti 3. zadatak).

    Rezultat ove transformacije bi trebalo da bude "razumno" čitljiv pod uobičajenim navigatorima.

    (dva studenta - datum objavljivanja: 12.02.2001.)




  13. Sastaviti program koji se poziva nalik na DOS-komandu type

    type /x <ime_datoteke>

    ali sa sledećim razlikama:

    • parametar x može imati vrednosti t (za tekstuelni režim čitanja) i b (za binarni režim čitanja);
    • program koristi fnkcionalne dirke Home, End, PgUp i PgDn za navigaciju kroz tekst.

    Program treba konstruisati tako da se tokom izvršavanja gradi dvostruko olančana lista čiji poslednji element pokazuje na početak tekuće izlistane strane.

    (dva studenta - datum objavljivanja: 25.04.2001.)




  14. Sastaviti program veze koji se iz komande linije poziva sa

    veze kljucna_rec <ime_datoteke>

    gde je:

    • kljucna_rec niska ASCII-grafičkih karaktera koja ne zadrži blanko-karakter, a
    • ime_datoteke ime neke datoteke dobijene kao rezultat prvog seminarskog rada

    Program veze treba da uspostavi hiper-veze između svih pojavljivanja niske kljucna_rec u zadatom tekstu na takav način da kroz tekst bude moguće kretanje "skokom" sa jednog pojavljivanja ključne reči na njeno sledeće pojavljivanje. Polazna sidra u hiper-vezama prikazati crvenom bojom.

    (dva studenta - datum objavljivanja: 25.04.2001.)




  15. Sastaviti program koji se poziva iz komandne linije sa:

    popis etiketa <ime_datoteke>

    gde je ime_datoteke kao u prethodnom zadatku, a etiketa OPCIONI parametar čija je vrednost neka od etiketa iz tačaka 9. i 10. Uputstva.

    Program popis treba da ispiše pod naslovom koji je jednak parametru etiketa spisak svih niski koje su "ograđene" ovom etiketom. Ukoliko se ovaj parametar ne navede, program ispisuje pod odvojenim naslovima sve etikete iz tačaka 9. i 10. koje pronađe u tekstu.

    Napomena: Razmotriti upotrebu hash-funkcija.

    (dva studenta - datum objavljivanja: 25.04.2001.)




Poslednja izmena:
27. maj 2001.