OOP (OE, OF, OS, OT) DZ2 Rok za predaju rešenja: 11.12.2012. OBJEKTNO ORIJENTISANO PROGRAMIRANJE - domaći zadatak broj 2 - Funkcionalna specifikacija Postojeće klase koncepata iz prvog domaćeg zadatka potrebno je dopuniti operatorskim funkcijama na način koji je opisan u nastavku teksta. Postojeće funkcionalnosti klasa treba isključivo pozivati u izrazima sa preklopljenim operatorima (na primer, umesto poziva metoda prilikom čitanja zaglavlja i pravljenja objektne strukture, potrebno je koristiti odgovarajuće operatore). Na jeziku C++ nadograditi postojeći program za automatsku verifikaciju ispravnosti komentara u C/C++ zaglavljima, tako da se od njih generiše HTML tehnička dokumentacija. Program se pokreće kao konzolna aplikacija, bez grafičkog korisničkog interfejsa. Za ispis aktivnosti koristiti fajl zapisnika (log fajl). Na kraju potrebno je ispisati izmereno vreme izvršavanja programa. Glavni program kao prvi ulazni argument dobija putanju do tekstualnog fajla, koji u svakom redu sadrži po jednu putanju do fajla zaglavlja (.h) koji treba obraditi, a kao drugi argument dobija putanju do direktorijuma u koji treba da sačuva rezultat obrade. Program učitava i proverava fajlove zaglavlja na identičan način kao u prvom domaćem zadatku. Dodatno, nakon provere zaglavlja generiše se tehnička HTML dokumentacija. Za svaki.h fajl generiše se istoimeni.html fajl koji sadrži podatke o svim ispravnim deklaracijama. Na kraju se generiše i jedan sumarni index.html fajl koji sadrži listu hiperlinkova ka pojedinačnim.html fajlovima. Program čita/obrađuje jedan po jedan.h fajl na sledeći način: učitaju se deklaracije sa komentarima iz fajla zaglavlja (kao kolekcija objekata!), objekti se predaju komponenti checker, koja vrši proveru učitanih objekata: o ako se naiđe na nekompletne komentare deklaracija, odnosno one kod kojih nisu svi delove deklaracije adekvatno pokriveni sekcijama komentara, u log fajl se u jednom redu ispiše poruka koja ima sledeći format: WARNING at line <broj linije teksta> - <deklaracija funkcije> o takve deklaracije se označe kao nekompletne. Provereni objekti deklaracija se zatim ispisuju u HTML fajl. Nekompletne deklaracije se ispisuju crvenim slovima. Ukoliko program u toku obrade ne može da otvori neki.h fajl treba da prijavi grešku i da nastavi izvršavanje. U nastavku teksta zadatka dat je opis semantike operatora za korisničke tipove tehnički zahtevi i napomene za izradu rešenja. U prilogu je navedeni primeri ulaznih i izlaznih fajlova. Preklapanje operatora Preklapanjem operatora += omogućiti: dodavanje objekta klase Param objektu klase Declaration dodavanje objekta klase Declaration objektu klase Header dodavanje objekta klase ParamDescription objektu klase Comment Preklapanjem operatora = omogućiti dodelu vrednosti za instance klasa: Header, Declaration, Param, Comment, ParamDescription Preklapanjem operatora == i!= omogućiti poređenje po jednakosti: poređenje objekata klase Param (imaju isto ime i tip), poređenje objekata klase Declaration (funkcija ima isto ime i svi parametri su im jednaki i u istom redosledu), poređenje objekata klase Header (sadrže isti broj funkcija i za svaku funkciju iz jednog fajla postoji tačno jedna funkcija koja je sa njom jednaka). 1
Preklapanjem unarnog operatora! omogućiti sledeću proveru: za objekat klase Header vraća true, ako ne sadrži nijednu deklaraciju za objekat klase Declaration vraća true, ako nema nijedan parametar Preklapanjem operatora () omogućiti: za objekat klase Header vraća broj deklaracija za objekat klase Declaration vraća broj formalnih parametara Preklapanjem binarnog operatora + omogućiti: uniju dva objekta klase Header. Rezultat je novi objekat iste klase, koji sadrži uniju (kopija) deklaracija iz prva dva. Operator ne menja stanje svojim operandima. Preklapanjem operatora -- omogućiti eliminisanje duplikata deklaracija funkcija u objektu klase Header (primer: aheader--;). prefiksna varijanta operatora menja stanje operanda i rezultat je sam objekat operand. postfiksna varijanta operatora menja stanje operanda, a vraća kopiju operanda sa stanjem neposredno pre sažimanja duplikata funkcija. Preklapanjem operatora % omogućiti: proveru da li objekat klase Header sadrži zadati objekat klase Declaration (poređenjem po jednakosti). Rezultat je logičkog tipa. primer: aheader % adeclaration proveru da li objekat klase Declaration sadrži parametar koji je identičan zadatom objektu klase Param. Rezultat je logičkog tipa Preklapanjem binarnog operatora - omogućiti: nalaženje razlike dva objekta klase Header. Rezultat je novi objekat klase Header koji sadrži samo one objekte (kopije) klase Declaration koji postoje u prvom i ne postoje u drugom zaglavlju. Operator ne menja stanje svojim operandima. Preklapanjem operatora za indeksiranje [] omogućiti: dohvatanje deklaracije funkcije (Declaration) iz zaglavlja (objekat klase Header) na osnovu imena. Ukoliko se ne pronađe deklaracija funkcije sa zadatim imenom, vraća se null vrednost. Preklapanjem operatora za ispis << omogućiti ispis stanja objekata u HTML formatu za sledeće klase: Header, Declaration, Param, Comment, ParamDescription ispis treba uraditi preme šablonu i primerima iz priloga uz datu postavku zadatka, obezbediti ulančavanje poziva operatora, ispis složenih objekata treba svesti na ispise jednostavnijih objekata koje sadrže. Na primer, ispis objekta klase Header treba da se osloni na ispis deklaracija funkcija i td. 2
Tehnički zahtevi i smernice za izradu rešenja Opisane koncepte implementirati u vidu odgovarajućih klasa. Ukoliko je potrebno pristupati poljima klase zaštićenim od direktnog pristupa, to se radi isključivo pomoću odgovarajućih metoda za čitanje i pisanje vrednosti polja. Za smešanje tekstualnih vrednosti upotrebiti tačno onoliko mesta u memoriji koliko je neophodno. Svaka klasa koja koristi dinamičku memoriju mora imati korektno napisan destruktor, konstruktor kopije i preklopljen operator za dodelu vrednosti. Glavni program treba da poziva metode/operacije koje obavljaju opisane radnje. Sve metode smestiti u odgovarajuće klase. Programski kod klasa rasporediti u istoimene.h i.cpp fajlove. Nije dozvoljeno korišćenje globalnih promenljivih za razmenu podataka. Sva razmena podataka između funkcija mora ići preko povratne vrednosti i/ili liste argumenata. U slučaju bilo kakve greške (poziv programa sa neodgovarajućim brojem argumenata komandne linije, neuspešna dodela dinamičke memorije, greška pri radu sa datotekom ili bilo koja druga greška koja se može pojaviti u toku izvršavanja programa), ispisati odgovarajuću poruku i prekinuti izvršavanje. Sve poruke o grešci treba da budu u posebnoj tekstualnoj datoteci. Za svaku grešku je namenjen tačno jedan red teksta proizvoljne dužine. Na početku reda se nalazi celi broj sa rednim brojem greške, nakon koga sledi tačno jedan beli znak, posle koga je sve do kraja reda tekst poruke o grešci koji može sadržati proizvoljno mnogo belih znakova. Napraviti klasu koja će sadržati podatke o svim parovima redni broj-tekst greške. Pri ispisu greške, ispisati samo tekst poruke u log fajl. Osim poruke da je nemoguće pronaći fajl sa porukama, sve ostale poruke ne smeju biti u tekstu programa, već u fajlu sa porukama. Napomena: nije dozvoljeno praviti listu sa smeštanje poruka. Napomene: 1. Ukoliko u zadatku nešto nije dovoljno jasno definisano, treba usvojiti razumnu pretpostavku i na temeljima te pretpostavke nastaviti izgrađivanje svog rešenja. 2. Za uspešno odbranjen domaći zadatak potrebno je na odbrani pokazati kod podeljen na odgovarajuće projekte,.h i.cpp fajlove: klase koje definišu strukturu, ponašanje i obradu deklaracija funkcija i komentara treba smestiti u poseban projekat rešenja koji se prevodi kao statička biblioteka (concepts.lib), klase za obradu i manipulisanje porukama grešaka takođe treba smestiti u poseban projekat rešenja koji se prevodi kao druga statička biblioteka (errors.lib), glavni program napisati u posebnom projektu koji se prevodi kao Win32 Console Application (commentchecker.exe) fajl i koji treba povezati sa statičkim bibliotekama. NIJE DOZVOLJENO SMESTITI CEO KOD U JEDAN PROJEKAT ILI CPP fajl! 26.11.2012. godine sa predmeta 3
Format i struktura HTML fajla PRILOG HTML je deklarativni jezik osmišljen za pravljenje veb stranica koje se mogu pregledati pomocu internet pretraživaca. Svaka veb stranica mora imati tacno definisanu strukturu, kako bi internet pretraživac mogao da je procita i korektno prikaže sadržaj korisniku. Sastoji se od odgovarajucih elemenata ome9enih tagovima. Tagovi se pišu u uglastim zagradama (npr. <ime-taga>). Svaki element ima svoj pocetni i završni tag i sadržaj unutar njih. Pocetni i završni tag imaju isto ime, s tim sto ime se zagrade razlikuju u jednom detalju završni tag ima dodatni / znak (npr. <body> </body>). HTML jezik ima veliki broj tagova, međutim za potrebe izrade rešenja za domaci zadatak koristice se samo najuži skup najcešce korišcenih tagova koji su dovoljni za navedene potrebe. Elementi HTML stranice se hijerarhijski ugneždavaju i pocetni i završni tag svakog elementa morajubiti upareni. HTML stranica ili dokument sadrži jedan element na najvišem nivou hijerarhije i on je oznacen tagom HTML (mogu se pisati ili mala ili velika slova za tagove, ali je dobro ne mešati ih). HTML element se sastoji od dva glavna elementa stranice: zaglavlja (HEAD) i tela (BODY) <HTML> <HEAD> </HEAD> <BODY> </BODY> </HTML> Unutar taga HEAD najcešce se navodi naslov stranice koji se ispisuje na jezicku taba internet pretraživaca. Naslov stranice se piše unutar taga TITLE koji se piše unutar taga HEAD. Unutar taga BODY navode se elementi u okviru kojih se piše sadržaj koji ce se prikazivati na veb stranici. Ukoliko se na veb stranici prikazuje tekst, onda se tekst obicno stavlja unutar tagova <P> I </P> koji oznacavaju paragraf teksta. Ukoliko se želi dodati novi paragraf, samo se doda još jedan element omeđen <P> i </P> tagovima. Ukoliko se na stranici prikazuje tabela, koristi se tag TABLE. Tabela se sastoji od redova. Redovi se nalaze unutar tela tabele koje se definiše unutar taga TBODY. Svaki red se definiše unutar taga TR unutar tela. Jedan red tabele se sastoji od celija. Svaka celija se definiše unutar taga TD. Svaki tag HTML dokumenta može imati i attribute koji definišu pozicioniranje i stil prikaza na ekranu. Tako i tag TR me9u brojnim atributima ima i atribut colspan. Taj atribut se koristi u slucajevima kada jedan red treba da odstupi od šablona ostalih redova i da sadrži samo jednu celiju. Tada se za ovaj atribut navede vrednost broja celija koje jedna velika celija treba da obuhvati (videti primer). Pretraživac podrazumevano prikazuje elemente na beloj površini. Ukoliko je potrebno promeniti boju pozadine nekog elementa, za to se koristi atribut bgcolor. U datom primeru, može se primetiti tag TR koji ima definisanu boju (u RGB format) za red tabele. Ukoliko je potrebno manipulisati formatiranjem teksta i definisanjem fontova, za to se koristi tag FONT sa pratecim atributima. U datom primeru korišcen je atribut size. Ukoliko je potrebno deo teksta prikazati podebljano, koristit se tag <b> </b>. HTML je tekstualni format koji koristi znakove za opis izgleda stranice, tako da određeni znakovi imaju specijalno znacenje. Na primer, znak > ili < se koriste za pisanje tagova. Ako potrebno u tekstu koristit ove znakove za prikaz, na primer, matematickih izraza, koriste se specijalni kodovi. Znak vece (<), znak manje (&rt;), razmak ( ) i td. Ukoliko je na stranici potrebno prikazaci fragmente programa sa pratecim formatiranjem, koristi se tag <CODE> </CODE>. Kada je potrebno tekst hijerarhijski uvlaciti koristi se tag <DL> </DL> (engl: definition list). Lista definicija se sastoji od parova termin-opis termina. U ovom kontekstu se koristi za prikazivanje listi parametara i opis povratnih vrednosti. Termin se navodi unutar taga <DT> </DT>, a opis termina unutar taga <DD> </DD>. Kraj reda teksta se ostvaruje tagom <BR/> 4
Primer ulaznog fajla glavnog programa C:\files\dz1\headers\header1.h C:\files\dz1\headers\header2.h... Primer ulaznog fajla zaglavlja sa komentarima (header1.h, ignorisati brojeve linija): 1 #include "SomeOtherHeader.h" 2 3 /** 4 * @brief Adds a number to the collection. 5 * @param col Collection containing numbers 6 * @param number A number to be added to the collection 7 */ 8 void add(collecton col, int number); 9 10 /** 11 * @brief Removes the number from the collection col. 12 * @param col Collection containing numbers 13 * @returns Size of the collection after removing the number. 14 */ 15 int remove(collection col, int number); 5
Primer izlaza programa (HTML stranica). <html> <head><title>header1.h</title></head> <body bgcolor="white"> <h2><center>content of header file <code>header1.h</code></center></h2> <table border="1" cellpadding="3" cellspacing="0" width="100%"> <tbody> <tr bgcolor="#ccccff"> <td colspan="2"><font size="+2"><b>function Summary</b></font></td> </tr> <tr bgcolor="white"> <td align="right" valign="top" width="1%"> <font size="-1"><code>void</code></font> </td> <td> <code> <b><a href="primer.html#add(int)">add</a></b> (Collection& col, int number) </code><br> Adds the number to the collection. </td> </tr> <tr bgcolor="white"> <td align="right" valign="top" width="1%"> <font size="-1"><code>int</code></font> </td> <td> <code> <b><a href="primer.html#remove(int)">remove</a></b> (Collection& col, int number) </code><br> Removes the number from the collection </td> </tr> </tbody> </table> <hr> <a name="add(int)"/> <h3>add</h3> <code>void <b>add</b>(collection& col, int number)</code> <dl> <dd>adds a number to the collection.</dd> <dd> <dl> <dt><b>parameters:</b></dt> <dd><code>col</code> - collection containing numbers</dd> <dd><code>number</code> - a number to be added to the collection</dd> </dl> </dd> </dl> <hr> <a name="remove(int)"/> <h3>remove</h3> <code>int <b>remove</b>(collection& col, int number)</code> <dl> <dd>removes the number from the collection.</dd> <dd> <dl> <dt><b>parameters:</b></dt> <dd><code>col</code> - collection containing numbers</dd> <dd><code>number</code> - a number that is to be removed</dd> <dt><b>returns:</b></dt> <dd>size of the collection after removing the number.</dd> </dl> </dd> </dl> <hr> </body> </html> 6
Kad se otvori ova stranica u internet pretraživaču, izgleda kao na sledećoj slici. 7
Sumarna HTML stranica <html> <head> <title>solution #123 documentation</title> </head> <body bgcolor="white"> <h2><center>solution documentation: <code>solution #123</code></center></h2> <p> The solution documentation consists of the following documentation files: <p> <ul> <li><a href="header1.html"><code>header1.h</code></a> <li><a href="header2.html"><code>header2.h</code></a> <li><a href="header3.html"><code>header3.h</code></a> </ul> </body> </html> Tagom <a>... </a> definiše se link na drugoj HTML stranici. Ukoliko se klikne na takav link, pretraživač otvara HTML stranicu čija je adresa navedena pomoću atributa href datog taga. Prikaz sumarne stranice: 8
Funkcije programskog jezika C/C++ za rad sa vremenom Operativni sistem vodi evidenciju o utrošenom procesorskom vremenu za svaki od trenutno aktivnih procesa. U programskom jeziku C/C++, ovo vreme se može dobiti pozivom funkcije clock() i izraženo je u otkucajima sistemskog časovnika (engl. clock ticks). Svaka implementacija jezika C/C++ podrazumeva sopstvenu vrednost simboličke konstante CLOKS_PER_SEC (u ranijim verzijama standarda CLK_TCK), koja predstavlja broj otkucaja sistemskog časovnika u toku jedne sekunde. Sa druge strane, u svakom trenutku je moguće od operativnog sistema dobiti informaciju o vremenu u sistemskom časovniku, kako i o datumu i vremenskoj zoni gde se dati računar nalazi. Jednom kada tačno vreme bude očitano, ne postoji nikakava prepreka da se ono pretvori u odgovarajuću strukturu, odnosno prikaže na željeni način preko proizvoljnog znakovnog niza. Priloženi programski segment ilustruje prikaz tačnog vremena bez prikaza datuma: #include <ctime>... time_t pinttime = time(null); struct tm* currentlocaltime = localtime(&pinttime); char* datetimestring = calloc(100+1, sizeof(char)); /* if time setting and memory allocation was succesfull, create complete message */ if (currentlocaltime && datetimestring) /* format the time as needed */ strftime(datetimestring, 100, "%H:%M:%S", currentlocaltime); Dodatne informacije o ovde navedenim funkcijama (i svim ostalim koje se nalaze u zaglavlju time.h, odnosno ctime) su dostupne u zbirci prof. Krausa i na raznim dokumentacionim stranicama (kako onima koje dolaze uz razvojno okruženje, tako onima dostupnim na Internetu). 9