Advertisement
Guest User

klasanizkiki

a guest
Mar 21st, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3.  
  4. using namespace std;
  5.  
  6. // INDEKSIRANJE POCINJE OD JEDINICE //
  7.  
  8. class beli {
  9.     int brojClanova;
  10.     double *niz;
  11.     void ProvjeraIspravnosti (int indeks) {
  12.         if (indeks < 0 || indeks > brojClanova)
  13.             throw::range_error("Pogresan indeks elementa!");
  14.     }
  15.     template <typename IterTip>
  16.     friend int BrojNeparnih (IterTip p1, IterTip p2); // DA SE NE BI MOGLE POZVATI IZ OSTATKA PROGRAMA //
  17.     template <typename IterTip>
  18.     friend int BrojParnih(IterTip p1, IterTip p2);
  19.     template <typename IterTip>
  20.    friend void ZamijeniParne (IterTip p1, IterTip p2, int vrijednost);
  21.    template <typename IterTip>
  22.    friend void IzbrojiParne (IterTip p1, IterTip p2, int &brParnih);
  23.    template <typename IterTip, typename IterTip2>
  24.    friend void IzbaciNeParne (IterTip p1, IterTip p2, IterTip2 q1, IterTip2 q2);
  25. public:
  26.    explicit beli (int brClanova);
  27.     ~beli () { delete []niz;}
  28.     beli (const beli &b);
  29.     beli &operator= (const beli &b);
  30.     beli (beli &&b);
  31.     beli (initializer_list<double> lista); // INICIJALIZACIJA PUTEM ZAGRADA //
  32.     beli &PomnoziNiz (int broj);
  33.     beli &ProsiriNiz (int novaDimenzija);
  34.     void Ispisi () const;
  35.     beli &DodajClan (int vrijednost);
  36.     beli &DodajIspred (int vrijednost);
  37.     beli &ukloniNeParne ();
  38.     beli &ukloniParne();
  39.     beli &SortirajUnazad () {sort(pocetak(), kraj(), [](int a, int b) {return b < a;}); return *this;};
  40.     beli &SortirajNiz () { sort(this->pocetak(), this->kraj()); return *this;}; // NUDI FLEKSIBILNOST KLASI, MOZE SE PISATI niz.sortiraj().Ispisi(); //
  41.     void brParnih ();
  42.     void brNeparnih ();
  43.     beli &promjeniParne (int vrijednost);
  44.     beli &PostaviDimenziju (int indeks, int vrijednost); // MOGUC LANCANI POZIV METODE //
  45.     double DajElement (int indeks) const; // POZIVA SE SAMO NA KONSTANTNIM OBJEKTIMA //
  46.     double &DajElement (int indeks); // MOGUCE PROMJENITI VRIJEDNOST //
  47.     double *pocetak () { return niz; };
  48.     double *kraj () { return niz+brojClanova;};
  49.     double DajVelicinu () const { return brojClanova;};
  50.     void velicinaNiza () const { cout << "(" <<brojClanova <<")";};
  51.     void IspisiElement(int element) {ProvjeraIspravnosti(element); cout << "(" <<niz[element-1] << ")"; cout <<endl;}
  52. };
  53.  
  54. template <typename Tip>
  55. bool Paran (Tip broj) {
  56. return ((int)broj%2==0);
  57. }
  58.  
  59. template <typename IterTip>
  60. int BrojParnih (IterTip pocetak, IterTip kraj) {
  61.         int brojac(0);
  62.     while (pocetak != kraj) {
  63.         if (Paran(*pocetak))
  64.             brojac++;
  65.     pocetak++;
  66.     }
  67. return brojac;
  68. }
  69.  
  70. template <typename Tip>
  71. bool Neparan (Tip broj) {
  72. return ((int) broj % 2 != 0);
  73. }
  74.  
  75. template <typename IterTip>
  76. int BrojNeparnih(IterTip p1, IterTip p2) {
  77.     int brojac(0);
  78.     while (p1 != p2) {
  79.         if (Neparan(*p1))
  80.          brojac++;
  81.     p1++;
  82.     }
  83. return brojac;
  84. }
  85.  
  86.  
  87. template <typename IterTip>
  88. void IzbrojiParne(IterTip p1, IterTip p2, int &brojac) {
  89.     brojac = 0;
  90.     while (p1 != p2) {
  91.         if (Paran(*p1))
  92.             brojac++;
  93.     p1++;
  94.     }
  95. }
  96.  
  97. template <typename IterTip, typename IterTip2>
  98. void IzbaciParne(IterTip p1, IterTip p2, IterTip2 q1, IterTip2 q2) {
  99.     while (p1 != p2) {
  100.         if (!Paran(*p1)) {
  101.             *q1 = *p1;
  102.             q1++;
  103.         }
  104.     p1++;
  105.     }
  106. }
  107.  
  108. template <typename IterTip, typename IterTip2>
  109. void IzbaciNeParne (IterTip p1, IterTip p2, IterTip2 q1, IterTip2 q2) {
  110.     while (p1 != p2) {
  111.         if (Paran(*p1)) {
  112.             *q1 = *p1;
  113.             q1++;
  114.         }
  115.     p1++;
  116.     }
  117. }
  118.  
  119. beli& beli::ukloniNeParne() {
  120.     int noviBroj(BrojParnih(pocetak(), kraj()));
  121.     try {
  122.     double *noviNiz(new double[noviBroj]);
  123.     fill(noviNiz, noviNiz+noviBroj, 0);
  124.     IzbaciNeParne(pocetak(), kraj(), noviNiz, noviNiz+noviBroj);
  125.     delete [] niz; // DAL JE POTREBNA OVA LINIJA KODA, KADA BUDES CITAO ZASTANI PA POGLEDAJ AKO NIJE PROBLEM //
  126.     niz = noviNiz; brojClanova = noviBroj;
  127.     }
  128.     catch(...) {
  129.     cout << "Problem sa alokacijom!";
  130.     }
  131. }
  132.  
  133. beli& beli::ukloniParne() {
  134.         int noviBroj(BrojNeparnih(pocetak(), kraj()));
  135.         try {
  136.     double *noviNiz(new double[noviBroj]);
  137.     fill(noviNiz, noviNiz+noviBroj, 0);
  138.     IzbaciParne(pocetak(), kraj(), noviNiz, noviNiz+noviBroj);
  139.     delete [] niz; // ISTO PITANJE //
  140.      niz = noviNiz; brojClanova = noviBroj;
  141.     }
  142.     catch(...) {
  143.         cout << "Greska u alokaciji!";
  144.     }
  145. }
  146.  
  147. template<typename IterTip>
  148. void ZamijeniParne(IterTip p1, IterTip p2, int vrijednost) {
  149.     while (p1 != p2) {
  150.         if (Paran(*p1))
  151.             *p1 = vrijednost;
  152.     p1++;
  153.     }
  154. }
  155.  
  156. void beli::brParnih() {
  157. cout << "[" << BrojParnih(this->pocetak(), this->kraj()) << "]"; cout<<endl;
  158. }
  159.  
  160. void beli::brNeparnih() {
  161. cout << "[" << BrojNeparnih(this->pocetak(), this->kraj()) << "]"; cout <<endl;
  162. }
  163.  
  164.  
  165. beli& beli::promjeniParne(int vr) {
  166. ZamijeniParne(this->pocetak(), this->kraj(), vr);
  167. return *this;
  168. }
  169.  
  170. beli &beli::PomnoziNiz(int vrijednost) {
  171.     for (int i=0; i<this->DajVelicinu(); i++)
  172.         niz[i] *= vrijednost;
  173. return *this;
  174. }
  175.  
  176. beli& beli::DodajClan(int vrijednost) {
  177.     double *novi(new double[brojClanova+1]);
  178.     fill(novi, novi+brojClanova+1, 0); // DA NE BI DOBILI NEDEFINISANE VRIJEDNOSTI //
  179.     copy(niz, niz+brojClanova, novi);
  180.     niz = novi; brojClanova +=1;
  181.     PostaviDimenziju(brojClanova, vrijednost);
  182. return *this;
  183. }
  184.  
  185. beli &beli::DodajIspred(int vrijednost) {
  186.     double *novi(new double[brojClanova+1]);
  187.     fill(novi, novi+brojClanova+1, 0);
  188.     copy(niz, niz+brojClanova, novi+1);
  189.     niz = novi; brojClanova+=1;
  190.     PostaviDimenziju(1, vrijednost);
  191. return *this;
  192. }
  193.  
  194. beli::beli(const beli &b) : brojClanova(b.brojClanova), niz(new double[b.brojClanova]){
  195.     copy(b.niz, b.niz+b.brojClanova, niz); // MOGUCE I SA PETLJOM, OVO JE SIGURNIJI NACIN //
  196. }
  197.  
  198. beli &beli::operator=(const beli &b) {
  199.     if (b.brojClanova > brojClanova || b.brojClanova < brojClanova) {
  200.         double *novi(new double[b.brojClanova]);
  201.         delete []niz; niz = novi;
  202.     }
  203.     brojClanova = b.brojClanova;
  204.     copy(b.niz, b.niz+b.brojClanova, niz);
  205. return *this;
  206. }
  207.  
  208. beli::beli(beli &&b) : brojClanova(b.brojClanova), niz(b.niz) { // MOVE SEMANTIKA, PRIMA SE R-VALUE VR(Privremeni objekt) //
  209.     b.niz = nullptr;
  210. }
  211.  
  212. beli::beli(int brClanova): brojClanova(brClanova), niz(new double[brClanova]) {
  213.     fill(niz, niz+brClanova, 0);
  214. }
  215.  
  216. beli::beli(initializer_list<double> lista): brojClanova(lista.size()), niz(new double[lista.size()]) {
  217.     copy(lista.begin(), lista.end(), niz);
  218. }
  219.  
  220. void beli::Ispisi() const {
  221.         cout << "[";
  222.     for (int i=0; i<brojClanova; i++) {
  223.         cout << niz[i];
  224.     if (i != brojClanova - 1)
  225.         cout << ",";
  226.     }
  227.     cout << "]";
  228. cout <<endl;
  229. }
  230.  
  231. beli& beli::ProsiriNiz(int noviBrojClanova) {
  232.     if (noviBrojClanova <= brojClanova)
  233.         throw::domain_error("Unesena dimenzija je manja ili jednaka prethodnoj!");
  234.     else {
  235.         double *noviNiz(new double[noviBrojClanova]);
  236.         copy(niz, niz+brojClanova, noviNiz);
  237.         fill(noviNiz+brojClanova, noviNiz+noviBrojClanova, 0);
  238.         delete [] niz;
  239.         niz = noviNiz;
  240.         }
  241.     brojClanova = noviBrojClanova;
  242. return *this;
  243. }
  244.  
  245. beli& beli::PostaviDimenziju(int indeks, int vrijednost) {
  246.     try {
  247.     ProvjeraIspravnosti(indeks);
  248.     }
  249.     catch(...) {
  250.     cout << "Pogresan indeks!" <<endl;
  251.     }
  252.     niz[indeks-1] = vrijednost;
  253. return *this;
  254. }
  255.  
  256. double beli::DajElement(int indeks) const {
  257. return niz[indeks-1];
  258. }
  259.  
  260. double& beli::DajElement(int indeks) {
  261. return niz[indeks-1];
  262. }
  263.  
  264. int main() {
  265. beli niz(3);
  266. niz.PostaviDimenziju(1, 3);
  267. niz.PostaviDimenziju(2, 6);
  268. niz.PostaviDimenziju(3, 8);
  269. niz.Ispisi();
  270. niz.brNeparnih();
  271. niz.brParnih();
  272. niz.PomnoziNiz(3).Ispisi();
  273. niz.DodajClan(5).DodajIspred(-5).Ispisi();
  274. niz.promjeniParne(10).Ispisi();
  275. niz.SortirajNiz().Ispisi();
  276. niz.ukloniParne().Ispisi();
  277. niz.ProsiriNiz(10).Ispisi();
  278.  
  279.  
  280.     return 0;
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement