Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Колекција Problem 1 (2 / 2)
- Да се дефинира апстрактна класа Bogatstvo во која се чуваат информации за:
- адреса (динамички алоцирана низа од знаци)
- име (низа од макимум 100 знаци)
- почетна вредност (цел број)
- Оваа класа има чисто виртуелна функција со потпис: double proceneta_cena() (5 поени)
- За потребите на оваа класа да се дефинираат потребните конструктори и да се напише соодветен деструктор. (5 поени)
- Да се преоптоварат:
- операторот << за печатење кој ќе ги печати адредата, името и почвредност (сите одделени со - ) (5 поени)
- операторот = за доделување вредност и да се дефинира копирачки конструктор. (5 поени)
- Од оваа класа да се изведат две нови класи Zlatnik и Dijamant. За Zlatnik дополнително се чуваат:
- forma (низа од максимум 50 знаци).
- За Dijamant дополнително се чува:
- проѕирност (децимален број). (5 поени)
- Секое богатство има своја цена. Да се напишат соодветни методи за пресметување на проценетата цена.
- За златник се пресметува на следниот начин: 2 * pocetna_vrednost ако златникот има форма krug, pocetna_vrednost+ 200 ако златникот има форма pravoagolnik. Во спротивно цената е pocetna_vrednost +100. (5 поени)
- За дијамант се пресметува на следниот начин: prodzirnost*(pocetna_vrednost + 150) ако проѕидноста е помала 0д 0.5. Ако проѕирноста е поголема или еднаква тогаш цената се пресметува со: prodzirnost*pocetna_vrednost - 150. (5 поени)
- Да се дефинира класа Kolekcija во која се чуваат:
- низа од Bogatstvo покажувачи (динмички алоцирана низа од покажувачи кон класата Bogatstvo т.е. Bogatstvo** )
- број на уметнички дела (цел број) .
- За потребите на оваа класа да се преоптоварат потребните конструктори и да се напише соодветен деструктор. (5 поени)
- Исто така да се имплементираат методите со следните потписи:
- void dodadiBogatstvo(Bogatstvo b)** - за додавање ново bogatstvo b* во низата дефинирана во класата Kolekcija. (5 поени)
- Bojatstvo& vratiNajbliskoSporedCenaBogatstvo(int pocetna) во која се враќа она богаство кое има најблиска проценета цена со цената дадена како аргумент (pocetna). Toa занчи дека има минимална разлика на проценетата цена на богатството и почетната цена. Претпоставете дека во програмата секогаш има само едно вакво дело. (5 поени)
- Sample input:
- 2
- 0 adresa1 ime1 1000 krug
- 1 adresa2 ime2 1200 0.2
- 30
- Sample output:
- adresa2-ime2-1200
- */
- #include <iostream>
- #include <cstring>
- #include <cmath>
- using namespace std;
- class Bogatstvo {
- protected:
- char *adresa;
- char ime[100];
- int vrednost;
- public:
- Bogatstvo (char *adresa, char *ime , int vrednost) {
- this->adresa = new char [strlen(adresa) + 1];
- strcpy (this->adresa,adresa);
- strcpy (this->ime,ime);
- this->vrednost = vrednost;
- }
- Bogatstvo (Bogatstvo &b) {
- this->adresa = new char [strlen(b.adresa) + 1];
- strcpy (this->adresa,b.adresa);
- strcpy (this->ime,b.ime);
- this->vrednost = b.vrednost;
- }
- virtual ~Bogatstvo () {
- delete [] adresa;
- }
- virtual double proceneta_cena() = 0;
- friend ostream &operator << (ostream &o,Bogatstvo &b) {
- o << b.adresa << "-" << b.ime << "-" << b.vrednost << endl;
- return o;
- }
- Bogatstvo &operator = (Bogatstvo &b) {
- if (this != &b) {
- delete [] adresa;
- this->adresa = new char [strlen(b.adresa) + 1];
- strcpy (this->adresa,b.adresa);
- strcpy (this->ime,b.ime);
- this->vrednost = b.vrednost;
- }
- return *this;
- }
- };
- class Zlatnik : public Bogatstvo {
- private :
- char forma[50];
- public :
- Zlatnik (char *adresa, char *ime , int vrednost , char *forma) : Bogatstvo (adresa,ime,vrednost) {
- strcpy(this->forma,forma);
- }
- double proceneta_cena() {
- if (strcmp (forma,"krug") == 0)
- return 2*vrednost;
- if (strcmp (forma,"pravoagolnik") == 0)
- return vrednost + 200;
- else
- return vrednost +100;
- }
- };
- class Dijamant : public Bogatstvo {
- private :
- float prodzirno;
- public:
- Dijamant (char *adresa, char *ime , int vrednost ,float prodzirno): Bogatstvo (adresa,ime,vrednost) {
- this->prodzirno = prodzirno;
- }
- double proceneta_cena() {
- if(prodzirno < 0,5)
- return prodzirno*(vrednost + 150);
- else
- return prodzirno*vrednost - 150;
- }
- };
- class Kolekcija {
- private :
- Bogatstvo ** bog;
- int broj;
- public:
- Kolekcija (int broj = 0) {
- bog = new Bogatstvo *[broj];
- this->broj = broj;
- }
- ~Kolekcija ()
- {}
- void dodadiBogatstvo(Bogatstvo *b) {
- bog[broj] = b;
- broj++;
- }
- Bogatstvo& vratiNajbliskoSporedCenaBogatstvo(int pocetna) {
- float razlika = fabs(bog[0]->proceneta_cena() - pocetna);
- int indeks;
- for (int i = 0; i< broj; i++) {
- if (fabs(bog[i]->proceneta_cena() - pocetna) < razlika)
- indeks = i;
- }
- return *bog[indeks];
- }
- };
- int main() {
- Kolekcija a;
- char ime[100],adresa[100],forma[100];
- int poc_vrednost;
- double prodzirnost;
- int n;
- cin>>n;
- for (int i=0; i<n; i++) {
- int tip;
- cin>>tip;
- if (tip==0) {
- cin>>adresa>>ime>>poc_vrednost>>forma;
- a.dodadiBogatstvo(new Zlatnik(adresa, ime, poc_vrednost, forma));
- } else {
- cin>>adresa>>ime>>poc_vrednost>>prodzirnost;
- a.dodadiBogatstvo(new Dijamant(adresa, ime, poc_vrednost, prodzirnost));
- }
- }
- int pocetna;
- cin>>pocetna;
- cout<<a.vratiNajbliskoSporedCenaBogatstvo(pocetna);
- return 0;
- }
- /*
- Распродажба Problem 2 (2 / 2)
- Да се дефинира класа Predmet во која се чуваат информации за:
- сопственик (динамички алоцирана низа од знаци)
- име (низа од макимум 100 знаци)
- цена по кој е купен (цел број).
- Оваа класа има чисто виртуелна функција со потпис: double prodazhna_cena() (5 поени)
- За потребите на оваа класа да се преоптоварат потребните конструктори и да се напише соодветен деструктор. (5 поени)
- Да се преоптоварат:
- операторот << за печатење кој ќе ги печати сопственикот, името и цената по кој е купен (сите одделени со # ) (5поени)
- операторот = за доделување вредност и да се дефинира копирачки конструктор . (5 поени)
- Од оваа класа да се изведат две нови класи TehnichkiPredmet и ObicenPredmet .
- За TehnichkiPredmet дополнително се чуваат:
- гаранција (true или false).
- За ObicenPredmet дополнително се чува:
- маса во kg (децимален број). (5 поени)
- Секоj предмет си има своја продажна цена. Да се напишат соодветни методи за пресметување на продажната цена:
- За TehnichkiPredmet се пресметува на следниот начин: g * 1000 + cena po koj e kupen, каде g = 1 ако предметот сеуште е под гаранција, а 0.2 ако не е. На пр. технички предмет кој не е под гаранција, и цената по кој е купен 40 000 : 0.2*1000+40000= 40200.
- За ObicenPredmet се пресметува на следниот начин: masa * 500 + 2*cena po koj e kupen. На пр. обичен предмет со маса 1 kg и цена по кој е купен 10 000: 1∗500+2*10000= 20500 (10 поени)
- Да се дефинира класа Rasprodazhba во која се чуваат: - низа од Predmet објекти (динмички алоцирана низа од објекти од класата Predmet) - број на предмети (цел број) .
- За потребите на оваа класа да се преоптоварат потребните конструктори и да се напише соодветен деструктор. (5 поени) Исто така да се имплементираат следните методи:
- void dodadiPredmet(Predmet\* p) - за додавање ново предмет p* во низата дефинирана во класата Rasprodazhba. (5 поени)
- Predmet& vratiNajevtinPredmet() во која се враќа најевтиниот предмет . Еден предмет е најевтино ако има најниска цена. Претпоставете дека во програмата секогаш има само еден ваков предмет. (5 поени)
- Sample input:
- 2
- 0 sopstv1 ime1 2000 1
- 1 sopstv2 ime2 3439 34
- Sample output:
- sopstv1#ime1#2000
- */
- #include <iostream>
- #include <cstring>
- using namespace std;
- class Predmet {
- protected:
- char *sopstvenik;
- char ime[100];
- int cena;
- public:
- Predmet(char *sopstvenik="",char *ime="",int cena=0) {
- this->sopstvenik=new char[strlen(sopstvenik)];
- strcpy(this->sopstvenik,sopstvenik);
- strcpy(this->ime,ime);
- this->cena=cena;
- }
- virtual ~Predmet() {
- delete []sopstvenik;
- }
- Predmet(Predmet& obj) {
- sopstvenik=new char[strlen(obj.sopstvenik)];
- strcpy(sopstvenik,obj.sopstvenik);
- strcpy(ime,obj.ime);
- cena=obj.cena;
- }
- Predmet& operator=(Predmet& obj) {
- if (this==&obj)
- return *this;
- delete []sopstvenik;
- sopstvenik=new char[strlen(obj.sopstvenik)];
- strcpy(sopstvenik,obj.sopstvenik);
- strcpy(ime,obj.ime);
- cena=obj.cena;
- return *this;
- }
- int getCena() {
- return cena;
- }
- friend ostream& operator<<(ostream& co,Predmet& obj) {
- return co<<obj.sopstvenik<<"#"<<obj.ime<<"#"<<obj.cena<<endl;
- }
- virtual double prodazna_cena()=0;
- };
- class TehnichkiPredmet:public Predmet {
- private:
- bool garancija;
- public:
- TehnichkiPredmet(char *sopstvenik="",char *ime="",int cena=0, bool garancija=true):Predmet(sopstvenik,ime,cena) {
- this->garancija=garancija;
- }
- double prodazna_cena() {
- if (garancija==true) {
- return 1000.0+cena;
- } else {
- return 0.2*1000+cena;
- }
- }
- };
- class ObichenPredmet:public Predmet {
- private:
- double masa;
- public:
- ObichenPredmet(char *sopstvenik="",char *ime="",int cena=0, double masa=0):Predmet(sopstvenik,ime,cena) {
- this->masa=masa;
- }
- double prodazna_cena() {
- return masa*500+cena*2;
- }
- };
- class Rasprodazhba {
- private:
- Predmet **p;
- int elem;
- public:
- Rasprodazhba(Predmet **p=NULL,int elem=0) {
- this->p=new Predmet*[elem];
- for (int i=0; i<elem; i++)
- this->p[i]=p[i];
- this->elem=elem;
- }
- ~Rasprodazhba() {
- delete []p;
- }
- void dodadiPredmet(Predmet *p) {
- Predmet **tmp=new Predmet*[elem+1];
- for (int i=0; i<elem; i++)
- tmp[i]=this->p[i];
- tmp[elem]=p;
- elem++;
- delete []this->p;
- this->p=tmp;
- }
- Predmet& vratiNajevtinPredmet() {
- Predmet *tmp=p[0];
- for (int i=0; i<elem; i++)
- if (tmp->getCena()>p[i]->getCena())
- tmp=p[i];
- return *tmp;
- }
- };
- int main() {
- Rasprodazhba r;
- char sopstvenik[100],ime[100];
- bool garancija;
- int kupen,masa;
- int n;
- cin>>n;
- for (int i=0; i<n; i++) {
- int tip;
- cin>>tip;
- if (tip==0) {
- cin>>sopstvenik>>ime>>kupen>>garancija;
- r.dodadiPredmet(new TehnichkiPredmet(sopstvenik, ime, kupen, garancija));
- } else {
- cin>>sopstvenik>>ime>>kupen>>masa;
- r.dodadiPredmet(new ObichenPredmet(sopstvenik, ime, kupen, masa));
- }
- }
- cout<<r.vratiNajevtinPredmet();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement