OOP (OE, OF, OS, OT) – DZ1
Rok za predaju rešenja: biće naknadno saopšten.
OBJEKTNO ORIJENTISANO PROGRAMIRANJE
- domaći zadatak broj 2 Funkcionalna specifikacija
Na programskom jeziku C++ napisati klase za rad sa razlomcima i geometrijskim nizovima. Razlomak (Fraction) čine dva cela broja, brojilac (numerator) i imenilac (denominator). Pravi se zadavanjem vrednosti za brojilac (podrazumevano 0) i imenilac (podrazumevano 1). Znak razlomka se vezuje za vrednost brojioca. Greška je ako je imeniocu zadata negativna vrednost ili ako je jednaka nuli.
Razlomci mogu da se prave i na osnovu tekstualnog zapisa (npr. “1/4“) koji se sastoji isključivo od
vrednosti za brojilac i imenilac razdvojenih razlomačkom crtom. Razlomak se može napraviti i kao
kopija drugog razlomka. Operacije sa razlomcima treba implementirati preklapanjem operatora. Potrebno je potpuno implementirati matematičku semantiku operacija sa razlomcima.
Omogućiti sledeće operacije sa razlomcima:
1. Sabiranje razlomaka preklapanjem binarnog operatora +;
2. Oduzimanje razlomaka preklapanjem binarnog operatora -;
3. Množenje razlomaka preklapanje binarnog operatora *;
4. Deljenje razlomaka preklapanjem binarnog operatora /;
5. Poređenje razlomaka na jednakost preklapanjem binarnih operatora == i != ;
6. Upoređivanje vrednosti dva razlomka preklapanjem binarnih operatora <, >, <=, >= ;
7. Uvećanje vrednosti razlomka za 1 preklapanjem prefiksnog i postfiksnog operatora ++;
8. Umanjenje vrednosti razlomka za 1 preklapanjem prefiksnog i postfiksnog operatora --;
9. Složene operacije dodele vrednosti preklapanjem operatora +=, -=, *=, /=;
10. Učitavanje vrednosti razlomka iz ulaznog toka preklapanjem operatora >>;
11. Ispis razlomka u izlazni tok podataka preklapanjem operatora <<;
12. Konverzija razlomka u realan broj preklapanjem operatora za konverziju tipa (double) i
operatora (float). Izračunava se vrednost na osnovu brojioca i imenioca.
13. Promena znaka razlomka preklapanjem unarnog operatora -;
14. Provera da li je vrednost razlomka nula preklapanjem unarnog operatora !;
15. Računanje recipročne vrednosti razlomka preklapanjem operatora ~.
Geometrijska progresija (GeometricProgression) predstavlja niz brojeva za zadatim koeficijentom (odnos dva uzastopna člana niza). Koeficijent je razlomak. Geometrijska progresija se pravi na
osnovu zadatog koeficijenta ili kao kopija postojećeg objekta geometrijske progresije.
Omogućiti sledeće operacije sa geometrijskim progresijama:
1. Dodela vrednosti jedne geometrijske progresije drugoj (dubokim kopiranjem) preklapanjem operatora =;
2. Dohvatanje n-tog člana (razlomka) geometrijske progresije preklapanjem operatora za
indeksiranje [], koji mora ispravno da radi za konstantne i nekonstantne objekte;
3. Računanje sume prvih n članova geometrijske progresije (n-ta parcijalna suma odgovarajućeg geometrijskog reda) preklapanjem operatora za poziv funkcije (), koji mora da
ispravno radi za konstante i nekonstantne objekte.
Napisati glavni program koji testira navedene klase. Glavni program treba da pozove metodu
void testFractions() u kojoj studenti pišu sopstvene testove i implementirana je u posebnom
.cpp fajlu. Na kraju programa ispisati na standardni izlaz izmereno vreme trajanja izvršavanja.
Tehnički zahtevi i smernice za izradu rešenja
Opisane koncepte implementirati u vidu odgovarajućih klasa. Poljima klase, zaštićenim od direktnog pristupa, se pristupa isključivo pomoću odgovarajućih metoda za čitanje i pisanje vrednosti polja
(ukoliko je pristup uopšte zahtevan). 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 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 odgovarajuće .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škama 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. Osim poruke
da je nemoguće pronaći fajl sa porukama, sve ostale poruke ne smeju biti u tekstu programa, već u
datoteci 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 kojima su implementirani osnovni koncepti (razlomak i geometrijska progresija) treba
da budu smeštene u poseban projekat rešenja koji se prevodi kao dinamička biblioteka
(fractions.dll).
▪ Klase za obradu i manipulisanje porukama grešaka takođe treba smestiti u poseban projekat
rešenja koji se prevodi kao statička biblioteka (errors.lib).
▪ Glavni program, koji sadrži test primer za napisane klase, napisati u posebnom projektu koji
se prevodi kao Win32 Console Application (test.exe) fajl i koji treba povezati sa navedenim
bibliotekama.
▪ NIJE DOZVOLJENO SMESTITI CEO KOD U JEDAN PROJEKAT ILI CPP fajl!
▪ Rešenja će biti testiranja tajnim testovima, pa je potrebno da klase zadovolje opisani interfejs
i da se imenuju na engleskom jeziku, kao što je napisano u tekstu zadatka.
19.11.2013. godine
sa predmeta
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 nikakva 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).
Download

Drugi domaći zadatak iz OOP, 2011/2012