Advertisement
simov

OOP Lab.11 - Испитни задачи

May 16th, 2014
1,568
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.58 KB | None | 0 0
  1. /*
  2. Колекција Problem 1 (2 / 2)
  3. Да се дефинира апстрактна класа Bogatstvo во која се чуваат информации за:
  4.  
  5. адреса (динамички алоцирана низа од знаци)
  6. име (низа од макимум 100 знаци)
  7. почетна вредност (цел број)
  8. Оваа класа има чисто виртуелна функција со потпис: double proceneta_cena() (5 поени)
  9.  
  10. За потребите на оваа класа да се дефинираат потребните конструктори и да се напише соодветен деструктор. (5 поени)
  11.  
  12. Да се преоптоварат:
  13.  
  14. операторот << за печатење кој ќе ги печати адредата, името и почвредност (сите одделени со - ) (5 поени)
  15. операторот = за доделување вредност и да се дефинира копирачки конструктор. (5 поени)
  16. Од оваа класа да се изведат две нови класи Zlatnik и Dijamant. За Zlatnik дополнително се чуваат:
  17.  
  18. forma (низа од максимум 50 знаци).
  19. За Dijamant дополнително се чува:
  20.  
  21. проѕирност (децимален број). (5 поени)
  22. Секое богатство има своја цена. Да се напишат соодветни методи за пресметување на проценетата цена.
  23.  
  24. За златник се пресметува на следниот начин: 2 * pocetna_vrednost ако златникот има форма krug, pocetna_vrednost+ 200 ако златникот има форма pravoagolnik. Во спротивно цената е pocetna_vrednost +100. (5 поени)
  25.  
  26. За дијамант се пресметува на следниот начин: prodzirnost*(pocetna_vrednost + 150) ако проѕидноста е помала 0д 0.5. Ако проѕирноста е поголема или еднаква тогаш цената се пресметува со: prodzirnost*pocetna_vrednost - 150. (5 поени)
  27.  
  28. Да се дефинира класа Kolekcija во која се чуваат:
  29.  
  30. низа од Bogatstvo покажувачи (динмички алоцирана низа од покажувачи кон класата Bogatstvo т.е. Bogatstvo** )
  31. број на уметнички дела (цел број) .
  32. За потребите на оваа класа да се преоптоварат потребните конструктори и да се напише соодветен деструктор. (5 поени)
  33.  
  34. Исто така да се имплементираат методите со следните потписи:
  35.  
  36. void dodadiBogatstvo(Bogatstvo b)** - за додавање ново bogatstvo b* во низата дефинирана во класата Kolekcija. (5 поени)
  37.  
  38. Bojatstvo& vratiNajbliskoSporedCenaBogatstvo(int pocetna) во која се враќа она богаство кое има најблиска проценета цена со цената дадена како аргумент (pocetna). Toa занчи дека има минимална разлика на проценетата цена на богатството и почетната цена. Претпоставете дека во програмата секогаш има само едно вакво дело. (5 поени)
  39.  
  40. Sample input:
  41. 2
  42. 0 adresa1 ime1 1000 krug
  43. 1 adresa2 ime2 1200 0.2
  44. 30
  45.  
  46. Sample output:
  47. adresa2-ime2-1200
  48. */
  49. #include <iostream>
  50. #include <cstring>
  51. #include <cmath>
  52. using namespace std;
  53.  
  54. class Bogatstvo {
  55. protected:
  56.     char *adresa;
  57.     char ime[100];
  58.     int vrednost;
  59. public:
  60.     Bogatstvo (char  *adresa, char *ime , int vrednost) {
  61.         this->adresa = new char [strlen(adresa) + 1];
  62.         strcpy (this->adresa,adresa);
  63.         strcpy (this->ime,ime);
  64.         this->vrednost = vrednost;
  65.     }
  66.     Bogatstvo (Bogatstvo &b) {
  67.         this->adresa = new char [strlen(b.adresa) + 1];
  68.         strcpy (this->adresa,b.adresa);
  69.         strcpy (this->ime,b.ime);
  70.         this->vrednost = b.vrednost;
  71.     }
  72.     virtual ~Bogatstvo () {
  73.         delete [] adresa;
  74.     }
  75.     virtual double proceneta_cena() = 0;
  76.     friend ostream &operator << (ostream &o,Bogatstvo &b) {
  77.         o << b.adresa << "-" << b.ime << "-" << b.vrednost << endl;
  78.         return o;
  79.     }
  80.     Bogatstvo &operator = (Bogatstvo &b) {
  81.         if (this != &b) {
  82.             delete [] adresa;
  83.             this->adresa = new char [strlen(b.adresa) + 1];
  84.             strcpy (this->adresa,b.adresa);
  85.             strcpy (this->ime,b.ime);
  86.             this->vrednost = b.vrednost;
  87.         }
  88.         return *this;
  89.     }
  90.  
  91. };
  92.  
  93. class Zlatnik : public Bogatstvo {
  94. private :
  95.     char forma[50];
  96. public :
  97.     Zlatnik (char  *adresa, char *ime , int vrednost , char *forma) : Bogatstvo (adresa,ime,vrednost) {
  98.         strcpy(this->forma,forma);
  99.     }
  100.     double proceneta_cena() {
  101.         if (strcmp (forma,"krug") == 0)
  102.             return 2*vrednost;
  103.         if (strcmp (forma,"pravoagolnik") == 0)
  104.             return vrednost + 200;
  105.         else
  106.             return vrednost +100;
  107.     }
  108. };
  109. class Dijamant : public Bogatstvo {
  110. private :
  111.     float prodzirno;
  112. public:
  113.     Dijamant (char  *adresa, char *ime , int vrednost ,float prodzirno): Bogatstvo (adresa,ime,vrednost) {
  114.         this->prodzirno = prodzirno;
  115.     }
  116.     double proceneta_cena() {
  117.         if(prodzirno < 0,5)
  118.             return prodzirno*(vrednost + 150);
  119.         else
  120.             return prodzirno*vrednost - 150;
  121.     }
  122. };
  123.  
  124. class Kolekcija {
  125. private :
  126.     Bogatstvo ** bog;
  127.     int broj;
  128. public:
  129.     Kolekcija (int broj = 0) {
  130.         bog = new Bogatstvo *[broj];
  131.         this->broj = broj;
  132.     }
  133.     ~Kolekcija ()
  134.     {}
  135.     void dodadiBogatstvo(Bogatstvo *b) {
  136.         bog[broj] = b;
  137.         broj++;
  138.     }
  139.  
  140.     Bogatstvo& vratiNajbliskoSporedCenaBogatstvo(int pocetna) {
  141.         float razlika = fabs(bog[0]->proceneta_cena() - pocetna);
  142.         int indeks;
  143.         for (int i = 0; i< broj; i++) {
  144.             if (fabs(bog[i]->proceneta_cena() - pocetna)  < razlika)
  145.                 indeks = i;
  146.         }
  147.         return   *bog[indeks];
  148.     }
  149.  
  150. };
  151. int main() {
  152.     Kolekcija a;
  153.     char ime[100],adresa[100],forma[100];
  154.     int poc_vrednost;
  155.     double prodzirnost;
  156.     int n;
  157.     cin>>n;
  158.     for (int i=0; i<n; i++) {
  159.         int tip;
  160.         cin>>tip;
  161.         if (tip==0) {
  162.             cin>>adresa>>ime>>poc_vrednost>>forma;
  163.             a.dodadiBogatstvo(new Zlatnik(adresa, ime, poc_vrednost, forma));
  164.         } else {
  165.             cin>>adresa>>ime>>poc_vrednost>>prodzirnost;
  166.             a.dodadiBogatstvo(new Dijamant(adresa, ime, poc_vrednost, prodzirnost));
  167.         }
  168.     }
  169.     int pocetna;
  170.     cin>>pocetna;
  171.     cout<<a.vratiNajbliskoSporedCenaBogatstvo(pocetna);
  172.     return 0;
  173. }
  174.  
  175. /*
  176. Распродажба Problem 2 (2 / 2)
  177. Да се дефинира класа Predmet во која се чуваат информации за:
  178.  
  179. сопственик (динамички алоцирана низа од знаци)
  180. име (низа од макимум 100 знаци)
  181. цена по кој е купен (цел број).
  182. Оваа класа има чисто виртуелна функција со потпис: double prodazhna_cena() (5 поени)
  183.  
  184. За потребите на оваа класа да се преоптоварат потребните конструктори и да се напише соодветен деструктор. (5 поени)
  185.  
  186. Да се преоптоварат:
  187.  
  188. операторот << за печатење кој ќе ги печати сопственикот, името и цената по кој е купен (сите одделени со # ) (5поени)
  189. операторот = за доделување вредност и да се дефинира копирачки конструктор . (5 поени)
  190. Од оваа класа да се изведат две нови класи TehnichkiPredmet и ObicenPredmet .
  191.  
  192. За TehnichkiPredmet дополнително се чуваат:
  193.  
  194. гаранција (true или false).
  195. За ObicenPredmet дополнително се чува:
  196.  
  197. маса во kg (децимален број). (5 поени)
  198. Секоj предмет си има своја продажна цена. Да се напишат соодветни методи за пресметување на продажната цена:
  199.  
  200. За TehnichkiPredmet се пресметува на следниот начин: g * 1000 + cena po koj e kupen, каде g = 1 ако предметот сеуште е под гаранција, а 0.2 ако не е. На пр. технички предмет кој не е под гаранција, и цената по кој е купен 40 000 : 0.2*1000+40000= 40200.
  201.  
  202. За ObicenPredmet се пресметува на следниот начин: masa * 500 + 2*cena po koj e kupen. На пр. обичен предмет со маса 1 kg и цена по кој е купен 10 000: 1∗500+2*10000= 20500 (10 поени)
  203.  
  204. Да се дефинира класа Rasprodazhba во која се чуваат: - низа од Predmet објекти (динмички алоцирана низа од објекти од класата Predmet) - број на предмети (цел број) .
  205.  
  206. За потребите на оваа класа да се преоптоварат потребните конструктори и да се напише соодветен деструктор. (5 поени) Исто така да се имплементираат следните методи:
  207.  
  208. void dodadiPredmet(Predmet\* p) - за додавање ново предмет p* во низата дефинирана во класата Rasprodazhba. (5 поени)
  209.  
  210. Predmet& vratiNajevtinPredmet() во која се враќа најевтиниот предмет . Еден предмет е најевтино ако има најниска цена. Претпоставете дека во програмата секогаш има само еден ваков предмет. (5 поени)
  211.  
  212. Sample input:
  213. 2
  214. 0 sopstv1 ime1 2000 1
  215. 1 sopstv2 ime2 3439 34
  216.  
  217. Sample output:
  218. sopstv1#ime1#2000
  219.  */
  220. #include <iostream>
  221. #include <cstring>
  222. using namespace std;
  223.  
  224. class Predmet {
  225. protected:
  226.     char *sopstvenik;
  227.     char ime[100];
  228.     int cena;
  229. public:
  230.     Predmet(char *sopstvenik="",char *ime="",int cena=0) {
  231.         this->sopstvenik=new char[strlen(sopstvenik)];
  232.         strcpy(this->sopstvenik,sopstvenik);
  233.         strcpy(this->ime,ime);
  234.         this->cena=cena;
  235.     }
  236.     virtual ~Predmet() {
  237.         delete []sopstvenik;
  238.     }
  239.     Predmet(Predmet& obj) {
  240.         sopstvenik=new char[strlen(obj.sopstvenik)];
  241.         strcpy(sopstvenik,obj.sopstvenik);
  242.         strcpy(ime,obj.ime);
  243.         cena=obj.cena;
  244.     }
  245.     Predmet& operator=(Predmet& obj) {
  246.         if (this==&obj)
  247.             return *this;
  248.         delete []sopstvenik;
  249.         sopstvenik=new char[strlen(obj.sopstvenik)];
  250.         strcpy(sopstvenik,obj.sopstvenik);
  251.         strcpy(ime,obj.ime);
  252.         cena=obj.cena;
  253.         return *this;
  254.     }
  255.     int getCena() {
  256.         return cena;
  257.     }
  258.     friend ostream& operator<<(ostream& co,Predmet& obj) {
  259.         return co<<obj.sopstvenik<<"#"<<obj.ime<<"#"<<obj.cena<<endl;
  260.     }
  261.     virtual double prodazna_cena()=0;
  262. };
  263. class TehnichkiPredmet:public Predmet {
  264. private:
  265.     bool garancija;
  266. public:
  267.     TehnichkiPredmet(char *sopstvenik="",char *ime="",int cena=0, bool garancija=true):Predmet(sopstvenik,ime,cena) {
  268.         this->garancija=garancija;
  269.     }
  270.     double prodazna_cena() {
  271.         if (garancija==true) {
  272.             return 1000.0+cena;
  273.         } else {
  274.             return 0.2*1000+cena;
  275.         }
  276.     }
  277. };
  278. class ObichenPredmet:public Predmet {
  279. private:
  280.     double masa;
  281. public:
  282.     ObichenPredmet(char *sopstvenik="",char *ime="",int cena=0, double masa=0):Predmet(sopstvenik,ime,cena) {
  283.         this->masa=masa;
  284.     }
  285.     double prodazna_cena() {
  286.         return masa*500+cena*2;
  287.     }
  288. };
  289. class Rasprodazhba {
  290. private:
  291.     Predmet **p;
  292.     int elem;
  293. public:
  294.     Rasprodazhba(Predmet **p=NULL,int elem=0) {
  295.         this->p=new Predmet*[elem];
  296.         for (int i=0; i<elem; i++)
  297.             this->p[i]=p[i];
  298.         this->elem=elem;
  299.     }
  300.     ~Rasprodazhba() {
  301.         delete []p;
  302.     }
  303.     void dodadiPredmet(Predmet *p) {
  304.         Predmet **tmp=new Predmet*[elem+1];
  305.         for (int i=0; i<elem; i++)
  306.             tmp[i]=this->p[i];
  307.         tmp[elem]=p;
  308.         elem++;
  309.         delete []this->p;
  310.         this->p=tmp;
  311.     }
  312.     Predmet& vratiNajevtinPredmet() {
  313.         Predmet *tmp=p[0];
  314.         for (int i=0; i<elem; i++)
  315.             if (tmp->getCena()>p[i]->getCena())
  316.                 tmp=p[i];
  317.         return *tmp;
  318.     }
  319. };
  320.  
  321. int main() {
  322.     Rasprodazhba r;
  323.     char sopstvenik[100],ime[100];
  324.     bool garancija;
  325.     int kupen,masa;
  326.     int n;
  327.     cin>>n;
  328.     for (int i=0; i<n; i++) {
  329.         int tip;
  330.         cin>>tip;
  331.         if (tip==0) {
  332.             cin>>sopstvenik>>ime>>kupen>>garancija;
  333.             r.dodadiPredmet(new TehnichkiPredmet(sopstvenik, ime, kupen, garancija));
  334.         } else {
  335.             cin>>sopstvenik>>ime>>kupen>>masa;
  336.             r.dodadiPredmet(new ObichenPredmet(sopstvenik, ime, kupen, masa));
  337.         }
  338.     }
  339.  
  340.     cout<<r.vratiNajevtinPredmet();
  341.     return 0;
  342. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement