Advertisement
simov

OOP Lab. 4

Mar 21st, 2014
950
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.50 KB | None | 0 0
  1. /* ------- ООП - Лаб. вежби 4 [Динамичка алокација на меморија/преоптоварување на оператори] -------
  2. ----------------------------------
  3. 1-ва задача [Матрица]
  4. ----------------------------------
  5. Да се напише класа за матрица. Во класата се чуваат елементите од матрицата од тип float (матрица со максимална димензија [10]x[10]) и големината на матрицата (број на редици и колони). За оваа класа да се преоптоварат следните оператори:
  6.  
  7. оператор + за собирање на број од матрица
  8. оператор - за одземање на матрици
  9. оператор * за множење на матрици
  10. операторот >> за внесување на елементите на матрицата
  11. операторот << за печатење на елементите на матрицата
  12. Во главната функција да се креираат објекти A, B и C со подразбирливиот конструктор на класата Matrica. Од стандарден влез да се прочитаат нивните вредности. Да се отпечати вредноста на изразот A-(BC)+2** на стандарден излез.
  13.  
  14. Да се претпостави дека секогаш матриците ќе бидат квадратни со ист број на редици и колони.
  15.  
  16. (Матрица се собира со број така што на секое нејзино поле се додава дадениот број.)
  17. ----------------------------------
  18. Sample input:
  19. 2
  20. 2
  21. 1 1
  22. 1 1
  23.  
  24. 2
  25. 2
  26. 1 1
  27. 1 1
  28.  
  29. 2
  30. 2
  31. 2 1
  32. -1 1
  33.  
  34. Sample output:
  35. 2 1
  36. 2 1
  37. ---------------------------------- */
  38. #include <iostream>
  39. using namespace std;
  40.  
  41. class Matrica {
  42. private:
  43.     float matrix[100][100];
  44.     int redici;
  45.     int koloni;
  46. public:
  47.     Matrica() {
  48.         redici = 0;
  49.         koloni = 0;
  50.     }
  51.  
  52.     Matrica operator +(int const& broj) {
  53.         Matrica temp;
  54.         temp.redici = redici;
  55.         temp.koloni = koloni;
  56.         for(int i = 0;i < redici; i++)
  57.             for(int j = 0;j < koloni; j++)
  58.                 temp.matrix[i][j] = matrix[i][j] + broj;
  59.         return temp;
  60.     }
  61.  
  62.     Matrica operator -(Matrica const& m) {
  63.         Matrica temp;
  64.         temp.redici = redici;
  65.         temp.koloni = koloni;
  66.         for(int i = 0; i < redici; i++)
  67.             for(int j = 0; j < koloni; j++)
  68.                 temp.matrix[i][j] = matrix[i][j] - m.matrix[i][j];
  69.         return temp;
  70.     }
  71.  
  72.     Matrica operator *(Matrica const& mat) {
  73.         Matrica temp;
  74.         temp.redici = mat.redici;
  75.         temp.koloni = mat.koloni;
  76.         for(int i = 0; i < mat.redici; i++)
  77.             for(int j = 0; j < mat.koloni; j++) {
  78.                 float t = 0;
  79.                 for(int k = 0; k < mat.redici; k++)
  80.                     t += matrix[i][k] * mat.matrix[k][j];
  81.                 temp.matrix[i][j] = t;
  82.         }
  83.         return temp;
  84.     }
  85.  
  86.     friend istream& operator >>(istream& input, Matrica& mat);
  87.     friend ostream& operator <<(ostream& output, Matrica& mat);
  88. };
  89.  
  90. istream& operator >>(istream& input, Matrica& mat) {
  91.     input >> mat.redici;
  92.     input >> mat.koloni;
  93.     for (int i = 0; i < mat.redici; ++i)
  94.         for (int j = 0; j < mat.koloni; ++j)
  95.             input >> mat.matrix[i][j];
  96.     return input;
  97. }
  98.  
  99. ostream& operator <<(ostream& output, Matrica& mat) {
  100.     for (int i = 0; i < mat.redici; ++i) {
  101.         for (int j = 0; j < mat.koloni; ++j)
  102.             output << mat.matrix[i][j] << " ";
  103.         output << endl;
  104.     }
  105.     return output;
  106. }
  107.  
  108. int main() {
  109.     Matrica A, B, C;
  110.     cin >> A >> B >> C;
  111.     Matrica D = B * C;
  112.     Matrica R = A - D + 2;
  113.     cout << R;
  114. }
  115. /* -------------------------------
  116. 2-ра задача [Планинарско друштво]
  117. ----------------------------------
  118. Да се креира класа за претставување на планинарско друштво во која ќе се чуваат информации за името на друштвото (динамички алоцирана низа од знаци), број на поминати тури (цел број) и број на членови во планинарското друштво (цел број). За оваа класа да се напише:
  119.  
  120. оператор + за собирање на две друштва што како резултат враќа друштво со број на членови еднаков на збирот од членовите од двете друштва, а останатите атрибути на резултантното друштво ги добиваат вредностите на соодветните атрибути од друштвото со поголем број на членови
  121.  
  122. оператори >, < за споредба во однос на бројот на членови во планинарските друштва
  123.  
  124. оператор << за печатење на информациите за планинарското друштво
  125.  
  126. Да се напише функција што на влез прима низа од планинарски друштва и вкупен број на друштва во низата и го печати планинарското друштво што има најголем број на членови .
  127. ----------------------------------
  128. Sample input:
  129. Vodno
  130. 5
  131. 100
  132. Korab
  133. 7
  134. 50
  135. Аурора
  136. 2
  137. 10
  138.  
  139. Sample output:
  140. Ime: Vodno Turi: 5 Clenovi: 150
  141. Najmnogu clenovi ima planinarskoto drustvo: Ime: Vodno Turi: 5 Clenovi: 100
  142. ---------------------------------- */
  143. #include <iostream>
  144. #include <string.h>
  145. using namespace std;
  146. class PlDrustvo {
  147. private:
  148.     char *name;
  149.     int brTuri;
  150.     int brChlenovi;
  151. public:
  152.     PlDrustvo() {}
  153.     PlDrustvo (char *n, int brT, int brC) {
  154.         name = new char [strlen(n) + 1];
  155.         strcpy(name, n);
  156.         brTuri = brT;
  157.         brChlenovi = brC;
  158.     }
  159.     int getBrChlenovi() {
  160.         return brChlenovi;
  161.     }
  162.     PlDrustvo operator +(PlDrustvo const& from) {
  163.         PlDrustvo temp;
  164.         temp.brChlenovi = brChlenovi + from.brChlenovi;
  165.         if (brChlenovi >= from.brChlenovi) {
  166.             temp.name = new char [strlen(name)+1];
  167.             strcpy(temp.name, name);
  168.             temp.brTuri = brTuri;
  169.         } else {
  170.             temp.name = new char [strlen(from.name)+1];
  171.             strcpy(temp.name, from.name);
  172.             temp.brTuri = from.brTuri;
  173.         }
  174.         return temp;
  175.     }
  176.     bool operator >(const PlDrustvo &from) {
  177.         return (brChlenovi > from.brChlenovi);
  178.     }
  179.     bool operator <(const PlDrustvo &from) {
  180.         return (brChlenovi < from.brChlenovi);
  181.     }
  182.     friend ostream& operator <<(ostream& output, PlDrustvo& from);
  183. };
  184. ostream& operator <<(ostream& output, PlDrustvo& from) {
  185.     output << "Ime: " << from.name << " Turi: " << from.brTuri << " Clenovi: " << from.brChlenovi << endl;
  186.     return output;
  187. }
  188. void najmnoguClenovi(PlDrustvo *drustva, int n) {
  189.     int max = 0;
  190.     PlDrustvo maxD;
  191.     for (int i = 0; i < n; ++i) {
  192.         if (drustva[i].getBrChlenovi() > max) {
  193.             max = drustva[i].getBrChlenovi();
  194.             maxD = drustva[i];
  195.         }
  196.     }
  197.     cout << maxD;
  198. }
  199. int main() {
  200.     PlDrustvo drustva[3];
  201.     PlDrustvo pl;
  202.     for (int i = 0; i < 3; i++) {
  203.         char ime[100];
  204.         int brTuri;
  205.         int brClenovi;
  206.         cin >> ime;
  207.         cin >> brTuri;
  208.         cin >> brClenovi;
  209.         PlDrustvo p(ime,brTuri,brClenovi);
  210.         drustva[i] = p;
  211.     }
  212.     pl = drustva[0] + drustva[1];
  213.     cout << pl;
  214.     cout << "Najmnogu clenovi ima planinarskoto drustvo: ";
  215.     najmnoguClenovi(drustva, 3);
  216.     return 0;
  217. }
  218. /* -------------------------------
  219. 3-та задача [Автомобил]
  220. ----------------------------------
  221. Да се напише класа Automobile во која се чуваат информации за марката на автомобилот (динамички алоцирана низа од знаци), регистрација (динамички алоцирана низа од 5 цели броја) и максимална брзина (цел број). За класата да се обезбедат set и get методите што се користат и да се преоптоварат следните оператори:
  222.  
  223. оператор == за споредување на два автомобила според регистрацијата
  224.  
  225. оператор << за печатење на податоци на автомобил во формат Marka:име Registracija:[x y z k l]
  226.  
  227. Да се напише класа RentACar за агенција за измајмување возила во која се чуваат информација за името на агенцијата (низа од 100 знци), низа од автомобили (динамички алоациана низа од објекти од класата Automobile) и број на автомобили со кој располага (цел број). Во класата RentACar да се напише конструктор со еден аргумент за иницијализација на името на агенцијата. При секое додавање на нов автомобил, динамички алоцираната низа да го зголемува капацитетот за 1 елемент. Во оваа класа да се преоптоварат операторите:
  228.  
  229. += за додавање на нов автомобил во агенцијата и
  230.  
  231. -= за отстранување на даден автомобил од агенцијата (оној со иста регистрација).
  232.  
  233. Да се напише main функција во која се инстанцира објект од класата RentACar. Во овој објект да се додадат сите автомобили чии информации се читаат од тастатура со операторот +=. Меѓутоа, откриено е дека во внесувањето на податоците има грешка затоа што при обид да се додаде нов автомобил во агенцијата, увидено е дека таа регистрација веќе постои. Во последниот ред од влезот дадени се инфромации тој автомобил. Потребно е да се избрише автомобилот што претходно е погрешно внесен и да се додаде новиот.
  234.  
  235. На излез да се отпечатат името на агенцијата и листа на автомобили што таа ги изнајмува, а чија максимална брзина е поголема од 150. Последново да се направи со функција _pecatiNadBrzina(int max)_ што треба да се дефинира во класата RentACar.
  236. ----------------------------------
  237. Sample input:
  238. 3
  239. Opel 4 5 6 7 4 200
  240. Toyota 2 3 4 1 2 120
  241. Audi 1 2 1 1 1 130
  242. Suzuki 1 2 1 1 1 100
  243.  
  244. Sample output:
  245. FINKI-Car
  246. Marka   Opel    Registracija[ 4 5 6 7 4 ]
  247. ---------------------------------- */
  248. #include <iostream>
  249. #include <cstring>
  250. using namespace std;
  251. class Automobile{
  252. private:
  253.     char *marka;
  254.     int *registracija;
  255.     int brzina;
  256.     void setRegistracija(int reg[5])    {
  257.     for(int i=0; i<5; i++)
  258.     this->registracija[i] = reg[i];
  259.     }
  260. public:
  261.     Automobile() :brzina(0){
  262.         marka = new char[1];
  263.         registracija = new int[5];
  264.     }
  265.     Automobile(const char* marka, int registracija[5], int brzina){
  266.         this->marka = new char[strlen(marka)+1];
  267.         this->registracija = new int[5];
  268.         this->brzina = brzina;
  269.         strcpy(this->marka, marka);
  270.         setRegistracija(registracija);
  271.     }
  272.     Automobile(const Automobile& in){
  273.         this->marka = new char[strlen(in.marka)+1];
  274.         this->registracija = new int[5];
  275.         this->brzina = in.brzina;
  276.         strcpy(this->marka, in.marka);
  277.         setRegistracija(in.registracija);
  278.     }
  279.     int getMaxBrzina() const {
  280.         return brzina;
  281.     }
  282.     friend ostream& operator <<( ostream& out , Automobile& t) {
  283.         out << "Marka\t" << t.marka << "\tRegistracija[ ";
  284.         for(int i=0; i<5; i++)
  285.         out << t.registracija[i] << " ";
  286.         cout << "]";
  287.         return out;
  288.     }
  289.     bool operator==(Automobile& t) {
  290.         int flag = 1;
  291.         for (int i=0; i<5; i++){
  292.             if(registracija[i] != t.registracija[i]){
  293.                 flag = 0;
  294.                 break;
  295.             }
  296.         }
  297.         return (flag > 0) ? true : false;
  298.     }
  299.     Automobile &operator=(Automobile &in){
  300.         if(this!=&in){
  301.             delete [] marka;
  302.             delete [] registracija;
  303.             marka = new char[strlen(in.marka)+1];
  304.             registracija = new int[5];
  305.             brzina = in.brzina;
  306.             strcpy(marka, in.marka);
  307.             setRegistracija(in.registracija);
  308.         }
  309.         return *this;
  310.     }
  311.     ~Automobile(){
  312.         delete[] marka;
  313.         delete[] registracija;
  314.     }
  315. };
  316.  
  317. class RentACar{
  318. private:
  319.     char ime[100];
  320.     Automobile *avtomobili;
  321.     int brAvtomobili;
  322. public:
  323.     RentACar(const char *name): brAvtomobili(0){
  324.         avtomobili = new Automobile[0];
  325.         strcpy(ime, name);
  326.     }
  327.     RentACar &operator=(const RentACar &in){
  328.         if(this!=&in){
  329.             delete [] avtomobili;
  330.             brAvtomobili = in.brAvtomobili;
  331.             for(int i=0; i<brAvtomobili; i++){
  332.                 avtomobili[i] = in.avtomobili[i];
  333.             }
  334.         avtomobili = new Automobile[brAvtomobili];
  335.         strcpy(ime, in.ime);
  336.     }
  337.     return *this;
  338.     }
  339.     RentACar& operator+=(Automobile t ) {
  340.         if(brAvtomobili == 0)
  341.             avtomobili = new Automobile[1];
  342.             Automobile * tmp = new Automobile [brAvtomobili + 1];
  343.                 for (int i = 0; i < brAvtomobili ; i ++)
  344.                     tmp[i] = avtomobili[i];
  345.                     tmp[brAvtomobili++] = t;
  346.                     delete[] avtomobili;
  347.                     avtomobili = tmp ;
  348.                     return *this;
  349.     }
  350.     RentACar& operator -=( Automobile t ) {
  351.         int newCount = 0;
  352.         Automobile * tmp = new Automobile[brAvtomobili];
  353.         for (int i = 0; i < brAvtomobili; i++) {
  354.             if (!( avtomobili[i] == t))
  355.                 tmp[newCount++] = avtomobili[i];
  356.         }
  357.         delete[] avtomobili;
  358.         avtomobili = tmp;
  359.         brAvtomobili = newCount;
  360.         return *this;
  361.     }
  362.     void pecatiNadBrzina(int speed){
  363.         cout<<ime<<endl;
  364.         if(brAvtomobili != 0)
  365.             for(int i=0; i<brAvtomobili; i++){
  366.                 if(avtomobili[i].getMaxBrzina() > speed)
  367.                     cout<< avtomobili[i]<<endl;
  368.             }
  369.     }
  370.     ~RentACar() {
  371.         delete[] avtomobili;
  372.     }
  373. };
  374.  
  375. int main() {
  376.     RentACar agencija("FINKI-Car");
  377.     int n;
  378.     cin>>n;
  379.     for (int i=0;i<n;i++){
  380.         char marka[100];
  381.         int regisracija[5];
  382.         int maximumBrzina;
  383.         cin>>marka;
  384.         for (int j=0;j<5;j++)
  385.             cin>>regisracija[j];
  386.             cin>>maximumBrzina;
  387.             Automobile nov(marka,regisracija,maximumBrzina);
  388.             //dodavanje na avtomobil
  389.             agencija+=nov;
  390. }
  391. //se citha grehsniot avtmobil, za koj shto avtmobilot so ista registracija treba da se izbrishe
  392.     char markax[100];
  393.     int regisracijax[5];
  394.     int maxBrzina;
  395.     cin>>markax;
  396.     for (int i=0;i<5;i++)
  397.         cin>>regisracijax[i];
  398.         cin>>maxBrzina;
  399.         Automobile greshka(markax,regisracijax,maxBrzina);
  400.         //brishenje na avtomobil
  401.         agencija-=greshka;
  402.         agencija.pecatiNadBrzina(150);
  403.         return 0;
  404. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement